17#include "E3-SetupRequest.h"
18#include "E3-SetupResponse.h"
19#include "E3-RanFunctionDefinition.h"
20#include "E3-SubscriptionRequest.h"
21#include "E3-SubscriptionDelete.h"
22#include "E3-SubscriptionResponse.h"
23#include "E3-IndicationMessage.h"
24#include "E3-DAppControlAction.h"
25#include "E3-DAppReport.h"
26#include "E3-XAppControlAction.h"
27#include "E3-ReleaseMessage.h"
28#include "E3-MessageAck.h"
29#include "E3-Timestamp.h"
37constexpr const char* LOG_TAG =
"Asn1Enc";
49static_assert(
sizeof(E3_Timestamp_t) >=
sizeof(uint64_t),
50 "E3_Timestamp_t is narrower than Pdu::timestamp; "
51 "give E3-Timestamp an explicit upper bound to force INTEGER_t "
60 E3_PDU* asn1_pdu = pdu_to_asn1(pdu);
62 E3_LOG_ERROR(LOG_TAG) <<
"Failed to convert PDU to ASN.1";
63 return tl::unexpected(ErrorCode::ENCODE_FAILED);
67 std::vector<uint8_t> buffer(BUFFER_SIZE);
70 asn_enc_rval_t enc_rval = aper_encode_to_buffer(
78 if (enc_rval.encoded == -1) {
79 E3_LOG_ERROR(LOG_TAG) <<
"APER encoding failed for type: "
80 << (enc_rval.failed_type ? enc_rval.failed_type->name :
"Unknown");
81 ASN_STRUCT_FREE(asn_DEF_E3_PDU, asn1_pdu);
82 return tl::unexpected(ErrorCode::ENCODE_FAILED);
86 const size_t encoded_bytes = (
static_cast<size_t>(enc_rval.encoded) + 7) / 8;
87 buffer.resize(encoded_bytes);
89 ASN_STRUCT_FREE(asn_DEF_E3_PDU, asn1_pdu);
92 msg.
buffer = std::move(buffer);
95 E3_LOG_DEBUG(LOG_TAG) <<
"Encoded PDU: " << enc_rval.encoded <<
" bytes";
108 if (!data || size == 0) {
109 return tl::unexpected(ErrorCode::INVALID_PARAM);
113 E3_PDU* asn1_pdu =
nullptr;
114 asn_dec_rval_t dec_rval = aper_decode(
117 reinterpret_cast<void**
>(&asn1_pdu),
123 if (dec_rval.code != RC_OK) {
124 E3_LOG_ERROR(LOG_TAG) <<
"APER decoding failed with code " << dec_rval.code;
126 ASN_STRUCT_FREE(asn_DEF_E3_PDU, asn1_pdu);
128 return tl::unexpected(ErrorCode::ENCODE_FAILED);
132 Pdu pdu = asn1_to_pdu(asn1_pdu);
134 ASN_STRUCT_FREE(asn_DEF_E3_PDU, asn1_pdu);
143E3_PDU* Asn1E3Encoder::pdu_to_asn1(
const Pdu& pdu)
const {
144 E3_PDU* asn1_pdu =
static_cast<E3_PDU*
>(calloc(1,
sizeof(E3_PDU)));
159 asn1_pdu->timestamp =
160 static_cast<E3_Timestamp_t*
>(calloc(1,
sizeof(E3_Timestamp_t)));
161 if (asn1_pdu->timestamp) {
162 *asn1_pdu->timestamp =
static_cast<E3_Timestamp_t
>(pdu.
timestamp);
169 const auto* req = std::get_if<SetupRequest>(&pdu.
choice);
170 if (!req) { free(asn1_pdu);
return nullptr; }
172 asn1_pdu->msg.present = E3_PDU__msg_PR_setupRequest;
173 asn1_pdu->msg.choice.setupRequest =
static_cast<E3_SetupRequest_t*
>(
174 calloc(1,
sizeof(E3_SetupRequest_t)));
175 if (!asn1_pdu->msg.choice.setupRequest) { free(asn1_pdu);
return nullptr; }
178 OCTET_STRING_fromBuf(&asn1_pdu->msg.choice.setupRequest->e3apProtocolVersion,
179 req->e3ap_protocol_version.c_str(),
180 static_cast<int>(req->e3ap_protocol_version.size()));
183 OCTET_STRING_fromBuf(&asn1_pdu->msg.choice.setupRequest->dAppName,
184 req->dapp_name.c_str(),
185 static_cast<int>(req->dapp_name.size()));
188 OCTET_STRING_fromBuf(&asn1_pdu->msg.choice.setupRequest->dAppVersion,
189 req->dapp_version.c_str(),
190 static_cast<int>(req->dapp_version.size()));
193 OCTET_STRING_fromBuf(&asn1_pdu->msg.choice.setupRequest->vendor,
195 static_cast<int>(req->vendor.size()));
200 const auto* resp = std::get_if<SetupResponse>(&pdu.
choice);
201 if (!resp) { free(asn1_pdu);
return nullptr; }
203 asn1_pdu->msg.present = E3_PDU__msg_PR_setupResponse;
204 asn1_pdu->msg.choice.setupResponse =
static_cast<E3_SetupResponse_t*
>(
205 calloc(1,
sizeof(E3_SetupResponse_t)));
206 if (!asn1_pdu->msg.choice.setupResponse) { free(asn1_pdu);
return nullptr; }
208 asn1_pdu->msg.choice.setupResponse->requestId = resp->request_id;
209 asn1_pdu->msg.choice.setupResponse->responseCode =
213 if (resp->e3ap_protocol_version.has_value()) {
214 asn1_pdu->msg.choice.setupResponse->e3apProtocolVersion =
215 static_cast<OCTET_STRING_t*
>(calloc(1,
sizeof(OCTET_STRING_t)));
216 OCTET_STRING_fromBuf(asn1_pdu->msg.choice.setupResponse->e3apProtocolVersion,
217 resp->e3ap_protocol_version.value().c_str(),
218 static_cast<int>(resp->e3ap_protocol_version.value().size()));
222 if (resp->dapp_identifier.has_value()) {
223 asn1_pdu->msg.choice.setupResponse->dAppIdentifier =
224 static_cast<long*
>(malloc(
sizeof(
long)));
225 *asn1_pdu->msg.choice.setupResponse->dAppIdentifier = resp->dapp_identifier.value();
229 OCTET_STRING_fromBuf(&asn1_pdu->msg.choice.setupResponse->ranIdentifier,
230 resp->ran_identifier.c_str(),
231 static_cast<int>(resp->ran_identifier.size()));
234 if (!resp->ran_function_list.empty()) {
235 for (
const auto& func : resp->ran_function_list) {
236 E3_RanFunctionDefinition_t* ran_func =
237 static_cast<E3_RanFunctionDefinition_t*
>(calloc(1,
sizeof(E3_RanFunctionDefinition_t)));
238 ran_func->ranFunctionIdentifier = func.ran_function_identifier;
241 for (uint32_t tel_id : func.telemetry_identifier_list) {
242 long*
id =
static_cast<long*
>(malloc(
sizeof(
long)));
244 ASN_SEQUENCE_ADD(&ran_func->telemetryIdentifierList,
id);
248 for (uint32_t ctrl_id : func.control_identifier_list) {
249 long*
id =
static_cast<long*
>(malloc(
sizeof(
long)));
251 ASN_SEQUENCE_ADD(&ran_func->controlIdentifierList,
id);
254 OCTET_STRING_fromBuf(&ran_func->ranFunctionData,
255 reinterpret_cast<const char*
>(func.ran_function_data.data()),
256 static_cast<int>(func.ran_function_data.size()));
259 if (!asn1_pdu->msg.choice.setupResponse->ranFunctionList) {
260 asn1_pdu->msg.choice.setupResponse->ranFunctionList =
261 static_cast<decltype(asn1_pdu-
>msg.choice.setupResponse->ranFunctionList)>(
262 calloc(1,
sizeof(*asn1_pdu->msg.choice.setupResponse->ranFunctionList)));
266 ASN_SEQUENCE_ADD(&asn1_pdu->msg.choice.setupResponse->ranFunctionList->list, ran_func);
273 const auto* req = std::get_if<SubscriptionRequest>(&pdu.
choice);
274 if (!req) { free(asn1_pdu);
return nullptr; }
276 asn1_pdu->msg.present = E3_PDU__msg_PR_subscriptionRequest;
277 asn1_pdu->msg.choice.subscriptionRequest =
static_cast<E3_SubscriptionRequest_t*
>(
278 calloc(1,
sizeof(E3_SubscriptionRequest_t)));
279 if (!asn1_pdu->msg.choice.subscriptionRequest) { free(asn1_pdu);
return nullptr; }
281 asn1_pdu->msg.choice.subscriptionRequest->dAppIdentifier = req->dapp_identifier;
282 asn1_pdu->msg.choice.subscriptionRequest->ranFunctionIdentifier = req->ran_function_identifier;
285 for (uint32_t tel_id : req->telemetry_identifier_list) {
286 long*
id =
static_cast<long*
>(malloc(
sizeof(
long)));
288 ASN_SEQUENCE_ADD(&asn1_pdu->msg.choice.subscriptionRequest->telemetryIdentifierList,
id);
292 for (uint32_t ctrl_id : req->control_identifier_list) {
293 long*
id =
static_cast<long*
>(malloc(
sizeof(
long)));
295 ASN_SEQUENCE_ADD(&asn1_pdu->msg.choice.subscriptionRequest->controlIdentifierList,
id);
299 if (req->subscription_time.has_value()) {
300 asn1_pdu->msg.choice.subscriptionRequest->subscriptionTime =
301 static_cast<long*
>(malloc(
sizeof(
long)));
302 *asn1_pdu->msg.choice.subscriptionRequest->subscriptionTime = req->subscription_time.value();
305 if (req->periodicity.has_value()) {
306 asn1_pdu->msg.choice.subscriptionRequest->periodicity =
307 static_cast<long*
>(malloc(
sizeof(
long)));
308 *asn1_pdu->msg.choice.subscriptionRequest->periodicity = req->periodicity.value();
314 const auto* del = std::get_if<SubscriptionDelete>(&pdu.
choice);
315 if (!del) { free(asn1_pdu);
return nullptr; }
317 asn1_pdu->msg.present = E3_PDU__msg_PR_subscriptionDelete;
318 asn1_pdu->msg.choice.subscriptionDelete =
static_cast<E3_SubscriptionDelete_t*
>(
319 calloc(1,
sizeof(E3_SubscriptionDelete_t)));
320 if (!asn1_pdu->msg.choice.subscriptionDelete) { free(asn1_pdu);
return nullptr; }
322 asn1_pdu->msg.choice.subscriptionDelete->dAppIdentifier = del->dapp_identifier;
323 asn1_pdu->msg.choice.subscriptionDelete->subscriptionId = del->subscription_id;
328 const auto* resp = std::get_if<SubscriptionResponse>(&pdu.
choice);
329 if (!resp) { free(asn1_pdu);
return nullptr; }
331 asn1_pdu->msg.present = E3_PDU__msg_PR_subscriptionResponse;
332 asn1_pdu->msg.choice.subscriptionResponse =
static_cast<E3_SubscriptionResponse_t*
>(
333 calloc(1,
sizeof(E3_SubscriptionResponse_t)));
334 if (!asn1_pdu->msg.choice.subscriptionResponse) { free(asn1_pdu);
return nullptr; }
336 asn1_pdu->msg.choice.subscriptionResponse->requestId = resp->request_id;
337 asn1_pdu->msg.choice.subscriptionResponse->dAppIdentifier = resp->dapp_identifier;
338 asn1_pdu->msg.choice.subscriptionResponse->responseCode =
342 if (resp->subscription_id.has_value()) {
343 asn1_pdu->msg.choice.subscriptionResponse->subscriptionId =
344 static_cast<long*
>(malloc(
sizeof(
long)));
345 *asn1_pdu->msg.choice.subscriptionResponse->subscriptionId = resp->subscription_id.value();
351 const auto* msg = std::get_if<IndicationMessage>(&pdu.
choice);
352 if (!msg) { free(asn1_pdu);
return nullptr; }
354 asn1_pdu->msg.present = E3_PDU__msg_PR_indicationMessage;
355 asn1_pdu->msg.choice.indicationMessage =
static_cast<E3_IndicationMessage_t*
>(
356 calloc(1,
sizeof(E3_IndicationMessage_t)));
357 if (!asn1_pdu->msg.choice.indicationMessage) { free(asn1_pdu);
return nullptr; }
359 asn1_pdu->msg.choice.indicationMessage->dAppIdentifier = msg->dapp_identifier;
360 asn1_pdu->msg.choice.indicationMessage->ranFunctionIdentifier = msg->ran_function_identifier;
363 OCTET_STRING_fromBuf(&asn1_pdu->msg.choice.indicationMessage->protocolData,
364 reinterpret_cast<const char*
>(msg->protocol_data.data()),
365 static_cast<int>(msg->protocol_data.size()));
370 const auto* action = std::get_if<DAppControlAction>(&pdu.
choice);
371 if (!action) { free(asn1_pdu);
return nullptr; }
373 asn1_pdu->msg.present = E3_PDU__msg_PR_dAppControlAction;
374 asn1_pdu->msg.choice.dAppControlAction =
static_cast<E3_DAppControlAction_t*
>(
375 calloc(1,
sizeof(E3_DAppControlAction_t)));
376 if (!asn1_pdu->msg.choice.dAppControlAction) { free(asn1_pdu);
return nullptr; }
378 asn1_pdu->msg.choice.dAppControlAction->dAppIdentifier = action->dapp_identifier;
379 asn1_pdu->msg.choice.dAppControlAction->ranFunctionIdentifier = action->ran_function_identifier;
380 asn1_pdu->msg.choice.dAppControlAction->controlIdentifier = action->control_identifier;
385 if (action->sequence_id != 0) {
386 asn1_pdu->msg.choice.dAppControlAction->sequenceId =
387 static_cast<E3_SequenceID_t*
>(calloc(1,
sizeof(E3_SequenceID_t)));
388 if (asn1_pdu->msg.choice.dAppControlAction->sequenceId) {
389 *asn1_pdu->msg.choice.dAppControlAction->sequenceId =
390 static_cast<E3_SequenceID_t
>(action->sequence_id);
394 OCTET_STRING_fromBuf(&asn1_pdu->msg.choice.dAppControlAction->actionData,
395 reinterpret_cast<const char*
>(action->action_data.data()),
396 static_cast<int>(action->action_data.size()));
401 const auto* report = std::get_if<DAppReport>(&pdu.
choice);
402 if (!report) { free(asn1_pdu);
return nullptr; }
404 asn1_pdu->msg.present = E3_PDU__msg_PR_dAppReport;
405 asn1_pdu->msg.choice.dAppReport =
static_cast<E3_DAppReport_t*
>(
406 calloc(1,
sizeof(E3_DAppReport_t)));
407 if (!asn1_pdu->msg.choice.dAppReport) { free(asn1_pdu);
return nullptr; }
409 asn1_pdu->msg.choice.dAppReport->dAppIdentifier = report->dapp_identifier;
410 asn1_pdu->msg.choice.dAppReport->ranFunctionIdentifier = report->ran_function_identifier;
411 asn1_pdu->msg.choice.dAppReport->sequenceId =
412 static_cast<E3_SequenceID_t
>(report->sequence_id);
414 OCTET_STRING_fromBuf(&asn1_pdu->msg.choice.dAppReport->reportData,
415 reinterpret_cast<const char*
>(report->report_data.data()),
416 static_cast<int>(report->report_data.size()));
421 const auto* action = std::get_if<XAppControlAction>(&pdu.
choice);
422 if (!action) { free(asn1_pdu);
return nullptr; }
424 asn1_pdu->msg.present = E3_PDU__msg_PR_xAppControlAction;
425 asn1_pdu->msg.choice.xAppControlAction =
static_cast<E3_XAppControlAction_t*
>(
426 calloc(1,
sizeof(E3_XAppControlAction_t)));
427 if (!asn1_pdu->msg.choice.xAppControlAction) { free(asn1_pdu);
return nullptr; }
429 asn1_pdu->msg.choice.xAppControlAction->dAppIdentifier = action->dapp_identifier;
430 asn1_pdu->msg.choice.xAppControlAction->ranFunctionIdentifier = action->ran_function_identifier;
431 asn1_pdu->msg.choice.xAppControlAction->sequenceId =
432 static_cast<E3_SequenceID_t
>(action->sequence_id);
434 OCTET_STRING_fromBuf(&asn1_pdu->msg.choice.xAppControlAction->xAppControlData,
435 reinterpret_cast<const char*
>(action->xapp_control_data.data()),
436 static_cast<int>(action->xapp_control_data.size()));
441 const auto* ack = std::get_if<MessageAck>(&pdu.
choice);
442 if (!ack) { free(asn1_pdu);
return nullptr; }
444 asn1_pdu->msg.present = E3_PDU__msg_PR_messageAck;
445 asn1_pdu->msg.choice.messageAck =
static_cast<E3_MessageAck_t*
>(
446 calloc(1,
sizeof(E3_MessageAck_t)));
447 if (!asn1_pdu->msg.choice.messageAck) { free(asn1_pdu);
return nullptr; }
449 asn1_pdu->msg.choice.messageAck->requestId = ack->request_id;
450 asn1_pdu->msg.choice.messageAck->responseCode =
456 const auto* msg = std::get_if<ReleaseMessage>(&pdu.
choice);
457 if (!msg) { free(asn1_pdu);
return nullptr; }
459 asn1_pdu->msg.present = E3_PDU__msg_PR_releaseMessage;
460 asn1_pdu->msg.choice.releaseMessage =
static_cast<E3_ReleaseMessage_t*
>(
461 calloc(1,
sizeof(E3_ReleaseMessage_t)));
462 if (!asn1_pdu->msg.choice.releaseMessage) { free(asn1_pdu);
return nullptr; }
464 asn1_pdu->msg.choice.releaseMessage->dAppIdentifier = msg->dapp_identifier;
480Pdu Asn1E3Encoder::asn1_to_pdu(
const E3_PDU* asn1_pdu)
const {
484 pdu.
message_id =
static_cast<uint32_t
>(asn1_pdu->id);
491 pdu.timestamp = asn1_pdu->timestamp
492 ?
static_cast<uint64_t
>(*asn1_pdu->timestamp)
496 switch (asn1_pdu->msg.present) {
497 case E3_PDU__msg_PR_setupRequest: {
503 const OCTET_STRING_t* proto_ver = &asn1_pdu->msg.choice.setupRequest->e3apProtocolVersion;
504 req.e3ap_protocol_version.assign(
reinterpret_cast<const char*
>(proto_ver->buf), proto_ver->size);
507 const OCTET_STRING_t* dapp_name = &asn1_pdu->msg.choice.setupRequest->dAppName;
508 req.dapp_name.assign(
reinterpret_cast<const char*
>(dapp_name->buf), dapp_name->size);
511 const OCTET_STRING_t* dapp_ver = &asn1_pdu->msg.choice.setupRequest->dAppVersion;
512 req.dapp_version.assign(
reinterpret_cast<const char*
>(dapp_ver->buf), dapp_ver->size);
515 const OCTET_STRING_t* vendor = &asn1_pdu->msg.choice.setupRequest->vendor;
516 req.vendor.assign(
reinterpret_cast<const char*
>(vendor->buf), vendor->size);
522 case E3_PDU__msg_PR_setupResponse: {
526 resp.request_id =
static_cast<uint32_t
>(asn1_pdu->msg.choice.setupResponse->requestId);
527 resp.response_code = (asn1_pdu->msg.choice.setupResponse->responseCode == 0)
531 if (asn1_pdu->msg.choice.setupResponse->e3apProtocolVersion) {
532 const OCTET_STRING_t* proto_ver = asn1_pdu->msg.choice.setupResponse->e3apProtocolVersion;
533 resp.e3ap_protocol_version = std::string(
534 reinterpret_cast<const char*
>(proto_ver->buf), proto_ver->size);
538 if (asn1_pdu->msg.choice.setupResponse->dAppIdentifier) {
539 resp.dapp_identifier = *asn1_pdu->msg.choice.setupResponse->dAppIdentifier;
543 const OCTET_STRING_t* ran_id = &asn1_pdu->msg.choice.setupResponse->ranIdentifier;
544 resp.ran_identifier.assign(
reinterpret_cast<const char*
>(ran_id->buf), ran_id->size);
547 if (asn1_pdu->msg.choice.setupResponse->ranFunctionList) {
548 int count = asn1_pdu->msg.choice.setupResponse->ranFunctionList->list.count;
549 for (
int i = 0; i < count; i++) {
550 E3_RanFunctionDefinition_t* asn_func =
551 asn1_pdu->msg.choice.setupResponse->ranFunctionList->list.array[i];
553 func.ran_function_identifier =
static_cast<uint32_t
>(asn_func->ranFunctionIdentifier);
556 int tel_count = asn_func->telemetryIdentifierList.list.count;
557 for (
int j = 0; j < tel_count; j++) {
558 func.telemetry_identifier_list.push_back(
559 static_cast<uint32_t
>(*asn_func->telemetryIdentifierList.list.array[j]));
563 int ctrl_count = asn_func->controlIdentifierList.list.count;
564 for (
int j = 0; j < ctrl_count; j++) {
565 func.control_identifier_list.push_back(
566 static_cast<uint32_t
>(*asn_func->controlIdentifierList.list.array[j]));
569 func.ran_function_data.assign(
570 asn_func->ranFunctionData.buf,
571 asn_func->ranFunctionData.buf + asn_func->ranFunctionData.size);
572 resp.ran_function_list.push_back(func);
580 case E3_PDU__msg_PR_subscriptionRequest: {
583 SubscriptionRequest req;
584 req.dapp_identifier =
static_cast<uint32_t
>(asn1_pdu->msg.choice.subscriptionRequest->dAppIdentifier);
585 req.ran_function_identifier =
static_cast<uint32_t
>(asn1_pdu->msg.choice.subscriptionRequest->ranFunctionIdentifier);
588 int tel_count = asn1_pdu->msg.choice.subscriptionRequest->telemetryIdentifierList.list.count;
589 for (
int i = 0; i < tel_count; i++) {
590 req.telemetry_identifier_list.push_back(
591 static_cast<uint32_t
>(*asn1_pdu->msg.choice.subscriptionRequest->telemetryIdentifierList.list.array[i]));
595 int ctrl_count = asn1_pdu->msg.choice.subscriptionRequest->controlIdentifierList.list.count;
596 for (
int i = 0; i < ctrl_count; i++) {
597 req.control_identifier_list.push_back(
598 static_cast<uint32_t
>(*asn1_pdu->msg.choice.subscriptionRequest->controlIdentifierList.list.array[i]));
602 if (asn1_pdu->msg.choice.subscriptionRequest->subscriptionTime) {
603 req.subscription_time = *asn1_pdu->msg.choice.subscriptionRequest->subscriptionTime;
606 if (asn1_pdu->msg.choice.subscriptionRequest->periodicity) {
607 req.periodicity =
static_cast<uint32_t
>(*asn1_pdu->msg.choice.subscriptionRequest->periodicity);
614 case E3_PDU__msg_PR_subscriptionDelete: {
617 SubscriptionDelete del;
618 del.dapp_identifier =
static_cast<uint32_t
>(asn1_pdu->msg.choice.subscriptionDelete->dAppIdentifier);
619 del.subscription_id =
static_cast<uint32_t
>(asn1_pdu->msg.choice.subscriptionDelete->subscriptionId);
625 case E3_PDU__msg_PR_subscriptionResponse: {
628 SubscriptionResponse resp;
629 resp.request_id =
static_cast<uint32_t
>(asn1_pdu->msg.choice.subscriptionResponse->requestId);
630 resp.dapp_identifier =
static_cast<uint32_t
>(asn1_pdu->msg.choice.subscriptionResponse->dAppIdentifier);
631 resp.response_code = (asn1_pdu->msg.choice.subscriptionResponse->responseCode == 0)
635 if (asn1_pdu->msg.choice.subscriptionResponse->subscriptionId) {
636 resp.subscription_id = *asn1_pdu->msg.choice.subscriptionResponse->subscriptionId;
643 case E3_PDU__msg_PR_indicationMessage: {
646 IndicationMessage msg;
647 msg.dapp_identifier =
static_cast<uint32_t
>(asn1_pdu->msg.choice.indicationMessage->dAppIdentifier);
648 msg.ran_function_identifier =
static_cast<uint32_t
>(asn1_pdu->msg.choice.indicationMessage->ranFunctionIdentifier);
651 const OCTET_STRING_t* data = &asn1_pdu->msg.choice.indicationMessage->protocolData;
652 msg.protocol_data.assign(data->buf, data->buf + data->size);
658 case E3_PDU__msg_PR_dAppControlAction: {
661 DAppControlAction action;
662 action.dapp_identifier =
static_cast<uint32_t
>(asn1_pdu->msg.choice.dAppControlAction->dAppIdentifier);
663 action.ran_function_identifier =
static_cast<uint32_t
>(asn1_pdu->msg.choice.dAppControlAction->ranFunctionIdentifier);
664 action.control_identifier =
static_cast<uint32_t
>(asn1_pdu->msg.choice.dAppControlAction->controlIdentifier);
665 action.sequence_id = asn1_pdu->msg.choice.dAppControlAction->sequenceId
666 ?
static_cast<uint32_t
>(*asn1_pdu->msg.choice.dAppControlAction->sequenceId)
669 const OCTET_STRING_t* data = &asn1_pdu->msg.choice.dAppControlAction->actionData;
670 action.action_data.assign(data->buf, data->buf + data->size);
676 case E3_PDU__msg_PR_dAppReport: {
680 report.dapp_identifier =
static_cast<uint32_t
>(asn1_pdu->msg.choice.dAppReport->dAppIdentifier);
681 report.ran_function_identifier =
static_cast<uint32_t
>(asn1_pdu->msg.choice.dAppReport->ranFunctionIdentifier);
682 report.sequence_id =
static_cast<uint32_t
>(asn1_pdu->msg.choice.dAppReport->sequenceId);
684 const OCTET_STRING_t* data = &asn1_pdu->msg.choice.dAppReport->reportData;
685 report.report_data.assign(data->buf, data->buf + data->size);
691 case E3_PDU__msg_PR_xAppControlAction: {
694 XAppControlAction action;
695 action.dapp_identifier =
static_cast<uint32_t
>(asn1_pdu->msg.choice.xAppControlAction->dAppIdentifier);
696 action.ran_function_identifier =
static_cast<uint32_t
>(asn1_pdu->msg.choice.xAppControlAction->ranFunctionIdentifier);
697 action.sequence_id =
static_cast<uint32_t
>(asn1_pdu->msg.choice.xAppControlAction->sequenceId);
699 const OCTET_STRING_t* data = &asn1_pdu->msg.choice.xAppControlAction->xAppControlData;
700 action.xapp_control_data.assign(data->buf, data->buf + data->size);
706 case E3_PDU__msg_PR_messageAck: {
710 ack.request_id =
static_cast<uint32_t
>(asn1_pdu->msg.choice.messageAck->requestId);
711 ack.response_code = (asn1_pdu->msg.choice.messageAck->responseCode == 0)
718 case E3_PDU__msg_PR_releaseMessage: {
722 msg.dapp_identifier =
static_cast<uint32_t
>(asn1_pdu->msg.choice.releaseMessage->dAppIdentifier);
729 E3_LOG_ERROR(LOG_TAG) <<
"Unknown ASN.1 PDU type: " << asn1_pdu->msg.present;
ASN.1 APER Encoder for E3AP PDUs.
EncodeResult< Pdu > decode(const EncodedMessage &encoded) override
Decode bytes to a PDU.
EncodeResult< EncodedMessage > encode(const Pdu &pdu) override
Encode a PDU to bytes.
Logging facility for libe3.
#define E3_LOG_DEBUG(component)
#define E3_LOG_ERROR(component)
ResponseCode
E3AP response codes.
@ NEGATIVE
Request rejected.
@ POSITIVE
Request accepted.
@ ASN1
ASN.1 PER encoding (standard O-RAN format).
tl::expected< T, ErrorCode > EncodeResult
Result type for encoding/decoding operations.
std::vector< uint8_t > buffer
Encoded data buffer.
EncodingFormat format
Format used for encoding.
Generic E3AP PDU structure.
uint64_t timestamp
Producer timestamp, in nanoseconds since the Unix epoch.
uint32_t message_id
Unique message identifier.