ROHC compression/decompression library
Data Structures | Functions
c_udp.h File Reference

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

#include "c_generic.h"
#include "protocols/udp.h"
Include dependency graph for c_udp.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  udp_tmp_vars
 Define the UDP-specific temporary variables in the profile compression context. More...
struct  sc_udp_context
 Define the UDP part of the profile decompression context. More...

Functions

int c_udp_create (struct c_context *const context, const struct ip_packet *ip)
 Create a new UDP context and initialize it thanks to the given IP/UDP packet.
int c_udp_check_context (const struct c_context *context, const struct ip_packet *ip)
 Check if the IP/UDP packet belongs to the context.
int c_udp_encode (struct c_context *const context, const struct ip_packet *ip, const int packet_size, unsigned char *const dest, const int dest_size, rohc_packet_t *const packet_type, int *const payload_offset)
 Encode an IP/UDP packet according to a pattern decided by several different factors.
void udp_decide_state (struct c_context *const context)
 Decide the state that should be used for the next packet compressed with the ROHC UDP profile.
int udp_code_uo_remainder (const struct c_context *context, const unsigned char *next_header, unsigned char *const dest, int counter)
 Build UDP-related fields in the tail of the UO packets.
int udp_code_static_udp_part (const struct c_context *context, const unsigned char *next_header, unsigned char *const dest, int counter)
 Build the static part of the UDP header.

Detailed Description

ROHC compression context for the UDP profile.

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

Function Documentation

int c_udp_check_context ( const struct c_context context,
const struct ip_packet ip 
)

Check if the IP/UDP packet belongs to the context.

Conditions are:

  • the number of IP headers must be the same as in context
  • IP version of the two IP headers must be the same as in context
  • IP packets must not be fragmented
  • the source and destination addresses of the two IP headers must match the ones in the context
  • the transport protocol must be UDP
  • the source and destination ports of the UDP header must match the ones in the context
  • IPv6 only: the Flow Label of the two IP headers must match the ones the context

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

Parameters:
contextThe compression context
ipThe IP/UDP packet to check
Returns:
1 if the IP/UDP packet belongs to the context, 0 if it does not belong to the context and -1 if the profile cannot compress it or an error occurs

References ipv4_hdr::daddr, udphdr::dest, ip_header_info::info, c_generic_context::ip2_flags, ipv6_hdr::ip6_dst, ipv6_hdr::ip6_src, c_generic_context::ip_flags, ip_get_inner_packet(), ip_get_next_layer(), ip_get_protocol(), ip_get_version(), IPV4, ipv4_get_daddr(), ipv4_get_saddr(), IPV6, IPV6_ADDR_CMP, ipv6_get_daddr(), IPV6_GET_FLOW_LABEL, ipv6_get_flow_label(), ipv6_get_saddr(), c_generic_context::is_ip2_initialized, ipv4_header_info::old_ip, ipv6_header_info::old_ip, sc_udp_context::old_udp, rohc_debugf, ROHC_IPPROTO_IPIP, ROHC_IPPROTO_IPV6, ROHC_IPPROTO_UDP, ipv4_hdr::saddr, udphdr::source, c_context::specific, c_generic_context::specific, ip_header_info::v4, ip_header_info::v6, version, and ip_header_info::version.

Referenced by c_rtp_check_context().

int c_udp_create ( struct c_context *const  context,
const struct ip_packet ip 
)

Create a new UDP context and initialize it thanks to the given IP/UDP packet.

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

Parameters:
contextThe compression context
ipThe IP/UDP packet given to initialize the new context
Returns:
1 if successful, 0 otherwise

References c_generic_create(), c_generic_destroy(), c_ip_code_ir_remainder(), c_ip_decide_FO_packet(), c_ip_decide_SO_packet(), c_ip_get_next_sn(), c_generic_context::code_dynamic_part, c_generic_context::code_ir_remainder, c_generic_context::code_static_part, c_generic_context::code_UO_packet_head, c_generic_context::code_uo_remainder, c_context::compressor, c_generic_context::compute_crc_dynamic, c_generic_context::compute_crc_static, c_generic_context::decide_extension, decide_extension(), c_generic_context::decide_FO_packet, c_generic_context::decide_SO_packet, c_generic_context::decide_state, c_generic_context::get_next_sn, c_generic_context::init_at_IR, ip_get_inner_packet(), ip_get_next_layer(), ip_get_protocol(), c_generic_context::next_header_len, c_generic_context::next_header_proto, sc_udp_context::old_udp, rohc_comp::random_cb, rohc_comp::random_cb_ctxt, rohc_debugf, ROHC_IPPROTO_IPIP, ROHC_IPPROTO_IPV6, ROHC_IPPROTO_UDP, ROHC_LSB_SHIFT_SN, udp_tmp_vars::send_udp_dynamic, c_generic_context::sn, c_context::specific, c_generic_context::specific, sc_udp_context::tmp, sc_udp_context::udp_checksum_change_count, udp_code_dynamic_udp_part(), udp_code_static_udp_part(), udp_code_uo_remainder(), udp_compute_crc_dynamic(), udp_compute_crc_static(), and udp_decide_state().

int c_udp_encode ( struct c_context *const  context,
const struct ip_packet ip,
const int  packet_size,
unsigned char *const  dest,
const int  dest_size,
rohc_packet_t *const  packet_type,
int *const  payload_offset 
)

Encode an IP/UDP packet according to a pattern decided by several different factors.

Parameters:
contextThe compression context
ipThe IP packet to encode
packet_sizeThe length of the IP packet to encode
destThe rohc-packet-under-build buffer
dest_sizeThe length of the rohc-packet-under-build buffer
packet_typeOUT: The type of ROHC packet that is created
payload_offsetThe offset for the payload in the IP packet
Returns:
The length of the created ROHC packet or -1 in case of failure

References c_generic_encode(), ip_get_inner_packet(), ip_get_next_layer(), ip_get_protocol(), sc_udp_context::old_udp, PACKET_IR, PACKET_IR_DYN, generic_tmp_vars::packet_type, rohc_debugf, ROHC_IPPROTO_IPIP, ROHC_IPPROTO_IPV6, ROHC_IPPROTO_UDP, udp_tmp_vars::send_udp_dynamic, c_context::specific, c_generic_context::specific, sc_udp_context::tmp, c_generic_context::tmp, and udp_changed_udp_dynamic().

int udp_code_static_udp_part ( const struct c_context context,
const unsigned char *  next_header,
unsigned char *const  dest,
int  counter 
)

Build the static part of the UDP header.


 Static part of UDP header (5.7.7.5):

    +---+---+---+---+---+---+---+---+
 1  /          Source Port          /   2 octets
    +---+---+---+---+---+---+---+---+
 2  /       Destination Port        /   2 octets
    +---+---+---+---+---+---+---+---+

Parameters:
contextThe compression context
next_headerThe UDP header
destThe rohc-packet-under-build buffer
counterThe current position in the rohc-packet-under-build buffer
Returns:
The new position in the rohc-packet-under-build buffer

References udphdr::dest, rohc_debugf, and udphdr::source.

Referenced by c_udp_create(), c_udp_lite_create(), and rtp_code_static_rtp_part().

int udp_code_uo_remainder ( const struct c_context context,
const unsigned char *  next_header,
unsigned char *const  dest,
int  counter 
)

Build UDP-related fields in the tail of the UO packets.


     --- --- --- --- --- --- --- ---
    :                               :
 13 +         UDP Checksum          +  2 octets,
    :                               :  if context(UDP Checksum) != 0
     --- --- --- --- --- --- --- ---

Parameters:
contextThe compression context
next_headerThe UDP header
destThe rohc-packet-under-build buffer
counterThe current position in the rohc-packet-under-build buffer
Returns:
The new position in the rohc-packet-under-build buffer

References udphdr::check, and rohc_debugf.

Referenced by c_rtp_create(), and c_udp_create().

void udp_decide_state ( struct c_context *const  context)

Decide the state that should be used for the next packet compressed with the ROHC UDP profile.

The three states are:

  • Initialization and Refresh (IR),
  • First Order (FO),
  • Second Order (SO).
Parameters:
contextThe compression context

References change_state(), decide_state(), IR, rohc_debugf, udp_tmp_vars::send_udp_dynamic, c_context::specific, c_generic_context::specific, and sc_udp_context::tmp.

Referenced by c_udp_create().