1c5a1297c8e0d0d63cc5594d21295c1e9757099e
[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
139 std::string newXml =
140         "<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>";
141 std::string setupFailure = "<E2AP-PDU>"
142                              "<unsuccessfulOutcome>"
143                                "<procedureCode>1</procedureCode>"
144                                "<criticality><reject/></criticality>"
145                                "<value>"
146                                  "<E2setupFailure>"
147                                    "<protocolIEs>"
148                                      "<E2setupFailureIEs>"
149                                        "<id>1</id>"
150                                        "<criticality><reject/></criticality>"
151                                        "<value>"
152                                          "<Cause>"
153                                            "<transport>"
154                                              "<transport-resource-unavailable/>"
155                                            "</transport>"
156                                          "</Cause>"
157                                        "</value>"
158                                      "</E2setupFailureIEs>"
159                                    "</protocolIEs>"
160                                  "</E2setupFailure>"
161                                "</value>"
162                              "</unsuccessfulOutcome>"
163                            "</E2AP-PDU>";
164
165
166
167 std::string otherSucc = "  <E2AP-PDU>"
168                         "<successfulOutcome>"
169                         "<procedureCode>1</procedureCode>"
170                         "<criticality><reject/></criticality>"
171                         "<value>"
172                         "<E2setupResponse>"
173                         "<protocolIEs>"
174                         "<E2setupResponseIEs>"
175                         "<id>4</id>"
176                         "<criticality><reject/></criticality>"
177                         "<value>"
178                         "<GlobalRIC-ID>"
179                         "<pLMN-Identity>131014</pLMN-Identity>"
180                         "<ric-ID>10101010110011001110</ric-ID>"
181                         "</GlobalRIC-ID>"
182                         "</value>"
183                         "</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>";
184
185 auto main(const int argc, char **argv) -> int {
186     E2AP_PDU_t pdu;
187     char *printBuffer;
188     size_t size;
189     FILE *stream = open_memstream(&printBuffer, &size);
190     auto buffer_size =  8192;
191     unsigned char buffer[8192] = {};
192
193     E2AP_PDU_t *XERpdu  = nullptr;
194     cout << "message size = " <<  otherSucc.length() << endl;
195     auto rval = asn_decode(nullptr, ATS_BASIC_XER, &asn_DEF_E2AP_PDU, (void **) &XERpdu,
196                            otherSucc.c_str(), otherSucc.length());
197     if (rval.code != RC_OK) {
198         cout <<  "Error " << rval.code << " (unpack) setup response " << endl;
199         //return -1;
200     }
201
202     asn_fprint(stream, &asn_DEF_E2AP_PDU, XERpdu);
203     cout << "Encoding E2AP PDU of size  " << size << endl << printBuffer << endl;
204     fseek(stream,0,SEEK_SET);
205
206 //    cout << "=========================" << endl << otherXml << endl << "========================" << endl;
207
208     buildSetupRequest(&pdu, 311, 410);
209     asn_fprint(stream, &asn_DEF_E2AP_PDU, &pdu);
210     cout << "Encoding E2AP PDU of size  " << size << endl << printBuffer << endl;
211     fseek(stream,0,SEEK_SET);
212
213     extractPdu(&pdu, buffer, buffer_size);
214     buildRanName(&pdu, buffer);
215     cout << "Ran name = " << buffer << endl;
216
217     ASN_STRUCT_RESET(asn_DEF_E2AP_PDU, &pdu);
218     memset(buffer, 0, buffer_size);
219
220     cout << "========== en-gnb ============" << endl;
221     buildSetupRequesteenGNB(&pdu, 320, 512);
222     asn_fprint(stream, &asn_DEF_E2AP_PDU, &pdu);
223     cout << "Encoding E2AP PDU of size  " << size << endl << printBuffer << endl;
224     fseek(stream,0,SEEK_SET);
225     cout << "========== en-gnb ============" << endl;
226
227     extractPdu(&pdu, buffer, buffer_size);
228     buildRanName(&pdu, buffer);
229     cout << "Ran name = " << buffer << endl;
230
231     ASN_STRUCT_RESET(asn_DEF_E2AP_PDU, &pdu);
232     memset(buffer, 0, buffer_size);
233
234     buildSetupRequestWithFunc(&pdu, 311, 410);
235     extractPdu(&pdu, buffer, buffer_size);
236
237     buildRanName(&pdu, buffer);
238     cout << "Ran name = " << buffer << endl;
239
240     cout << "Sucessesfull outcome" << endl;
241     ASN_STRUCT_RESET(asn_DEF_E2AP_PDU, &pdu);
242     memset(buffer, 0, buffer_size);
243     uint8_t data[4] = {0x99, 0xAA, 0xBB, 0};
244
245     buildSetupSuccsessfulResponse(&pdu, 311, 410, data);
246
247     asn_fprint(stream, &asn_DEF_E2AP_PDU, &pdu);
248     cout << "Encoding E2AP PDU of size  " << size << endl << printBuffer << endl;
249     fseek(stream,0,SEEK_SET);
250
251     extractPdu(&pdu, buffer, buffer_size);
252
253
254     cout << "Failure outcome" << endl;
255     ASN_STRUCT_RESET(asn_DEF_E2AP_PDU, &pdu);
256     memset(buffer, 0, buffer_size);
257
258     buildSetupUnSuccsessfulResponse(&pdu);
259     asn_fprint(stream, &asn_DEF_E2AP_PDU, &pdu);
260     cout << "Encoding E2AP PDU of size  " << size << endl << printBuffer << endl;
261     fseek(stream,0,SEEK_SET);
262
263     extractPdu(&pdu, buffer, buffer_size);
264 }