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