J release: Release container Image
[ric-plt/e2.git] / RIC-E2-TERMINATION / TEST / testAsn / setUpMessages / SetUpMessages.cpp
1 /*
2  * Copyright 2020 AT&T Intellectual Property
3  * Copyright 2020 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
18 #include <cstring>
19 #include <cstdio>
20 #include <cerrno>
21 #include <cstdlib>
22 #include <iostream>
23
24
25 //#include <mdclog/mdclog.h>
26
27
28 #include "oranE2/E2AP-PDU.h"
29 #include "oranE2/InitiatingMessage.h"
30 #include "oranE2/SuccessfulOutcome.h"
31 #include "oranE2/UnsuccessfulOutcome.h"
32
33 #include "oranE2/ProtocolIE-Field.h"
34 #include "oranE2/ENB-ID.h"
35 #include "oranE2/GlobalENB-ID.h"
36 #include "oranE2/GlobalE2node-gNB-ID.h"
37 #include "oranE2/constr_TYPE.h"
38
39 #include "E2Builder.h"
40
41 using namespace std;
42
43
44 #include "BuildRunName.h"
45
46 void buildRanName(E2AP_PDU_t *pdu, unsigned char *buffer) {
47     for (auto i = 0; i < pdu->choice.initiatingMessage->value.choice.E2setupRequest.protocolIEs.list.count; i++) {
48         auto *ie = pdu->choice.initiatingMessage->value.choice.E2setupRequest.protocolIEs.list.array[i];
49         if (ie->id == ProtocolIE_ID_id_GlobalE2node_ID) {
50             if (ie->value.present == E2setupRequestIEs__value_PR_GlobalE2node_ID) {
51                 memset(buffer, 0, 128);
52                 buildRanName( (char *) buffer, ie);
53             }
54         }
55     }
56
57 }
58
59 void extractPdu(E2AP_PDU_t *pdu, unsigned char *buffer, int buffer_size) {
60     asn_enc_rval_t er;
61     er = asn_encode_to_buffer(nullptr, ATS_BASIC_XER, &asn_DEF_E2AP_PDU, pdu, buffer, buffer_size);
62     if (er.encoded == -1) {
63         cerr << "encoding of " << asn_DEF_E2AP_PDU.name << " failed, " << strerror(errno) << endl;
64         exit(-1);
65     } else if (er.encoded > (ssize_t) buffer_size) {
66         cerr << "Buffer of size " << buffer_size << " is to small for " << asn_DEF_E2AP_PDU.name << endl;
67         exit(-1);
68     } else {
69         cout << "XML result = " << buffer << endl;
70     }
71 }
72
73
74 std::string otherXml = "<E2AP-PDU>\n"
75                        "    <successfulOutcome>\n"
76                        "        <procedureCode>1</procedureCode>\n"
77                        "        <criticality><reject/></criticality>\n"
78                        "        <value>\n"
79                        "            <E2setupResponse>\n"
80                        "                <protocolIEs>\n"
81                        "                    <E2setupResponseIEs>\n"
82                        "                        <id>4</id>\n"
83                        "                        <criticality><reject/></criticality>\n"
84                        "                        <value>\n"
85                        "                            <GlobalRIC-ID>\n"
86                        "                                <pLMN-Identity>13 10 14</pLMN-Identity>\n"
87                        "                                <ric-ID>\n"
88                        "                                    10011001101010101011"
89                        "                                </ric-ID>\n"
90                        "                            </GlobalRIC-ID>\n"
91                        "                        </value>\n"
92                        "                    </E2setupResponseIEs>\n"
93                        "                    <E2setupResponseIEs>\n"
94                        "                        <id>9</id>\n"
95                        "                        <criticality><reject/></criticality>\n"
96                        "                        <value>\n"
97                        "                            <RANfunctionsID-List>\n"
98                        "                                <ProtocolIE-SingleContainer>\n"
99                        "                                    <id>6</id>\n"
100                        "                                    <criticality><ignore/></criticality>\n"
101                        "                                    <value>\n"
102                        "                                        <RANfunctionID-Item>\n"
103                        "                                            <ranFunctionID>1</ranFunctionID>\n"
104                        "                                            <ranFunctionRevision>1</ranFunctionRevision>\n"
105                        "                                        </RANfunctionID-Item>\n"
106                        "                                    </value>\n"
107                        "                                </ProtocolIE-SingleContainer>\n"
108                        "                                <ProtocolIE-SingleContainer>\n"
109                        "                                    <id>6</id>\n"
110                        "                                    <criticality><ignore/></criticality>\n"
111                        "                                    <value>\n"
112                        "                                        <RANfunctionID-Item>\n"
113                        "                                            <ranFunctionID>2</ranFunctionID>\n"
114                        "                                            <ranFunctionRevision>1</ranFunctionRevision>\n"
115                        "                                        </RANfunctionID-Item>\n"
116                        "                                    </value>\n"
117                        "                                </ProtocolIE-SingleContainer>\n"
118                        "                                <ProtocolIE-SingleContainer>\n"
119                        "                                    <id>6</id>\n"
120                        "                                    <criticality><ignore/></criticality>\n"
121                        "                                    <value>\n"
122                        "                                        <RANfunctionID-Item>\n"
123                        "                                            <ranFunctionID>3</ranFunctionID>\n"
124                        "                                            <ranFunctionRevision>1</ranFunctionRevision>\n"
125                        "                                        </RANfunctionID-Item>\n"
126                        "                                    </value>\n"
127                        "                                </ProtocolIE-SingleContainer>\n"
128                        "                            </RANfunctionsID-List>\n"
129                        "                        </value>\n"
130                        "                    </E2setupResponseIEs>\n"
131                        "                </protocolIEs>\n"
132                        "            </E2setupResponse>\n"
133                        "        </value>\n"
134                        "    </successfulOutcome>\n"
135                        "</E2AP-PDU>\n";
136
137
138 std::string newXml =
139         "<E2AP-PDU><successfulOutcome><procedureCode>1</procedureCode><criticality><reject/></criticality><value><E2setupResponse><protocolIEs><E2setupResponseIEs><id>4</id><criticality><reject/></criticality><value><GlobalRIC-ID><pLMN-Identity>13 10 14</pLMN-Identity><ric-ID>10101010110011001110</ric-ID></GlobalRIC-ID></value></E2setupResponseIEs><E2setupResponseIEs><id>9</id><criticality><reject/></criticality><value><RANfunctionsID-List><ProtocolIE-SingleContainer><id>6</id><criticality><ignore/></criticality><value><RANfunctionID-Item><ranFunctionID>1</ranFunctionID><ranFunctionRevision>1</ranFunctionRevision></RANfunctionID-Item></value></ProtocolIE-SingleContainer><ProtocolIE-SingleContainer><id>6</id><criticality><ignore/></criticality><value><RANfunctionID-Item><ranFunctionID>2</ranFunctionID><ranFunctionRevision>1</ranFunctionRevision></RANfunctionID-Item></value></ProtocolIE-SingleContainer><ProtocolIE-SingleContainer><id>6</id><criticality><ignore/></criticality><value><RANfunctionID-Item><ranFunctionID>3</ranFunctionID><ranFunctionRevision>1</ranFunctionRevision></RANfunctionID-Item></value></ProtocolIE-SingleContainer></RANfunctionsID-List></value></E2setupResponseIEs></protocolIEs></E2setupResponse></value></successfulOutcome></E2AP-PDU>";
140 std::string setupFailure = "<E2AP-PDU>"
141                            "<unsuccessfulOutcome>"
142                            "<procedureCode>1</procedureCode>"
143                            "<criticality><reject/></criticality>"
144                            "<value>"
145                            "<E2setupFailure>"
146                            "<protocolIEs>"
147                            "<E2setupFailureIEs>"
148                            "<id>1</id>"
149                            "<criticality><reject/></criticality>"
150                            "<value>"
151                            "<Cause>"
152                            "<transport>"
153                            "<transport-resource-unavailable/>"
154                            "</transport>"
155                            "</Cause>"
156                            "</value>"
157                            "</E2setupFailureIEs>"
158                            "</protocolIEs>"
159                            "</E2setupFailure>"
160                            "</value>"
161                            "</unsuccessfulOutcome>"
162                            "</E2AP-PDU>";
163
164
165
166 std::string otherSucc = "  <E2AP-PDU>"
167                         "<successfulOutcome>"
168                         "<procedureCode>1</procedureCode>"
169                         "<criticality><reject/></criticality>"
170                         "<value>"
171                         "<E2setupResponse>"
172                         "<protocolIEs>"
173                         "<E2setupResponseIEs>"
174                         "<id>4</id>"
175                         "<criticality><reject/></criticality>"
176                         "<value>"
177                         "<GlobalRIC-ID>"
178                         "<pLMN-Identity>131014</pLMN-Identity>"
179                         "<ric-ID>10101010110011001110</ric-ID>"
180                         "</GlobalRIC-ID>"
181                         "</value>"
182                         "</E2setupResponseIEs><E2setupResponseIEs><id>9</id><criticality><reject/></criticality><value><RANfunctionsID-List><ProtocolIE-SingleContainer><id>6</id><criticality><ignore/></criticality><value><RANfunctionID-Item><ranFunctionID>1</ranFunctionID><ranFunctionRevision>1</ranFunctionRevision></RANfunctionID-Item></value></ProtocolIE-SingleContainer><ProtocolIE-SingleContainer><id>6</id><criticality><ignore/></criticality><value><RANfunctionID-Item><ranFunctionID>2</ranFunctionID><ranFunctionRevision>1</ranFunctionRevision></RANfunctionID-Item></value></ProtocolIE-SingleContainer><ProtocolIE-SingleContainer><id>6</id><criticality><ignore/></criticality><value><RANfunctionID-Item><ranFunctionID>3</ranFunctionID><ranFunctionRevision>1</ranFunctionRevision></RANfunctionID-Item></value></ProtocolIE-SingleContainer></RANfunctionsID-List></value></E2setupResponseIEs></protocolIEs></E2setupResponse></value></successfulOutcome></E2AP-PDU>";
183
184 auto main(const int argc, char **argv) -> int {
185     E2AP_PDU_t pdu;
186     char *printBuffer;
187     size_t size;
188     FILE *stream = open_memstream(&printBuffer, &size);
189     auto buffer_size =  8192;
190     unsigned char buffer[8192] = {};
191
192     E2AP_PDU_t *XERpdu  = nullptr;
193     cout << "message size = " <<  otherSucc.length() << endl;
194     auto rval = asn_decode(nullptr, ATS_BASIC_XER, &asn_DEF_E2AP_PDU, (void **) &XERpdu,
195                            otherSucc.c_str(), otherSucc.length());
196     if (rval.code != RC_OK) {
197         cout <<  "Error " << rval.code << " (unpack) setup response " << endl;
198         //return -1;
199     }
200
201     asn_fprint(stream, &asn_DEF_E2AP_PDU, XERpdu);
202     cout << "Encoding E2AP PDU of size  " << size << endl << printBuffer << endl;
203     fseek(stream,0,SEEK_SET);
204
205     cout << "=========================" << endl << endl << endl << "========================" << endl;
206     buildSubsReq(&pdu);
207     char errbuf[256];
208     int errlen = 256;
209     int ret = asn_check_constraints(&asn_DEF_E2AP_PDU, &pdu, errbuf, (size_t *)&errlen);
210     if (ret) {
211         cout << "Constraint validation failed: " << errbuf << endl;
212     }
213     asn_fprint(stream, &asn_DEF_E2AP_PDU, &pdu);
214     cout << "Encoding E2AP PDU of size  " << size << endl << printBuffer << endl;
215     //fseek(stream,0,SEEK_SET);
216     extractPdu(&pdu, buffer, buffer_size);
217     memset(buffer, 0, buffer_size);
218
219     buildSetupRequest(&pdu, 311, 410);
220     asn_fprint(stream, &asn_DEF_E2AP_PDU, &pdu);
221     cout << "Encoding E2AP PDU of size  " << size << endl << printBuffer << endl;
222     fseek(stream,0,SEEK_SET);
223
224     extractPdu(&pdu, buffer, buffer_size);
225     buildRanName(&pdu, buffer);
226     cout << "Ran name = " << buffer << endl;
227
228     ASN_STRUCT_RESET(asn_DEF_E2AP_PDU, &pdu);
229     memset(buffer, 0, buffer_size);
230
231     cout << "========== en-gnb ============" << endl;
232     buildSetupRequesteenGNB(&pdu, 320, 512);
233     asn_fprint(stream, &asn_DEF_E2AP_PDU, &pdu);
234     cout << "Encoding E2AP PDU of size  " << size << endl << printBuffer << endl;
235     fseek(stream,0,SEEK_SET);
236     cout << "========== en-gnb ============" << endl;
237
238     extractPdu(&pdu, buffer, buffer_size);
239     buildRanName(&pdu, buffer);
240     cout << "Ran name = " << buffer << endl;
241
242     ASN_STRUCT_RESET(asn_DEF_E2AP_PDU, &pdu);
243     memset(buffer, 0, buffer_size);
244
245     buildSetupRequestWithFunc(&pdu, 311, 410);
246     extractPdu(&pdu, buffer, buffer_size);
247
248     buildRanName(&pdu, buffer);
249     cout << "Ran name = " << buffer << endl;
250
251     cout << "Sucessesfull outcome" << endl;
252     ASN_STRUCT_RESET(asn_DEF_E2AP_PDU, &pdu);
253     memset(buffer, 0, buffer_size);
254     uint8_t data[4] = {0x99, 0xAA, 0xBB, 0};
255
256     buildSetupSuccsessfulResponse(&pdu, 311, 410, data);
257
258     asn_fprint(stream, &asn_DEF_E2AP_PDU, &pdu);
259     cout << "Encoding E2AP PDU of size  " << size << endl << printBuffer << endl;
260     fseek(stream,0,SEEK_SET);
261
262     extractPdu(&pdu, buffer, buffer_size);
263
264
265     cout << "Failure outcome" << endl;
266     ASN_STRUCT_RESET(asn_DEF_E2AP_PDU, &pdu);
267     memset(buffer, 0, buffer_size);
268
269     buildSetupUnSuccsessfulResponse(&pdu);
270     asn_fprint(stream, &asn_DEF_E2AP_PDU, &pdu);
271     cout << "Encoding E2AP PDU of size  " << size << endl << printBuffer << endl;
272     fseek(stream,0,SEEK_SET);
273
274     extractPdu(&pdu, buffer, buffer_size);
275     memset(buffer, 0, buffer_size);
276
277     buildResetReq(&pdu);
278     asn_fprint(stream, &asn_DEF_E2AP_PDU, &pdu);
279     cout << "Encoding E2AP PDU (Reset Request) of size  " << size << endl << printBuffer << endl;
280     fseek(stream,0,SEEK_SET);
281
282     extractPdu(&pdu, buffer, buffer_size);
283     memset(buffer, 0, buffer_size);
284
285
286     buildServiceQuery(&pdu);
287     asn_fprint(stream, &asn_DEF_E2AP_PDU, &pdu);
288     cout << "Encoding E2AP PDU (service query) of size  " << size << endl << printBuffer << endl;
289     fseek(stream,0,SEEK_SET);
290
291     extractPdu(&pdu, buffer, buffer_size);
292     memset(buffer, 0, buffer_size);
293
294     buildServiceUpdateResponce(&pdu);
295     asn_fprint(stream, &asn_DEF_E2AP_PDU, &pdu);
296     cout << "Encoding E2AP PDU (service update ack) of size  " << size << endl << printBuffer << endl;
297     fseek(stream,0,SEEK_SET);
298
299     extractPdu(&pdu, buffer, buffer_size);
300     memset(buffer, 0, buffer_size);
301
302     buildResetResponse(&pdu);
303     asn_fprint(stream, &asn_DEF_E2AP_PDU, &pdu);
304     cout << "Encoding E2AP PDU (reset response example) of size  " << size << endl << printBuffer << endl;
305     fseek(stream,0,SEEK_SET);
306
307     extractPdu(&pdu, buffer, buffer_size);
308     memset(buffer, 0, buffer_size);
309
310 }