XCAP Supplementary Services (Simservs)
OmniSEP implements ETSI TS 183 023 XCAP (XML Configuration Access Protocol) for managing IMS supplementary services including call forwarding, call barring, and caller ID settings.
Control Panel UI
The XCAP Simservs Profiles page provides a web-based interface for viewing and managing subscriber profiles:

Features:
- Search and filter local profiles by MSISDN
- Fetch profiles from HSS using Diameter Sh interface
- View profile details in a 2-column layout:
- Left column: Identity Services (OIP/OIR), Other Services (Call Waiting, Call Hold), Call Forwarding rules
- Right column: Incoming and Outgoing Call Barring rules with conditions
- Push/Pull synchronization with HSS
- Edit mode for modifying profile settings
Overview
Simservs Document Structure
The simservs document follows ETSI TS 183 023 structure:
HTTP Interface
XCAP URL Format
/simservs.ngn.etsi.org/users/{sip_uri}/simservs.xml[/~~/{xpath}]
| Component | Description | Example |
|---|---|---|
{sip_uri} | SIP URI with MSISDN | sip:+15551234567@ims.example.com |
{xpath} | XPath selector (optional) | simservs/communication-diversion |
Operations
| Method | Path | Description |
|---|---|---|
| GET | /simservs.ngn.etsi.org/users/{sip}/simservs.xml | Get full document |
| PUT | /simservs.ngn.etsi.org/users/{sip}/simservs.xml | Replace full document |
| GET | /simservs.ngn.etsi.org/users/{sip}/simservs.xml/~~/simservs/{service} | Get service element |
| PUT | /simservs.ngn.etsi.org/users/{sip}/simservs.xml/~~/simservs/{service} | Update service element |
| DELETE | /simservs.ngn.etsi.org/users/{sip}/simservs.xml/~~/simservs/{service}/{element} | Delete element |
Content Types
| Content-Type | Usage |
|---|---|
application/xcap-el+xml | XCAP element operations |
application/xml | Standard XML |
ETag Support
OmniSEP implements RFC 4825 ETag-based concurrency control:
| Header | Usage |
|---|---|
ETag | Response header with document version |
If-Match | Conditional update (PUT/DELETE) |
If-None-Match | Conditional GET (304 Not Modified) |
Caching Architecture
OmniSEP uses a local-first caching strategy with ETS-based storage and asynchronous HSS synchronization.
Storage Tables
| Table | Key | Value | Purpose |
|---|---|---|---|
xcap_profiles | IMSI | {profile_map, etag} | Primary profile storage |
xcap_by_msisdn | MSISDN | IMSI | Lookup index for XCAP requests |
Caching Strategy
Read Operations (GET)
- Query local ETS cache first
- On cache miss, fetch from HSS via Diameter Sh
- Seed local cache with HSS response
- Return default profile if HSS unavailable or no profile exists
Write Operations (PUT)
- Validate ETag precondition against cached value
- Update local cache immediately
- Return response to client with new ETag
- Asynchronously push changes to HSS (non-blocking)
ETag Generation
ETags are computed as MD5 hashes of the profile data:
ETag = MD5(erlang:term_to_binary(profile))[0:16]
Example: "a1b2c3d4e5f6g7h8"
The 16-character hex string changes whenever any profile field is modified, enabling precise cache invalidation.
Concurrency Control
| Mechanism | Purpose |
|---|---|
| ETS read_concurrency | Fast parallel reads without locking |
| GenServer writes | Atomic write operations |
| ETag validation | Prevents lost updates from concurrent clients |
Default Profile
Unknown subscribers automatically receive a default profile per 3GPP TS 24.623:
- All supplementary services active
- OIR default:
presentation-not-restricted - NoReplyTimer: 20 seconds
- Empty call forwarding/barring rulesets
This ensures devices always receive a valid response without requiring pre-provisioning.
HSS Integration
| Operation | Diameter Command | Timing |
|---|---|---|
| Fetch profile | Sh UDR (User-Data-Request) | Synchronous on cache miss |
| Push changes | Sh PUR (Profile-Update-Request) | Asynchronous after PUT |
The asynchronous push means HSS updates don't block client responses, improving latency for device requests.
Simservs XML Document
Full Document Example
<?xml version="1.0" encoding="UTF-8"?>
<simservs xmlns="http://uri.etsi.org/ngn/params/xml/simservs/xcap"
xmlns:cp="urn:ietf:params:xml:ns:common-policy">
<originating-identity-presentation active="true"/>
<originating-identity-presentation-restriction active="true">
<default-behaviour>presentation-not-restricted</default-behaviour>
</originating-identity-presentation-restriction>
<communication-diversion active="true">
<NoReplyTimer>20</NoReplyTimer>
<cp:ruleset>
<cp:rule id="cfb">
<cp:conditions>
<busy/>
</cp:conditions>
<cp:actions>
<forward-to>
<target>tel:+15557654321</target>
<notify-caller>false</notify-caller>
</forward-to>
</cp:actions>
</cp:rule>
</cp:ruleset>
</communication-diversion>
<incoming-communication-barring active="false">
<cp:ruleset/>
</incoming-communication-barring>
<outgoing-communication-barring active="false">
<cp:ruleset/>
</outgoing-communication-barring>
</simservs>
Namespaces
| Prefix | Namespace | Description |
|---|---|---|
| (default) | http://uri.etsi.org/ngn/params/xml/simservs/xcap | ETSI Simservs |
| cp | urn:ietf:params:xml:ns:common-policy | RFC 4745 Common Policy |
Services
Originating Identity Presentation (OIP)
Controls whether caller ID is displayed to called party.
<originating-identity-presentation active="true"/>
| Attribute | Type | Description |
|---|---|---|
active | Boolean | Service enabled/disabled |
Originating Identity Presentation Restriction (OIR)
Controls caller ID hiding.
<originating-identity-presentation-restriction active="true">
<default-behaviour>presentation-not-restricted</default-behaviour>
</originating-identity-presentation-restriction>
| Element | Values | Description |
|---|---|---|
default-behaviour | presentation-restricted, presentation-not-restricted | Default caller ID behavior |
Communication Diversion (Call Forwarding)
Rule Types
| Rule ID | Condition | Description |
|---|---|---|
cfu | (none) | Call Forwarding Unconditional - forwards all calls immediately |
cfb | busy | Call Forwarding on Busy |
cfna | no-answer | Call Forwarding on No Answer (uses NoReplyTimer) |
cfnrc | not-reachable | Call Forwarding on Not Reachable |
cfnl | not-logged-in | Call Forwarding on Not Logged In |
Call Forwarding Rule Structure
<communication-diversion active="true">
<NoReplyTimer>20</NoReplyTimer>
<cp:ruleset>
<cp:rule id="cfna">
<cp:conditions>
<no-answer/>
</cp:conditions>
<cp:actions>
<forward-to>
<target>tel:+15557654321</target>
<notify-caller>false</notify-caller>
</forward-to>
</cp:actions>
</cp:rule>
</cp:ruleset>
</communication-diversion>
| Element | Type | Description |
|---|---|---|
NoReplyTimer | Integer | Seconds to wait before CFNA (1-300) |
cp:rule/@id | String | Rule identifier (cfu, cfb, cfna, cfnrc, cfnl) |
target | tel: URI | Forward destination number |
notify-caller | Boolean | Play announcement to caller |
Target URI Format
Forward targets use tel: URI format per RFC 3966:
tel:+15557654321;phone-context=ims.mnc001.mcc310.3gppnetwork.org
| Component | Description |
|---|---|
tel: | URI scheme |
+15557654321 | E.164 number with country code |
phone-context | IMS domain (optional) |
Call Barring
Incoming Communication Barring
<incoming-communication-barring active="true">
<cp:ruleset>
<cp:rule id="international">
<cp:conditions>
<international/>
</cp:conditions>
<cp:actions>
<allow>false</allow>
</cp:actions>
</cp:rule>
</cp:ruleset>
</incoming-communication-barring>
Outgoing Communication Barring
<outgoing-communication-barring active="true">
<cp:ruleset>
<cp:rule id="international">
<cp:conditions>
<international/>
</cp:conditions>
<cp:actions>
<allow>false</allow>
</cp:actions>
</cp:rule>
</cp:ruleset>
</outgoing-communication-barring>
Barring Rule Types
| Rule ID | Condition | Description |
|---|---|---|
all | (none) | Bar all calls |
international | international | Bar international calls |
international-exHC | international-exHC | Bar international except home country |
roaming | roaming | Bar calls while roaming |
API Examples
Get Full Simservs Document
GET /simservs.ngn.etsi.org/users/sip:+15551234567@ims.example.com/simservs.xml
Accept: application/xcap-el+xml
Response:
HTTP/1.1 200 OK
Content-Type: application/xcap-el+xml
ETag: "a1b2c3d4e5f6g7h8"
<?xml version="1.0" encoding="UTF-8"?>
<simservs xmlns="http://uri.etsi.org/ngn/params/xml/simservs/xcap"...>
...
</simservs>
Get Call Forwarding Settings
GET /simservs.ngn.etsi.org/users/sip:+15551234567@ims.example.com/simservs.xml/~~/simservs/communication-diversion
Enable Call Forwarding on Busy
PUT /simservs.ngn.etsi.org/users/sip:+15551234567@ims.example.com/simservs.xml/~~/simservs/communication-diversion/cp:ruleset/cfb
Content-Type: application/xcap-el+xml
If-Match: "a1b2c3d4e5f6g7h8"
<cp:rule id="cfb">
<cp:conditions>
<busy/>
</cp:conditions>
<cp:actions>
<forward-to>
<target>tel:+15557654321</target>
<notify-caller>false</notify-caller>
</forward-to>
</cp:actions>
</cp:rule>
Disable Call Forwarding Rule
DELETE /simservs.ngn.etsi.org/users/sip:+15551234567@ims.example.com/simservs.xml/~~/simservs/communication-diversion/cp:ruleset/cfb
If-Match: "a1b2c3d4e5f6g7h8"
Update NoReplyTimer
PUT /simservs.ngn.etsi.org/users/sip:+15551234567@ims.example.com/simservs.xml/~~/simservs/communication-diversion/NoReplyTimer
Content-Type: application/xcap-el+xml
25
Management API
For administrative access, use the JSON management API:
Get Profile
GET /api/xcap/15551234567
Response:
{
"oip": { "active": true },
"oir": {
"active": true,
"default_behaviour": "presentation-not-restricted"
},
"no_reply_timer": 20,
"call_forwarding": {
"cfb": {
"enabled": true,
"target": "tel:+15557654321",
"condition": "busy"
}
},
"call_barring_incoming": {},
"call_barring_outgoing": {}
}
Set Profile
POST /api/xcap/15551234567
Content-Type: application/json
{
"no_reply_timer": 25,
"call_forwarding": {
"cfna": {
"enabled": true,
"target": "tel:+15559876543",
"condition": "no-answer"
}
}
}
Default Profile
New subscribers receive this default profile:
| Setting | Default |
|---|---|
| OIP | Active |
| OIR | Active, presentation-not-restricted |
| NoReplyTimer | 20 seconds |
| Call Forwarding | All rules disabled |
| Call Barring (Incoming) | All calls allowed |
| Call Barring (Outgoing) | All calls allowed |
Error Responses
| HTTP Status | Description |
|---|---|
| 200 | Success |
| 304 | Not Modified (If-None-Match matched) |
| 400 | Bad Request - Invalid XML or path |
| 404 | Not Found - Document or element not found |
| 405 | Method Not Allowed |
| 409 | Conflict - Constraint violation |
| 412 | Precondition Failed - ETag mismatch |
Error Response Format
<?xml version="1.0" encoding="UTF-8"?>
<xcap-error xmlns="urn:ietf:params:xml:ns:xcap-error">
<error-element>Element not found: simservs/unknown</error-element>
</xcap-error>
Reference Specifications
| Specification | Description |
|---|---|
| ETSI TS 183 023 | XCAP framework for NGN Simservs |
| ETSI TS 183 004 | Communication Diversion (CDIV) |
| RFC 4825 | XCAP Protocol |
| RFC 4745 | Common Policy |
| RFC 3966 | tel: URI |
| 3GPP TS 24.623 | XCAP over Ut interface |