2 // Copyright 2019 AT&T Intellectual Property
3 // Copyright 2019 Nokia
4 // Copyright (c) 2022 Samsung Electronics Co., Ltd. All Rights Reserved.
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
10 // http://www.apache.org/licenses/LICENSE-2.0
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.
18 // This source code is part of the near-RT RIC (RAN Intelligent Controller)
19 // platform project (RICP).
27 "gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
31 Text string `xml:",chardata"`
33 Text string `xml:",chardata"`
34 PlmnID string `xml:"plmn-id"`
36 Text string `xml:",chardata"`
37 GnbID string `xml:"gnb-ID"`
39 } `xml:"global-gNB-ID"`
43 Text string `xml:",chardata"`
45 Text string `xml:",chardata"`
46 PlmnID string `xml:"pLMN-Identity"`
48 Text string `xml:",chardata"`
49 GnbID string `xml:"gNB-ID"`
51 } `xml:"global-gNB-ID"`
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"`
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"`
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"`
79 Text string `xml:",chardata"`
81 Text string `xml:",chardata"`
82 PlmnID string `xml:"pLMN-Identity"`
83 EnbID EnbId `xml:"eNB-ID"`
84 } `xml:"global-eNB-ID"`
87 type GlobalE2NodeId struct {
88 Text string `xml:",chardata"`
90 EnGNB EnGnb `xml:"en-gNB"`
91 NgENB NgEnb `xml:"ng-eNB"`
95 type E2SetupRequest struct {
96 Text string `xml:",chardata"`
98 Text string `xml:",chardata"`
99 E2setupRequestIEs []struct {
100 Text string `xml:",chardata"`
103 Text string `xml:",chardata"`
104 Reject string `xml:"reject"`
105 } `xml:"criticality"`
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"`
113 } `xml:"E2setupRequestIEs"`
114 } `xml:"protocolIEs"`
117 type E2SetupRequestMessage struct {
118 XMLName xml.Name `xml:"E2SetupRequestMessage"`
119 Text string `xml:",chardata"`
121 Text string `xml:",chardata"`
122 InitiatingMessage struct {
123 Text string `xml:",chardata"`
124 ProcedureCode string `xml:"procedureCode"`
126 Text string `xml:",chardata"`
127 Reject string `xml:"reject"`
128 } `xml:"criticality"`
130 Text string `xml:",chardata"`
131 E2setupRequest E2SetupRequest `xml:"E2setupRequest"`
133 } `xml:"initiatingMessage"`
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"`
145 type RANfunctionsList struct {
146 Text string `xml:",chardata"`
147 ProtocolIESingleContainer []struct {
148 Text string `xml:",chardata"`
151 Text string `xml:",chardata"`
152 Reject string `xml:"reject"`
153 } `xml:"criticality"`
155 Text string `xml:",chardata"`
156 RANfunctionItem RanFunctionItem `xml:"RANfunction-Item"`
158 } `xml:"ProtocolIE-SingleContainer"`
161 type E2NodeConfigList struct {
162 Text string `xml:",chardata"`
163 ProtocolIESingleContainer []struct {
164 Text string `xml:",chardata"`
167 Text string `xml:",chardata"`
168 Reject string `xml:"reject"`
169 } `xml:"criticality"`
171 Text string `xml:",chardata"`
172 E2nodeConfigAdditionItem E2NodeConfigAdditionItem `xml:"E2nodeComponentConfigAddition-Item"`
174 } `xml:"ProtocolIE-SingleContainer"`
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"`
188 type E2NodeConfigAdditionItem struct {
189 Text string `xml:",chardata"`
190 E2nodeComponentType E2NodeComponentType `xml:"e2nodeComponentInterfaceType"`
191 E2nodeComponentID E2NodeComponentId `xml:"e2nodeComponentID"`
192 E2nodeConfiguration E2NodeConfigValue `xml:"e2nodeComponentConfiguration"`
195 type E2NodeConfigValue struct {
196 Text string `xml:",chardata"`
197 E2NodeRequestPart []byte `xml:"e2nodeComponentRequestPart"`
198 E2NodeResponsePart []byte `xml:"e2nodeComponentResponsePart"`
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
212 type E2NodeIFTypeNG struct {
213 XMLName xml.Name `xml:"e2nodeComponentInterfaceTypeNG"`
214 Text string `xml:",chardata"`
215 AMFName string `xml:"amf-name"`
218 type E2NodeIFTypeXN struct {
219 XMLName xml.Name `xml:"e2nodeComponentInterfaceTypeXn"`
220 Text string `xml:",chardata"`
221 GlobalNgENBID struct {
222 Text string `xml:",chardata"`
224 Text string `xml:",chardata"`
225 PLMNID string `xml:"plmn-id"`
227 Text string `xml:",chardata"`
228 GnbID string `xml:"gnb-ID"`
232 Text string `xml:",chardata"`
233 PLMNID string `xml:"plmn-id"`
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"`
241 } `xml:"global-NG-RAN-Node-ID"`
244 type E2NodeIFTypeE1 struct {
245 XMLName xml.Name `xml:"e2nodeComponentInterfaceTypeE1"`
246 Text string `xml:",chardata"`
247 GNBCUCPID int64 `xml:"gNB-CU-CP-ID"`
250 type E2NodeIFTypeF1 struct {
251 XMLName xml.Name `xml:"e2nodeComponentInterfaceTypeF1"`
252 Text string `xml:",chardata"`
253 GNBDUID int64 `xml:"gNB-DU-ID"`
256 type E2NodeIFTypeW1 struct {
257 XMLName xml.Name `xml:"e2nodeComponentInterfaceTypeW1"`
258 Text string `xml:",chardata"`
259 NGENBDUID int64 `xml:"ng-eNB-DU-ID"`
262 type E2NodeIFTypeS1 struct {
263 XMLName xml.Name `xml:"e2nodeComponentInterfaceTypeS1"`
264 Text string `xml:",chardata"`
265 MMENAME string `xml:"mme-name"`
268 type E2NodeIFTypeX2 struct {
269 XMLName xml.Name `xml:"e2nodeComponentInterfaceTypeX2"`
270 Text string `xml:",chardata"`
272 Text string `xml:",chardata"`
273 PLMNIdentity string `xml:"pLMN-Identity"`
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"`
281 } `xml:"global-eNB-ID"`
282 GlobalEnGNBID struct {
283 Text string `xml:",chardata"`
284 PLMNIdentity string `xml:"pLMN-Identity"`
286 Text string `xml:",chardata"`
287 GNBID string `xml:"gNB-ID"`
289 } `xml:"global-en-gNB-ID"`
292 func (m *E2SetupRequestMessage) ExtractRanFunctionsList() []*entities.RanFunction {
293 // TODO: verify e2SetupRequestIEs structure with Adi
294 e2SetupRequestIes := m.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs
296 var ranFuntionsList RANfunctionsList
299 for _, v := range e2SetupRequestIes {
300 if v.ID == RanFunctionsAddedID {
301 ranFuntionsList = v.Value.RANfunctionsList
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
316 funcs[i] = &entities.RanFunction{
317 RanFunctionId: ranFunctionItem.RanFunctionID,
318 RanFunctionDefinition: ranFunctionItem.RanFunctionDefinition,
319 RanFunctionRevision: ranFunctionItem.RanFunctionRevision,
320 RanFunctionOid: ranFunctionItem.RanFunctionOID,
326 func (m *E2SetupRequestMessage) ExtractE2NodeConfigList() []*entities.E2NodeComponentConfig {
327 e2SetupRequestIes := m.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs
328 numOfIes := len(e2SetupRequestIes)
329 var e2NodeConfigListContainer E2NodeConfigList
332 for ieCount := 0; ieCount < numOfIes; ieCount++ {
334 if e2SetupRequestIes[ieCount].ID == E2nodeConfigAdditionID {
335 e2NodeConfigListContainer = e2SetupRequestIes[ieCount].Value.E2NodeConfigList
345 e2nodeComponentConfigs := make([]*entities.E2NodeComponentConfig, len(e2NodeConfigListContainer.ProtocolIESingleContainer))
346 for i := 0; i < len(e2nodeComponentConfigs); i++ {
347 e2NodeConfigItem := e2NodeConfigListContainer.ProtocolIESingleContainer[i].Value.E2nodeConfigAdditionItem
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,
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,
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,
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,
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,
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,
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,
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
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
441 ifX2.GlobalEnGNBID.PLMNIdentity = e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalEnGNBID.PLMNIdentity
442 ifX2.GlobalEnGNBID.GNBID.GNBID = e2NodeConfigItem.E2nodeComponentID.E2NodeIFTypeX2.GlobalEnGNBID.GNBID.GNBID
445 return e2nodeComponentConfigs
448 func (m *E2SetupRequestMessage) getGlobalE2NodeId() GlobalE2NodeId {
450 // TODO: Handle error case if GlobalE2NodeId not available
451 e2SetupRequestIes := m.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs
452 numOfIes := len(e2SetupRequestIes)
455 for ieCount := 0; ieCount < numOfIes; ieCount++ {
456 if e2SetupRequestIes[ieCount].ID == GlobalE2nodeID {
462 return m.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs[index].Value.GlobalE2nodeID
465 func (m *E2SetupRequestMessage) GetPlmnId() string {
466 globalE2NodeId := m.getGlobalE2NodeId()
467 if id := globalE2NodeId.GNB.GlobalGNBID.PlmnID; id != "" {
468 return m.trimSpaces(id)
470 if id := globalE2NodeId.EnGNB.GlobalGNBID.PlmnID; id != "" {
471 return m.trimSpaces(id)
473 if id := globalE2NodeId.ENB.GlobalENBID.PlmnID; id != "" {
474 return m.trimSpaces(id)
476 if id := globalE2NodeId.NgENB.GlobalNgENBID.PlmnID; id != "" {
477 return m.trimSpaces(id)
482 func (m *E2SetupRequestMessage) getInnerEnbId(enbId EnbId) string {
484 if id := enbId.HomeEnbId; id != "" {
488 if id := enbId.LongMacroEnbId; id != "" {
492 if id := enbId.MacroEnbId; id != "" {
496 if id := enbId.ShortMacroEnbId; id != "" {
503 func (m *E2SetupRequestMessage) getInnerNgEnbId(enbId NgEnbId) string {
504 if id := enbId.EnbIdLongMacro; id != "" {
508 if id := enbId.EnbIdMacro; id != "" {
512 if id := enbId.EnbIdShortMacro; id != "" {
519 func (m *E2SetupRequestMessage) GetNbId() string {
520 globalE2NodeId := m.getGlobalE2NodeId()
522 if id := globalE2NodeId.GNB.GlobalGNBID.GnbID.GnbID; id != "" {
523 return m.trimSpaces(id)
526 if id := globalE2NodeId.EnGNB.GlobalGNBID.GnbID.GnbID; id != "" {
527 return m.trimSpaces(id)
530 if id := m.getInnerEnbId(globalE2NodeId.ENB.GlobalENBID.EnbID); id != "" {
531 return m.trimSpaces(id)
534 if id := m.getInnerNgEnbId(globalE2NodeId.NgENB.GlobalNgENBID.EnbID); id != "" {
535 return m.trimSpaces(id)
541 func (m *E2SetupRequestMessage) trimSpaces(str string) string {
542 return strings.NewReplacer(" ", "", "\n", "").Replace(str)