RIC-961:implement Xn and X2 component IDs correctly in E2M
[ric-plt/e2mgr.git] / E2Manager / models / e2_setup_request_message.go
1 //
2 // Copyright 2019 AT&T Intellectual Property
3 // Copyright 2019 Nokia
4 // Copyright (c) 2022 Samsung Electronics Co., Ltd. All Rights Reserved.
5 //
6 // Licensed under the Apache License, Version 2.0 (the "License");
7 // you may not use this file except in compliance with the License.
8 // You may obtain a copy of the License at
9 //
10 //      http://www.apache.org/licenses/LICENSE-2.0
11 //
12 // Unless required by applicable law or agreed to in writing, software
13 // distributed under the License is distributed on an "AS IS" BASIS,
14 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 // See the License for the specific language governing permissions and
16 // limitations under the License.
17
18 //  This source code is part of the near-RT RIC (RAN Intelligent Controller)
19 //  platform project (RICP).
20
21 package models
22
23 import (
24         "encoding/xml"
25         "strings"
26
27         "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
28 )
29
30 type Gnb struct {
31         Text        string `xml:",chardata"`
32         GlobalGNBID struct {
33                 Text   string `xml:",chardata"`
34                 PlmnID string `xml:"plmn-id"`
35                 GnbID  struct {
36                         Text  string `xml:",chardata"`
37                         GnbID string `xml:"gnb-ID"`
38                 } `xml:"gnb-id"`
39         } `xml:"global-gNB-ID"`
40 }
41
42 type EnGnb struct {
43         Text        string `xml:",chardata"`
44         GlobalGNBID struct {
45                 Text   string `xml:",chardata"`
46                 PlmnID string `xml:"pLMN-Identity"`
47                 GnbID  struct {
48                         Text  string `xml:",chardata"`
49                         GnbID string `xml:"gNB-ID"`
50                 } `xml:"gNB-ID"`
51         } `xml:"global-gNB-ID"`
52 }
53
54 type NgEnbId struct {
55         Text            string `xml:",chardata"`
56         EnbIdMacro      string `xml:"enb-ID-macro"`
57         EnbIdShortMacro string `xml:"enb-ID-shortmacro"`
58         EnbIdLongMacro  string `xml:"enb-ID-longmacro"`
59 }
60
61 type NgEnb struct {
62         Text          string `xml:",chardata"`
63         GlobalNgENBID struct {
64                 Text   string  `xml:",chardata"`
65                 PlmnID string  `xml:"plmn-id"`
66                 EnbID  NgEnbId `xml:"enb-id"`
67         } `xml:"global-ng-eNB-ID"`
68 }
69
70 type EnbId struct {
71         Text            string `xml:",chardata"`
72         MacroEnbId      string `xml:"macro-eNB-ID"`
73         HomeEnbId       string `xml:"home-eNB-ID"`
74         ShortMacroEnbId string `xml:"short-Macro-eNB-ID"`
75         LongMacroEnbId  string `xml:"long-Macro-eNB-ID"`
76 }
77
78 type Enb struct {
79         Text        string `xml:",chardata"`
80         GlobalENBID struct {
81                 Text   string `xml:",chardata"`
82                 PlmnID string `xml:"pLMN-Identity"`
83                 EnbID  EnbId  `xml:"eNB-ID"`
84         } `xml:"global-eNB-ID"`
85 }
86
87 type GlobalE2NodeId struct {
88         Text  string `xml:",chardata"`
89         GNB   Gnb    `xml:"gNB"`
90         EnGNB EnGnb  `xml:"en-gNB"`
91         NgENB NgEnb  `xml:"ng-eNB"`
92         ENB   Enb    `xml:"eNB"`
93 }
94
95 type E2SetupRequest struct {
96         Text        string `xml:",chardata"`
97         ProtocolIEs struct {
98                 Text              string `xml:",chardata"`
99                 E2setupRequestIEs []struct {
100                         Text        string `xml:",chardata"`
101                         ID          string `xml:"id"`
102                         Criticality struct {
103                                 Text   string `xml:",chardata"`
104                                 Reject string `xml:"reject"`
105                         } `xml:"criticality"`
106                         Value struct {
107                                 Text             string           `xml:",chardata"`
108                                 TransactionID    string           `xml:"TransactionID"`
109                                 GlobalE2nodeID   GlobalE2NodeId   `xml:"GlobalE2node-ID"`
110                                 RANfunctionsList RANfunctionsList `xml:"RANfunctions-List"`
111                                 E2NodeConfigList E2NodeConfigList `xml:"E2nodeComponentConfigAddition-List"`
112                         } `xml:"value"`
113                 } `xml:"E2setupRequestIEs"`
114         } `xml:"protocolIEs"`
115 }
116
117 type E2SetupRequestMessage struct {
118         XMLName xml.Name `xml:"E2SetupRequestMessage"`
119         Text    string   `xml:",chardata"`
120         E2APPDU struct {
121                 Text              string `xml:",chardata"`
122                 InitiatingMessage struct {
123                         Text          string `xml:",chardata"`
124                         ProcedureCode string `xml:"procedureCode"`
125                         Criticality   struct {
126                                 Text   string `xml:",chardata"`
127                                 Reject string `xml:"reject"`
128                         } `xml:"criticality"`
129                         Value struct {
130                                 Text           string         `xml:",chardata"`
131                                 E2setupRequest E2SetupRequest `xml:"E2setupRequest"`
132                         } `xml:"value"`
133                 } `xml:"initiatingMessage"`
134         } `xml:"E2AP-PDU"`
135 }
136
137 type RanFunctionItem struct {
138         Text                  string `xml:",chardata"`
139         RanFunctionID         uint32 `xml:"ranFunctionID"`
140         RanFunctionDefinition string `xml:"ranFunctionDefinition"`
141         RanFunctionRevision   uint32 `xml:"ranFunctionRevision"`
142         RanFunctionOID        string `xml:"ranFunctionOID"`
143 }
144
145 type RANfunctionsList struct {
146         Text                      string `xml:",chardata"`
147         ProtocolIESingleContainer []struct {
148                 Text        string `xml:",chardata"`
149                 ID          string `xml:"id"`
150                 Criticality struct {
151                         Text   string `xml:",chardata"`
152                         Reject string `xml:"reject"`
153                 } `xml:"criticality"`
154                 Value struct {
155                         Text            string          `xml:",chardata"`
156                         RANfunctionItem RanFunctionItem `xml:"RANfunction-Item"`
157                 } `xml:"value"`
158         } `xml:"ProtocolIE-SingleContainer"`
159 }
160
161 type E2NodeConfigList struct {
162         Text                      string `xml:",chardata"`
163         ProtocolIESingleContainer []struct {
164                 Text        string `xml:",chardata"`
165                 ID          string `xml:"id"`
166                 Criticality struct {
167                         Text   string `xml:",chardata"`
168                         Reject string `xml:"reject"`
169                 } `xml:"criticality"`
170                 Value struct {
171                         Text                     string                   `xml:",chardata"`
172                         E2nodeConfigAdditionItem E2NodeConfigAdditionItem `xml:"E2nodeComponentConfigAddition-Item"`
173                 } `xml:"value"`
174         } `xml:"ProtocolIE-SingleContainer"`
175 }
176
177 type E2NodeComponentType struct {
178         Text string    `xml:",chardata"`
179         NG   *struct{} `xml:"ng"`
180         XN   *struct{} `xml:"xn"`
181         E1   *struct{} `xml:"e1"`
182         F1   *struct{} `xml:"f1"`
183         W1   *struct{} `xml:"w1"`
184         S1   *struct{} `xml:"s1"`
185         X2   *struct{} `xml:"x2"`
186 }
187
188 type E2NodeConfigAdditionItem struct {
189         Text                string              `xml:",chardata"`
190         E2nodeComponentType E2NodeComponentType `xml:"e2nodeComponentInterfaceType"`
191         E2nodeComponentID   E2NodeComponentId   `xml:"e2nodeComponentID"`
192         E2nodeConfiguration E2NodeConfigValue   `xml:"e2nodeComponentConfiguration"`
193 }
194
195 type E2NodeConfigValue struct {
196         Text               string `xml:",chardata"`
197         E2NodeRequestPart  []byte `xml:"e2nodeComponentRequestPart"`
198         E2NodeResponsePart []byte `xml:"e2nodeComponentResponsePart"`
199 }
200
201 type E2NodeComponentId struct {
202         Text           string `xml:",chardata"`
203         E2NodeIFTypeNG E2NodeIFTypeNG
204         E2NodeIFTypeXN E2NodeIFTypeXN
205         E2NodeIFTypeE1 E2NodeIFTypeE1
206         E2NodeIFTypeF1 E2NodeIFTypeF1
207         E2NodeIFTypeW1 E2NodeIFTypeW1
208         E2NodeIFTypeS1 E2NodeIFTypeS1
209         E2NodeIFTypeX2 E2NodeIFTypeX2
210 }
211
212 type E2NodeIFTypeNG struct {
213         XMLName xml.Name `xml:"e2nodeComponentInterfaceTypeNG"`
214         Text    string   `xml:",chardata"`
215         AMFName string   `xml:"amf-name"`
216 }
217
218 type E2NodeIFTypeXN struct {
219         XMLName           xml.Name `xml:"e2nodeComponentInterfaceTypeXn"`
220         Text              string   `xml:",chardata"`
221         GlobalNGRANNodeID struct {
222                 Text          string   `xml:",chardata"`
223                 GlobalgNBID   *GNB     `xml:"gNB,omitempty"`
224                 GlobalngeNBID *NgeNBID `xml:"ng-eNB,omitempty"`
225         } `xml:"global-NG-RAN-Node-ID"`
226 }
227
228 type GNB struct {
229         Text   string `xml:",chardata"`
230         PLMNID string `xml:"plmn-id"`
231         GnbID  GnbID  `xml:"gnb-id"`
232 }
233 type GnbID struct {
234         Text  string `xml:",chardata"`
235         GnbID string `xml:"gnb-ID"`
236 }
237
238 type NgeNBID struct {
239         Text   string    `xml:",chardata"`
240         PLMNID string    `xml:"plmn-id"`
241         EnbID  *EnbID_Xn `xml:"enb-id"`
242 }
243
244 type EnbID_Xn struct {
245         Text            string `xml:",chardata"`
246         EnbIdMacro      string `xml:"enb-ID-macro,omitempty"`
247         EnbIdShortMacro string `xml:"enb-ID-shortmacro,omitempty"`
248         EnbIdLongMacro  string `xml:"enb-ID-longmacro,omitempty"`
249 }
250
251 type E2NodeIFTypeE1 struct {
252         XMLName   xml.Name `xml:"e2nodeComponentInterfaceTypeE1"`
253         Text      string   `xml:",chardata"`
254         GNBCUCPID int64    `xml:"gNB-CU-CP-ID"`
255 }
256
257 type E2NodeIFTypeF1 struct {
258         XMLName xml.Name `xml:"e2nodeComponentInterfaceTypeF1"`
259         Text    string   `xml:",chardata"`
260         GNBDUID int64    `xml:"gNB-DU-ID"`
261 }
262
263 type E2NodeIFTypeW1 struct {
264         XMLName   xml.Name `xml:"e2nodeComponentInterfaceTypeW1"`
265         Text      string   `xml:",chardata"`
266         NGENBDUID int64    `xml:"ng-eNB-DU-ID"`
267 }
268
269 type E2NodeIFTypeS1 struct {
270         XMLName xml.Name `xml:"e2nodeComponentInterfaceTypeS1"`
271         Text    string   `xml:",chardata"`
272         MMENAME string   `xml:"mme-name"`
273 }
274 type E2NodeIFTypeX2 struct {
275         XMLName       xml.Name       `xml:"e2nodeComponentInterfaceTypeX2"`
276         Text          string         `xml:",chardata"`
277         GlobalENBID   *GlobalENBID   `xml:"global-eNB-ID,omitempty"`
278         GlobalenGNBID *GlobalenGNBID `xml:"global-en-gNB-ID,omitempty"`
279 }
280 type GlobalENBID struct {
281         Text         string    `xml:",chardata"`
282         PLMNIdentity string    `xml:"pLMN-Identity"`
283         ENBID        *ENBID_X2 `xml:"eNB-ID"`
284 }
285 type ENBID_X2 struct {
286         Text            string `xml:",chardata"`
287         MacroEnbId      string `xml:"macro-eNB-ID,omitempty"`
288         HomeEnbId       string `xml:"home-eNB-ID,omitempty"`
289         ShortMacroEnbId string `xml:"short-Macro-eNB-ID,omitempty"`
290         LongMacroEnbId  string `xml:"long-Macro-eNB-ID,omitempty"`
291 }
292 type GlobalenGNBID struct {
293         Text         string `xml:",chardata"`
294         PLMNIdentity string `xml:"pLMN-Identity"`
295         GNBID        GNBID  `xml:"gNB-ID"`
296 }
297
298 type GNBID struct {
299         Text  string `xml:",chardata"`
300         GNBID string `xml:"gNB-ID"`
301 }
302
303 func (m *E2SetupRequestMessage) ExtractRanFunctionsList() []*entities.RanFunction {
304         // TODO: verify e2SetupRequestIEs structure with Adi
305         e2SetupRequestIes := m.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs
306
307         var ranFuntionsList RANfunctionsList
308         var isPopulated bool
309
310         for _, v := range e2SetupRequestIes {
311                 if v.ID == RanFunctionsAddedID {
312                         ranFuntionsList = v.Value.RANfunctionsList
313                         isPopulated = true
314                         break
315                 }
316         }
317
318         if !isPopulated {
319                 return nil
320         }
321
322         ranFunctionsListContainer := ranFuntionsList.ProtocolIESingleContainer
323         funcs := make([]*entities.RanFunction, len(ranFunctionsListContainer))
324         for i := 0; i < len(funcs); i++ {
325                 ranFunctionItem := ranFunctionsListContainer[i].Value.RANfunctionItem
326
327                 funcs[i] = &entities.RanFunction{
328                         RanFunctionId:         ranFunctionItem.RanFunctionID,
329                         RanFunctionDefinition: ranFunctionItem.RanFunctionDefinition,
330                         RanFunctionRevision:   ranFunctionItem.RanFunctionRevision,
331                         RanFunctionOid:        ranFunctionItem.RanFunctionOID,
332                 }
333         }
334         return funcs
335 }
336
337 func (m *E2SetupRequestMessage) ExtractE2NodeConfigList() []*entities.E2NodeComponentConfig {
338         e2SetupRequestIes := m.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs
339         numOfIes := len(e2SetupRequestIes)
340         var e2NodeConfigListContainer E2NodeConfigList
341         var isPopulated bool
342
343         for ieCount := 0; ieCount < numOfIes; ieCount++ {
344
345                 if e2SetupRequestIes[ieCount].ID == E2nodeConfigAdditionID {
346                         e2NodeConfigListContainer = e2SetupRequestIes[ieCount].Value.E2NodeConfigList
347                         isPopulated = true
348                         break
349                 }
350         }
351
352         if !isPopulated {
353                 return nil
354         }
355
356         e2nodeComponentConfigs := make([]*entities.E2NodeComponentConfig, len(e2NodeConfigListContainer.ProtocolIESingleContainer))
357         for i := 0; i < len(e2nodeComponentConfigs); i++ {
358                 e2NodeConfigItem := e2NodeConfigListContainer.ProtocolIESingleContainer[i].Value.E2nodeConfigAdditionItem
359
360                 if e2NodeConfigItem.E2nodeComponentType.NG != nil {
361                         e2nodeComponentConfigs[i] = &entities.E2NodeComponentConfig{
362                                 E2NodeComponentInterfaceType: entities.E2NodeComponentInterfaceType_ng,
363                                 E2NodeComponentRequestPart:   e2NodeConfigItem.E2nodeConfiguration.E2NodeRequestPart,
364                                 E2NodeComponentResponsePart:  e2NodeConfigItem.E2nodeConfiguration.E2NodeResponsePart,
365                                 E2NodeComponentID: &entities.E2NodeComponentConfig_E2NodeComponentInterfaceTypeNG{
366                                         E2NodeComponentInterfaceTypeNG: &entities.E2NodeComponentInterfaceNG{
367                                                 AmfName: e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeNG.AMFName,
368                                         },
369                                 },
370                         }
371                 } else if e2NodeConfigItem.E2nodeComponentType.E1 != nil {
372                         e2nodeComponentConfigs[i] = &entities.E2NodeComponentConfig{
373                                 E2NodeComponentInterfaceType: entities.E2NodeComponentInterfaceType_e1,
374                                 E2NodeComponentRequestPart:   e2NodeConfigItem.E2nodeConfiguration.E2NodeRequestPart,
375                                 E2NodeComponentResponsePart:  e2NodeConfigItem.E2nodeConfiguration.E2NodeResponsePart,
376                                 E2NodeComponentID: &entities.E2NodeComponentConfig_E2NodeComponentInterfaceTypeE1{
377                                         E2NodeComponentInterfaceTypeE1: &entities.E2NodeComponentInterfaceE1{
378                                                 GNBCuCpId: e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeE1.GNBCUCPID,
379                                         },
380                                 },
381                         }
382                 } else if e2NodeConfigItem.E2nodeComponentType.F1 != nil {
383                         e2nodeComponentConfigs[i] = &entities.E2NodeComponentConfig{
384                                 E2NodeComponentInterfaceType: entities.E2NodeComponentInterfaceType_f1,
385                                 E2NodeComponentRequestPart:   e2NodeConfigItem.E2nodeConfiguration.E2NodeRequestPart,
386                                 E2NodeComponentResponsePart:  e2NodeConfigItem.E2nodeConfiguration.E2NodeResponsePart,
387                                 E2NodeComponentID: &entities.E2NodeComponentConfig_E2NodeComponentInterfaceTypeF1{
388                                         E2NodeComponentInterfaceTypeF1: &entities.E2NodeComponentInterfaceF1{
389                                                 GNBDuId: e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeF1.GNBDUID,
390                                         },
391                                 },
392                         }
393                 } else if e2NodeConfigItem.E2nodeComponentType.W1 != nil {
394                         e2nodeComponentConfigs[i] = &entities.E2NodeComponentConfig{
395                                 E2NodeComponentInterfaceType: entities.E2NodeComponentInterfaceType_w1,
396                                 E2NodeComponentRequestPart:   e2NodeConfigItem.E2nodeConfiguration.E2NodeRequestPart,
397                                 E2NodeComponentResponsePart:  e2NodeConfigItem.E2nodeConfiguration.E2NodeResponsePart,
398                                 E2NodeComponentID: &entities.E2NodeComponentConfig_E2NodeComponentInterfaceTypeW1{
399                                         E2NodeComponentInterfaceTypeW1: &entities.E2NodeComponentInterfaceW1{
400                                                 NgenbDuId: e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeW1.NGENBDUID,
401                                         },
402                                 },
403                         }
404                 } else if e2NodeConfigItem.E2nodeComponentType.S1 != nil {
405                         e2nodeComponentConfigs[i] = &entities.E2NodeComponentConfig{
406                                 E2NodeComponentInterfaceType: entities.E2NodeComponentInterfaceType_s1,
407                                 E2NodeComponentRequestPart:   e2NodeConfigItem.E2nodeConfiguration.E2NodeRequestPart,
408                                 E2NodeComponentResponsePart:  e2NodeConfigItem.E2nodeConfiguration.E2NodeResponsePart,
409                                 E2NodeComponentID: &entities.E2NodeComponentConfig_E2NodeComponentInterfaceTypeS1{
410                                         E2NodeComponentInterfaceTypeS1: &entities.E2NodeComponentInterfaceS1{
411                                                 MmeName: e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeS1.MMENAME,
412                                         },
413                                 },
414                         }
415                 } else if e2NodeConfigItem.E2nodeComponentType.XN != nil {
416                         if gnbid := e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeXN.GlobalNGRANNodeID.GlobalgNBID; gnbid != nil {
417                                 e2nodeComponentConfigs[i] = &entities.E2NodeComponentConfig{
418                                         E2NodeComponentInterfaceType: entities.E2NodeComponentInterfaceType_xn,
419                                         E2NodeComponentRequestPart:   e2NodeConfigItem.E2nodeConfiguration.E2NodeRequestPart,
420                                         E2NodeComponentResponsePart:  e2NodeConfigItem.E2nodeConfiguration.E2NodeResponsePart,
421                                         E2NodeComponentID: &entities.E2NodeComponentConfig_E2NodeComponentInterfaceTypeXn{
422                                                 E2NodeComponentInterfaceTypeXn: &entities.E2NodeComponentInterfaceXn{
423                                                         GlobalNgRanNodeId: &entities.E2NodeComponentInterfaceXn_GlobalGnbId{
424                                                                 GlobalGnbId: &entities.GlobalGNBID{
425                                                                         PlmnIdentity: e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeXN.GlobalNGRANNodeID.GlobalgNBID.PLMNID,
426                                                                         GnbId:        e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeXN.GlobalNGRANNodeID.GlobalgNBID.GnbID.GnbID,
427                                                                         GnbType:      1,
428                                                                 },
429                                                         },
430                                                 },
431                                         },
432                                 }
433
434                         } else if ngenb := e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeXN.GlobalNGRANNodeID.GlobalngeNBID; ngenb != nil {
435                                 if ngenbid := e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeXN.GlobalNGRANNodeID.GlobalngeNBID.EnbID.EnbIdMacro; ngenbid != "" && len(ngenbid) == 20 {
436                                         e2nodeComponentConfigs[i] = &entities.E2NodeComponentConfig{
437                                                 E2NodeComponentInterfaceType: entities.E2NodeComponentInterfaceType_xn,
438                                                 E2NodeComponentRequestPart:   e2NodeConfigItem.E2nodeConfiguration.E2NodeRequestPart,
439                                                 E2NodeComponentResponsePart:  e2NodeConfigItem.E2nodeConfiguration.E2NodeResponsePart,
440                                                 E2NodeComponentID: &entities.E2NodeComponentConfig_E2NodeComponentInterfaceTypeXn{
441                                                         E2NodeComponentInterfaceTypeXn: &entities.E2NodeComponentInterfaceXn{
442                                                                 GlobalNgRanNodeId: &entities.E2NodeComponentInterfaceXn_GlobalNgenbId{
443                                                                         GlobalNgenbId: &entities.GlobalNGENBID{
444                                                                                 PlmnIdentity: e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeXN.GlobalNGRANNodeID.GlobalngeNBID.PLMNID,
445                                                                                 EnbId:        e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeXN.GlobalNGRANNodeID.GlobalngeNBID.EnbID.EnbIdMacro,
446                                                                                 EnbType:      1,
447                                                                         },
448                                                                 },
449                                                         },
450                                                 },
451                                         }
452                                 } else if ngenbid := e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeXN.GlobalNGRANNodeID.GlobalngeNBID.EnbID.EnbIdShortMacro; ngenbid != "" && len(ngenbid) == 18 {
453                                         e2nodeComponentConfigs[i] = &entities.E2NodeComponentConfig{
454                                                 E2NodeComponentInterfaceType: entities.E2NodeComponentInterfaceType_xn,
455                                                 E2NodeComponentRequestPart:   e2NodeConfigItem.E2nodeConfiguration.E2NodeRequestPart,
456                                                 E2NodeComponentResponsePart:  e2NodeConfigItem.E2nodeConfiguration.E2NodeResponsePart,
457                                                 E2NodeComponentID: &entities.E2NodeComponentConfig_E2NodeComponentInterfaceTypeXn{
458                                                         E2NodeComponentInterfaceTypeXn: &entities.E2NodeComponentInterfaceXn{
459                                                                 GlobalNgRanNodeId: &entities.E2NodeComponentInterfaceXn_GlobalNgenbId{
460                                                                         GlobalNgenbId: &entities.GlobalNGENBID{
461                                                                                 PlmnIdentity: e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeXN.GlobalNGRANNodeID.GlobalngeNBID.PLMNID,
462                                                                                 EnbId:        e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeXN.GlobalNGRANNodeID.GlobalngeNBID.EnbID.EnbIdShortMacro,
463                                                                                 EnbType:      3,
464                                                                         },
465                                                                 },
466                                                         },
467                                                 },
468                                         }
469                                 } else if ngenbid := e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeXN.GlobalNGRANNodeID.GlobalngeNBID.EnbID.EnbIdLongMacro; ngenbid != "" && len(ngenbid) == 21 {
470                                         e2nodeComponentConfigs[i] = &entities.E2NodeComponentConfig{
471                                                 E2NodeComponentInterfaceType: entities.E2NodeComponentInterfaceType_xn,
472                                                 E2NodeComponentRequestPart:   e2NodeConfigItem.E2nodeConfiguration.E2NodeRequestPart,
473                                                 E2NodeComponentResponsePart:  e2NodeConfigItem.E2nodeConfiguration.E2NodeResponsePart,
474                                                 E2NodeComponentID: &entities.E2NodeComponentConfig_E2NodeComponentInterfaceTypeXn{
475                                                         E2NodeComponentInterfaceTypeXn: &entities.E2NodeComponentInterfaceXn{
476                                                                 GlobalNgRanNodeId: &entities.E2NodeComponentInterfaceXn_GlobalNgenbId{
477                                                                         GlobalNgenbId: &entities.GlobalNGENBID{
478                                                                                 PlmnIdentity: e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeXN.GlobalNGRANNodeID.GlobalngeNBID.PLMNID,
479                                                                                 EnbId:        e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeXN.GlobalNGRANNodeID.GlobalngeNBID.EnbID.EnbIdLongMacro,
480                                                                                 EnbType:      4,
481                                                                         },
482                                                                 },
483                                                         },
484                                                 },
485                                         }
486                                 }
487                         } else {
488                                 //not valid
489                         }
490                 } else if e2NodeConfigItem.E2nodeComponentType.X2 != nil {
491                         if gnbid := e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalenGNBID; gnbid != nil {
492                                 e2nodeComponentConfigs[i] = &entities.E2NodeComponentConfig{
493                                         E2NodeComponentInterfaceType: entities.E2NodeComponentInterfaceType_x2,
494                                         E2NodeComponentRequestPart:   e2NodeConfigItem.E2nodeConfiguration.E2NodeRequestPart,
495                                         E2NodeComponentResponsePart:  e2NodeConfigItem.E2nodeConfiguration.E2NodeResponsePart,
496                                         E2NodeComponentID: &entities.E2NodeComponentConfig_E2NodeComponentInterfaceTypeX2{
497                                                 E2NodeComponentInterfaceTypeX2: &entities.E2NodeComponentInterfaceX2{
498                                                         GlobalEngnbId: &entities.GlobalENGNBID{
499                                                                 PlmnIdentity: e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalenGNBID.PLMNIdentity,
500                                                                 GnbId:        e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalenGNBID.GNBID.GNBID,
501                                                                 GnbType:      1,
502                                                         },
503                                                 },
504                                         },
505                                 }
506                         } else if enb := e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalENBID; enb != nil {
507                                 if enbid := e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalENBID.ENBID.MacroEnbId; enbid != "" && len(enbid) == 20 {
508                                         e2nodeComponentConfigs[i] = &entities.E2NodeComponentConfig{
509                                                 E2NodeComponentInterfaceType: entities.E2NodeComponentInterfaceType_x2,
510                                                 E2NodeComponentRequestPart:   e2NodeConfigItem.E2nodeConfiguration.E2NodeRequestPart,
511                                                 E2NodeComponentResponsePart:  e2NodeConfigItem.E2nodeConfiguration.E2NodeResponsePart,
512                                                 E2NodeComponentID: &entities.E2NodeComponentConfig_E2NodeComponentInterfaceTypeX2{
513                                                         E2NodeComponentInterfaceTypeX2: &entities.E2NodeComponentInterfaceX2{
514                                                                 GlobalEnbId: &entities.GlobalENBID{
515                                                                         PlmnIdentity: e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalENBID.PLMNIdentity,
516                                                                         EnbId:        e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalENBID.ENBID.MacroEnbId,
517                                                                         EnbType:      1,
518                                                                 },
519                                                         },
520                                                 },
521                                         }
522                                 } else if enbid := e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalENBID.ENBID.HomeEnbId; enbid != "" && len(enbid) == 28 {
523                                         e2nodeComponentConfigs[i] = &entities.E2NodeComponentConfig{
524                                                 E2NodeComponentInterfaceType: entities.E2NodeComponentInterfaceType_x2,
525                                                 E2NodeComponentRequestPart:   e2NodeConfigItem.E2nodeConfiguration.E2NodeRequestPart,
526                                                 E2NodeComponentResponsePart:  e2NodeConfigItem.E2nodeConfiguration.E2NodeResponsePart,
527                                                 E2NodeComponentID: &entities.E2NodeComponentConfig_E2NodeComponentInterfaceTypeX2{
528                                                         E2NodeComponentInterfaceTypeX2: &entities.E2NodeComponentInterfaceX2{
529                                                                 GlobalEnbId: &entities.GlobalENBID{
530                                                                         PlmnIdentity: e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalENBID.PLMNIdentity,
531                                                                         EnbId:        e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalENBID.ENBID.HomeEnbId,
532                                                                         EnbType:      2,
533                                                                 },
534                                                         },
535                                                 },
536                                         }
537                                 } else if enbid := e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalENBID.ENBID.ShortMacroEnbId; enbid != "" && len(enbid) == 18 {
538                                         e2nodeComponentConfigs[i] = &entities.E2NodeComponentConfig{
539                                                 E2NodeComponentInterfaceType: entities.E2NodeComponentInterfaceType_x2,
540                                                 E2NodeComponentRequestPart:   e2NodeConfigItem.E2nodeConfiguration.E2NodeRequestPart,
541                                                 E2NodeComponentResponsePart:  e2NodeConfigItem.E2nodeConfiguration.E2NodeResponsePart,
542                                                 E2NodeComponentID: &entities.E2NodeComponentConfig_E2NodeComponentInterfaceTypeX2{
543                                                         E2NodeComponentInterfaceTypeX2: &entities.E2NodeComponentInterfaceX2{
544                                                                 GlobalEnbId: &entities.GlobalENBID{
545                                                                         PlmnIdentity: e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalENBID.PLMNIdentity,
546                                                                         EnbId:        e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalENBID.ENBID.ShortMacroEnbId,
547                                                                         EnbType:      3,
548                                                                 },
549                                                         },
550                                                 },
551                                         }
552                                 } else if enbid := e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalENBID.ENBID.LongMacroEnbId; enbid != "" && len(enbid) == 21 {
553                                         e2nodeComponentConfigs[i] = &entities.E2NodeComponentConfig{
554                                                 E2NodeComponentInterfaceType: entities.E2NodeComponentInterfaceType_x2,
555                                                 E2NodeComponentRequestPart:   e2NodeConfigItem.E2nodeConfiguration.E2NodeRequestPart,
556                                                 E2NodeComponentResponsePart:  e2NodeConfigItem.E2nodeConfiguration.E2NodeResponsePart,
557                                                 E2NodeComponentID: &entities.E2NodeComponentConfig_E2NodeComponentInterfaceTypeX2{
558                                                         E2NodeComponentInterfaceTypeX2: &entities.E2NodeComponentInterfaceX2{
559                                                                 GlobalEnbId: &entities.GlobalENBID{
560                                                                         PlmnIdentity: e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalENBID.PLMNIdentity,
561                                                                         EnbId:        e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalENBID.ENBID.LongMacroEnbId,
562                                                                         EnbType:      4,
563                                                                 },
564                                                         },
565                                                 },
566                                         }
567                                 }
568                         } else {
569                                 //not valid
570                         }
571                 } //end of x2
572         }
573         return e2nodeComponentConfigs
574 }
575
576 func (m *E2SetupRequestMessage) getGlobalE2NodeId() GlobalE2NodeId {
577
578         // TODO: Handle error case if GlobalE2NodeId not available
579         e2SetupRequestIes := m.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs
580         numOfIes := len(e2SetupRequestIes)
581         index := 1
582
583         for ieCount := 0; ieCount < numOfIes; ieCount++ {
584                 if e2SetupRequestIes[ieCount].ID == GlobalE2nodeID {
585                         index = ieCount
586                         break
587                 }
588         }
589
590         return m.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs[index].Value.GlobalE2nodeID
591 }
592
593 func (m *E2SetupRequestMessage) GetPlmnId() string {
594         globalE2NodeId := m.getGlobalE2NodeId()
595         if id := globalE2NodeId.GNB.GlobalGNBID.PlmnID; id != "" {
596                 return m.trimSpaces(id)
597         }
598         if id := globalE2NodeId.EnGNB.GlobalGNBID.PlmnID; id != "" {
599                 return m.trimSpaces(id)
600         }
601         if id := globalE2NodeId.ENB.GlobalENBID.PlmnID; id != "" {
602                 return m.trimSpaces(id)
603         }
604         if id := globalE2NodeId.NgENB.GlobalNgENBID.PlmnID; id != "" {
605                 return m.trimSpaces(id)
606         }
607         return ""
608 }
609
610 func (m *E2SetupRequestMessage) getInnerEnbId(enbId EnbId) string {
611
612         if id := enbId.HomeEnbId; id != "" {
613                 return id
614         }
615
616         if id := enbId.LongMacroEnbId; id != "" {
617                 return id
618         }
619
620         if id := enbId.MacroEnbId; id != "" {
621                 return id
622         }
623
624         if id := enbId.ShortMacroEnbId; id != "" {
625                 return id
626         }
627
628         return ""
629 }
630
631 func (m *E2SetupRequestMessage) getInnerNgEnbId(enbId NgEnbId) string {
632         if id := enbId.EnbIdLongMacro; id != "" {
633                 return id
634         }
635
636         if id := enbId.EnbIdMacro; id != "" {
637                 return id
638         }
639
640         if id := enbId.EnbIdShortMacro; id != "" {
641                 return id
642         }
643
644         return ""
645 }
646
647 func (m *E2SetupRequestMessage) GetNbId() string {
648         globalE2NodeId := m.getGlobalE2NodeId()
649
650         if id := globalE2NodeId.GNB.GlobalGNBID.GnbID.GnbID; id != "" {
651                 return m.trimSpaces(id)
652         }
653
654         if id := globalE2NodeId.EnGNB.GlobalGNBID.GnbID.GnbID; id != "" {
655                 return m.trimSpaces(id)
656         }
657
658         if id := m.getInnerEnbId(globalE2NodeId.ENB.GlobalENBID.EnbID); id != "" {
659                 return m.trimSpaces(id)
660         }
661
662         if id := m.getInnerNgEnbId(globalE2NodeId.NgENB.GlobalNgENBID.EnbID); id != "" {
663                 return m.trimSpaces(id)
664         }
665
666         return ""
667 }
668
669 func (m *E2SetupRequestMessage) trimSpaces(str string) string {
670         return strings.NewReplacer(" ", "", "\n", "").Replace(str)
671 }