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"
)
)
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) {
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)
}
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
}
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
}
functionsToBeDeleted[ranFIndex] = true
}
}
- serviceupdateAckFunctionId := models.RicServiceAckRANFunctionIDItem{RanFunctionID:functionId, RanFunctionRevision:functionRevision}
+ serviceupdateAckFunctionId := models.RicServiceAckRANFunctionIDItem{RanFunctionID: functionId, RanFunctionRevision: functionRevision}
acceptedFunctionIds = append(acceptedFunctionIds, serviceupdateAckFunctionId)
}
}
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 {
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
}
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 {
RanFunctionId: ranFunctionItem.RanFunctionID,
RanFunctionDefinition: ranFunctionItem.RanFunctionDefinition,
RanFunctionRevision: ranFunctionItem.RanFunctionRevision,
+ RanFunctionOid: ranFunctionItem.RanFunctionOID,
}
}
return funcs
"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 {
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)
+}
--- /dev/null
+ <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