fixeria submitted this change.
remove unused ROHC_CNL113426_LATEST dir
Change-Id: I30a5595ad1d0dfd2d6e4193add9e9e3503210aca
---
D ROHC_CNL113426_LATEST/doc/ROHC_CNL113426_FS.pdf
D ROHC_CNL113426_LATEST/doc/ROHC_CNL113426_PRI.pdf
D ROHC_CNL113426_LATEST/doc/ROHC_CNL113426_UG.pdf
D ROHC_CNL113426_LATEST/src/ROHC_EncDec.cc
D ROHC_CNL113426_LATEST/src/ROHC_Types.ttcn
5 files changed, 0 insertions(+), 7,846 deletions(-)
diff --git a/ROHC_CNL113426_LATEST/doc/ROHC_CNL113426_FS.pdf b/ROHC_CNL113426_LATEST/doc/ROHC_CNL113426_FS.pdf
deleted file mode 100644
index c56cc95..0000000
--- a/ROHC_CNL113426_LATEST/doc/ROHC_CNL113426_FS.pdf
+++ /dev/null
Binary files differ
diff --git a/ROHC_CNL113426_LATEST/doc/ROHC_CNL113426_PRI.pdf b/ROHC_CNL113426_LATEST/doc/ROHC_CNL113426_PRI.pdf
deleted file mode 100644
index 3de5f50..0000000
--- a/ROHC_CNL113426_LATEST/doc/ROHC_CNL113426_PRI.pdf
+++ /dev/null
Binary files differ
diff --git a/ROHC_CNL113426_LATEST/doc/ROHC_CNL113426_UG.pdf b/ROHC_CNL113426_LATEST/doc/ROHC_CNL113426_UG.pdf
deleted file mode 100644
index bf82ee9..0000000
--- a/ROHC_CNL113426_LATEST/doc/ROHC_CNL113426_UG.pdf
+++ /dev/null
Binary files differ
diff --git a/ROHC_CNL113426_LATEST/src/ROHC_EncDec.cc b/ROHC_CNL113426_LATEST/src/ROHC_EncDec.cc
deleted file mode 100644
index 4023e1b..0000000
--- a/ROHC_CNL113426_LATEST/src/ROHC_EncDec.cc
+++ /dev/null
@@ -1,6767 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////
-// //
-// Copyright Test Competence Center (TCC) ETH 2003 //
-// //
-// The copyright to the computer program(s) herein is the property of TCC. //
-// The program(s) may be used and/or copied only with the written permission //
-// of TCC or in accordance with the terms and conditions stipulated in the //
-// agreement/contract under which the program(s) has been supplied. //
-// //
-///////////////////////////////////////////////////////////////////////////////
-//
-// File: ROHC_EncDec.cc
-// Description: ROHC
-// Rev: R3A01
-// Prodnr: CNL 113 426
-// Updated: 2007-02-07
-// Contact: http://ttcn.ericsson.se
-//
-
-/* Based on RFC 3095, July 2001 */
-
-#include "IP_Types.hh"
-#include "UDP_Types.hh"
-#include "RTP_Types.hh"
-#include "ROHC_Types.hh"
-
-/* ============ Constants ============ */
-
-/* Encoding and decoding is performed using static buffers */
-#define MAX_PACKET_SIZE 1500
-#define HEXDUMP_BUFFER_SIZE 1500
-
-/* ROHC mode constants */
-#define ROHC_mode_C 0
-#define ROHC_mode_U 1
-#define ROHC_mode_O 2
-#define ROHC_mode_R 3
-
-/* Inner and outer IP level numbers */
-#define Inner_IP 1
-#define Outer_IP 0
-
-/* ============ Utilities ============ */
-
-#define isIR(val) (((val) & 0xFE) == 0xFC)
-#define isIRDYN(val) ((val) == 0xF8)
-#define isUOR2(val) (((val) & 0xE0) == 0xC0)
-
-/* Shifts the passed bit value from the position 0 to position N. */
-#define ShiftUpBit(val, position) ((val) << (position)) & (0x01 << (position))
-
-/* Shifts the passed bit value from the position N to position 0. */
-#define ShiftDownBit(val, position) (((val) >> (position)) & 0x01)
-
-/* Logs an event, when the 'value' field in the type 'typename' is not
- implemented. 'typename' must be provided in '"'s */
-#define Log_not_implemented_union_field(typename, value) \
-TTCN_error("Encoding of the selected union field (%u) in type " \
- typename " is not implemented", (value));
-
-/* Prints a hexdump of the buffer 'buf' in length 'length'. */
-#define Log_hexdump(buf, length) \
-TTCN_logger.log(TTCN_DEBUG, "Buffer (length = %d):\n%s", \
- (length), debug_hexdump((buf), debug_buf, (length)));
-
-/* Logs the name of the function on entering */
-#define Log_function_name_on_enter() \
-TTCN_logger.log(TTCN_DEBUG, "Entering %s", __FUNCTION__);
-
-/* Logs the name of the function on leaving */
-#define Log_function_name_on_leave() \
-TTCN_logger.log(TTCN_DEBUG, "Leaving %s", __FUNCTION__);
-
-/* Logs an object */
-#define Log_object(o) \
-TTCN_logger.begin_event(TTCN_DEBUG); \
-(o).log(); \
-TTCN_logger.end_event(); \
-
-//**********************************************************
-// NAMESPACE
-//**********************************************************
-
-namespace ROHC__Types {
-
-using namespace General__Types;
-using namespace IP__Types;
-using namespace UDP__Types;
-using namespace RTP__Types;
-
-/* Umbrella type for parsing an incoming ROHC packet */
-typedef struct
-{
- ROHC__context & context;
- int cid;
- int compressed_ah_data_len[2];
- bool ipx_gre_cksum_present[2];
-} t_dat;
-
-/* TODO: this is not a thread-safe thing to do. For FT, it does not
- matter, but the buffer should be allocated dynamically. */
-static char debug_buf[HEXDUMP_BUFFER_SIZE];
-
-static char *
-debug_hexdump(const unsigned char *src_buf, char *dest_buf, unsigned int len)
-{
- unsigned int offset = 0;
- char val;
-
- memset(dest_buf, 0, HEXDUMP_BUFFER_SIZE);
-
- if (src_buf == NULL || len == 0)
- return dest_buf;
-
- for (unsigned int i = 0; i < len; i++)
- {
- if ((i % 16) == 0 && i > 0)
- {
- dest_buf[offset] = 0x0A; /* newline after each line */
- offset++;
- }
- if ((i % 8) == 0)
- {
- dest_buf[offset] = 0x20; /* space after 8 characters */
- offset++;
- }
- val = (src_buf[i] >> 4) & 0x0F; /* First digit */
- val = (val < 10) ? (val + 48) : (val + 65 - 10);
- dest_buf[offset] = val;
- offset++;
- val = src_buf[i] & 0x0F; /* Second digit */
- val = (val < 10) ? (val + 48) : (val + 65 - 10);
- dest_buf[offset] += val;
- offset++;
- dest_buf[offset] = 0x20; /* space after the value */
- offset++;
- }
-
- return dest_buf;
-}
-
-/* ============ Consistency check routines ============ */
-void
-Check_field_value(char *text, int urherenow, int wannabe)
-{
- if (wannabe != urherenow)
- {
- TTCN_logger.log(TTCN_WARNING, "Field '%s' must be %u, %u is given",
- text, wannabe, urherenow);
- }
-}
-
-void
-Check_field_presence(char *text, bool flag, bool presence)
-{
- if (flag && !presence)
- {
- TTCN_logger.log(TTCN_WARNING, "Field '%s' must be present, when "
- "its presence flag is set", text);
- }
- else if (!flag && presence)
- {
- TTCN_logger.log(TTCN_WARNING, "Field '%s' must not be present, when "
- "its presence flag is unset", text);
- }
-}
-
-void
-Check_feedback_code__size(const INT3b & code, const OPTIONAL < LIN1 > &size)
-{
- if (size.ispresent() && code > 0)
- {
- TTCN_logger.log(TTCN_WARNING,
- "Code field must be 0, when size field is specified");
- }
-}
-
-void
-Check_feedback_optlen__optsize(const INT4b & len,
- const OPTIONAL < OCTETSTRING > &data)
-{
- if (data.ispresent() && (data().lengthof() != len))
- {
- int flen = len;
- int fdatalen = data().lengthof();
- TTCN_logger.log(TTCN_WARNING,
- "Feedback option length (%u) is different from "
- "the length of feedback option data (%u)", flen, fdatalen);
- }
- else if (!data.ispresent() && len > 0)
- {
- int flen = len;
- TTCN_logger.log(TTCN_WARNING,
- "No feedback option data, but feedback option length "
- "is not 0 (%u)", flen);
- }
-}
-
-void
-Check_ps_bit__xi_format(const BIT1 & psbit,
- const OPTIONAL < XI__list > &xilist)
-{
- if (!xilist.ispresent())
- return;
- if (xilist().get_selection() == XI__list::ALT_xi__item8 && (*psbit) == 0)
- {
- TTCN_logger.log(TTCN_WARNING, "PS bit is 0, 4-bit indices must be used");
- }
- else if (xilist().get_selection() == XI__list::ALT_xi__item4 && (*psbit) == 1)
- {
- TTCN_logger.log(TTCN_WARNING, "PS bit is 1, 8-bit indices must be used");
- }
-}
-
-INTEGER
-ComputeCRC(const unsigned char *buf, int length, int crclen)
-{
- int crcval, poly, shiftmask;
-
- Log_function_name_on_enter();
- TTCN_logger.log(TTCN_DEBUG, "Calculating CRC-%d over:", crclen);
- Log_hexdump(buf, length);
-
- switch (crclen)
- {
- case 3:
- poly = 0x06;
- crcval = 0x07;
- shiftmask = 0x03;
- break;
-
- case 7:
- poly = 0x79;
- crcval = 0x7F;
- shiftmask = 0x3F;
- break;
-
- case 8:
- poly = 0xE0;
- crcval = 0xFF;
- shiftmask = 0x7F;
- break;
-
- case 32:
- poly = 0xEDB88320;
- crcval = 0xFFFFFFFF;
- shiftmask = 0x7FFFFFFF;
- break;
-
- default:
- poly = 0;
- TTCN_error("Unknown CRC length(%d)\n", crclen);
- break;
- }
-
- if (poly == 0)
- return 0;
-
- for (int i = 0; i < length; i++)
- {
- for (int j = 0; j < 8; j++)
- {
- if ((crcval & 0x01) ^ (ShiftDownBit(buf[i], j)))
- {
- crcval = (crcval >> 1) & shiftmask;
- crcval ^= poly;
- }
- else
- {
- crcval = (crcval >> 1) & shiftmask;
- }
- }
- }
-
- /* CRC-32 in ROHC needs to be negated at the end */
- if (crclen == 32)
- {
- crcval ^= 0xffffffff;
- }
-
- Log_function_name_on_leave();
-
- unsigned int ui = (unsigned int)crcval;
- char sbuf[16];
- sprintf(sbuf, "%u", ui);
-
- return INTEGER(sbuf);
-}
-
-/* ============ Encoding functions for base types ============ */
-
-/** Returns the index of the innermost IP level, based on the number of
- IP levels in the context. */
-int
-getInnermostIPidx(t_dat *dat)
-{
- // More than 1 levels: the innermost is always the index = 1
- if (dat->context.ip__ctx().size_of() > 1)
- return Inner_IP;
- else
- // The index is the one and only 0.
- return Outer_IP;
-}
-
-/* Returns the index of the inner or outer IP level in the context, based on the
- number of the IP levels in the context. If the return value is negative,
- it indicates that the outer IP level does not exists. Negative value is
- never returned, if the ip_level is the Inner IP level. */
-int
-getIPidx(t_dat *dat, int ip_level)
-{
- if (ip_level == Outer_IP)
- {
- if (dat->context.ip__ctx().size_of() > 1)
- return Outer_IP;
- else
- return -1;
- }
- else if (ip_level == Inner_IP)
- return getInnermostIPidx(dat);
- else
- return ip_level;
-}
-
-/** Initializes the context of the specified IP level. */
-void
-initIPcontext(t_dat *dat, int ip_level, int ip_version)
-{
- unsigned char ctemp = 0;
- IP__context & field = dat->context.ip__ctx()[ip_level];
-
- Log_function_name_on_enter();
-
- field.version() = INTEGER(ip_version);
- if (! field.rnd__bit().is_bound()) field.rnd__bit() = BOOLEAN(ctemp);
- if (! field.ah__present().is_bound()) field.ah__present() = BOOLEAN(ctemp);
- if (! field.gre__present().is_bound()) field.gre__present() = BOOLEAN(ctemp);
- if (! field.esp__present().is_bound()) field.esp__present() = BOOLEAN(ctemp);
- if (! field.ah__data__len().is_bound())
- field.ah__data__len() = INTEGER(ctemp);
- if (! field.gre__cksum__present().is_bound())
- field.gre__cksum__present() = BOOLEAN(ctemp);
-
- Log_object(dat->context);
-
- Log_function_name_on_leave();
-}
-
-/** Initializes the UDP context. */
-void
-initUDPcontext(t_dat *dat)
-{
- unsigned char ctemp = 1;
- UDP__context & field = dat->context.udp__ctx();
-
- if (! field.udp__cksum().is_bound()) field.udp__cksum() = BOOLEAN(ctemp);
-}
-
-/** Initializes the specified CID's context. */
-void
-initCIDcontext(t_dat *dat)
-{
- unsigned char ctemp = 0;
- ROHC__context & field = dat->context;
-
- if (! field.mode().is_bound()) field.mode() = INTEGER(cg__ROHC__mode__U);
- if (! field.profile().is_bound()) field.profile() = INTEGER(ctemp);
- if (! field.pkt().is_bound()) field.pkt() = Packet__type(Packet__type::IR);
- if (! field.ip__ctx().is_bound()) initIPcontext(dat, 0, 4);
- initUDPcontext(dat);
-}
-
-/** Initializes the umbrella type before the ROHC packet parsing starts. */
-t_dat
-initTDAT(ROHC__config & config, int cid)
-{
- t_dat dat = { config.context()[cid], cid, {0, 0}, {false, false} };
-
- // Expect AH auth data and GRE checksum after the compressed header
- // by default. If the uncompressed form is used, these values will be
- // set to 0 or false during parsing.
- dat.compressed_ah_data_len[0] =
- config.context()[cid].ip__ctx()[0].ah__data__len();
- dat.ipx_gre_cksum_present[0] =
- config.context()[cid].ip__ctx()[0].gre__cksum__present();
- if (config.context()[cid].ip__ctx().size_of() > 1)
- {
- dat.compressed_ah_data_len[1] =
- config.context()[cid].ip__ctx()[1].ah__data__len();
- dat.ipx_gre_cksum_present[1] =
- config.context()[cid].ip__ctx()[1].gre__cksum__present();
- }
- return dat;
-}
-
-/** Returns, whether there is any compressed IPv4 level,
- where the RND bit is 0. */
-bool
-isAnyIPv4RNDunset(t_dat *dat)
-{
- for (int i = 0; i < 2; i++)
- {
- int ip_idx = getIPidx(dat, i);
-
- if (ip_idx >= 0) // IP level exists
- {
- if (! dat->context.ip__ctx()[ip_idx].rnd__bit())
- return true;
- }
- }
- return false;
-}
-
-/* Encodes an OCTETSTING value */
-int
-Set_octetstring(unsigned char *buf, const OCTETSTRING & val)
-{
- memcpy(&(buf[0]), val, val.lengthof());
- return val.lengthof();
-}
-
-/* Encodes a LIN2_BO_LAST value */
-int
-Set_LIN2_BO_LAST(unsigned char *buf, const LIN2__BO__LAST & val)
-{
- buf[0] = (val >> 8) & 0xFF;
- buf[1] = val & 0xFF;
- return 2;
-}
-
-/* Encodes a LIN4_BO_LAST value */
-int
-Set_LIN4_BO_LAST(unsigned char *buf, const LIN4__BO__LAST & val)
-{
- buf[0] = (val >> 24) & 0xFF;
- buf[1] = (val >> 16) & 0xFF;
- buf[2] = (val >> 8) & 0xFF;
- buf[3] = val & 0xFF;
- return 4;
-}
-
-/* Encodes a LIN1 value */
-int
-Set_LIN1(unsigned char *buf, const LIN1 & val)
-{
- buf[0] = val & 0xFF;
- return 1;
-}
-
-/* Returns the length of the SDVL encoded CID value 'val'. If the value
- is invalid, exits via the ttcn_error(). */
-int
-SDVL_encoded_CID_length(int val)
-{
- if (val <= 0x7F)
- return 1;
- else if (val <= 0x3FFF)
- return 2;
- else if (val <= 0x1FFFFF)
- return 3;
- else if (val <= 0x1FFFFFFF)
- return 4;
- else
- TTCN_error("Value %u is too big for the SDVL encoder "
- "(at most 29 bits can be used)", val);
-
- return 0;
-}
-
-int
-Set_SDVL_field(unsigned char *buf, const INTEGER & val, int encoded_length)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- if ((val <= 0x7F && encoded_length == 0) || encoded_length == 1)
- {
- buf[len] = val & 0x7F;
- len += 1;
- }
- else if ((val <= 0x3FFF && encoded_length == 0) || encoded_length == 2)
- {
- buf[len] = 0x80 | ((val >> 8) & 0x7F);
- len += 1;
- buf[len] = val & 0xFF;
- len += 1;
- }
- else if ((val <= 0x1FFFFF && encoded_length == 0) || encoded_length == 3)
- {
- buf[len] = 0xC0 | ((val >> 16) & 0x3F);
- len += 1;
- buf[len] = (val >> 8) & 0xFF;
- len += 1;
- buf[len] = val & 0xFF;
- len += 1;
- }
- else if ((val <= 0x1FFFFFFF && encoded_length == 0) || encoded_length == 4)
- {
- buf[len] = 0xE0 | ((val >> 24) & 0x1F);
- len += 1;
- buf[len] = (val >> 16) & 0xFF;
- len += 1;
- buf[len] = (val >> 8) & 0xFF;
- len += 1;
- buf[len] = val & 0xFF;
- len += 1;
- }
- else
- {
- int tmp = val;
- TTCN_error("Value %u (specified length is %u) is too big for the "
- "SDVL encoder (at most 29 bits can be used)",
- tmp, encoded_length);
- }
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-/* ============ Encoding wrappers for optional base types ============ */
-
-/* Encodes an optional OCTETSTING value */
-int
-Set_octetstring_opt(unsigned char *buf, const OPTIONAL < OCTETSTRING > &val)
-{
- if (!val.ispresent())
- return 0;
- return Set_octetstring(buf, val());
-}
-
-/* Encodes an optional LIN2_BO_LAST value */
-int
-Set_LIN2_BO_LAST_opt(unsigned char *buf,
- const OPTIONAL < LIN2__BO__LAST > &val)
-{
- if (!val.ispresent())
- return 0;
- return Set_LIN2_BO_LAST(buf, val());
-}
-
-/* Encodes an optional LIN4_BO_LAST value */
-int
-Set_LIN4_BO_LAST_opt(unsigned char *buf,
- const OPTIONAL < LIN4__BO__LAST > &val)
-{
- if (!val.ispresent())
- return 0;
- return Set_LIN4_BO_LAST(buf, val());
-}
-
-/* Encodes an optional LIN1 value */
-int
-Set_LIN1_opt(unsigned char *buf, const OPTIONAL < LIN1 > &val)
-{
- if (!val.ispresent())
- return 0;
- return Set_LIN1(buf, val());
-}
-
-int
-Set_SDVL_field_opt(unsigned char *buf,
- const OPTIONAL < INTEGER > &val, int length)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- if (!val.ispresent())
- return 0;
- len += Set_SDVL_field(buf, val(), length);
- Log_function_name_on_leave();
- return len;
-}
-
-/* ============ Encoding functions for common ROHC types ============ */
-
-int
-Set_CID(unsigned char *buf, const INTEGER & cid, BOOLEAN const &large_cid)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- if (large_cid == false)
- {
- if (cid > 0)
- {
- buf[len] = 0xE0 + (cid & 0x0F);
- len += 1;
- }
- }
- else
- len += Set_SDVL_field(&buf[len], cid, 0);
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-/* CSRC and IP extension header item list encoding */
-int
-Set_Item_list_opt(unsigned char *buf, const OPTIONAL < Item__list > &item_list)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- if (!item_list.ispresent())
- {
- Log_function_name_on_leave();
- return len;
- }
-
- /* Item list is an IP extension header list */
- if (item_list().get_selection() == Item__list::ALT_ip__item__list)
- {
- IP__Item__list ip_item_list = item_list().ip__item__list();
-
- for (int num = 0; num < ip_item_list.size_of(); num++)
- {
- int start_pos = len;
-
- switch (ip_item_list[num].get_selection())
- {
- case Item::ALT_ipv6__ext__item:
- {
- IPv6__ext__item & item = ip_item_list[num].ipv6__ext__item();
-
- len += Set_LIN1(&buf[len], item.nexthead());
- /* Length of the header in 8-octet units, not including
- the first 8 octets. */
- if (item.hdr__ext__len() == 0)
- {
- if ((item.data().lengthof() + 2) % 8 != 0)
- {
- TTCN_error("Invalid length (%u) of the IPv6 extension header",
- item.data().lengthof());
- }
- buf[len] = (item.data().lengthof() + 2) / 8 - 1;
- len += 1;
- }
- else
- len += Set_LIN1(&buf[len], item.hdr__ext__len());
- len += Set_octetstring(&buf[len], item.data());
- break;
- }
- case Item::ALT_mine__item:
- {
- MINE__item & item = ip_item_list[num].mine__item();
-
- Check_field_value("MINE protocol", item.protocol(), c__ip__proto__mine);
- Check_field_value("MINE reserved", *item.reserved(), 0);
-
- len += Set_LIN1(&buf[len], item.protocol());
- buf[len] = (*item.s__bit()) << 7;
- buf[len] += *item.reserved();
- len += 1;
- len += Set_LIN2_BO_LAST(&buf[len], item.cksum());
- len += Set_octetstring(&buf[len], item.dstaddr());
- len += Set_octetstring_opt(&buf[len], item.srcaddr());
- break;
- }
- case Item::ALT_ah__item:
- {
- AH__item & item = ip_item_list[num].ah__item();
-
- Check_field_value("AH nexthead", item.nexthead(), c__ip__proto__ah);
- len += Set_LIN1(&buf[len], item.nexthead());
-
- /* RFC 2402: This 8-bit field specifies the length of AH in
- 32-bit words (4-byte units), minus "2". */
- if (item.payload__len() == 0)
- {
- if (item.auth__data().ispresent())
- buf[len] = (item.auth__data()().lengthof() / 4) + 3 - 2;
- else
- buf[len] = 1;
- len += 1;
- }
- else
- len += Set_LIN1(&buf[len], item.payload__len());
-
- Check_field_value("AH reserved", item.reserved(), 0);
- len += Set_LIN2_BO_LAST(&buf[len], item.reserved());
- len += Set_LIN4_BO_LAST(&buf[len], item.spi());
- len += Set_LIN4_BO_LAST(&buf[len], item.sn());
- len += Set_octetstring_opt(&buf[len], item.auth__data());
- break;
- }
- case Item::ALT_esp__item:
- {
- ESP__item & item = ip_item_list[num].esp__item();
-
- Check_field_value("ESP nexthead", item.nexthead(), c__ip__proto__esp);
- len += Set_LIN1(&buf[len], item.nexthead());
- len += Set_LIN4_BO_LAST(&buf[len], item.spi());
- len += Set_LIN4_BO_LAST(&buf[len], item.sn());
- break;
- }
- case Item::ALT_gre__item:
- {
- GRE__item & item = ip_item_list[num].gre__item();
-
- Check_field_value("GRE nexthead", item.nexthead(), c__ip__proto__gre2);
- len += Set_LIN1(&buf[len], item.nexthead());
- buf[len] = (*item.C__bit()) << 7;
- Check_field_value("GRE reserved1", (int) *item.reserved__1(), 0);
- buf[len] += (*item.reserved__1()) << 6;
- buf[len] += (*item.K__bit()) << 5;
- buf[len] += (*item.S__bit()) << 4;
- Check_field_value("GRE reserved2", (int) *item.reserved__2(), 0);
- buf[len] += (*item.reserved__2()) << 3;
- buf[len] += *item.version();
- len += 1;
- Check_field_presence("checksum", *item.C__bit() == 1,
- item.cksum().ispresent());
- Check_field_presence("key", *item.K__bit() == 1,
- item.key().ispresent());
- Check_field_presence("sn", *item.S__bit() == 1,
- item.sn().ispresent());
- len += Set_LIN2_BO_LAST_opt(&buf[len], item.cksum());
- len += Set_LIN4_BO_LAST_opt(&buf[len], item.key());
- len += Set_LIN4_BO_LAST_opt(&buf[len], item.sn());
- break;
- }
- default:
- {
- Log_not_implemented_union_field("Item",
- ip_item_list[num].get_selection());
- break;
- }
- }
- TTCN_logger.log(TTCN_DEBUG, "%uth item:", num);
- Log_hexdump(&(buf[start_pos]), len - start_pos);
- }
- }
- else if (item_list().get_selection() == Item__list::ALT_csrc__item__list)
- {
- /* Item list is CSRC item list */
- for (int num = 0; num < item_list().csrc__item__list().size_of(); num++)
- {
- int start_pos = len;
-
- len += Set_octetstring( &buf[len],
- item_list().csrc__item__list()[num] );
- TTCN_logger.log(TTCN_DEBUG, "%uth item:", num);
- Log_hexdump(&(buf[start_pos]), len - start_pos);
- }
- }
- else if (item_list().get_selection() == Item__list::ALT_raw__data)
- {
- /* Item list is a raw octetstring */
- for (int num = 0; num < item_list().csrc__item__list().size_of(); num++)
- {
- int start_pos = len;
-
- len += Set_octetstring(&buf[len], item_list().raw__data()[num] );
- TTCN_logger.log(TTCN_DEBUG, "%uth item:", num);
- Log_hexdump(&(buf[start_pos]), len - start_pos);
- }
- }
- else
- {
- Log_not_implemented_union_field("Item_list", item_list().get_selection());
- }
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Set_XI_list_opt(unsigned char *buf, const OPTIONAL < XI__list > &xilist,
- const OPTIONAL < BITSTRING > &padding, int length)
-{
- int len = 0;
- int halfbyte = 0;
-
- Log_function_name_on_enter();
-
- if (!xilist.ispresent())
- {
- Log_function_name_on_leave();
- return len;
- }
-
- switch (xilist().get_selection())
- {
- case XI__list::ALT_xi__item4:
- {
- if (length != xilist().xi__item4().size_of())
- TTCN_logger.log(TTCN_WARNING,
- "Number of indices != value of CC field");
- for (int num = 0; num < xilist().xi__item4().size_of(); num++)
- {
- if (halfbyte)
- {
- buf[len] += ((*xilist().xi__item4()[num].x__ind()) << 3) & 0x08;
- buf[len] += xilist().xi__item4()[num].index() & 0x07;
- len += 1;
- }
- else
- {
- buf[len] = ((*xilist().xi__item4()[num].x__ind()) << 7) & 0x80;
- buf[len] += (xilist().xi__item4()[num].index() << 4) & 0x70;
- }
- halfbyte = 1 - halfbyte; // Invert the value (0 -> 1 or 1 -> 0)
- }
- break;
- }
-
- case XI__list::ALT_xi__item8:
- {
- if (length != xilist().xi__item8().size_of())
- TTCN_logger.log(TTCN_WARNING,
- "Number of indices != value of CC field");
- for (int num = 0; num < xilist().xi__item8().size_of(); num++)
- {
- buf[len] = ((*xilist().xi__item8()[num].x__ind()) << 7) & 0x80;
- buf[len] += xilist().xi__item8()[num].index() & 0x7F;
- len += 1;
- }
- break;
- }
-
- default:
- Log_not_implemented_union_field("XI_list", xilist().get_selection());
- break;
- }
-
- if (padding.ispresent() && halfbyte == 0)
- {
- TTCN_logger.log(TTCN_WARNING, "Specified padding is ignored");
- }
- else if (!padding.ispresent() && halfbyte)
- {
- TTCN_logger.log(TTCN_WARNING,
- "Padding not specified, padding bits left uninitialized");
- }
- else if (padding.ispresent())
- {
- Check_field_value("Index padding", *padding(), 0);
- buf[len] += (*padding()) & 0x0F;
- len += 1;
- }
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Set_Encoding_Type_0(unsigned char *buf, const Enc__Type__0 & enct0)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- Check_field_presence("gen_id", *enct0.gp__bit() == 1,
- enct0.gen__id().ispresent());
-
- Check_field_value("Encoding type", *enct0.et(), 0);
- buf[len] = ((*enct0.et()) << 6) & 0xC0;
- buf[len] += ShiftUpBit(*enct0.gp__bit(), 5);
- buf[len] += ShiftUpBit(*enct0.ps__bit(), 4);
- buf[len] += enct0.cc() & 0x0F;
- len += 1;
- len += Set_LIN1_opt(&buf[len], enct0.gen__id());
- Check_ps_bit__xi_format(enct0.ps__bit(), enct0.xi__list());
- len += Set_XI_list_opt(&buf[len], enct0.xi__list(), enct0.padding(),
- enct0.cc());
- len += Set_Item_list_opt(&buf[len], enct0.item__list());
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-
-int
-Set_Encoding_Type_1(unsigned char *buf, const Enc__Type__1 & enct1)
-{
- int len = 0;
- int n = 0;
-
- Log_function_name_on_enter();
-
- Check_field_presence("gen_id", *enct1.gp__bit() == 1,
- enct1.gen__id().ispresent());
-
- Check_field_value("Encoding type", *enct1.et(), 1);
- buf[len] = ((*enct1.et()) << 6) & 0xC0;
- buf[len] += ShiftUpBit(*enct1.gp__bit(), 5);
- buf[len] += ShiftUpBit(*enct1.ps__bit(), 4);
- buf[len] += enct1.xi1() & 0x0F;
- len += 1;
- len += Set_LIN1_opt(&buf[len], enct1.gen__id());
- len += Set_LIN1_opt(&buf[len], enct1.ref__id());
- len += Set_octetstring(&buf[len], enct1.insbitmask());
-
- // Count the number of 1's in the bitmask
- for (int i = 0; i < enct1.insbitmask().lengthof(); ++i)
- {
- if (enct1.insbitmask() & int2oct(i + 1, enct1.insbitmask().lengthof()))
- ++n;
- }
-
- Check_ps_bit__xi_format(enct1.ps__bit(), enct1.xi__list());
- len += Set_XI_list_opt(&buf[len], enct1.xi__list(), enct1.padding(), n);
- len += Set_Item_list_opt(&buf[len], enct1.item__list());
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-
-int
-Set_Encoding_Type_2(unsigned char *buf, const Enc__Type__2 & enct2)
-{
- int len = 0;
-
- Check_field_presence("gen_id", *enct2.gp__bit() == 1,
- enct2.gen__id().ispresent());
-
- Check_field_value("Encoding type", *enct2.et(), 2);
- buf[len] = ((*enct2.et()) << 6) & 0xC0;
- buf[len] += ShiftUpBit(*enct2.gp__bit(), 5);
- buf[len] += ShiftUpBit(*enct2.res(), 4);
- buf[len] += enct2.count() & 0x0F;
- len += 1;
- len += Set_LIN1_opt(&buf[len], enct2.gen__id());
- len += Set_LIN1_opt(&buf[len], enct2.ref__id());
- len += Set_octetstring(&buf[len], enct2.rembitmask());
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-
-int
-Set_Encoding_Type_3(unsigned char *buf, const Enc__Type__3 & enct3)
-{
- int len = 0;
- int n = 0;
-
- Check_field_presence("gen_id", *enct3.gp__bit() == 1,
- enct3.gen__id().ispresent());
-
- Check_field_value("Encoding type", *enct3.et(), 3);
- buf[len] = ((*enct3.et()) << 6) & 0xC0;
- buf[len] += ShiftUpBit(*enct3.gp__bit(), 5);
- buf[len] += ShiftUpBit(*enct3.ps__bit(), 4);
- buf[len] += enct3.xi1() & 0x0F;
- len += 1;
- len += Set_LIN1_opt(&buf[len], enct3.gen__id());
- len += Set_LIN1_opt(&buf[len], enct3.ref__id());
- len += Set_octetstring(&buf[len], enct3.rembitmask());
- len += Set_octetstring(&buf[len], enct3.insbitmask());
-
- // Count the number of 1's in the bitmask
- for (int i = 0; i < enct3.insbitmask().lengthof(); ++i)
- {
- if (enct3.insbitmask() & int2oct(i + 1, enct3.insbitmask().lengthof()))
- ++n;
- }
- Check_ps_bit__xi_format(enct3.ps__bit(), enct3.xi__list());
- len += Set_XI_list_opt(&buf[len], enct3.xi__list(), enct3.padding(), n);
- len += Set_Item_list_opt(&buf[len], enct3.item__list());
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Set_Compr_head_list_opt(unsigned char *buf,
- const OPTIONAL < Compr__head__list > &chl)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- if (!chl.ispresent())
- {
- Log_function_name_on_leave();
- return len;
- }
- if (chl().get_selection() == Compr__head__list::ALT_enctype0)
- len += Set_Encoding_Type_0(&buf[len], chl().enctype0());
- else if (chl().get_selection() == Compr__head__list::ALT_enctype1)
- len += Set_Encoding_Type_1(&buf[len], chl().enctype1());
- else if (chl().get_selection() == Compr__head__list::ALT_enctype2)
- len += Set_Encoding_Type_2(&buf[len], chl().enctype2());
- else if (chl().get_selection() == Compr__head__list::ALT_enctype3)
- len += Set_Encoding_Type_3(&buf[len], chl().enctype3());
- else
- {
- Log_not_implemented_union_field("Compr_head_list", chl().get_selection());
- }
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Set_AEGSeqnum_opt(unsigned char *buf, const OPTIONAL < AEGSeqnum > &oseqn)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- if (!oseqn.ispresent())
- {
- Log_function_name_on_leave();
- return len;
- }
- if (oseqn().get_selection() == AEGSeqnum::ALT_short__form)
- {
- Check_field_value("form-bit", (int) *oseqn().short__form().ind(), 0);
- buf[len] = ShiftUpBit(*oseqn().short__form().ind(), 7);
- buf[len] += oseqn().short__form().lsb__of__seqnum() & 0x7F;
- len += 1;
- }
- else if (oseqn().get_selection() == AEGSeqnum::ALT_long__form)
- {
- Check_field_value("form-bit", (int) *oseqn().long__form().ind(), 1);
- buf[len] = ShiftUpBit(*oseqn().long__form().ind(), 7);
- buf[len] += (oseqn().long__form().lsb__of__seqnum() >> 24) & 0x7F;
- len += 1;
-
- buf[len] = (oseqn().long__form().lsb__of__seqnum() >> 16) & 0xFF;
- len += 1;
-
- buf[len] = (oseqn().long__form().lsb__of__seqnum() >> 8) & 0xFF;
- len += 1;
-
- buf[len] = oseqn().long__form().lsb__of__seqnum() & 0xFF;
- len += 1;
- }
- else
- Log_not_implemented_union_field("AEGSeqnum", oseqn().get_selection());
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Set_IPv4_static_chain(unsigned char *buf, const IPv4__Static & chain)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- Check_field_value("IPv4 version", chain.version(), 4);
- buf[len] = (chain.version() << 4) & 0xF0;
- Check_field_value("IPv4 reserved (static chain)", chain.reserved(), 0);
- buf[len] += chain.reserved() & 0x0F;
- len += 1;
- len += Set_LIN1(&buf[len], chain.proto());
- len += Set_octetstring(&buf[len], chain.srcaddr());
- len += Set_octetstring(&buf[len], chain.dstaddr());
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Set_IPv6_static_chain(unsigned char *buf, const IPv6__Static & chain)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- Check_field_value("IPv6 version", chain.version(), 6);
- buf[len] = (chain.version() << 4) & 0xF0;
- buf[len] += (chain.flowlabel() >> 16) & 0x0F;
- len += 1;
-
- buf[len] = (chain.flowlabel() >> 8) & 0xFF;
- len += 1;
- buf[len] = chain.flowlabel() & 0xFF;
- len += 1;
-
- len += Set_LIN1(&buf[len], chain.nexthead());
- len += Set_octetstring(&buf[len], chain.srcaddr());
- len += Set_octetstring(&buf[len], chain.dstaddr());
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Set_UDP_static_chain(unsigned char *buf, const UDP__Static & chain)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- len += Set_LIN2_BO_LAST(&buf[len], chain.srcport());
- len += Set_LIN2_BO_LAST(&buf[len], chain.dstport());
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Set_RTP_static_chain(unsigned char *buf, const RTP__Static & chain)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- len += Set_octetstring(&buf[len], chain.ssrc());
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Set_RTP_dynamic_chain(unsigned char *buf, const RTP__Dynamic & chain)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- Check_field_value("RTP version", chain.vfield(), 2);
- buf[len] = (chain.vfield() << 6) & 0xC0;
- buf[len] += ShiftUpBit(*chain.pbit(), 5);
- buf[len] += ShiftUpBit(*chain.rxbit(), 4);
- buf[len] += chain.ccfield() & 0x0F;
- len += 1;
- buf[len] = ShiftUpBit(*chain.mbit(), 7);
- buf[len] += chain.ptfield() & 0x7F;
- len += 1;
- len += Set_LIN2_BO_LAST(&buf[len], chain.rtpseqnum());
- len += Set_LIN4_BO_LAST(&buf[len], chain.rtpts());
- len += Set_Encoding_Type_0(&buf[len], chain.gencsrclist());
- Check_field_presence("RTP rx", *chain.rxbit() == 1,
- chain.rx__field().ispresent());
- if (chain.rx__field().ispresent())
- {
- Check_field_value("RX reserved", (int) *chain.rx__field()().reserved(), 0);
- buf[len] = ((*chain.rx__field()().reserved()) << 5) & 0xE0;
- buf[len] += ShiftUpBit(*chain.rx__field()().xbit(), 4);
- buf[len] += (chain.rx__field()().mode() << 2) & 0x0C;
- buf[len] += ShiftUpBit(*chain.rx__field()().tisbit(), 1);
- buf[len] += ShiftUpBit(*chain.rx__field()().tssbit(), 0);
- len += 1;
- }
- Check_field_presence("TS Stride",
- chain.rx__field().ispresent() &&
- (*chain.rx__field()().tssbit()) == 1,
- chain.ts__stride().ispresent());
- Check_field_presence("TIME Stride",
- chain.rx__field().ispresent() &&
- (*chain.rx__field()().tisbit()) == 1,
- chain.time__stride().ispresent());
- len += Set_SDVL_field_opt(&buf[len], chain.ts__stride(), 0);
- len += Set_SDVL_field_opt(&buf[len], chain.time__stride(), 0);
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Set_RTP_flags_fields_opt(unsigned char *buf,
- const OPTIONAL < RTP__flags__fields > &field)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- if (!field.ispresent())
- {
- Log_function_name_on_leave();
- return len;
- }
- buf[len] = (field().mode() << 6) & 0xC0;
- buf[len] += ShiftUpBit(*field().r__pt(), 5);
- buf[len] += ShiftUpBit(*field().m__bit(), 4);
- buf[len] += ShiftUpBit(*field().r__x(), 3);
- buf[len] += ShiftUpBit(*field().csrc(), 2);
- buf[len] += ShiftUpBit(*field().tss(), 1);
- buf[len] += ShiftUpBit(*field().tis(), 0);
- len += 1;
-
- Check_field_presence("RTP flags",
- *field().r__pt() == 1, field().flags().ispresent());
- if (field().flags().ispresent())
- {
- buf[len] = (((*field().flags()().r__p()) << 7) & 0x80) +
- (field().flags()().rtp__pt() & 0x7F);
- len += 1;
- }
- Check_field_presence("Compressed CSRC list",
- *field().csrc() == 1, field().csrc__list().ispresent());
- len += Set_Compr_head_list_opt(&buf[len], field().csrc__list());
- Check_field_presence("TS_STRIDE",
- *field().tss() == 1, field().ts__stride().ispresent());
- len += Set_SDVL_field_opt(&buf[len], field().ts__stride(), 0);
- Check_field_presence("TIME_STRIDE",
- *field().tis() == 1,
- field().time__stride().ispresent());
- len += Set_SDVL_field_opt(&buf[len], field().time__stride(), 0);
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Set_IPv4_dynamic_chain(unsigned char *buf, const IPv4__Dynamic & chain)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- len += Set_LIN1(&buf[len], chain.tos());
- len += Set_LIN1(&buf[len], chain.ttl());
- len += Set_LIN2_BO_LAST(&buf[len], chain.identification());
-
- buf[len] = ShiftUpBit(*chain.df__bit(), 7);
- buf[len] += ShiftUpBit(*chain.rnd__bit(), 6);
- buf[len] += ShiftUpBit(*chain.nbo__bit(), 5);
- Check_field_value("IPv4 reserved (dynamic chain)", *chain.reserved(), 0);
- buf[len] += (*chain.reserved()) & 0x1F;
- len += 1;
- len += Set_Encoding_Type_0(&buf[len], chain.genextheadlist());
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Set_IPv6_dynamic_chain(unsigned char *buf, const IPv6__Dynamic & chain)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- len += Set_LIN1(&buf[len], chain.trafficclass());
- len += Set_LIN1(&buf[len], chain.hoplimit());
- len += Set_Encoding_Type_0(&buf[len], chain.genextheadlist());
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-/* ============ Encoding functions for ROHC types ============ */
-int
-Set_feedback(unsigned char *buf, const Feedback__u & feedback,
- BOOLEAN const &large_cid)
-{
- int len = 0, crcpos = 0, crcstart = 0;
-
- Log_function_name_on_enter();
-
- Check_field_value("feedback type", (int) *feedback.feedback__type(), 30);
- Check_feedback_code__size(feedback.code(), feedback.size());
- buf[len] = ((*feedback.feedback__type()) << 3) & 0xF8;
- buf[len] += feedback.code() & 0x07;
- len += 1;
-
- len += Set_LIN1_opt(&buf[len], feedback.size());
-
- crcstart = len;
-
- len += Set_CID(&buf[len], feedback.feedback__data().cid(), large_cid);
-
- switch (feedback.feedback__data().feedback__type().get_selection())
- {
- case Feedback__type::ALT_feedback1:
- {
- Feedback1 fback1 =
- feedback.feedback__data().feedback__type().feedback1();
-
- len += Set_octetstring(&buf[len], fback1);
- break;
- }
-
- case Feedback__type::ALT_feedback2:
- {
- Feedback2 fback2 =
- feedback.feedback__data().feedback__type().feedback2();
-
- buf[len] = (fback2.acktype() << 6) & 0xC0;
- buf[len] += (fback2.mode() << 4) & 0x30;
- buf[len] += (fback2.sn() >> 8) & 0x0F;
- len += 1;
-
- buf[len] = fback2.sn() & 0xFF;
- len += 1;
-
- if (fback2.feedback__opts().ispresent())
- {
- Feedback__opts & fbopts = fback2.feedback__opts();
-
- for (int num = 0; num < fbopts.size_of(); num++)
- {
- buf[len] = (fbopts[num].opt__type() << 4) & 0xF0;
- Check_feedback_optlen__optsize(fbopts[num].opt__len(),
- fbopts[num].opt__data());
- buf[len] += fbopts[num].opt__len() & 0x0F;
- len += 1;
-
- len += Set_octetstring_opt(&buf[len], fbopts[num].opt__data());
- if (fbopts[num].opt__data().ispresent())
- {
- if ((fbopts[num].opt__len() == 1)
- && (fbopts[num].opt__type() == 1) && (buf[len - 1] == 0))
- crcpos = len - 1;
- }
- }
- }
- break;
- }
-
- default:
- break;
- }
-
- if (feedback.size().ispresent() && feedback.size() == 0)
- {
- buf[1] = (len - 2) & 0xFF;
- }
- if ((!feedback.size().ispresent()) && feedback.code() == 0)
- {
- buf[0] = (buf[0] & 0xF8) + ((len - 1) & 0x07);
- }
-
- if ((crcpos > crcstart) && (buf[crcpos] == 0))
- buf[crcpos] = ComputeCRC(&(buf[crcstart]), len - crcstart, 8);
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Set_ROHC_Feedback_opt(unsigned char *buf,
- const OPTIONAL < Feedback > &feedback,
- BOOLEAN const &large_cid)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- if (!feedback.ispresent())
- {
- Log_function_name_on_leave();
- return len;
- }
- for (int num = 0; num < feedback().size_of(); num++)
- {
- len += Set_feedback(&buf[len], feedback()[num], large_cid);
- }
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
- return len;
-}
-
-/* Inserts CID infomation into the buffer by moving memory areas */
-int
-Set_CID_for_packets(unsigned char *buf, ROHC__config const &config,
- int cid, int buflen)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- if (config.large__cid() == false)
- { /* Small CID: first octet is the CID */
- if (cid > 0)
- {
- // Overlapping memory areas, use memmove
- memmove(&(buf[1]), &(buf[0]), buflen);
- buf[0] = 0xE0 + (cid & 0x0F);
- len += 1;
- }
- }
- else
- { /* Large CID: CID is placed after the first octet */
- int cidlen = SDVL_encoded_CID_length(cid);
-
- // Overlapping memory areas, use memmove
- memmove(&(buf[1 + cidlen]), &(buf[1]), buflen - 1);
- len += Set_SDVL_field(&(buf[1]), cid, 0);
- }
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Set_ROHC_Header_Profile0(unsigned char *buf,
- const Profile0__headers & hdr,
- ROHC__config const &config)
-{
- int len = 0, crcpos = 0, cidlen, cid;
-
- Log_function_name_on_enter();
-
- switch (hdr.get_selection())
- {
- case Profile0__headers::ALT_ir:
- {
- cid = hdr.ir().cid();
- Check_field_value("packet type", (int) *hdr.ir().type__ind(), 126);
- buf[len] = ((*hdr.ir().type__ind()) << 1) & 0xFE;
- buf[len] += (*hdr.ir().d()) & 0x01;
- len += 1;
- Check_field_value("profile", hdr.ir().profile(), 0);
- len += Set_LIN1(&buf[len], hdr.ir().profile());
- crcpos = len;
- len += Set_LIN1(&buf[len], hdr.ir().crc());
- len += Set_octetstring(&buf[len], hdr.ir().orig__packet());
- break;
- }
-
- case Profile0__headers::ALT_normal:
- {
- cid = hdr.normal().cid();
- len += Set_octetstring(&buf[len], hdr.normal().orig__packet());
- break;
- }
-
- default:
- Log_not_implemented_union_field("Profile0_headers", hdr.get_selection());
- break;
- }
-
- cidlen = Set_CID_for_packets(buf, config, cid, len);
- crcpos += cidlen;
- len += cidlen;
-
- if (hdr.get_selection() == Profile0__headers::ALT_ir && hdr.ir().crc() == 0)
- {
- buf[crcpos] = ComputeCRC(&(buf[0]), crcpos, 8);
- }
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
- return len;
-}
-
-int
-Set_Static_Chain_Profile1(unsigned char *buf, const Static__Chain & chain)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- for (int num = 0; num < chain.size_of(); num++)
- {
- switch (chain[num].get_selection())
- {
- case Static__Chain__u::ALT_ipv4__stat:
- len += Set_IPv4_static_chain(&buf[len], chain[num].ipv4__stat());
- break;
- case Static__Chain__u::ALT_ipv6__stat:
- len += Set_IPv6_static_chain(&buf[len], chain[num].ipv6__stat());
- break;
- case Static__Chain__u::ALT_udp__stat:
- len += Set_UDP_static_chain(&buf[len], chain[num].udp__stat());
- break;
- case Static__Chain__u::ALT_rtp__stat:
- len += Set_RTP_static_chain(&buf[len], chain[num].rtp__stat());
- break;
- default:
- Log_not_implemented_union_field
- ("Static_Chain_u", chain[num].get_selection());
- break;
- }
- }
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Set_Dynamic_Chain_Profile1(unsigned char *buf, const Dynamic__Chain & dynch)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- for (int num = 0; num < dynch.size_of(); num++)
- {
- switch (dynch[num].get_selection())
- {
- case Dynamic__Chain__u::ALT_ipv4__dyn:
- len += Set_IPv4_dynamic_chain(&buf[len], dynch[num].ipv4__dyn());
- break;
- case Dynamic__Chain__u::ALT_ipv6__dyn:
- len += Set_IPv6_dynamic_chain(&buf[len], dynch[num].ipv6__dyn());
- break;
- case Dynamic__Chain__u::ALT_udp__dyn:
- len += Set_LIN2_BO_LAST(&buf[len], dynch[num].udp__dyn().cksum());
- break;
- case Dynamic__Chain__u::ALT_rtp__dyn:
- len += Set_RTP_dynamic_chain(&buf[len], dynch[num].rtp__dyn());
- break;
- default:
- Log_not_implemented_union_field
- ("Dynamic_Chain_u", dynch[num].get_selection());
- break;
- }
- }
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Set_Profile1_ROHC_Header_ir(unsigned char *buf,
- const Profile1__IR__header & hdr)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- Check_field_value("packet type", (int) *hdr.type__ind(), 126);
- buf[len] = ((*hdr.type__ind()) << 1) & 0xFE;
- Check_field_presence("dynamic chain", *hdr.d() == 1,
- hdr.dyn__chain().ispresent());
- buf[len] += ShiftUpBit(*hdr.d(), 0);
- len += 1;
- Check_field_value("profile", hdr.profile(), 1);
- len += Set_LIN1(&buf[len], hdr.profile());
- len += Set_LIN1(&buf[len], hdr.crc());
- len += Set_Static_Chain_Profile1(&buf[len], hdr.stat__chain());
- if (hdr.dyn__chain().ispresent())
- len += Set_Dynamic_Chain_Profile1(&buf[len], hdr.dyn__chain());
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Set_Profile1_ROHC_Header_irdyn(unsigned char *buf,
- const Profile1__IR__DYN__header & hdr)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- Check_field_value("packet type", (int) *hdr.type__ind(), 248);
- buf[len] = *hdr.type__ind();
- len += 1;
- Check_field_value("profile", hdr.profile(), 1);
- len += Set_LIN1(&buf[len], hdr.profile());
- len += Set_LIN1(&buf[len], hdr.crc());
- len += Set_Dynamic_Chain_Profile1(&buf[len], hdr.dyn__chain());
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Set_Profile1_ROHC_Header_r0(unsigned char *buf,
- const Profile1__R__0__header & hdr)
-{
- Log_function_name_on_enter();
-
- Check_field_value("packet type", (int) *hdr.type__ind(), 0);
- buf[0] = ((*hdr.type__ind()) << 6) & 0xC0;
- buf[0] += hdr.sn() & 0x3F;
-
- Log_hexdump(buf, 1);
- Log_function_name_on_leave();
-
- return 1;
-}
-
-int
-Set_Profile1_ROHC_Header_r0crc(unsigned char *buf,
- const Profile1__R__0__CRC__header & hdr)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- Check_field_value("packet type", (int) *hdr.type__ind(), 1);
- buf[len] = ((*hdr.type__ind()) << 6) & 0xC0;
- buf[len] += (hdr.sn() >> 1) & 0x3F;
- len += 1;
- buf[len] = (hdr.sn() << 7) & 0x80;
- buf[len] += hdr.crc() & 0x7F;
- len += 1;
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Set_Profile1_ROHC_Header_uo0(unsigned char *buf,
- const Profile1__UO__0__header & hdr)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- Check_field_value("packet type", (int) *hdr.type__ind(), 0);
- buf[len] = ((*hdr.type__ind()) << 7) & 0x80;
- buf[len] += (hdr.sn() << 3) & 0x78;
- buf[len] += hdr.crc() & 0x07;
- len += 1;
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Set_Profile1_ROHC_Header_r1(unsigned char *buf,
- const Profile1__R__1__header & hdr)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- Check_field_value("packet type", (int) *hdr.type__ind(), 2);
- buf[len] = ((*hdr.type__ind()) << 6) & 0xC0;
- buf[len] += hdr.sn() & 0x3F;
- len += 1;
- buf[len] = ShiftUpBit(*hdr.m__bit(), 7);
- buf[len] += ShiftUpBit(*hdr.x__bit(), 6);
- buf[len] += hdr.ts() & 0x3F;
- len += 1;
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Set_Profile1_ROHC_Header_r1id(unsigned char *buf,
- const Profile1__R__1__ID__header & hdr)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- Check_field_value("packet type", (int) *hdr.type__ind(), 2);
- buf[len] = ((*hdr.type__ind()) << 6) & 0xC0;
- buf[len] += hdr.sn() & 0x3F;
- len += 1;
- buf[len] = ShiftUpBit(*hdr.m__bit(), 7);
- buf[len] += ShiftUpBit(*hdr.x__bit(), 6);
- Check_field_value("T-bit", (int) *hdr.t__bit(), 0);
- buf[len] += ShiftUpBit(*hdr.t__bit(), 5);
- buf[len] += hdr.ip__id() & 0x1F;
- len += 1;
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Set_Profile1_ROHC_Header_r1ts(unsigned char *buf,
- const Profile1__R__1__TS__header & hdr)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- Check_field_value("packet type", (int) *hdr.type__ind(), 2);
- buf[len] = ((*hdr.type__ind()) << 6) & 0xC0;
- buf[len] += hdr.sn() & 0x3F;
- len += 1;
- buf[len] = ShiftUpBit(*hdr.m__bit(), 7);
- buf[len] += ShiftUpBit(*hdr.x__bit(), 6);
- Check_field_value("T-bit", (int) *hdr.t__bit(), 1);
- buf[len] += ShiftUpBit(*hdr.t__bit(), 5);
- buf[len] += hdr.ts() & 0x1F;
- len += 1;
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Set_Profile1_ROHC_Header_uo1(unsigned char *buf,
- const Profile1__UO__1__header & hdr)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- Check_field_value("packet type", (int) *hdr.type__ind(), 2);
- buf[len] = ((*hdr.type__ind()) << 6) & 0xC0;
- buf[len] += hdr.ts() & 0x3F;
- len += 1;
- buf[len] = ShiftUpBit(*hdr.m__bit(), 7);
- buf[len] += (hdr.sn() << 3) & 0x78;
- buf[len] += hdr.crc() & 0x07;
- len += 1;
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Set_Profile1_ROHC_Header_uo1id(unsigned char *buf,
- const Profile1__UO__1__ID__header & hdr)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- Check_field_value("packet type", (int) *hdr.type__ind(), 2);
- buf[len] = ((*hdr.type__ind()) << 6) & 0xC0;
- Check_field_value("T-bit", (int) *hdr.t__bit(), 0);
- buf[len] += ShiftUpBit(*hdr.t__bit(), 5);
- buf[len] += hdr.ip__id() & 0x1F;
- len += 1;
- buf[len] = ShiftUpBit(*hdr.x__bit(), 7);
- buf[len] += (hdr.sn() << 3) & 0x78;
- buf[len] += hdr.crc() & 0x07;
- len += 1;
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Set_Profile1_ROHC_Header_uo1ts(unsigned char *buf,
- const Profile1__UO__1__TS__header & hdr)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- Check_field_value("packet type", (int) *hdr.type__ind(), 2);
- buf[len] = ((*hdr.type__ind()) << 6) & 0xC0;
- Check_field_value("T-bit", (int) *hdr.t__bit(), 1);
- buf[len] += ShiftUpBit(*hdr.t__bit(), 5);
- buf[len] += hdr.ts() & 0x1F;
- len += 1;
- buf[len] = ShiftUpBit(*hdr.m__bit(), 7);
- buf[len] += (hdr.sn() << 3) & 0x78;
- buf[len] += hdr.crc() & 0x07;
- len += 1;
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Set_Profile1_ROHC_Header_uor2(unsigned char *buf,
- const Profile1__UOR__2__header & hdr)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- Check_field_value("packet type", (int) *hdr.type__ind(), 6);
- buf[len] = ((*hdr.type__ind()) << 5) & 0xE0;
- buf[len] += (hdr.ts() >> 1) & 0x1F;
- len += 1;
- buf[len] = (hdr.ts() << 7) & 0x80;
- buf[len] += ShiftUpBit(*hdr.m__bit(), 6);
- buf[len] += hdr.sn() & 0x3F;
- len += 1;
- buf[len] = ShiftUpBit(*hdr.x__bit(), 7);
- buf[len] += hdr.crc() & 0x7F;
- len += 1;
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Set_Profile1_ROHC_Header_uor2id(unsigned char *buf,
- const Profile1__UOR__2__ID__header & hdr)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- Check_field_value("packet type", (int) *hdr.type__ind(), 6);
- buf[len] = ((*hdr.type__ind()) << 5) & 0xE0;
- buf[len] += hdr.ip__id() & 0x1F;
- len += 1;
- Check_field_value("T-bit", (int) *hdr.t__bit(), 0);
- buf[len] = ShiftUpBit(*hdr.t__bit(), 7);
- buf[len] += ShiftUpBit(*hdr.m__bit(), 6);
- buf[len] += hdr.sn() & 0x3F;
- len += 1;
- buf[len] = ShiftUpBit(*hdr.x__bit(), 7);
- buf[len] += hdr.crc() & 0x7F;
- len += 1;
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Set_Profile1_ROHC_Header_uor2ts(unsigned char *buf,
- const Profile1__UOR__2__TS__header & hdr)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- Check_field_value("packet type", (int) *hdr.type__ind(), 6);
- Log_hexdump(buf, len);
- buf[len] = ((*hdr.type__ind()) << 5) & 0xE0;
- buf[len] += hdr.ts() & 0x1F;
- len += 1;
- Check_field_value("T-bit", (int) *hdr.t__bit(), 1);
- buf[len] = ShiftUpBit(*hdr.t__bit(), 7);
- buf[len] += ShiftUpBit(*hdr.m__bit(), 6);
- buf[len] += hdr.sn() & 0x3F;
- len += 1;
- buf[len] = ShiftUpBit(*hdr.x__bit(), 7);
- buf[len] += hdr.crc() & 0x7F;
- len += 1;
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Set_Profile1_Inner_IP_flags_opt(unsigned char *buf,
- const OPTIONAL < Inner__IP__flags > &field)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- if (!field.ispresent())
- {
- Log_function_name_on_leave();
- return len;
- }
- buf[len] = ShiftUpBit(*field().tos(), 7);
- buf[len] += ShiftUpBit(*field().ttl(), 6);
- buf[len] += ShiftUpBit(*field().df(), 5);
- buf[len] += ShiftUpBit(*field().pr(), 4);
- buf[len] += ShiftUpBit(*field().ipx(), 3);
- buf[len] += ShiftUpBit(*field().nbo(), 2);
- buf[len] += ShiftUpBit(*field().rnd__bit(), 1);
- buf[len] += ShiftUpBit(*field().ip2__bit(), 0);
- len += 1;
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Set_Profile1_Outer_IP_flags_opt(unsigned char *buf,
- const OPTIONAL < Outer__IP__flags > &field)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- if (!field.ispresent())
- {
- Log_function_name_on_leave();
- return len;
- }
- buf[len] = ShiftUpBit(*field().tos2(), 7);
- buf[len] += ShiftUpBit(*field().ttl2(), 6);
- buf[len] += ShiftUpBit(*field().df2(), 5);
- buf[len] += ShiftUpBit(*field().pr2(), 4);
- buf[len] += ShiftUpBit(*field().ipx2(), 3);
- buf[len] += ShiftUpBit(*field().nbo2(), 2);
- buf[len] += ShiftUpBit(*field().rnd2(), 1);
- buf[len] += ShiftUpBit(*field().i2__bit(), 0);
- len += 1;
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Set_Profile1_ipx_headers_opt(unsigned char *buf,
- const OPTIONAL < IP__Ext__heads > &field)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- if (!field.ispresent())
- {
- Log_function_name_on_leave();
- return len;
- }
- buf[len] = ShiftUpBit(*field().cl(), 7);
- buf[len] += ShiftUpBit(*field().aseq(), 6);
- buf[len] += ShiftUpBit(*field().eseq(), 5);
- buf[len] += ShiftUpBit(*field().gseq(), 4);
- buf[len] += (*field().res()) & 0x0F;
- len += 1;
-
- Check_field_presence("AH SN", *field().aseq() == 1,
- field().ah__seq().ispresent());
- Check_field_presence("ESP SN", *field().eseq() == 1,
- field().esp__seq().ispresent());
- Check_field_presence("GRE SN", *field().gseq() == 1,
- field().gre__seq().ispresent());
- Check_field_presence("Compressed header list", *field().cl() == 1,
- field().compr__head__list().ispresent());
- len += Set_AEGSeqnum_opt(&buf[len], field().ah__seq());
- len += Set_AEGSeqnum_opt(&buf[len], field().esp__seq());
- len += Set_AEGSeqnum_opt(&buf[len], field().gre__seq());
- len += Set_Compr_head_list_opt(&buf[len], field().compr__head__list());
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Set_Profile1_Inner_IP_fields_opt(unsigned char *buf,
- const OPTIONAL < Inner__IP__flags > &flags,
- const OPTIONAL < Inner__IP__fields > &field)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- if (!field.ispresent())
- {
- Log_function_name_on_leave();
- return len;
- }
- Check_field_presence("TOS (inner IP)",
- flags.ispresent() && (*flags().tos() == 1),
- field().tos().ispresent());
- len += Set_LIN1_opt(&buf[len], field().tos());
- Check_field_presence("TTL (inner IP)",
- flags.ispresent() && (*flags().ttl() == 1),
- field().ttl().ispresent());
- len += Set_LIN1_opt(&buf[len], field().ttl());
- Check_field_presence("PROTO (inner IP)",
- flags.ispresent() && (*flags().pr() == 1),
- field().proto().ispresent());
- len += Set_LIN1_opt(&buf[len], field().proto());
-
- Check_field_presence("IP extension headers (inner IP)",
- flags.ispresent() && (*flags().ipx() == 1),
- field().ext__heads().ispresent());
- len += Set_Profile1_ipx_headers_opt(&buf[len], field().ext__heads());
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Set_Profile1_Outer_IP_fields_opt(unsigned char *buf,
- const OPTIONAL < Outer__IP__flags > &flags,
- const OPTIONAL < Outer__IP__fields > &field)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- if (!field.ispresent())
- {
- Log_function_name_on_leave();
- return len;
- }
- Check_field_presence("TOS (outer IP)",
- flags.ispresent() && (*flags().tos2() == 1),
- field().tos().ispresent());
- len += Set_LIN1_opt(&buf[len], field().tos());
- Check_field_presence("TTL (outer IP)",
- flags.ispresent() && (*flags().ttl2() == 1),
- field().ttl().ispresent());
- len += Set_LIN1_opt(&buf[len], field().ttl());
- Check_field_presence("PROTO (outer IP)",
- flags.ispresent() && (*flags().pr2() == 1),
- field().proto().ispresent());
- len += Set_LIN1_opt(&buf[len], field().proto());
-
- Check_field_presence("IP extension headers (outer IP)",
- flags.ispresent() && (*flags().ipx2() == 1),
- field().ext__heads().ispresent());
- len += Set_Profile1_ipx_headers_opt(&buf[len], field().ext__heads());
- Check_field_presence("IP-ID (outer IP)",
- flags.ispresent() && (*flags().i2__bit() == 1),
- field().ip__id().ispresent());
- len += Set_LIN2_BO_LAST_opt(&buf[len], field().ip__id());
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Set_Profile1_ROHC_Header_Extension0(unsigned char *buf, const Extension0 & ext)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- Check_field_value("extension type", (int) *ext.ext__type(), 0);
- buf[len] = ((*ext.ext__type()) << 6) & 0xC0;
- buf[len] += (ext.sn() << 3) & 0x38;
- buf[len] += ext.plust() & 0x07;
- len += 1;
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Set_Profile1_ROHC_Header_Extension1(unsigned char *buf, const Extension1 & ext)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- Check_field_value("extension type", (int) *ext.ext__type(), 1);
- buf[len] = ((*ext.ext__type()) << 6) & 0xC0;
- buf[len] += (ext.sn() << 3) & 0x38;
- buf[len] += ext.plust() & 0x07;
- len += 1;
- len += Set_LIN1(&buf[len], ext.minust());
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Set_Profile1_ROHC_Header_Extension2(unsigned char *buf, const Extension2 & ext)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- Check_field_value("extension type", (int) *ext.ext__type(), 2);
- buf[len] = ((*ext.ext__type()) << 6) & 0xC0;
- buf[len] += (ext.sn() << 3) & 0x38;
- buf[len] += (ext.plust() >> 8) & 0x07;
- len += 1;
- buf[len] = ext.plust() & 0xFF;
- len += 1;
- len += Set_LIN1(&buf[len], ext.minust());
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Set_Profile1_ROHC_Header_Extension3(unsigned char *buf, const Extension3 & ext)
-{
- int len = 0;
- int ts_length = 0;
-
- Log_function_name_on_enter();
-
- Check_field_value("extension type", (int) *ext.ext__type(), 3);
- buf[len] = ((*ext.ext__type()) << 6) & 0xC0;
- buf[len] += ShiftUpBit(*ext.s__bit(), 5);
- buf[len] += ShiftUpBit(*ext.r__ts__bit(), 4);
- buf[len] += ShiftUpBit(*ext.tsc__bit(), 3);
- buf[len] += ShiftUpBit(*ext.i__bit(), 2);
- buf[len] += ShiftUpBit(*ext.ip__bit(), 1);
- buf[len] += ShiftUpBit(*ext.rtp__bit(), 0);
- len += 1;
-
- Check_field_presence("Inner IP flags",
- *ext.ip__bit() == 1,
- ext.inner__ip__flags().ispresent());
- len += Set_Profile1_Inner_IP_flags_opt(&buf[len], ext.inner__ip__flags());
- Check_field_presence("Outer IP flags",
- ext.inner__ip__flags().ispresent() &&
- (*ext.inner__ip__flags()().ip2__bit() == 1),
- ext.outer__ip__flags().ispresent());
- len += Set_Profile1_Outer_IP_flags_opt(&buf[len], ext.outer__ip__flags());
- Check_field_presence("SN", *ext.s__bit() == 1, ext.sn().ispresent());
- len += Set_LIN1_opt(&buf[len], ext.sn());
- Check_field_presence("RTP TS", *ext.r__ts__bit() == 1, ext.ts().ispresent());
- if (ext.ts__length().ispresent()) ts_length = ext.ts__length()();
- len += Set_SDVL_field_opt(&buf[len], ext.ts(), ts_length);
- Check_field_presence("Inner IP fields",
- *ext.ip__bit() == 1, ext.inner__ip__hdr().ispresent());
- len += Set_Profile1_Inner_IP_fields_opt(&buf[len], ext.inner__ip__flags(),
- ext.inner__ip__hdr());
- Check_field_presence("Inner IP-ID",
- *ext.i__bit() == 1, ext.ip__id().ispresent());
- len += Set_LIN2_BO_LAST_opt(&buf[len], ext.ip__id());
- Check_field_presence("Outer IP fields",
- ext.inner__ip__flags().ispresent() &&
- (*ext.inner__ip__flags()().ip2__bit() == 1),
- ext.outer__ip__hdr().ispresent());
- len += Set_Profile1_Outer_IP_fields_opt(&buf[len], ext.outer__ip__flags(),
- ext.outer__ip__hdr());
- Check_field_presence("RTP flags and fields",
- *ext.rtp__bit() == 1, ext.rtp__fl__fi().ispresent());
- len += Set_RTP_flags_fields_opt(&buf[len], ext.rtp__fl__fi());
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Set_Profile1_ROHC_Header_Extension_opt(unsigned char *buf,
- const OPTIONAL < Profile1__Extension >
- &ext)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- if (ext.ispresent())
- {
- if (ext().get_selection() == Profile1__Extension::ALT_ext0)
- {
- len += Set_Profile1_ROHC_Header_Extension0(&buf[len], ext().ext0());
- }
- else if (ext().get_selection() == Profile1__Extension::ALT_ext1)
- {
- len += Set_Profile1_ROHC_Header_Extension1(&buf[len], ext().ext1());
- }
- else if (ext().get_selection() == Profile1__Extension::ALT_ext2)
- {
- len += Set_Profile1_ROHC_Header_Extension2(&buf[len], ext().ext2());
- }
- else if (ext().get_selection() == Profile1__Extension::ALT_ext3)
- {
- len += Set_Profile1_ROHC_Header_Extension3(&buf[len], ext().ext3());
- }
- else
- {
- Log_not_implemented_union_field("Profile1_Extension",
- ext().get_selection());
- }
- }
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Set_Profile1_ROHC_Header_ipid_ah_gre(unsigned char *buf,
- const Profile1__headers & hdr)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- len += Set_LIN2_BO_LAST_opt(&buf[len], hdr.ip__id__outer());
- len += Set_octetstring_opt(&buf[len], hdr.ah__outer());
- len += Set_LIN2_BO_LAST_opt(&buf[len], hdr.gre__cksum1());
- len += Set_LIN2_BO_LAST_opt(&buf[len], hdr.ip__id__inner());
- len += Set_octetstring_opt(&buf[len], hdr.ah__inner());
- len += Set_LIN2_BO_LAST_opt(&buf[len], hdr.gre__cksum2());
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Set_Profile1_ROHC_Header(unsigned char *buf,
- const Profile1__headers & hdr,
- ROHC__config const &config)
-{
- int len = 0, crcpos = 0, cidlen = 0, cid;
-
- Log_function_name_on_enter();
-
- switch (hdr.base__header().get_selection())
- {
- case Profile1__base__header::ALT_ir:
- cid = hdr.base__header().ir().cid();
- crcpos = len + 2;
- len += Set_Profile1_ROHC_Header_ir(&buf[len], hdr.base__header().ir());
- break;
- case Profile1__base__header::ALT_ir__dyn:
- cid = hdr.base__header().ir__dyn().cid();
- crcpos = len + 2;
- len += Set_Profile1_ROHC_Header_irdyn(&buf[len],
- hdr.base__header().ir__dyn());
- break;
- case Profile1__base__header::ALT_r__0:
- cid = hdr.base__header().r__0().cid();
- len += Set_Profile1_ROHC_Header_r0(&buf[len], hdr.base__header().r__0());
- break;
- case Profile1__base__header::ALT_r__0__crc:
- cid = hdr.base__header().r__0__crc().cid();
- len += Set_Profile1_ROHC_Header_r0crc(&buf[len],
- hdr.base__header().r__0__crc());
- break;
- case Profile1__base__header::ALT_uo__0:
- cid = hdr.base__header().uo__0().cid();
- len += Set_Profile1_ROHC_Header_uo0(&buf[len], hdr.base__header().uo__0());
- break;
- case Profile1__base__header::ALT_r__1:
- cid = hdr.base__header().r__1().cid();
- len += Set_Profile1_ROHC_Header_r1(&buf[len], hdr.base__header().r__1());
- break;
- case Profile1__base__header::ALT_r__1__id:
- cid = hdr.base__header().r__1__id().cid();
- len +=
- Set_Profile1_ROHC_Header_r1id(&buf[len], hdr.base__header().r__1__id());
- break;
- case Profile1__base__header::ALT_r__1__ts:
- cid = hdr.base__header().r__1__ts().cid();
- len +=
- Set_Profile1_ROHC_Header_r1ts(&buf[len], hdr.base__header().r__1__ts());
- break;
- case Profile1__base__header::ALT_uo__1:
- cid = hdr.base__header().uo__1().cid();
- len += Set_Profile1_ROHC_Header_uo1(&buf[len], hdr.base__header().uo__1());
- break;
- case Profile1__base__header::ALT_uo__1__id:
- cid = hdr.base__header().uo__1__id().cid();
- len +=
- Set_Profile1_ROHC_Header_uo1id(&buf[len],
- hdr.base__header().uo__1__id());
- break;
- case Profile1__base__header::ALT_uo__1__ts:
- cid = hdr.base__header().uo__1__ts().cid();
- len +=
- Set_Profile1_ROHC_Header_uo1ts(&buf[len],
- hdr.base__header().uo__1__ts());
- break;
- case Profile1__base__header::ALT_uor__2:
- cid = hdr.base__header().uor__2().cid();
- len +=
- Set_Profile1_ROHC_Header_uor2(&buf[len], hdr.base__header().uor__2());
- break;
- case Profile1__base__header::ALT_uor__2__id:
- cid = hdr.base__header().uor__2__id().cid();
- len +=
- Set_Profile1_ROHC_Header_uor2id(&buf[len],
- hdr.base__header().uor__2__id());
- break;
- case Profile1__base__header::ALT_uor__2__ts:
- cid = hdr.base__header().uor__2__ts().cid();
- len +=
- Set_Profile1_ROHC_Header_uor2ts(&buf[len],
- hdr.base__header().uor__2__ts());
- break;
- default:
- Log_not_implemented_union_field
- ("Profile1_base_header", hdr.base__header().get_selection());
- break;
- }
-
- len += Set_Profile1_ROHC_Header_Extension_opt(&buf[len], hdr.ext());
- len += Set_Profile1_ROHC_Header_ipid_ah_gre(&buf[len], hdr);
- len += Set_LIN2_BO_LAST_opt(&buf[len], hdr.udp__cksum());
-
- cidlen = Set_CID_for_packets(buf, config, cid, len);
- crcpos += cidlen;
- len += cidlen;
-
- if (hdr.base__header().get_selection() == Profile1__base__header::ALT_ir
- && hdr.base__header().ir().crc() == 0)
- buf[crcpos] = ComputeCRC(&(buf[0]), len, 8);
- else if (hdr.base__header().get_selection() ==
- Profile1__base__header::ALT_ir__dyn
- && hdr.base__header().ir__dyn().crc() == 0)
- buf[crcpos] = ComputeCRC(&(buf[0]), len, 8);
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Set_Profile2_Static_Chain(unsigned char
- *buf, const Profile2__Static__Chain & chain)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- for (int num = 0; num < chain.size_of(); num++)
- {
- switch (chain[num].get_selection())
- {
- case Static__Chain__u::ALT_ipv4__stat:
- len += Set_IPv4_static_chain(&buf[len], chain[num].ipv4__stat());
- break;
- case Static__Chain__u::ALT_ipv6__stat:
- len += Set_IPv6_static_chain(&buf[len], chain[num].ipv6__stat());
- break;
- case Static__Chain__u::ALT_udp__stat:
- len += Set_UDP_static_chain(&buf[len], chain[num].udp__stat());
- break;
- default:
- Log_not_implemented_union_field
- ("Profile2_Static_Chain", chain[num].get_selection());
- break;
- }
- }
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Set_Profile2_Dynamic_Chain(unsigned char
- *buf, const Profile2__Dynamic__Chain & dynch)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- for (int num = 0; num < dynch.size_of(); num++)
- {
- switch (dynch[num].get_selection())
- {
- case Profile2__Dynamic__Chain__u::ALT_ipv4__dyn:
- len += Set_IPv4_dynamic_chain(&buf[len], dynch[num].ipv4__dyn());
- break;
- case Profile2__Dynamic__Chain__u::ALT_ipv6__dyn:
- len += Set_IPv6_dynamic_chain(&buf[len], dynch[num].ipv6__dyn());
- break;
- case Profile2__Dynamic__Chain__u::ALT_udp__dyn:
- len += Set_LIN2_BO_LAST(&buf[len], dynch[num].udp__dyn().cksum());
- len += Set_LIN2_BO_LAST(&buf[len], dynch[num].udp__dyn().udp__sn());
- break;
- default:
- Log_not_implemented_union_field
- ("Profile2_Dynamic_Chain", dynch[num].get_selection());
- break;
- }
- }
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Set_Profile2_ROHC_Header_ir(unsigned char
- *buf, const Profile2__IR__header & hdr)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- Check_field_value("packet type", (int) *hdr.type__ind(), 126);
- buf[len] = ((*hdr.type__ind()) << 1) & 0xFE;
- Check_field_presence("dynamic chain", *hdr.d() == 1,
- hdr.dyn__chain().ispresent());
- buf[len] += ShiftUpBit(*hdr.d(), 0);
- len += 1;
- Check_field_value("profile", hdr.profile(), 2);
- len += Set_LIN1(&buf[len], hdr.profile());
- len += Set_LIN1(&buf[len], hdr.crc());
- len += Set_Profile2_Static_Chain(&buf[len], hdr.stat__chain());
- if (hdr.dyn__chain().ispresent())
- len += Set_Profile2_Dynamic_Chain(&buf[len], hdr.dyn__chain());
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Set_Profile2_ROHC_Header_irdyn(unsigned
- char *buf,
- const Profile2__IR__DYN__header & hdr)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- Check_field_value("packet type", (int) *hdr.type__ind(), 248);
- buf[len] = *hdr.type__ind();
- len += 1;
- Check_field_value("profile", hdr.profile(), 2);
- len += Set_LIN1(&buf[len], hdr.profile());
- len += Set_LIN1(&buf[len], hdr.crc());
- len += Set_Profile2_Dynamic_Chain(&buf[len], hdr.dyn__chain());
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Set_Profile2_ROHC_Header_r1(unsigned char
- *buf, const Profile2__R__1__header & hdr)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- Check_field_value("packet type", (int) *hdr.type__ind(), 2);
- buf[len] = ((*hdr.type__ind()) << 6) & 0xC0;
- buf[len] += hdr.sn() & 0x3F;
- len += 1;
- buf[len] = ShiftUpBit(*hdr.x__bit(), 7);
- buf[len] += hdr.ip__id() & 0x7F;
- len += 1;
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Set_Profile2_ROHC_Header_uo1(unsigned char
- *buf, const Profile2__UO__1__header & hdr)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- Check_field_value("packet type", (int) *hdr.type__ind(), 2);
- buf[len] = ((*hdr.type__ind()) << 6) & 0xC0;
- buf[len] += hdr.ip__id() & 0x3F;
- len += 1;
- buf[len] = (hdr.sn() << 3) & 0xF8;
- buf[len] += hdr.crc() & 0x07;
- len += 1;
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Set_Profile2_ROHC_Header_uor2(unsigned char *buf,
- const Profile2__UOR__2__header & hdr)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- Check_field_value("packet type", (int) *hdr.type__ind(), 6);
- buf[len] = ((*hdr.type__ind()) << 5) & 0xE0;
- buf[len] += hdr.sn() & 0x1F;
- len += 1;
- buf[len] = ShiftUpBit(*hdr.x__bit(), 7);
- buf[len] += hdr.crc() & 0x7F;
- len += 1;
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Set_Profile2_Inner_IP_flags_opt(unsigned char *buf,
- const OPTIONAL < Profile2__Inner__IP__flags >
- &field)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- if (!field.ispresent())
- {
- Log_function_name_on_leave();
- return len;
- }
- buf[len] = ShiftUpBit(*field().tos(), 7);
- buf[len] += ShiftUpBit(*field().ttl(), 6);
- buf[len] += ShiftUpBit(*field().df(), 5);
- buf[len] += ShiftUpBit(*field().pr(), 4);
- buf[len] += ShiftUpBit(*field().ipx(), 3);
- buf[len] += ShiftUpBit(*field().nbo(), 2);
- buf[len] += ShiftUpBit(*field().rnd__bit(), 1);
- Check_field_value("inner IP flags, reserved", (int) *field().reserved(), 0);
- buf[len] += ShiftUpBit(*field().reserved(), 0);
- len += 1;
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Set_Profile2_Inner_IP_fields_opt(unsigned char *buf,
- const OPTIONAL < Profile2__Inner__IP__flags >
- &flags,
- const OPTIONAL < Inner__IP__fields > &field)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- if (!field.ispresent())
- {
- Log_function_name_on_leave();
- return len;
- }
- Check_field_presence("TOS (inner IP)",
- flags.ispresent() && (*flags().tos() == 1),
- field().tos().ispresent());
- len += Set_LIN1_opt(&buf[len], field().tos());
- Check_field_presence("TTL (inner IP)",
- flags.ispresent() && (*flags().ttl() == 1),
- field().ttl().ispresent());
- len += Set_LIN1_opt(&buf[len], field().ttl());
- Check_field_presence("PROTO (inner IP)",
- flags.ispresent() && (*flags().pr() == 1),
- field().proto().ispresent());
- len += Set_LIN1_opt(&buf[len], field().proto());
-
- len += Set_Profile1_ipx_headers_opt(&buf[len], field().ext__heads());
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-
-int
-Set_Profile2_ROHC_Header_Extension0(unsigned char *buf,
- const Profile2__Extension0 & ext)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- Check_field_value("extension type", (int) *ext.ext__type(), 0);
- buf[len] = ((*ext.ext__type()) << 6) & 0xC0;
- buf[len] += (ext.sn() << 3) & 0x38;
- buf[len] += ext.ip__id() & 0x07;
- len += 1;
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Set_Profile2_ROHC_Header_Extension1(unsigned char *buf,
- const Profile2__Extension1 & ext)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- Check_field_value("extension type", (int) *ext.ext__type(), 1);
- buf[len] = ((*ext.ext__type()) << 6) & 0xC0;
- buf[len] += (ext.sn() << 3) & 0x38;
- buf[len] += (ext.ip__id() >> 8) & 0x07;
- len += 1;
- buf[len] = ext.ip__id() & 0xFF;
- len += 1;
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Set_Profile2_ROHC_Header_Extension2(unsigned char *buf,
- const Profile2__Extension2 & ext)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- Check_field_value("extension type", (int) *ext.ext__type(), 2);
- buf[len] = ((*ext.ext__type()) << 6) & 0xC0;
- buf[len] += (ext.sn() << 3) & 0x38;
- buf[len] += (ext.ip__id2() >> 8) & 0x07;
- len += 1;
- buf[len] = ext.ip__id2() & 0xFF;
- len += 1;
- buf[len] = ext.ip__id() & 0xFF;
- len += 1;
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Set_Profile2_ROHC_Header_Extension3(unsigned char *buf,
- const Profile2__Extension3 & ext)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- Check_field_value("extension type", (int) *ext.ext__type(), 3);
- buf[len] = ((*ext.ext__type()) << 6) & 0xC0;
- buf[len] += ShiftUpBit(*ext.s__bit(), 5);
- buf[len] += ((ext.mode()) << 3) & 0x18;
- buf[len] += ShiftUpBit(*ext.i__bit(), 2);
- buf[len] += ShiftUpBit(*ext.ip__bit(), 1);
- buf[len] += ShiftUpBit(*ext.ip2__bit(), 0);
- len += 1;
-
- Check_field_presence("Inner IP flags",
- *ext.ip__bit() == 1,
- ext.inner__ip__flags().ispresent());
- len += Set_Profile2_Inner_IP_flags_opt(&buf[len], ext.inner__ip__flags());
- Check_field_presence("Outer IP flags",
- *ext.ip2__bit() == 1,
- ext.outer__ip__flags().ispresent());
- len += Set_Profile1_Outer_IP_flags_opt(&buf[len], ext.outer__ip__flags());
- Check_field_presence("SN", *ext.s__bit() == 1, ext.sn().ispresent());
- len += Set_LIN1_opt(&buf[len], ext.sn());
- Check_field_presence("Inner IP fields",
- *ext.ip__bit() == 1, ext.inner__ip__hdr().ispresent());
- len += Set_Profile2_Inner_IP_fields_opt(&buf[len], ext.inner__ip__flags(),
- ext.inner__ip__hdr());
- Check_field_presence("Inner IP-ID",
- *ext.i__bit() == 1, ext.ip__id().ispresent());
- len += Set_LIN2_BO_LAST_opt(&buf[len], ext.ip__id());
- Check_field_presence("Outer IP fields",
- *ext.ip2__bit() == 1, ext.outer__ip__hdr().ispresent());
- len += Set_Profile1_Outer_IP_fields_opt(&buf[len], ext.outer__ip__flags(),
- ext.outer__ip__hdr());
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Set_Profile2_ROHC_Header_Extension_opt(unsigned char *buf,
- const OPTIONAL < Profile2__Extension >
- &ext)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- if (ext.ispresent())
- {
- if (ext().get_selection() == Profile2__Extension::ALT_ext0)
- {
- len += Set_Profile2_ROHC_Header_Extension0(&buf[len], ext().ext0());
- }
- else if (ext().get_selection() == Profile2__Extension::ALT_ext1)
- {
- len += Set_Profile2_ROHC_Header_Extension1(&buf[len], ext().ext1());
- }
- else if (ext().get_selection() == Profile2__Extension::ALT_ext2)
- {
- len += Set_Profile2_ROHC_Header_Extension2(&buf[len], ext().ext2());
- }
- else if (ext().get_selection() == Profile2__Extension::ALT_ext3)
- {
- len += Set_Profile2_ROHC_Header_Extension3(&buf[len], ext().ext3());
- }
- else
- {
- Log_not_implemented_union_field("Profile2_Extension",
- ext().get_selection());
- }
- }
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Set_Profile2_ROHC_Header_ipid_ah_gre(unsigned char *buf,
- const Profile2__headers & hdr)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- len += Set_LIN2_BO_LAST_opt(&buf[len], hdr.ip__id__outer());
- len += Set_octetstring_opt(&buf[len], hdr.ah__outer());
- len += Set_LIN2_BO_LAST_opt(&buf[len], hdr.gre__cksum1());
- len += Set_LIN2_BO_LAST_opt(&buf[len], hdr.ip__id__inner());
- len += Set_octetstring_opt(&buf[len], hdr.ah__inner());
- len += Set_LIN2_BO_LAST_opt(&buf[len], hdr.gre__cksum2());
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Set_Profile2_ROHC_Header(unsigned char *buf,
- const Profile2__headers & hdr,
- ROHC__config const &config)
-{
- int len = 0, crcpos = 0, cidlen = 0, cid;
-
- Log_function_name_on_enter();
-
- switch (hdr.base__header().get_selection())
- {
- case Profile2__base__header::ALT_ir:
- cid = hdr.base__header().ir().cid();
- crcpos = len + 2;
- len += Set_Profile2_ROHC_Header_ir(&buf[len], hdr.base__header().ir());
- break;
- case Profile2__base__header::ALT_ir__dyn:
- cid = hdr.base__header().ir__dyn().cid();
- crcpos = len + 2;
- len +=
- Set_Profile2_ROHC_Header_irdyn(&buf[len], hdr.base__header().ir__dyn());
- break;
- case Profile1__base__header::ALT_r__0:
- cid = hdr.base__header().r__0().cid();
- len += Set_Profile1_ROHC_Header_r0(&buf[len], hdr.base__header().r__0());
- break;
- case Profile1__base__header::ALT_r__0__crc:
- cid = hdr.base__header().r__0__crc().cid();
- len +=
- Set_Profile1_ROHC_Header_r0crc(&buf[len],
- hdr.base__header().r__0__crc());
- break;
- case Profile1__base__header::ALT_uo__0:
- cid = hdr.base__header().uo__0().cid();
- len += Set_Profile1_ROHC_Header_uo0(&buf[len], hdr.base__header().uo__0());
- break;
- case Profile2__base__header::ALT_r__1:
- cid = hdr.base__header().r__1().cid();
- len += Set_Profile2_ROHC_Header_r1(&buf[len], hdr.base__header().r__1());
- break;
- case Profile2__base__header::ALT_uo__1:
- cid = hdr.base__header().uo__1().cid();
- len += Set_Profile2_ROHC_Header_uo1(&buf[len], hdr.base__header().uo__1());
- break;
- case Profile2__base__header::ALT_uor__2:
- cid = hdr.base__header().uor__2().cid();
- len +=
- Set_Profile2_ROHC_Header_uor2(&buf[len], hdr.base__header().uor__2());
- break;
- default:
- Log_not_implemented_union_field
- ("Profile2_base_header", hdr.base__header().get_selection());
- break;
- }
-
- len += Set_Profile2_ROHC_Header_Extension_opt(&buf[len], hdr.ext());
- len += Set_Profile2_ROHC_Header_ipid_ah_gre(&buf[len], hdr);
- len += Set_LIN2_BO_LAST_opt(&buf[len], hdr.udp__cksum());
-
- cidlen = Set_CID_for_packets(buf, config, cid, len);
- crcpos += cidlen;
- len += cidlen;
-
- if (hdr.base__header().get_selection() == Profile2__base__header::ALT_ir)
- {
- if (hdr.base__header().ir().crc() == 0)
- buf[crcpos] = ComputeCRC(&(buf[0]), len, 8);
- }
- else
- if (hdr.base__header().
- get_selection() == Profile2__base__header::ALT_ir__dyn)
- {
- if (hdr.base__header().ir__dyn().crc() == 0)
- buf[crcpos] = ComputeCRC(&(buf[0]), len, 8);
- }
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-} /* Set_Profile2_ROHC_Header */
-
-int
-Set_Profile4_Static_Chain(unsigned char *buf,
- const Profile4__Static__Chain & chain)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- for (int num = 0; num < chain.size_of(); num++)
- {
- switch (chain[num].get_selection())
- {
- case Static__Chain__u::ALT_ipv4__stat:
- len += Set_IPv4_static_chain(&buf[len], chain[num].ipv4__stat());
- break;
- case Static__Chain__u::ALT_ipv6__stat:
- len += Set_IPv6_static_chain(&buf[len], chain[num].ipv6__stat());
- break;
- default:
- Log_not_implemented_union_field
- ("Profile4_Static_Chain", chain[num].get_selection());
- break;
- }
- }
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Set_Profile4_IPv4_dynamic(unsigned char *buf,
- const Profile4__IPv4__Dynamic & chain)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- len += Set_LIN1(&buf[len], chain.tos());
- len += Set_LIN1(&buf[len], chain.ttl());
- len += Set_LIN2_BO_LAST(&buf[len], chain.identification());
-
- buf[len] = ShiftUpBit(*chain.df__bit(), 7);
- buf[len] += ShiftUpBit(*chain.rnd__bit(), 6);
- buf[len] += ShiftUpBit(*chain.nbo__bit(), 5);
- buf[len] += ShiftUpBit(*chain.sid__bit(), 4);
- Check_field_value("IPv4 reserved (dynamic chain)", *chain.reserved(), 0);
- buf[len] += (*chain.reserved()) & 0x0F;
- len += 1;
- len += Set_Encoding_Type_0(&buf[len], chain.genextheadlist());
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Set_Profile4_Dynamic_Chain(unsigned char *buf,
- const Profile4__Dynamic__Chain & dynch)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- for (int num = 0; num < dynch.size_of(); num++)
- {
- switch (dynch[num].get_selection())
- {
- case Profile4__Dynamic__Chain__u::ALT_ipv4__dyn:
- len += Set_Profile4_IPv4_dynamic(&buf[len], dynch[num].ipv4__dyn());
- break;
- case Profile4__Dynamic__Chain__u::ALT_ipv6__dyn:
- len += Set_IPv6_dynamic_chain(&buf[len], dynch[num].ipv6__dyn());
- break;
- case Profile4__Dynamic__Chain__u::ALT_sn:
- len += Set_LIN2_BO_LAST(&buf[len], dynch[num].sn());
- break;
- default:
- Log_not_implemented_union_field
- ("Profile4_Dynamic_Chain", dynch[num].get_selection());
- break;
- }
- }
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Set_Profile4_ROHC_Header_ir(unsigned char *buf,
- const Profile4__IR__header & hdr)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- Check_field_value("packet type", (int) *hdr.type__ind(), 126);
- buf[len] = ((*hdr.type__ind()) << 1) & 0xFE;
- Check_field_presence("dynamic chain", *hdr.d() == 1,
- hdr.dyn__chain().ispresent());
- buf[len] += ShiftUpBit(*hdr.d(), 0);
- len += 1;
- Check_field_value("profile", hdr.profile(), 4);
- len += Set_LIN1(&buf[len], hdr.profile());
- len += Set_LIN1(&buf[len], hdr.crc());
- len += Set_Profile4_Static_Chain(&buf[len], hdr.stat__chain());
- if (hdr.dyn__chain().ispresent())
- len += Set_Profile4_Dynamic_Chain(&buf[len], hdr.dyn__chain());
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Set_Profile4_ROHC_Header_irdyn(unsigned char *buf,
- const Profile4__IR__DYN__header & hdr)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- Check_field_value("packet type", (int) *hdr.type__ind(), 248);
- buf[len] = *hdr.type__ind();
- len += 1;
- Check_field_value("profile", hdr.profile(), 4);
- len += Set_LIN1(&buf[len], hdr.profile());
- len += Set_LIN1(&buf[len], hdr.crc());
- len += Set_Profile4_Dynamic_Chain(&buf[len], hdr.dyn__chain());
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Set_Profile4_ROHC_Header_ipid_ah_gre(unsigned char *buf,
- const Profile4__headers & other_headers)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- len += Set_LIN2_BO_LAST_opt(&buf[len], other_headers.ip__id__outer());
- len += Set_octetstring_opt(&buf[len], other_headers.ah__outer());
- len += Set_LIN2_BO_LAST_opt(&buf[len], other_headers.gre__cksum1());
- len += Set_LIN2_BO_LAST_opt(&buf[len], other_headers.ip__id__inner());
- len += Set_octetstring_opt(&buf[len], other_headers.ah__inner());
- len += Set_LIN2_BO_LAST_opt(&buf[len], other_headers.gre__cksum2());
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Set_Profile4_ROHC_Header(unsigned char *buf,
- const Profile4__headers & hdr,
- ROHC__config const &config)
-{
- int len = 0, crcpos = 0, cidlen = 0, cid;
-
- Log_function_name_on_enter();
-
- switch (hdr.base__header().get_selection())
- {
- case Profile4__base__header::ALT_ir:
- cid = hdr.base__header().ir().cid();
- crcpos = len + 2;
- len += Set_Profile4_ROHC_Header_ir(&buf[len], hdr.base__header().ir());
- break;
- case Profile4__base__header::ALT_ir__dyn:
- cid = hdr.base__header().ir__dyn().cid();
- crcpos = len + 2;
- len +=
- Set_Profile4_ROHC_Header_irdyn(&buf[len], hdr.base__header().ir__dyn());
- break;
- case Profile1__base__header::ALT_r__0:
- cid = hdr.base__header().r__0().cid();
- len += Set_Profile1_ROHC_Header_r0(&buf[len], hdr.base__header().r__0());
- break;
- case Profile1__base__header::ALT_r__0__crc:
- cid = hdr.base__header().r__0__crc().cid();
- len +=
- Set_Profile1_ROHC_Header_r0crc(&buf[len],
- hdr.base__header().r__0__crc());
- break;
- case Profile1__base__header::ALT_uo__0:
- cid = hdr.base__header().uo__0().cid();
- len += Set_Profile1_ROHC_Header_uo0(&buf[len], hdr.base__header().uo__0());
- break;
- case Profile2__base__header::ALT_r__1:
- cid = hdr.base__header().r__1().cid();
- len += Set_Profile2_ROHC_Header_r1(&buf[len], hdr.base__header().r__1());
- break;
- case Profile2__base__header::ALT_uo__1:
- cid = hdr.base__header().uo__1().cid();
- len += Set_Profile2_ROHC_Header_uo1(&buf[len], hdr.base__header().uo__1());
- break;
- case Profile2__base__header::ALT_uor__2:
- cid = hdr.base__header().uor__2().cid();
- len +=
- Set_Profile2_ROHC_Header_uor2(&buf[len], hdr.base__header().uor__2());
- break;
- default:
- Log_not_implemented_union_field
- ("Profile4_base_header", hdr.base__header().get_selection());
- break;
- }
-
- len += Set_Profile2_ROHC_Header_Extension_opt(&buf[len], hdr.ext());
- len += Set_Profile4_ROHC_Header_ipid_ah_gre(&buf[len], hdr);
- if (hdr.additional__IP().ispresent())
- {
- len += Set_Profile4_Dynamic_Chain(&buf[len], hdr.additional__IP()());
- }
-
- cidlen = Set_CID_for_packets(buf, config, cid, len);
- crcpos += cidlen;
- len += cidlen;
-
- if (hdr.base__header().get_selection() == Profile4__base__header::ALT_ir)
- {
- if (hdr.base__header().ir().crc() == 0)
- buf[crcpos] = ComputeCRC(&(buf[0]), len, 8);
- }
- else if (hdr.base__header().get_selection() ==
- Profile4__base__header::ALT_ir__dyn)
- {
- if (hdr.base__header().ir__dyn().crc() == 0)
- buf[crcpos] = ComputeCRC(&(buf[0]), len, 8);
- }
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-OCTETSTRING
-f__ROHC__enc(ROHC__packet__u const &pdu, ROHC__config const &config)
-{
- unsigned char buf[MAX_PACKET_SIZE];
- int len = 0;
-
- Log_function_name_on_enter();
-
- TTCN_logger.begin_event(TTCN_DEBUG);
- config.log();
- pdu.log();
- TTCN_logger.end_event();
-
- if (pdu.get_selection() == ROHC__packet__u::ALT_segment)
- {
- // Processing padding
- len += Set_octetstring_opt(&buf[len], pdu.segment().padding());
- // Processing feedback
- len +=
- Set_ROHC_Feedback_opt(&buf[len],
- pdu.segment().feedback(), config.large__cid());
- // Processing segment header
- Check_field_value("segment header id",
- pdu.segment().segment__header__id(), 127);
- buf[len] = (pdu.segment().segment__header__id() << 1) & 0xFE;
- if (pdu.segment().final())
- buf[len] += 1;
- len += 1;
- // Processing payload
- len += Set_octetstring_opt(&buf[len], pdu.segment().payload());
- // Processing CRC
- if (pdu.segment().crc().ispresent())
- {
- buf[len] = (pdu.segment().crc()() >> 24) & 0xFF;
- len += 1;
- buf[len] = (pdu.segment().crc()() >> 16) & 0xFF;
- len += 1;
- buf[len] = (pdu.segment().crc()() >> 8) & 0xFF;
- len += 1;
- buf[len] = pdu.segment().crc()() & 0xFF;
- len += 1;
- }
- }
- else if (pdu.get_selection() == ROHC__packet__u::ALT_rohc)
- {
- // Processing padding
- len += Set_octetstring_opt(&buf[len], pdu.rohc().padding());
- // Processing feedback
- len += Set_ROHC_Feedback_opt(&buf[len],
- pdu.rohc().feedback(), config.large__cid());
- // Processing ROHC header
- switch (pdu.rohc().header().get_selection())
- {
- case Header::ALT_prof0:
- len += Set_ROHC_Header_Profile0(&buf[len], pdu.rohc().header().prof0(),
- config);
- break;
- case Header::ALT_prof1:
- len += Set_Profile1_ROHC_Header(&buf[len], pdu.rohc().header().prof1(),
- config);
- break;
- case Header::ALT_prof2:
- len += Set_Profile2_ROHC_Header(&buf[len], pdu.rohc().header().prof2(),
- config);
- break;
- case Header::ALT_prof4:
- len += Set_Profile4_ROHC_Header(&buf[len], pdu.rohc().header().prof4(),
- config);
- break;
- default:
- Log_not_implemented_union_field("Header",
- pdu.rohc().header().get_selection());
- break;
- }
-
- // Processing payload
- len += Set_octetstring_opt(&buf[len], pdu.rohc().payload());
- }
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return OCTETSTRING(len, &(buf[0]));
-}
-
-
-
-
-
-/* ============ Decoding functions for base types ============ */
-
-/* Mirrors the bits of an octet and returns the same pointer. */
-unsigned char *
-Convert_bitstring(unsigned char *buf, int len)
-{
- unsigned char dst_buf = 0;
-
- if (len > 8)
- {
- TTCN_error("Bitstring is too long, at most 8 bits can be converted");
- }
- for (int i = 0; i < 8; i++)
- {
- dst_buf += ShiftUpBit(ShiftDownBit(buf[0], i), 7 - i);
- }
- buf[0] = dst_buf;
-
- return buf;
-}
-
-/* Decodes an OCTETSTING value */
-int
-Get_octetstring(const unsigned char *buf, OCTETSTRING & octstr, int length)
-{
- octstr = OCTETSTRING(length, buf);
- return length;
-}
-
-/* Decodes a LIN1 value */
-int
-Get_LIN1(const unsigned char *buf, LIN1 & var)
-{
- var = LIN1(buf[0]);
- return 1;
-}
-
-/* Decodes a LIN2_BO_LAST value */
-int
-Get_LIN2_BO_LAST(const unsigned char *buf, LIN2__BO__LAST & var)
-{
- var = (buf[0] << 8) + buf[1];
- return 2;
-}
-
-/* Decodes a LIN4_BO_LAST value */
-int
-Get_LIN4_BO_LAST(const unsigned char *buf, LIN4__BO__LAST & var)
-{
- var = (buf[0] << 24) + (buf[1] << 16) + (buf[2] << 8) + buf[3];
- return 4;
-}
-
-int
-Get_SDVL_field(const unsigned char *buf, INTEGER & dest)
-{
- int len = 0;
- int decoded_value;
-
- Log_function_name_on_enter();
-
- if ((buf[len] & 0x80) == 0)
- {
- dest = buf[len] & 0x7F;
- len += 1;
- }
- else if ((buf[len] & 0xC0) == 0x80)
- {
- dest = ((buf[len] << 8) & 0x3F00) + (buf[len + 1] & 0xFF);
- len += 2;
- }
- else if ((buf[len] & 0xE0) == 0xC0)
- {
- dest =
- ((buf[len] << 16) & 0x1F0000) +
- ((buf[len + 1] << 8) & 0xFF00) + (buf[len + 2] & 0xFF);
- len += 3;
- }
- else // if ((buf[len] & 0xE0) == 0xE0)
- {
- dest =
- ((buf[len] << 24) & 0x1F000000) +
- ((buf[len + 1] << 16) & 0xFF0000) +
- ((buf[len + 2] << 8) & 0xFF00) + (buf[len + 3] & 0xFF);
- len += 4;
- }
-
- decoded_value = dest;
- TTCN_logger.log(TTCN_DEBUG, "Decoded value is %u (encoded on %u octets)",
- decoded_value, len);
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-/* ============ Decoding wrappers for optional base types ============ */
-
-/* Decodes a optional octetstring value */
-int
-Get_octetstring_opt(const unsigned char *buf, OPTIONAL < OCTETSTRING > &var,
- bool hasvalue, int length)
-{
- if (hasvalue)
- {
- return Get_octetstring(buf, var(), length);
- }
- var = OMIT_VALUE;
- return 0;
-}
-
-/* Decodes a optional LIN1 value */
-int
-Get_LIN1_opt(const unsigned char *buf, OPTIONAL < LIN1 > &var, bool hasvalue)
-{
- if (hasvalue)
- {
- return Get_LIN1(buf, var());
- }
- var = OMIT_VALUE;
- return 0;
-}
-
-/* Decodes a optional LIN2_BO_LAST value */
-int
-Get_LIN2_BO_LAST_opt(const unsigned char *buf,
- OPTIONAL < LIN2__BO__LAST > &var, bool hasvalue)
-{
- if (hasvalue)
- {
- return Get_LIN2_BO_LAST(buf, var());
- }
- var = OMIT_VALUE;
- return 0;
-}
-
-/* Decodes a optional LIN4_BO_LAST value */
-int
-Get_LIN4_BO_LAST_opt(const unsigned char *buf,
- OPTIONAL < LIN4__BO__LAST > &var, bool hasvalue)
-{
- if (hasvalue)
- {
- return Get_LIN4_BO_LAST(buf, var());
- }
- var = OMIT_VALUE;
- return 0;
-}
-
-/* Decodes a optional SDVL value */
-int
-Get_SDVL_field_opt(const unsigned char *buf,
- OPTIONAL < INTEGER > &var, bool hasvalue)
-{
- if (hasvalue)
- {
- return Get_SDVL_field(buf, var());
- }
- var = OMIT_VALUE;
- return 0;
-}
-
-/* ============ Decoding functions for ROHC types ============ */
-
-/* Returns the number of matching octets, that are the same as the passed
- 'octet'. */
-int
-Strip_leading_octet(const unsigned char *buf, int length, unsigned char octet)
-{
- int len = 0;
-
- while ((buf[len] == octet) && (len < length))
- len += 1;
- return len;
-}
-
-int
-Get_ROHC_Padding(const unsigned char *buf, int length,
- OPTIONAL < Padding > &p_padding, ROHC__config & config)
-{
- int len = Strip_leading_octet(buf, length, 0xE0);
-
- Log_function_name_on_enter();
-
- if (len > 0)
- {
- p_padding = OCTETSTRING(len, &(buf[0]));
- Log_hexdump(buf, len);
- }
- else
- p_padding = OMIT_VALUE;
-
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_CID(const unsigned char *buf, INT14b__BO__LAST & cid,
- ROHC__config & config)
-{
- int len = 0;
- int dec_cid;
-
- Log_function_name_on_enter();
-
- if (config.large__cid() == false)
- {
- if ((buf[len] & 0xF0) == 0xE0)
- {
- cid = buf[len] & 0x0F;
- len += 1;
- }
- else
- cid = 0;
- }
- else
- {
- len += Get_SDVL_field(&buf[len], cid);
- }
-
- dec_cid = cid;
- TTCN_logger.log(TTCN_DEBUG, "Decoded CID = %u", dec_cid);
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_feedback(const unsigned char *buf, Feedback__u & feedback,
- ROHC__config & config)
-{
- int len = 0, fbsize = 0, cidlen;
- unsigned char ctemp;
-
- Log_function_name_on_enter();
-
- ctemp = (buf[len] >> 3) & 0x1F;
- feedback.feedback__type() = BITSTRING(5, &ctemp);
- feedback.code() = buf[len] & 0x07;
- fbsize = feedback.code();
- len += 1;
- len += Get_LIN1_opt(&buf[len], feedback.size(), feedback.code() == 0);
- if (feedback.size().ispresent())
- {
- fbsize = feedback.size()();
- }
-
- cidlen = Get_CID(&buf[len], feedback.feedback__data().cid(), config);
- fbsize -= cidlen;
- len += cidlen;
-
- if (fbsize == 1) /* Feedback type 1 */
- {
- len += Get_octetstring(&buf[len],
- feedback.feedback__data().feedback__type().
- feedback1(), fbsize);
- }
- else /* Feedback type 2 */
- {
- int optnum = 0;
- Feedback__opts fbopts;
- Feedback2 feedback2;
-
- feedback2.acktype() = (buf[len] >> 6) & 0x03;
- feedback2.mode() = (buf[len] >> 4) & 0x03;
- ctemp = buf[len] & 0x0F;
- len += 1;
- fbsize -= 1;
- feedback2.sn() = ((ctemp << 8) & 0x0F00) + buf[len];
- len += 1;
- fbsize -= 1;
- feedback2.feedback__opts() = OMIT_VALUE;
- while (fbsize > 0)
- {
- fbopts[optnum].opt__type() = (buf[len] >> 4) & 0x0F;
- fbopts[optnum].opt__len() = buf[len] & 0x0F;
- len += 1;
- fbsize -= 1;
- if (fbopts[optnum].opt__len())
- {
- len += Get_octetstring(&buf[len], fbopts[optnum].opt__data(),
- fbopts[optnum].opt__len());
- fbsize -= fbopts[optnum].opt__len();
- }
- else
- fbopts[optnum].opt__data() = OMIT_VALUE;
- feedback2.feedback__opts() = fbopts;
- optnum += 1;
- }
-
- feedback.feedback__data().feedback__type().feedback2() = feedback2;
- }
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_ROHC_Feedback(const unsigned char *buf,
- int length,
- OPTIONAL < Feedback > &feedback, ROHC__config & config)
-{
- int len = 0, fbnum = 0;
-
- Log_function_name_on_enter();
-
- feedback = OMIT_VALUE;
- while (((buf[len] & 0xF8) == 0xF0) && (len < length))
- {
- len += Get_feedback(&buf[len], feedback()[fbnum], config);
- fbnum++;
- }
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_XI_list(const unsigned char *buf,
- OPTIONAL < XI__list > &xilist, int m,
- const BITSTRING & ps_bit, int *itemnum,
- OPTIONAL < BITSTRING > &padding)
-{
- int len = 0;
- unsigned char ctemp;
-
- Log_function_name_on_enter();
-
- if (!m)
- {
- xilist = OMIT_VALUE;
- padding = OMIT_VALUE;
- return len;
- }
-
- if ((*ps_bit) == 1)
- {
- for (int num = 0; num < m; num++)
- {
- ctemp = ShiftDownBit(buf[len], 7);
- xilist().xi__item8()[num].x__ind() = BITSTRING(1, &ctemp);
- if (ctemp)
- *itemnum += 1;
- xilist().xi__item8()[num].index() = buf[len] & 0x7F;
- len += 1;
- }
- padding = OMIT_VALUE;
- }
- else
- {
- int halfbyte = 0;
-
- for (int num = 0; num < m; num++)
- {
- if (halfbyte)
- {
- ctemp = ShiftDownBit(buf[len], 3);
- xilist().xi__item4()[num].x__ind() = BITSTRING(1, &ctemp);
- if (ctemp)
- *itemnum += 1;
- xilist().xi__item4()[num].index() = buf[len] & 0x07;
- len += 1;
- }
- else
- {
- ctemp = ShiftDownBit(buf[len], 7);
- xilist().xi__item4()[num].x__ind() = BITSTRING(1, &ctemp);
- if (ctemp)
- *itemnum += 1;
- xilist().xi__item4()[num].index() = (buf[len] >> 4) & 0x07;
- }
- halfbyte = 1 - halfbyte; /* Invert the value */
- }
- /* Padding */
- if (halfbyte == 1)
- {
- ctemp = buf[len] & 0x0F;
- padding() = BITSTRING(4, &ctemp);
- len += 1;
- }
- else
- padding = OMIT_VALUE;
- }
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_Item_list(const unsigned char *buf,
- OPTIONAL < Item__list > &item_list, int n,
- Item__list::union_selection_type selection,
- t_dat *dat, int ip_idx)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- if (n == 0)
- {
- item_list = OMIT_VALUE;
- Log_function_name_on_leave();
- return len;
- }
-
- TTCN_logger.log(TTCN_DEBUG, "Expecting %u items", n);
-
- /* Item list is an IP extension header list */
- if (selection == Item__list::ALT_ip__item__list)
- {
- IP__Item__list & itlist = item_list().ip__item__list();
- for (int num = 0; num < n; num++)
- {
- int headid = buf[len];
- len += 1;
-
- TTCN_logger.log(TTCN_DEBUG, "%uth item", num);
-
- if (headid == c__ip__proto__ah)
- {
- AH__item & item = itlist[num].ah__item();
- int payload_length, ah_data_len;
-
- TTCN_logger.log(TTCN_DEBUG, "AH header found");
- item.nexthead() = headid;
- len += Get_LIN1(&buf[len], item.payload__len());
- payload_length = item.payload__len();
- ah_data_len = (item.payload__len() - 1) * 4;
- len += Get_LIN2_BO_LAST(&buf[len], item.reserved());
- len += Get_LIN4_BO_LAST(&buf[len], item.spi());
- len += Get_LIN4_BO_LAST(&buf[len], item.sn());
- len += Get_octetstring_opt(&buf[len], item.auth__data(),
- item.payload__len() != 1, ah_data_len);
- dat->context.ip__ctx()[ip_idx].ah__data__len() = ah_data_len;
- dat->context.ip__ctx()[ip_idx].ah__present() = true;
- // There is no compressed AH data after the base header
- dat->compressed_ah_data_len[ip_idx] = 0;
- TTCN_logger.log(TTCN_DEBUG,
- "AH payload length is %d meaning %d octets",
- payload_length, ah_data_len);
- Log_hexdump(buf, len);
- }
- else if (headid == c__ip__proto__mine)
- {
- unsigned char ctemp;
- MINE__item & item = itlist[num].mine__item();
-
- TTCN_logger.log(TTCN_DEBUG, "MINE header found");
- item.protocol() = headid;
- ctemp = ShiftDownBit(buf[len], 7);
- item.s__bit() = BITSTRING(1, &ctemp);
- item.reserved() = BITSTRING(7, &buf[len]);
- len += 1;
- len += Get_LIN2_BO_LAST(&buf[len], item.cksum());
- len += Get_octetstring(&buf[len], item.dstaddr(), 4);
- len += Get_octetstring_opt(&buf[len], item.srcaddr(),
- *item.s__bit() == 1, 4);
- Log_hexdump(buf, len);
- }
- else if (headid == c__ip__proto__esp)
- {
- ESP__item & item = itlist[num].esp__item();
-
- TTCN_logger.log(TTCN_DEBUG, "ESP header found");
- item.nexthead() = headid;
- len += Get_LIN4_BO_LAST(&buf[len], item.spi());
- len += Get_LIN4_BO_LAST(&buf[len], item.sn());
-
- dat->context.ip__ctx()[ip_idx].esp__present() = true;
- Log_hexdump(buf, len);
- }
- else if (headid == c__ip__proto__gre2)
- {
- GRE__item & item = itlist[num].gre__item();
- unsigned char ctemp;
-
- TTCN_logger.log(TTCN_DEBUG, "GRE header found");
- item.nexthead() = headid;
- ctemp = ShiftDownBit(buf[len], 7);
- item.C__bit() = BITSTRING(1, &ctemp);
- ctemp = ShiftDownBit(buf[len], 6);
- item.reserved__1() = BITSTRING(1, &ctemp);
- ctemp = ShiftDownBit(buf[len], 5);
- item.K__bit() = BITSTRING(1, &ctemp);
- ctemp = ShiftDownBit(buf[len], 4);
- item.S__bit() = BITSTRING(1, &ctemp);
- ctemp = ShiftDownBit(buf[len], 3);
- item.reserved__2() = BITSTRING(1, &ctemp);
- ctemp = buf[len] & 0x07;
- item.version() = BITSTRING(3, &ctemp);
- len += 1;
- len += Get_LIN2_BO_LAST_opt(&buf[len], item.cksum(),
- *item.C__bit() == 1);
- len += Get_LIN4_BO_LAST_opt(&buf[len], item.key(),
- *item.K__bit() == 1);
- len += Get_LIN4_BO_LAST_opt(&buf[len], item.sn(), *item.S__bit() == 1);
-
- dat->context.ip__ctx()[ip_idx].gre__cksum__present() = (*item.C__bit() == 1);
- dat->context.ip__ctx()[ip_idx].gre__present() = true;
- // There is no compressed GRE data after the base header
- dat->ipx_gre_cksum_present[ip_idx] = false;
- Log_hexdump(buf, len);
- }
- else /* Assuming IPv6 extension header */
- /* TODO check: why only these were supported:
- if (headid == 0 || headid == 43 || headid == 60) */
- {
- IPv6__ext__item & item = itlist[num].ipv6__ext__item();
- int ext_len;
- int ext_len_oct;
-
- TTCN_logger.log(TTCN_DEBUG, "IPv6 header found (type %d)", headid);
- item.nexthead() = headid;
- len += Get_LIN1(&buf[len], item.hdr__ext__len());
- ext_len_oct = item.hdr__ext__len();
- ext_len = (item.hdr__ext__len() + 1) * 8;
- TTCN_logger.log(TTCN_DEBUG,
- "IPv6 extension length is %d meaning %d octets",
- ext_len_oct, ext_len);
- // 2 octets already been read
- len += Get_octetstring(&buf[len], item.data(), ext_len - 2);
- Log_hexdump(buf, len);
- }
- } /* for (num) */
- }
- else if (selection == Item__list::ALT_csrc__item__list)
- {
- for (int num = 0; num < n; num++)
- {
- TTCN_logger.log(TTCN_DEBUG, "%uth item", num);
-
- len +=
- Get_octetstring(&buf[len], item_list().csrc__item__list()[num], 4);
- }
- }
- else if (selection == Item__list::ALT_raw__data)
- {
- /* TODO: RAW_data field is just a temporary hack for Profile4 tests */
- RAW__data & itlist = item_list().raw__data();
-
- for (int num = 0; num < n; num++)
- {
- int headid = char2int(buf[len]);
-
- if (headid == 0 || headid == 43 || headid == 60)
- {
- int itemlimit = char2int(buf[len + 1]) + 1 * 8;
- for (int itemlen = 0; itemlen < itemlimit; itemlen++)
- {
- if (itemlen == 0)
- itlist[num] = OCTETSTRING(1, &buf[len]);
- else
- itlist[num] = itlist[num] + OCTETSTRING(1, &buf[len]);
- len += 1;
- }
- }
- else if (headid == 51)
- {
- int itemlimit = char2int(buf[len + 1]) + 1 * 8;
- for (int itemlen = 0; itemlen < itemlimit; itemlen++)
- {
- if (itemlen == 0)
- itlist[num] = OCTETSTRING(1, &buf[len]);
- else
- itlist[num] = itlist[num] + OCTETSTRING(1, &buf[len]);
- len += 1;
- }
- }
- else if (headid == 50)
- {
- for (int itemlen = 0; itemlen < 9; itemlen++)
- {
- if (itemlen == 0)
- itlist[num] = OCTETSTRING(1, &buf[len]);
- else
- itlist[num] = itlist[num] + OCTETSTRING(1, &buf[len]);
- len += 1;
- }
- }
- else if (headid == 55 || headid == 47)
- {
- for (int itemlen = 0; itemlen < 13; itemlen++)
- {
- if (itemlen == 0)
- itlist[num] = OCTETSTRING(1, &buf[len]);
- else
- itlist[num] = itlist[num] + OCTETSTRING(1, &buf[len]);
- len += 1;
- }
- }
- else
- TTCN_logger.log(TTCN_WARNING,
- "Unrecognized element in encoding type 0");
- }
- }
- else
- {
- Log_not_implemented_union_field("Item_list", selection);
- }
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_Encoding_Type_0(Enc__Type__0 & enct0, const unsigned char *buf,
- Item__list::union_selection_type selection,
- t_dat *dat, int ip_idx)
-{
- unsigned char ctemp;
- int itemnum = 0;
- int len = 0;
-
- Log_function_name_on_enter();
-
- ctemp = (buf[len] >> 6) & 0x03;
- enct0.et() = BITSTRING(2, &ctemp);
- ctemp = ShiftDownBit(buf[len], 5);
- enct0.gp__bit() = BITSTRING(1, &ctemp);
- ctemp = ShiftDownBit(buf[len], 4);
- enct0.ps__bit() = BITSTRING(1, &ctemp);
- enct0.cc() = buf[len] & 0x0F;
- len += 1;
- len += Get_LIN1_opt(&buf[len], enct0.gen__id(), (*enct0.gp__bit()) == 1);
- len += Get_XI_list(&buf[len], enct0.xi__list(),
- enct0.cc(), enct0.ps__bit(), &itemnum, enct0.padding());
- len += Get_Item_list(&buf[len], enct0.item__list(), itemnum, selection,
- dat, ip_idx);
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_Encoding_Type_1(Enc__Type__1 & enct1, const unsigned char *buf,
- Item__list::union_selection_type selection,
- t_dat *dat, int ip_idx)
-{
- unsigned char ctemp;
- int knum = 0, itemnum = 0, len = 0;
-
- Log_function_name_on_enter();
-
- ctemp = (buf[len] >> 6) & 0x03;
- enct1.et() = BITSTRING(2, &ctemp);
- ctemp = ShiftDownBit(buf[len], 5);
- enct1.gp__bit() = BITSTRING(1, &ctemp);
- ctemp = ShiftDownBit(buf[len], 4);
- enct1.ps__bit() = BITSTRING(1, &ctemp);
- enct1.xi1() = buf[len] & 0x0F;
- len += 1;
- len += Get_LIN1_opt(&buf[len], enct1.gen__id(), (*enct1.gp__bit()) == 1);
- len += Get_LIN1(&buf[len], enct1.ref__id());
- if ((buf[len] & 0x80) == 0) /* 1 octet insertion mask */
- {
- for (int i = 0; i < 8; i++)
- {
- if (ShiftDownBit(buf[len], i) == 1)
- knum++;
- }
- len += Get_octetstring(&buf[len], enct1.insbitmask(), 1);
- }
- else /* 2 octets insertion mask */
- {
- for (int i = 0; i < 8; i++)
- if (ShiftDownBit(buf[len], i) == 1)
- knum++;
- for (int i = 0; i < 8; i++)
- if (ShiftDownBit(buf[len + 1], i) == 1)
- knum++;
- len += Get_octetstring(&buf[len], enct1.insbitmask(), 2);
- }
-
- /* Determine whether xi1 already contains the first index */
- if ((*enct1.ps__bit()) == 0)
- {
- knum--;
- }
- len +=
- Get_XI_list(&buf[len], enct1.xi__list(),
- knum, enct1.ps__bit(), &itemnum, enct1.padding());
- len += Get_Item_list(&buf[len], enct1.item__list(), itemnum, selection,
- dat, ip_idx);
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-
-int
-Get_Encoding_Type_2(Enc__Type__2 & enct2, const unsigned char *buf,
- Item__list::union_selection_type selection)
-{
- unsigned char ctemp;
- int len = 0;
-
- Log_function_name_on_enter();
-
- ctemp = (buf[len] >> 6) & 0x03;
- enct2.et() = BITSTRING(2, &ctemp);
- ctemp = ShiftDownBit(buf[len], 5);
- enct2.gp__bit() = BITSTRING(1, &ctemp);
- ctemp = ShiftDownBit(buf[len], 4);
- enct2.res() = BITSTRING(1, &ctemp);
- enct2.count() = buf[len] & 0x0F;
- len += 1;
- len += Get_LIN1_opt(&buf[len], enct2.gen__id(), (*enct2.gp__bit()) == 1);
- len += Get_LIN1(&buf[len], enct2.ref__id());
- if ((buf[len] & 0x80) == 0)
- len += Get_octetstring(&buf[len], enct2.rembitmask(), 1);
- else
- len += Get_octetstring(&buf[len], enct2.rembitmask(), 2);
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-
-int
-Get_Encoding_Type_3(Enc__Type__3 & enct3, const unsigned char *buf,
- Item__list::union_selection_type selection,
- t_dat *dat, int ip_idx)
-{
- unsigned char ctemp;
- int itemnum = 0;
- int knum = 0;
- int len = 0;
-
- Log_function_name_on_enter();
-
- ctemp = (buf[len] >> 6) & 0x03;
- enct3.et() = BITSTRING(2, &ctemp);
- ctemp = ShiftDownBit(buf[len], 5);
- enct3.gp__bit() = BITSTRING(1, &ctemp);
- ctemp = ShiftDownBit(buf[len], 4);
- enct3.ps__bit() = BITSTRING(1, &ctemp);
- enct3.xi1() = buf[len] & 0x0F;
- len += 1;
- len += Get_LIN1_opt(&buf[len], enct3.gen__id(), (*enct3.gp__bit()) == 1);
- len += Get_LIN1(&buf[len], enct3.ref__id());
- if ((buf[len] & 0x80) == 0)
- len += Get_octetstring(&buf[len], enct3.rembitmask(), 1);
- else
- len += Get_octetstring(&buf[len], enct3.rembitmask(), 2);
-
- if ((buf[len] & 0x80) == 0) /* 1 octet insertion mask */
- {
- for (int i = 0; i < 8; i++)
- {
- if (ShiftDownBit(buf[len], i) == 1)
- knum++;
- }
- len += Get_octetstring(&buf[len], enct3.insbitmask(), 1);
- }
- else /* 2 octets insertion mask */
- {
- for (int i = 0; i < 8; i++)
- if (ShiftDownBit(buf[len], i) == 1)
- knum++;
- for (int i = 0; i < 8; i++)
- if (ShiftDownBit(buf[len + 1], i) == 1)
- knum++;
- len += Get_octetstring(&buf[len], enct3.insbitmask(), 2);
- }
-
- /* Determine whether xi1 already contains the first index */
- if ((*enct3.ps__bit()) == 0)
- {
- knum--;
- }
- len += Get_XI_list(&buf[len], enct3.xi__list(),
- knum, enct3.ps__bit(), &itemnum, enct3.padding());
- len += Get_Item_list(&buf[len], enct3.item__list(), itemnum, selection,
- dat, ip_idx);
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_Compr_head_list(Compr__head__list & chl, const unsigned char *buf,
- Item__list::union_selection_type selection,
- t_dat *dat, int ip_idx)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- if ((buf[len] & 0xC0) == 0)
- len += Get_Encoding_Type_0(chl.enctype0(), &buf[len], selection,
- dat, ip_idx);
- else if ((buf[len] & 0xC0) == 0x40)
- len += Get_Encoding_Type_1(chl.enctype1(), &buf[len], selection,
- dat, ip_idx);
- else if ((buf[len] & 0xC0) == 0x80)
- len += Get_Encoding_Type_2(chl.enctype2(), &buf[len], selection);
- else
- len += Get_Encoding_Type_3(chl.enctype3(), &buf[len], selection,
- dat, ip_idx);
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_ipv4_dynamic(const unsigned char *buf, IPv4__Dynamic & chain,
- t_dat *dat, int ip_level)
-{
- int len = 0;
- unsigned char ctemp;
-
- Log_function_name_on_enter();
-
- len += Get_LIN1(&buf[len], chain.tos());
- len += Get_LIN1(&buf[len], chain.ttl());
- len += Get_LIN2_BO_LAST(&buf[len], chain.identification());
- ctemp = ShiftDownBit(buf[len], 7);
- chain.df__bit() = BITSTRING(1, &ctemp);
- ctemp = ShiftDownBit(buf[len], 6);
- chain.rnd__bit() = BITSTRING(1, &ctemp);
- dat->context.ip__ctx()[ip_level].rnd__bit() = BOOLEAN(ctemp);
- ctemp = ShiftDownBit(buf[len], 5);
- chain.nbo__bit() = BITSTRING(1, &ctemp);
- ctemp = buf[len] & 0x1F;
- chain.reserved() = BITSTRING(5, &ctemp);
- len += 1;
- len += Get_Encoding_Type_0(chain.genextheadlist(),
- &buf[len], Item__list::ALT_ip__item__list,
- dat, ip_level);
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_ipv4_static(const unsigned char *buf, IPv4__Static & chain)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- chain.version() = (buf[len] >> 4) & 0x0F;
- chain.reserved() = buf[len] & 0x0F;
- len += 1;
- len += Get_LIN1(&buf[len], chain.proto());
- len += Get_octetstring(&buf[len], chain.srcaddr(), 4);
- len += Get_octetstring(&buf[len], chain.dstaddr(), 4);
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_ipv6_static(const unsigned char *buf, IPv6__Static & chain)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- chain.version() = (buf[len] >> 4) & 0x0F;
- chain.flowlabel() =
- ((buf[len] & 0x0F) << 16) + (buf[len + 1] << 8) + buf[len + 2];
- len += 3;
- len += Get_LIN1(&buf[len], chain.nexthead());
- len += Get_octetstring(&buf[len], chain.srcaddr(), 16);
- len += Get_octetstring(&buf[len], chain.dstaddr(), 16);
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_ipv6_dynamic(const unsigned char *buf, IPv6__Dynamic & chain,
- t_dat *dat, int ip_level)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- len += Get_LIN1(&buf[len], chain.trafficclass());
- len += Get_LIN1(&buf[len], chain.hoplimit());
- len += Get_Encoding_Type_0(chain.genextheadlist(), &buf[len],
- Item__list::ALT_ip__item__list, dat, ip_level);
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_udp_static(const unsigned char *buf, UDP__Static & chain)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- len += Get_LIN2_BO_LAST(&buf[len], chain.srcport());
- len += Get_LIN2_BO_LAST(&buf[len], chain.dstport());
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_udp_dynamic_wo_sn(const unsigned char *buf,
- UDP__Dynamic & chain, t_dat *dat)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- len += Get_LIN2_BO_LAST(&buf[len], chain.cksum());
- if (chain.cksum() == 0)
- {
- /* Checksum value 0 means that no UDP checksum is present in the
- forthcoming compressed packets. */
- dat->context.udp__ctx().udp__cksum() = false;
- }
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_udp_dynamic_w_sn(const unsigned char *buf,
- Profile2__UDP__Dynamic & chain, t_dat *dat)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- len += Get_LIN2_BO_LAST(&buf[len], chain.cksum());
- len += Get_LIN2_BO_LAST(&buf[len], chain.udp__sn());
- if (chain.cksum() == 0)
- {
- /* Checksum value 0 means that no UDP checksum is present in the
- forthcoming compressed packets. */
- dat->context.udp__ctx().udp__cksum() = false;
- }
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_rtp_static(const unsigned char *buf, RTP__Static & chain)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- len += Get_octetstring(&buf[len], chain.ssrc(), 4);
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_rtp_dynamic(const unsigned char *buf, RTP__Dynamic & chain,
- t_dat *dat)
-{
- int len = 0;
- unsigned char ctemp;
-
- Log_function_name_on_enter();
-
- chain.vfield() = (buf[len] >> 6) & 0x03;
- ctemp = ShiftDownBit(buf[len], 5);
- chain.pbit() = BITSTRING(1, &ctemp);
- ctemp = ShiftDownBit(buf[len], 4);
- chain.rxbit() = BITSTRING(1, &ctemp);
- chain.ccfield() = buf[len] & 0x0F;
- len += 1;
- ctemp = ShiftDownBit(buf[len], 7);
- chain.mbit() = BITSTRING(1, &ctemp);
- chain.ptfield() = buf[len] & 0x7F;
- len += 1;
- len += Get_LIN2_BO_LAST(&buf[len], chain.rtpseqnum());
- len += Get_LIN4_BO_LAST(&buf[len], chain.rtpts());
- len += Get_Encoding_Type_0(chain.gencsrclist(),
- &buf[len], Item__list::ALT_csrc__item__list,
- dat, 0);
- if ((*chain.rxbit()) == 1)
- {
- Rx__Field & rxfield = chain.rx__field();
-
- ctemp = (buf[len] >> 5) & 0x07;
- rxfield.reserved() = BITSTRING(3, &ctemp);
- ctemp = ShiftDownBit(buf[len], 4);
- rxfield.xbit() = BITSTRING(1, &ctemp);
- rxfield.mode() = (buf[len] >> 2) & 0x03;
- ctemp = ShiftDownBit(buf[len], 1);
- rxfield.tisbit() = BITSTRING(1, &ctemp);
- ctemp = ShiftDownBit(buf[len], 0);
- rxfield.tssbit() = BITSTRING(1, &ctemp);
- len += 1;
- len += Get_SDVL_field_opt(&buf[len], chain.ts__stride(),
- *rxfield.tssbit() == 1);
- len += Get_SDVL_field_opt(&buf[len], chain.time__stride(),
- *rxfield.tisbit() == 1);
- }
- else
- {
- chain.rx__field() = OMIT_VALUE;
- chain.ts__stride() = OMIT_VALUE;
- chain.time__stride() = OMIT_VALUE;
- }
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-/* Reads the compressed IP-ID field after the base header */
-int
-Get_IP_ID_compressed_opt(unsigned char *buf,
- OPTIONAL < LIN2__BO__LAST > &field,
- t_dat *dat, int ip_level)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- if (dat->context.pkt() != Packet__type::IR && dat->context.pkt() != Packet__type::IR__DYN)
- {
- int ip_idx = getIPidx(dat, ip_level);
- TTCN_logger.log(TTCN_DEBUG, "iplevel = %d, ip_idx = %d", ip_level, ip_idx);
-
- if (ip_idx >= 0)
- {
- if (dat->context.ip__ctx()[ip_idx].rnd__bit())
- len += Get_LIN2_BO_LAST(&buf[len], field());
- else
- field = OMIT_VALUE;
- }
- else
- field = OMIT_VALUE;
- }
- else
- field = OMIT_VALUE;
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-/* Reads the AH data field after the base header */
-int
-Get_AH_data_opt(unsigned char *buf,
- OPTIONAL < OCTETSTRING > &field, t_dat *dat,
- int ip_level)
-{
- int len = 0;
- int ip_idx = getIPidx(dat, ip_level);
-
- Log_function_name_on_enter();
-
- TTCN_logger.log(TTCN_DEBUG, "iplevel = %d, ip_idx = %d", ip_level, ip_idx);
-
- /* AH present */
- if (ip_idx >= 0)
- {
- int ah_len = dat->compressed_ah_data_len[ip_idx];
-
- if (ah_len > 0)
- len += Get_octetstring(&buf[len], field(), ah_len);
- else
- field = OMIT_VALUE;
- }
- else
- field = OMIT_VALUE;
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-/* Reads the GRE checksum field after the base header */
-int
-Get_GRE_cksum_opt(unsigned char *buf,
- OPTIONAL < LIN2__BO__LAST > &field, t_dat *dat,
- int ip_level)
-{
- int len = 0;
- int ip_idx = getIPidx(dat, ip_level);
-
- Log_function_name_on_enter();
-
- TTCN_logger.log(TTCN_DEBUG, "iplevel = %d, ip_idx = %d", ip_level, ip_idx);
-
- /* Compressed packet and GRE present */
- if (ip_idx >= 0)
- {
- if (dat->ipx_gre_cksum_present[ip_idx])
- len += Get_LIN2_BO_LAST(&buf[len], field());
- else
- field = OMIT_VALUE;
- }
- else
- field = OMIT_VALUE;
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-/* Reads the UDP checksum field after the base header */
-int
-Get_UDP_cksum_opt(unsigned char *buf,
- OPTIONAL < LIN2__BO__LAST > &field, t_dat *dat)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- if (dat->context.pkt() != Packet__type::IR && dat->context.pkt() != Packet__type::IR__DYN &&
- dat->context.udp__ctx().udp__cksum())
- {
- len += Get_LIN2_BO_LAST(&buf[len], field());
- }
- else
- field = OMIT_VALUE;
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_AEGSeqnum_opt(OPTIONAL < AEGSeqnum > &seqn, const unsigned char *buf,
- bool hasvalue)
-{
- unsigned char ctemp;
- int len = 0;
-
- Log_function_name_on_enter();
-
- if (hasvalue)
- {
- if ((buf[len] & 0x80) == 0)
- {
- ctemp = ShiftDownBit(buf[len], 7);
- seqn().short__form().ind() = BITSTRING(1, &ctemp);
- seqn().short__form().lsb__of__seqnum() = buf[len] & 0x7F;
- len += 1;
- }
- else
- {
- ctemp = ShiftDownBit(buf[len], 7);
- seqn().long__form().ind() = BITSTRING(1, &ctemp);
- seqn().long__form().lsb__of__seqnum() =
- ((buf[len] & 0x7F) << 24) +
- (buf[len + 1] << 16) + (buf[len + 2] << 8) + buf[len + 3];
- len += 4;
- }
- }
- else
- seqn = OMIT_VALUE;
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_Inner_IP_flags_opt(unsigned char *buf,
- OPTIONAL < Inner__IP__flags > &field,
- t_dat *dat, bool hasvalue)
-{
- int len = 0;
- int ip_idx = getIPidx(dat, Inner_IP);
- unsigned char ctemp;
-
- Log_function_name_on_enter();
-
- TTCN_logger.log(TTCN_DEBUG, "iplevel = %d, ip_idx = %d", Inner_IP, ip_idx);
-
- if (hasvalue)
- {
- ctemp = ShiftDownBit(buf[len], 7);
- field().tos() = BITSTRING(1, &ctemp);
- ctemp = ShiftDownBit(buf[len], 6);
- field().ttl() = BITSTRING(1, &ctemp);
- ctemp = ShiftDownBit(buf[len], 5);
- field().df() = BITSTRING(1, &ctemp);
- ctemp = ShiftDownBit(buf[len], 4);
- field().pr() = BITSTRING(1, &ctemp);
- ctemp = ShiftDownBit(buf[len], 3);
- field().ipx() = BITSTRING(1, &ctemp);
- ctemp = ShiftDownBit(buf[len], 2);
- field().nbo() = BITSTRING(1, &ctemp);
- ctemp = ShiftDownBit(buf[len], 1);
- field().rnd__bit() = BITSTRING(1, &ctemp);
- dat->context.ip__ctx()[ip_idx].rnd__bit() = BOOLEAN(ctemp);
- ctemp = ShiftDownBit(buf[len], 0);
- field().ip2__bit() = BITSTRING(1, &ctemp);
- len += 1;
- }
- else
- field = OMIT_VALUE;
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_Outer_IP_flags_opt(unsigned char *buf,
- OPTIONAL < Outer__IP__flags > &field,
- t_dat *dat, bool hasvalue)
-{
- int len = 0;
- int ip_idx = getIPidx(dat, Outer_IP);
- unsigned char ctemp;
-
- Log_function_name_on_enter();
-
- TTCN_logger.log(TTCN_DEBUG, "iplevel = %d, ip_idx = %d", Outer_IP, ip_idx);
-
- if (hasvalue)
- {
- ctemp = ShiftDownBit(buf[len], 7);
- field().tos2() = BITSTRING(1, &ctemp);
- ctemp = ShiftDownBit(buf[len], 6);
- field().ttl2() = BITSTRING(1, &ctemp);
- ctemp = ShiftDownBit(buf[len], 5);
- field().df2() = BITSTRING(1, &ctemp);
- ctemp = ShiftDownBit(buf[len], 4);
- field().pr2() = BITSTRING(1, &ctemp);
- ctemp = ShiftDownBit(buf[len], 3);
- field().ipx2() = BITSTRING(1, &ctemp);
- ctemp = ShiftDownBit(buf[len], 2);
- field().nbo2() = BITSTRING(1, &ctemp);
- ctemp = ShiftDownBit(buf[len], 1);
- field().rnd2() = BITSTRING(1, &ctemp);
- dat->context.ip__ctx()[ip_idx].rnd__bit() = BOOLEAN(ctemp);
- ctemp = ShiftDownBit(buf[len], 0);
- field().i2__bit() = BITSTRING(1, &ctemp);
- len += 1;
- }
- else
- field = OMIT_VALUE;
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_ipx_headers_opt(unsigned char *buf, OPTIONAL < IP__Ext__heads > &field,
- t_dat *dat, bool hasvalue, int ip_idx)
-{
- int len = 0;
- unsigned char ctemp;
-
- Log_function_name_on_enter();
-
- TTCN_logger.log(TTCN_DEBUG, "present = %d, ip_idx = %d", hasvalue, ip_idx);
-
- if (hasvalue)
- {
- ctemp = ShiftDownBit(buf[len], 7);
- field().cl() = BITSTRING(1, &ctemp);
- ctemp = ShiftDownBit(buf[len], 6);
- field().aseq() = BITSTRING(1, &ctemp);
- ctemp = ShiftDownBit(buf[len], 5);
- field().eseq() = BITSTRING(1, &ctemp);
- ctemp = ShiftDownBit(buf[len], 4);
- field().gseq() = BITSTRING(1, &ctemp);
- ctemp = buf[len] & 0x0F;
- field().res() = BITSTRING(4, &ctemp);
- len += 1;
-
- len +=
- Get_AEGSeqnum_opt(field().ah__seq(), &buf[len], *field().aseq() == 1);
- len +=
- Get_AEGSeqnum_opt(field().esp__seq(), &buf[len], *field().eseq() == 1);
- len +=
- Get_AEGSeqnum_opt(field().gre__seq(), &buf[len], *field().gseq() == 1);
-
- if (*field().cl() == 1)
- {
- len += Get_Compr_head_list(field().compr__head__list(), &buf[len],
- Item__list::ALT_ip__item__list,
- dat, ip_idx);
- }
- else
- field().compr__head__list() = OMIT_VALUE;
- }
- else
- field = OMIT_VALUE;
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_Inner_IP_fields_opt(unsigned char *buf,
- OPTIONAL < Inner__IP__fields > &field,
- OPTIONAL < Inner__IP__flags > &flags,
- t_dat *dat, bool hasvalue)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- if (hasvalue)
- {
- len += Get_LIN1_opt(&buf[len], field().tos(), (*flags().tos()) == 1);
- len += Get_LIN1_opt(&buf[len], field().ttl(), (*flags().ttl()) == 1);
- len += Get_LIN1_opt(&buf[len], field().proto(), (*flags().pr()) == 1);
- len += Get_ipx_headers_opt(&buf[len], field().ext__heads(), dat,
- (*flags().ipx()) == 1, getIPidx(dat, Inner_IP));
- }
- else
- field = OMIT_VALUE;
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_Outer_IP_fields_opt(unsigned char *buf,
- OPTIONAL < Outer__IP__fields > &field,
- OPTIONAL < Outer__IP__flags > &flags,
- t_dat *dat, bool hasvalue)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- if (hasvalue)
- {
- len += Get_LIN1_opt(&buf[len], field().tos(), (*flags().tos2()) == 1);
- len += Get_LIN1_opt(&buf[len], field().ttl(), (*flags().ttl2()) == 1);
- len += Get_LIN1_opt(&buf[len], field().proto(), (*flags().pr2()) == 1);
- len += Get_ipx_headers_opt(&buf[len], field().ext__heads(), dat,
- (*flags().ipx2()) == 1, getIPidx(dat, Outer_IP));
- len += Get_LIN2_BO_LAST_opt(&buf[len], field().ip__id(),
- (*flags().i2__bit()) == 1);
- }
- else
- field = OMIT_VALUE;
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_RTP_flags_fields_opt(unsigned char *buf,
- OPTIONAL < RTP__flags__fields > &field,
- t_dat *dat, bool hasvalue)
-{
- int len = 0;
- unsigned char ctemp;
-
- Log_function_name_on_enter();
-
- if (hasvalue)
- {
- field().mode() = (buf[len] >> 6) & 0x03;
- ctemp = ShiftDownBit(buf[len], 5);
- field().r__pt() = BITSTRING(1, &ctemp);
- ctemp = ShiftDownBit(buf[len], 4);
- field().m__bit() = BITSTRING(1, &ctemp);
- ctemp = ShiftDownBit(buf[len], 3);
- field().r__x() = BITSTRING(1, &ctemp);
- ctemp = ShiftDownBit(buf[len], 2);
- field().csrc() = BITSTRING(1, &ctemp);
- ctemp = ShiftDownBit(buf[len], 1);
- field().tss() = BITSTRING(1, &ctemp);
- ctemp = ShiftDownBit(buf[len], 0);
- field().tis() = BITSTRING(1, &ctemp);
- len += 1;
-
- if (*field().r__pt() == 1)
- {
- ctemp = ShiftDownBit(buf[len], 7);
- field().flags()().r__p() = BITSTRING(1, &ctemp);
- field().flags()().rtp__pt() = buf[len] & 0x7F;
- len += 1;
- }
- else
- field().flags() = OMIT_VALUE;
-
- if (*field().csrc() == 1)
- {
- len += Get_Compr_head_list(field().csrc__list(),
- &buf[len], Item__list::ALT_csrc__item__list,
- dat, 0);
- }
- else
- field().csrc__list() = OMIT_VALUE;
-
- len += Get_SDVL_field_opt(&buf[len], field().ts__stride(),
- *field().tss() == 1);
- len += Get_SDVL_field_opt(&buf[len], field().time__stride(),
- *field().tis() == 1);
- }
- else
- field = OMIT_VALUE;
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_Profile0_ROHC_Header(unsigned char *buf, t_dat *dat, int length,
- Profile0__headers & p_header, int cid)
-{
- unsigned char ctemp;
- int len = 0;
-
- Log_function_name_on_enter();
-
- if (isIR(buf[len]))
- {
- Profile0__IR__packet & bhead = p_header.ir();
-
- bhead.cid() = cid;
- ctemp = (buf[len] >> 1) & 0x7F;
- bhead.type__ind() = BITSTRING(7, &ctemp);
- ctemp = ShiftDownBit(buf[len], 0);
- bhead.d() = BITSTRING(1, &ctemp);
- len += 1;
- len += Get_LIN1(&buf[len], bhead.profile());
- dat->context.profile() = bhead.profile();
- len += Get_LIN1(&buf[len], bhead.crc());
- Get_octetstring(&buf[len], bhead.orig__packet(), length - len);
- len = length;
- }
- else
- {
- Profile0__normal__packet & bhead = p_header.normal();
- bhead.cid() = cid;
- Get_octetstring(&buf[len], bhead.orig__packet(), length - len);
- len = length;
- }
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_Profile1_Dynamic_Chain(Dynamic__Chain & dynch,
- const unsigned char *buf, t_dat *dat)
-{
- int len = 0, num;
-
- Log_function_name_on_enter();
-
- for (num = 0; num < dat->context.ip__ctx().size_of(); num++)
- {
- if (dat->context.ip__ctx()[num].version() == 4)
- {
- len += Get_ipv4_dynamic(&buf[len], dynch[num].ipv4__dyn(), dat, num);
- }
- else if (dat->context.ip__ctx()[num].version() == 6)
- {
- len += Get_ipv6_dynamic(&buf[len], dynch[num].ipv6__dyn(), dat, num);
- }
- else
- {
- int ipver = dat->context.ip__ctx()[num].version();
- TTCN_error("Invalid IP version %u on level %d", ipver, num);
- }
- }
-
- num = dynch.size_of();
- len += Get_udp_dynamic_wo_sn(&buf[len], dynch[num].udp__dyn(), dat);
-
- num = dynch.size_of();
- len += Get_rtp_dynamic(&buf[len], dynch[num].rtp__dyn(), dat);
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_Profile1_Static_Chain(unsigned char *buf, Static__Chain & chain,
- t_dat *dat)
-{
- int len = 0, num = 0, nextheader = 0;
-
- Log_function_name_on_enter();
-
- while (nextheader != c__ip__proto__udp)
- {
- if (((buf[len] >> 4) & 0x0F) == 4)
- {
- initIPcontext(dat, num, 4);
- len += Get_ipv4_static(&buf[len], chain[num].ipv4__stat());
- nextheader = chain[num].ipv4__stat().proto();
- }
- else if (((buf[len] >> 4) & 0x0F) == 6)
- {
- initIPcontext(dat, num, 6);
- len += Get_ipv6_static(&buf[len], chain[num].ipv6__stat());
- nextheader = chain[num].ipv6__stat().nexthead();
- }
- else
- {
- TTCN_error("Invalid IP version %u on level %u (nextheader = %d)",
- buf[len], num, nextheader);
- }
- num += 1;
- }
-
- len += Get_udp_static(&buf[len], chain[num].udp__stat());
- num += 1;
-
- len += Get_rtp_static(&buf[len], chain[num].rtp__stat());
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_Profile1_extension0(unsigned char *buf, Extension0 & ext,
- t_dat *dat)
-{
- int len = 0;
- unsigned char ctemp;
-
- Log_function_name_on_enter();
-
- ctemp = (buf[len] >> 6) & 0x03;
- ext.ext__type() = BITSTRING(2, &ctemp);
- ext.sn() = (buf[len] >> 3) & 0x07;
- ext.plust() = buf[len] & 0x07;
- len += 1;
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_Profile1_extension1(unsigned char *buf, Extension1 & ext,
- t_dat *dat)
-{
- int len = 0;
- unsigned char ctemp;
-
- Log_function_name_on_enter();
-
- ctemp = (buf[len] >> 6) & 0x03;
- ext.ext__type() = BITSTRING(2, &ctemp);
- ext.sn() = (buf[len] >> 3) & 0x07;
- ext.plust() = buf[len] & 0x07;
- len += 1;
- ext.minust() = buf[len];
- len += 1;
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_Profile1_extension2(unsigned char *buf, Extension2 & ext,
- t_dat *dat)
-{
- int len = 0;
- unsigned char ctemp;
-
- Log_function_name_on_enter();
-
- ctemp = (buf[len] >> 6) & 0x03;
- ext.ext__type() = BITSTRING(2, &ctemp);
- ext.sn() = (buf[len] >> 3) & 0x07;
- ext.plust() = ((buf[len] & 0x07) << 8) + (buf[len + 1] & 0xFF);
- len += 2;
- ext.minust() = buf[len];
- len += 1;
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_Profile1_extension3(unsigned char *buf, Extension3 & ext,
- t_dat *dat)
-{
- int len = 0;
- int ts_length = 0;
- unsigned char ctemp;
-
- Log_function_name_on_enter();
-
- ctemp = (buf[len] >> 6) & 0x03;
- ext.ext__type() = BITSTRING(2, &ctemp);
- ctemp = ShiftDownBit(buf[len], 5);
- ext.s__bit() = BITSTRING(1, &ctemp);
- ctemp = ShiftDownBit(buf[len], 4);
- ext.r__ts__bit() = BITSTRING(1, &ctemp);
- ctemp = ShiftDownBit(buf[len], 3);
- ext.tsc__bit() = BITSTRING(1, &ctemp);
- ctemp = ShiftDownBit(buf[len], 2);
- ext.i__bit() = BITSTRING(1, &ctemp);
- ctemp = ShiftDownBit(buf[len], 1);
- ext.ip__bit() = BITSTRING(1, &ctemp);
- ctemp = ShiftDownBit(buf[len], 0);
- ext.rtp__bit() = BITSTRING(1, &ctemp);
- len += 1;
-
- len += Get_Inner_IP_flags_opt(&buf[len], ext.inner__ip__flags(),
- dat, *ext.ip__bit() == 1);
-
- len += Get_Outer_IP_flags_opt(&buf[len], ext.outer__ip__flags(), dat,
- (ext.inner__ip__flags().ispresent() &&
- (*ext.inner__ip__flags()().ip2__bit()) == 1));
-
- len += Get_LIN1_opt(&buf[len], ext.sn(), *ext.s__bit() == 1);
- ts_length = Get_SDVL_field_opt(&buf[len], ext.ts(), *ext.r__ts__bit() == 1);
- if (ts_length > 0)
- {
- ext.ts__length()() = ts_length;
- }
- else
- {
- ext.ts__length() = OMIT_VALUE;
- }
- len += ts_length;
- len += Get_Inner_IP_fields_opt(&buf[len], ext.inner__ip__hdr(),
- ext.inner__ip__flags(), dat,
- *ext.ip__bit() == 1);
-
- len += Get_LIN2_BO_LAST_opt(&buf[len], ext.ip__id(), *ext.i__bit() == 1);
- len += Get_Outer_IP_fields_opt(&buf[len], ext.outer__ip__hdr(),
- ext.outer__ip__flags(), dat,
- (ext.inner__ip__flags().ispresent() &&
- (*ext.inner__ip__flags()().ip2__bit()) == 1));
-
- len += Get_RTP_flags_fields_opt(&buf[len], ext.rtp__fl__fi(), dat,
- *ext.rtp__bit() == 1);
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_Profile1_extensions_opt(unsigned char *buf,
- OPTIONAL < Profile1__Extension > &ext,
- t_dat *dat, bool hasvalue)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- if (hasvalue)
- {
- if ((buf[len] & 0xC0) == 0)
- {
- len += Get_Profile1_extension0(&buf[len], ext().ext0(), dat);
- }
- else if ((buf[len] & 0xC0) == 0x40)
- {
- len += Get_Profile1_extension1(&buf[len], ext().ext1(), dat);
- }
- else if ((buf[len] & 0xC0) == 0x80)
- {
- len += Get_Profile1_extension2(&buf[len], ext().ext2(), dat);
- }
- else /* if ((buf[len] & 0xC0) == 0xC0) */
- {
- len += Get_Profile1_extension3(&buf[len], ext().ext3(), dat);
- }
- }
- else
- {
- ext = OMIT_VALUE;
- }
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_Profile1_ROHC_Header_ir(unsigned char *buf, Profile1__IR__header & bhead,
- t_dat *dat, int cid)
-{
- int len = 0;
- unsigned char ctemp;
-
- Log_function_name_on_enter();
-
- dat->context.pkt() = Packet__type(Packet__type::IR);
- bhead.cid() = cid;
- ctemp = (buf[len] >> 1) & 0x7F;
- bhead.type__ind() = BITSTRING(7, &ctemp);
- ctemp = ShiftDownBit(buf[len], 0);
- bhead.d() = BITSTRING(1, &ctemp);
- len += 1;
-
- len += Get_LIN1(&buf[len], bhead.profile());
- dat->context.profile() = bhead.profile();
- len += Get_LIN1(&buf[len], bhead.crc());
-
- len += Get_Profile1_Static_Chain(&buf[len], bhead.stat__chain(), dat);
-
- if (*bhead.d() == 1)
- len += Get_Profile1_Dynamic_Chain(bhead.dyn__chain(), &buf[len], dat);
- else
- bhead.dyn__chain() = OMIT_VALUE;
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_Profile1_ROHC_Header_irdyn(unsigned char *buf,
- Profile1__IR__DYN__header & bhead,
- t_dat *dat, int cid)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- dat->context.pkt() = Packet__type(Packet__type::IR__DYN);
- bhead.cid() = cid;
- bhead.type__ind() = BITSTRING(8, &buf[len]);
- len += 1;
- len += Get_LIN1(&buf[len], bhead.profile());
- dat->context.profile() = bhead.profile();
- len += Get_LIN1(&buf[len], bhead.crc());
-
- len += Get_Profile1_Dynamic_Chain(bhead.dyn__chain(), &buf[len], dat);
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_Profile1_ROHC_Header_r0(unsigned char *buf,
- Profile1__R__0__header & bhead,
- t_dat *dat, int cid)
-{
- int len = 0;
- unsigned char ctemp;
-
- Log_function_name_on_enter();
-
- dat->context.pkt() = Packet__type(Packet__type::R__0);
-
- bhead.cid() = cid;
- ctemp = (buf[len] >> 6) & 0x03;
- bhead.type__ind() = BITSTRING(2, &ctemp);
- bhead.sn() = buf[len] & 0x3F;
- len += 1;
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_Profile1_ROHC_Header_r0crc(unsigned char *buf,
- Profile1__R__0__CRC__header & bhead,
- t_dat *dat, int cid)
-{
- int len = 0;
- unsigned char ctemp;
-
- Log_function_name_on_enter();
-
- dat->context.pkt() = Packet__type(Packet__type::R__0__CRC);
-
- bhead.cid() = cid;
- ctemp = (buf[len] >> 6) & 0x03;
- bhead.type__ind() = BITSTRING(2, &ctemp);
- ctemp = (buf[len] << 1) & 0x7E;
- len += 1;
- ctemp += ShiftDownBit(buf[len], 7);
- bhead.sn() = ctemp;
- bhead.crc() = buf[len] & 0x7F;
- len += 1;
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_Profile1_ROHC_Header_uo0(unsigned char *buf,
- Profile1__UO__0__header & bhead,
- t_dat *dat, int cid)
-{
- int len = 0;
- unsigned char ctemp;
-
- Log_function_name_on_enter();
-
- dat->context.pkt() = Packet__type(Packet__type::UO__0);
- bhead.cid() = cid;
- ctemp = ShiftDownBit(buf[len], 7);
- bhead.type__ind() = BITSTRING(1, &ctemp);
- bhead.sn() = (buf[len] >> 3) & 0x0F;
- bhead.crc() = buf[len] & 0x07;
- len += 1;
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_Profile1_ROHC_Header_r1(unsigned char *buf,
- Profile1__R__1__header & bhead,
- t_dat *dat, int cid,
- OPTIONAL < Profile1__Extension > &ext)
-{
- int len = 0;
- unsigned char ctemp;
-
- Log_function_name_on_enter();
-
- dat->context.pkt() = Packet__type(Packet__type::R__1);
- bhead.cid() = cid;
- ctemp = (buf[len] >> 6) & 0x03;
- bhead.type__ind() = BITSTRING(2, &ctemp);
- bhead.sn() = buf[len] & 0x3F;
- len += 1;
- ctemp = ShiftDownBit(buf[len], 7);
- bhead.m__bit() = BITSTRING(1, &ctemp);
- ctemp = ShiftDownBit(buf[len], 6);
- bhead.x__bit() = BITSTRING(1, &ctemp);
- bhead.ts() = buf[len] & 0x3F;
- len += 1;
-
- if (*bhead.x__bit())
- {
- len += Get_Profile1_extensions_opt(&buf[len], ext, dat,
- *bhead.x__bit());
- }
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_Profile1_ROHC_Header_r1_id(unsigned char *buf,
- Profile1__R__1__ID__header & bhead,
- t_dat *dat, int cid,
- OPTIONAL < Profile1__Extension > &ext)
-{
- int len = 0;
- unsigned char ctemp;
-
- Log_function_name_on_enter();
-
- dat->context.pkt() = Packet__type(Packet__type::R__1__ID);
- bhead.cid() = cid;
- ctemp = (buf[len] >> 6) & 0x03;
- bhead.type__ind() = BITSTRING(2, &ctemp);
- bhead.sn() = buf[len] & 0x3F;
- len += 1;
- ctemp = ShiftDownBit(buf[len], 7);
- bhead.m__bit() = BITSTRING(1, &ctemp);
- ctemp = ShiftDownBit(buf[len], 6);
- bhead.x__bit() = BITSTRING(1, &ctemp);
- ctemp = ShiftDownBit(buf[len], 5);
- bhead.t__bit() = BITSTRING(1, &ctemp);
- bhead.ip__id() = buf[len] & 0x1F;
- len += 1;
-
- if (*bhead.x__bit())
- {
- len += Get_Profile1_extensions_opt(&buf[len], ext, dat,
- *bhead.x__bit());
- }
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_Profile1_ROHC_Header_r1_ts(unsigned char *buf,
- Profile1__R__1__TS__header & bhead,
- t_dat *dat, int cid,
- OPTIONAL < Profile1__Extension > &ext)
-{
- int len = 0;
- unsigned char ctemp;
-
- Log_function_name_on_enter();
-
- dat->context.pkt() = Packet__type(Packet__type::R__1__TS);
- bhead.cid() = cid;
- ctemp = (buf[len] >> 6) & 0x03;
- bhead.type__ind() = BITSTRING(2, &ctemp);
- bhead.sn() = buf[len] & 0x3F;
- len += 1;
- ctemp = ShiftDownBit(buf[len], 7);
- bhead.m__bit() = BITSTRING(1, &ctemp);
- ctemp = ShiftDownBit(buf[len], 6);
- bhead.x__bit() = BITSTRING(1, &ctemp);
- ctemp = ShiftDownBit(buf[len], 5);
- bhead.t__bit() = BITSTRING(1, &ctemp);
- bhead.ts() = buf[len] & 0x1F;
- len += 1;
-
- if (*bhead.x__bit())
- {
- len += Get_Profile1_extensions_opt(&buf[len], ext, dat,
- *bhead.x__bit());
- }
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_Profile1_ROHC_Header_uo1(unsigned char *buf,
- Profile1__UO__1__header & bhead,
- t_dat *dat, int cid)
-{
- int len = 0;
- unsigned char ctemp;
-
- Log_function_name_on_enter();
-
- dat->context.pkt() = Packet__type(Packet__type::UO__1);
- bhead.cid() = cid;
- ctemp = (buf[len] >> 6) & 0x03;
- bhead.type__ind() = BITSTRING(2, &ctemp);
- bhead.ts() = buf[len] & 0x3F;
- len += 1;
- ctemp = ShiftDownBit(buf[len], 7);
- bhead.m__bit() = BITSTRING(1, &ctemp);
- bhead.sn() = (buf[len] >> 3) & 0x0F;
- bhead.crc() = buf[len] & 0x07;
- len += 1;
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_Profile1_ROHC_Header_uo1_id(unsigned char *buf,
- Profile1__UO__1__ID__header & bhead,
- t_dat *dat, int cid,
- OPTIONAL < Profile1__Extension > &ext)
-{
- int len = 0;
- unsigned char ctemp;
-
- Log_function_name_on_enter();
-
- dat->context.pkt() = Packet__type(Packet__type::UO__1__ID);
- bhead.cid() = cid;
- ctemp = (buf[len] >> 6) & 0x03;
- bhead.type__ind() = BITSTRING(2, &ctemp);
- ctemp = ShiftDownBit(buf[len], 5);
- bhead.t__bit() = BITSTRING(1, &ctemp);
- bhead.ip__id() = buf[len] & 0x1F;
- len += 1;
- ctemp = ShiftDownBit(buf[len], 7);
- bhead.x__bit() = BITSTRING(1, &ctemp);
- bhead.sn() = (buf[len] >> 3) & 0x0F;
- bhead.crc() = buf[len] & 0x07;
- len += 1;
-
- if (*bhead.x__bit())
- {
- len += Get_Profile1_extensions_opt(&buf[len], ext,
- dat, *bhead.x__bit());
- }
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_Profile1_ROHC_Header_uo1_ts(unsigned char *buf,
- Profile1__UO__1__TS__header & bhead,
- t_dat *dat, int cid)
-{
- int len = 0;
- unsigned char ctemp;
-
- Log_function_name_on_enter();
-
- dat->context.pkt() = Packet__type(Packet__type::UO__1__TS);
- bhead.cid() = cid;
- ctemp = (buf[len] >> 6) & 0x03;
- bhead.type__ind() = BITSTRING(2, &ctemp);
- ctemp = ShiftDownBit(buf[len], 5);
- bhead.t__bit() = BITSTRING(1, &ctemp);
- bhead.ts() = buf[len] & 0x1F;
- len += 1;
- ctemp = ShiftDownBit(buf[len], 7);
- bhead.m__bit() = BITSTRING(1, &ctemp);
- bhead.sn() = (buf[len] >> 3) & 0x0F;
- bhead.crc() = buf[len] & 0x07;
- len += 1;
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_Profile1_ROHC_Header_uor2(unsigned char *buf,
- Profile1__UOR__2__header & bhead,
- t_dat *dat, int cid,
- OPTIONAL < Profile1__Extension > &ext)
-{
- int len = 0;
- unsigned char ctemp;
-
- Log_function_name_on_enter();
-
- dat->context.pkt() = Packet__type(Packet__type::UOR__2);
- bhead.cid() = cid;
- ctemp = (buf[len] >> 5) & 0x07;
- bhead.type__ind() = BITSTRING(3, &ctemp);
- ctemp = (buf[len] & 0x1F) << 1;
- len += 1;
- ctemp += ShiftDownBit(buf[len], 7);
- bhead.ts() = ctemp;
- ctemp = ShiftDownBit(buf[len], 6);
- bhead.m__bit() = BITSTRING(1, &ctemp);
- bhead.sn() = buf[len] & 0x3F;
- len += 1;
- ctemp = ShiftDownBit(buf[len], 7);
- bhead.x__bit() = BITSTRING(1, &ctemp);
- bhead.crc() = buf[len] & 0x7F;
- len += 1;
-
- if (*bhead.x__bit())
- {
- len += Get_Profile1_extensions_opt(&buf[len], ext,
- dat, *bhead.x__bit());
- }
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_Profile1_ROHC_Header_uor2_id(unsigned char *buf,
- Profile1__UOR__2__ID__header & bhead,
- t_dat *dat, int cid,
- OPTIONAL < Profile1__Extension > & ext)
-{
- int len = 0;
- unsigned char ctemp;
-
- Log_function_name_on_enter();
-
- dat->context.pkt() = Packet__type(Packet__type::UOR__2__ID);
- bhead.cid() = cid;
- ctemp = (buf[len] >> 5) & 0x07;
- bhead.type__ind() = BITSTRING(3, &ctemp);
- bhead.ip__id() = buf[len] & 0x1F;
- len += 1;
- ctemp = ShiftDownBit(buf[len], 7);
- bhead.t__bit() = BITSTRING(1, &ctemp);
- ctemp = ShiftDownBit(buf[len], 6);
- bhead.m__bit() = BITSTRING(1, &ctemp);
- bhead.sn() = buf[len] & 0x3F;
- len += 1;
- ctemp = ShiftDownBit(buf[len], 7);
- bhead.x__bit() = BITSTRING(1, &ctemp);
- bhead.crc() = buf[len] & 0x7F;
- len += 1;
-
- if (*bhead.x__bit())
- {
- len += Get_Profile1_extensions_opt(&buf[len], ext,
- dat, *bhead.x__bit());
- }
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_Profile1_ROHC_Header_uor2_ts(unsigned char *buf,
- Profile1__UOR__2__TS__header & bhead,
- t_dat *dat, int cid,
- OPTIONAL < Profile1__Extension > & ext)
-{
- int len = 0;
- unsigned char ctemp;
-
- Log_function_name_on_enter();
-
- dat->context.pkt() = Packet__type(Packet__type::UOR__2__TS);
- bhead.cid() = cid;
- ctemp = (buf[len] >> 5) & 0x07;
- bhead.type__ind() = BITSTRING(3, &ctemp);
- bhead.ts() = buf[len] & 0x1F;
- len += 1;
- ctemp = ShiftDownBit(buf[len], 7);
- bhead.t__bit() = BITSTRING(1, &ctemp);
- ctemp = ShiftDownBit(buf[len], 6);
- bhead.m__bit() = BITSTRING(1, &ctemp);
- bhead.sn() = buf[len] & 0x3F;
- len += 1;
- ctemp = ShiftDownBit(buf[len], 7);
- bhead.x__bit() = BITSTRING(1, &ctemp);
- bhead.crc() = buf[len] & 0x7F;
- len += 1;
-
- if (*bhead.x__bit())
- {
- len += Get_Profile1_extensions_opt(&buf[len], ext,
- dat, *bhead.x__bit());
- }
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_Profile1_ROHC_Header(unsigned char *buf, t_dat *dat, int length,
- Profile1__headers & hdr, int cid)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- if (isIR(buf[len]))
- {
- len += Get_Profile1_ROHC_Header_ir(&buf[len],
- hdr.base__header().ir(), dat, cid);
- }
- else if (isIRDYN(buf[len]))
- {
- len += Get_Profile1_ROHC_Header_irdyn(&buf[len],
- hdr.base__header().ir__dyn(),
- dat, cid);
- }
- else if (isUOR2(buf[len]))
- {
- if (isAnyIPv4RNDunset(dat))
- {
- if (buf[len + 1] & 0x80) // T = 1
- {
- len += Get_Profile1_ROHC_Header_uor2_ts(&buf[len],
- hdr.base__header().
- uor__2__ts(), dat, cid,
- hdr.ext());
- }
- else // T = 0
- {
- len += Get_Profile1_ROHC_Header_uor2_id(&buf[len],
- hdr.base__header().
- uor__2__id(), dat, cid,
- hdr.ext());
- }
- }
- else // at least one RND is unset
- {
- len += Get_Profile1_ROHC_Header_uor2(&buf[len],
- hdr.base__header().uor__2(),
- dat, cid, hdr.ext());
- }
- }
- else if (dat->context.mode() == ROHC_mode_R)
- {
- if ((buf[len] & 0xC0) == 0)
- {
- len += Get_Profile1_ROHC_Header_r0(&buf[len],
- hdr.base__header().r__0(),
- dat, cid);
- }
- else if ((buf[len] & 0xC0) == 0x40)
- {
- len += Get_Profile1_ROHC_Header_r0crc(&buf[len],
- hdr.base__header().r__0__crc(),
- dat, cid);
- }
- else if ((buf[len] & 0xC0) == 0x80) // PT-1
- {
- if (isAnyIPv4RNDunset(dat))
- {
- if (buf[len + 1] & 0x20) // T = 1
- {
- len += Get_Profile1_ROHC_Header_r1_ts(&buf[len],
- hdr.base__header().r__1__ts(),
- dat, cid, hdr.ext());
- }
- else // T = 0
- {
- len += Get_Profile1_ROHC_Header_r1_id(&buf[len],
- hdr.base__header().r__1__id(),
- dat, cid, hdr.ext());
- }
- }
- else // at least one RND is unset
- {
- len += Get_Profile1_ROHC_Header_r1(&buf[len],
- hdr.base__header().r__1(),
- dat, cid, hdr.ext());
- }
- }
- }
- else if (dat->context.mode() != ROHC_mode_R) // U-O modes
- {
- if ((buf[len] & 0x80) == 0)
- {
- len += Get_Profile1_ROHC_Header_uo0(&buf[len],
- hdr.base__header().uo__0(),
- dat, cid);
- }
- else if ((buf[len] & 0xC0) == 0x80) // PT-1
- {
- if (isAnyIPv4RNDunset(dat))
- {
- if (buf[len] & 0x20) // T = 1
- {
- len += Get_Profile1_ROHC_Header_uo1_ts(&buf[len],
- hdr.base__header().uo__1__ts(),
- dat, cid);
- }
- else // T = 0
- {
- len += Get_Profile1_ROHC_Header_uo1_id(&buf[len],
- hdr.base__header().uo__1__id(),
- dat, cid, hdr.ext());
- }
- }
- else // at least one RND is unset
- {
- len += Get_Profile1_ROHC_Header_uo1(&buf[len],
- hdr.base__header().uo__1(),
- dat, cid);
- }
- }
- }
-
- if (!hdr.ext().is_bound())
- hdr.ext() = OMIT_VALUE;
- len += Get_IP_ID_compressed_opt(&buf[len], hdr.ip__id__outer(),
- dat, Outer_IP);
- len += Get_AH_data_opt(&buf[len], hdr.ah__outer(), dat, Outer_IP);
- len += Get_GRE_cksum_opt(&buf[len], hdr.gre__cksum1(), dat, Outer_IP);
- len += Get_IP_ID_compressed_opt(&buf[len], hdr.ip__id__inner(),
- dat, Inner_IP);
- len += Get_AH_data_opt(&buf[len], hdr.ah__inner(), dat, Inner_IP);
- len += Get_GRE_cksum_opt(&buf[len], hdr.gre__cksum2(), dat, Inner_IP);
- len += Get_UDP_cksum_opt(&buf[len], hdr.udp__cksum(), dat);
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-} /* Get_Profile1_ROHC_Header */
-
-int
-Get_Profile2_Dynamic_Chain(Profile2__Dynamic__Chain & dynch,
- const unsigned char *buf, t_dat *dat)
-{
- int len = 0, num;
-
- Log_function_name_on_enter();
-
- for (num = 0; num < dat->context.ip__ctx().size_of(); num++)
- {
- if (dat->context.ip__ctx()[num].version() == 4)
- {
- len += Get_ipv4_dynamic(&buf[len], dynch[num].ipv4__dyn(), dat, num);
- }
- else if (dat->context.ip__ctx()[num].version() == 6)
- {
- len += Get_ipv6_dynamic(&buf[len], dynch[num].ipv6__dyn(), dat, num);
- }
- else
- {
- int ipver = dat->context.ip__ctx()[num].version();
- TTCN_error("Invalid IP version %u on level %d", ipver, num);
- }
- }
-
- num = dynch.size_of();
- len += Get_udp_dynamic_w_sn(&buf[len], dynch[num].udp__dyn(), dat);
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_Profile2_extension0(unsigned char *buf, Profile2__Extension0 & ext,
- t_dat *dat)
-{
- int len = 0;
- unsigned char ctemp;
-
- Log_function_name_on_enter();
-
- ctemp = (buf[len] >> 6) & 0x03;
- ext.ext__type() = BITSTRING(2, &ctemp);
- ext.sn() = (buf[len] >> 3) & 0x07;
- ext.ip__id() = buf[len] & 0x07;
- len += 1;
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_Profile2_extension1(unsigned char *buf, Profile2__Extension1 & ext,
- t_dat *dat)
-{
- int len = 0;
- unsigned char ctemp;
-
- Log_function_name_on_enter();
-
- ctemp = (buf[len] >> 6) & 0x03;
- ext.ext__type() = BITSTRING(2, &ctemp);
- ext.sn() = (buf[len] >> 3) & 0x07;
- ext.ip__id() = ((buf[len] & 0x07) << 8) + (buf[len + 1] & 0xFF);
- len += 2;
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_Profile2_extension2(unsigned char *buf, Profile2__Extension2 & ext,
- t_dat *dat)
-{
- int len = 0;
- unsigned char ctemp;
-
- Log_function_name_on_enter();
-
- ctemp = (buf[len] >> 6) & 0x03;
- ext.ext__type() = BITSTRING(2, &ctemp);
- ext.sn() = (buf[len] >> 3) & 0x07;
- ext.ip__id2() = ((buf[len] & 0x07) << 8) + (buf[len + 1] & 0xFF);
- len += 2;
- ext.ip__id() = buf[len];
- len += 1;
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_Profile2_Inner_IP_flags_opt(unsigned char *buf,
- OPTIONAL < Profile2__Inner__IP__flags > &field,
- t_dat *dat, bool hasvalue)
-{
- int len = 0;
- unsigned char ctemp;
-
- Log_function_name_on_enter();
-
- if (hasvalue)
- {
- ctemp = ShiftDownBit(buf[len], 7);
- field().tos() = BITSTRING(1, &ctemp);
- ctemp = ShiftDownBit(buf[len], 6);
- field().ttl() = BITSTRING(1, &ctemp);
- ctemp = ShiftDownBit(buf[len], 5);
- field().df() = BITSTRING(1, &ctemp);
- ctemp = ShiftDownBit(buf[len], 4);
- field().pr() = BITSTRING(1, &ctemp);
- ctemp = ShiftDownBit(buf[len], 3);
- field().ipx() = BITSTRING(1, &ctemp);
- ctemp = ShiftDownBit(buf[len], 2);
- field().nbo() = BITSTRING(1, &ctemp);
- ctemp = ShiftDownBit(buf[len], 1);
- field().rnd__bit() = BITSTRING(1, &ctemp);
- dat->context.ip__ctx()[getIPidx(dat, Inner_IP)].rnd__bit() = BOOLEAN(ctemp);
- ctemp = ShiftDownBit(buf[len], 0);
- field().reserved() = BITSTRING(1, &ctemp);
- len += 1;
- }
- else
- field = OMIT_VALUE;
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_Profile2_Inner_IP_fields_opt(unsigned char *buf,
- OPTIONAL < Inner__IP__fields > &field,
- OPTIONAL < Profile2__Inner__IP__flags >
- &flags, t_dat *dat,
- bool hasvalue)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- if (hasvalue)
- {
- len += Get_LIN1_opt(&buf[len], field().tos(), (*flags().tos()) == 1);
- len += Get_LIN1_opt(&buf[len], field().ttl(), (*flags().ttl()) == 1);
- len += Get_LIN1_opt(&buf[len], field().proto(), (*flags().pr()) == 1);
- len += Get_ipx_headers_opt(&buf[len], field().ext__heads(), dat,
- (*flags().ipx()) == 1, getIPidx(dat, Inner_IP));
- }
- else
- field = OMIT_VALUE;
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_Profile2_extension3(unsigned char *buf, Profile2__Extension3 & ext,
- t_dat *dat)
-{
- int len = 0;
- unsigned char ctemp;
-
- Profile2__Inner__IP__flags inipflags;
-
- Log_function_name_on_enter();
-
- ctemp = (buf[len] >> 6) & 0x03;
- ext.ext__type() = BITSTRING(2, &ctemp);
- ctemp = ShiftDownBit(buf[len], 5);
- ext.s__bit() = BITSTRING(1, &ctemp);
- ext.mode() = (buf[len] >> 3) & 0x03;
- ctemp = ShiftDownBit(buf[len], 2);
- ext.i__bit() = BITSTRING(1, &ctemp);
- ctemp = ShiftDownBit(buf[len], 1);
- ext.ip__bit() = BITSTRING(1, &ctemp);
- ctemp = ShiftDownBit(buf[len], 0);
- ext.ip2__bit() = BITSTRING(1, &ctemp);
- len += 1;
-
- len +=
- Get_Profile2_Inner_IP_flags_opt(&buf[len], ext.inner__ip__flags(),
- dat, *ext.ip__bit() == 1);
-
- len += Get_Outer_IP_flags_opt(&buf[len], ext.outer__ip__flags(), dat,
- *ext.ip2__bit() == 1);
-
- len += Get_LIN1_opt(&buf[len], ext.sn(), *ext.s__bit() == 1);
-
- len += Get_Profile2_Inner_IP_fields_opt(&buf[len], ext.inner__ip__hdr(),
- ext.inner__ip__flags(), dat,
- *ext.ip__bit() == 1);
-
- len += Get_LIN2_BO_LAST_opt(&buf[len], ext.ip__id(), *ext.i__bit() == 1);
-
- len += Get_Outer_IP_fields_opt(&buf[len], ext.outer__ip__hdr(),
- ext.outer__ip__flags(), dat,
- *ext.ip2__bit() == 1);
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_Profile2_extensions_opt(unsigned char *buf,
- OPTIONAL < Profile2__Extension > &ext,
- t_dat *dat, bool hasvalue)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- if (hasvalue)
- {
- if ((buf[len] & 0xC0) == 0)
- {
- len += Get_Profile2_extension0(&buf[len], ext().ext0(), dat);
- }
- else if ((buf[len] & 0xC0) == 0x40)
- {
- len += Get_Profile2_extension1(&buf[len], ext().ext1(), dat);
- }
- else if ((buf[len] & 0xC0) == 0x80)
- {
- len += Get_Profile2_extension2(&buf[len], ext().ext2(), dat);
- }
- else /* if ((buf[len] & 0xC0) == 0xC0) */
- {
- len += Get_Profile2_extension3(&buf[len], ext().ext3(), dat);
- }
- }
- else
- {
- ext = OMIT_VALUE;
- }
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_Profile2_Static_Chain(unsigned char *buf, Profile2__Static__Chain & chain,
- t_dat *dat)
-{
- int len = 0, num = 0, nextheader = 0;
-
- Log_function_name_on_enter();
-
- while (nextheader != c__ip__proto__udp)
- {
- if (((buf[len] >> 4) & 0x0F) == 4)
- {
- initIPcontext(dat, num, 4);
- len += Get_ipv4_static(&buf[len], chain[num].ipv4__stat());
- nextheader = chain[num].ipv4__stat().proto();
- }
- else if (((buf[len] >> 4) & 0x0F) == 6)
- {
- initIPcontext(dat, num, 6);
- len += Get_ipv6_static(&buf[len], chain[num].ipv6__stat());
- nextheader = chain[num].ipv6__stat().nexthead();
- }
- else
- {
- TTCN_error("Invalid IP version %u on level %u", buf[len], num);
- }
- num += 1;
- }
-
- len += Get_udp_static(&buf[len], chain[num].udp__stat());
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_Profile2_ROHC_Header_ir(unsigned char *buf, Profile2__IR__header & bhead,
- t_dat *dat, int cid)
-{
- int len = 0;
- unsigned char ctemp;
-
- Log_function_name_on_enter();
-
- dat->context.pkt() = Packet__type(Packet__type::IR);
- bhead.cid() = cid;
- ctemp = (buf[len] >> 1) & 0x7F;
- bhead.type__ind() = BITSTRING(7, &ctemp);
- ctemp = ShiftDownBit(buf[len], 0);
- bhead.d() = BITSTRING(1, &ctemp);
- len += 1;
- len += Get_LIN1(&buf[len], bhead.profile());
- dat->context.profile() = bhead.profile();
- len += Get_LIN1(&buf[len], bhead.crc());
-
- len += Get_Profile2_Static_Chain(&buf[len], bhead.stat__chain(), dat);
-
- if (*bhead.d() == 1)
- len += Get_Profile2_Dynamic_Chain(bhead.dyn__chain(), &buf[len], dat);
- else
- bhead.dyn__chain() = OMIT_VALUE;
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_Profile2_ROHC_Header_irdyn(unsigned char *buf,
- Profile2__IR__DYN__header & bhead,
- t_dat *dat, int cid)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- dat->context.pkt() = Packet__type(Packet__type::IR__DYN);
- bhead.cid() = cid;
- bhead.type__ind() = BITSTRING(8, &buf[len]);
- len += 1;
- len += Get_LIN1(&buf[len], bhead.profile());
- dat->context.profile() = bhead.profile();
- len += Get_LIN1(&buf[len], bhead.crc());
-
- len += Get_Profile2_Dynamic_Chain(bhead.dyn__chain(), &buf[len], dat);
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_Profile2_ROHC_Header_r1(unsigned char *buf,
- Profile2__R__1__header & bhead,
- t_dat *dat, int cid,
- OPTIONAL < Profile2__Extension > &ext)
-{
- int len = 0;
- unsigned char ctemp;
-
- Log_function_name_on_enter();
-
- dat->context.pkt() = Packet__type(Packet__type::R__1);
- bhead.cid() = cid;
- ctemp = (buf[len] >> 6) & 0x03;
- bhead.type__ind() = BITSTRING(2, &ctemp);
- bhead.sn() = buf[len] & 0x3F;
- len += 1;
- ctemp = ShiftDownBit(buf[len], 7);
- bhead.x__bit() = BITSTRING(1, &ctemp);
- bhead.ip__id() = buf[len] & 0x7F;
- len += 1;
-
- if (*bhead.x__bit())
- {
- len += Get_Profile2_extensions_opt(&buf[len], ext,
- dat, *bhead.x__bit());
- }
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_Profile2_ROHC_Header_uo1(unsigned char *buf,
- Profile2__UO__1__header & bhead,
- t_dat *dat, int cid)
-{
- int len = 0;
- unsigned char ctemp;
-
- Log_function_name_on_enter();
-
- dat->context.pkt() = Packet__type(Packet__type::UO__1);
- bhead.cid() = cid;
- ctemp = (buf[len] >> 6) & 0x03;
- bhead.type__ind() = BITSTRING(2, &ctemp);
- bhead.ip__id() = buf[len] & 0x3F;
- len += 1;
- bhead.sn() = (buf[len] >> 3) & 0x1F;
- bhead.crc() = buf[len] & 0x07;
- len += 1;
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_Profile2_ROHC_Header_uor2(unsigned char *buf,
- Profile2__UOR__2__header & bhead,
- t_dat *dat, int cid,
- OPTIONAL < Profile2__Extension > &ext)
-{
- int len = 0;
- unsigned char ctemp;
-
- Log_function_name_on_enter();
-
- dat->context.pkt() = Packet__type(Packet__type::UOR__2);
- bhead.cid() = cid;
- ctemp = (buf[len] >> 5) & 0x07;
- bhead.type__ind() = BITSTRING(3, &ctemp);
- bhead.sn() = buf[len] & 0x1F;
- len += 1;
- ctemp = ShiftDownBit(buf[len], 7);
- bhead.x__bit() = BITSTRING(1, &ctemp);
- bhead.crc() = buf[len] & 0x7F;
- len += 1;
-
- if (*bhead.x__bit())
- {
- len += Get_Profile2_extensions_opt(&buf[len], ext,
- dat, *bhead.x__bit());
- }
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_Profile2_ROHC_Header(unsigned char *buf, int length,
- Profile2__headers & hdr,
- t_dat *dat, int cid)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- if (isIR(buf[len]))
- {
- len += Get_Profile2_ROHC_Header_ir(&buf[len],
- hdr.base__header().ir(), dat, cid);
- }
- else if (isIRDYN(buf[len]))
- {
- len += Get_Profile2_ROHC_Header_irdyn(&buf[len],
- hdr.base__header().ir__dyn(),
- dat, cid);
- }
- else if (isUOR2(buf[len]))
- {
- len += Get_Profile2_ROHC_Header_uor2(&buf[len],
- hdr.base__header().uor__2(),
- dat, cid, hdr.ext());
- }
- else if (dat->context.mode() == ROHC_mode_R)
- {
- if ((buf[len] & 0xC0) == 0)
- {
- len += Get_Profile1_ROHC_Header_r0(&buf[len],
- hdr.base__header().r__0(),
- dat, cid);
- }
- else if ((buf[len] & 0xC0) == 0x40)
- {
- len += Get_Profile1_ROHC_Header_r0crc(&buf[len],
- hdr.base__header().r__0__crc(),
- dat, cid);
- }
- else if ((buf[len] & 0xC0) == 0x80)
- {
- len += Get_Profile2_ROHC_Header_r1(&buf[len],
- hdr.base__header().r__1(),
- dat, cid, hdr.ext());
- }
- else
- {
- TTCN_error("Unknown compressed packet (R mode) (0x%02x)", buf[len]);
- }
- }
- else if (dat->context.mode() != ROHC_mode_R) // U-O modes
- {
- if ((buf[len] & 0x80) == 0)
- {
- len += Get_Profile1_ROHC_Header_uo0(&buf[len],
- hdr.base__header().uo__0(),
- dat, cid);
- }
- else if ((buf[len] & 0xC0) == 0x80)
- {
- len += Get_Profile2_ROHC_Header_uo1(&buf[len],
- hdr.base__header().uo__1(),
- dat, cid);
- }
- else
- {
- TTCN_error("Unknown compressed packet (U-O mode) (0x%02x)", buf[len]);
- }
- }
-
- if (!hdr.ext().is_bound())
- hdr.ext() = OMIT_VALUE;
- len += Get_IP_ID_compressed_opt(&buf[len], hdr.ip__id__outer(),
- dat, Outer_IP);
- len += Get_AH_data_opt(&buf[len], hdr.ah__outer(), dat, Outer_IP);
- len += Get_GRE_cksum_opt(&buf[len], hdr.gre__cksum1(), dat, Outer_IP);
- len += Get_IP_ID_compressed_opt(&buf[len], hdr.ip__id__inner(),
- dat, Inner_IP);
- len += Get_AH_data_opt(&buf[len], hdr.ah__inner(), dat, Inner_IP);
- len += Get_GRE_cksum_opt(&buf[len], hdr.gre__cksum2(), dat, Inner_IP);
- len += Get_UDP_cksum_opt(&buf[len], hdr.udp__cksum(), dat);
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-} /* Get_Profile2_ROHC_Header */
-
-int
-Get_Profile4_ipv4_dynamic(const unsigned char *buf,
- Profile4__IPv4__Dynamic & chain,
- t_dat *dat, int ip_level)
-{
- int len = 0;
- unsigned char ctemp;
-
- Log_function_name_on_enter();
-
- len += Get_LIN1(&buf[len], chain.tos());
- len += Get_LIN1(&buf[len], chain.ttl());
- len += Get_LIN2_BO_LAST(&buf[len], chain.identification());
- ctemp = ShiftDownBit(buf[len], 7);
- chain.df__bit() = BITSTRING(1, &ctemp);
- ctemp = ShiftDownBit(buf[len], 6);
- chain.rnd__bit() = BITSTRING(1, &ctemp);
- dat->context.ip__ctx()[ip_level].rnd__bit() = BOOLEAN(ctemp);
- ctemp = ShiftDownBit(buf[len], 5);
- chain.nbo__bit() = BITSTRING(1, &ctemp);
- ctemp = ShiftDownBit(buf[len], 4);
- chain.sid__bit() = BITSTRING(1, &ctemp);
- ctemp = buf[len] & 0x0F;
- chain.reserved() = BITSTRING(4, &ctemp);
- len += 1;
- len += Get_Encoding_Type_0(chain.genextheadlist(),
- &buf[len], Item__list::ALT_ip__item__list,
- dat, ip_level);
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_Profile4_Dynamic_Chain(Profile4__Dynamic__Chain & dynch,
- const unsigned char *buf, t_dat *dat)
-{
- int len = 0, num;
-
- Log_function_name_on_enter();
-
- for (num = 0; num < dat->context.ip__ctx().size_of() && num < 2; num++)
- {
- if (dat->context.ip__ctx()[num].version() == 4)
- {
- len += Get_Profile4_ipv4_dynamic(&buf[len], dynch[num].ipv4__dyn(),
- dat, num);
- }
- else if (dat->context.ip__ctx()[num].version() == 6)
- {
- len += Get_ipv6_dynamic(&buf[len], dynch[num].ipv6__dyn(), dat, num);
- }
- else
- {
- int ipver = dat->context.ip__ctx()[num].version();
- TTCN_error("Invalid IP version %u on level %d", ipver, num);
- }
- }
-
- num = dynch.size_of();
- len += Get_LIN2_BO_LAST(&buf[len], dynch[num].sn());
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_Profile4_Additional_Dynamic_Chain_opt(OPTIONAL < Profile4__Dynamic__Chain >
- &dynch,
- const unsigned char *buf,
- t_dat *dat)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- if (dat->context.ip__ctx().size_of() > 2)
- {
- for (int num = 2; num < dat->context.ip__ctx().size_of(); num++)
- {
- if (dat->context.ip__ctx()[num].version() == 4)
- {
- len += Get_Profile4_ipv4_dynamic(&buf[len],
- dynch()[num - 2].ipv4__dyn(),
- dat, num);
- }
- else if (dat->context.ip__ctx()[num].version() == 6)
- {
- len += Get_ipv6_dynamic(&buf[len], dynch()[num - 2].ipv6__dyn(),
- dat, num);
- }
- else
- {
- int ipver = dat->context.ip__ctx()[num].version();
- TTCN_error("Invalid IP version %u on level %d", ipver, num);
- }
- }
- }
- else
- dynch = OMIT_VALUE;
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_Profile4_Static_Chain(unsigned char *buf, Profile4__Static__Chain & chain,
- t_dat *dat)
-{
- int len = 0, num = 0, nextheader = 0;
- bool terminated = false;
-
- Log_function_name_on_enter();
-
- do
- {
- /* Version does not include the MSB bit of the version field */
- int ver = (buf[len] >> 4) & 0x07;
-
- terminated = (buf[len] & 0x80 > 0) ? true : false;
- if (ver == c__ip__version__ipv4)
- {
- // version is stored with the MSB bit
- initIPcontext(dat, num, (buf[len] >> 4) & 0x0F);
- len += Get_ipv4_static(&buf[len], chain[num].ipv4__stat());
- nextheader = chain[num].ipv4__stat().proto();
- }
- else if (ver == c__ip__version__ipv6)
- {
- // version is stored with the MSB bit
- initIPcontext(dat, num, (buf[len] >> 4) & 0x0F);
- len += Get_ipv6_static(&buf[len], chain[num].ipv6__stat());
- nextheader = chain[num].ipv6__stat().nexthead();
- }
- else
- {
- TTCN_error("Invalid IP version %u on level %u", ver, num);
- }
- /* Explicit MSB termination */
- if (terminated)
- {
- TTCN_logger.log(TTCN_DEBUG, "MSB static chain termination on level %u",
- num);
- }
- num += 1;
- }
- while ((nextheader == c__ip__proto__ipv4 || nextheader == c__ip__proto__ipv6) &&
- !terminated);
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_Profile4_ROHC_Header_ir(unsigned char *buf, Profile4__IR__header & bhead,
- t_dat *dat, int cid)
-{
- int len = 0;
- unsigned char ctemp;
-
- Log_function_name_on_enter();
-
- dat->context.pkt() = Packet__type(Packet__type::IR);
- bhead.cid() = cid;
- ctemp = (buf[len] >> 1) & 0x7F;
- bhead.type__ind() = BITSTRING(7, &ctemp);
- ctemp = ShiftDownBit(buf[len], 0);
- bhead.d() = BITSTRING(1, &ctemp);
- len += 1;
- len += Get_LIN1(&buf[len], bhead.profile());
- dat->context.profile() = bhead.profile();
- len += Get_LIN1(&buf[len], bhead.crc());
-
- len += Get_Profile4_Static_Chain(&buf[len], bhead.stat__chain(), dat);
-
- if (*bhead.d() == 1)
- len += Get_Profile4_Dynamic_Chain(bhead.dyn__chain(), &buf[len], dat);
- else
- bhead.dyn__chain() = OMIT_VALUE;
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_Profile4_ROHC_Header_irdyn(unsigned char *buf,
- Profile4__IR__DYN__header & bhead,
- t_dat *dat, int cid)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- dat->context.pkt() = Packet__type(Packet__type::IR__DYN);
- bhead.cid() = cid;
- bhead.type__ind() = BITSTRING(8, &buf[len]);
- len += 1;
- len += Get_LIN1(&buf[len], bhead.profile());
- dat->context.profile() = bhead.profile();
- len += Get_LIN1(&buf[len], bhead.crc());
-
- len += Get_Profile4_Dynamic_Chain(bhead.dyn__chain(), &buf[len], dat);
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_Profile4_ROHC_Header_r1(unsigned char *buf,
- Profile2__R__1__header & bhead,
- t_dat *dat, int cid,
- OPTIONAL < Profile2__Extension > &ext)
-{
- int len = 0;
- unsigned char ctemp;
-
- Log_function_name_on_enter();
-
- dat->context.pkt() = Packet__type(Packet__type::R__1);
- bhead.cid() = cid;
- ctemp = (buf[len] >> 6) & 0x03;
- bhead.type__ind() = BITSTRING(2, &ctemp);
- bhead.sn() = buf[len] & 0x3F;
- len += 1;
- ctemp = ShiftDownBit(buf[len], 7);
- bhead.x__bit() = BITSTRING(1, &ctemp);
- bhead.ip__id() = buf[len] & 0x7F;
- len += 1;
-
- if (*bhead.x__bit())
- {
- len += Get_Profile2_extensions_opt(&buf[len], ext,
- dat, *bhead.x__bit());
- }
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_Profile4_ROHC_Header_uor2(unsigned char *buf,
- Profile2__UOR__2__header & bhead,
- t_dat *dat, int cid,
- OPTIONAL < Profile2__Extension > &ext)
-{
- int len = 0;
- unsigned char ctemp;
-
- Log_function_name_on_enter();
-
- dat->context.pkt() = Packet__type(Packet__type::UOR__2);
- bhead.cid() = cid;
- ctemp = (buf[len] >> 5) & 0x07;
- bhead.type__ind() = BITSTRING(3, &ctemp);
- bhead.sn() = buf[len] & 0x1F;
- len += 1;
- ctemp = ShiftDownBit(buf[len], 7);
- bhead.x__bit() = BITSTRING(1, &ctemp);
- bhead.crc() = buf[len] & 0x7F;
- len += 1;
-
- if (*bhead.x__bit())
- {
- len += Get_Profile2_extensions_opt(&buf[len], ext,
- dat, *bhead.x__bit());
- }
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-int
-Get_Profile4_ROHC_Header(unsigned char *buf, int length,
- Profile4__headers & hdr, t_dat *dat,
- int cid)
-{
- int len = 0;
-
- Log_function_name_on_enter();
-
- if (isIR(buf[len]))
- {
- len += Get_Profile4_ROHC_Header_ir(&buf[len],
- hdr.base__header().ir(), dat, cid);
- }
- else if (isIRDYN(buf[len]))
- {
- len += Get_Profile4_ROHC_Header_irdyn(&buf[len],
- hdr.base__header().ir__dyn(),
- dat, cid);
- }
- else if (isUOR2(buf[len]))
- {
- len += Get_Profile4_ROHC_Header_uor2(&buf[len],
- hdr.base__header().uor__2(),
- dat, cid, hdr.ext());
- }
- else if (dat->context.mode() == ROHC_mode_R)
- {
- if ((buf[len] & 0xC0) == 0)
- {
- len += Get_Profile1_ROHC_Header_r0(&buf[len],
- hdr.base__header().r__0(),
- dat, cid);
- }
- else if ((buf[len] & 0xC0) == 0x40)
- {
- len += Get_Profile1_ROHC_Header_r0crc(&buf[len],
- hdr.base__header().r__0__crc(),
- dat, cid);
- }
- else if ((buf[len] & 0xC0) == 0x80)
- {
- len += Get_Profile4_ROHC_Header_r1(&buf[len],
- hdr.base__header().r__1(),
- dat, cid, hdr.ext());
- }
- else
- {
- TTCN_error("Unknown compressed packet (R mode) (0x%02x)", buf[len]);
- }
- }
- else if (dat->context.mode() != ROHC_mode_R) // U-O modes
- {
- if ((buf[len] & 0x80) == 0)
- {
- len += Get_Profile1_ROHC_Header_uo0(&buf[len],
- hdr.base__header().uo__0(),
- dat, cid);
- }
- else if ((buf[len] & 0xC0) == 0x80)
- {
- len += Get_Profile2_ROHC_Header_uo1(&buf[len],
- hdr.base__header().uo__1(),
- dat, cid);
- }
- else
- {
- TTCN_error("Unknown compressed packet (U-O modes) (0x%02x)", buf[len]);
- }
- }
-
- if (!hdr.ext().is_bound())
- hdr.ext() = OMIT_VALUE;
- len += Get_IP_ID_compressed_opt(&buf[len], hdr.ip__id__outer(),
- dat, Outer_IP);
- len += Get_AH_data_opt(&buf[len], hdr.ah__outer(), dat, Outer_IP);
- len += Get_GRE_cksum_opt(&buf[len], hdr.gre__cksum1(), dat, Outer_IP);
- len += Get_IP_ID_compressed_opt(&buf[len], hdr.ip__id__inner(),
- dat, Inner_IP);
- len += Get_AH_data_opt(&buf[len], hdr.ah__inner(), dat, Inner_IP);
- len += Get_GRE_cksum_opt(&buf[len], hdr.gre__cksum2(), dat, Inner_IP);
- len += Get_Profile4_Additional_Dynamic_Chain_opt(hdr.additional__IP(),
- &buf[len], dat);
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-} /* Get_Profile4_ROHC_Header */
-
-int
-Get_ROHC_Header(const unsigned char *p_buf,
- int length, Header & p_header, ROHC__config & config)
-{
- unsigned char buf[MAX_PACKET_SIZE];
- int len = 0, cidlen = 0;
- INTEGER cid;
-
- Log_function_name_on_enter();
-
- memcpy(buf, p_buf, length);
-
- if (config.large__cid())
- {
- /* Skip packet type octet */
- cidlen = Get_CID(&p_buf[1], cid, config);
- /* Move the packet type octet right after the CID */
- buf[cidlen] = buf[0];
- }
- else
- {
- cidlen = Get_CID(&p_buf[0], cid, config);
- }
- len += cidlen;
-
- if (isIR(buf[len]) || isIRDYN(buf[len]))
- {
- config.context()[cid].profile() = buf[len + 1];
- }
-
- t_dat dat = initTDAT(config, cid);
- initCIDcontext(&dat);
-
- switch (config.context()[cid].profile())
- {
- case 0:
- len += Get_Profile0_ROHC_Header(&buf[len], &dat,
- length - cidlen, p_header.prof0(),
- (int) cid);
- break;
- case 1:
- len += Get_Profile1_ROHC_Header(&buf[len], &dat, length - cidlen,
- p_header.prof1(), (int) cid);
- break;
- case 2:
- len += Get_Profile2_ROHC_Header(&buf[len], length - cidlen,
- p_header.prof2(), &dat,
- (int) cid);
- break;
- case 4:
- len += Get_Profile4_ROHC_Header(&buf[len], length - cidlen,
- p_header.prof4(), &dat,
- (int) cid);
- break;
- default:
- break;
- }
-
- Log_hexdump(buf, len);
- Log_function_name_on_leave();
-
- return len;
-}
-
-ROHC__packet__u
-f__ROHC__dec(OCTETSTRING const &data, ROHC__config & p_config)
-{
- ROHC__packet__u packet;
- OPTIONAL < Padding > padding;
- OPTIONAL < Feedback > feedback;
- const unsigned char *buf = (const unsigned char *) data;
- int len = 0;
-
- Log_function_name_on_enter();
-
- Log_object(p_config);
-
- // Processing padding
- Log_hexdump(buf, data.lengthof() - len);
- len += Get_ROHC_Padding(&buf[len], data.lengthof() - len, padding, p_config);
- // Processing feedback
- len += Get_ROHC_Feedback(&buf[len], data.lengthof() - len, feedback, p_config);
- // Processing ROHC header
- if ((buf[len] & 0xFE) == 0xFE)
- {
- packet.segment().padding() = padding;
- packet.segment().feedback() = feedback;
- packet.segment().segment__header__id() = 0x7F;
- if (ShiftDownBit(buf[len], 0))
- {
- packet.segment().final() = BOOLEAN(true);
- len += 1;
- if (data.lengthof() - len < 4)
- {
- packet.segment().payload() =
- OCTETSTRING(data.lengthof() - len, &buf[len]);
- len = data.lengthof();
- packet.segment().crc() = OMIT_VALUE;
- }
- else
- {
- packet.segment().payload() =
- OCTETSTRING(data.lengthof() - len - 4, &buf[len]);
- len = data.lengthof() - 4;
- packet.segment().crc() =
- ((buf[len] << 24) & 0xFF000000) +
- ((buf[len + 1] << 16) & 0xFF0000) +
- ((buf[len + 2] << 8) & 0xFF00) + (buf[len + 3] & 0xFF);
- }
- }
- else
- {
- packet.segment().final() = BOOLEAN(false);
- len += 1;
- packet.segment().payload() =
- OCTETSTRING(data.lengthof() - len, &buf[len]);
- packet.segment().crc() = OMIT_VALUE;
- }
-
- }
- else
- {
- packet.rohc().padding() = padding;
- packet.rohc().feedback() = feedback;
- len += Get_ROHC_Header(&buf[len],
- data.lengthof() - len, packet.rohc().header(),
- p_config);
- if (data.lengthof() == len)
- {
- packet.rohc().payload() = OMIT_VALUE;
- }
- else
- {
- packet.rohc().payload() = OCTETSTRING(data.lengthof() - len, &buf[len]);
- }
- }
-
- TTCN_logger.begin_event(TTCN_DEBUG);
- p_config.log();
- packet.log();
- TTCN_logger.end_event();
-
- Log_function_name_on_leave();
-
- return packet;
-}
-
-INTEGER
-f__ROHC__CRC(OCTETSTRING const &data, INTEGER const &crclen)
-{
- const unsigned char *buf = (const unsigned char *) data;
- INTEGER crcval;
- int crclength = crclen;
-
- Log_function_name_on_enter();
-
- TTCN_logger.log(TTCN_DEBUG, "Calculating CRC-%d over:", crclength);
- Log_hexdump(buf, data.lengthof());
-
- crcval = INTEGER(ComputeCRC(&(buf[0]), data.lengthof(), crclength));
- Log_function_name_on_leave();
- return crcval;
-}
-
-OCTETSTRING
-f__FBCK__enc(Feedback__data const &feedback_data, ROHC__config const &config)
-{
- unsigned char buf[MAX_PACKET_SIZE];
- int len = 0, crcpos = 0;
- INTEGER cid;
-
- Log_function_name_on_enter();
-
- cid = feedback_data.cid();
- if (config.large__cid() == false)
- {
- if (cid > 0)
- {
- buf[len] = 0xE0 + (cid & 0x0F);
- len += 1;
- }
- }
- else
- len += Set_SDVL_field(&buf[len], cid, 0);
- switch (feedback_data.feedback__type().get_selection())
- {
- case Feedback__type::ALT_feedback1:
- const unsigned char *tempbuf;
- tempbuf =
- (const unsigned char *) feedback_data.feedback__type().feedback1();
- buf[len] = tempbuf[0];
- len += 1;
- break;
- case Feedback__type::ALT_feedback2:
- {
- Feedback2 fback2;
- fback2 = feedback_data.feedback__type().feedback2();
- buf[len] = (fback2.acktype() << 6) & 0xC0;
- buf[len] += (fback2.mode() << 4) & 0x30;
- buf[len] += (fback2.sn() >> 8) & 0x0F;
- len += 1;
- buf[len] = fback2.sn() & 0xFF;
- len += 1;
- if (fback2.feedback__opts().ispresent())
- {
- Feedback__opts & fbopts = fback2.feedback__opts();
- for (int num2 = 0; num2 < fbopts.size_of(); num2++)
- {
- buf[len] = (fbopts[num2].opt__type() << 4) & 0xF0;
- buf[len] += fbopts[num2].opt__len() & 0x0F;
- len += 1;
- len += Set_octetstring_opt(&buf[len], fbopts[num2].opt__data());
- if (fbopts[num2].opt__data().ispresent())
- {
- OCTETSTRING opt;
- opt = fbopts[num2].opt__data();
- if (fbopts[num2].opt__len() != opt.lengthof())
- TTCN_logger.
- log(TTCN_WARNING,
- "Feedback option length mismatch: %d, %d",
- (int) fbopts[num2].opt__len(), opt.lengthof());
- else
- if ((fbopts[num2].opt__len() == 1)
- && (fbopts[num2].opt__type() == 1) && (buf[len - 1] == 0))
- crcpos = len - 1;
- }
- }
- }
- break;
- }
-
- default:
- break;
- }
-
- if ((crcpos > 0) && (buf[crcpos] == 0))
- buf[crcpos] = ComputeCRC(&(buf[0]), len, 8);
-
- Log_function_name_on_leave();
-
- return OCTETSTRING(len, &(buf[0]));
-}
-
-Feedback__data
-f__FBCK__dec(OCTETSTRING const &data, ROHC__config const &config)
-{
- Feedback__data feedback_data;
- const unsigned char *buf;
- unsigned char ctemp;
- int len = 0, fbsize, cidlen = 0;
- buf = (const unsigned char *) data;
- fbsize = data.lengthof();
-
- Log_function_name_on_enter();
-
- if (config.large__cid() == false)
- {
- if ((buf[len] & 0xF0) == 0xE0)
- {
- feedback_data.cid() = buf[len] & 0x0F;
- len += 1;
- fbsize -= 1;
- }
- else
- feedback_data.cid() = 0;
- }
- else
- {
- cidlen = Get_SDVL_field(&buf[len], feedback_data.cid());
- len += cidlen;
- fbsize -= cidlen;
- }
-
- if (fbsize == 1)
- {
- feedback_data.feedback__type().feedback1() = OCTETSTRING(1, &buf[len]);
- len += 1;
- }
- else if (fbsize >= 1)
- {
- int optnum;
- Feedback__opts fbopts;
- Feedback2 feedback2;
- feedback2.acktype() = (buf[len] >> 6) & 0x03;
- feedback2.mode() = (buf[len] >> 4) & 0x03;
- ctemp = buf[len] & 0x0F;
- len += 1;
- fbsize -= 1;
- feedback2.sn() = ((ctemp << 8) & 0x0F00) + buf[len];
- len += 1;
- fbsize -= 1;
- optnum = 0;
- feedback2.feedback__opts() = OMIT_VALUE;
- while (fbsize)
- {
- fbopts[optnum].opt__type() = (buf[len] >> 4) & 0x0F;
- fbopts[optnum].opt__len() = buf[len] & 0x0F;
- len += 1;
- fbsize -= 1;
- if (fbopts[optnum].opt__len())
- {
- len += Get_octetstring(&buf[len], fbopts[optnum].opt__data(),
- fbopts[optnum].opt__len());
- fbsize -= fbopts[optnum].opt__len();
- }
- else
- fbopts[optnum].opt__data() = OMIT_VALUE;
- feedback2.feedback__opts() = fbopts;
- optnum += 1;
- }
-
- feedback_data.feedback__type().feedback2() = feedback2;
- }
- else
- TTCN_logger.log(TTCN_WARNING, "Size mismatch in feedback(%d)", fbsize);
-
- Log_function_name_on_leave();
-
- return feedback_data;
-}
-
-}//namespace
diff --git a/ROHC_CNL113426_LATEST/src/ROHC_Types.ttcn b/ROHC_CNL113426_LATEST/src/ROHC_Types.ttcn
deleted file mode 100644
index 5ca513e..0000000
--- a/ROHC_CNL113426_LATEST/src/ROHC_Types.ttcn
+++ /dev/null
@@ -1,1079 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////
-// //
-// Copyright Test Competence Center(TCC) ETH 2003 //
-// //
-// The copyright to the computer program(s) herein is the property of TCC. //
-// The program(s) may be used and/or copied only with the written permission //
-// of TCC or in accordance with the terms and conditions stipulated in the //
-// agreement/contract under which the program(s) has been supplied. //
-// //
-///////////////////////////////////////////////////////////////////////////////
-//
-// File: ROHC_Types.ttcn
-// Description: ROHC
-// Rev: R3A01
-// Prodnr: CNL 113 426
-// Updated: 2006.04.13
-// Contact: http://ttcn.ericsson.se
-//
-
-/* Based on RFC 3095, July 2001 */
-
-/* TODO: improvements::
-- Profile4_Dynamic_Chain_u should not contain the sn field
-
-ethesi */
-
-module ROHC_Types
-{
-import from General_Types all;
-
-external function f_ROHC_enc(in ROHC_packet_u pdu, in ROHC_config p_config)
-return octetstring;
-external function f_ROHC_dec(in octetstring data, inout ROHC_config p_config)
-return ROHC_packet_u;
-external function f_ROHC_CRC(in octetstring data, in integer crclen)
-return integer;
-external function f_FBCK_enc(in Feedback_data pdu, in ROHC_config p_config)
-return octetstring;
-external function f_FBCK_dec(in octetstring data, in ROHC_config p_config)
-return Feedback_data;
-
-/* Constants for ROHC mode field values including mode cancellation */
-const integer cg_ROHC_mode_C := 0;
-const integer cg_ROHC_mode_U := 1;
-const integer cg_ROHC_mode_O := 2;
-const integer cg_ROHC_mode_R := 3;
-
-/* Constants for ROHC feedback type */
-const integer cg_ROHC_fbck_type_ACK := 0;
-const integer cg_ROHC_fbck_type_NACK := 1;
-const integer cg_ROHC_fbck_type_SNACK := 2;
-const integer cg_ROHC_fbck_type_reserved := 3;
-
-type bitstring ROHC_BIT7_BO_LAST length (7) with {variant "BYTEORDER(last)"};
-
-type enumerated Packet_type { R_0(0), R_0_CRC(1), UO_0(2), R_1(3), R_1_ID(4),
- R_1_TS(5), UO_1(6), UO_1_ID(7), UO_1_TS(8), UOR_2(9), UOR_2_ID(10),
- UOR_2_TS(11), IR(12), IR_DYN(13), NOPKT(14) };
-
-/* ==================== ROHC configuration and context ==================== */
-
- type record IP_context {
- /* Version of this IP level. MSB bit may be set (Profile 4 only). */
- integer version,
- /* RND bit of this IP level (RND or RND2) */
- boolean rnd_bit,
- /* Whether AH is present in the IPX index list */
- boolean ah_present,
- /* Whether GRE is present in the IPX index list */
- boolean gre_present,
- /* Whether ESP is present in the IPX index list */
- boolean esp_present,
- /* Length of the compressed AH data field after the base header */
- integer ah_data_len,
- /* Whether GRE header has GRE checksum or not */
- boolean gre_cksum_present
- };
-
- type record UDP_context {
- boolean udp_cksum
- };
-
- type record of IP_context IP_contexts;
-
- type record ROHC_context {
- integer mode,
- integer profile,
- /* The decoded packet type */
- Packet_type pkt,
- IP_contexts ip_ctx,
- UDP_context udp_ctx
- };
-
- type record of integer int_array;
-
- type record of ROHC_context ROHC_context_rof;
-
- type record ROHC_config {
- boolean large_cid,
- int_array rtp_ports,
- ROHC_context_rof context
- };
-
- type port ROHC_ASP_SP_PT message
- {
- inout ROHC_packet_u;
- inout octetstring;
- } with { extension "internal" }
-
-
- /* ROHC Configuration port */
- type record ROHC_ROHCCFG_REQ_setconfig
- {
- ROHC_config config
- }
-
- type enumerated ROHC_ROHCCFG_REQ_operation { rohccfg_getconfig }
-
- type union ROHC_ROHCCFG_REQ
- {
- ROHC_ROHCCFG_REQ_operation simpleop,
- ROHC_ROHCCFG_REQ_setconfig setconfig
- }
-
- type enumerated ROHC_ROHCCFG_RSP_operation { rohccfg_ok }
-
- type record ROHC_ROHCCFG_RSP_config
- {
- ROHC_config config
- }
-
- type union ROHC_ROHCCFG_RSP
- {
- ROHC_ROHCCFG_RSP_operation simpleop,
- ROHC_ROHCCFG_RSP_config config
- }
-
- type port ROHC_PORTCFG_PT message
- {
- inout ROHC_config;
- inout charstring;
- inout ROHC_ROHCCFG_REQ;
- inout ROHC_ROHCCFG_RSP;
- } with { extension "internal" }
-
- type union ROHC_packet_u
- {
- ROHC_packet rohc,
- Segment_packet segment
- }
-
- type record ROHC_packet /* p.42 */
- {
- Padding padding optional,
- Feedback feedback optional,
- Header header,
- Payload payload optional
- };
-
-/* TODO CHECK: why this is needed ?
-type record Reconstructed_unit
-{
- octetstring reconstructed_packet,
- OCT4 CRC
-}; */
-
- type record Segment_packet /* p.50 */
- {
- Padding padding optional,
- Feedback feedback optional,
- INT7b segment_header_id, /* Must be 127 (0x7F) */
- boolean final,
- Payload payload optional,
- integer crc optional
- };
-
- type octetstring Padding; /* Must be a serie of 0xE0 */
- type octetstring Payload;
-
- type OCT1n Feedback1; /* p.91 */
-
- type record Feedback_opts_u /* p.91 */
- {
- INT4b opt_type,
- INT4b opt_len,
- octetstring opt_data optional
- };
-
- type record of Feedback_opts_u Feedback_opts; /* p.91 */
-
- type record Feedback2 /* p.91 */
- {
- INT2b acktype,
- INT2b mode,
- INT12b_BO_LAST sn,
- Feedback_opts feedback_opts optional
- };
-
- type union Feedback_type /* p.46 */
- {
- Feedback1 feedback1,
- Feedback2 feedback2
- };
-
- type record Feedback_data /* p.46 */
- {
- INT14b_BO_LAST cid,
- Feedback_type feedback_type
- };
-
- type record Feedback_u /* p.45 */
- {
- BIT5 feedback_type, /* Must be '11110'B */
- INT3b code,
- LIN1 size optional,
- /* TODO: size could be 0, so feedback_data should be optional;
- although it's a weird case, but still possible */
- Feedback_data feedback_data
- };
-
- type record of Feedback_u Feedback; /* p.42 */
-
- type union Header /* p.77 */
- {
- Profile0_headers prof0,
- Profile1_headers prof1,
- Profile2_headers prof2,
- Profile4_headers prof4
- };
-
- //Profile0
-
- type union Profile0_headers
- {
- Profile0_IR_packet ir,
- Profile0_normal_packet normal
- };
-
- type record Profile0_IR_packet /* p.127 */
- {
- INT14b_BO_LAST cid,
- BIT7 type_ind, /* Must be '1111110'B */
- BIT1 d, /* Must be 0 */
- LIN1 profile, /* Must be 0 */
- LIN1 crc,
- octetstring orig_packet
- };
-
- type record Profile0_normal_packet /* p.128 */
- {
- INT14b_BO_LAST cid,
- octetstring orig_packet
- };
-
- //Profile1
-
- type record Profile1_headers /* p.77 */
- {
- Profile1_base_header base_header,
- Profile1_Extension ext optional,
- LIN2_BO_LAST ip_id_outer optional,
- octetstring ah_outer optional,
- LIN2_BO_LAST gre_cksum1 optional,
- LIN2_BO_LAST ip_id_inner optional,
- octetstring ah_inner optional,
- LIN2_BO_LAST gre_cksum2 optional,
- LIN2_BO_LAST udp_cksum optional
- };
-
- type union Profile1_base_header
- {
- Profile1_IR_header ir,
- Profile1_IR_DYN_header ir_dyn,
- Profile1_R_0_header r_0,
- Profile1_R_0_CRC_header r_0_crc,
- Profile1_UO_0_header uo_0,
- Profile1_R_1_header r_1,
- Profile1_R_1_ID_header r_1_id,
- Profile1_R_1_TS_header r_1_ts,
- Profile1_UO_1_header uo_1,
- Profile1_UO_1_ID_header uo_1_id,
- Profile1_UO_1_TS_header uo_1_ts,
- Profile1_UOR_2_header uor_2,
- Profile1_UOR_2_ID_header uor_2_id,
- Profile1_UOR_2_TS_header uor_2_ts
- };
-
- type union Static_Chain_u /* p.91 */
- {
- IPv4_Static ipv4_stat,
- IPv6_Static ipv6_stat,
- UDP_Static udp_stat,
- RTP_Static rtp_stat,
- ESP_Static esp_stat
- };
-
- type union Dynamic_Chain_u /* p.91 */
- {
- IPv4_Dynamic ipv4_dyn,
- IPv6_Dynamic ipv6_dyn,
- UDP_Dynamic udp_dyn,
- RTP_Dynamic rtp_dyn,
- ESP_Dynamic esp_dyn
- };
-
- type record of Static_Chain_u Static_Chain; /* p.91 */
-
- type record of Dynamic_Chain_u Dynamic_Chain; /* p.91 */
-
- type record Profile1_IR_header /* p.45 */ /* p.91 */
- {
- INT14b_BO_LAST cid,
- BIT7 type_ind, /* Must be '1111110'B */
- BIT1 d,
- LIN1 profile, /* Must be 1 */
- LIN1 crc,
- Static_Chain stat_chain,
- Dynamic_Chain dyn_chain optional
- };
-
- type record Profile1_IR_DYN_header /* p.46 */ /* p.92 */
- {
- INT14b_BO_LAST cid,
- BIT8 type_ind, /* Must be '11111000'B */
- LIN1 profile, /* Must be 1 */
- LIN1 crc,
- Dynamic_Chain dyn_chain
- };
-
- type record Profile1_R_0_header /* p.74 */
- {
- INT14b_BO_LAST cid,
- BIT2 type_ind, /* Must be '00'B */
- INT6b sn
- };
-
- type record Profile1_R_0_CRC_header /* p.74 */
- {
- INT14b_BO_LAST cid,
- BIT2 type_ind, /* Must be '01'B */
- INT7b sn,
- INT7b crc
- };
-
- type record Profile1_UO_0_header /* p.75 */
- {
- INT14b_BO_LAST cid,
- BIT1 type_ind, /* Must be '0'B */
- INT4b sn,
- INT3b crc
- };
-
- type record Profile1_R_1_header /* p.75 */
- {
- INT14b_BO_LAST cid,
- BIT2 type_ind, /* Must be '10'B */
- INT6b sn,
- BIT1 m_bit,
- BIT1 x_bit,
- INT6b ts
- };
-
- type record Profile1_R_1_ID_header /* p.75 */
- {
- INT14b_BO_LAST cid,
- BIT2 type_ind, /* Must be '10'B */
- INT6b sn,
- BIT1 m_bit,
- BIT1 x_bit,
- BIT1 t_bit, /* Must be '0'B */
- INT5b ip_id
- };
-
- type record Profile1_R_1_TS_header /* p.75 */
- {
- INT14b_BO_LAST cid,
- BIT2 type_ind, /* Must be '10'B */
- INT6b sn,
- BIT1 m_bit,
- BIT1 x_bit,
- BIT1 t_bit, /* Must be '1'B */
- INT5b ts
- };
-
- type record Profile1_UO_1_header /* p.76 */
- {
- INT14b_BO_LAST cid,
- BIT2 type_ind, /* Must be '10'B */
- INT6b ts,
- BIT1 m_bit,
- INT4b sn,
- INT3b crc
- };
-
- type record Profile1_UO_1_ID_header /* p.76 */
- {
- INT14b_BO_LAST cid,
- BIT2 type_ind, /* Must be '10'B */
- BIT1 t_bit, /* Must be '0'B */
- INT5b ip_id,
- BIT1 x_bit,
- INT4b sn,
- INT3b crc
- };
-
- type record Profile1_UO_1_TS_header /* p.76 */
- {
- INT14b_BO_LAST cid,
- BIT2 type_ind, /* Must be '10'B */
- BIT1 t_bit, /* Must be '1'B */
- INT5b ts,
- BIT1 m_bit,
- INT4b sn,
- INT3b crc
- };
-
- type record Profile1_UOR_2_header /* p.77 */
- {
- INT14b_BO_LAST cid,
- BIT3 type_ind, /* Must be '110'B */
- INT6b ts,
- BIT1 m_bit,
- INT6b sn,
- BIT1 x_bit,
- INT7b crc
- };
-
- type record Profile1_UOR_2_ID_header /* p.77 */
- {
- INT14b_BO_LAST cid,
- BIT3 type_ind, /* Must be '110'B */
- INT5b ip_id,
- BIT1 t_bit, /* Must be '0'B */
- BIT1 m_bit,
- INT6b sn,
- BIT1 x_bit,
- INT7b crc
- };
-
- type record Profile1_UOR_2_TS_header /* p.77 */
- {
- INT14b_BO_LAST cid,
- BIT3 type_ind, /* Must be '110'B */
- INT5b ts,
- BIT1 t_bit, /* Must be '1'B */
- BIT1 m_bit,
- INT6b sn,
- BIT1 x_bit,
- INT7b crc
- };
-
- type record Short_Seqnum /* p.120 */
- {
- BIT1 ind, /* Must be '0'B */
- INT7b lsb_of_seqnum
- };
-
- type record Long_Seqnum /* p.120 */
- {
- BIT1 ind, /* Must be '1'B */
- INT31b_BO_LAST lsb_of_seqnum
- };
-
- type union AEGSeqnum /* p.112 */
- {
- Short_Seqnum short_form,
- Long_Seqnum long_form
- };
-
- type record XI_Item4_r /* p.121 */
- {
- BIT1 x_ind,
- INT3b index
- };
-
- type record XI_Item8_r /* p.121 */
- {
- BIT1 x_ind,
- INT7b index
- };
-
- type record of XI_Item4_r XI_Item4;
-
- type record of XI_Item8_r XI_Item8;
-
- type union XI_list /* p.113 */
- {
- XI_Item4 xi_item4,
- XI_Item8 xi_item8
- };
-
- type record IPv6_ext_item
- {
- LIN1 nexthead,
- LIN1 hdr_ext_len,
- octetstring data
- }
-
- type record MINE_item {
- LIN1 protocol,
- BIT1 s_bit,
- ROHC_BIT7_BO_LAST reserved,
- LIN2_BO_LAST cksum,
- OCT4 dstaddr,
- OCT4 srcaddr optional
- } with {
- variant "FIELDORDER(msb)";
- variant (srcaddr) "PRESENCE(s_bit = '1'B)";
- }
-
-/* TODO: check why better use INTn intead of OCTn */
- type record AH_item /* RFC 2402, p.3 */
- {
- LIN1 nexthead, /* Must be 51 */
- LIN1 payload_len,
- LIN2_BO_LAST reserved, /* Must be 0 */
- LIN4_BO_LAST spi,
- LIN4_BO_LAST sn,
- octetstring auth_data optional
- }
-
- type record ESP_item
- {
- LIN1 nexthead, /* Must be 50 */
- LIN4_BO_LAST spi,
- LIN4_BO_LAST sn
- }
-
- type record GRE_item
- {
- LIN1 nexthead, /* Must be 47 */
- BIT1 C_bit,
- BIT1 reserved_1, /* Must be '0'B */
- BIT1 K_bit,
- BIT1 S_bit,
- BIT1 reserved_2, /* Must be '0'B */
- BIT3 version,
- LIN2_BO_LAST cksum optional,
- LIN4_BO_LAST key optional,
- LIN4_BO_LAST sn optional
- }
-
- type union Item
- {
- IPv6_ext_item ipv6_ext_item,
- AH_item ah_item,
- ESP_item esp_item,
- GRE_item gre_item,
- MINE_item mine_item
-/* TODO CHECK: could we use it ?
- octetstring any_item */
- }
-
- type record of Item IP_Item_list;
-
- type record of OCT4n CSRC_Item_list;
-
- /* TODO: temporary solution for profile4 tests */
- type record of octetstring RAW_data;
-
- type union Item_list
- {
- CSRC_Item_list csrc_item_list,
- IP_Item_list ip_item_list,
- /* TODO: temporary solution for profile4 tests */
- RAW_data raw_data
- }
-
- type record Enc_Type_0 /* p.112 */
- {
- BIT2 et, /* Must be '00'B */
- BIT1 gp_bit,
- BIT1 ps_bit,
- INT4b cc,
- LIN1 gen_id optional,
- XI_list xi_list optional,
- BIT4 padding optional, /* Must be '0000'B */
- Item_list item_list optional
- };
-
- type record Enc_Type_1 /* p.114 */
- {
- BIT2 et, /* Must be '01'B */
- BIT1 gp_bit,
- BIT1 ps_bit,
- INT4b xi1,
- LIN1 gen_id optional,
- LIN1 ref_id,
- octetstring insbitmask,
- XI_list xi_list optional,
- BIT4 padding optional, /* Must be '0000'B */
- Item_list item_list optional
- };
-
- type record Enc_Type_2 /* p.115 */
- {
- BIT2 et, /* Must be '10'B */
- BIT1 gp_bit,
- BIT1 res,
- INT4b count,
- LIN1 gen_id optional,
- LIN1 ref_id,
- octetstring rembitmask
- };
-
- type record Enc_Type_3 /* p.115 */
- {
- BIT2 et, /* Must be '11'B */
- BIT1 gp_bit,
- BIT1 ps_bit,
- INT4b xi1,
- LIN1 gen_id optional,
- LIN1 ref_id,
- octetstring rembitmask,
- octetstring insbitmask,
- XI_list xi_list optional,
- BIT4 padding optional, /* Must be '0000'B */
- Item_list item_list optional
- };
-
- type record IPv4_Static /* p.94 */
- {
- INT4b version, /* Must be '0100'B */
- INT4b reserved, /* Must be '0000'B */
- LIN1 proto,
- OCT4 srcaddr,
- OCT4 dstaddr
- };
-
- type record IPv4_Dynamic /* p.94 */
- {
- LIN1 tos,
- LIN1 ttl,
- LIN2_BO_LAST identification,
- BIT1 df_bit,
- BIT1 rnd_bit,
- BIT1 nbo_bit,
- BIT5 reserved, /* Must be '00000'B */
- Enc_Type_0 genextheadlist
- };
-
- type record IPv6_Static /* p.93 */
- {
- INT4b version, /* Must be '0110'B */
- INT20b_BO_LAST flowlabel,
- LIN1 nexthead,
- OCT16 srcaddr,
- OCT16 dstaddr
- };
-
- type record IPv6_Dynamic /* p.93 */
- {
- LIN1 trafficclass,
- LIN1 hoplimit,
- Enc_Type_0 genextheadlist
- };
-
- type record UDP_Static /* p.95 */
- {
- LIN2_BO_LAST srcport,
- LIN2_BO_LAST dstport
- };
-
- type record UDP_Dynamic /* p.95 */
- {
- LIN2_BO_LAST cksum
- };
-
- type record RTP_Static /* p.96 */
- {
- OCT4 ssrc
- };
-
- type record Rx_Field /* p.96 */
- {
- BIT3 reserved, /* Must be '000'B */
- BIT1 xbit,
- INT2b mode,
- BIT1 tisbit,
- BIT1 tssbit
- };
-
- type record RTP_Dynamic /* p.96 */
- {
- INT2b vfield, /* Must be '10'B */
- BIT1 pbit,
- BIT1 rxbit,
- INT4b ccfield,
- BIT1 mbit,
- INT7b ptfield,
- LIN2_BO_LAST rtpseqnum,
- LIN4_BO_LAST rtpts,
- Enc_Type_0 gencsrclist,
- Rx_Field rx_field optional,
- integer ts_stride optional,
- integer time_stride optional
- };
-
- type record ESP_Static /* p.97 */
- {
- LIN4_BO_LAST spi
- };
-
- type record ESP_Dynamic /* p.97 */
- {
- LIN4_BO_LAST seqnum
- };
-
- type union Compr_head_list /* p.112 */
- {
- Enc_Type_0 enctype0,
- Enc_Type_1 enctype1,
- Enc_Type_2 enctype2,
- Enc_Type_3 enctype3
- };
-
- type record IP_Ext_heads /* p.111 */
- {
- BIT1 cl,
- BIT1 aseq,
- BIT1 eseq,
- BIT1 gseq,
- BIT4 res,
- AEGSeqnum ah_seq optional,
- AEGSeqnum esp_seq optional,
- AEGSeqnum gre_seq optional,
- Compr_head_list compr_head_list optional
- };
-
- type record Outer_IP_fields /* p.82 */
- {
- LIN1 tos optional,
- LIN1 ttl optional,
- LIN1 proto optional,
- IP_Ext_heads ext_heads optional,
- LIN2_BO_LAST ip_id optional
- };
-
- type record Outer_IP_flags /* p.81 */
- {
- BIT1 tos2,
- BIT1 ttl2,
- BIT1 df2,
- BIT1 pr2,
- BIT1 ipx2,
- BIT1 nbo2,
- BIT1 rnd2,
- BIT1 i2_bit
- };
-
- type record Inner_IP_fields /* p.81 */
- {
- LIN1 tos optional,
- LIN1 ttl optional,
- LIN1 proto optional,
- IP_Ext_heads ext_heads optional
- };
-
- type record Inner_IP_flags /* p.80 */
- {
- BIT1 tos,
- BIT1 ttl,
- BIT1 df,
- BIT1 pr,
- BIT1 ipx,
- BIT1 nbo,
- BIT1 rnd_bit,
- BIT1 ip2_bit
- };
-
- type record RTP_flags
- {
- BIT1 r_p,
- INT7b rtp_pt
- }
-
- type record RTP_flags_fields /* p.82 */
- {
- INT2b mode,
- BIT1 r_pt,
- BIT1 m_bit,
- BIT1 r_x,
- BIT1 csrc,
- BIT1 tss,
- BIT1 tis,
- RTP_flags flags optional,
- Compr_head_list csrc_list optional,
- integer ts_stride optional,
- integer time_stride optional
- }
-
- type record Extension0 /* p.79 */
- {
- BIT2 ext_type, /* Must be '00'B */
- INT3b sn,
- INT3b plust
- }
-
- type record Extension1 /* p.79 */
- {
- BIT2 ext_type, /* Must be '01'B */
- INT3b sn,
- INT3b plust,
- LIN1 minust
- };
-
- type record Extension2 /* p.79 */
- {
- BIT2 ext_type, /* Must be '10'B */
- INT3b sn,
- INT11b_BO_LAST plust,
- LIN1 minust
- };
-
- type record Extension3 /* p.79 */
- {
- BIT2 ext_type, /* Must be '11'B */
- BIT1 s_bit,
- BIT1 r_ts_bit,
- BIT1 tsc_bit,
- BIT1 i_bit,
- BIT1 ip_bit,
- BIT1 rtp_bit,
- Inner_IP_flags inner_ip_flags optional,
- Outer_IP_flags outer_ip_flags optional,
- LIN1 sn optional,
- integer ts optional,
- /* This field contains the length of the SDVL encoded TS value counted in
- octets. */
- integer ts_length optional,
- Inner_IP_fields inner_ip_hdr optional,
- LIN2_BO_LAST ip_id optional,
- Outer_IP_fields outer_ip_hdr optional,
- RTP_flags_fields rtp_fl_fi optional
- };
-
- type union Profile1_Extension /* p.79 */
- {
- Extension0 ext0,
- Extension1 ext1,
- Extension2 ext2,
- Extension3 ext3
- };
-
- //Profile2
-
- type record Profile2_headers /* p.77 */
- {
- Profile2_base_header base_header,
- Profile2_Extension ext optional,
- LIN2_BO_LAST ip_id_outer optional,
- octetstring ah_outer optional,
- LIN2_BO_LAST gre_cksum1 optional,
- LIN2_BO_LAST ip_id_inner optional,
- octetstring ah_inner optional,
- LIN2_BO_LAST gre_cksum2 optional,
- LIN2_BO_LAST udp_cksum optional
- };
-
- type union Profile2_base_header
- {
- Profile2_IR_header ir,
- Profile2_IR_DYN_header ir_dyn,
- Profile1_R_0_header r_0,
- Profile1_R_0_CRC_header r_0_crc,
- Profile1_UO_0_header uo_0,
- Profile2_R_1_header r_1,
- Profile2_UO_1_header uo_1,
- Profile2_UOR_2_header uor_2
- };
-
- type union Profile2_Static_Chain_u
- {
- IPv4_Static ipv4_stat,
- IPv6_Static ipv6_stat,
- UDP_Static udp_stat
- };
-
- type record Profile2_UDP_Dynamic
- {
- LIN2_BO_LAST cksum,
- LIN2_BO_LAST udp_sn
- };
-
- type union Profile2_Dynamic_Chain_u
- {
- IPv4_Dynamic ipv4_dyn,
- IPv6_Dynamic ipv6_dyn,
- Profile2_UDP_Dynamic udp_dyn
- };
-
- type record of Profile2_Static_Chain_u Profile2_Static_Chain;
-
- type record of Profile2_Dynamic_Chain_u Profile2_Dynamic_Chain;
-
- type record Profile2_IR_header
- {
- INT14b_BO_LAST cid,
- BIT7 type_ind, /* Must be '1111110'B */
- BIT1 d,
- LIN1 profile, /* Must be 2 */
- LIN1 crc,
- Profile2_Static_Chain stat_chain,
- Profile2_Dynamic_Chain dyn_chain optional
- };
-
- type record Profile2_IR_DYN_header /* p.46 */ /* p.92 */
- {
- INT14b_BO_LAST cid,
- BIT8 type_ind, /* Must be '11111000'B */
- LIN1 profile, /* Must be 2 */
- LIN1 crc,
- Profile2_Dynamic_Chain dyn_chain
- };
-
- type record Profile2_R_1_header
- {
- INT14b_BO_LAST cid,
- BIT2 type_ind, /* Must be '10'B */
- INT6b sn,
- BIT1 x_bit,
- INT7b ip_id
- };
-
- type record Profile2_UO_1_header
- {
- INT14b_BO_LAST cid,
- BIT2 type_ind, /* Must be '10'B */
- INT6b ip_id,
- INT5b sn,
- INT3b crc
- };
-
- type record Profile2_UOR_2_header
- {
- INT14b_BO_LAST cid,
- BIT3 type_ind, /* Must be '110'B */
- INT5b sn,
- BIT1 x_bit,
- INT7b crc
- };
-
- type record Profile2_Inner_IP_flags
- {
- BIT1 tos,
- BIT1 ttl,
- BIT1 df,
- BIT1 pr,
- BIT1 ipx,
- BIT1 nbo,
- BIT1 rnd_bit,
- BIT1 reserved /* Must be '0'B */
- };
-
- type union Profile2_Extension
- {
- Profile2_Extension0 ext0,
- Profile2_Extension1 ext1,
- Profile2_Extension2 ext2,
- Profile2_Extension3 ext3
- };
-
- type record Profile2_Extension0
- {
- BIT2 ext_type, /* Must be '00'B */
- INT3b sn,
- INT3b ip_id
- }
-
- type record Profile2_Extension1
- {
- BIT2 ext_type, /* Must be '01'B */
- INT3b sn,
- INT11b_BO_LAST ip_id
- };
-
- type record Profile2_Extension2
- {
- BIT2 ext_type, /* Must be '10'B */
- INT3b sn,
- INT11b_BO_LAST ip_id2,
- LIN1 ip_id
- };
-
- type record Profile2_Extension3
- {
- BIT2 ext_type, /* Must be '11'B */
- BIT1 s_bit,
- INT2b mode,
- BIT1 i_bit,
- BIT1 ip_bit,
- BIT1 ip2_bit,
- Profile2_Inner_IP_flags inner_ip_flags optional,
- Outer_IP_flags outer_ip_flags optional,
- LIN1 sn optional,
- Inner_IP_fields inner_ip_hdr optional,
- LIN2_BO_LAST ip_id optional,
- Outer_IP_fields outer_ip_hdr optional
- };
-
- //Profile4
-
- type record Profile4_headers
- {
- Profile4_base_header base_header,
- Profile2_Extension ext optional,
- LIN2_BO_LAST ip_id_outer optional,
- octetstring ah_outer optional,
- LIN2_BO_LAST gre_cksum1 optional,
- LIN2_BO_LAST ip_id_inner optional,
- octetstring ah_inner optional,
- LIN2_BO_LAST gre_cksum2 optional,
- Profile4_Dynamic_Chain additional_IP optional
- };
-
- type union Profile4_base_header
- {
- Profile4_IR_header ir,
- Profile4_IR_DYN_header ir_dyn,
- Profile1_R_0_header r_0,
- Profile1_R_0_CRC_header r_0_crc,
- Profile1_UO_0_header uo_0,
- Profile2_R_1_header r_1,
- Profile2_UO_1_header uo_1,
- Profile2_UOR_2_header uor_2
- };
-
- type union Profile4_Static_Chain_u
- {
- IPv4_Static ipv4_stat,
- IPv6_Static ipv6_stat
- };
-
- type record Profile4_IPv4_Dynamic
- {
- LIN1 tos,
- LIN1 ttl,
- LIN2_BO_LAST identification,
- BIT1 df_bit,
- BIT1 rnd_bit,
- BIT1 nbo_bit,
- BIT1 sid_bit,
- BIT4 reserved, /* Must be '0000'B */
- Enc_Type_0 genextheadlist
- };
-
- type union Profile4_Dynamic_Chain_u
- {
- Profile4_IPv4_Dynamic ipv4_dyn,
- IPv6_Dynamic ipv6_dyn,
- LIN2_BO_LAST sn
- };
-
- type record of Profile4_Static_Chain_u Profile4_Static_Chain;
-
- type record of Profile4_Dynamic_Chain_u Profile4_Dynamic_Chain;
-
- type record Profile4_IR_header
- {
- INT14b_BO_LAST cid,
- BIT7 type_ind, /* Must be '1111110'B */
- BIT1 d,
- LIN1 profile, /* Must be 4 */
- LIN1 crc,
- Profile4_Static_Chain stat_chain,
- Profile4_Dynamic_Chain dyn_chain optional
- };
-
- type record Profile4_IR_DYN_header
- {
- INT14b_BO_LAST cid,
- BIT8 type_ind, /* Must be '11111000'B */
- LIN1 profile, /* Must be 4 */
- LIN1 crc,
- Profile4_Dynamic_Chain dyn_chain
- };
-
-} with { encode "RAW" }
-
To view, visit change 39876. To unsubscribe, or for help writing mail filters, visit settings.