aboutsummaryrefslogtreecommitdiffstats
path: root/library/ranap/RANAP_EncDec.cc
diff options
context:
space:
mode:
Diffstat (limited to 'library/ranap/RANAP_EncDec.cc')
-rw-r--r--library/ranap/RANAP_EncDec.cc66
1 files changed, 66 insertions, 0 deletions
diff --git a/library/ranap/RANAP_EncDec.cc b/library/ranap/RANAP_EncDec.cc
new file mode 100644
index 00000000..7626b7be
--- /dev/null
+++ b/library/ranap/RANAP_EncDec.cc
@@ -0,0 +1,66 @@
+
+#include <string.h>
+#include <stdarg.h>
+#include "RANAP_PDU_Descriptions.hh"
+
+extern "C" {
+#include <fftranscode/transcode.h>
+}
+
+namespace RANAP__Types {
+
+TTCN_Module RANAP__EncDec("RANAP_EncDec", __DATE__, __TIME__);
+
+OCTETSTRING enc__RANAP__PDU(const RANAP__PDU__Descriptions::RANAP__PDU &pdu)
+{
+ uint8_t *aper_buf;
+ int aper_buf_len;
+ TTCN_Buffer TTCN_buf;
+ TTCN_buf.clear();
+
+ /* Encode from abstract data type into BER/DER */
+ pdu.encode(RANAP__PDU__Descriptions::RANAP__PDU_descr_, TTCN_buf,
+ TTCN_EncDec::CT_BER, BER_ENCODE_DER);
+
+ aper_buf_len = fftranscode_ber2aper(FFTRANSC_T_RANAP, &aper_buf, TTCN_buf.get_data(), TTCN_buf.get_len());
+ if (aper_buf_len < 0) {
+ TTCN_Logger::begin_event_log2str();
+ TTCN_buf.log();
+ TTCN_error("fftranscode_ber2aper failed: %s", (const char *) TTCN_Logger::end_event_log2str());
+ }
+
+ /* make octetstring from output buffer */
+ OCTETSTRING ret_val(aper_buf_len, aper_buf);
+
+ /* release dynamically-allocated output buffer */
+ fftranscode_free(aper_buf);
+
+ return ret_val;
+}
+
+RANAP__PDU__Descriptions::RANAP__PDU dec__RANAP__PDU(const OCTETSTRING &stream)
+{
+ uint8_t *ber_buf;
+ int ber_buf_len;
+
+ /* First, decode APER + re-encode as BER */
+ ber_buf_len = fftranscode_aper2ber(FFTRANSC_T_RANAP, &ber_buf, (const unsigned char *)stream, stream.lengthof());
+ if (ber_buf_len < 0) {
+ TTCN_error("fftranscode_aper2ber failed.");
+ }
+
+ /* Then, re-encode from BER to TITAN representation */
+ RANAP__PDU__Descriptions::RANAP__PDU ret_dcc;
+ TTCN_Buffer TTCN_buf;
+ TTCN_buf.clear();
+ TTCN_buf.put_s(ber_buf_len, ber_buf);
+
+ ret_dcc.decode(RANAP__PDU__Descriptions::RANAP__PDU_descr_, TTCN_buf,
+ TTCN_EncDec::CT_BER, BER_ACCEPT_ALL);
+
+ fftranscode_free(ber_buf);
+
+ return ret_dcc;
+}
+
+}