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/locationcall reaches every path; the GMLC/SLg path described here is selected for 4Gcell/last-known requests.

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:
- The UE places an IMS emergency call (
urn:service:sos); it reaches OmniCall's E-CSCF. - OmniCall asks OmniLCS for the caller's location — over the Le interface (Diameter PLR, using the
:emergency_servicesclient 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). - OmniLCS returns the position (coordinates + serving cell ECGI).
- OmniCall maps that location to the serving PSAP (routing determination) and forwards the INVITE there.
- 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 element | Standard | Carries |
|---|---|---|
Geolocation header + PIDF-LO body | RFC 6442 / RFC 4119 | Geodetic (lat/lon + uncertainty) and/or civic location, by value or by reference |
P-Access-Network-Info | RFC 7315 | Serving access network and cell identity (ECGI) |
Geolocation-Routing | RFC 6442 | Whether 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
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
enabled | Boolean | No | false | Enable the GMLC Le interface handler. When disabled, all PLRs are handled as standard SLg requests. |
allow_unknown_clients | Boolean | No | false | Accept requests from clients not listed in authorized_clients. Set to true for permissive mode during integration testing. |
authorized_clients | List | No | [] | List of authorized external LCS client configurations. See Client Parameters below. |
allow_deferred | Boolean | No | true | Accept deferred (periodic and triggered) location requests. When false, only immediate requests are handled. |
max_periodic_sessions | Integer | No | 100 | Maximum number of concurrent periodic location sessions. Returns Diameter 3004 (TOO_BUSY) when exceeded. |
max_triggered_sessions | Integer | No | 50 | Maximum number of concurrent triggered location sessions. |
default_periodic_poll_interval_ms | Integer | No | 60000 | Default interval between periodic location fixes when not specified in the PLR. |
default_triggered_poll_interval_ms | Integer | No | 30000 | Default polling interval for triggered sessions when not specified in the Area-Event-Info AVP. |
influx_logging | Boolean | No | true | Write all location fixes from GMLC sessions to InfluxDB. |
Client Parameters
Each entry in authorized_clients:
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
name | String | Yes | -- | Client identity. Matched against the LCS-EPS-Client-Name or LCS-Requestor-ID-String AVP in the PLR. |
type | Atom | No | :any | Expected LCS-Client-Type: :emergency_services, :value_added_services, :plmn_operator_services, :lawful_intercept_services, or :any. |
allowed_methods | List | No | [:cell, :ecid, :gnss, :otdoa] | Positioning methods this client may request. |
rate_limit | Integer | No | 0 | Maximum requests per minute. 0 means unlimited. |
description | String | No | "" | Human-readable description for the control panel. |
LCS Client Types
Per 3GPP TS 29.172 section 7.4.4:
| Value | Type | Description |
|---|---|---|
| 0 | Emergency Services | PSAP, E-CSCF emergency call routing |
| 1 | Value Added Services | Fleet management, asset tracking, location-based services |
| 2 | PLMN Operator Services | Operator internal services (O&M, network optimization) |
| 3 | Lawful Intercept Services | Law 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:
- Performed by sending an SLg PLR to the subscriber's serving MME (resolved over SLh)
- Written to InfluxDB as a
location_fixmeasurement with session metadata - Logged via the standard location logger (CSV + ETS)
- Delivered to the originating LCS client via Diameter LRR
The session terminates when the reporting count is exhausted.
Diameter AVPs used:
| AVP | Code | Description |
|---|---|---|
Deferred-Location-Type | 1480 | Bit 4 set indicates periodic LDR |
Periodic-LDR-Information | 2025 | Grouped AVP containing reporting parameters |
Reporting-Amount | 2026 | Number of position fixes to perform |
Reporting-Interval | 2027 | Interval 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:
| Event | Deferred-Location-Type Bit | Trigger Condition |
|---|---|---|
| Entering | Bit 1 | UE transitions from outside to inside the area |
| Leaving | Bit 2 | UE transitions from inside to outside the area |
| Being Inside | Bit 3 | UE 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:
| Tag | Description |
|---|---|
imsi | Subscriber IMSI |
method | Positioning method used (cell, ecid, gnss, otdoa) |
source | Position source from the engine result |
session_type | periodic, triggered, or immediate |
client_name | Name of the requesting LCS client |
Fields:
| Field | Type | Description |
|---|---|---|
latitude | Float | WGS84 latitude in degrees |
longitude | Float | WGS84 longitude in degrees |
altitude | Float | Altitude in meters (when available) |
uncertainty | Float | Position uncertainty in meters |
confidence | Integer | Confidence level (0-100) |
duration_ms | Integer | Time 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--periodicortriggeredresult--sentorerror
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--periodicortriggered
Geo-fence Events
Metric: omnilcs_gmlc_geofence_trigger_total
Type: Counter
Description: Total geo-fence trigger events fired
Labels:
event_type--entering,leaving, orbeing_inside
InfluxDB Writes
Metric: omnilcs_gmlc_influx_write_total
Type: Counter
Description: Total InfluxDB location fix writes from GMLC sessions
Labels:
result--successorerror
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_clientsandallow_unknown_clientsisfalse - SLh resolution failed or there is no SLg route to the serving MME (check DRA/HSS/MME connectivity)
Resolution:
- Verify
config :omnilcs, :gmlc, enabled: trueis set - Check the client name matches the
LCS-EPS-Client-NameAVP in the PLR - 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_sessionslimit reached- Session supervisor not running
Resolution:
- Check active session count on the GMLC control panel page
- Increase
max_periodic_sessionsif needed - Verify
OmniLcs.Gmlc.SessionSupervisoris 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_loggingset tofalse- InfluxDB connection down
- Database does not exist
Resolution:
- Verify
influx_logging: truein GMLC config - Check InfluxDB connectivity (cell sync status is a good proxy)
- Query InfluxDB directly:
SHOW MEASUREMENTSshould includelocation_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.,
:leavingwhen subscriber is already outside) - Positioning method returning
nilcoordinates
Resolution:
- Check the positioning method accuracy -- Cell ID has kilometre-scale uncertainty, which may be too coarse for small geo-fences
- Use a more accurate method (
:ecidor:gnss) for smaller areas - Verify the area coordinates are correct (latitude/longitude order)