blob: 7626b7bee67061dbfb9f1079cb35aaa80ced51f0 [file] [log] [blame]
Harald Weltea013e682018-06-18 19:49:39 +02001
2#include <string.h>
3#include <stdarg.h>
4#include "RANAP_PDU_Descriptions.hh"
5
6extern "C" {
7#include <fftranscode/transcode.h>
8}
9
10namespace RANAP__Types {
11
12TTCN_Module RANAP__EncDec("RANAP_EncDec", __DATE__, __TIME__);
13
14OCTETSTRING enc__RANAP__PDU(const RANAP__PDU__Descriptions::RANAP__PDU &pdu)
15{
16 uint8_t *aper_buf;
17 int aper_buf_len;
18 TTCN_Buffer TTCN_buf;
19 TTCN_buf.clear();
20
21 /* Encode from abstract data type into BER/DER */
22 pdu.encode(RANAP__PDU__Descriptions::RANAP__PDU_descr_, TTCN_buf,
23 TTCN_EncDec::CT_BER, BER_ENCODE_DER);
24
25 aper_buf_len = fftranscode_ber2aper(FFTRANSC_T_RANAP, &aper_buf, TTCN_buf.get_data(), TTCN_buf.get_len());
26 if (aper_buf_len < 0) {
27 TTCN_Logger::begin_event_log2str();
28 TTCN_buf.log();
29 TTCN_error("fftranscode_ber2aper failed: %s", (const char *) TTCN_Logger::end_event_log2str());
30 }
31
32 /* make octetstring from output buffer */
33 OCTETSTRING ret_val(aper_buf_len, aper_buf);
34
35 /* release dynamically-allocated output buffer */
36 fftranscode_free(aper_buf);
37
38 return ret_val;
39}
40
41RANAP__PDU__Descriptions::RANAP__PDU dec__RANAP__PDU(const OCTETSTRING &stream)
42{
43 uint8_t *ber_buf;
44 int ber_buf_len;
45
46 /* First, decode APER + re-encode as BER */
47 ber_buf_len = fftranscode_aper2ber(FFTRANSC_T_RANAP, &ber_buf, (const unsigned char *)stream, stream.lengthof());
48 if (ber_buf_len < 0) {
49 TTCN_error("fftranscode_aper2ber failed.");
50 }
51
52 /* Then, re-encode from BER to TITAN representation */
53 RANAP__PDU__Descriptions::RANAP__PDU ret_dcc;
54 TTCN_Buffer TTCN_buf;
55 TTCN_buf.clear();
56 TTCN_buf.put_s(ber_buf_len, ber_buf);
57
58 ret_dcc.decode(RANAP__PDU__Descriptions::RANAP__PDU_descr_, TTCN_buf,
59 TTCN_EncDec::CT_BER, BER_ACCEPT_ALL);
60
61 fftranscode_free(ber_buf);
62
63 return ret_dcc;
64}
65
66}