Description
Feature name |
DetermineIfRoaming |
|---|---|
Applicable contexts |
SIP service |
SAS Support |
No |
Prerequisite Features |
None |
The Determine If Roaming feature is a pre credit check feature early in the feature list (but always after the emergency number feature). The feature sets the call’s Roaming Indicator, which is stored in a session state variable for future features. The DetermineIfRoaming feature analyses the p-visited-network-id header and compares it with the platforms set of home network ids.
Leg Manager inputs
| Leg | Name | Type | Format | Description | Behaviour if null/invalid |
|---|---|---|---|---|---|
callingParty |
InviteRequest |
org.jainslee.resources.sip.SipRequest |
See Easysip javadoc |
INVITE received from the calling party |
Runtime exception handled by feature runner |
Session state inputs and outputs
Feature responses
| Response | Reason |
|---|---|
featureCannotStart |
SessionState SentinelSelectionKey is not set or CallingParty leg InviteRequest has not been set |
featureFailedToExecute |
Roaming status could not be determined |
featureHasFinished |
feature has finished |
Roaming indicator
The call’s roaming indicator is classified as one of:
-
Roaming
-
NotRoaming
The roaming indicator is stored in session state variable RoamingIndicator as a Boolean.
The roaming indicator is determined based on the following pseudo code:
Function determineIfRoaming(callingPartyInvite)
roamingIndicator = determineRoamingBasedOnPVisitedNetworkHeader(callingPartyInvite)
IF roamingIndicator is null
THEN
roamingIndicator = determineRoamingBasedOnRecordRouteAnalysis(callingPartyInvite)
ENDIF
/* if that still didn't work report a feature error*/
IF roamingIndicator is null
THEN
/* Roaming status could not be determined */
featureFailedToExecute()
ENDIF
RoamingIndicator Function determineRoamingBasedOnPVisitedNetworkHeader(callingPartyInvite)
headers = callingPartyInvite.getHeaders("p-visited-network-id")
IF header is null
THEN
return null
ENDIF
/* assumes all values are the same (RFC3455 says 'hopefully' they are!)
* so just take the first one
*/
visitedNetworkID = headers.next()
List<String> homeNetworkIDs = getSessionState().getSentinelSelectionKey().getHomeNetworkIDs();
IF homeNetworkIDs contain visitedNetworkIDs THEN
return false
ENDIF
return true
/* Roaming based on record route anaylsis is NOT fully implemented. However it will affect the
* setting of the roaming indicator, so it is included here for completeness.
*/
RoamingIndicator Function determineRoamingBasedOnRecordRouteAnalysis(callingPartyInvite)
headers = callingPartyInvite.getAddressHeaders(RecordRouteHeader.NAME);
IF SipParseException THEN
TRACE "Unable to parse. Interpreting call as non-roaming.")
return false
ENDIF
IF headers is null OR headers is empty {
TRACE ("No header present: Interpreting call as non-roaming.");
return false;
ENDIF
return null;
Configuration Profile Naming
| Configuration Profile Table Name | Description | Profile Naming |
|---|---|---|
SipSentinelConfigurationTable |
Sentinel configuration table (profile configuration containing home network ids) |
${SELECTIONKEY}:homeNetworkIDs |
