libe3 0.2.5
C++ library for E3AP RAN vendor integration
Loading...
Searching...
No Matches
e3_encoder.hpp
Go to the documentation of this file.
1/**
2 * @file e3_encoder.hpp
3 * @brief Abstract E3 Encoder interface for PDU encoding/decoding
4 *
5 * Defines the abstract interface for encoding and decoding E3AP PDUs.
6 * Ported from the original C implementation's e3ap_handler functions.
7 *
8 * SPDX-FileCopyrightText: Copyright (c) 2026 Northeastern University
9 * SPDX-License-Identifier: Apache-2.0
10 */
11
12#ifndef LIBE3_E3_ENCODER_HPP
13#define LIBE3_E3_ENCODER_HPP
14
15#include "types.hpp"
16#include <memory>
17#include <optional>
18#include <tl/expected.hpp>
19
20namespace libe3 {
21
22/**
23 * @brief Result type for encoding/decoding operations
24 */
25template<typename T>
26using EncodeResult = tl::expected<T, ErrorCode>;
27
28/**
29 * @brief Abstract base class for E3AP encoders
30 *
31 * This class defines the interface for encoding and decoding E3AP PDUs.
32 * The design allows for multiple encoding formats (ASN.1, JSON) while
33 * maintaining the same API.
34 *
35 * Derived classes:
36 * - ASN1E3Encoder: ASN.1 PER encoding (O-RAN standard)
37 * - JsonE3Encoder: JSON encoding (for development/debugging)
38 */
39class E3Encoder {
40public:
41 virtual ~E3Encoder() = default;
42
43 // Non-copyable, movable
44 E3Encoder(const E3Encoder&) = delete;
45 E3Encoder& operator=(const E3Encoder&) = delete;
46 E3Encoder(E3Encoder&&) = default;
48
49 /**
50 * @brief Encode a PDU to bytes
51 * @param pdu PDU to encode
52 * @return Encoded message on success, error code on failure
53 */
54 virtual EncodeResult<EncodedMessage> encode(const Pdu& pdu) = 0;
55
56 /**
57 * @brief Decode bytes to a PDU
58 * @param encoded Encoded message to decode
59 * @return Decoded PDU on success, error code on failure
60 */
61 virtual EncodeResult<Pdu> decode(const EncodedMessage& encoded) = 0;
62
63 /**
64 * @brief Decode bytes to a PDU
65 * @param data Raw data buffer
66 * @param size Size of data
67 * @return Decoded PDU on success, error code on failure
68 */
69 virtual EncodeResult<Pdu> decode(const uint8_t* data, size_t size) = 0;
70
71 /**
72 * @brief Get the encoding format
73 */
74 virtual EncodingFormat format() const noexcept = 0;
75
76 // Convenience methods for creating specific PDUs
77
78 /**
79 * @brief Create and encode a Setup Request PDU
80 * @param message_id Unique message ID
81 * @param e3ap_protocol_version E3AP protocol version string (e.g., "0.0.0")
82 * @param dapp_name Name of the dApp
83 * @param dapp_version Version of the dApp (e.g., "0.0.0")
84 * @param vendor Vendor name (max 30 chars)
85 */
87 uint32_t message_id,
88 const std::string& e3ap_protocol_version,
89 const std::string& dapp_name,
90 const std::string& dapp_version,
91 const std::string& vendor
92 );
93
94 /**
95 * @brief Create and encode a Setup Response PDU
96 * @param message_id Unique message ID
97 * @param request_id ID of the corresponding SetupRequest
98 * @param response_code Response code (positive/negative)
99 * @param e3ap_protocol_version E3AP protocol version (optional)
100 * @param dapp_identifier Assigned dApp identifier (optional)
101 * @param ran_identifier RAN identifier
102 * @param ran_function_list List of available RAN functions (optional).
103 * std::nullopt and an empty list both encode with the OPTIONAL
104 * ranFunctionList absent on the wire.
105 */
107 uint32_t message_id,
108 uint32_t request_id,
109 ResponseCode response_code,
110 const std::optional<std::string>& e3ap_protocol_version = std::nullopt,
111 const std::optional<uint32_t>& dapp_identifier = std::nullopt,
112 const std::string& ran_identifier = "",
113 const std::optional<std::vector<RanFunctionDef>>& ran_function_list = std::nullopt
114 );
115
116 /**
117 * @brief Create and encode a Subscription Request PDU
118 * @param message_id Unique message ID
119 * @param dapp_identifier dApp identifier
120 * @param ran_function_identifier RAN function to subscribe to
121 * @param telemetry_identifier_list List of telemetry identifiers
122 * @param control_identifier_list List of control identifiers
123 * @param subscription_time How long to keep the subscription (0-3600 sec, optional)
124 */
126 uint32_t message_id,
127 uint32_t dapp_identifier,
128 uint32_t ran_function_identifier,
129 const std::vector<uint32_t>& telemetry_identifier_list,
130 const std::vector<uint32_t>& control_identifier_list,
131 const std::optional<uint32_t>& subscription_time = std::nullopt
132 );
133
134 /**
135 * @brief Create and encode a Subscription Delete PDU
136 * @param message_id Unique message ID
137 * @param dapp_identifier dApp identifier
138 * @param subscription_id Subscription ID to delete
139 */
141 uint32_t message_id,
142 uint32_t dapp_identifier,
143 uint32_t subscription_id
144 );
145
146 /**
147 * @brief Create and encode a Subscription Response PDU
148 * @param message_id Unique message ID
149 * @param request_id ID of the corresponding SubscriptionRequest
150 * @param dapp_identifier dApp identifier
151 * @param response_code Response code (positive/negative)
152 * @param subscription_id Subscription ID (optional)
153 */
155 uint32_t message_id,
156 uint32_t request_id,
157 uint32_t dapp_identifier,
158 ResponseCode response_code,
159 const std::optional<uint32_t>& subscription_id = std::nullopt
160 );
161
162 /**
163 * @brief Create and encode an Indication Message PDU
164 * @param message_id Unique message ID
165 * @param dapp_identifier dApp identifier
166 * @param ran_function_identifier RAN function identifier
167 * @param protocol_data Protocol data
168 */
170 uint32_t message_id,
171 uint32_t dapp_identifier,
172 uint32_t ran_function_identifier,
173 const std::vector<uint8_t>& protocol_data
174 );
175
176 /**
177 * @brief Create and encode a dApp Control Action PDU
178 * @param message_id Unique message ID
179 * @param dapp_identifier dApp identifier
180 * @param ran_function_identifier RAN function identifier
181 * @param control_identifier Control identifier
182 * @param action_data Action data
183 */
185 uint32_t message_id,
186 uint32_t dapp_identifier,
187 uint32_t ran_function_identifier,
188 uint32_t control_identifier,
189 const std::vector<uint8_t>& action_data
190 );
191
192 /**
193 * @brief Create and encode a dApp Report PDU
194 * @param message_id Unique message ID
195 */
197 uint32_t message_id,
198 uint32_t dapp_identifier,
199 uint32_t ran_function_identifier,
200 const std::vector<uint8_t>& report_data
201 );
202
203 /**
204 * @brief Create and encode an xApp Control Action PDU
205 * @param message_id Unique message ID
206 */
208 uint32_t message_id,
209 uint32_t dapp_identifier,
210 uint32_t ran_function_identifier,
211 const std::vector<uint8_t>& xapp_control_data
212 );
213
214 /**
215 * @brief Create and encode a Message Acknowledgment PDU
216 * @param message_id Unique message ID
217 */
219 uint32_t message_id,
220 uint32_t request_id,
221 ResponseCode response_code
222 );
223
224protected:
225 E3Encoder() = default;
226};
227
228/**
229 * @brief Factory function to create appropriate encoder
230 *
231 * Creates an encoder instance based on the encoding format specified.
232 *
233 * @param format Encoding format to use
234 * @return Unique pointer to created encoder, nullptr on failure
235 */
237
238} // namespace libe3
239
240#endif // LIBE3_E3_ENCODER_HPP
EncodeResult< EncodedMessage > encode_subscription_response(uint32_t message_id, uint32_t request_id, uint32_t dapp_identifier, ResponseCode response_code, const std::optional< uint32_t > &subscription_id=std::nullopt)
Create and encode a Subscription Response PDU.
virtual ~E3Encoder()=default
EncodeResult< EncodedMessage > encode_setup_request(uint32_t message_id, const std::string &e3ap_protocol_version, const std::string &dapp_name, const std::string &dapp_version, const std::string &vendor)
Create and encode a Setup Request PDU.
E3Encoder & operator=(E3Encoder &&)=default
E3Encoder & operator=(const E3Encoder &)=delete
E3Encoder(E3Encoder &&)=default
virtual EncodeResult< Pdu > decode(const EncodedMessage &encoded)=0
Decode bytes to a PDU.
E3Encoder(const E3Encoder &)=delete
EncodeResult< EncodedMessage > encode_dapp_control_action(uint32_t message_id, uint32_t dapp_identifier, uint32_t ran_function_identifier, uint32_t control_identifier, const std::vector< uint8_t > &action_data)
Create and encode a dApp Control Action PDU.
virtual EncodingFormat format() const noexcept=0
Get the encoding format.
EncodeResult< EncodedMessage > encode_xapp_control_action(uint32_t message_id, uint32_t dapp_identifier, uint32_t ran_function_identifier, const std::vector< uint8_t > &xapp_control_data)
Create and encode an xApp Control Action PDU.
EncodeResult< EncodedMessage > encode_subscription_request(uint32_t message_id, uint32_t dapp_identifier, uint32_t ran_function_identifier, const std::vector< uint32_t > &telemetry_identifier_list, const std::vector< uint32_t > &control_identifier_list, const std::optional< uint32_t > &subscription_time=std::nullopt)
Create and encode a Subscription Request PDU.
EncodeResult< EncodedMessage > encode_subscription_delete(uint32_t message_id, uint32_t dapp_identifier, uint32_t subscription_id)
Create and encode a Subscription Delete PDU.
virtual EncodeResult< Pdu > decode(const uint8_t *data, size_t size)=0
Decode bytes to a PDU.
EncodeResult< EncodedMessage > encode_message_ack(uint32_t message_id, uint32_t request_id, ResponseCode response_code)
Create and encode a Message Acknowledgment PDU.
virtual EncodeResult< EncodedMessage > encode(const Pdu &pdu)=0
Encode a PDU to bytes.
EncodeResult< EncodedMessage > encode_indication_message(uint32_t message_id, uint32_t dapp_identifier, uint32_t ran_function_identifier, const std::vector< uint8_t > &protocol_data)
Create and encode an Indication Message PDU.
EncodeResult< EncodedMessage > encode_setup_response(uint32_t message_id, uint32_t request_id, ResponseCode response_code, const std::optional< std::string > &e3ap_protocol_version=std::nullopt, const std::optional< uint32_t > &dapp_identifier=std::nullopt, const std::string &ran_identifier="", const std::optional< std::vector< RanFunctionDef > > &ran_function_list=std::nullopt)
Create and encode a Setup Response PDU.
EncodeResult< EncodedMessage > encode_dapp_report(uint32_t message_id, uint32_t dapp_identifier, uint32_t ran_function_identifier, const std::vector< uint8_t > &report_data)
Create and encode a dApp Report PDU.
std::unique_ptr< E3Encoder > create_encoder(EncodingFormat format)
Factory function to create appropriate encoder.
ResponseCode
E3AP response codes.
Definition types.hpp:101
EncodingFormat
E3AP encoding formats supported by the library.
Definition types.hpp:51
tl::expected< T, ErrorCode > EncodeResult
Result type for encoding/decoding operations.
Encoded message wrapper.
Definition types.hpp:175
Generic E3AP PDU structure.
Definition types.hpp:345
RAN Function Definition for Setup Response.
Definition types.hpp:211
E3AP Protocol Types - Vendor-neutral type definitions.