Skip to main content

GMLC & Le Interface Operations Guide

OmniLCS includes a Gateway Mobile Location Centre (GMLC) function that exposes the Le interface to external LCS clients. This allows Public Safety Answering Points (PSAPs), fleet management systems, lawful intercept platforms, and other external parties to request subscriber locations via the standard Diameter-based Le reference point defined in 3GPP TS 29.172.

The GMLC supports both immediate and deferred location requests. Deferred requests include periodic location (position reported at regular intervals) and triggered location (position reported when a subscriber enters, leaves, or remains inside a geographic area).

To fulfil a request the GMLC follows the standard 3GPP procedure: it discovers the subscriber's serving MME over the SLh interface (LCS-Routing-Info-Request to the HSS, per TS 29.173), then sends a Provide-Location-Request (PLR) to that MME over the SLg interface. The MME performs the positioning (directly, or by delegating to an E-SMLC over SLs/LCS-AP) and returns the Location-Estimate in the Provide-Location-Answer (PLA). In this GMLC role OmniLCS does not position the UE itself — it queries the serving MME and relays the result.

This is one of several location options OmniLCS offers. For active, higher-accuracy positioning it uses its E-SMLC role over SLs instead, driving LPP/LPPa to the UE and eNB — see Two LCS roles, one location request. For subscribers on 2G/3G the GMLC reaches the serving MSC/SGSN over MAP/Lg instead of Diameter SLg — see 2G/3G location over MAP/Lg. The same POST /api/location call reaches every path; the GMLC/SLg path described here is selected for 4G cell/last-known requests.

GMLC / Le Interface

Architecture

Request Flow

Immediate Location Request

An external LCS client sends a Provide-Location-Request (PLR) via Diameter. OmniLCS authorizes the client, discovers the serving MME over SLh, sends a PLR to that MME over SLg, and returns the MME's result in a Provide-Location-Answer (PLA).

Periodic Location Request

When the PLR contains a Deferred-Location-Type with the periodic bit set and a Periodic-LDR-Information grouped AVP, OmniLCS creates a periodic session that runs location fixes at the specified interval and delivers each result via a Location-Report-Request (LRR).

Triggered (Geo-fence) Location Request

When the PLR contains area event information, OmniLCS creates a triggered session that polls the UE position and fires when the trigger condition is met.

Emergency Call Routing with OmniCall (IMS)

The primary consumer of the GMLC is OmniCall, the IMS core. When a subscriber dials an emergency number, OmniCall's E-CSCF (Emergency Call Session Control Function) must route the call to the PSAP that serves the caller's physical location — routing to the wrong PSAP costs critical time. OmniCall gets that location from OmniLCS, which fills the LRF / RDF (Location Retrieval Function / Routing Determination Function) role of 3GPP TS 23.167.

The flow:

  1. The UE places an IMS emergency call (urn:service:sos); it reaches OmniCall's E-CSCF.
  2. OmniCall asks OmniLCS for the caller's location — over the Le interface (Diameter PLR, using the :emergency_services client type) or the REST API. OmniLCS answers through whichever role fits — GMLC/SLg for the serving cell, or E-SMLC/SLs for an active GNSS/OTDOA fix (see Two LCS roles, one location request).
  3. OmniLCS returns the position (coordinates + serving cell ECGI).
  4. OmniCall maps that location to the serving PSAP (routing determination) and forwards the INVITE there.
  5. OmniCall enriches the SIP signalling so the PSAP receives the location with the call.

SIP location header enrichment

Using the position returned by OmniLCS, OmniCall adds the standard IMS-emergency location elements to the outbound INVITE, so the PSAP (and any intermediary) receives the caller's location with the call rather than having to query for it separately:

SIP elementStandardCarries
Geolocation header + PIDF-LO bodyRFC 6442 / RFC 4119Geodetic (lat/lon + uncertainty) and/or civic location, by value or by reference
P-Access-Network-InfoRFC 7315Serving access network and cell identity (ECGI)
Geolocation-RoutingRFC 6442Whether downstream proxies may route on the conveyed location

The PSAP call-taker therefore sees the caller's location on call arrival, derived from the same OmniLCS positioning used everywhere else — the serving cell for a fast fix, or an active GNSS/OTDOA position when the UE and radio support it.

Configuration

GMLC Configuration

config :omnilcs, :gmlc,
# Enable/disable the GMLC Le interface
enabled: true,

# Allow requests from clients not in the authorized list
allow_unknown_clients: false,

# Authorized external LCS clients
authorized_clients: [
%{
name: "psap-01",
type: :emergency_services,
allowed_methods: [:cell, :ecid, :gnss, :otdoa],
rate_limit: 100,
description: "Primary PSAP"
},
%{
name: "fleet-mgmt",
type: :value_added_services,
allowed_methods: [:cell, :ecid],
rate_limit: 50,
description: "Fleet management system"
}
],

# Allow deferred (periodic/triggered) location requests
allow_deferred: true,

# Maximum concurrent periodic sessions
max_periodic_sessions: 100,

# Maximum concurrent triggered (geo-fence) sessions
max_triggered_sessions: 50,

# Default interval for periodic sessions (ms)
default_periodic_poll_interval_ms: 60_000,

# Default polling interval for triggered sessions (ms)
default_triggered_poll_interval_ms: 30_000,

# Log all location fixes to InfluxDB
influx_logging: true

GMLC Parameters

ParameterTypeRequiredDefaultDescription
enabledBooleanNofalseEnable the GMLC Le interface handler. When disabled, all PLRs are handled as standard SLg requests.
allow_unknown_clientsBooleanNofalseAccept requests from clients not listed in authorized_clients. Set to true for permissive mode during integration testing.
authorized_clientsListNo[]List of authorized external LCS client configurations. See Client Parameters below.
allow_deferredBooleanNotrueAccept deferred (periodic and triggered) location requests. When false, only immediate requests are handled.
max_periodic_sessionsIntegerNo100Maximum number of concurrent periodic location sessions. Returns Diameter 3004 (TOO_BUSY) when exceeded.
max_triggered_sessionsIntegerNo50Maximum number of concurrent triggered location sessions.
default_periodic_poll_interval_msIntegerNo60000Default interval between periodic location fixes when not specified in the PLR.
default_triggered_poll_interval_msIntegerNo30000Default polling interval for triggered sessions when not specified in the Area-Event-Info AVP.
influx_loggingBooleanNotrueWrite all location fixes from GMLC sessions to InfluxDB.

Client Parameters

Each entry in authorized_clients:

ParameterTypeRequiredDefaultDescription
nameStringYes--Client identity. Matched against the LCS-EPS-Client-Name or LCS-Requestor-ID-String AVP in the PLR.
typeAtomNo:anyExpected LCS-Client-Type: :emergency_services, :value_added_services, :plmn_operator_services, :lawful_intercept_services, or :any.
allowed_methodsListNo[:cell, :ecid, :gnss, :otdoa]Positioning methods this client may request.
rate_limitIntegerNo0Maximum requests per minute. 0 means unlimited.
descriptionStringNo""Human-readable description for the control panel.

LCS Client Types

Per 3GPP TS 29.172 section 7.4.4:

ValueTypeDescription
0Emergency ServicesPSAP, E-CSCF emergency call routing
1Value Added ServicesFleet management, asset tracking, location-based services
2PLMN Operator ServicesOperator internal services (O&M, network optimization)
3Lawful Intercept ServicesLaw enforcement location requests

Deferred Location Types

Periodic Location

A periodic location session performs a configurable number of position fixes at a regular interval. Each fix is:

  1. Performed by sending an SLg PLR to the subscriber's serving MME (resolved over SLh)
  2. Written to InfluxDB as a location_fix measurement with session metadata
  3. Logged via the standard location logger (CSV + ETS)
  4. Delivered to the originating LCS client via Diameter LRR

The session terminates when the reporting count is exhausted.

Diameter AVPs used:

AVPCodeDescription
Deferred-Location-Type1480Bit 4 set indicates periodic LDR
Periodic-LDR-Information2025Grouped AVP containing reporting parameters
Reporting-Amount2026Number of position fixes to perform
Reporting-Interval2027Interval between fixes in seconds

Triggered (Geo-fence) Location

A triggered location session polls the UE position and evaluates it against one or more geographic areas. When the trigger condition is met, the position is reported.

Event types:

EventDeferred-Location-Type BitTrigger Condition
EnteringBit 1UE transitions from outside to inside the area
LeavingBit 2UE transitions from inside to outside the area
Being InsideBit 3UE is inside the area on each poll

Supported area definitions:

  • Circle -- Center point (latitude, longitude) and radius in meters
  • Polygon -- List of vertices defining a closed polygon

The geo-fence evaluator reuses the ray-casting algorithm from the CAP alert polygon resolver for polygon containment checks, and haversine distance for circular area checks.

InfluxDB Location Logging

All GMLC session fixes are written to InfluxDB using the location_fix measurement:

Tags:

TagDescription
imsiSubscriber IMSI
methodPositioning method used (cell, ecid, gnss, otdoa)
sourcePosition source from the engine result
session_typeperiodic, triggered, or immediate
client_nameName of the requesting LCS client

Fields:

FieldTypeDescription
latitudeFloatWGS84 latitude in degrees
longitudeFloatWGS84 longitude in degrees
altitudeFloatAltitude in meters (when available)
uncertaintyFloatPosition uncertainty in meters
confidenceIntegerConfidence level (0-100)
duration_msIntegerTime taken to perform the fix

Example InfluxQL queries:

-- Latest fixes for a subscriber
SELECT * FROM location_fix WHERE imsi = '001010000000001' ORDER BY time DESC LIMIT 10

-- Periodic session track over the last hour
SELECT latitude, longitude FROM location_fix
WHERE session_type = 'periodic' AND imsi = '001010000000001' AND time > now() - 1h

-- Fix success rate by method
SELECT COUNT(*) FROM location_fix WHERE time > now() - 24h GROUP BY method

-- Geo-fence trigger events
SELECT * FROM location_fix WHERE session_type = 'triggered' AND time > now() - 24h

REST API

The deferred location API is available at https://<host>:8443/api/deferred_location.

List Active Sessions

GET /api/deferred_location

Response:

{
"status": "ok",
"count": 2,
"data": [
{
"session_id": "a1b2c3d4-...",
"type": "periodic",
"imsi": "001010000000001",
"method": "cell",
"client_name": "rest-api",
"status": "active",
"interval_ms": 60000,
"remaining_reports": 7,
"total_reports": 10,
"started_at": "2026-04-09T10:00:00Z",
"last_fix_at": "2026-04-09T10:03:00Z"
}
]
}

Create Periodic Session

POST /api/deferred_location
Content-Type: application/json

{
"type": "periodic",
"imsi": "001010000000001",
"method": "cell",
"interval_seconds": 60,
"count": 10
}

Create Triggered Session

POST /api/deferred_location
Content-Type: application/json

{
"type": "triggered",
"imsi": "001010000000001",
"method": "cell",
"event_type": "entering",
"poll_interval_seconds": 30,
"max_reports": 0,
"areas": [
{
"type": "circle",
"center": {"lat": -33.8688, "lon": 151.2093},
"radius_meters": 500
}
]
}

Cancel Session

DELETE /api/deferred_location/:session_id

Metrics

Le Interface Requests

Metric: omnilcs_gmlc_le_request_total Type: Counter Description: Total Le interface requests from external LCS clients Labels:

  • client_type -- LCS client type (emergency_services, value_added_services, etc.)
  • result -- Request outcome: received, success, error, unauthorized

Metric: omnilcs_gmlc_le_request_duration Type: Histogram Description: Le request processing time in milliseconds Labels:

  • client_type -- LCS client type

MAP / Lg Requests (2G/3G)

Metric: omnilcs_map_request_total Type: Counter Description: Total MAP/Lg location requests for 2G/3G subscribers (SendRoutingInfoForLCS, ProvideSubscriberLocation) Labels:

  • type -- MAP operation (MAP-PSL)
  • result -- sent, success

Location Report Requests

Metric: omnilcs_gmlc_lrr_total Type: Counter Description: Total Location Report Requests sent to external clients Labels:

  • session_type -- periodic or triggered
  • result -- sent or error

Session Tracking

Metric: omnilcs_gmlc_session_periodic_active Type: Gauge Description: Number of active periodic location sessions

Metric: omnilcs_gmlc_session_triggered_active Type: Gauge Description: Number of active triggered/geo-fence location sessions

Metric: omnilcs_gmlc_session_total Type: Counter Description: Total deferred sessions created Labels:

  • type -- periodic or triggered

Geo-fence Events

Metric: omnilcs_gmlc_geofence_trigger_total Type: Counter Description: Total geo-fence trigger events fired Labels:

  • event_type -- entering, leaving, or being_inside

InfluxDB Writes

Metric: omnilcs_gmlc_influx_write_total Type: Counter Description: Total InfluxDB location fix writes from GMLC sessions Labels:

  • result -- success or error

Example Prometheus queries:

# Le request rate
rate(omnilcs_gmlc_le_request_total[5m])

# Deferred session creation rate by type
rate(omnilcs_gmlc_session_total[5m])

# Geo-fence trigger rate
rate(omnilcs_gmlc_geofence_trigger_total[5m])

# LRR delivery error ratio
sum(rate(omnilcs_gmlc_lrr_total{result="error"}[5m]))
/ sum(rate(omnilcs_gmlc_lrr_total[5m]))

Troubleshooting

Le Requests Returning 5012 (UNABLE_TO_COMPLY)

Symptoms: External LCS client receives result code 5012 for all PLRs.

Possible causes:

  • GMLC not enabled in config (enabled: false)
  • Client not in authorized_clients and allow_unknown_clients is false
  • SLh resolution failed or there is no SLg route to the serving MME (check DRA/HSS/MME connectivity)

Resolution:

  1. Verify config :omnilcs, :gmlc, enabled: true is set
  2. Check the client name matches the LCS-EPS-Client-Name AVP in the PLR
  3. Verify the SLh/SLg Diameter peers (DRA, HSS, MME) are connected on the Dashboard

Periodic Sessions Not Starting

Symptoms: PLR with periodic deferred type returns 3004 (TOO_BUSY).

Possible causes:

  • max_periodic_sessions limit reached
  • Session supervisor not running

Resolution:

  1. Check active session count on the GMLC control panel page
  2. Increase max_periodic_sessions if needed
  3. Verify OmniLcs.Gmlc.SessionSupervisor is running in the Application page

Location Fixes Not Appearing in InfluxDB

Symptoms: Periodic/triggered sessions are running but no data in InfluxDB.

Possible causes:

  • influx_logging set to false
  • InfluxDB connection down
  • Database does not exist

Resolution:

  1. Verify influx_logging: true in GMLC config
  2. Check InfluxDB connectivity (cell sync status is a good proxy)
  3. Query InfluxDB directly: SHOW MEASUREMENTS should include location_fix

Geo-fence Not Triggering

Symptoms: Triggered session is active but never fires.

Possible causes:

  • Area definition too small for the positioning method's accuracy
  • Wrong event type (e.g., :leaving when subscriber is already outside)
  • Positioning method returning nil coordinates

Resolution:

  1. Check the positioning method accuracy -- Cell ID has kilometre-scale uncertainty, which may be too coarse for small geo-fences
  2. Use a more accurate method (:ecid or :gnss) for smaller areas
  3. Verify the area coordinates are correct (latitude/longitude order)