RIC-961:implement Xn and X2 component IDs correctly in E2M
[ric-plt/e2mgr.git] / E2Manager / models / e2_setup_request_message.go
index e61d498..420d5fd 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.
@@ -21,9 +22,9 @@ package models
 
 import (
        "encoding/xml"
-       "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
-       "github.com/golang/protobuf/ptypes/wrappers"
        "strings"
+
+       "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
 )
 
 type Gnb struct {
@@ -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"`
@@ -132,119 +135,11 @@ type E2SetupRequestMessage struct {
 }
 
 type RanFunctionItem struct {
-       Text                  string                `xml:",chardata"`
-       RanFunctionID         uint32                `xml:"ranFunctionID"`
-       RanFunctionDefinition RanFunctionDefinition `xml:"ranFunctionDefinition"`
-       RanFunctionRevision   uint32                `xml:"ranFunctionRevision"`
-}
-
-type RanFunctionDefinition struct {
-       Text                            string                          `xml:",chardata"`
-       E2smGnbNrtRanFunctionDefinition E2smGnbNrtRanFunctionDefinition `xml:"E2SM-gNB-NRT-RANfunction-Definition"`
-}
-
-type RanFunctionName struct {
-       Text                   string  `xml:",chardata"`
-       RanFunctionShortName   string  `xml:"ranFunction-ShortName"`
-       RanFunctionE2smOid     string  `xml:"ranFunction-E2SM-OID"`
-       RanFunctionDescription string  `xml:"ranFunction-Description"`
-       RanFunctionInstance    *uint32 `xml:"ranFunction-Instance"`
-}
-
-type RicEventTriggerStyleList struct {
-       Text                      string `xml:",chardata"`
-       RicEventTriggerStyleType  uint32 `xml:"ric-EventTriggerStyle-Type"`
-       RicEventTriggerStyleName  string `xml:"ric-EventTriggerStyle-Name"`
-       RicEventTriggerFormatType uint32 `xml:"ric-EventTriggerFormat-Type"`
-}
-
-type RanParameterDefItem struct {
-       Text             string           `xml:",chardata"`
-       RanParameterID   uint32           `xml:"ranParameter-ID"`
-       RanParameterName string           `xml:"ranParameter-Name"`
-       RanParameterType RanParameterType `xml:"ranParameter-Type"`
-}
-
-type RanParameterType struct {
-       Text            string    `xml:",chardata"`
-       Boolean         *struct{} `xml:"boolean,omitempty"`
-       Integer         *struct{} `xml:"integer,omitempty"`
-       Enumerated      *struct{} `xml:"enumerated,omitempty"`
-       BitString       *struct{} `xml:"bit-string,omitempty"`
-       OctetString     *struct{} `xml:"octet-string,omitempty"`
-       PrintableString *struct{} `xml:"printable-string,omitempty"`
-}
-
-type RicReportStyleList struct {
-       Text                         string `xml:",chardata"`
-       RicReportStyleType           uint32 `xml:"ric-ReportStyle-Type"`
-       RicReportStyleName           string `xml:"ric-ReportStyle-Name"`
-       RicReportActionFormatType    uint32 `xml:"ric-ReportActionFormat-Type"`
-       RicReportRanParameterDefList struct {
-               Text                string                `xml:",chardata"`
-               RanParameterDefItem []RanParameterDefItem `xml:"RANparameterDef-Item"`
-       } `xml:"ric-ReportRanParameterDef-List"`
-       RicIndicationHeaderFormatType  uint32 `xml:"ric-IndicationHeaderFormat-Type"`
-       RicIndicationMessageFormatType uint32 `xml:"ric-IndicationMessageFormat-Type"`
-}
-
-type RicInsertStyleList struct {
-       Text                         string `xml:",chardata"`
-       RicInsertStyleType           uint32 `xml:"ric-InsertStyle-Type"`
-       RicInsertStyleName           string `xml:"ric-InsertStyle-Name"`
-       RicInsertActionFormatType    uint32 `xml:"ric-InsertActionFormat-Type"`
-       RicInsertRanParameterDefList struct {
-               Text                string                `xml:",chardata"`
-               RanParameterDefItem []RanParameterDefItem `xml:"RANparameterDef-Item"`
-       } `xml:"ric-InsertRanParameterDef-List"`
-       RicIndicationHeaderFormatType  uint32 `xml:"ric-IndicationHeaderFormat-Type"`
-       RicIndicationMessageFormatType uint32 `xml:"ric-IndicationMessageFormat-Type"`
-       RicCallProcessIdFormatType     uint32 `xml:"ric-CallProcessIDFormat-Type"`
-}
-
-type RicControlStyleList struct {
-       Text                        string `xml:",chardata"`
-       RicControlStyleType         uint32 `xml:"ric-ControlStyle-Type"`
-       RicControlStyleName         string `xml:"ric-ControlStyle-Name"`
-       RicControlHeaderFormatType  uint32 `xml:"ric-ControlHeaderFormat-Type"`
-       RicControlMessageFormatType uint32 `xml:"ric-ControlMessageFormat-Type"`
-       RicCallProcessIdFormatType  uint32 `xml:"ric-CallProcessIDFormat-Type"`
-}
-
-type RicPolicyStyleList struct {
-       Text                         string `xml:",chardata"`
-       RicPolicyStyleType           uint32 `xml:"ric-PolicyStyle-Type"`
-       RicPolicyStyleName           string `xml:"ric-PolicyStyle-Name"`
-       RicPolicyActionFormatType    uint32 `xml:"ric-PolicyActionFormat-Type"`
-       RicPolicyRanParameterDefList struct {
-               Text                string                `xml:",chardata"`
-               RanParameterDefItem []RanParameterDefItem `xml:"RANparameterDef-Item"`
-       } `xml:"ric-PolicyRanParameterDef-List"`
-}
-
-type E2smGnbNrtRanFunctionDefinition struct {
-       Text                     string          `xml:",chardata"`
-       RanFunctionName          RanFunctionName `xml:"ranFunction-Name"`
-       RicEventTriggerStyleList struct {
-               Text                     string                     `xml:",chardata"`
-               RicEventTriggerStyleList []RicEventTriggerStyleList `xml:"RIC-EventTriggerStyle-List"`
-       } `xml:"ric-EventTriggerStyle-List"`
-       RicReportStyleList struct {
-               Text               string               `xml:",chardata"`
-               RicReportStyleList []RicReportStyleList `xml:"RIC-ReportStyle-List"`
-       } `xml:"ric-ReportStyle-List"`
-       RicInsertStyleList struct {
-               Text               string               `xml:",chardata"`
-               RicInsertStyleList []RicInsertStyleList `xml:"RIC-InsertStyle-List"`
-       } `xml:"ric-InsertStyle-List"`
-       RicControlStyleList struct {
-               Text                string                `xml:",chardata"`
-               RicControlStyleList []RicControlStyleList `xml:"RIC-ControlStyle-List"`
-       } `xml:"ric-ControlStyle-List"`
-       RicPolicyStyleList struct {
-               Text               string               `xml:",chardata"`
-               RicPolicyStyleList []RicPolicyStyleList `xml:"RIC-PolicyStyle-List"`
-       } `xml:"ric-PolicyStyle-List"`
+       Text                  string `xml:",chardata"`
+       RanFunctionID         uint32 `xml:"ranFunctionID"`
+       RanFunctionDefinition string `xml:"ranFunctionDefinition"`
+       RanFunctionRevision   uint32 `xml:"ranFunctionRevision"`
+       RanFunctionOID        string `xml:"ranFunctionOID"`
 }
 
 type RANfunctionsList struct {
@@ -263,217 +158,436 @@ type RANfunctionsList struct {
        } `xml:"ProtocolIE-SingleContainer"`
 }
 
-func (m *E2SetupRequestMessage) ExtractRanFunctionsList() []*entities.RanFunction {
-       // TODO: verify e2SetupRequestIEs structure with Adi
-       e2SetupRequestIes := m.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs
-       if len(e2SetupRequestIes) < 2  {
-               return nil
-       }
-
-       ranFunctionsListContainer := e2SetupRequestIes[1].Value.RANfunctionsList.ProtocolIESingleContainer
-       funcs := make([]*entities.RanFunction, len(ranFunctionsListContainer))
-       for i := 0; i < len(funcs); i++ {
-               ranFunctionItem := ranFunctionsListContainer[i].Value.RANfunctionItem
-
-               funcs[i] = &entities.RanFunction{
-                       RanFunctionId:         &wrappers.UInt32Value{Value: ranFunctionItem.RanFunctionID},
-                       RanFunctionDefinition: m.buildRanFunctionDefinitionProto(&ranFunctionItem.RanFunctionDefinition),
-                       RanFunctionRevision:   &wrappers.UInt32Value{Value: ranFunctionItem.RanFunctionRevision},
-               }
-       }
-       return funcs
+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"`
 }
 
-func (m *E2SetupRequestMessage) buildRanFunctionDefinitionProto(def *RanFunctionDefinition) *entities.RanFunctionDefinition {
-       return &entities.RanFunctionDefinition{
-               E2SmGnbNrtRanFunctionDefinition: &entities.E2SmGnbNrtRanFunctionDefinition{
-                       RanFunctionName:       buildRanFunctionNameProto(def),
-                       RicEventTriggerStyles: buildRicEventTriggerStylesProto(def),
-                       RicReportStyles:       buildRicReportStylesProto(def),
-                       RicInsertStyles:       buildRicInsertStylesProto(def),
-                       RicControlStyles:      buildRicControlStylesProto(def),
-                       RicPolicyStyles:       buildRicPolicyStylesProto(def),
-               },
-       }
+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"`
 }
 
-func buildRanFunctionNameProto(def *RanFunctionDefinition) *entities.RanFunctionName {
-       defRanFunctionName := def.E2smGnbNrtRanFunctionDefinition.RanFunctionName
-       ranFunctionName := &entities.RanFunctionName{
-               RanFunctionShortName:   &wrappers.StringValue{Value: defRanFunctionName.RanFunctionShortName},
-               RanFunctionE2SmOid:     &wrappers.StringValue{Value: defRanFunctionName.RanFunctionE2smOid},
-               RanFunctionDescription: &wrappers.StringValue{Value: defRanFunctionName.RanFunctionDescription},
-       }
-
-       if defRanFunctionName.RanFunctionInstance != nil {
-               ranFunctionName.OptionalRanFunctionInstance = &entities.RanFunctionName_RanFunctionInstance{
-                       RanFunctionInstance: *defRanFunctionName.RanFunctionInstance,
-               }
-       }
+type E2NodeConfigAdditionItem struct {
+       Text                string              `xml:",chardata"`
+       E2nodeComponentType E2NodeComponentType `xml:"e2nodeComponentInterfaceType"`
+       E2nodeComponentID   E2NodeComponentId   `xml:"e2nodeComponentID"`
+       E2nodeConfiguration E2NodeConfigValue   `xml:"e2nodeComponentConfiguration"`
+}
 
-       return ranFunctionName
+type E2NodeConfigValue struct {
+       Text               string `xml:",chardata"`
+       E2NodeRequestPart  []byte `xml:"e2nodeComponentRequestPart"`
+       E2NodeResponsePart []byte `xml:"e2nodeComponentResponsePart"`
 }
 
-func buildRicEventTriggerStylesProto(def *RanFunctionDefinition) []*entities.RicEventTriggerStyle {
-       defRicEventTriggerStyleList := def.E2smGnbNrtRanFunctionDefinition.RicEventTriggerStyleList.RicEventTriggerStyleList
-       ricEventTriggerStyles := make([]*entities.RicEventTriggerStyle, len(defRicEventTriggerStyleList))
+type E2NodeComponentId struct {
+       Text           string `xml:",chardata"`
+       E2NodeIFTypeNG E2NodeIFTypeNG
+       E2NodeIFTypeXN E2NodeIFTypeXN
+       E2NodeIFTypeE1 E2NodeIFTypeE1
+       E2NodeIFTypeF1 E2NodeIFTypeF1
+       E2NodeIFTypeW1 E2NodeIFTypeW1
+       E2NodeIFTypeS1 E2NodeIFTypeS1
+       E2NodeIFTypeX2 E2NodeIFTypeX2
+}
 
-       for i, v := range defRicEventTriggerStyleList {
-               ricEventTriggerStyles[i] = &entities.RicEventTriggerStyle{
-                       RicEventTriggerStyleType:  &wrappers.UInt32Value{Value: v.RicEventTriggerStyleType},
-                       RicEventTriggerStyleName:  &wrappers.StringValue{Value: v.RicEventTriggerStyleName},
-                       RicEventTriggerFormatType: &wrappers.UInt32Value{Value: v.RicEventTriggerFormatType},
-               }
-       }
+type E2NodeIFTypeNG struct {
+       XMLName xml.Name `xml:"e2nodeComponentInterfaceTypeNG"`
+       Text    string   `xml:",chardata"`
+       AMFName string   `xml:"amf-name"`
+}
 
-       return ricEventTriggerStyles
+type E2NodeIFTypeXN struct {
+       XMLName           xml.Name `xml:"e2nodeComponentInterfaceTypeXn"`
+       Text              string   `xml:",chardata"`
+       GlobalNGRANNodeID struct {
+               Text          string   `xml:",chardata"`
+               GlobalgNBID   *GNB     `xml:"gNB,omitempty"`
+               GlobalngeNBID *NgeNBID `xml:"ng-eNB,omitempty"`
+       } `xml:"global-NG-RAN-Node-ID"`
 }
 
-func buildRicReportStylesProto(def *RanFunctionDefinition) []*entities.RicReportStyle {
-       defRicReportStyleList := def.E2smGnbNrtRanFunctionDefinition.RicReportStyleList.RicReportStyleList
-       ricReportStyles := make([]*entities.RicReportStyle, len(defRicReportStyleList))
+type GNB struct {
+       Text   string `xml:",chardata"`
+       PLMNID string `xml:"plmn-id"`
+       GnbID  GnbID  `xml:"gnb-id"`
+}
+type GnbID struct {
+       Text  string `xml:",chardata"`
+       GnbID string `xml:"gnb-ID"`
+}
 
-       for i, v := range defRicReportStyleList {
-               ricReportStyles[i] = &entities.RicReportStyle{
-                       RicReportStyleType:             &wrappers.UInt32Value{Value: v.RicReportStyleType},
-                       RicReportStyleName:             &wrappers.StringValue{Value: v.RicReportStyleName},
-                       RicReportActionFormatType:      &wrappers.UInt32Value{Value: v.RicReportActionFormatType},
-                       RicReportRanParameterDefs:      buildRicReportRanParameterDefsProto(v),
-                       RicIndicationHeaderFormatType:  &wrappers.UInt32Value{Value: v.RicIndicationHeaderFormatType},
-                       RicIndicationMessageFormatType: &wrappers.UInt32Value{Value: v.RicIndicationMessageFormatType},
-               }
-       }
+type NgeNBID struct {
+       Text   string    `xml:",chardata"`
+       PLMNID string    `xml:"plmn-id"`
+       EnbID  *EnbID_Xn `xml:"enb-id"`
+}
 
-       return ricReportStyles
+type EnbID_Xn struct {
+       Text            string `xml:",chardata"`
+       EnbIdMacro      string `xml:"enb-ID-macro,omitempty"`
+       EnbIdShortMacro string `xml:"enb-ID-shortmacro,omitempty"`
+       EnbIdLongMacro  string `xml:"enb-ID-longmacro,omitempty"`
 }
 
-func buildRicReportRanParameterDefsProto(ricReportStyleList RicReportStyleList) []*entities.RanParameterDef {
-       ricReportRanParameterDefList := ricReportStyleList.RicReportRanParameterDefList.RanParameterDefItem
-       ranParameterDefs := make([]*entities.RanParameterDef, len(ricReportRanParameterDefList))
+type E2NodeIFTypeE1 struct {
+       XMLName   xml.Name `xml:"e2nodeComponentInterfaceTypeE1"`
+       Text      string   `xml:",chardata"`
+       GNBCUCPID int64    `xml:"gNB-CU-CP-ID"`
+}
 
-       for i, v := range ricReportRanParameterDefList {
-               ranParameterDefs[i] = &entities.RanParameterDef{
-                       RanParameterId:   &wrappers.UInt32Value{Value: v.RanParameterID},
-                       RanParameterName: &wrappers.StringValue{Value: v.RanParameterName},
-                       RanParameterType: getRanParameterTypeEnumValue(v.RanParameterType),
-               }
-       }
+type E2NodeIFTypeF1 struct {
+       XMLName xml.Name `xml:"e2nodeComponentInterfaceTypeF1"`
+       Text    string   `xml:",chardata"`
+       GNBDUID int64    `xml:"gNB-DU-ID"`
+}
 
-       return ranParameterDefs
+type E2NodeIFTypeW1 struct {
+       XMLName   xml.Name `xml:"e2nodeComponentInterfaceTypeW1"`
+       Text      string   `xml:",chardata"`
+       NGENBDUID int64    `xml:"ng-eNB-DU-ID"`
 }
 
-func getRanParameterTypeEnumValue(ranParameterType RanParameterType) entities.RanParameterType {
-       if ranParameterType.Boolean != nil {
-               return entities.RanParameterType_BOOLEAN
-       }
+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   *GlobalENBID   `xml:"global-eNB-ID,omitempty"`
+       GlobalenGNBID *GlobalenGNBID `xml:"global-en-gNB-ID,omitempty"`
+}
+type GlobalENBID struct {
+       Text         string    `xml:",chardata"`
+       PLMNIdentity string    `xml:"pLMN-Identity"`
+       ENBID        *ENBID_X2 `xml:"eNB-ID"`
+}
+type ENBID_X2 struct {
+       Text            string `xml:",chardata"`
+       MacroEnbId      string `xml:"macro-eNB-ID,omitempty"`
+       HomeEnbId       string `xml:"home-eNB-ID,omitempty"`
+       ShortMacroEnbId string `xml:"short-Macro-eNB-ID,omitempty"`
+       LongMacroEnbId  string `xml:"long-Macro-eNB-ID,omitempty"`
+}
+type GlobalenGNBID struct {
+       Text         string `xml:",chardata"`
+       PLMNIdentity string `xml:"pLMN-Identity"`
+       GNBID        GNBID  `xml:"gNB-ID"`
+}
 
-       if ranParameterType.BitString != nil {
-               return entities.RanParameterType_BIT_STRING
-       }
+type GNBID struct {
+       Text  string `xml:",chardata"`
+       GNBID string `xml:"gNB-ID"`
+}
 
-       if ranParameterType.Enumerated != nil {
-               return entities.RanParameterType_ENUMERATED
-       }
+func (m *E2SetupRequestMessage) ExtractRanFunctionsList() []*entities.RanFunction {
+       // TODO: verify e2SetupRequestIEs structure with Adi
+       e2SetupRequestIes := m.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs
 
-       if ranParameterType.Integer != nil {
-               return entities.RanParameterType_INTEGER
-       }
+       var ranFuntionsList RANfunctionsList
+       var isPopulated bool
 
-       if ranParameterType.OctetString != nil {
-               return entities.RanParameterType_OCTET_STRING
+       for _, v := range e2SetupRequestIes {
+               if v.ID == RanFunctionsAddedID {
+                       ranFuntionsList = v.Value.RANfunctionsList
+                       isPopulated = true
+                       break
+               }
        }
 
-       if ranParameterType.PrintableString != nil {
-               return entities.RanParameterType_PRINTABLE_STRING
+       if !isPopulated {
+               return nil
        }
 
-       return entities.RanParameterType_UNKNOWN_RAN_PARAMETER_TYPE
-}
-
-func buildRicInsertStylesProto(def *RanFunctionDefinition) []*entities.RicInsertStyle {
-       defRicInsertStyleList := def.E2smGnbNrtRanFunctionDefinition.RicInsertStyleList.RicInsertStyleList
-       ricInsertStyles := make([]*entities.RicInsertStyle, len(defRicInsertStyleList))
+       ranFunctionsListContainer := ranFuntionsList.ProtocolIESingleContainer
+       funcs := make([]*entities.RanFunction, len(ranFunctionsListContainer))
+       for i := 0; i < len(funcs); i++ {
+               ranFunctionItem := ranFunctionsListContainer[i].Value.RANfunctionItem
 
-       for i, v := range defRicInsertStyleList {
-               ricInsertStyles[i] = &entities.RicInsertStyle{
-                       RicInsertStyleType:             &wrappers.UInt32Value{Value: v.RicInsertStyleType},
-                       RicInsertStyleName:             &wrappers.StringValue{Value: v.RicInsertStyleName},
-                       RicInsertActionFormatType:      &wrappers.UInt32Value{Value: v.RicInsertActionFormatType},
-                       RicInsertRanParameterDefs:      buildRicInsertRanParameterDefsProto(v),
-                       RicIndicationHeaderFormatType:  &wrappers.UInt32Value{Value: v.RicIndicationHeaderFormatType},
-                       RicIndicationMessageFormatType: &wrappers.UInt32Value{Value: v.RicIndicationMessageFormatType},
-                       RicCallProcessIdFormatType:     &wrappers.UInt32Value{Value: v.RicCallProcessIdFormatType},
+               funcs[i] = &entities.RanFunction{
+                       RanFunctionId:         ranFunctionItem.RanFunctionID,
+                       RanFunctionDefinition: ranFunctionItem.RanFunctionDefinition,
+                       RanFunctionRevision:   ranFunctionItem.RanFunctionRevision,
+                       RanFunctionOid:        ranFunctionItem.RanFunctionOID,
                }
        }
-
-       return ricInsertStyles
+       return funcs
 }
 
-func buildRicInsertRanParameterDefsProto(ricInsertStyleList RicInsertStyleList) []*entities.RanParameterDef {
-       ricInsertRanParameterDefList := ricInsertStyleList.RicInsertRanParameterDefList.RanParameterDefItem
-       ranParameterDefs := make([]*entities.RanParameterDef, len(ricInsertRanParameterDefList))
-
-       for i, v := range ricInsertRanParameterDefList {
-               ranParameterDefs[i] = &entities.RanParameterDef{
-                       RanParameterId:   &wrappers.UInt32Value{Value: v.RanParameterID},
-                       RanParameterName: &wrappers.StringValue{Value: v.RanParameterName},
-                       RanParameterType: getRanParameterTypeEnumValue(v.RanParameterType),
-               }
-       }
-
-       return ranParameterDefs
-}
+func (m *E2SetupRequestMessage) ExtractE2NodeConfigList() []*entities.E2NodeComponentConfig {
+       e2SetupRequestIes := m.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs
+       numOfIes := len(e2SetupRequestIes)
+       var e2NodeConfigListContainer E2NodeConfigList
+       var isPopulated bool
 
-func buildRicControlStylesProto(def *RanFunctionDefinition) []*entities.RicControlStyle {
-       defRicControlStyleList := def.E2smGnbNrtRanFunctionDefinition.RicControlStyleList.RicControlStyleList
-       ricControlStyles := make([]*entities.RicControlStyle, len(defRicControlStyleList))
+       for ieCount := 0; ieCount < numOfIes; ieCount++ {
 
-       for i, v := range defRicControlStyleList {
-               ricControlStyles[i] = &entities.RicControlStyle{
-                       RicControlStyleType:         &wrappers.UInt32Value{Value: v.RicControlStyleType},
-                       RicControlStyleName:         &wrappers.StringValue{Value: v.RicControlStyleName},
-                       RicControlHeaderFormatType:  &wrappers.UInt32Value{Value: v.RicControlHeaderFormatType},
-                       RicControlMessageFormatType: &wrappers.UInt32Value{Value: v.RicControlMessageFormatType},
-                       RicCallProcessIdFormatType:  &wrappers.UInt32Value{Value: v.RicCallProcessIdFormatType},
+               if e2SetupRequestIes[ieCount].ID == E2nodeConfigAdditionID {
+                       e2NodeConfigListContainer = e2SetupRequestIes[ieCount].Value.E2NodeConfigList
+                       isPopulated = true
+                       break
                }
        }
 
-       return ricControlStyles
-}
-
-func buildRicPolicyRanParameterDefsProto(ricPolicyStyleList RicPolicyStyleList) []*entities.RanParameterDef {
-       ricPolicyRanParameterDefList := ricPolicyStyleList.RicPolicyRanParameterDefList.RanParameterDefItem
-       ranParameterDefs := make([]*entities.RanParameterDef, len(ricPolicyRanParameterDefList))
-
-       for i, v := range ricPolicyRanParameterDefList {
-               ranParameterDefs[i] = &entities.RanParameterDef{
-                       RanParameterId:   &wrappers.UInt32Value{Value: v.RanParameterID},
-                       RanParameterName: &wrappers.StringValue{Value: v.RanParameterName},
-                       RanParameterType: getRanParameterTypeEnumValue(v.RanParameterType),
-               }
+       if !isPopulated {
+               return nil
        }
 
-       return ranParameterDefs
+       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 {
+                       if gnbid := e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeXN.GlobalNGRANNodeID.GlobalgNBID; gnbid != nil {
+                               e2nodeComponentConfigs[i] = &entities.E2NodeComponentConfig{
+                                       E2NodeComponentInterfaceType: entities.E2NodeComponentInterfaceType_xn,
+                                       E2NodeComponentRequestPart:   e2NodeConfigItem.E2nodeConfiguration.E2NodeRequestPart,
+                                       E2NodeComponentResponsePart:  e2NodeConfigItem.E2nodeConfiguration.E2NodeResponsePart,
+                                       E2NodeComponentID: &entities.E2NodeComponentConfig_E2NodeComponentInterfaceTypeXn{
+                                               E2NodeComponentInterfaceTypeXn: &entities.E2NodeComponentInterfaceXn{
+                                                       GlobalNgRanNodeId: &entities.E2NodeComponentInterfaceXn_GlobalGnbId{
+                                                               GlobalGnbId: &entities.GlobalGNBID{
+                                                                       PlmnIdentity: e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeXN.GlobalNGRANNodeID.GlobalgNBID.PLMNID,
+                                                                       GnbId:        e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeXN.GlobalNGRANNodeID.GlobalgNBID.GnbID.GnbID,
+                                                                       GnbType:      1,
+                                                               },
+                                                       },
+                                               },
+                                       },
+                               }
+
+                       } else if ngenb := e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeXN.GlobalNGRANNodeID.GlobalngeNBID; ngenb != nil {
+                               if ngenbid := e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeXN.GlobalNGRANNodeID.GlobalngeNBID.EnbID.EnbIdMacro; ngenbid != "" && len(ngenbid) == 20 {
+                                       e2nodeComponentConfigs[i] = &entities.E2NodeComponentConfig{
+                                               E2NodeComponentInterfaceType: entities.E2NodeComponentInterfaceType_xn,
+                                               E2NodeComponentRequestPart:   e2NodeConfigItem.E2nodeConfiguration.E2NodeRequestPart,
+                                               E2NodeComponentResponsePart:  e2NodeConfigItem.E2nodeConfiguration.E2NodeResponsePart,
+                                               E2NodeComponentID: &entities.E2NodeComponentConfig_E2NodeComponentInterfaceTypeXn{
+                                                       E2NodeComponentInterfaceTypeXn: &entities.E2NodeComponentInterfaceXn{
+                                                               GlobalNgRanNodeId: &entities.E2NodeComponentInterfaceXn_GlobalNgenbId{
+                                                                       GlobalNgenbId: &entities.GlobalNGENBID{
+                                                                               PlmnIdentity: e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeXN.GlobalNGRANNodeID.GlobalngeNBID.PLMNID,
+                                                                               EnbId:        e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeXN.GlobalNGRANNodeID.GlobalngeNBID.EnbID.EnbIdMacro,
+                                                                               EnbType:      1,
+                                                                       },
+                                                               },
+                                                       },
+                                               },
+                                       }
+                               } else if ngenbid := e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeXN.GlobalNGRANNodeID.GlobalngeNBID.EnbID.EnbIdShortMacro; ngenbid != "" && len(ngenbid) == 18 {
+                                       e2nodeComponentConfigs[i] = &entities.E2NodeComponentConfig{
+                                               E2NodeComponentInterfaceType: entities.E2NodeComponentInterfaceType_xn,
+                                               E2NodeComponentRequestPart:   e2NodeConfigItem.E2nodeConfiguration.E2NodeRequestPart,
+                                               E2NodeComponentResponsePart:  e2NodeConfigItem.E2nodeConfiguration.E2NodeResponsePart,
+                                               E2NodeComponentID: &entities.E2NodeComponentConfig_E2NodeComponentInterfaceTypeXn{
+                                                       E2NodeComponentInterfaceTypeXn: &entities.E2NodeComponentInterfaceXn{
+                                                               GlobalNgRanNodeId: &entities.E2NodeComponentInterfaceXn_GlobalNgenbId{
+                                                                       GlobalNgenbId: &entities.GlobalNGENBID{
+                                                                               PlmnIdentity: e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeXN.GlobalNGRANNodeID.GlobalngeNBID.PLMNID,
+                                                                               EnbId:        e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeXN.GlobalNGRANNodeID.GlobalngeNBID.EnbID.EnbIdShortMacro,
+                                                                               EnbType:      3,
+                                                                       },
+                                                               },
+                                                       },
+                                               },
+                                       }
+                               } else if ngenbid := e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeXN.GlobalNGRANNodeID.GlobalngeNBID.EnbID.EnbIdLongMacro; ngenbid != "" && len(ngenbid) == 21 {
+                                       e2nodeComponentConfigs[i] = &entities.E2NodeComponentConfig{
+                                               E2NodeComponentInterfaceType: entities.E2NodeComponentInterfaceType_xn,
+                                               E2NodeComponentRequestPart:   e2NodeConfigItem.E2nodeConfiguration.E2NodeRequestPart,
+                                               E2NodeComponentResponsePart:  e2NodeConfigItem.E2nodeConfiguration.E2NodeResponsePart,
+                                               E2NodeComponentID: &entities.E2NodeComponentConfig_E2NodeComponentInterfaceTypeXn{
+                                                       E2NodeComponentInterfaceTypeXn: &entities.E2NodeComponentInterfaceXn{
+                                                               GlobalNgRanNodeId: &entities.E2NodeComponentInterfaceXn_GlobalNgenbId{
+                                                                       GlobalNgenbId: &entities.GlobalNGENBID{
+                                                                               PlmnIdentity: e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeXN.GlobalNGRANNodeID.GlobalngeNBID.PLMNID,
+                                                                               EnbId:        e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeXN.GlobalNGRANNodeID.GlobalngeNBID.EnbID.EnbIdLongMacro,
+                                                                               EnbType:      4,
+                                                                       },
+                                                               },
+                                                       },
+                                               },
+                                       }
+                               }
+                       } else {
+                               //not valid
+                       }
+               } else if e2NodeConfigItem.E2nodeComponentType.X2 != nil {
+                       if gnbid := e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalenGNBID; gnbid != nil {
+                               e2nodeComponentConfigs[i] = &entities.E2NodeComponentConfig{
+                                       E2NodeComponentInterfaceType: entities.E2NodeComponentInterfaceType_x2,
+                                       E2NodeComponentRequestPart:   e2NodeConfigItem.E2nodeConfiguration.E2NodeRequestPart,
+                                       E2NodeComponentResponsePart:  e2NodeConfigItem.E2nodeConfiguration.E2NodeResponsePart,
+                                       E2NodeComponentID: &entities.E2NodeComponentConfig_E2NodeComponentInterfaceTypeX2{
+                                               E2NodeComponentInterfaceTypeX2: &entities.E2NodeComponentInterfaceX2{
+                                                       GlobalEngnbId: &entities.GlobalENGNBID{
+                                                               PlmnIdentity: e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalenGNBID.PLMNIdentity,
+                                                               GnbId:        e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalenGNBID.GNBID.GNBID,
+                                                               GnbType:      1,
+                                                       },
+                                               },
+                                       },
+                               }
+                       } else if enb := e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalENBID; enb != nil {
+                               if enbid := e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalENBID.ENBID.MacroEnbId; enbid != "" && len(enbid) == 20 {
+                                       e2nodeComponentConfigs[i] = &entities.E2NodeComponentConfig{
+                                               E2NodeComponentInterfaceType: entities.E2NodeComponentInterfaceType_x2,
+                                               E2NodeComponentRequestPart:   e2NodeConfigItem.E2nodeConfiguration.E2NodeRequestPart,
+                                               E2NodeComponentResponsePart:  e2NodeConfigItem.E2nodeConfiguration.E2NodeResponsePart,
+                                               E2NodeComponentID: &entities.E2NodeComponentConfig_E2NodeComponentInterfaceTypeX2{
+                                                       E2NodeComponentInterfaceTypeX2: &entities.E2NodeComponentInterfaceX2{
+                                                               GlobalEnbId: &entities.GlobalENBID{
+                                                                       PlmnIdentity: e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalENBID.PLMNIdentity,
+                                                                       EnbId:        e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalENBID.ENBID.MacroEnbId,
+                                                                       EnbType:      1,
+                                                               },
+                                                       },
+                                               },
+                                       }
+                               } else if enbid := e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalENBID.ENBID.HomeEnbId; enbid != "" && len(enbid) == 28 {
+                                       e2nodeComponentConfigs[i] = &entities.E2NodeComponentConfig{
+                                               E2NodeComponentInterfaceType: entities.E2NodeComponentInterfaceType_x2,
+                                               E2NodeComponentRequestPart:   e2NodeConfigItem.E2nodeConfiguration.E2NodeRequestPart,
+                                               E2NodeComponentResponsePart:  e2NodeConfigItem.E2nodeConfiguration.E2NodeResponsePart,
+                                               E2NodeComponentID: &entities.E2NodeComponentConfig_E2NodeComponentInterfaceTypeX2{
+                                                       E2NodeComponentInterfaceTypeX2: &entities.E2NodeComponentInterfaceX2{
+                                                               GlobalEnbId: &entities.GlobalENBID{
+                                                                       PlmnIdentity: e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalENBID.PLMNIdentity,
+                                                                       EnbId:        e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalENBID.ENBID.HomeEnbId,
+                                                                       EnbType:      2,
+                                                               },
+                                                       },
+                                               },
+                                       }
+                               } else if enbid := e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalENBID.ENBID.ShortMacroEnbId; enbid != "" && len(enbid) == 18 {
+                                       e2nodeComponentConfigs[i] = &entities.E2NodeComponentConfig{
+                                               E2NodeComponentInterfaceType: entities.E2NodeComponentInterfaceType_x2,
+                                               E2NodeComponentRequestPart:   e2NodeConfigItem.E2nodeConfiguration.E2NodeRequestPart,
+                                               E2NodeComponentResponsePart:  e2NodeConfigItem.E2nodeConfiguration.E2NodeResponsePart,
+                                               E2NodeComponentID: &entities.E2NodeComponentConfig_E2NodeComponentInterfaceTypeX2{
+                                                       E2NodeComponentInterfaceTypeX2: &entities.E2NodeComponentInterfaceX2{
+                                                               GlobalEnbId: &entities.GlobalENBID{
+                                                                       PlmnIdentity: e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalENBID.PLMNIdentity,
+                                                                       EnbId:        e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalENBID.ENBID.ShortMacroEnbId,
+                                                                       EnbType:      3,
+                                                               },
+                                                       },
+                                               },
+                                       }
+                               } else if enbid := e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalENBID.ENBID.LongMacroEnbId; enbid != "" && len(enbid) == 21 {
+                                       e2nodeComponentConfigs[i] = &entities.E2NodeComponentConfig{
+                                               E2NodeComponentInterfaceType: entities.E2NodeComponentInterfaceType_x2,
+                                               E2NodeComponentRequestPart:   e2NodeConfigItem.E2nodeConfiguration.E2NodeRequestPart,
+                                               E2NodeComponentResponsePart:  e2NodeConfigItem.E2nodeConfiguration.E2NodeResponsePart,
+                                               E2NodeComponentID: &entities.E2NodeComponentConfig_E2NodeComponentInterfaceTypeX2{
+                                                       E2NodeComponentInterfaceTypeX2: &entities.E2NodeComponentInterfaceX2{
+                                                               GlobalEnbId: &entities.GlobalENBID{
+                                                                       PlmnIdentity: e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalENBID.PLMNIdentity,
+                                                                       EnbId:        e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalENBID.ENBID.LongMacroEnbId,
+                                                                       EnbType:      4,
+                                                               },
+                                                       },
+                                               },
+                                       }
+                               }
+                       } else {
+                               //not valid
+                       }
+               } //end of x2
+       }
+       return e2nodeComponentConfigs
 }
 
-func buildRicPolicyStylesProto(def *RanFunctionDefinition) []*entities.RicPolicyStyle {
-       defRicPolicyStyleList := def.E2smGnbNrtRanFunctionDefinition.RicPolicyStyleList.RicPolicyStyleList
-       ricPolicyStyles := make([]*entities.RicPolicyStyle, len(defRicPolicyStyleList))
+func (m *E2SetupRequestMessage) getGlobalE2NodeId() GlobalE2NodeId {
+
+       // TODO: Handle error case if GlobalE2NodeId not available
+       e2SetupRequestIes := m.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs
+       numOfIes := len(e2SetupRequestIes)
+       index := 1
 
-       for i, v := range defRicPolicyStyleList {
-               ricPolicyStyles[i] = &entities.RicPolicyStyle{
-                       RicPolicyStyleType:        &wrappers.UInt32Value{Value: v.RicPolicyStyleType},
-                       RicPolicyStyleName:        &wrappers.StringValue{Value: v.RicPolicyStyleName},
-                       RicPolicyActionFormatType: &wrappers.UInt32Value{Value: v.RicPolicyActionFormatType},
-                       RicPolicyRanParameterDefs: buildRicPolicyRanParameterDefsProto(v),
+       for ieCount := 0; ieCount < numOfIes; ieCount++ {
+               if e2SetupRequestIes[ieCount].ID == GlobalE2nodeID {
+                       index = ieCount
+                       break
                }
        }
 
-       return ricPolicyStyles
-}
-
-func (m *E2SetupRequestMessage) getGlobalE2NodeId() GlobalE2NodeId {
-       return m.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs[0].Value.GlobalE2nodeID
+       return m.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs[index].Value.GlobalE2nodeID
 }
 
 func (m *E2SetupRequestMessage) GetPlmnId() string {