Configuring Routing Options

SCP acts as a proxy and forwards or routes any 5G ingress service request to the host (5G NF) present in request URI.

SCP supports:
  • Routing based on IMSI and MSISDN only.
    • Routing based on SUPI and GPSI is supported based on the start and end attributes only as published in NFProfile and routing based on the pattern attribute is not supported.
  • Only IPv4 IP family.
  • Every Producer NFs are required to publish IpEndPoints for each NFServices in NFProfile while registering with NRF.
  • Routing Scope: Site
  • DB Sync Status: No Sync, Site Wide
    • Load Balancing and alternate routing will be based on DB Sync Status within Site.
  • Load Balancing Algorithm: Priority only (and Capacity).
    • Load Balancing across the equivalent NFs/NF Services is based on Priority and capacity.

Parameters for Configuring Routing Options

Table 3-2 provides details of the parameters for configuring Routing Options.

Table 3-2 Parameters for RoutingOptions

Parameter Name Description Applicable to NF Service Type Default Values Applicable to Pod level within NF Values
Max Pending responses Number of pending responses from NF/Pod Yes 1000 Yes 1000
Response Timeout When response timeout expires, then SCP initiates alternate rerouting to available alternate NF or Pod. Yes 1 second Yes 1 second
Total transaction lifetime
  • Time consumed in processing of all retries should not exceed the total transaction life time.
  • The total time allowed to forward a request, including initial and all subsequent routing attempts
Yes 6 seconds Yes 6 seconds
Max Routing attempts
  • Number of re-route attempt (retries) at NF/Pod level
  • Maximum number of times SCP is allowed to forward a request message. If the Max Routing attempts value is set to 1 for both Service and Pod level, the total transaction lifetime field value is not needed and If the Max Routing attempts value (including both service and pod level) is greater than 1, total transaction lifetime value is considered in rerouting processing.
Yes 3 Yes 2
Reroute on Response Code
  • SCP will attempt a reroute if the upstream server responds with any of these configured response code.
    • 5xx (includes gateway-error, connection-failure, refused-stream)
    • 500 (Internal Server Error)
    • 501 (Not Implemented)
    • gateway-error (502, 503, 504)
    • 404 (Not Found)
    • 408 (Request Timeout)
    • retriable-4xx (409)
    • 410 (Gone)
    • 307 (Temporary Redirect)
    • 308 (Permanent Redirect)
    • Complete list of supported HTTP status code is at HTTP Status Code and applicability for rerouting.
  • SCP attempts re-route the request in case of response timeout, connect-failure, refused-stream, GOAWAY frame received on any connection. These options (events) are not configurable and is supported by SCP.
  • 5xx, which includes gateway-error (502, 503, 504.) connect-failure, refused-stream
  • retriable-4xx (409)
-
  • 5xx, which includes gateway-error (502, 503, 504.) connect-failure, refused-stream
  • retriable-4xx (409)
-
Actions

Supported actions

  • Forward the ingress service request to selected egress producer NF
  • Send Response with configured result code and message.
  • Abandon or drop the ingress service request
Yes Forward
Alternate Routing

Alternate rerouting is Enabled or Disabled

  • Reroute to alternate Pod (within same NF)
  • Reroute to alternate producer NF
Yes Enabled Yes Enabled
Request Routing Scope Site Yes Site Yes Within NF
Status
  • No Sync
  • Site Wide
  • Mated Pair
  • N/W Wide
Yes No Sync Yes Synced within NF
Routing Policy
  • Forward Request
    • Forward Request(Use consumer's orig. destination unless available)
  • Load Balance (Consumer selected site first)
  • Load Balance (LB Across sites)
Yes Forward Proxy NO Load Balance (Non-configurable)
Deployment Info (deploymentInfo) Yes No
Load Balancing Algorithm

Priority Only

  • Use priority as the first level criteria. Use capacity as second level criteria
Yes Priority Only Yes Round Robin
Default Priority
  • Priority (relative to other NF Services of the same type) in the range of 0-65535, to be used for NF Service selection; lower values indicate a higher priority. If priority is present in either NF profile or nfServiceList parameters, those will have precedence over this value.
  • This default priority value shall be used for NF service instance selection only if priority is not published by producer NFs while registration with NRF in NF profile (including both NF profile and nfServiceList parameters).
Yes 1 No -
Default Capacity
  • Capacity information in the range of 0-65535, expressed as a weight relative to other NF service instances of the same type; if capacity is also present in either NF profile or nfServiceList parameters, those will have precedence over this value.
  • This default capacity value shall be used for NF service instance selection only if capacity is not published by producer NFs while registration with NRF in NF profile (including both NF profile and nfServiceList parameters ).
Yes 65535 No -
reverseProxySupport

Flag used to enable reverse proxy support for a service. In reverse proxy mode all the requests will have authority as SCP. SCP will forward those requests to respective Producers after making required authority changes in the requests (both initial and subsequent). Currently reverse proxy mode is supported only for some interfaces. If the flag is set to false then transparent proxy mode is enabled.

For setting reverseProxySupport as true dbSync status should be "Site_Wide" and routingPolicy should be "Load_Balance".

dbSync status should be synced and it can take other values except No_Sync.

Yes false No true, false
Exceptions Resource Exhausted Action Yes Abandon with no Answer No
No Producer Response Action
  • Action taken when the routing of a request is abandoned due to an answer timeout or total transaction lifetime timeout.
  • Options:
Yes Send Answer with configured http status code (Default 503). No
Connection Failure Action
  • Action taken when the routing of a request is abandoned when the last egress connection selection fails
  • Options:
Yes Send Answer with configured http status code (Default 503). No

Host not found Action

Yes Send Answer with configured http status code (Default 503). No

Deployment Info

Currently only CHF is supporting this deploymentInfo. DeploymentInfo is of type chfDeploymentInfo.

Table 3-3 deploymentInfo

Attribute Name Data Type P Cardinality Description
chfDeploymentInfo chfDeploymentInfo O 1 CHF deployment scenario, populated only in case on CHF NF services.

This attribute is applicable for CHF NF services and it defines the CHF deployment model i.e. operator has deployed the CHF instances in the network.

Table 3-4 chfDeploymentInfo

Attribute Name Data Type P Cardinality Description
chfDeploymentModel chfDeploymentModel M 1 CHF deployment scenario, populated only in case on CHF NF services.
subsequentRequestReroutingEnabled boolean O 1 This attribute indicates whether rerouting of subsequent CHF service requests are enabled or not.
  • true, (Operator may chose to enable, if Primary and Secondary CHF instances share data)
  • false, (Operator may chose to disable, if Primary and Secondary CHF instances do not share data)

Table 3-5 chfDeploymentModel

Enumeration value CHF Deployment
REGIONAL Regional CHF deployment i.e. CHFs are deployed in Primary region and Secondary region. A region may consist of one or more locality.
SITE_WIDE Site specific CHF deployment i.e. CHF instances are deployed as per SCP's Site deployment.

Configuring Operations for Routing Options

User can configure routing options by using the operations LIST, GET, PUT and PATCH.

Table 3-6 provides sample details of the operations to configure routing options.

Table 3-6 Routing Options Operations

Operation REST Command

LIST

curl --header 'Content-type: application/json' --header 'accept: application/json' --request GET http://<Soothsayerfqdn>:8081/soothsayer/v1/routingoptions/

[{

  "pod": {

    "maxPendingResponses": 1000,

    "maxRoutingAttempts": 2,

    "alternateRouting": true,

    "loadBalancingAlgorithm": "Round_Robin"

  },

  "srv": {

    "name": "nudm-uecm",

    "maxPendingResponses": 1000,

    "maxRoutingAttempts": 3,

    "actions": "Forward",

    "alternateRouting": true,

    "scope": "Site",

    "dbSyncStatus": "No_Sync",

    "routingPolicy": "Forward_Proxy",

    "loadBalancingAlgorithm": "Priority_only",

    "nfServiceLoadBasedCongestionControl": {

      "alternateRoutingOnsetThresholdPercent": 80,

      "alternateRoutingAbatementThresholdPercent": 75,

      "throttleOnsetThresholdPercent": 90,

      "throttleOnsetThresholdPercent": 85,

      "responseErrorCode": 503

    },

    "defaultPriority": 1,

    "defaultCapacity": 65535,

    "reverseProxySupport": false

  },

  "totalTransactionLifetime": "6s",

  "reRouteOnResponseCodeList": [

    "ALL_SERVER_ERROR",

    "NOT_FOUND",

    "REQUEST_TIMEOUT",

    "RETRIABLE_4XX",

    "GONE",

    "TOO_MANY_REQUESTS",

    "TEMPORARY_REDIRECT",

    "PERMANENT_REDIRECT"

  ],

  "responseTimeout": "1s"

},

... ] 
GET
curl --header 'Content-type: application/json' --header 'accept: application/json' --request GET http://<Soothsayerfqdn>:8081/soothsayer/v1/routingoptions/<serviceName>

{

  "pod": {

    "maxPendingResponses": 1000,

    "maxRoutingAttempts": 2,

    "alternateRouting": true,

    "loadBalancingAlgorithm": "Round_Robin"

  },

  "srv": {

    "name": "nudm-uecm",

    "maxPendingResponses": 1000,

    "maxRoutingAttempts": 3,

    "actions": "Forward",

    "alternateRouting": true,

    "scope": "Site",

    "dbSyncStatus": "No_Sync",

    "routingPolicy": "Forward_Proxy",

    "loadBalancingAlgorithm": "Priority_only",

    "nfServiceLoadBasedCongestionControl": {

      "alternateRoutingOnsetThresholdPercent": 80,

      "alternateRoutingAbatementThresholdPercent": 75,

      "throttleOnsetThresholdPercent": 90,

      "throttleAbatementThresholdPercent": 85,

      "responseErrorCode": 503

    },

    "defaultPriority": 1,

    "defaultCapacity": 65535,

    "reverseProxySupport": false

  },

  "totalTransactionLifetime": "6s",

  "reRouteOnResponseCodeList": [

    "ALL_SERVER_ERROR",

    "NOT_FOUND",

    "REQUEST_TIMEOUT",

    "RETRIABLE_4XX",

    "GONE",

    "TOO_MANY_REQUESTS",

    "TEMPORARY_REDIRECT",

    "PERMANENT_REDIRECT"

  ],

  "responseTimeout": "1s"

}
PUT
curl --header "Content-Type: application/json" --request PUT --data '{

  "pod": {

    "maxPendingResponses": 1000,

    "maxRoutingAttempts": 2,

    "alternateRouting": true,

    "loadBalancingAlgorithm": "Round_Robin"

  },

  "srv": {

    "name": "nudm-uecm",

    "maxPendingResponses": 1000,

    "maxRoutingAttempts": 3,

    "actions": "Forward",

    "alternateRouting": true,

    "scope": "Site",

    "dbSyncStatus": "No_Sync",

    "routingPolicy": "Forward_Proxy",

    "loadBalancingAlgorithm": "Priority_only",

    "nfServiceLoadBasedCongestionControl": {

      "alternateRoutingOnsetThresholdPercent": 80,

      "alternateRoutingAbatementThresholdPercent": 75,

      "throttleOnsetThresholdPercent": 90,

      "throttleAbatementThresholdPercent": 85,

      "responseErrorCode": 503

    },

    "defaultPriority": 1,

    "defaultCapacity": 65535,

    "reverseProxySupport": false

  },

  "totalTransactionLifetime": "6s",

  "reRouteOnResponseCodeList": [

    "ALL_SERVER_ERROR",

    "NOT_FOUND",

    "REQUEST_TIMEOUT",

    "RETRIABLE_4XX",

    "GONE",

    "TOO_MANY_REQUESTS",

    "TEMPORARY_REDIRECT",

    "PERMANENT_REDIRECT"

  ],

  "responseTimeout": "1s"

}' http://<Soothsayerfqdn>:8081/soothsayer/v1/routingoptions/<serviceName>
PATCH
curl -X PATCH \
 http://<Soothsayerfqdn>:8081/soothsayer/v1/routingoptions/<service name> \
 -H 'Content-Type: application/merge-patch+json' \
 -d 

{
   "pod":{
      "maxPendingResponses":500,
      "maxRoutingAttempts":2,
      "alternateRouting":true,
      "loadBalancingAlgorithm":"Round_Robin"
   },
   "srv":{
      "name":"nchf-spendinglimitcontrol",
      "maxPendingResponses":1000,
      "maxRoutingAttempts":3,
      "actions":"Forward",
      "alternateRouting":true,
      "scope":"Site",
      "dbSyncStatus":"No_Sync",
      "routingPolicy":"Forward_Proxy",
      "loadBalancingAlgorithm":"Priority_only",
      "nfServiceLoadBasedCongestionControl":{
         "alternateRoutingOnsetThresholdPercent":80,
         "alternateRoutingAbatementThresholdPercent":75,
         "throttleOnsetThresholdPercent":65,
         "throttleAbatementThresholdPercent":92,
         "responseErrorCode":404
      },
      "defaultPriority":1,
      "defaultCapacity":65535,
      "reverseProxySupport":false,
      "chfDeploymentInfo":{
         "chfDeploymentModel":"regional",
         "subsequentRequestReroutingEnabled":false
      }
   },
   "totalTransactionLifetime":"6s",
   "reRouteOnResponseCodeList":[
      "ALL_SERVER_ERROR",
      "NOT_FOUND",
      "REQUEST_TIMEOUT",
      "RETRIABLE_4XX",
      "GONE",
      "TOO_MANY_REQUESTS",
      "TEMPORARY_REDIRECT",
      "PERMANENT_REDIRECT"
   ],
   "responseTimeout":"1s",
   "exceptionErrorResponses":[
      {
         "name":"Resource_Exhausted",
         "action":"Send_Answer",
         "error_code":503,
         "error_response":"Service Unavailable"
      },
      {
         "name":"No_Response",
         "action":"Send_Answer",
         "error_code":503,
         "error_response":"Service Unavailable"
      },
      {
         "name":"Connect_Failure",
         "action":"Send_Answer",
         "error_code":503,
         "error_response":"Service Unavailable"
      },
      {
         "name":"No_Host",
         "action":"Send_Answer",
         "error_code":503,
         "error_response":"Service Unavailable"
      }
   ]
}