ROHC compression/decompression library
Functions | Variables
d_udp.c File Reference

ROHC decompression context for the UDP profile. More...

#include "d_udp.h"
#include "rohc_bit_ops.h"
#include "rohc_traces.h"
#include "rohc_debug.h"
#include "crc.h"
#include <netinet/ip.h>
#include <netinet/udp.h>
Include dependency graph for d_udp.c:

Functions

int udp_decode_uo_tail_udp (struct d_generic_context *context, const unsigned char *packet, unsigned int length, unsigned char *dest)
 Decode the UDP tail of the UO* ROHC packets.
void * d_udp_create (void)
 Create the UDP decompression context.
void d_udp_destroy (void *context)
 Destroy the context.
int udp_get_static_size (void)
 Get the size of the static part of an IR packet.
unsigned int udp_detect_ir_size (struct d_context *context, unsigned char *packet, unsigned int plen, unsigned int large_cid_len)
 Find the length of the IR header.
unsigned int udp_detect_ir_dyn_size (struct d_context *context, unsigned char *packet, unsigned int plen, unsigned int large_cid_len)
 Find the length of the IR-DYN header.
int udp_decode_static_udp (struct d_generic_context *context, const unsigned char *packet, unsigned int length, unsigned char *dest)
 Decode the UDP static part of the ROHC packet.
int udp_decode_dynamic_udp (struct d_generic_context *context, const unsigned char *packet, unsigned int length, unsigned char *dest)
 Decode the UDP dynamic part of the ROHC packet.
int udp_build_uncompressed_udp (struct d_generic_context *context, struct d_generic_changes *active, unsigned char *dest, int payload_size)
 Build an uncompressed UDP header.

Variables

struct d_profile d_udp_profile
 Define the decompression part of the UDP profile as described in the RFC 3095.

Detailed Description

ROHC decompression context for the UDP profile.

Author:
Didier Barvaux <didier.barvaux@toulouse.viveris.com>
The hackers from ROHC for Linux

Function Documentation

void* d_udp_create ( void  )
void d_udp_destroy ( void *  context)

Destroy the context.

This function is one of the functions that must exist in one profile for the framework to work.

Parameters:
contextThe compression context

References d_generic_context::active1, d_generic_context::active2, d_generic_destroy(), d_generic_context::last1, d_generic_context::last2, d_generic_changes::next_header, and zfree.

int udp_build_uncompressed_udp ( struct d_generic_context context,
struct d_generic_changes active,
unsigned char *  dest,
int  payload_size 
)

Build an uncompressed UDP header.

Parameters:
contextThe generic decompression context
activeThe UDP header changes
destThe buffer to store the UDP header (MUST be at least of sizeof(struct udphdr) length)
payload_sizeThe length of the UDP payload
Returns:
The length of the next header (ie. the UDP header), -1 in case of error

References d_generic_changes::next_header, rohc_debugf, d_generic_context::specific, and d_udp_context::udp_checksum_present.

Referenced by d_udp_create().

int udp_decode_dynamic_udp ( struct d_generic_context context,
const unsigned char *  packet,
unsigned int  length,
unsigned char *  dest 
)

Decode the UDP dynamic part of the ROHC packet.

Parameters:
contextThe generic decompression context
packetThe ROHC packet to decode
lengthThe length of the ROHC packet
destThe decoded UDP header
Returns:
The number of bytes read in the ROHC packet, -1 in case of failure

References GET_NEXT_16_BITS, ip_decode_dynamic_ip(), rohc_debugf, d_generic_context::specific, and d_udp_context::udp_checksum_present.

Referenced by d_udp_create().

int udp_decode_static_udp ( struct d_generic_context context,
const unsigned char *  packet,
unsigned int  length,
unsigned char *  dest 
)

Decode the UDP static part of the ROHC packet.

Parameters:
contextThe generic decompression context
packetThe ROHC packet to decode
lengthThe length of the ROHC packet
destThe decoded UDP header
Returns:
The number of bytes read in the ROHC packet, -1 in case of failure

References GET_NEXT_16_BITS, and rohc_debugf.

Referenced by d_udp_create(), d_udp_lite_create(), and rtp_decode_static_rtp().

int udp_decode_uo_tail_udp ( struct d_generic_context context,
const unsigned char *  packet,
unsigned int  length,
unsigned char *  dest 
)

Decode the UDP tail of the UO* ROHC packets.

Parameters:
contextThe generic decompression context
packetThe ROHC packet to decode
lengthThe length of the ROHC packet
destThe decoded UDP header
Returns:
The number of bytes read in the ROHC packet, -1 in case of failure

References GET_NEXT_16_BITS, rohc_debugf, d_generic_context::specific, and d_udp_context::udp_checksum_present.

Referenced by d_udp_create().

unsigned int udp_detect_ir_dyn_size ( struct d_context context,
unsigned char *  packet,
unsigned int  plen,
unsigned int  large_cid_len 
)

Find the length of the IR-DYN header.

This function is one of the functions that must exist in one profile for the framework to work.


 Basic structure of the IR-DYN packet (5.7.7.2):

      0   1   2   3   4   5   6   7
     --- --- --- --- --- --- --- ---
 1  :         Add-CID octet         : if for small CIDs and CID != 0
    +---+---+---+---+---+---+---+---+
 2  | 1   1   1   1   1   0   0   0 | IR-DYN packet type
    +---+---+---+---+---+---+---+---+
    :                               :
 3  /     0-2 octets of CID info    / 1-2 octets if for large CIDs
    :                               :
    +---+---+---+---+---+---+---+---+
 4  |            Profile            | 1 octet
    +---+---+---+---+---+---+---+---+
 5  |              CRC              | 1 octet
    +---+---+---+---+---+---+---+---+
    |                               |
 6  /         Dynamic chain         / variable length
    |                               |
    +---+---+---+---+---+---+---+---+
 7  |             SN                | 2 octets if not RTP
    +---+---+---+---+---+---+---+---+
    :                               :
 8  /           Payload             / variable length
    :                               :
     - - - - - - - - - - - - - - - -

The function computes the length of the fields 2 + 4-8, ie. the first byte, the Profile and CRC fields, the dynamic chains (outer and inner IP headers + UDP header) and the SN.

Parameters:
contextThe decompression context
packetThe IR-DYN packet after the Add-CID byte if present (ie. the field 2 in the figure)
plenThe length of the IR-DYN packet minus the Add-CID byte
large_cid_lenThe size of the large CID field (ie. field 3 in the figure)
Returns:
The length of the IR-DYN header, 0 if an error occurs

References ip_detect_ir_dyn_size().

Referenced by udp_lite_detect_ir_dyn_size().

unsigned int udp_detect_ir_size ( struct d_context context,
unsigned char *  packet,
unsigned int  plen,
unsigned int  large_cid_len 
)

Find the length of the IR header.

This function is one of the functions that must exist in one profile for the framework to work.


 Basic structure of the IR packet (5.7.7.1):

      0   1   2   3   4   5   6   7
     --- --- --- --- --- --- --- ---
 1  |         Add-CID octet         |  if for small CIDs and CID != 0
    +---+---+---+---+---+---+---+---+
 2  | 1   1   1   1   1   1   0 | D |
    +---+---+---+---+---+---+---+---+
    |                               |
 3  /    0-2 octets of CID info     /  1-2 octets if for large CIDs
    |                               |
    +---+---+---+---+---+---+---+---+
 4  |            Profile            |  1 octet
    +---+---+---+---+---+---+---+---+
 5  |              CRC              |  1 octet
    +---+---+---+---+---+---+---+---+
    |                               |
 6  |         Static chain          |  variable length
    |                               |
    +---+---+---+---+---+---+---+---+
    |                               |
 7  |         Dynamic chain         |  present if D = 1, variable length
    |                               |
    +---+---+---+---+---+---+---+---+
 8  |             SN                |  2 octets if not RTP
    +---+---+---+---+---+---+---+---+
    |                               |
 9  |           Payload             |  variable length
    |                               |
     - - - - - - - - - - - - - - - -

The function computes the length of the fields 2 + 4-8, ie. the first byte, the Profile and CRC fields, the static and dynamic chains (outer and inner IP headers + UDP header) and the SN.

Parameters:
contextThe decompression context
packetThe pointer on the IR packet minus the Add-CID byte (ie. the field 2 in the figure)
plenThe length of the IR packet minus the Add-CID byte
large_cid_lenThe size of the large CID field (ie. field 3 in the figure)
Returns:
The length of the IR header, 0 if an error occurs

References GET_BIT_0, ip_detect_ir_size(), and udp_get_static_size().

Referenced by udp_lite_detect_ir_size().

int udp_get_static_size ( void  )

Get the size of the static part of an IR packet.

Returns:
the size

Referenced by udp_detect_ir_size().


Variable Documentation

Initial value:

Define the decompression part of the UDP profile as described in the RFC 3095.