2 // Copyright 2019 AT&T Intellectual Property
3 // Copyright 2019 Nokia
5 // Licensed under the Apache License, Version 2.0 (the "License");
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
9 // http://www.apache.org/licenses/LICENSE-2.0
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
17 // This source code is part of the near-RT RIC (RAN Intelligent Controller)
18 // platform project (RICP).
28 var TimeToWaitEnum = struct {
35 }{60, 20, 10, 5, 2, 1}
37 var timeToWaitMap = map[TimeToWait]interface{}{
38 TimeToWaitEnum.V60s: struct {
39 XMLName xml.Name `xml:"TimeToWait"`
40 Text string `xml:",chardata"`
41 V60s string `xml:"v60s"`
43 TimeToWaitEnum.V20s: struct {
44 XMLName xml.Name `xml:"TimeToWait"`
45 Text string `xml:",chardata"`
46 V20s string `xml:"v20s"`
48 TimeToWaitEnum.V10s: struct {
49 XMLName xml.Name `xml:"TimeToWait"`
50 Text string `xml:",chardata"`
51 V10s string `xml:"v10s"`
53 TimeToWaitEnum.V5s: struct {
54 XMLName xml.Name `xml:"TimeToWait"`
55 Text string `xml:",chardata"`
56 V5s string `xml:"v5s"`
58 TimeToWaitEnum.V2s: struct {
59 XMLName xml.Name `xml:"TimeToWait"`
60 Text string `xml:",chardata"`
61 V2s string `xml:"v2s"`
63 TimeToWaitEnum.V1s: struct {
64 XMLName xml.Name `xml:"TimeToWait"`
65 Text string `xml:",chardata"`
66 V1s string `xml:"v1s"`
70 func NewE2SetupSuccessResponseMessage(plmnId string, ricId string, request *E2SetupRequestMessage) E2SetupResponseMessage {
71 outcome := SuccessfulOutcome{}
72 outcome.ProcedureCode = "1"
74 e2SetupRequestIes := request.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs
76 outcome.Value.E2setupResponse.ProtocolIEs.E2setupResponseIEs = make([]E2setupResponseIEs, len(e2SetupRequestIes))
77 outcome.Value.E2setupResponse.ProtocolIEs.E2setupResponseIEs[0].ID = "4"
78 outcome.Value.E2setupResponse.ProtocolIEs.E2setupResponseIEs[0].Value = GlobalRICID{GlobalRICID: struct {
79 Text string `xml:",chardata"`
80 PLMNIdentity string `xml:"pLMN-Identity"`
81 RicID string `xml:"ric-ID"`
82 }{PLMNIdentity: plmnId, RicID: ricId}}
84 if len(e2SetupRequestIes) < 2 {
85 return E2SetupResponseMessage{E2APPDU: E2APPDU{Outcome: outcome}}
88 outcome.Value.E2setupResponse.ProtocolIEs.E2setupResponseIEs[1].ID = "9"
89 outcome.Value.E2setupResponse.ProtocolIEs.E2setupResponseIEs[1].Value = RANfunctionsIDList{RANfunctionsIDList: struct {
90 Text string `xml:",chardata"`
91 ProtocolIESingleContainer []ProtocolIESingleContainer `xml:"ProtocolIE-SingleContainer"`
92 }{ProtocolIESingleContainer: extractRanFunctionsIDList(request)}}
93 return E2SetupResponseMessage{E2APPDU: E2APPDU{Outcome: outcome}}
96 func NewE2SetupFailureResponseMessage(timeToWait TimeToWait) E2SetupResponseMessage {
97 outcome := UnsuccessfulOutcome{}
98 outcome.Value.E2setupFailure.ProtocolIEs.E2setupFailureIEs = make([]E2setupFailureIEs, 2)
99 outcome.ProcedureCode = "1"
100 outcome.Value.E2setupFailure.ProtocolIEs.E2setupFailureIEs[0].ID = "1"
101 outcome.Value.E2setupFailure.ProtocolIEs.E2setupFailureIEs[0].Value.Value = Cause{}
102 outcome.Value.E2setupFailure.ProtocolIEs.E2setupFailureIEs[1].ID = "31"
103 outcome.Value.E2setupFailure.ProtocolIEs.E2setupFailureIEs[1].Value.Value = timeToWaitMap[timeToWait]
104 return E2SetupResponseMessage{E2APPDU: E2APPDU{Outcome: outcome}}
107 type E2SetupResponseMessage struct {
108 XMLName xml.Name `xml:"E2SetupSuccessResponseMessage"`
109 Text string `xml:",chardata"`
113 type E2APPDU struct {
114 XMLName xml.Name `xml:"E2AP-PDU"`
115 Text string `xml:",chardata"`
119 type SuccessfulOutcome struct {
120 XMLName xml.Name `xml:"successfulOutcome"`
121 Text string `xml:",chardata"`
122 ProcedureCode string `xml:"procedureCode"`
124 Text string `xml:",chardata"`
125 Reject string `xml:"reject"`
126 } `xml:"criticality"`
128 Text string `xml:",chardata"`
129 E2setupResponse struct {
130 Text string `xml:",chardata"`
132 Text string `xml:",chardata"`
133 E2setupResponseIEs []E2setupResponseIEs `xml:"E2setupResponseIEs"`
134 } `xml:"protocolIEs"`
135 } `xml:"E2setupResponse"`
139 type E2setupResponseIEs struct {
140 Text string `xml:",chardata"`
143 Text string `xml:",chardata"`
144 Reject string `xml:"reject"`
145 } `xml:"criticality"`
146 Value interface{} `xml:"value"`
149 type GlobalRICID struct {
150 Text string `xml:",chardata"`
152 Text string `xml:",chardata"`
153 PLMNIdentity string `xml:"pLMN-Identity"`
154 RicID string `xml:"ric-ID"`
155 } `xml:"GlobalRIC-ID"`
158 type RANfunctionsIDList struct {
159 Text string `xml:",chardata"`
160 RANfunctionsIDList struct {
161 Text string `xml:",chardata"`
162 ProtocolIESingleContainer []ProtocolIESingleContainer `xml:"ProtocolIE-SingleContainer"`
163 } `xml:"RANfunctionsID-List"`
166 type ProtocolIESingleContainer struct {
167 Text string `xml:",chardata"`
170 Text string `xml:",chardata"`
171 Ignore string `xml:"ignore"`
172 } `xml:"criticality"`
174 Text string `xml:",chardata"`
175 RANfunctionIDItem struct {
176 Text string `xml:",chardata"`
177 RanFunctionID uint32 `xml:"ranFunctionID"`
178 RanFunctionRevision uint32 `xml:"ranFunctionRevision"`
179 } `xml:"RANfunctionID-Item"`
183 type UnsuccessfulOutcome struct {
184 XMLName xml.Name `xml:"unsuccessfulOutcome"`
185 Text string `xml:",chardata"`
186 ProcedureCode string `xml:"procedureCode"`
188 Text string `xml:",chardata"`
189 Reject string `xml:"reject"`
190 } `xml:"criticality"`
192 Text string `xml:",chardata"`
193 E2setupFailure struct {
194 Text string `xml:",chardata"`
196 Text string `xml:",chardata"`
197 E2setupFailureIEs []E2setupFailureIEs `xml:"E2setupFailureIEs"`
198 } `xml:"protocolIEs"`
199 } `xml:"E2setupFailure"`
203 type E2setupFailureIEs struct {
204 Text string `xml:",chardata"`
207 Text string `xml:",chardata"`
208 Ignore string `xml:"ignore"`
209 } `xml:"criticality"`
211 Text string `xml:",chardata"`
217 XMLName xml.Name `xml:"Cause"`
218 Text string `xml:",chardata"`
220 Text string `xml:",chardata"`
221 TransportResourceUnavailable string `xml:"transport-resource-unavailable"`
225 func extractRanFunctionsIDList(request *E2SetupRequestMessage) []ProtocolIESingleContainer {
226 list := &request.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs[1].Value.RANfunctionsList
227 ids := make([]ProtocolIESingleContainer, len(list.ProtocolIESingleContainer))
228 for i := 0; i < len(ids); i++ {
229 ids[i] = convertToRANfunctionID(list, i)
234 func convertToRANfunctionID(list *RANfunctionsList, i int) ProtocolIESingleContainer {
235 id := ProtocolIESingleContainer{}
237 id.Value.RANfunctionIDItem.RanFunctionID = list.ProtocolIESingleContainer[i].Value.RANfunctionItem.RanFunctionID
238 id.Value.RANfunctionIDItem.RanFunctionRevision = list.ProtocolIESingleContainer[i].Value.RANfunctionItem.RanFunctionRevision