2 * Copyright 2020 AT&T Intellectual Property
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.
25 //#include <mdclog/mdclog.h>
28 #include "oranE2/E2AP-PDU.h"
29 #include "oranE2/InitiatingMessage.h"
30 #include "oranE2/SuccessfulOutcome.h"
31 #include "oranE2/UnsuccessfulOutcome.h"
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"
39 #include "E2Builder.h"
44 #include "BuildRunName.h"
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);
59 void extractPdu(E2AP_PDU_t *pdu, unsigned char *buffer, int buffer_size) {
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;
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;
69 cout << "XML result = " << buffer << endl;
74 std::string otherXml = "<E2AP-PDU>\n"
75 " <successfulOutcome>\n"
76 " <procedureCode>1</procedureCode>\n"
77 " <criticality><reject/></criticality>\n"
79 " <E2setupResponse>\n"
81 " <E2setupResponseIEs>\n"
83 " <criticality><reject/></criticality>\n"
86 " <pLMN-Identity>13 10 14</pLMN-Identity>\n"
88 " 10011001101010101011"
92 " </E2setupResponseIEs>\n"
93 " <E2setupResponseIEs>\n"
95 " <criticality><reject/></criticality>\n"
97 " <RANfunctionsID-List>\n"
98 " <ProtocolIE-SingleContainer>\n"
100 " <criticality><ignore/></criticality>\n"
102 " <RANfunctionID-Item>\n"
103 " <ranFunctionID>1</ranFunctionID>\n"
104 " <ranFunctionRevision>1</ranFunctionRevision>\n"
105 " </RANfunctionID-Item>\n"
107 " </ProtocolIE-SingleContainer>\n"
108 " <ProtocolIE-SingleContainer>\n"
110 " <criticality><ignore/></criticality>\n"
112 " <RANfunctionID-Item>\n"
113 " <ranFunctionID>2</ranFunctionID>\n"
114 " <ranFunctionRevision>1</ranFunctionRevision>\n"
115 " </RANfunctionID-Item>\n"
117 " </ProtocolIE-SingleContainer>\n"
118 " <ProtocolIE-SingleContainer>\n"
120 " <criticality><ignore/></criticality>\n"
122 " <RANfunctionID-Item>\n"
123 " <ranFunctionID>3</ranFunctionID>\n"
124 " <ranFunctionRevision>1</ranFunctionRevision>\n"
125 " </RANfunctionID-Item>\n"
127 " </ProtocolIE-SingleContainer>\n"
128 " </RANfunctionsID-List>\n"
130 " </E2setupResponseIEs>\n"
132 " </E2setupResponse>\n"
134 " </successfulOutcome>\n"
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>"
147 "<E2setupFailureIEs>"
149 "<criticality><reject/></criticality>"
153 "<transport-resource-unavailable/>"
157 "</E2setupFailureIEs>"
161 "</unsuccessfulOutcome>"
166 std::string otherSucc = " <E2AP-PDU>"
167 "<successfulOutcome>"
168 "<procedureCode>1</procedureCode>"
169 "<criticality><reject/></criticality>"
173 "<E2setupResponseIEs>"
175 "<criticality><reject/></criticality>"
178 "<pLMN-Identity>131014</pLMN-Identity>"
179 "<ric-ID>10101010110011001110</ric-ID>"
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>";
184 auto main(const int argc, char **argv) -> int {
188 FILE *stream = open_memstream(&printBuffer, &size);
189 auto buffer_size = 8192;
190 unsigned char buffer[8192] = {};
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;
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);
205 cout << "=========================" << endl << endl << endl << "========================" << endl;
209 int ret = asn_check_constraints(&asn_DEF_E2AP_PDU, &pdu, errbuf, (size_t *)&errlen);
211 cout << "Constraint validation failed: " << errbuf << endl;
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);
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);
224 extractPdu(&pdu, buffer, buffer_size);
225 buildRanName(&pdu, buffer);
226 cout << "Ran name = " << buffer << endl;
228 ASN_STRUCT_RESET(asn_DEF_E2AP_PDU, &pdu);
229 memset(buffer, 0, buffer_size);
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;
238 extractPdu(&pdu, buffer, buffer_size);
239 buildRanName(&pdu, buffer);
240 cout << "Ran name = " << buffer << endl;
242 ASN_STRUCT_RESET(asn_DEF_E2AP_PDU, &pdu);
243 memset(buffer, 0, buffer_size);
245 buildSetupRequestWithFunc(&pdu, 311, 410);
246 extractPdu(&pdu, buffer, buffer_size);
248 buildRanName(&pdu, buffer);
249 cout << "Ran name = " << buffer << endl;
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};
256 buildSetupSuccsessfulResponse(&pdu, 311, 410, data);
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);
262 extractPdu(&pdu, buffer, buffer_size);
265 cout << "Failure outcome" << endl;
266 ASN_STRUCT_RESET(asn_DEF_E2AP_PDU, &pdu);
267 memset(buffer, 0, buffer_size);
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);
274 extractPdu(&pdu, buffer, buffer_size);
275 memset(buffer, 0, buffer_size);
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);
282 extractPdu(&pdu, buffer, buffer_size);
283 memset(buffer, 0, buffer_size);
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);
291 extractPdu(&pdu, buffer, buffer_size);
292 memset(buffer, 0, buffer_size);
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);
299 extractPdu(&pdu, buffer, buffer_size);
300 memset(buffer, 0, buffer_size);
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);
307 extractPdu(&pdu, buffer, buffer_size);
308 memset(buffer, 0, buffer_size);