Squash-merging e2ap-v2.0 branch
[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         GlobalNgENBID struct {
222                 Text string `xml:",chardata"`
223                 GNB  struct {
224                         Text   string `xml:",chardata"`
225                         PLMNID string `xml:"plmn-id"`
226                         GnbID  struct {
227                                 Text  string `xml:",chardata"`
228                                 GnbID string `xml:"gnb-ID"`
229                         } `xml:"gnb-id"`
230                 } `xml:"gNB"`
231                 NGENB struct {
232                         Text   string `xml:",chardata"`
233                         PLMNID string `xml:"plmn-id"`
234                         GnbID  struct {
235                                 Text            string `xml:",chardata"`
236                                 ENBIDMacro      string `xml:"enb-ID-macro"`
237                                 ENBIDShortMacro string `xml:"enb-ID-shortmacro"`
238                                 ENBIDLongMacro  string `xml:"enb-ID-longmacro"`
239                         } `xml:"gnb-id"`
240                 } `xml:"ng-eNB"`
241         } `xml:"global-NG-RAN-Node-ID"`
242 }
243
244 type E2NodeIFTypeE1 struct {
245         XMLName   xml.Name `xml:"e2nodeComponentInterfaceTypeE1"`
246         Text      string   `xml:",chardata"`
247         GNBCUCPID int64    `xml:"gNB-CU-CP-ID"`
248 }
249
250 type E2NodeIFTypeF1 struct {
251         XMLName xml.Name `xml:"e2nodeComponentInterfaceTypeF1"`
252         Text    string   `xml:",chardata"`
253         GNBDUID int64    `xml:"gNB-DU-ID"`
254 }
255
256 type E2NodeIFTypeW1 struct {
257         XMLName   xml.Name `xml:"e2nodeComponentInterfaceTypeW1"`
258         Text      string   `xml:",chardata"`
259         NGENBDUID int64    `xml:"ng-eNB-DU-ID"`
260 }
261
262 type E2NodeIFTypeS1 struct {
263         XMLName xml.Name `xml:"e2nodeComponentInterfaceTypeS1"`
264         Text    string   `xml:",chardata"`
265         MMENAME string   `xml:"mme-name"`
266 }
267
268 type E2NodeIFTypeX2 struct {
269         XMLName     xml.Name `xml:"e2nodeComponentInterfaceTypeX2"`
270         Text        string   `xml:",chardata"`
271         GlobalENBID struct {
272                 Text         string `xml:",chardata"`
273                 PLMNIdentity string `xml:"pLMN-Identity"`
274                 ENBID        struct {
275                         Text            string `xml:",chardata"`
276                         MacroENBID      string `xml:"macro-eNB-ID"`
277                         HomeENBID       string `xml:"home-eNB-ID"`
278                         ShortMacroENBID string `xml:"short-Macro-eNB-ID"`
279                         LongMacroENBID  string `xml:"long-Macro-eNB-ID"`
280                 } `xml:"eNB-ID"`
281         } `xml:"global-eNB-ID"`
282         GlobalEnGNBID struct {
283                 Text         string `xml:",chardata"`
284                 PLMNIdentity string `xml:"pLMN-Identity"`
285                 GNBID        struct {
286                         Text  string `xml:",chardata"`
287                         GNBID string `xml:"gNB-ID"`
288                 } `xml:"gNB-ID"`
289         } `xml:"global-en-gNB-ID"`
290 }
291
292 func (m *E2SetupRequestMessage) ExtractRanFunctionsList() []*entities.RanFunction {
293         // TODO: verify e2SetupRequestIEs structure with Adi
294         e2SetupRequestIes := m.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs
295
296         var ranFuntionsList RANfunctionsList
297         var isPopulated bool
298
299         for _, v := range e2SetupRequestIes {
300                 if v.ID == RanFunctionsAddedID {
301                         ranFuntionsList = v.Value.RANfunctionsList
302                         isPopulated = true
303                         break
304                 }
305         }
306
307         if !isPopulated {
308                 return nil
309         }
310
311         ranFunctionsListContainer := ranFuntionsList.ProtocolIESingleContainer
312         funcs := make([]*entities.RanFunction, len(ranFunctionsListContainer))
313         for i := 0; i < len(funcs); i++ {
314                 ranFunctionItem := ranFunctionsListContainer[i].Value.RANfunctionItem
315
316                 funcs[i] = &entities.RanFunction{
317                         RanFunctionId:         ranFunctionItem.RanFunctionID,
318                         RanFunctionDefinition: ranFunctionItem.RanFunctionDefinition,
319                         RanFunctionRevision:   ranFunctionItem.RanFunctionRevision,
320                         RanFunctionOid:        ranFunctionItem.RanFunctionOID,
321                 }
322         }
323         return funcs
324 }
325
326 func (m *E2SetupRequestMessage) ExtractE2NodeConfigList() []*entities.E2NodeComponentConfig {
327         e2SetupRequestIes := m.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs
328         numOfIes := len(e2SetupRequestIes)
329         var e2NodeConfigListContainer E2NodeConfigList
330         var isPopulated bool
331
332         for ieCount := 0; ieCount < numOfIes; ieCount++ {
333
334                 if e2SetupRequestIes[ieCount].ID == E2nodeConfigAdditionID {
335                         e2NodeConfigListContainer = e2SetupRequestIes[ieCount].Value.E2NodeConfigList
336                         isPopulated = true
337                         break
338                 }
339         }
340
341         if !isPopulated {
342                 return nil
343         }
344
345         e2nodeComponentConfigs := make([]*entities.E2NodeComponentConfig, len(e2NodeConfigListContainer.ProtocolIESingleContainer))
346         for i := 0; i < len(e2nodeComponentConfigs); i++ {
347                 e2NodeConfigItem := e2NodeConfigListContainer.ProtocolIESingleContainer[i].Value.E2nodeConfigAdditionItem
348
349                 if e2NodeConfigItem.E2nodeComponentType.NG != nil {
350                         e2nodeComponentConfigs[i] = &entities.E2NodeComponentConfig{
351                                 E2NodeComponentInterfaceType: entities.E2NodeComponentInterfaceType_ng,
352                                 E2NodeComponentRequestPart:   e2NodeConfigItem.E2nodeConfiguration.E2NodeRequestPart,
353                                 E2NodeComponentResponsePart:  e2NodeConfigItem.E2nodeConfiguration.E2NodeResponsePart,
354                                 E2NodeComponentID: &entities.E2NodeComponentConfig_E2NodeComponentInterfaceTypeNG{
355                                         E2NodeComponentInterfaceTypeNG: &entities.E2NodeComponentInterfaceNG{
356                                                 AmfName: e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeNG.AMFName,
357                                         },
358                                 },
359                         }
360                 } else if e2NodeConfigItem.E2nodeComponentType.E1 != nil {
361                         e2nodeComponentConfigs[i] = &entities.E2NodeComponentConfig{
362                                 E2NodeComponentInterfaceType: entities.E2NodeComponentInterfaceType_e1,
363                                 E2NodeComponentRequestPart:   e2NodeConfigItem.E2nodeConfiguration.E2NodeRequestPart,
364                                 E2NodeComponentResponsePart:  e2NodeConfigItem.E2nodeConfiguration.E2NodeResponsePart,
365                                 E2NodeComponentID: &entities.E2NodeComponentConfig_E2NodeComponentInterfaceTypeE1{
366                                         E2NodeComponentInterfaceTypeE1: &entities.E2NodeComponentInterfaceE1{
367                                                 GNBCuCpId: e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeE1.GNBCUCPID,
368                                         },
369                                 },
370                         }
371                 } else if e2NodeConfigItem.E2nodeComponentType.F1 != nil {
372                         e2nodeComponentConfigs[i] = &entities.E2NodeComponentConfig{
373                                 E2NodeComponentInterfaceType: entities.E2NodeComponentInterfaceType_f1,
374                                 E2NodeComponentRequestPart:   e2NodeConfigItem.E2nodeConfiguration.E2NodeRequestPart,
375                                 E2NodeComponentResponsePart:  e2NodeConfigItem.E2nodeConfiguration.E2NodeResponsePart,
376                                 E2NodeComponentID: &entities.E2NodeComponentConfig_E2NodeComponentInterfaceTypeF1{
377                                         E2NodeComponentInterfaceTypeF1: &entities.E2NodeComponentInterfaceF1{
378                                                 GNBDuId: e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeF1.GNBDUID,
379                                         },
380                                 },
381                         }
382                 } else if e2NodeConfigItem.E2nodeComponentType.W1 != nil {
383                         e2nodeComponentConfigs[i] = &entities.E2NodeComponentConfig{
384                                 E2NodeComponentInterfaceType: entities.E2NodeComponentInterfaceType_w1,
385                                 E2NodeComponentRequestPart:   e2NodeConfigItem.E2nodeConfiguration.E2NodeRequestPart,
386                                 E2NodeComponentResponsePart:  e2NodeConfigItem.E2nodeConfiguration.E2NodeResponsePart,
387                                 E2NodeComponentID: &entities.E2NodeComponentConfig_E2NodeComponentInterfaceTypeW1{
388                                         E2NodeComponentInterfaceTypeW1: &entities.E2NodeComponentInterfaceW1{
389                                                 NgenbDuId: e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeW1.NGENBDUID,
390                                         },
391                                 },
392                         }
393                 } else if e2NodeConfigItem.E2nodeComponentType.S1 != nil {
394                         e2nodeComponentConfigs[i] = &entities.E2NodeComponentConfig{
395                                 E2NodeComponentInterfaceType: entities.E2NodeComponentInterfaceType_s1,
396                                 E2NodeComponentRequestPart:   e2NodeConfigItem.E2nodeConfiguration.E2NodeRequestPart,
397                                 E2NodeComponentResponsePart:  e2NodeConfigItem.E2nodeConfiguration.E2NodeResponsePart,
398                                 E2NodeComponentID: &entities.E2NodeComponentConfig_E2NodeComponentInterfaceTypeS1{
399                                         E2NodeComponentInterfaceTypeS1: &entities.E2NodeComponentInterfaceS1{
400                                                 MmeName: e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeS1.MMENAME,
401                                         },
402                                 },
403                         }
404                 }
405                 /*else if e2NodeConfigItem.E2nodeComponentType.XN != nil {
406                         funcs[i] = &entities.E2NodeComponentConfig{
407                                 E2NodeComponentInterfaceType: entities.E2NodeComponentInterfaceType_xn,
408                                 E2NodeComponentRequestPart: e2NodeConfigItem.E2nodeConfiguration.E2NodeRequestPart,
409                                 E2NodeComponentResponsePart:  e2NodeConfigItem.E2nodeConfiguration.E2NodeResponsePart,
410                                 E2NodeComponentID:              &entities.E2NodeComponentConfig_E2NodeComponentInterfaceTypeNG{
411                                         E2NodeComponentInterfaceTypeXn: &entities.E2NodeComponentInterfaceXn{
412                                                 GlobalNgRanNodeId: &entities.E2NodeComponentInterfaceXn_GlobalNgenbId{
413                                                         GlobalNgenbId:&entities.GlobalNGENBID{
414                                                                 PlmnIdentity: e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeXN.GlobalNgENBID.NGENB.PLMNID,
415                                                                 EnbId: e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeXN.GlobalNgENBID.GNB.GnbID.GnbID,
416                                                         },
417                                                 },
418                                                 GlobalNgRanNodeId: &entities.E2NodeComponentInterfaceXn_GlobalGnbId{
419                                                         GlobalGnbId:&entities.GlobalGNBID{
420                                                                 PlmnIdentity: e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeXN.GlobalNgENBID.NGENB.PLMNID,
421                                                                 EnbId: e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeXN.GlobalNgENBID.GNB.GnbID.GnbID,
422                                                         },
423                                                 },
424                                         },
425                                 },
426                         }
427                         ifXn.GlobalNgENBID.NGENB.PLMNID = e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeXN.GlobalNgENBID.NGENB.PLMNID
428                         ifXn.GlobalNgENBID.NGENB.GnbID.ENBIDMacro = e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeXN.GlobalNgENBID.NGENB.GnbID.ENBIDMacro
429                         ifXn.GlobalNgENBID.NGENB.GnbID.ENBIDShortMacro = e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeXN.GlobalNgENBID.NGENB.GnbID.ENBIDShortMacro
430                         ifXn.GlobalNgENBID.NGENB.GnbID.ENBIDLongMacro = e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeXN.GlobalNgENBID.NGENB.GnbID.ENBIDLongMacro
431
432                 }*/
433                 /*else if e2NodeConfigItem.E2nodeComponentType.X2 != nil {
434                         ifX2 := E2NodeIFTypeX2 {}
435                         ifX2.GlobalENBID.PLMNIdentity = e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalENBID.PLMNIdentity
436                         ifX2.GlobalENBID.ENBID.MacroENBID = e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalENBID.ENBID.MacroENBID
437                         ifX2.GlobalENBID.ENBID.HomeENBID = e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalENBID.ENBID.HomeENBID
438                         ifX2.GlobalENBID.ENBID.ShortMacroENBID = e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalENBID.ENBID.ShortMacroENBID
439                         ifX2.GlobalENBID.ENBID.LongMacroENBID = e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalENBID.ENBID.LongMacroENBID
440
441                         ifX2.GlobalEnGNBID.PLMNIdentity = e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalEnGNBID.PLMNIdentity
442                         ifX2.GlobalEnGNBID.GNBID.GNBID = e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalEnGNBID.GNBID.GNBID
443                 }*/
444         }
445         return e2nodeComponentConfigs
446 }
447
448 func (m *E2SetupRequestMessage) getGlobalE2NodeId() GlobalE2NodeId {
449
450         // TODO: Handle error case if GlobalE2NodeId not available
451         e2SetupRequestIes := m.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs
452         numOfIes := len(e2SetupRequestIes)
453         index := 1
454
455         for ieCount := 0; ieCount < numOfIes; ieCount++ {
456                 if e2SetupRequestIes[ieCount].ID == GlobalE2nodeID {
457                         index = ieCount
458                         break
459                 }
460         }
461
462         return m.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs[index].Value.GlobalE2nodeID
463 }
464
465 func (m *E2SetupRequestMessage) GetPlmnId() string {
466         globalE2NodeId := m.getGlobalE2NodeId()
467         if id := globalE2NodeId.GNB.GlobalGNBID.PlmnID; id != "" {
468                 return m.trimSpaces(id)
469         }
470         if id := globalE2NodeId.EnGNB.GlobalGNBID.PlmnID; id != "" {
471                 return m.trimSpaces(id)
472         }
473         if id := globalE2NodeId.ENB.GlobalENBID.PlmnID; id != "" {
474                 return m.trimSpaces(id)
475         }
476         if id := globalE2NodeId.NgENB.GlobalNgENBID.PlmnID; id != "" {
477                 return m.trimSpaces(id)
478         }
479         return ""
480 }
481
482 func (m *E2SetupRequestMessage) getInnerEnbId(enbId EnbId) string {
483
484         if id := enbId.HomeEnbId; id != "" {
485                 return id
486         }
487
488         if id := enbId.LongMacroEnbId; id != "" {
489                 return id
490         }
491
492         if id := enbId.MacroEnbId; id != "" {
493                 return id
494         }
495
496         if id := enbId.ShortMacroEnbId; id != "" {
497                 return id
498         }
499
500         return ""
501 }
502
503 func (m *E2SetupRequestMessage) getInnerNgEnbId(enbId NgEnbId) string {
504         if id := enbId.EnbIdLongMacro; id != "" {
505                 return id
506         }
507
508         if id := enbId.EnbIdMacro; id != "" {
509                 return id
510         }
511
512         if id := enbId.EnbIdShortMacro; id != "" {
513                 return id
514         }
515
516         return ""
517 }
518
519 func (m *E2SetupRequestMessage) GetNbId() string {
520         globalE2NodeId := m.getGlobalE2NodeId()
521
522         if id := globalE2NodeId.GNB.GlobalGNBID.GnbID.GnbID; id != "" {
523                 return m.trimSpaces(id)
524         }
525
526         if id := globalE2NodeId.EnGNB.GlobalGNBID.GnbID.GnbID; id != "" {
527                 return m.trimSpaces(id)
528         }
529
530         if id := m.getInnerEnbId(globalE2NodeId.ENB.GlobalENBID.EnbID); id != "" {
531                 return m.trimSpaces(id)
532         }
533
534         if id := m.getInnerNgEnbId(globalE2NodeId.NgENB.GlobalNgENBID.EnbID); id != "" {
535                 return m.trimSpaces(id)
536         }
537
538         return ""
539 }
540
541 func (m *E2SetupRequestMessage) trimSpaces(str string) string {
542         return strings.NewReplacer(" ", "", "\n", "").Replace(str)
543 }