[RIC-436] Fix out of range defect for setupRequestIes
[ric-plt/e2mgr.git] / E2Manager / models / e2_setup_response_message.go
1 //
2 // Copyright 2019 AT&T Intellectual Property
3 // Copyright 2019 Nokia
4 //
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
8 //
9 //      http://www.apache.org/licenses/LICENSE-2.0
10 //
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.
16
17 //  This source code is part of the near-RT RIC (RAN Intelligent Controller)
18 //  platform project (RICP).
19
20 package models
21
22 import (
23         "encoding/xml"
24 )
25
26 type TimeToWait = int
27
28 var TimeToWaitEnum = struct {
29         V60s TimeToWait
30         V20s TimeToWait
31         V10s TimeToWait
32         V5s  TimeToWait
33         V2s  TimeToWait
34         V1s  TimeToWait
35 }{60, 20, 10, 5, 2, 1}
36
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"`
42         }{},
43         TimeToWaitEnum.V20s: struct {
44                 XMLName xml.Name `xml:"TimeToWait"`
45                 Text    string   `xml:",chardata"`
46                 V20s    string   `xml:"v20s"`
47         }{},
48         TimeToWaitEnum.V10s: struct {
49                 XMLName xml.Name `xml:"TimeToWait"`
50                 Text    string   `xml:",chardata"`
51                 V10s    string   `xml:"v10s"`
52         }{},
53         TimeToWaitEnum.V5s: struct {
54                 XMLName xml.Name `xml:"TimeToWait"`
55                 Text    string   `xml:",chardata"`
56                 V5s     string   `xml:"v5s"`
57         }{},
58         TimeToWaitEnum.V2s: struct {
59                 XMLName xml.Name `xml:"TimeToWait"`
60                 Text    string   `xml:",chardata"`
61                 V2s     string   `xml:"v2s"`
62         }{},
63         TimeToWaitEnum.V1s: struct {
64                 XMLName xml.Name `xml:"TimeToWait"`
65                 Text    string   `xml:",chardata"`
66                 V1s     string   `xml:"v1s"`
67         }{},
68 }
69
70 func NewE2SetupSuccessResponseMessage(plmnId string, ricId string, request *E2SetupRequestMessage) E2SetupResponseMessage {
71         outcome := SuccessfulOutcome{}
72         outcome.Value.E2setupResponse.ProtocolIEs.E2setupResponseIEs = make([]E2setupResponseIEs, 2)
73         outcome.ProcedureCode = "1"
74         outcome.Value.E2setupResponse.ProtocolIEs.E2setupResponseIEs[0].ID = "4"
75         outcome.Value.E2setupResponse.ProtocolIEs.E2setupResponseIEs[0].Value = GlobalRICID{GlobalRICID: struct {
76                 Text         string `xml:",chardata"`
77                 PLMNIdentity string `xml:"pLMN-Identity"`
78                 RicID        string `xml:"ric-ID"`
79         }{PLMNIdentity: plmnId, RicID: ricId}}
80
81         functionsIdList := extractRanFunctionsIDList(request)
82
83         if functionsIdList != nil {
84                 outcome.Value.E2setupResponse.ProtocolIEs.E2setupResponseIEs[1].ID = "9"
85                 outcome.Value.E2setupResponse.ProtocolIEs.E2setupResponseIEs[1].Value = RANfunctionsIDList{RANfunctionsIDList: struct {
86                         Text                      string                      `xml:",chardata"`
87                         ProtocolIESingleContainer []ProtocolIESingleContainer `xml:"ProtocolIE-SingleContainer"`
88                 }{ProtocolIESingleContainer: functionsIdList}}
89         }
90
91         return E2SetupResponseMessage{E2APPDU: E2APPDU{Outcome: outcome}}
92 }
93
94 func NewE2SetupFailureResponseMessage(timeToWait TimeToWait) E2SetupResponseMessage {
95         outcome := UnsuccessfulOutcome{}
96         outcome.Value.E2setupFailure.ProtocolIEs.E2setupFailureIEs = make([]E2setupFailureIEs, 2)
97         outcome.ProcedureCode = "1"
98         outcome.Value.E2setupFailure.ProtocolIEs.E2setupFailureIEs[0].ID = "1"
99         outcome.Value.E2setupFailure.ProtocolIEs.E2setupFailureIEs[0].Value.Value = Cause{}
100         outcome.Value.E2setupFailure.ProtocolIEs.E2setupFailureIEs[1].ID = "31"
101         outcome.Value.E2setupFailure.ProtocolIEs.E2setupFailureIEs[1].Value.Value = timeToWaitMap[timeToWait]
102         return E2SetupResponseMessage{E2APPDU: E2APPDU{Outcome: outcome}}
103 }
104
105 type E2SetupResponseMessage struct {
106         XMLName xml.Name `xml:"E2SetupSuccessResponseMessage"`
107         Text    string   `xml:",chardata"`
108         E2APPDU E2APPDU
109 }
110
111 type E2APPDU struct {
112         XMLName xml.Name `xml:"E2AP-PDU"`
113         Text    string   `xml:",chardata"`
114         Outcome interface{}
115 }
116
117 type SuccessfulOutcome struct {
118         XMLName       xml.Name `xml:"successfulOutcome"`
119         Text          string   `xml:",chardata"`
120         ProcedureCode string   `xml:"procedureCode"`
121         Criticality   struct {
122                 Text   string `xml:",chardata"`
123                 Reject string `xml:"reject"`
124         } `xml:"criticality"`
125         Value struct {
126                 Text            string `xml:",chardata"`
127                 E2setupResponse struct {
128                         Text        string `xml:",chardata"`
129                         ProtocolIEs struct {
130                                 Text               string               `xml:",chardata"`
131                                 E2setupResponseIEs []E2setupResponseIEs `xml:"E2setupResponseIEs"`
132                         } `xml:"protocolIEs"`
133                 } `xml:"E2setupResponse"`
134         } `xml:"value"`
135 }
136
137 type E2setupResponseIEs struct {
138         Text        string `xml:",chardata"`
139         ID          string `xml:"id"`
140         Criticality struct {
141                 Text   string `xml:",chardata"`
142                 Reject string `xml:"reject"`
143         } `xml:"criticality"`
144         Value interface{} `xml:"value"`
145 }
146
147 type GlobalRICID struct {
148         Text        string `xml:",chardata"`
149         GlobalRICID struct {
150                 Text         string `xml:",chardata"`
151                 PLMNIdentity string `xml:"pLMN-Identity"`
152                 RicID        string `xml:"ric-ID"`
153         } `xml:"GlobalRIC-ID"`
154 }
155
156 type RANfunctionsIDList struct {
157         Text               string `xml:",chardata"`
158         RANfunctionsIDList struct {
159                 Text                      string                      `xml:",chardata"`
160                 ProtocolIESingleContainer []ProtocolIESingleContainer `xml:"ProtocolIE-SingleContainer"`
161         } `xml:"RANfunctionsID-List"`
162 }
163
164 type ProtocolIESingleContainer struct {
165         Text        string `xml:",chardata"`
166         ID          string `xml:"id"`
167         Criticality struct {
168                 Text   string `xml:",chardata"`
169                 Ignore string `xml:"ignore"`
170         } `xml:"criticality"`
171         Value struct {
172                 Text              string `xml:",chardata"`
173                 RANfunctionIDItem struct {
174                         Text                string `xml:",chardata"`
175                         RanFunctionID       string `xml:"ranFunctionID"`
176                         RanFunctionRevision string `xml:"ranFunctionRevision"`
177                 } `xml:"RANfunctionID-Item"`
178         } `xml:"value"`
179 }
180
181 type UnsuccessfulOutcome struct {
182         XMLName       xml.Name `xml:"unsuccessfulOutcome"`
183         Text          string   `xml:",chardata"`
184         ProcedureCode string   `xml:"procedureCode"`
185         Criticality   struct {
186                 Text   string `xml:",chardata"`
187                 Reject string `xml:"reject"`
188         } `xml:"criticality"`
189         Value struct {
190                 Text           string `xml:",chardata"`
191                 E2setupFailure struct {
192                         Text        string `xml:",chardata"`
193                         ProtocolIEs struct {
194                                 Text              string              `xml:",chardata"`
195                                 E2setupFailureIEs []E2setupFailureIEs `xml:"E2setupFailureIEs"`
196                         } `xml:"protocolIEs"`
197                 } `xml:"E2setupFailure"`
198         } `xml:"value"`
199 }
200
201 type E2setupFailureIEs struct {
202         Text        string `xml:",chardata"`
203         ID          string `xml:"id"`
204         Criticality struct {
205                 Text   string `xml:",chardata"`
206                 Ignore string `xml:"ignore"`
207         } `xml:"criticality"`
208         Value struct {
209                 Text  string `xml:",chardata"`
210                 Value interface{}
211         } `xml:"value"`
212 }
213
214 type Cause struct {
215         XMLName   xml.Name `xml:"Cause"`
216         Text      string   `xml:",chardata"`
217         Transport struct {
218                 Text                         string `xml:",chardata"`
219                 TransportResourceUnavailable string `xml:"transport-resource-unavailable"`
220         } `xml:"transport"`
221 }
222
223 func extractRanFunctionsIDList(request *E2SetupRequestMessage) []ProtocolIESingleContainer {
224
225         setupRequestIes := request.E2APPDU.InitiatingMessage.Value.E2setupRequest.ProtocolIEs.E2setupRequestIEs
226
227         if len(setupRequestIes) < 2 {
228                 return nil
229         }
230
231         list := &setupRequestIes[1].Value.RANfunctionsList
232         ids := make([]ProtocolIESingleContainer, len(list.ProtocolIESingleContainer))
233         for i := 0; i < len(ids); i++ {
234                 ids[i] = convertToRANfunctionID(list, i)
235         }
236         return ids
237 }
238
239 func convertToRANfunctionID(list *RANfunctionsList, i int) ProtocolIESingleContainer {
240         id := ProtocolIESingleContainer{}
241         id.ID = "6"
242         id.Value.RANfunctionIDItem.RanFunctionID = list.ProtocolIESingleContainer[i].Value.RANfunctionItem.RanFunctionID
243         id.Value.RANfunctionIDItem.RanFunctionRevision = list.ProtocolIESingleContainer[i].Value.RANfunctionItem.RanFunctionRevision
244         return id
245 }