Description
Feature name |
DetermineIfRoaming |
---|---|
Applicable contexts |
SIP service |
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 |