Added ranfunctionOid for E2APv1.1 service update. 87/7087/1
authornaman.gupta <naman.gupta@samsung.com>
Fri, 19 Nov 2021 08:52:25 +0000 (14:22 +0530)
committernaman.gupta <naman.gupta@samsung.com>
Fri, 19 Nov 2021 08:52:25 +0000 (14:22 +0530)
Added ranfunction Oid for E2APv1.1 for service update message.

Issue-ID: RIC-640

Signed-off-by: naman.gupta <naman.gupta@samsung.com>
Change-Id: I877dcc856502e88304f4521170bda2749c5ba337

E2Manager/handlers/rmrmsghandlers/ric_service_update_handler.go
E2Manager/models/ric_service_update_message.go
E2Manager/models/ric_service_update_message_test.go
E2Manager/tests/resources/serviceUpdate/RicServiceUpdate_AddedFunction_With_OID.xml [new file with mode: 0644]

index ccce4a8..2f871e7 100644 (file)
@@ -20,15 +20,16 @@ package rmrmsghandlers
 
 import (
        "bytes"
-       "e2mgr/utils"
        "e2mgr/logger"
        "e2mgr/managers"
        "e2mgr/models"
        "e2mgr/rmrCgo"
        "e2mgr/services"
        "e2mgr/services/rmrsender"
+       "e2mgr/utils"
        "encoding/xml"
        "fmt"
+
        "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common"
        "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
 )
@@ -42,26 +43,27 @@ const (
 )
 
 type functionDetails struct {
-       functionChange       int
-       functionId           uint32
-       functionDefinition   string
-       functionRevision     uint32
+       functionChange     int
+       functionId         uint32
+       functionDefinition string
+       functionRevision   uint32
+       functionOID        string
 }
 
 type RicServiceUpdateHandler struct {
-       logger                *logger.Logger
-    rmrSender             *rmrsender.RmrSender
-       rNibDataService       services.RNibDataService
-       ranListManager        managers.RanListManager
+       logger          *logger.Logger
+       rmrSender       *rmrsender.RmrSender
+       rNibDataService services.RNibDataService
+       ranListManager  managers.RanListManager
 }
 
 func NewRicServiceUpdateHandler(logger *logger.Logger, rmrSender *rmrsender.RmrSender, rNibDataService services.RNibDataService, ranListManager managers.RanListManager) *RicServiceUpdateHandler {
-       return &RicServiceUpdateHandler {
-                logger:                logger,
-                rmrSender:             rmrSender,
-                rNibDataService:       rNibDataService,
-                               ranListManager:            ranListManager,
-        }
+       return &RicServiceUpdateHandler{
+               logger:          logger,
+               rmrSender:       rmrSender,
+               rNibDataService: rNibDataService,
+               ranListManager:  ranListManager,
+       }
 }
 
 func (h *RicServiceUpdateHandler) Handle(request *models.NotificationRequest) {
@@ -69,14 +71,14 @@ func (h *RicServiceUpdateHandler) Handle(request *models.NotificationRequest) {
        h.logger.Infof("#RicServiceUpdateHandler.Handle - RAN name: %s - received RIC_SERVICE_UPDATE. Payload: %s", ranName, request.Payload)
 
        nodebInfo, err := h.rNibDataService.GetNodeb(ranName)
-        if err != nil {
-                _, ok := err.(*common.ResourceNotFoundError)
+       if err != nil {
+               _, ok := err.(*common.ResourceNotFoundError)
                if !ok {
                        h.logger.Errorf("#RicServiceUpdateHandler.Handle - failed to get nodeB entity for ran name: %v due to RNIB Error: %s", ranName, err)
-               } else{
-                        h.logger.Errorf("#RicServiceUpdateHandler.Handle - nobeB entity of RanName:%s absent in RNIB. Error: %s", ranName, err)
-                }
-                return
+               } else {
+                       h.logger.Errorf("#RicServiceUpdateHandler.Handle - nobeB entity of RanName:%s absent in RNIB. Error: %s", ranName, err)
+               }
+               return
        }
 
        ricServiceUpdate, err := h.parseSetupRequest(request.Payload)
@@ -119,15 +121,15 @@ func (h *RicServiceUpdateHandler) sendUpdateAck(updateAck models.RicServiceUpdat
        }
 
        toReplaceTags := []string{"reject", "ignore", "procedureCode", "id", "RANfunctionID-Item", "RANfunctionsID-List"}
-       payLoad = utils.ReplaceEmptyTagsWithSelfClosing(payLoad,toReplaceTags)
+       payLoad = utils.ReplaceEmptyTagsWithSelfClosing(payLoad, toReplaceTags)
 
-       h.logger.Infof("#RicServiceUpdate.sendUpdateAck - Sending RIC_SERVICE_UPDATE_ACK to RAN name: %s with payload %s",nodebInfo.RanName, payLoad)
+       h.logger.Infof("#RicServiceUpdate.sendUpdateAck - Sending RIC_SERVICE_UPDATE_ACK to RAN name: %s with payload %s", nodebInfo.RanName, payLoad)
        msg := models.NewRmrMessage(rmrCgo.RIC_SERVICE_UPDATE_ACK, nodebInfo.RanName, payLoad, request.TransactionId, request.GetMsgSrc())
        err = h.rmrSender.Send(msg)
        return err
 }
 
-func (h *RicServiceUpdateHandler) updateFunctions(RICServiceUpdateIEs []models.RICServiceUpdateIEs,nodebInfo *entities.NodebInfo) []models.RicServiceAckRANFunctionIDItem {
+func (h *RicServiceUpdateHandler) updateFunctions(RICServiceUpdateIEs []models.RICServiceUpdateIEs, nodebInfo *entities.NodebInfo) []models.RicServiceAckRANFunctionIDItem {
        ranFunctions := nodebInfo.GetGnb().RanFunctions
        RanFIdtoIdxMap := make(map[uint32]int)
        var acceptedFunctionIds []models.RicServiceAckRANFunctionIDItem
@@ -144,14 +146,14 @@ func (h *RicServiceUpdateHandler) updateFunctions(RICServiceUpdateIEs []models.R
                }
 
                for _, functionDetail := range functionDetails {
-                       functionChange, functionId, functionDefinition, functionRevision := functionDetail.functionChange,
-                       functionDetail.functionId, functionDetail.functionDefinition, functionDetail.functionRevision
+                       functionChange, functionId, functionDefinition, functionRevision, functionOID := functionDetail.functionChange,
+                               functionDetail.functionId, functionDetail.functionDefinition, functionDetail.functionRevision, functionDetail.functionOID
                        ranFIndex, ok := RanFIdtoIdxMap[functionId]
                        if !ok {
                                switch functionChange {
-                               case RAN_FUNCTIONS_ADDED,RAN_FUNCTIONS_MODIFIED :
-                                       ranFunctions = append(ranFunctions, &entities.RanFunction{RanFunctionId:functionId,
-                                               RanFunctionDefinition:functionDefinition, RanFunctionRevision:functionRevision})
+                               case RAN_FUNCTIONS_ADDED, RAN_FUNCTIONS_MODIFIED:
+                                       ranFunctions = append(ranFunctions, &entities.RanFunction{RanFunctionId: functionId,
+                                               RanFunctionDefinition: functionDefinition, RanFunctionRevision: functionRevision, RanFunctionOid: functionOID})
                                case RAN_FUNCTIONS_DELETED:
                                        //Do nothing
                                }
@@ -164,7 +166,7 @@ func (h *RicServiceUpdateHandler) updateFunctions(RICServiceUpdateIEs []models.R
                                        functionsToBeDeleted[ranFIndex] = true
                                }
                        }
-                       serviceupdateAckFunctionId := models.RicServiceAckRANFunctionIDItem{RanFunctionID:functionId, RanFunctionRevision:functionRevision}
+                       serviceupdateAckFunctionId := models.RicServiceAckRANFunctionIDItem{RanFunctionID: functionId, RanFunctionRevision: functionRevision}
                        acceptedFunctionIds = append(acceptedFunctionIds, serviceupdateAckFunctionId)
                }
        }
@@ -187,36 +189,36 @@ func (h *RicServiceUpdateHandler) remove(ranFunctions []*entities.RanFunction, f
        return finalranFunctions
 }
 
-func (h *RicServiceUpdateHandler) getFunctionDetails(ricServiceUpdateIE models.RICServiceUpdateIEs) ([]functionDetails , error) {
+func (h *RicServiceUpdateHandler) getFunctionDetails(ricServiceUpdateIE models.RICServiceUpdateIEs) ([]functionDetails, error) {
        functionChange := ricServiceUpdateIE.ID
-       switch functionChange{
-               case RAN_FUNCTIONS_ADDED, RAN_FUNCTIONS_MODIFIED:
-                       return h.getFunctionsAddedModifiedHandler(ricServiceUpdateIE)
-               case RAN_FUNCTIONS_DELETED:
-                       return h.getFunctionsDeleteHandler(ricServiceUpdateIE)
-               default:
-                       return nil, common.NewInternalError(fmt.Errorf("#RicServiceUpdate.getFunctionDetails - Unknown change type %v", functionChange))
+       switch functionChange {
+       case RAN_FUNCTIONS_ADDED, RAN_FUNCTIONS_MODIFIED:
+               return h.getFunctionsAddedModifiedHandler(ricServiceUpdateIE)
+       case RAN_FUNCTIONS_DELETED:
+               return h.getFunctionsDeleteHandler(ricServiceUpdateIE)
+       default:
+               return nil, common.NewInternalError(fmt.Errorf("#RicServiceUpdate.getFunctionDetails - Unknown change type %v", functionChange))
        }
        return nil, common.NewInternalError(fmt.Errorf("#RicServiceUpdate.getFunctionDetails - Internal Error"))
 }
 
-func (h *RicServiceUpdateHandler) getFunctionsAddedModifiedHandler(ricServiceUpdateIE models.RICServiceUpdateIEs) ([]functionDetails , error){
+func (h *RicServiceUpdateHandler) getFunctionsAddedModifiedHandler(ricServiceUpdateIE models.RICServiceUpdateIEs) ([]functionDetails, error) {
        functionChange := ricServiceUpdateIE.ID
        ranFunctionsIEList := ricServiceUpdateIE.Value.RANfunctionsList.RANfunctionsItemProtocolIESingleContainer
-       if len(ranFunctionsIEList) ==0 {
+       if len(ranFunctionsIEList) == 0 {
                return nil, common.NewInternalError(fmt.Errorf("#RicServiceUpdate.getFunctionDetails - function change type is %v but Functions list is empty", functionChange))
        }
 
        functionDetailsList := make([]functionDetails, len(ranFunctionsIEList))
        for index, ranFunctionIE := range ranFunctionsIEList {
                ranFunction := ranFunctionIE.Value.RANfunctionItem
-               functionDetailsList[index] = functionDetails{functionChange:functionChange, functionId:ranFunction.RanFunctionID,
-                       functionDefinition:ranFunction.RanFunctionDefinition, functionRevision:ranFunction.RanFunctionRevision}
+               functionDetailsList[index] = functionDetails{functionChange: functionChange, functionId: ranFunction.RanFunctionID,
+                       functionDefinition: ranFunction.RanFunctionDefinition, functionRevision: ranFunction.RanFunctionRevision, functionOID: ranFunction.RanFunctionOID}
        }
        return functionDetailsList, nil
 }
 
-func (h *RicServiceUpdateHandler) getFunctionsDeleteHandler(ricServiceUpdateIE models.RICServiceUpdateIEs) ([]functionDetails , error){
+func (h *RicServiceUpdateHandler) getFunctionsDeleteHandler(ricServiceUpdateIE models.RICServiceUpdateIEs) ([]functionDetails, error) {
        functionChange := ricServiceUpdateIE.ID
        ranFunctionIdIEsList := ricServiceUpdateIE.Value.RANfunctionsIDList.RANfunctionsItemIDProtocolIESingleContainer
        if len(ranFunctionIdIEsList) == 0 {
@@ -226,22 +228,22 @@ func (h *RicServiceUpdateHandler) getFunctionsDeleteHandler(ricServiceUpdateIE m
        functionDetailsList := make([]functionDetails, len(ranFunctionIdIEsList))
        for index, ranFunctionIdIE := range ranFunctionIdIEsList {
                ranFunctionId := ranFunctionIdIE.Value.RANfunctionIDItem
-               functionDetailsList[index] = functionDetails{functionChange:functionChange, functionId:ranFunctionId.RanFunctionID,
-                       functionDefinition:"", functionRevision:ranFunctionId.RanFunctionRevision}
+               functionDetailsList[index] = functionDetails{functionChange: functionChange, functionId: ranFunctionId.RanFunctionID,
+                       functionDefinition: "", functionRevision: ranFunctionId.RanFunctionRevision}
        }
        return functionDetailsList, nil
 }
 
 func (h *RicServiceUpdateHandler) parseSetupRequest(payload []byte) (*models.RICServiceUpdateMessage, error) {
-        pipInd := bytes.IndexByte(payload, '|')
-        if pipInd < 0 {
-                return nil, common.NewInternalError(fmt.Errorf("#RicServiceUpdateHandler.parseSetupRequest - Error parsing RIC SERVICE UPDATE failed extract Payload: no | separator found"))
-        }
-
-        ricServiceUpdate := &models.RICServiceUpdateMessage{}
-        err := xml.Unmarshal(utils.NormalizeXml(payload[pipInd+1:]), &ricServiceUpdate.E2APPDU)
-        if err != nil {
-                return nil, common.NewInternalError(fmt.Errorf("#RicServiceUpdateHandler.parseSetupRequest - Error unmarshalling RIC SERVICE UPDATE payload: %x", payload))
-        }
-        return ricServiceUpdate, nil
+       pipInd := bytes.IndexByte(payload, '|')
+       if pipInd < 0 {
+               return nil, common.NewInternalError(fmt.Errorf("#RicServiceUpdateHandler.parseSetupRequest - Error parsing RIC SERVICE UPDATE failed extract Payload: no | separator found"))
+       }
+
+       ricServiceUpdate := &models.RICServiceUpdateMessage{}
+       err := xml.Unmarshal(utils.NormalizeXml(payload[pipInd+1:]), &ricServiceUpdate.E2APPDU)
+       if err != nil {
+               return nil, common.NewInternalError(fmt.Errorf("#RicServiceUpdateHandler.parseSetupRequest - Error unmarshalling RIC SERVICE UPDATE payload: %x", payload))
+       }
+       return ricServiceUpdate, nil
 }
index 4fcbe0d..0ffe458 100644 (file)
@@ -20,94 +20,95 @@ package models
 
 import (
        "encoding/xml"
+
        "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
 )
 
 type RANfunctionsItemProtocolIESingleContainer struct {
-               Text        string `xml:",chardata"`
-               Id          string `xml:"id"`
-               Criticality struct {
-                               Text   string `xml:",chardata"`
-                               Ignore string `xml:"ignore"`
-               } `xml:"criticality"`
-               Value struct {
-                               Text              string `xml:",chardata"`
-                               RANfunctionItem struct {
-                                               Text                string `xml:",chardata"`
-                                               RanFunctionID       uint32 `xml:"ranFunctionID"`
-                                               RanFunctionDefinition string `xml:"ranFunctionDefinition"`
-                                               RanFunctionRevision uint32 `xml:"ranFunctionRevision"`
-                               } `xml:"RANfunction-Item"`
-               } `xml:"value"`
+       Text        string `xml:",chardata"`
+       Id          string `xml:"id"`
+       Criticality struct {
+               Text   string `xml:",chardata"`
+               Ignore string `xml:"ignore"`
+       } `xml:"criticality"`
+       Value struct {
+               Text            string `xml:",chardata"`
+               RANfunctionItem struct {
+                       Text                  string `xml:",chardata"`
+                       RanFunctionID         uint32 `xml:"ranFunctionID"`
+                       RanFunctionDefinition string `xml:"ranFunctionDefinition"`
+                       RanFunctionRevision   uint32 `xml:"ranFunctionRevision"`
+                       RanFunctionOID        string `xml:"ranFunctionOID"`
+               } `xml:"RANfunction-Item"`
+       } `xml:"value"`
 }
 
 type RANfunctionsItemIDProtocolIESingleContainer struct {
-               Text        string `xml:",chardata"`
-               Id          string `xml:"id"`
-               Criticality struct {
-                               Text   string `xml:",chardata"`
-                               Ignore string `xml:"ignore"`
-               } `xml:"criticality"`
-               Value struct {
-                               Text              string `xml:",chardata"`
-                               RANfunctionIDItem struct {
-                                               Text                string `xml:",chardata"`
-                                               RanFunctionID       uint32 `xml:"ranFunctionID"`
-                                               RanFunctionRevision uint32 `xml:"ranFunctionRevision"`
-                               } `xml:"RANfunctionID-Item"`
-               } `xml:"value"`
+       Text        string `xml:",chardata"`
+       Id          string `xml:"id"`
+       Criticality struct {
+               Text   string `xml:",chardata"`
+               Ignore string `xml:"ignore"`
+       } `xml:"criticality"`
+       Value struct {
+               Text              string `xml:",chardata"`
+               RANfunctionIDItem struct {
+                       Text                string `xml:",chardata"`
+                       RanFunctionID       uint32 `xml:"ranFunctionID"`
+                       RanFunctionRevision uint32 `xml:"ranFunctionRevision"`
+               } `xml:"RANfunctionID-Item"`
+       } `xml:"value"`
 }
 
-
 type RICServiceUpdateIEs struct {
        Text        string `xml:",chardata"`
-        ID          int `xml:"id"`
-        Criticality struct {
-                Text   string `xml:",chardata"`
-                Reject string `xml:"reject"`
-        } `xml:"criticality"`
-        Value struct {
+       ID          int    `xml:"id"`
+       Criticality struct {
                Text   string `xml:",chardata"`
+               Reject string `xml:"reject"`
+       } `xml:"criticality"`
+       Value struct {
+               Text             string `xml:",chardata"`
                RANfunctionsList struct {
-                       Text   string `xml:",chardata"`
+                       Text                                      string                                      `xml:",chardata"`
                        RANfunctionsItemProtocolIESingleContainer []RANfunctionsItemProtocolIESingleContainer `xml:"ProtocolIE-SingleContainer"`
                } `xml:"RANfunctions-List"`
                RANfunctionsIDList struct {
-                       Text   string `xml:",chardata"`
+                       Text                                        string                                        `xml:",chardata"`
                        RANfunctionsItemIDProtocolIESingleContainer []RANfunctionsItemIDProtocolIESingleContainer `xml:"ProtocolIE-SingleContainer"`
                } `xml:"RANfunctionsID-List"`
-       }`xml:"value"`
+       } `xml:"value"`
 }
 
 type RICServiceUpdateInitiatingMessage struct {
-        Text          string `xml:",chardata"`
-        ProcedureCode string `xml:"procedureCode"`
-        Criticality   struct {
-                Text   string `xml:",chardata"`
-                Reject string `xml:"reject"`
-        } `xml:"criticality"`
+       Text          string `xml:",chardata"`
+       ProcedureCode string `xml:"procedureCode"`
+       Criticality   struct {
+               Text   string `xml:",chardata"`
+               Reject string `xml:"reject"`
+       } `xml:"criticality"`
        Value struct {
-                Text            string `xml:",chardata"`
+               Text             string `xml:",chardata"`
                RICServiceUpdate struct {
                        Text        string `xml:",chardata"`
-                        ProtocolIEs struct {
-                                Text               string `xml:",chardata"`
-                                RICServiceUpdateIEs []RICServiceUpdateIEs `xml:"RICserviceUpdate-IEs"`
-                        } `xml:"protocolIEs"`
+                       ProtocolIEs struct {
+                               Text                string                `xml:",chardata"`
+                               RICServiceUpdateIEs []RICServiceUpdateIEs `xml:"RICserviceUpdate-IEs"`
+                       } `xml:"protocolIEs"`
                } `xml:"RICserviceUpdate"`
        } `xml:"value"`
 }
 
 type RICServiceUpdateE2APPDU struct {
-        XMLName xml.Name `xml:"E2AP-PDU"`
-        Text    string `xml:",chardata"`
-        InitiatingMessage  RICServiceUpdateInitiatingMessage `xml:"initiatingMessage"`
+       XMLName           xml.Name                          `xml:"E2AP-PDU"`
+       Text              string                            `xml:",chardata"`
+       InitiatingMessage RICServiceUpdateInitiatingMessage `xml:"initiatingMessage"`
 }
 
-type RICServiceUpdateMessage struct{
-       XMLName xml.Name `xml:"RICserviceUpdateMessage"`
-       Text    string   `xml:",chardata"`
-       E2APPDU RICServiceUpdateE2APPDU  `xml:"E2AP-PDU"`
+type RICServiceUpdateMessage struct {
+       XMLName xml.Name                `xml:"RICserviceUpdateMessage"`
+       Text    string                  `xml:",chardata"`
+       E2APPDU RICServiceUpdateE2APPDU `xml:"E2AP-PDU"`
 }
 
 func (m *RICServiceUpdateE2APPDU) ExtractRanFunctionsList() []*entities.RanFunction {
@@ -125,6 +126,7 @@ func (m *RICServiceUpdateE2APPDU) ExtractRanFunctionsList() []*entities.RanFunct
                        RanFunctionId:         ranFunctionItem.RanFunctionID,
                        RanFunctionDefinition: ranFunctionItem.RanFunctionDefinition,
                        RanFunctionRevision:   ranFunctionItem.RanFunctionRevision,
+                       RanFunctionOid:        ranFunctionItem.RanFunctionOID,
                }
        }
        return funcs
index c9ea390..3edff8a 100644 (file)
@@ -23,8 +23,9 @@ import (
        "e2mgr/models"
        "e2mgr/utils"
        "encoding/xml"
-       "github.com/stretchr/testify/assert"
        "testing"
+
+       "github.com/stretchr/testify/assert"
 )
 
 func getTestRicServiceUpdate(t *testing.T, xmlPath string) *models.RICServiceUpdateMessage {
@@ -47,3 +48,13 @@ func TestRicServiceUpdateMessageNoRanFunctions(t *testing.T) {
        serviceUpdate := getTestRicServiceUpdate(t, "../tests/resources/serviceUpdate/RicServiceUpdate_Empty.xml")
        assert.Nil(t, serviceUpdate.E2APPDU.ExtractRanFunctionsList())
 }
+
+func TestRicServiceUpdateMessageWithOID(t *testing.T) {
+       serviceUpdate := getTestRicServiceUpdate(t, "../tests/resources/serviceUpdate/RicServiceUpdate_AddedFunction_With_OID.xml")
+
+       ranFunctions := serviceUpdate.E2APPDU.ExtractRanFunctionsList()
+
+       assert.Equal(t, uint32(20), ranFunctions[0].RanFunctionId)
+       assert.Equal(t, uint32(2), ranFunctions[0].RanFunctionRevision)
+       assert.Equal(t, "OID20", ranFunctions[0].RanFunctionOid)
+}
diff --git a/E2Manager/tests/resources/serviceUpdate/RicServiceUpdate_AddedFunction_With_OID.xml b/E2Manager/tests/resources/serviceUpdate/RicServiceUpdate_AddedFunction_With_OID.xml
new file mode 100644 (file)
index 0000000..319b681
--- /dev/null
@@ -0,0 +1,114 @@
+ <E2AP-PDU>\r
+    <initiatingMessage>\r
+        <procedureCode>7</procedureCode>\r
+        <criticality><reject/></criticality>\r
+        <value>\r
+            <RICserviceUpdate>\r
+                <protocolIEs>\r
+                    <RICserviceUpdate-IEs>\r
+                        <id>10</id>\r
+                        <criticality><reject/></criticality>\r
+                        <value>\r
+                            <RANfunctions-List>\r
+                                <ProtocolIE-SingleContainer>\r
+                                    <id>8</id>\r
+                                    <criticality><reject/></criticality>\r
+                                    <value>\r
+                                        <RANfunction-Item>\r
+                                            <ranFunctionID>18</ranFunctionID>\r
+                                            <ranFunctionOID>OID18</ranFunctionOID>\r
+                                            <ranFunctionDefinition>\r
+                                                20 63 6F 6E 6E 65 63 74 65 64 20 64 65 70 6C 6F\r
+                                                20 6D 6F 6E 69 74 6F 72 01 01 60 00 01 01 07 00\r
+                                                50 65 72 69 6F 64 69 63 20 72 65 70 6F 72 74 01\r
+                                                05 14 01 01 1D 00 4F 2D 44 55 20 4D 65 61 73 75\r
+                                                72 65 6D 65 6E 74 20 43 6F 6E 74 61 69 6E 65 72\r
+                                                20 66 6F 72 20 74 68 65 20 35 47 43 20 63 6F 6E\r
+                                                6E 65 63 74 65 64 20 64 65 70 6C 6F 79 6D 65 6E\r
+                                                74 01 01 01 01 00 01 02 1D 00 4F 2D 44 55 20 4D\r
+                                                65 61 73 75 72 65 6D 65 6E 74 20 43 6F 6E 74 61\r
+                                                69 6E 65 72 20 66 6F 72 20 74 68 65 20 45 50 43\r
+                                                20 63 6F 6E 6E 65 63 74 65 64 20 64 65 70 6C 6F\r
+                                                79 6D 65 6E 74 01 01 01 01 00 01 03 1E 80 4F 2D\r
+                                                43 55 2D 43 50 20 4D 65 61 73 75 72 65 6D 65 6E\r
+                                                74 20 43 6F 6E 74 61 69 6E 65 72 20 66 6F 72 20\r
+                                                74 68 65 20 35 47 43 20 63 6F 6E 6E 65 63 74 65\r
+                                                64 20 64 65 70 6C 6F 79 6D 65 6E 74 01 01 01 01\r
+                                                00 01 04 1E 80 4F 2D 43 55 2D 43 50 20 4D 65 61\r
+                                                73 75 72 65 6D 65 6E 74 20 43 6F 6E 74 61 69 6E\r
+                                                65 72 20 66 6F 72 20 74 68 65 20 45 50 43 20 63\r
+                                                6F 6E 6E 65 63 74 65 64 20 64 65 70 6C 6F 79 6D\r
+                                                65 6E 74 01 01 01 01 00 01 05 1E 80 4F 2D 43 55\r
+                                                2D 55 50 20 4D 65 61 73 75 72 65 6D 65 6E 74 20\r
+                                                43 6F 6E 74 61 69 6E 65 72 20 66 6F 72 20 74 68\r
+                                                65 20 35 47 43 20 63 6F 6E 6E 65 63 74 65 64 20\r
+                                                64 65 70 6C 6F 79 6D 65 6E 74 01 01 01 01 00 01\r
+                                                06 1E 80 4F 2D 43 55 2D 55 50 20 4D 65 61 73 75\r
+                                                72 65 6D 65 6E 74 20 43 6F 6E 74 61 69 6E 65 72\r
+                                                20 66 6F 72 20 74 68 65 20 45 50 43 20 63 6F 6E\r
+                                                6E 65 63 74 65 64 20 64 65 70 6C 6F 79 6D 65 6E\r
+                                                74 01 01 01 01\r
+                                            </ranFunctionDefinition>\r
+                                            <ranFunctionRevision>5</ranFunctionRevision>\r
+                                        </RANfunction-Item>\r
+                                    </value>\r
+                                </ProtocolIE-SingleContainer>\r
+                            </RANfunctions-List>\r
+                        </value>\r
+                    </RICserviceUpdate-IEs>\r
+                    <RICserviceUpdate-IEs>\r
+                        <id>10</id>\r
+                        <criticality><reject/></criticality>\r
+                        <value>\r
+                            <RANfunctions-List>\r
+                                <ProtocolIE-SingleContainer>\r
+                                    <id>8</id>\r
+                                    <criticality><reject/></criticality>\r
+                                    <value>\r
+                                        <RANfunction-Item>\r
+                                            <ranFunctionID>20</ranFunctionID>\r
+                                            <ranFunctionOID>OID20</ranFunctionOID>\r
+                                            <ranFunctionDefinition>\r
+                                                50 65 72 69 6F 64 69 63 20 72 65 70 6F 72 74 01\r
+                                                20 6D 6F 6E 69 74 6F 72 01 01 60 00 01 01 07 00\r
+                                                50 65 72 69 6F 64 69 63 20 72 65 70 6F 72 74 01\r
+                                                05 14 01 01 1D 00 4F 2D 44 55 20 4D 65 61 73 75\r
+                                                72 65 6D 65 6E 74 20 43 6F 6E 74 61 69 6E 65 72\r
+                                                20 66 6F 72 20 74 68 65 20 35 47 43 20 63 6F 6E\r
+                                                6E 65 63 74 65 64 20 64 65 70 6C 6F 79 6D 65 6E\r
+                                                74 01 01 01 01 00 01 02 1D 00 4F 2D 44 55 20 4D\r
+                                                65 61 73 75 72 65 6D 65 6E 74 20 43 6F 6E 74 61\r
+                                                69 6E 65 72 20 66 6F 72 20 74 68 65 20 45 50 43\r
+                                                20 63 6F 6E 6E 65 63 74 65 64 20 64 65 70 6C 6F\r
+                                                79 6D 65 6E 74 01 01 01 01 00 01 03 1E 80 4F 2D\r
+                                                43 55 2D 43 50 20 4D 65 61 73 75 72 65 6D 65 6E\r
+                                                74 20 43 6F 6E 74 61 69 6E 65 72 20 66 6F 72 20\r
+                                                74 68 65 20 35 47 43 20 63 6F 6E 6E 65 63 74 65\r
+                                                64 20 64 65 70 6C 6F 79 6D 65 6E 74 01 01 01 01\r
+                                                00 01 04 1E 80 4F 2D 43 55 2D 43 50 20 4D 65 61\r
+                                                73 75 72 65 6D 65 6E 74 20 43 6F 6E 74 61 69 6E\r
+                                                65 72 20 66 6F 72 20 74 68 65 20 45 50 43 20 63\r
+                                                6F 6E 6E 65 63 74 65 64 20 64 65 70 6C 6F 79 6D\r
+                                                65 6E 74 01 01 01 01 00 01 05 1E 80 4F 2D 43 55\r
+                                                2D 55 50 20 4D 65 61 73 75 72 65 6D 65 6E 74 20\r
+                                                43 6F 6E 74 61 69 6E 65 72 20 66 6F 72 20 74 68\r
+                                                65 20 35 47 43 20 63 6F 6E 6E 65 63 74 65 64 20\r
+                                                64 65 70 6C 6F 79 6D 65 6E 74 01 01 01 01 00 01\r
+                                                06 1E 80 4F 2D 43 55 2D 55 50 20 4D 65 61 73 75\r
+                                                72 65 6D 65 6E 74 20 43 6F 6E 74 61 69 6E 65 72\r
+                                                20 66 6F 72 20 74 68 65 20 45 50 43 20 63 6F 6E\r
+                                                65 20 35 47 43 20 63 6F 6E 6E 65 63 74 65 64 20\r
+                                                74 01 01 01 01\r
+                                            </ranFunctionDefinition>\r
+                                            <ranFunctionRevision>2</ranFunctionRevision>\r
+                                        </RANfunction-Item>\r
+                                    </value>\r
+                                </ProtocolIE-SingleContainer>\r
+                            </RANfunctions-List>\r
+                        </value>\r
+                    </RICserviceUpdate-IEs>\r
+                </protocolIEs>\r
+            </RICserviceUpdate>\r
+        </value>\r
+    </initiatingMessage>\r
+</E2AP-PDU>\r