E2Setup Message as per E2AP spec v2.0 69/8069/2
authorsubhash kumar singh <subh.singh@samsung.com>
Mon, 18 Apr 2022 09:52:24 +0000 (09:52 +0000)
committersubhash kumar singh <subh.singh@samsung.com>
Mon, 18 Apr 2022 10:00:07 +0000 (15:30 +0530)
Implement E2Setup Message as per the E2AP spec v2.0 to mainly
support E2nodeConfig IE.

Issue-ID: RIC-722
Change-Id: I3174451912d5d08cd472b3ae7ba81b176daebf7c
Signed-off-by: subhash kumar singh <subh.singh@samsung.com>
15 files changed:
E2Manager/go.mod
E2Manager/go.sum
E2Manager/handlers/rmrmsghandlers/e2_setup_request_notification_handler.go
E2Manager/handlers/rmrmsghandlers/e2_setup_request_notification_handler_test.go
E2Manager/models/e2_setup_request_message.go
E2Manager/models/e2_setup_request_message_test.go
E2Manager/models/e2_setup_response_message.go
E2Manager/models/e2_setup_response_message_test.go
E2Manager/tests/resources/setupRequest/setupRequest_en-gNB.xml
E2Manager/tests/resources/setupRequest/setupRequest_enb.xml
E2Manager/tests/resources/setupRequest/setupRequest_gnb.xml
E2Manager/tests/resources/setupRequest/setupRequest_gnb_with_zero_functions.xml
E2Manager/tests/resources/setupRequest/setupRequest_gnb_without_functions.xml
E2Manager/tests/resources/setupRequest/setupRequest_ng-eNB.xml
E2Manager/tests/resources/setupRequest/setupRequest_with_oid_gnb.xml

index 7a9abf3..c464026 100644 (file)
@@ -2,7 +2,7 @@ module e2mgr
 
 require (
        gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common v1.2.1
-       gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities v1.2.3
+       gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities v1.2.4-0.20220331130243-8ea5c5358ce9
        gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader v1.2.1
        gerrit.o-ran-sc.org/r/ric-plt/sdlgo v0.8.0
        github.com/golang/protobuf v1.4.2
index 4a9b36e..398c388 100644 (file)
@@ -5,6 +5,8 @@ gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities v1.2.1 h1:8Z60JRsPgcS1Ona4
 gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities v1.2.1/go.mod h1:YaQ+XEI4PcAoISxp9wUpUr2TP0J7JihpQTD0G1Lpd4A=
 gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities v1.2.3 h1:fF5SA51FeEB9of/Q9a17ADUbCa3cU6oNkXY7GlFSvhs=
 gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities v1.2.3/go.mod h1:YaQ+XEI4PcAoISxp9wUpUr2TP0J7JihpQTD0G1Lpd4A=
+gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities v1.2.4-0.20220331130243-8ea5c5358ce9 h1:Z6NfwityKkVM0t6n/hAPwRvCsQwW3InMqQR62VlkvZI=
+gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities v1.2.4-0.20220331130243-8ea5c5358ce9/go.mod h1:YaQ+XEI4PcAoISxp9wUpUr2TP0J7JihpQTD0G1Lpd4A=
 gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader v1.2.1 h1:BG3kste8PLVTG0m8CRB/VP2tAV5JImKueBGuOsUNcR8=
 gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/reader v1.2.1/go.mod h1:zX8rW6YEsagHrRGVW5YO50Ku/Csrpzsuvblhr4DbYi4=
 gerrit.o-ran-sc.org/r/ric-plt/sdlgo.git v0.8.0 h1:H7GtCRC+pGn6oOxYalUZr7LinQX5jQCVa+ConX7PB5Q=
index b2e1633..8f4aacd 100644 (file)
@@ -34,15 +34,16 @@ import (
        "encoding/xml"
        "errors"
        "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"
        "strconv"
        "strings"
+
+       "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common"
+       "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
 )
 
 var (
        emptyTagsToReplaceToSelfClosingTags = []string{"reject", "ignore", "transport-resource-unavailable", "om-intervention", "request-id-unknown",
-               "v60s", "v20s", "v10s", "v5s", "v2s", "v1s"}
+               "v60s", "v20s", "v10s", "v5s", "v2s", "v1s", "ng", "xn", "e1", "f1", "w1", "s1", "x2", "success", "failure"}
        gnbTypesMap = map[string]entities.GnbType{
                "gnb":    entities.GnbType_GNB,
                "en_gnb": entities.GnbType_EN_GNB,
@@ -93,14 +94,6 @@ func (h *E2SetupRequestNotificationHandler) Handle(request *models.NotificationR
                return
        }
 
-       h.logger.Infof("#E2SetupRequestNotificationHandler.Handle - got general configuration from rnib - enableRic: %t", generalConfiguration.EnableRic)
-
-       if !generalConfiguration.EnableRic {
-               cause := models.Cause{Misc: &models.CauseMisc{OmIntervention: &struct{}{}}}
-               h.handleUnsuccessfulResponse(ranName, request, cause)
-               return
-       }
-
        setupRequest, e2tIpAddress, err := h.parseSetupRequest(request.Payload)
        if err != nil {
                h.logger.Errorf(err.Error())
@@ -110,6 +103,14 @@ func (h *E2SetupRequestNotificationHandler) Handle(request *models.NotificationR
        h.logger.Infof("#E2SetupRequestNotificationHandler.Handle - E2T Address: %s - handling E2_SETUP_REQUEST", e2tIpAddress)
        h.logger.Debugf("#E2SetupRequestNotificationHandler.Handle - E2_SETUP_REQUEST has been parsed successfully %+v", setupRequest)
 
+       h.logger.Infof("#E2SetupRequestNotificationHandler.Handle - got general configuration from rnib - enableRic: %t", generalConfiguration.EnableRic)
+
+       if !generalConfiguration.EnableRic {
+               cause := models.Cause{Misc: &models.CauseMisc{OmIntervention: &struct{}{}}}
+               h.handleUnsuccessfulResponse(ranName, request, cause, setupRequest)
+               return
+       }
+
        _, err = h.e2tInstancesManager.GetE2TInstance(e2tIpAddress)
 
        if err != nil {
@@ -131,7 +132,7 @@ func (h *E2SetupRequestNotificationHandler) Handle(request *models.NotificationR
                if nodebInfo, err = h.handleNewRan(ranName, e2tIpAddress, setupRequest); err != nil {
                        if _, ok := err.(*e2managererrors.UnknownSetupRequestRanNameError); ok {
                                cause := models.Cause{RicRequest: &models.CauseRic{RequestIdUnknown: &struct{}{}}}
-                               h.handleUnsuccessfulResponse(ranName, request, cause)
+                               h.handleUnsuccessfulResponse(ranName, request, cause, setupRequest)
                        }
                        return
                }
@@ -157,7 +158,7 @@ func (h *E2SetupRequestNotificationHandler) Handle(request *models.NotificationR
                        }
 
                        cause := models.Cause{Transport: &models.CauseTransport{TransportResourceUnavailable: &struct{}{}}}
-                       h.handleUnsuccessfulResponse(nodebInfo.RanName, request, cause)
+                       h.handleUnsuccessfulResponse(nodebInfo.RanName, request, cause, setupRequest)
                }
                return
        }
@@ -220,10 +221,25 @@ func (h *E2SetupRequestNotificationHandler) handleExistingRan(ranName string, no
 
        nodebInfo.SetupFromNetwork = true
 
+       e2NodeConfig := setupRequest.ExtractE2NodeConfigList()
+       if e2NodeConfig == nil {
+               return false, errors.New("Empty E2nodeComponentConfigAddition-List")
+       }
+
        if nodebInfo.NodeType == entities.Node_ENB {
+               if len(e2NodeConfig) == 0 && len(nodebInfo.GetEnb().GetNodeConfigs()) == 0 {
+                       return false, errors.New("Empty E2nodeComponentConfigAddition-List")
+               }
+               nodebInfo.GetEnb().NodeConfigs = e2NodeConfig
+
                return false, nil
        }
 
+       if len(e2NodeConfig) == 0 && len(nodebInfo.GetGnb().GetNodeConfigs()) == 0 {
+               return false, errors.New("Empty E2nodeComponentConfigAddition-List")
+       }
+       nodebInfo.GetGnb().NodeConfigs = e2NodeConfig
+
        setupMessageRanFuncs := setupRequest.ExtractRanFunctionsList()
 
        if setupMessageRanFuncs == nil || (len(setupMessageRanFuncs) == 0 && len(nodebInfo.GetGnb().RanFunctions) == 0) {
@@ -234,8 +250,8 @@ func (h *E2SetupRequestNotificationHandler) handleExistingRan(ranName string, no
        return true, nil
 }
 
-func (h *E2SetupRequestNotificationHandler) handleUnsuccessfulResponse(ranName string, req *models.NotificationRequest, cause models.Cause) {
-       failureResponse := models.NewE2SetupFailureResponseMessage(models.TimeToWaitEnum.V60s, cause)
+func (h *E2SetupRequestNotificationHandler) handleUnsuccessfulResponse(ranName string, req *models.NotificationRequest, cause models.Cause, setupRequest *models.E2SetupRequestMessage) {
+       failureResponse := models.NewE2SetupFailureResponseMessage(models.TimeToWaitEnum.V60s, cause, setupRequest)
        h.logger.Debugf("#E2SetupRequestNotificationHandler.handleUnsuccessfulResponse - E2_SETUP_RESPONSE has been built successfully %+v", failureResponse)
 
        responsePayload, err := xml.Marshal(&failureResponse.E2APPDU)
@@ -243,7 +259,7 @@ func (h *E2SetupRequestNotificationHandler) handleUnsuccessfulResponse(ranName s
                h.logger.Warnf("#E2SetupRequestNotificationHandler.handleUnsuccessfulResponse - RAN name: %s - Error marshalling RIC_E2_SETUP_RESP. Payload: %s", ranName, responsePayload)
        }
 
-       responsePayload = utils.ReplaceEmptyTagsWithSelfClosing(responsePayload,emptyTagsToReplaceToSelfClosingTags)
+       responsePayload = utils.ReplaceEmptyTagsWithSelfClosing(responsePayload, emptyTagsToReplaceToSelfClosingTags)
 
        h.logger.Infof("#E2SetupRequestNotificationHandler.handleUnsuccessfulResponse - payload: %s", responsePayload)
        msg := models.NewRmrMessage(rmrCgo.RIC_E2_SETUP_FAILURE, ranName, responsePayload, req.TransactionId, req.GetMsgSrc())
@@ -268,7 +284,7 @@ func (h *E2SetupRequestNotificationHandler) handleSuccessfulResponse(ranName str
                h.logger.Warnf("#E2SetupRequestNotificationHandler.handleSuccessfulResponse - RAN name: %s - Error marshalling RIC_E2_SETUP_RESP. Payload: %s", ranName, responsePayload)
        }
 
-       responsePayload = utils.ReplaceEmptyTagsWithSelfClosing(responsePayload,emptyTagsToReplaceToSelfClosingTags)
+       responsePayload = utils.ReplaceEmptyTagsWithSelfClosing(responsePayload, emptyTagsToReplaceToSelfClosingTags)
 
        h.logger.Infof("#E2SetupRequestNotificationHandler.handleSuccessfulResponse - payload: %s", responsePayload)
 
@@ -337,10 +353,25 @@ func (h *E2SetupRequestNotificationHandler) buildNodebInfo(ranName string, e2tAd
                return nil, err
        }
 
+       e2NodeConfig := request.ExtractE2NodeConfigList()
+       if e2NodeConfig == nil {
+               return nil, errors.New("Empty E2nodeComponentConfigAddition-List")
+       }
+
        if nodebInfo.NodeType == entities.Node_ENB {
+               if len(e2NodeConfig) == 0 && len(nodebInfo.GetEnb().GetNodeConfigs()) == 0 {
+                       return nil, errors.New("Empty E2nodeComponentConfigAddition-List")
+               }
+               nodebInfo.GetEnb().NodeConfigs = e2NodeConfig
+
                return nodebInfo, nil
        }
 
+       if len(e2NodeConfig) == 0 && len(nodebInfo.GetGnb().GetNodeConfigs()) == 0 {
+               return nil, errors.New("Empty E2nodeComponentConfigAddition-List")
+       }
+       nodebInfo.GetGnb().NodeConfigs = e2NodeConfig
+
        ranFuncs := request.ExtractRanFunctionsList()
 
        if ranFuncs != nil {
index d3a7ae2..aff0ebb 100644 (file)
@@ -1,7 +1,7 @@
 //
 // Copyright 2019 AT&T Intellectual Property
 // Copyright 2019 Nokia
-// Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved.
+// Copyright (c) 2022 Samsung Electronics Co., Ltd. All Rights Reserved.
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -32,11 +32,12 @@ import (
        "e2mgr/utils"
        "encoding/xml"
        "errors"
+       "testing"
+
        "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/common"
        "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
        "github.com/stretchr/testify/assert"
        "github.com/stretchr/testify/mock"
-       "testing"
 )
 
 const (
@@ -50,9 +51,9 @@ const (
        NgEnbSetupRequestXmlPath                 = "../../tests/resources/setupRequest/setupRequest_ng-eNB.xml"
        EnbSetupRequestXmlPath                   = "../../tests/resources/setupRequest/setupRequest_enb.xml"
        GnbWithoutFunctionsSetupRequestXmlPath   = "../../tests/resources/setupRequest/setupRequest_gnb_without_functions.xml"
-       E2SetupFailureResponseWithMiscCause      = "<E2AP-PDU><unsuccessfulOutcome><procedureCode>1</procedureCode><criticality><reject/></criticality><value><E2setupFailure><protocolIEs><E2setupFailureIEs><id>1</id><criticality><ignore/></criticality><value><Cause><misc><om-intervention/></misc></Cause></value></E2setupFailureIEs><E2setupFailureIEs><id>31</id><criticality><ignore/></criticality><value><TimeToWait><v60s/></TimeToWait></value></E2setupFailureIEs></protocolIEs></E2setupFailure></value></unsuccessfulOutcome></E2AP-PDU>"
-       E2SetupFailureResponseWithTransportCause = "<E2AP-PDU><unsuccessfulOutcome><procedureCode>1</procedureCode><criticality><reject/></criticality><value><E2setupFailure><protocolIEs><E2setupFailureIEs><id>1</id><criticality><ignore/></criticality><value><Cause><transport><transport-resource-unavailable/></transport></Cause></value></E2setupFailureIEs><E2setupFailureIEs><id>31</id><criticality><ignore/></criticality><value><TimeToWait><v60s/></TimeToWait></value></E2setupFailureIEs></protocolIEs></E2setupFailure></value></unsuccessfulOutcome></E2AP-PDU>"
-       E2SetupFailureResponseWithRicCause       = "<E2AP-PDU><unsuccessfulOutcome><procedureCode>1</procedureCode><criticality><reject/></criticality><value><E2setupFailure><protocolIEs><E2setupFailureIEs><id>1</id><criticality><ignore/></criticality><value><Cause><ricRequest><request-id-unknown/></ricRequest></Cause></value></E2setupFailureIEs><E2setupFailureIEs><id>31</id><criticality><ignore/></criticality><value><TimeToWait><v60s/></TimeToWait></value></E2setupFailureIEs></protocolIEs></E2setupFailure></value></unsuccessfulOutcome></E2AP-PDU>"
+       E2SetupFailureResponseWithMiscCause      = "<E2AP-PDU><unsuccessfulOutcome><procedureCode>1</procedureCode><criticality><reject/></criticality><value><E2setupFailure><protocolIEs><E2setupFailureIEs><id>49</id><criticality><ignore/></criticality><value><TransactionID>1</TransactionID></value></E2setupFailureIEs><E2setupFailureIEs><id>1</id><criticality><ignore/></criticality><value><Cause><misc><om-intervention/></misc></Cause></value></E2setupFailureIEs><E2setupFailureIEs><id>31</id><criticality><ignore/></criticality><value><TimeToWait><v60s/></TimeToWait></value></E2setupFailureIEs></protocolIEs></E2setupFailure></value></unsuccessfulOutcome></E2AP-PDU>"
+       E2SetupFailureResponseWithTransportCause = "<E2AP-PDU><unsuccessfulOutcome><procedureCode>1</procedureCode><criticality><reject/></criticality><value><E2setupFailure><protocolIEs><E2setupFailureIEs><id>49</id><criticality><ignore/></criticality><value><TransactionID>1</TransactionID></value></E2setupFailureIEs><E2setupFailureIEs><id>1</id><criticality><ignore/></criticality><value><Cause><transport><transport-resource-unavailable/></transport></Cause></value></E2setupFailureIEs><E2setupFailureIEs><id>31</id><criticality><ignore/></criticality><value><TimeToWait><v60s/></TimeToWait></value></E2setupFailureIEs></protocolIEs></E2setupFailure></value></unsuccessfulOutcome></E2AP-PDU>"
+       E2SetupFailureResponseWithRicCause       = "<E2AP-PDU><unsuccessfulOutcome><procedureCode>1</procedureCode><criticality><reject/></criticality><value><E2setupFailure><protocolIEs><E2setupFailureIEs><id>49</id><criticality><ignore/></criticality><value><TransactionID>1</TransactionID></value></E2setupFailureIEs><E2setupFailureIEs><id>1</id><criticality><ignore/></criticality><value><Cause><ricRequest><request-id-unknown/></ricRequest></Cause></value></E2setupFailureIEs><E2setupFailureIEs><id>31</id><criticality><ignore/></criticality><value><TimeToWait><v60s/></TimeToWait></value></E2setupFailureIEs></protocolIEs></E2setupFailure></value></unsuccessfulOutcome></E2AP-PDU>"
        StateChangeMessageChannel                = "RAN_CONNECTION_STATUS_CHANGE"
 )
 
@@ -468,6 +469,7 @@ func getExpectedGnbNodebForNewRan(payload []byte) *entities.NodebInfo {
                        Gnb: &entities.Gnb{
                                GnbType:      entities.GnbType_GNB,
                                RanFunctions: setupRequest.ExtractRanFunctionsList(),
+                               NodeConfigs:  setupRequest.ExtractE2NodeConfigList(),
                        },
                },
                GlobalNbId: &entities.GlobalNbId{
@@ -491,7 +493,8 @@ func getExpectedEnbNodebForNewRan(payload []byte) *entities.NodebInfo {
                NodeType:                     entities.Node_ENB,
                Configuration: &entities.NodebInfo_Enb{
                        Enb: &entities.Enb{
-                               EnbType: entities.EnbType_MACRO_ENB,
+                               EnbType:     entities.EnbType_MACRO_ENB,
+                               NodeConfigs: setupRequest.ExtractE2NodeConfigList(),
                        },
                },
                GlobalNbId: &entities.GlobalNbId{
@@ -515,13 +518,26 @@ func getExpectedNodebForExistingRan(nodeb *entities.NodebInfo, payload []byte) *
        nb := *nodeb
 
        if nodeb.NodeType == entities.Node_ENB {
+               if e2NodeConfig := setupRequest.ExtractE2NodeConfigList(); e2NodeConfig != nil {
+                       updatedEnb := *nodeb.GetEnb()
+                       updatedEnb.NodeConfigs = e2NodeConfig
+                       nb.Configuration = &entities.NodebInfo_Enb{Enb: &updatedEnb}
+               }
+
                return &nb
        }
 
        if ranFuncs := setupRequest.ExtractRanFunctionsList(); ranFuncs != nil {
                updatedGnb := *nodeb.GetGnb()
                updatedGnb.RanFunctions = ranFuncs
-               nb.Configuration =&entities.NodebInfo_Gnb{Gnb: &updatedGnb}
+               nb.Configuration = &entities.NodebInfo_Gnb{Gnb: &updatedGnb}
+       }
+
+       if e2NodeConfig := setupRequest.ExtractE2NodeConfigList(); e2NodeConfig != nil {
+               updatedGnb := *nodeb.GetGnb()
+               updatedGnb.RanFunctions = nb.GetGnb().RanFunctions
+               updatedGnb.NodeConfigs = e2NodeConfig
+               nb.Configuration = &entities.NodebInfo_Gnb{Gnb: &updatedGnb}
        }
 
        return &nb
@@ -687,6 +703,16 @@ func TestE2SetupRequestNotificationHandler_HandleExistingConnectedGnbRoutingMana
 
        gnb := nodebInfo.GetGnb()
        gnb.RanFunctions = []*entities.RanFunction{{RanFunctionId: 2, RanFunctionRevision: 2}}
+       gnb.NodeConfigs = []*entities.E2NodeComponentConfig{{
+               E2NodeComponentID: &entities.E2NodeComponentConfig_E2NodeComponentInterfaceTypeNG{
+                       E2NodeComponentInterfaceTypeNG: &entities.E2NodeComponentInterfaceNG{
+                               AmfName: "nginterf",
+                       },
+               },
+               E2NodeComponentInterfaceType: entities.E2NodeComponentInterfaceType_ng,
+               E2NodeComponentRequestPart:   []byte("72 65 73 70 61 72 74"),
+               E2NodeComponentResponsePart:  []byte("72 65 73 70 61 72 74"),
+       }}
 
        readerMock.On("GetNodeb", gnbNodebRanName).Return(nodebInfo, nil)
        routingManagerClientMock.On("AssociateRanToE2TInstance", e2tInstanceFullAddress, mock.Anything).Return(errors.New("association error"))
index 96a7bcf..435ad7c 100644 (file)
@@ -1,6 +1,7 @@
 //
 // Copyright 2019 AT&T Intellectual Property
 // Copyright 2019 Nokia
+// Copyright (c) 2022 Samsung Electronics Co., Ltd. All Rights Reserved.
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -104,8 +105,10 @@ type E2SetupRequest struct {
                        } `xml:"criticality"`
                        Value struct {
                                Text             string           `xml:",chardata"`
+                               TransactionID    string           `xml:"TransactionID"`
                                GlobalE2nodeID   GlobalE2NodeId   `xml:"GlobalE2node-ID"`
                                RANfunctionsList RANfunctionsList `xml:"RANfunctions-List"`
+                               E2NodeConfigList E2NodeConfigList `xml:"E2nodeComponentConfigAddition-List"`
                        } `xml:"value"`
                } `xml:"E2setupRequestIEs"`
        } `xml:"protocolIEs"`
@@ -155,14 +158,157 @@ type RANfunctionsList struct {
        } `xml:"ProtocolIE-SingleContainer"`
 }
 
+type E2NodeConfigList struct {
+       Text                      string `xml:",chardata"`
+       ProtocolIESingleContainer []struct {
+               Text        string `xml:",chardata"`
+               ID          string `xml:"id"`
+               Criticality struct {
+                       Text   string `xml:",chardata"`
+                       Reject string `xml:"reject"`
+               } `xml:"criticality"`
+               Value struct {
+                       Text                     string                   `xml:",chardata"`
+                       E2nodeConfigAdditionItem E2NodeConfigAdditionItem `xml:"E2nodeComponentConfigAddition-Item"`
+               } `xml:"value"`
+       } `xml:"ProtocolIE-SingleContainer"`
+}
+
+type E2NodeComponentType struct {
+       Text string    `xml:",chardata"`
+       NG   *struct{} `xml:"ng"`
+       XN   *struct{} `xml:"xn"`
+       E1   *struct{} `xml:"e1"`
+       F1   *struct{} `xml:"f1"`
+       W1   *struct{} `xml:"w1"`
+       S1   *struct{} `xml:"s1"`
+       X2   *struct{} `xml:"x2"`
+}
+
+type E2NodeConfigAdditionItem struct {
+       Text                string              `xml:",chardata"`
+       E2nodeComponentType E2NodeComponentType `xml:"e2nodeComponentInterfaceType"`
+       E2nodeComponentID   E2NodeComponentId   `xml:"e2nodeComponentID"`
+       E2nodeConfiguration E2NodeConfigValue   `xml:"e2nodeComponentConfiguration"`
+}
+
+type E2NodeConfigValue struct {
+       Text               string `xml:",chardata"`
+       E2NodeRequestPart  []byte `xml:"e2nodeComponentRequestPart"`
+       E2NodeResponsePart []byte `xml:"e2nodeComponentResponsePart"`
+}
+
+type E2NodeComponentId struct {
+       Text           string `xml:",chardata"`
+       E2NodeIFTypeNG E2NodeIFTypeNG
+       E2NodeIFTypeXN E2NodeIFTypeXN
+       E2NodeIFTypeE1 E2NodeIFTypeE1
+       E2NodeIFTypeF1 E2NodeIFTypeF1
+       E2NodeIFTypeW1 E2NodeIFTypeW1
+       E2NodeIFTypeS1 E2NodeIFTypeS1
+       E2NodeIFTypeX2 E2NodeIFTypeX2
+}
+
+type E2NodeIFTypeNG struct {
+       XMLName xml.Name `xml:"e2nodeComponentInterfaceTypeNG"`
+       Text    string   `xml:",chardata"`
+       AMFName string   `xml:"amf-name"`
+}
+
+type E2NodeIFTypeXN struct {
+       XMLName       xml.Name `xml:"e2nodeComponentInterfaceTypeXn"`
+       Text          string   `xml:",chardata"`
+       GlobalNgENBID struct {
+               Text string `xml:",chardata"`
+               GNB  struct {
+                       Text   string `xml:",chardata"`
+                       PLMNID string `xml:"plmn-id"`
+                       GnbID  struct {
+                               Text  string `xml:",chardata"`
+                               GnbID string `xml:"gnb-ID"`
+                       } `xml:"gnb-id"`
+               } `xml:"gNB"`
+               NGENB struct {
+                       Text   string `xml:",chardata"`
+                       PLMNID string `xml:"plmn-id"`
+                       GnbID  struct {
+                               Text            string `xml:",chardata"`
+                               ENBIDMacro      string `xml:"enb-ID-macro"`
+                               ENBIDShortMacro string `xml:"enb-ID-shortmacro"`
+                               ENBIDLongMacro  string `xml:"enb-ID-longmacro"`
+                       } `xml:"gnb-id"`
+               } `xml:"ng-eNB"`
+       } `xml:"global-NG-RAN-Node-ID"`
+}
+
+type E2NodeIFTypeE1 struct {
+       XMLName   xml.Name `xml:"e2nodeComponentInterfaceTypeE1"`
+       Text      string   `xml:",chardata"`
+       GNBCUCPID int64    `xml:"gNB-CU-CP-ID"`
+}
+
+type E2NodeIFTypeF1 struct {
+       XMLName xml.Name `xml:"e2nodeComponentInterfaceTypeF1"`
+       Text    string   `xml:",chardata"`
+       GNBDUID int64    `xml:"gNB-DU-ID"`
+}
+
+type E2NodeIFTypeW1 struct {
+       XMLName   xml.Name `xml:"e2nodeComponentInterfaceTypeW1"`
+       Text      string   `xml:",chardata"`
+       NGENBDUID int64    `xml:"ng-eNB-DU-ID"`
+}
+
+type E2NodeIFTypeS1 struct {
+       XMLName xml.Name `xml:"e2nodeComponentInterfaceTypeS1"`
+       Text    string   `xml:",chardata"`
+       MMENAME string   `xml:"mme-name"`
+}
+
+type E2NodeIFTypeX2 struct {
+       XMLName     xml.Name `xml:"e2nodeComponentInterfaceTypeX2"`
+       Text        string   `xml:",chardata"`
+       GlobalENBID struct {
+               Text         string `xml:",chardata"`
+               PLMNIdentity string `xml:"pLMN-Identity"`
+               ENBID        struct {
+                       Text            string `xml:",chardata"`
+                       MacroENBID      string `xml:"macro-eNB-ID"`
+                       HomeENBID       string `xml:"home-eNB-ID"`
+                       ShortMacroENBID string `xml:"short-Macro-eNB-ID"`
+                       LongMacroENBID  string `xml:"long-Macro-eNB-ID"`
+               } `xml:"eNB-ID"`
+       } `xml:"global-eNB-ID"`
+       GlobalEnGNBID struct {
+               Text         string `xml:",chardata"`
+               PLMNIdentity string `xml:"pLMN-Identity"`
+               GNBID        struct {
+                       Text  string `xml:",chardata"`
+                       GNBID string `xml:"gNB-ID"`
+               } `xml:"gNB-ID"`
+       } `xml:"global-en-gNB-ID"`
+}
+
 func (m *E2SetupRequestMessage) ExtractRanFunctionsList() []*entities.RanFunction {
        // TODO: verify e2SetupRequestIEs structure with Adi
        e2SetupRequestIes := m.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs
-       if len(e2SetupRequestIes) < 2 {
+
+       var ranFuntionsList RANfunctionsList
+       var isPopulated bool
+
+       for _, v := range e2SetupRequestIes {
+               if v.ID == RanFunctionsAddedID {
+                       ranFuntionsList = v.Value.RANfunctionsList
+                       isPopulated = true
+                       break
+               }
+       }
+
+       if !isPopulated {
                return nil
        }
 
-       ranFunctionsListContainer := e2SetupRequestIes[1].Value.RANfunctionsList.ProtocolIESingleContainer
+       ranFunctionsListContainer := ranFuntionsList.ProtocolIESingleContainer
        funcs := make([]*entities.RanFunction, len(ranFunctionsListContainer))
        for i := 0; i < len(funcs); i++ {
                ranFunctionItem := ranFunctionsListContainer[i].Value.RANfunctionItem
@@ -177,8 +323,143 @@ func (m *E2SetupRequestMessage) ExtractRanFunctionsList() []*entities.RanFunctio
        return funcs
 }
 
+func (m *E2SetupRequestMessage) ExtractE2NodeConfigList() []*entities.E2NodeComponentConfig {
+       e2SetupRequestIes := m.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs
+       numOfIes := len(e2SetupRequestIes)
+       var e2NodeConfigListContainer E2NodeConfigList
+       var isPopulated bool
+
+       for ieCount := 0; ieCount < numOfIes; ieCount++ {
+
+               if e2SetupRequestIes[ieCount].ID == E2nodeConfigAdditionID {
+                       e2NodeConfigListContainer = e2SetupRequestIes[ieCount].Value.E2NodeConfigList
+                       isPopulated = true
+                       break
+               }
+       }
+
+       if !isPopulated {
+               return nil
+       }
+
+       e2nodeComponentConfigs := make([]*entities.E2NodeComponentConfig, len(e2NodeConfigListContainer.ProtocolIESingleContainer))
+       for i := 0; i < len(e2nodeComponentConfigs); i++ {
+               e2NodeConfigItem := e2NodeConfigListContainer.ProtocolIESingleContainer[i].Value.E2nodeConfigAdditionItem
+
+               if e2NodeConfigItem.E2nodeComponentType.NG != nil {
+                       e2nodeComponentConfigs[i] = &entities.E2NodeComponentConfig{
+                               E2NodeComponentInterfaceType: entities.E2NodeComponentInterfaceType_ng,
+                               E2NodeComponentRequestPart:   e2NodeConfigItem.E2nodeConfiguration.E2NodeRequestPart,
+                               E2NodeComponentResponsePart:  e2NodeConfigItem.E2nodeConfiguration.E2NodeResponsePart,
+                               E2NodeComponentID: &entities.E2NodeComponentConfig_E2NodeComponentInterfaceTypeNG{
+                                       E2NodeComponentInterfaceTypeNG: &entities.E2NodeComponentInterfaceNG{
+                                               AmfName: e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeNG.AMFName,
+                                       },
+                               },
+                       }
+               } else if e2NodeConfigItem.E2nodeComponentType.E1 != nil {
+                       e2nodeComponentConfigs[i] = &entities.E2NodeComponentConfig{
+                               E2NodeComponentInterfaceType: entities.E2NodeComponentInterfaceType_e1,
+                               E2NodeComponentRequestPart:   e2NodeConfigItem.E2nodeConfiguration.E2NodeRequestPart,
+                               E2NodeComponentResponsePart:  e2NodeConfigItem.E2nodeConfiguration.E2NodeResponsePart,
+                               E2NodeComponentID: &entities.E2NodeComponentConfig_E2NodeComponentInterfaceTypeE1{
+                                       E2NodeComponentInterfaceTypeE1: &entities.E2NodeComponentInterfaceE1{
+                                               GNBCuCpId: e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeE1.GNBCUCPID,
+                                       },
+                               },
+                       }
+               } else if e2NodeConfigItem.E2nodeComponentType.F1 != nil {
+                       e2nodeComponentConfigs[i] = &entities.E2NodeComponentConfig{
+                               E2NodeComponentInterfaceType: entities.E2NodeComponentInterfaceType_f1,
+                               E2NodeComponentRequestPart:   e2NodeConfigItem.E2nodeConfiguration.E2NodeRequestPart,
+                               E2NodeComponentResponsePart:  e2NodeConfigItem.E2nodeConfiguration.E2NodeResponsePart,
+                               E2NodeComponentID: &entities.E2NodeComponentConfig_E2NodeComponentInterfaceTypeF1{
+                                       E2NodeComponentInterfaceTypeF1: &entities.E2NodeComponentInterfaceF1{
+                                               GNBDuId: e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeF1.GNBDUID,
+                                       },
+                               },
+                       }
+               } else if e2NodeConfigItem.E2nodeComponentType.W1 != nil {
+                       e2nodeComponentConfigs[i] = &entities.E2NodeComponentConfig{
+                               E2NodeComponentInterfaceType: entities.E2NodeComponentInterfaceType_w1,
+                               E2NodeComponentRequestPart:   e2NodeConfigItem.E2nodeConfiguration.E2NodeRequestPart,
+                               E2NodeComponentResponsePart:  e2NodeConfigItem.E2nodeConfiguration.E2NodeResponsePart,
+                               E2NodeComponentID: &entities.E2NodeComponentConfig_E2NodeComponentInterfaceTypeW1{
+                                       E2NodeComponentInterfaceTypeW1: &entities.E2NodeComponentInterfaceW1{
+                                               NgenbDuId: e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeW1.NGENBDUID,
+                                       },
+                               },
+                       }
+               } else if e2NodeConfigItem.E2nodeComponentType.S1 != nil {
+                       e2nodeComponentConfigs[i] = &entities.E2NodeComponentConfig{
+                               E2NodeComponentInterfaceType: entities.E2NodeComponentInterfaceType_s1,
+                               E2NodeComponentRequestPart:   e2NodeConfigItem.E2nodeConfiguration.E2NodeRequestPart,
+                               E2NodeComponentResponsePart:  e2NodeConfigItem.E2nodeConfiguration.E2NodeResponsePart,
+                               E2NodeComponentID: &entities.E2NodeComponentConfig_E2NodeComponentInterfaceTypeS1{
+                                       E2NodeComponentInterfaceTypeS1: &entities.E2NodeComponentInterfaceS1{
+                                               MmeName: e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeS1.MMENAME,
+                                       },
+                               },
+                       }
+               }
+               /*else if e2NodeConfigItem.E2nodeComponentType.XN != nil {
+                       funcs[i] = &entities.E2NodeComponentConfig{
+                               E2NodeComponentInterfaceType: entities.E2NodeComponentInterfaceType_xn,
+                               E2NodeComponentRequestPart: e2NodeConfigItem.E2nodeConfiguration.E2NodeRequestPart,
+                               E2NodeComponentResponsePart:  e2NodeConfigItem.E2nodeConfiguration.E2NodeResponsePart,
+                               E2NodeComponentID:              &entities.E2NodeComponentConfig_E2NodeComponentInterfaceTypeNG{
+                                       E2NodeComponentInterfaceTypeXn: &entities.E2NodeComponentInterfaceXn{
+                                               GlobalNgRanNodeId: &entities.E2NodeComponentInterfaceXn_GlobalNgenbId{
+                                                       GlobalNgenbId:&entities.GlobalNGENBID{
+                                                               PlmnIdentity: e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeXN.GlobalNgENBID.NGENB.PLMNID,
+                                                               EnbId: e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeXN.GlobalNgENBID.GNB.GnbID.GnbID,
+                                                       },
+                                               },
+                                               GlobalNgRanNodeId: &entities.E2NodeComponentInterfaceXn_GlobalGnbId{
+                                                       GlobalGnbId:&entities.GlobalGNBID{
+                                                               PlmnIdentity: e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeXN.GlobalNgENBID.NGENB.PLMNID,
+                                                               EnbId: e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeXN.GlobalNgENBID.GNB.GnbID.GnbID,
+                                                       },
+                                               },
+                                       },
+                               },
+                       }
+                       ifXn.GlobalNgENBID.NGENB.PLMNID = e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeXN.GlobalNgENBID.NGENB.PLMNID
+                       ifXn.GlobalNgENBID.NGENB.GnbID.ENBIDMacro = e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeXN.GlobalNgENBID.NGENB.GnbID.ENBIDMacro
+                       ifXn.GlobalNgENBID.NGENB.GnbID.ENBIDShortMacro = e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeXN.GlobalNgENBID.NGENB.GnbID.ENBIDShortMacro
+                       ifXn.GlobalNgENBID.NGENB.GnbID.ENBIDLongMacro = e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeXN.GlobalNgENBID.NGENB.GnbID.ENBIDLongMacro
+
+               }*/
+               /*else if e2NodeConfigItem.E2nodeComponentType.X2 != nil {
+                       ifX2 := E2NodeIFTypeX2 {}
+                       ifX2.GlobalENBID.PLMNIdentity = e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalENBID.PLMNIdentity
+                       ifX2.GlobalENBID.ENBID.MacroENBID = e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalENBID.ENBID.MacroENBID
+                       ifX2.GlobalENBID.ENBID.HomeENBID = e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalENBID.ENBID.HomeENBID
+                       ifX2.GlobalENBID.ENBID.ShortMacroENBID = e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalENBID.ENBID.ShortMacroENBID
+                       ifX2.GlobalENBID.ENBID.LongMacroENBID = e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalENBID.ENBID.LongMacroENBID
+
+                       ifX2.GlobalEnGNBID.PLMNIdentity = e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalEnGNBID.PLMNIdentity
+                       ifX2.GlobalEnGNBID.GNBID.GNBID = e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalEnGNBID.GNBID.GNBID
+               }*/
+       }
+       return e2nodeComponentConfigs
+}
+
 func (m *E2SetupRequestMessage) getGlobalE2NodeId() GlobalE2NodeId {
-       return m.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs[0].Value.GlobalE2nodeID
+
+       // TODO: Handle error case if GlobalE2NodeId not available
+       e2SetupRequestIes := m.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs
+       numOfIes := len(e2SetupRequestIes)
+       index := 1
+
+       for ieCount := 0; ieCount < numOfIes; ieCount++ {
+               if e2SetupRequestIes[ieCount].ID == GlobalE2nodeID {
+                       index = ieCount
+                       break
+               }
+       }
+
+       return m.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs[index].Value.GlobalE2nodeID
 }
 
 func (m *E2SetupRequestMessage) GetPlmnId() string {
index a609eed..b50d0d7 100644 (file)
@@ -23,8 +23,9 @@ import (
        "e2mgr/models"
        "e2mgr/utils"
        "encoding/xml"
-       "github.com/stretchr/testify/assert"
        "testing"
+
+       "github.com/stretchr/testify/assert"
 )
 
 const (
@@ -73,6 +74,17 @@ func TestExtractRanFunctionsListFromGnbRequestwithOidSuccess(t *testing.T) {
        assert.Equal(t, "OID125", ranFuncList[2].RanFunctionOid)
 }
 
+func TestExtractE2nodeConfigSuccess(t *testing.T) {
+       setupRequest := getTestE2SetupRequest(t, e2SetupReqGnbSetupRequestWithOIDXmlPath)
+       e2nodeConfigs := setupRequest.ExtractE2NodeConfigList()
+
+       assert.Equal(t, 2, len(e2nodeConfigs))
+
+       assert.Equal(t, "nginterf1", e2nodeConfigs[0].GetE2NodeComponentInterfaceTypeNG().GetAmfName())
+       assert.Equal(t, "nginterf2", e2nodeConfigs[1].GetE2NodeComponentInterfaceTypeNG().GetAmfName())
+
+}
+
 func TestGetPlmnIdFromGnbRequestSuccess(t *testing.T) {
        setupRequest := getTestE2SetupRequest(t, e2SetupReqGnbSetupRequestXmlPath)
 
index 04d63a1..1b62b01 100644 (file)
@@ -1,6 +1,7 @@
 //
 // Copyright 2019 AT&T Intellectual Property
 // Copyright 2019 Nokia
+// Copyright (c) 2022 Samsung Electronics Co., Ltd. All Rights Reserved.
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -23,6 +24,21 @@ import (
        "encoding/xml"
 )
 
+const (
+       CauseID                       = "1"
+       GlobalE2nodeID                = "3"
+       GlobalRicID                   = "4"
+       RanFunctionIDItemID           = "6"
+       RanFunctionsAcceptedID        = "9"
+       RanFunctionsAddedID           = "10"
+       TimeToWaitID                  = "31"
+       TransactionID                 = "49"
+       E2nodeConfigAdditionID        = "50"
+       E2nodeConfigAdditionItemID    = "51"
+       E2nodeConfigAdditionAckID     = "52"
+       E2nodeConfigAdditionAckItemID = "53"
+)
+
 type TimeToWait = int
 
 var TimeToWaitEnum = struct {
@@ -67,41 +83,87 @@ var timeToWaitMap = map[TimeToWait]interface{}{
        }{},
 }
 
+type ConfigStatus = int
+
+var ConfigStatusEnum = struct {
+       Success ConfigStatus
+       Failure ConfigStatus
+}{0, 1}
+
+var configStatusMap = map[ConfigStatus]interface{}{
+       ConfigStatusEnum.Success: struct {
+               XMLName xml.Name `xml:"updateOutcome"`
+               Text    string   `xml:",chardata"`
+               Success string   `xml:"success"`
+       }{},
+       ConfigStatusEnum.Failure: struct {
+               XMLName xml.Name `xml:"updateOutcome"`
+               Text    string   `xml:",chardata"`
+               Failure string   `xml:"failure"`
+       }{},
+}
+
 func NewE2SetupSuccessResponseMessage(plmnId string, ricId string, request *E2SetupRequestMessage) E2SetupResponseMessage {
        outcome := SuccessfulOutcome{}
        outcome.ProcedureCode = "1"
 
        e2SetupRequestIes := request.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs
+       numOfIes := len(e2SetupRequestIes)
 
-       outcome.Value.E2setupResponse.ProtocolIEs.E2setupResponseIEs = make([]E2setupResponseIEs, len(e2SetupRequestIes))
-       outcome.Value.E2setupResponse.ProtocolIEs.E2setupResponseIEs[0].ID = "4"
-       outcome.Value.E2setupResponse.ProtocolIEs.E2setupResponseIEs[0].Value = GlobalRICID{GlobalRICID: struct {
-               Text         string `xml:",chardata"`
-               PLMNIdentity string `xml:"pLMN-Identity"`
-               RicID        string `xml:"ric-ID"`
-       }{PLMNIdentity: plmnId, RicID: ricId}}
+       outcome.Value.E2setupResponse.ProtocolIEs.E2setupResponseIEs = make([]E2setupResponseIEs, numOfIes)
+
+       for ieCount := 0; ieCount < numOfIes; ieCount++ {
+               switch e2SetupRequestIes[ieCount].ID {
+               case TransactionID:
+                       outcome.Value.E2setupResponse.ProtocolIEs.E2setupResponseIEs[ieCount].ID = TransactionID
+                       outcome.Value.E2setupResponse.ProtocolIEs.E2setupResponseIEs[ieCount].Value = TransID{
+                               TransactionID: request.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs[ieCount].Value.TransactionID,
+                       }
+
+               case GlobalE2nodeID:
+                       outcome.Value.E2setupResponse.ProtocolIEs.E2setupResponseIEs[ieCount].ID = GlobalRicID
+                       outcome.Value.E2setupResponse.ProtocolIEs.E2setupResponseIEs[ieCount].Value = GlobalRICID{GlobalRICID: struct {
+                               Text         string `xml:",chardata"`
+                               PLMNIdentity string `xml:"pLMN-Identity"`
+                               RicID        string `xml:"ric-ID"`
+                       }{PLMNIdentity: plmnId, RicID: ricId}}
+
+               case RanFunctionsAddedID:
+                       outcome.Value.E2setupResponse.ProtocolIEs.E2setupResponseIEs[ieCount].ID = RanFunctionsAcceptedID
+                       outcome.Value.E2setupResponse.ProtocolIEs.E2setupResponseIEs[ieCount].Value = RANfunctionsIDList{RANfunctionsIDList: struct {
+                               Text                      string                      `xml:",chardata"`
+                               ProtocolIESingleContainer []ProtocolIESingleContainer `xml:"ProtocolIE-SingleContainer"`
+                       }{ProtocolIESingleContainer: extractRanFunctionsIDList(request, ieCount)}}
 
-       if len(e2SetupRequestIes) < 2 {
-               return E2SetupResponseMessage{E2APPDU: E2APPDU{Outcome: outcome}}
+               case E2nodeConfigAdditionID:
+                       outcome.Value.E2setupResponse.ProtocolIEs.E2setupResponseIEs[ieCount].ID = E2nodeConfigAdditionAckID
+                       outcome.Value.E2setupResponse.ProtocolIEs.E2setupResponseIEs[ieCount].Value = E2NodeConfigUpdateAckList{E2NodeConfigUpdateAckList: struct {
+                               Text                        string                        `xml:",chardata"`
+                               E2NodeConfigSingleContainer []E2NodeConfigSingleContainer `xml:"ProtocolIE-SingleContainer"`
+                       }{E2NodeConfigSingleContainer: extractE2NodeConfigUpdateList(request, ieCount, 0)}}
+               }
        }
 
-       outcome.Value.E2setupResponse.ProtocolIEs.E2setupResponseIEs[1].ID = "9"
-       outcome.Value.E2setupResponse.ProtocolIEs.E2setupResponseIEs[1].Value = RANfunctionsIDList{RANfunctionsIDList: struct {
-               Text                      string                      `xml:",chardata"`
-               ProtocolIESingleContainer []ProtocolIESingleContainer `xml:"ProtocolIE-SingleContainer"`
-       }{ProtocolIESingleContainer: extractRanFunctionsIDList(request)}}
        return E2SetupResponseMessage{E2APPDU: E2APPDU{Outcome: outcome}}
 }
 
-func NewE2SetupFailureResponseMessage(timeToWait TimeToWait, cause Cause) E2SetupResponseMessage {
+func NewE2SetupFailureResponseMessage(timeToWait TimeToWait, cause Cause, request *E2SetupRequestMessage) E2SetupResponseMessage {
        outcome := UnsuccessfulOutcome{}
-       outcome.Value.E2setupFailure.ProtocolIEs.E2setupFailureIEs = make([]E2setupFailureIEs, 2)
+
+       outcome.Value.E2setupFailure.ProtocolIEs.E2setupFailureIEs = make([]E2setupFailureIEs, 3)
        outcome.ProcedureCode = "1"
-       outcome.Value.E2setupFailure.ProtocolIEs.E2setupFailureIEs[0].ID = "1"
 
-       outcome.Value.E2setupFailure.ProtocolIEs.E2setupFailureIEs[0].Value.Value = cause
-       outcome.Value.E2setupFailure.ProtocolIEs.E2setupFailureIEs[1].ID = "31"
-       outcome.Value.E2setupFailure.ProtocolIEs.E2setupFailureIEs[1].Value.Value = timeToWaitMap[timeToWait]
+       outcome.Value.E2setupFailure.ProtocolIEs.E2setupFailureIEs[0].ID = TransactionID
+       outcome.Value.E2setupFailure.ProtocolIEs.E2setupFailureIEs[0].Value.Value = TransFailID{
+               ID: request.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs[0].Value.TransactionID,
+       }
+
+       outcome.Value.E2setupFailure.ProtocolIEs.E2setupFailureIEs[1].ID = CauseID
+       outcome.Value.E2setupFailure.ProtocolIEs.E2setupFailureIEs[1].Value.Value = cause
+
+       outcome.Value.E2setupFailure.ProtocolIEs.E2setupFailureIEs[2].ID = TimeToWaitID
+       outcome.Value.E2setupFailure.ProtocolIEs.E2setupFailureIEs[2].Value.Value = timeToWaitMap[timeToWait]
+
        return E2SetupResponseMessage{E2APPDU: E2APPDU{Outcome: outcome}}
 }
 
@@ -181,6 +243,52 @@ type ProtocolIESingleContainer struct {
        } `xml:"value"`
 }
 
+type TransID struct {
+       Text          string `xml:",chardata"`
+       TransactionID string `xml:"TransactionID"`
+}
+
+type TransFailID struct {
+       XMLName xml.Name `xml:"TransactionID"`
+       ID      string   `xml:",chardata"`
+}
+
+type E2NodeConfigUpdateAckList struct {
+       Text                      string `xml:",chardata"`
+       E2NodeConfigUpdateAckList struct {
+               Text                        string                        `xml:",chardata"`
+               E2NodeConfigSingleContainer []E2NodeConfigSingleContainer `xml:"ProtocolIE-SingleContainer"`
+       } `xml:"E2nodeComponentConfigAdditionAck-List"`
+}
+
+type E2NodeConfigSingleContainer struct {
+       Text        string `xml:",chardata"`
+       ID          string `xml:"id"`
+       Criticality struct {
+               Text   string `xml:",chardata"`
+               Reject string `xml:"reject"`
+       } `xml:"criticality"`
+       Value struct {
+               Text                      string `xml:",chardata"`
+               E2NodeConfigUpdateAckItem struct {
+                       Text                  string              `xml:",chardata"`
+                       E2nodeComponentType   E2NodeComponentType `xml:"e2nodeComponentInterfaceType"`
+                       E2nodeComponentID     E2NodeComponentIDResp
+                       E2nodeConfigUpdateAck E2nodeConfigUpdateAckResp
+               } `xml:"E2nodeComponentConfigAdditionAck-Item"`
+       } `xml:"value"`
+}
+
+type E2NodeComponentIDResp struct {
+       XMLName xml.Name `xml:"e2nodeComponentID"`
+       Value   interface{}
+}
+
+type E2nodeConfigUpdateAckResp struct {
+       XMLName xml.Name `xml:"e2nodeComponentConfigurationAck"`
+       Value   interface{}
+}
+
 type UnsuccessfulOutcome struct {
        XMLName       xml.Name `xml:"unsuccessfulOutcome"`
        Text          string   `xml:",chardata"`
@@ -214,8 +322,8 @@ type E2setupFailureIEs struct {
        } `xml:"value"`
 }
 
-func extractRanFunctionsIDList(request *E2SetupRequestMessage) []ProtocolIESingleContainer {
-       list := &request.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs[1].Value.RANfunctionsList
+func extractRanFunctionsIDList(request *E2SetupRequestMessage, index int) []ProtocolIESingleContainer {
+       list := &request.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs[index].Value.RANfunctionsList
        ids := make([]ProtocolIESingleContainer, len(list.ProtocolIESingleContainer))
        for i := 0; i < len(ids); i++ {
                ids[i] = convertToRANfunctionID(list, i)
@@ -225,8 +333,74 @@ func extractRanFunctionsIDList(request *E2SetupRequestMessage) []ProtocolIESingl
 
 func convertToRANfunctionID(list *RANfunctionsList, i int) ProtocolIESingleContainer {
        id := ProtocolIESingleContainer{}
-       id.ID = "6"
+
+       id.ID = RanFunctionIDItemID
        id.Value.RANfunctionIDItem.RanFunctionID = list.ProtocolIESingleContainer[i].Value.RANfunctionItem.RanFunctionID
        id.Value.RANfunctionIDItem.RanFunctionRevision = list.ProtocolIESingleContainer[i].Value.RANfunctionItem.RanFunctionRevision
+
+       return id
+}
+
+func extractE2NodeConfigUpdateList(request *E2SetupRequestMessage, index int, outcome int) []E2NodeConfigSingleContainer {
+       list := &request.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs[index].Value.E2NodeConfigList
+       ids := make([]E2NodeConfigSingleContainer, len(list.ProtocolIESingleContainer))
+       for i := 0; i < len(ids); i++ {
+               ids[i] = convertToE2NodeConfig(list, i, outcome)
+       }
+       return ids
+}
+
+func convertToE2NodeConfig(list *E2NodeConfigList, i int, outcome int) E2NodeConfigSingleContainer {
+       id := E2NodeConfigSingleContainer{}
+       id.ID = E2nodeConfigAdditionAckItemID
+
+       id.Value.E2NodeConfigUpdateAckItem.E2nodeConfigUpdateAck.Value = configStatusMap[outcome]
+
+       id.Value.E2NodeConfigUpdateAckItem.E2nodeComponentType = list.ProtocolIESingleContainer[i].Value.E2nodeConfigAdditionItem.E2nodeComponentType
+
+       if list.ProtocolIESingleContainer[i].Value.E2nodeConfigAdditionItem.E2nodeComponentType.NG != nil {
+               id.Value.E2NodeConfigUpdateAckItem.E2nodeComponentID.Value = E2NodeIFTypeNG{
+                       AMFName: list.ProtocolIESingleContainer[i].Value.E2nodeConfigAdditionItem.E2nodeComponentID.E2NodeIFTypeNG.AMFName,
+               }
+       } else if list.ProtocolIESingleContainer[i].Value.E2nodeConfigAdditionItem.E2nodeComponentType.XN != nil {
+               ifXn := E2NodeIFTypeXN{}
+               ifXn.GlobalNgENBID.GNB.PLMNID = list.ProtocolIESingleContainer[i].Value.E2nodeConfigAdditionItem.E2nodeComponentID.E2NodeIFTypeXN.GlobalNgENBID.GNB.PLMNID
+               ifXn.GlobalNgENBID.GNB.GnbID.GnbID = list.ProtocolIESingleContainer[i].Value.E2nodeConfigAdditionItem.E2nodeComponentID.E2NodeIFTypeXN.GlobalNgENBID.GNB.GnbID.GnbID
+               ifXn.GlobalNgENBID.NGENB.PLMNID = list.ProtocolIESingleContainer[i].Value.E2nodeConfigAdditionItem.E2nodeComponentID.E2NodeIFTypeXN.GlobalNgENBID.NGENB.PLMNID
+               ifXn.GlobalNgENBID.NGENB.GnbID.ENBIDMacro = list.ProtocolIESingleContainer[i].Value.E2nodeConfigAdditionItem.E2nodeComponentID.E2NodeIFTypeXN.GlobalNgENBID.NGENB.GnbID.ENBIDMacro
+               ifXn.GlobalNgENBID.NGENB.GnbID.ENBIDShortMacro = list.ProtocolIESingleContainer[i].Value.E2nodeConfigAdditionItem.E2nodeComponentID.E2NodeIFTypeXN.GlobalNgENBID.NGENB.GnbID.ENBIDShortMacro
+               ifXn.GlobalNgENBID.NGENB.GnbID.ENBIDLongMacro = list.ProtocolIESingleContainer[i].Value.E2nodeConfigAdditionItem.E2nodeComponentID.E2NodeIFTypeXN.GlobalNgENBID.NGENB.GnbID.ENBIDLongMacro
+
+               id.Value.E2NodeConfigUpdateAckItem.E2nodeComponentID.Value = ifXn
+       } else if list.ProtocolIESingleContainer[i].Value.E2nodeConfigAdditionItem.E2nodeComponentType.E1 != nil {
+               id.Value.E2NodeConfigUpdateAckItem.E2nodeComponentID.Value = E2NodeIFTypeE1{
+                       GNBCUCPID: list.ProtocolIESingleContainer[i].Value.E2nodeConfigAdditionItem.E2nodeComponentID.E2NodeIFTypeE1.GNBCUCPID,
+               }
+       } else if list.ProtocolIESingleContainer[i].Value.E2nodeConfigAdditionItem.E2nodeComponentType.F1 != nil {
+               id.Value.E2NodeConfigUpdateAckItem.E2nodeComponentID.Value = E2NodeIFTypeF1{
+                       GNBDUID: list.ProtocolIESingleContainer[i].Value.E2nodeConfigAdditionItem.E2nodeComponentID.E2NodeIFTypeF1.GNBDUID,
+               }
+       } else if list.ProtocolIESingleContainer[i].Value.E2nodeConfigAdditionItem.E2nodeComponentType.W1 != nil {
+               id.Value.E2NodeConfigUpdateAckItem.E2nodeComponentID.Value = E2NodeIFTypeW1{
+                       NGENBDUID: list.ProtocolIESingleContainer[i].Value.E2nodeConfigAdditionItem.E2nodeComponentID.E2NodeIFTypeW1.NGENBDUID,
+               }
+       } else if list.ProtocolIESingleContainer[i].Value.E2nodeConfigAdditionItem.E2nodeComponentType.S1 != nil {
+               id.Value.E2NodeConfigUpdateAckItem.E2nodeComponentID.Value = E2NodeIFTypeS1{
+                       MMENAME: list.ProtocolIESingleContainer[i].Value.E2nodeConfigAdditionItem.E2nodeComponentID.E2NodeIFTypeS1.MMENAME,
+               }
+       } else if list.ProtocolIESingleContainer[i].Value.E2nodeConfigAdditionItem.E2nodeComponentType.X2 != nil {
+               ifX2 := E2NodeIFTypeX2{}
+               ifX2.GlobalENBID.PLMNIdentity = list.ProtocolIESingleContainer[i].Value.E2nodeConfigAdditionItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalENBID.PLMNIdentity
+               ifX2.GlobalENBID.ENBID.MacroENBID = list.ProtocolIESingleContainer[i].Value.E2nodeConfigAdditionItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalENBID.ENBID.MacroENBID
+               ifX2.GlobalENBID.ENBID.HomeENBID = list.ProtocolIESingleContainer[i].Value.E2nodeConfigAdditionItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalENBID.ENBID.HomeENBID
+               ifX2.GlobalENBID.ENBID.ShortMacroENBID = list.ProtocolIESingleContainer[i].Value.E2nodeConfigAdditionItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalENBID.ENBID.ShortMacroENBID
+               ifX2.GlobalENBID.ENBID.LongMacroENBID = list.ProtocolIESingleContainer[i].Value.E2nodeConfigAdditionItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalENBID.ENBID.LongMacroENBID
+
+               ifX2.GlobalEnGNBID.PLMNIdentity = list.ProtocolIESingleContainer[i].Value.E2nodeConfigAdditionItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalEnGNBID.PLMNIdentity
+               ifX2.GlobalEnGNBID.GNBID.GNBID = list.ProtocolIESingleContainer[i].Value.E2nodeConfigAdditionItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalEnGNBID.GNBID.GNBID
+
+               id.Value.E2NodeConfigUpdateAckItem.E2nodeComponentID.Value = ifX2
+       }
+
        return id
 }
index 2e2d7ba..744a8c9 100644 (file)
@@ -1,6 +1,7 @@
 //
 // Copyright 2020 AT&T Intellectual Property
 // Copyright 2020 Nokia
+// Copyright (c) 2022 Samsung Electronics Co., Ltd. All Rights Reserved.
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -23,8 +24,9 @@ import (
        "e2mgr/models"
        "e2mgr/utils"
        "encoding/xml"
-       "github.com/stretchr/testify/assert"
        "testing"
+
+       "github.com/stretchr/testify/assert"
 )
 
 const (
@@ -47,10 +49,10 @@ func TestNewE2SetupSuccessResponseMessageSuccess(t *testing.T) {
 
        resp := models.NewE2SetupSuccessResponseMessage(plmn, ricNearRtId, setupRequest)
        respIEs := resp.E2APPDU.Outcome.(models.SuccessfulOutcome).Value.E2setupResponse.ProtocolIEs.E2setupResponseIEs
-       assert.Equal(t, "4", respIEs[0].ID)
-       assert.Equal(t, plmn, respIEs[0].Value.(models.GlobalRICID).GlobalRICID.PLMNIdentity)
-       assert.Equal(t, ricNearRtId, respIEs[0].Value.(models.GlobalRICID).GlobalRICID.RicID)
-       assert.Equal(t, "9", respIEs[1].ID)
+       assert.Equal(t, models.GlobalRicID, respIEs[1].ID)
+       assert.Equal(t, plmn, respIEs[1].Value.(models.GlobalRICID).GlobalRICID.PLMNIdentity)
+       assert.Equal(t, ricNearRtId, respIEs[1].Value.(models.GlobalRICID).GlobalRICID.RicID)
+       assert.Equal(t, models.RanFunctionsAcceptedID, respIEs[2].ID)
 }
 
 func TestNewE2SetupSuccessResponseMessageWithoutRanFunctionsSuccess(t *testing.T) {
@@ -60,18 +62,19 @@ func TestNewE2SetupSuccessResponseMessageWithoutRanFunctionsSuccess(t *testing.T
 
        resp := models.NewE2SetupSuccessResponseMessage(plmn, ricNearRtId, setupRequest)
        respIEs := resp.E2APPDU.Outcome.(models.SuccessfulOutcome).Value.E2setupResponse.ProtocolIEs.E2setupResponseIEs
-       assert.Equal(t, "4", respIEs[0].ID)
-       assert.Equal(t, plmn, respIEs[0].Value.(models.GlobalRICID).GlobalRICID.PLMNIdentity)
-       assert.Equal(t, ricNearRtId, respIEs[0].Value.(models.GlobalRICID).GlobalRICID.RicID)
-       assert.Equal(t, 1, len(respIEs))
+       assert.Equal(t, models.GlobalRicID, respIEs[1].ID)
+       assert.Equal(t, plmn, respIEs[1].Value.(models.GlobalRICID).GlobalRICID.PLMNIdentity)
+       assert.Equal(t, ricNearRtId, respIEs[1].Value.(models.GlobalRICID).GlobalRICID.RicID)
+       assert.Equal(t, 3, len(respIEs))
 }
 
 func TestNewE2SetupFailureResponseMessageSuccess(t *testing.T) {
        waitTime := models.TimeToWaitEnum.V60s
        cause := models.Cause{Misc: &models.CauseMisc{OmIntervention: &struct{}{}}}
+       setupRequest := getE2SetupRespTestE2SetupRequest(t, e2SetupRespGnbSetupRequestXmlPath)
 
-       resp := models.NewE2SetupFailureResponseMessage(waitTime, cause)
+       resp := models.NewE2SetupFailureResponseMessage(waitTime, cause, setupRequest)
        respIEs := resp.E2APPDU.Outcome.(models.UnsuccessfulOutcome).Value.E2setupFailure.ProtocolIEs.E2setupFailureIEs
-       assert.Equal(t, "1", respIEs[0].ID)
-       assert.Equal(t, cause, respIEs[0].Value.Value.(models.Cause))
+       assert.Equal(t, models.CauseID, respIEs[1].ID)
+       assert.Equal(t, cause, respIEs[1].Value.Value.(models.Cause))
 }
index bb2115f..68986af 100644 (file)
@@ -7,6 +7,15 @@
         <value>\r
             <E2setupRequest>\r
                 <protocolIEs>\r
+                    <E2setupRequestIEs>
+                        <id>49</id>
+                        <criticality>
+                            <reject/>
+                        </criticality>
+                        <value>
+                            <TransactionID>1</TransactionID>
+                        </value>
+                    </E2setupRequestIEs>
                     <E2setupRequestIEs>\r
                         <id>3</id>\r
                         <criticality>\r
@@ -42,6 +51,7 @@
                                             <ranFunctionID>1</ranFunctionID>\r
                                             <ranFunctionDefinition>334455</ranFunctionDefinition>\r
                                             <ranFunctionRevision>0</ranFunctionRevision>\r
+                                            <ranFunctionOID>OID123</ranFunctionOID>
                                         </RANfunction-Item>\r
                                     </value>\r
                                 </ProtocolIE-SingleContainer>\r
                                             <ranFunctionID>7</ranFunctionID>\r
                                             <ranFunctionDefinition>334455</ranFunctionDefinition>\r
                                             <ranFunctionRevision>0</ranFunctionRevision>\r
+                                            <ranFunctionOID>OID123</ranFunctionOID>
                                         </RANfunction-Item>\r
                                     </value>\r
                                 </ProtocolIE-SingleContainer>\r
                             </RANfunctions-List>\r
                         </value>\r
                     </E2setupRequestIEs>\r
+                    <E2setupRequestIEs>
+                        <id>50</id>
+                        <criticality><reject/></criticality>
+                        <value>
+                            <E2nodeComponentConfigAddition-List>
+                                <ProtocolIE-SingleContainer>
+                                    <id>51</id>
+                                    <criticality><reject/></criticality>
+                                    <value>
+                                        <E2nodeComponentConfigAddition-Item>
+                                            <e2nodeComponentInterfaceType><ng/></e2nodeComponentInterfaceType>
+                                            <e2nodeComponentID>
+                                                <e2nodeComponentInterfaceTypeNG>
+                                                    <amf-name>nginterf</amf-name>
+                                                </e2nodeComponentInterfaceTypeNG>
+                                            </e2nodeComponentID>
+                                            <e2nodeComponentConfiguration>
+                                                <e2nodeComponentRequestPart>72 65 71 70 61 72 74</e2nodeComponentRequestPart>
+                                                <e2nodeComponentResponsePart>72 65 73 70 61 72 74</e2nodeComponentResponsePart>
+                                            </e2nodeComponentConfiguration>
+                                        </E2nodeComponentConfigAddition-Item>
+                                    </value>
+                                </ProtocolIE-SingleContainer>
+                            </E2nodeComponentConfigAddition-List>
+                        </value>
+                    </E2setupRequestIEs>
                 </protocolIEs>\r
             </E2setupRequest>\r
         </value>\r
index 230e06f..7bab858 100644 (file)
@@ -7,6 +7,15 @@
         <value>\r
             <E2setupRequest>\r
                 <protocolIEs>\r
+                    <E2setupRequestIEs>
+                        <id>49</id>
+                        <criticality>
+                            <reject/>
+                        </criticality>
+                        <value>
+                            <TransactionID>1</TransactionID>
+                        </value>
+                    </E2setupRequestIEs>
                     <E2setupRequestIEs>\r
                         <id>3</id>\r
                         <criticality>\r
                             </RANfunctions-List>\r
                         </value>\r
                     </E2setupRequestIEs>\r
+                    <E2setupRequestIEs>
+                        <id>50</id>
+                        <criticality><reject/></criticality>
+                        <value>
+                            <E2nodeComponentConfigAddition-List>
+                                <ProtocolIE-SingleContainer>
+                                    <id>51</id>
+                                    <criticality><reject/></criticality>
+                                    <value>
+                                        <E2nodeComponentConfigAddition-Item>
+                                            <e2nodeComponentInterfaceType><ng/></e2nodeComponentInterfaceType>
+                                            <e2nodeComponentID>
+                                                <e2nodeComponentInterfaceTypeNG>
+                                                    <amf-name>nginterf</amf-name>
+                                                </e2nodeComponentInterfaceTypeNG>
+                                            </e2nodeComponentID>
+                                            <e2nodeComponentConfiguration>
+                                                <e2nodeComponentRequestPart>72 65 71 70 61 72 74</e2nodeComponentRequestPart>
+                                                <e2nodeComponentResponsePart>72 65 73 70 61 72 74</e2nodeComponentResponsePart>
+                                            </e2nodeComponentConfiguration>
+                                        </E2nodeComponentConfigAddition-Item>
+                                    </value>
+                                </ProtocolIE-SingleContainer>
+                            </E2nodeComponentConfigAddition-List>
+                        </value>
+                    </E2setupRequestIEs>
                 </protocolIEs>\r
             </E2setupRequest>\r
         </value>\r
index 847df6a..89e7ff2 100644 (file)
@@ -7,6 +7,15 @@
         <value>
             <E2setupRequest>
                 <protocolIEs>
+                    <E2setupRequestIEs>
+                        <id>49</id>
+                        <criticality>
+                            <reject/>
+                        </criticality>
+                        <value>
+                            <TransactionID>1</TransactionID>
+                        </value>
+                    </E2setupRequestIEs>
                     <E2setupRequestIEs>
                         <id>3</id>
                         <criticality>
@@ -44,6 +53,7 @@
                                                 790280674E422D5832000020312E332E362E312E342E312E32383435382E39392E302E32312E332E332E312E320B80674E42205832204E6574776F726B20496E74657266616365010000010108004D6573736167652054797065206F6E6C7901010001010780436F6D706C657465206D6573736167650101000001058041646454696D657374616D7020010101010001010780436F6D706C657465206D6573736167650101000001058041646454696D657374616D70200101010101010001010780436F6D706C657465206D657373616765010101010101
                                             </ranFunctionDefinition>
                                             <ranFunctionRevision>1</ranFunctionRevision>
+                                            <ranFunctionOID>OID123</ranFunctionOID>
                                         </RANfunction-Item>
                                     </value>
                                 </ProtocolIE-SingleContainer>
@@ -59,6 +69,7 @@
                                                 680300674E422D4E5254000020312E332E362E312E342E312E32383435382E39392E302E32312E332E332E332E330D80674E42204E65696768626F75722052656C6174696F6E205461626C6500010105804E6F74696669636174696F6E01010001010680436F6D706C657465207461626C650101000001058041646454696D657374616D70200101010100010107804E5254206D6F64696669636174696F6E010101010100
                                             </ranFunctionDefinition>
                                             <ranFunctionRevision>1</ranFunctionRevision>
+                                            <ranFunctionOID>OID123</ranFunctionOID>
                                         </RANfunction-Item>
                                     </value>
                                 </ProtocolIE-SingleContainer>
                                                 450280674E422D5832000020312E332E362E312E342E312E32383435382E39392E302E32312E332E332E312E320B80674E42205832204E6574776F726B20496E74657266616365010100010108004D6573736167652054797065206F6E6C79010100010108004D6573736167652041646D697373696F6E01020400010180514349310002018041525031000301805350494400040300552D5445494431400A05004C6F61645F6F666673657400
                                             </ranFunctionDefinition>
                                             <ranFunctionRevision>1</ranFunctionRevision>
+                                            <ranFunctionOID>OID123</ranFunctionOID>
                                         </RANfunction-Item>
                                     </value>
                                 </ProtocolIE-SingleContainer>
                             </RANfunctions-List>
                         </value>
                     </E2setupRequestIEs>
+                    <E2setupRequestIEs>
+                        <id>50</id>
+                        <criticality><reject/></criticality>
+                        <value>
+                            <E2nodeComponentConfigAddition-List>
+                                <ProtocolIE-SingleContainer>
+                                    <id>51</id>
+                                    <criticality><reject/></criticality>
+                                    <value>
+                                        <E2nodeComponentConfigAddition-Item>
+                                            <e2nodeComponentInterfaceType><ng/></e2nodeComponentInterfaceType>
+                                            <e2nodeComponentID>
+                                                <e2nodeComponentInterfaceTypeNG>
+                                                    <amf-name>nginterf</amf-name>
+                                                </e2nodeComponentInterfaceTypeNG>
+                                            </e2nodeComponentID>
+                                            <e2nodeComponentConfiguration>
+                                                <e2nodeComponentRequestPart>72 65 71 70 61 72 74</e2nodeComponentRequestPart>
+                                                <e2nodeComponentResponsePart>72 65 73 70 61 72 74</e2nodeComponentResponsePart>
+                                            </e2nodeComponentConfiguration>
+                                        </E2nodeComponentConfigAddition-Item>
+                                    </value>
+                                </ProtocolIE-SingleContainer>
+                            </E2nodeComponentConfigAddition-List>
+                        </value>
+                    </E2setupRequestIEs>
                 </protocolIEs>
             </E2setupRequest>
         </value>
index 3246799..29f1256 100644 (file)
@@ -7,6 +7,15 @@
         <value>
             <E2setupRequest>
                 <protocolIEs>
+                    <E2setupRequestIEs>
+                        <id>49</id>
+                        <criticality>
+                            <reject/>
+                        </criticality>
+                        <value>
+                            <TransactionID>1</TransactionID>
+                        </value>
+                    </E2setupRequestIEs>
                     <E2setupRequestIEs>
                         <id>3</id>
                         <criticality>
                             </RANfunctions-List>
                         </value>
                     </E2setupRequestIEs>
+                    <E2setupRequestIEs>
+                        <id>50</id>
+                        <criticality><reject/></criticality>
+                        <value>
+                            <E2nodeComponentConfigAddition-List>
+                                <ProtocolIE-SingleContainer>
+                                    <id>51</id>
+                                    <criticality><reject/></criticality>
+                                    <value>
+                                        <E2nodeComponentConfigAddition-Item>
+                                            <e2nodeComponentInterfaceType><ng/></e2nodeComponentInterfaceType>
+                                            <e2nodeComponentID>
+                                                <e2nodeComponentInterfaceTypeNG>
+                                                    <amf-name>nginterf</amf-name>
+                                                </e2nodeComponentInterfaceTypeNG>
+                                            </e2nodeComponentID>
+                                            <e2nodeComponentConfiguration>
+                                                <e2nodeComponentRequestPart>72 65 71 70 61 72 74</e2nodeComponentRequestPart>
+                                                <e2nodeComponentResponsePart>72 65 73 70 61 72 74</e2nodeComponentResponsePart>
+                                            </e2nodeComponentConfiguration>
+                                        </E2nodeComponentConfigAddition-Item>
+                                    </value>
+                                </ProtocolIE-SingleContainer>
+                            </E2nodeComponentConfigAddition-List>
+                        </value>
+                    </E2setupRequestIEs>
                 </protocolIEs>
             </E2setupRequest>
         </value>
index db28387..17f8134 100644 (file)
@@ -7,6 +7,15 @@
         <value>
             <E2setupRequest>
                 <protocolIEs>
+                    <E2setupRequestIEs>
+                        <id>49</id>
+                        <criticality>
+                            <reject/>
+                        </criticality>
+                        <value>
+                            <TransactionID>1</TransactionID>
+                        </value>
+                    </E2setupRequestIEs>
                     <E2setupRequestIEs>
                         <id>3</id>
                         <criticality>
                             </GlobalE2node-ID>
                         </value>
                     </E2setupRequestIEs>
+                    <E2setupRequestIEs>
+                        <id>50</id>
+                        <criticality><reject/></criticality>
+                        <value>
+                            <E2nodeComponentConfigAddition-List>
+                                <ProtocolIE-SingleContainer>
+                                    <id>51</id>
+                                    <criticality><reject/></criticality>
+                                    <value>
+                                        <E2nodeComponentConfigAddition-Item>
+                                            <e2nodeComponentInterfaceType><ng/></e2nodeComponentInterfaceType>
+                                            <e2nodeComponentID>
+                                                <e2nodeComponentInterfaceTypeNG>
+                                                    <amf-name>nginterf</amf-name>
+                                                </e2nodeComponentInterfaceTypeNG>
+                                            </e2nodeComponentID>
+                                            <e2nodeComponentConfiguration>
+                                                <e2nodeComponentRequestPart>72 65 71 70 61 72 74</e2nodeComponentRequestPart>
+                                                <e2nodeComponentResponsePart>72 65 73 70 61 72 74</e2nodeComponentResponsePart>
+                                            </e2nodeComponentConfiguration>
+                                        </E2nodeComponentConfigAddition-Item>
+                                    </value>
+                                </ProtocolIE-SingleContainer>
+                            </E2nodeComponentConfigAddition-List>
+                        </value>
+                    </E2setupRequestIEs>
                 </protocolIEs>
             </E2setupRequest>
         </value>
index 6bcd1f1..cbcbe80 100644 (file)
@@ -7,6 +7,15 @@
         <value>\r
             <E2setupRequest>\r
                 <protocolIEs>\r
+                    <E2setupRequestIEs>
+                        <id>49</id>
+                        <criticality>
+                            <reject/>
+                        </criticality>
+                        <value>
+                            <TransactionID>1</TransactionID>
+                        </value>
+                    </E2setupRequestIEs>
                     <E2setupRequestIEs>\r
                         <id>3</id>\r
                         <criticality>\r
@@ -42,6 +51,7 @@
                                             <ranFunctionID>1</ranFunctionID>\r
                                             <ranFunctionDefinition>334455</ranFunctionDefinition>\r
                                             <ranFunctionRevision>0</ranFunctionRevision>\r
+                                            <ranFunctionOID>OID123</ranFunctionOID>
                                         </RANfunction-Item>\r
                                     </value>\r
                                 </ProtocolIE-SingleContainer>\r
                                             <ranFunctionID>7</ranFunctionID>\r
                                             <ranFunctionDefinition>334455</ranFunctionDefinition>\r
                                             <ranFunctionRevision>0</ranFunctionRevision>\r
+                                            <ranFunctionOID>OID123</ranFunctionOID>
                                         </RANfunction-Item>\r
                                     </value>\r
                                 </ProtocolIE-SingleContainer>\r
                             </RANfunctions-List>\r
                         </value>\r
                     </E2setupRequestIEs>\r
+                    <E2setupRequestIEs>
+                        <id>50</id>
+                        <criticality><reject/></criticality>
+                        <value>
+                            <E2nodeComponentConfigAddition-List>
+                                <ProtocolIE-SingleContainer>
+                                    <id>51</id>
+                                    <criticality><reject/></criticality>
+                                    <value>
+                                        <E2nodeComponentConfigAddition-Item>
+                                            <e2nodeComponentInterfaceType><ng/></e2nodeComponentInterfaceType>
+                                            <e2nodeComponentID>
+                                                <e2nodeComponentInterfaceTypeNG>
+                                                    <amf-name>nginterf</amf-name>
+                                                </e2nodeComponentInterfaceTypeNG>
+                                            </e2nodeComponentID>
+                                            <e2nodeComponentConfiguration>
+                                                <e2nodeComponentRequestPart>72 65 71 70 61 72 74</e2nodeComponentRequestPart>
+                                                <e2nodeComponentResponsePart>72 65 73 70 61 72 74</e2nodeComponentResponsePart>
+                                            </e2nodeComponentConfiguration>
+                                        </E2nodeComponentConfigAddition-Item>
+                                    </value>
+                                </ProtocolIE-SingleContainer>
+                            </E2nodeComponentConfigAddition-List>
+                        </value>
+                    </E2setupRequestIEs>
                 </protocolIEs>\r
             </E2setupRequest>\r
         </value>\r
index d5d0bff..918b37f 100644 (file)
@@ -7,6 +7,15 @@
         <value>\r
             <E2setupRequest>\r
                 <protocolIEs>\r
+                    <E2setupRequestIEs>
+                        <id>49</id>
+                        <criticality>
+                            <reject/>
+                        </criticality>
+                        <value>
+                            <TransactionID>1</TransactionID>
+                        </value>
+                    </E2setupRequestIEs>
                     <E2setupRequestIEs>\r
                         <id>3</id>\r
                         <criticality>\r
                             </RANfunctions-List>\r
                         </value>\r
                     </E2setupRequestIEs>\r
+                    <E2setupRequestIEs>
+                        <id>50</id>
+                        <criticality><reject/></criticality>
+                        <value>
+                            <E2nodeComponentConfigAddition-List>
+                                <ProtocolIE-SingleContainer>
+                                    <id>51</id>
+                                    <criticality><reject/></criticality>
+                                    <value>
+                                        <E2nodeComponentConfigAddition-Item>
+                                            <e2nodeComponentInterfaceType><ng/></e2nodeComponentInterfaceType>
+                                            <e2nodeComponentID>
+                                                <e2nodeComponentInterfaceTypeNG>
+                                                    <amf-name>nginterf1</amf-name>
+                                                </e2nodeComponentInterfaceTypeNG>
+                                            </e2nodeComponentID>
+                                            <e2nodeComponentConfiguration>
+                                                <e2nodeComponentRequestPart>72 65 71 70 61 72 74</e2nodeComponentRequestPart>
+                                                <e2nodeComponentResponsePart>72 65 73 70 61 72 74</e2nodeComponentResponsePart>
+                                            </e2nodeComponentConfiguration>
+                                        </E2nodeComponentConfigAddition-Item>
+                                    </value>
+                                </ProtocolIE-SingleContainer>
+                                <ProtocolIE-SingleContainer>
+                                    <id>51</id>
+                                    <criticality><reject/></criticality>
+                                    <value>
+                                        <E2nodeComponentConfigAddition-Item>
+                                            <e2nodeComponentInterfaceType><ng/></e2nodeComponentInterfaceType>
+                                            <e2nodeComponentID>
+                                                <e2nodeComponentInterfaceTypeNG>
+                                                    <amf-name>nginterf2</amf-name>
+                                                </e2nodeComponentInterfaceTypeNG>
+                                            </e2nodeComponentID>
+                                            <e2nodeComponentConfiguration>
+                                                <e2nodeComponentRequestPart>72 65 71 70 61 72 74</e2nodeComponentRequestPart>
+                                                <e2nodeComponentResponsePart>72 65 73 70 61 72 74</e2nodeComponentResponsePart>
+                                            </e2nodeComponentConfiguration>
+                                        </E2nodeComponentConfigAddition-Item>
+                                    </value>
+                                </ProtocolIE-SingleContainer>
+                            </E2nodeComponentConfigAddition-List>
+                        </value>
+                    </E2setupRequestIEs>
                 </protocolIEs>\r
             </E2setupRequest>\r
         </value>\r