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

Generic framework for RFC3095-based compression profiles such as IP-only, UDP, UDP-Lite, ESP, and RTP profiles. More...

#include "rohc_comp_internals.h"
#include "rohc_packets.h"
#include "schemes/comp_list.h"
#include "ip.h"
#include "crc.h"
#include <stdlib.h>
Include dependency graph for rohc_comp_rfc3095.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  ipv4_header_info
 Store information about an IPv4 header between the different compressions of IP packets. More...
 
struct  ipv6_header_info
 Store information about an IPv6 header between the different compressions of IP packets. More...
 
struct  ip_header_info
 Store information about an IP (IPv4 or IPv6) header between the different compressions of IP packets. More...
 
struct  generic_tmp_vars
 Structure that contains variables that are used during one single compression of packet. More...
 
struct  rohc_comp_rfc3095_ctxt
 The generic decompression context for RFC3095-based profiles. More...
 

Functions

bool rohc_comp_rfc3095_create (struct rohc_comp_ctxt *const context, const rohc_lsb_shift_t sn_shift, const struct net_pkt *const packet)
 Create a new context and initialize it thanks to the given IP packet. More...
 
void rohc_comp_rfc3095_destroy (struct rohc_comp_ctxt *const context)
 Destroy the context. More...
 
bool rohc_comp_rfc3095_check_profile (const struct rohc_comp *const comp, const struct net_pkt *const packet)
 Check if the given packet corresponds to an IP-based profile. More...
 
rohc_ext_t decide_extension (const struct rohc_comp_ctxt *const context)
 Decide what extension shall be used in the UO-1-ID/UOR-2 packet. More...
 
int rohc_comp_rfc3095_encode (struct rohc_comp_ctxt *const context, const struct net_pkt *const uncomp_pkt, uint8_t *const rohc_pkt, const size_t rohc_pkt_max_len, rohc_packet_t *const packet_type, size_t *const payload_offset)
 Encode an IP packet according to a pattern decided by several different factors. More...
 
bool rohc_comp_rfc3095_feedback (struct rohc_comp_ctxt *const context, const enum rohc_feedback_type feedback_type, const uint8_t *const packet, const size_t packet_len, const uint8_t *const feedback_data, const size_t feedback_data_len)
 Update the profile when feedback is received. More...
 
void rohc_comp_rfc3095_decide_state (struct rohc_comp_ctxt *const context)
 Decide the state that should be used for the next packet. More...
 
void rohc_get_ipid_bits (const struct rohc_comp_ctxt *const context, size_t *const nr_innermost_bits, size_t *const nr_outermost_bits)
 Get the number of non-random outer/inner IP-ID bits. More...
 
bool rohc_comp_rfc3095_is_sn_possible (const struct rohc_comp_rfc3095_ctxt *const rfc3095_ctxt, const size_t bits_nr, const size_t add_bits_nr)
 Are the given SN field sizes possible? More...
 
static bool no_outer_ip_id_bits_required (const struct rohc_comp_rfc3095_ctxt *const ctxt)
 Does the outer IP header require to transmit no non-random IP-ID bit? More...
 
static bool is_outer_ip_id_bits_possible (const struct rohc_comp_rfc3095_ctxt *const ctxt, const size_t max_ip_id_bits_nr)
 May the outer IP header transmit the required non-random IP-ID bits? More...
 
static bool no_inner_ip_id_bits_required (const struct rohc_comp_rfc3095_ctxt *const ctxt)
 Does the inner IP header require to transmit no non-random IP-ID bit? More...
 
static bool is_inner_ip_id_bits_possible (const struct rohc_comp_rfc3095_ctxt *const ctxt, const size_t max_ip_id_bits_nr)
 May the inner IP header transmit the required non-random IP-ID bits? More...
 
static size_t get_nr_ipv4_non_rnd (const struct rohc_comp_rfc3095_ctxt *const ctxt)
 How many IP headers are IPv4 headers with non-random IP-IDs ? More...
 
static size_t get_nr_ipv4_non_rnd_with_bits (const struct rohc_comp_rfc3095_ctxt *const ctxt)
 How many IP headers are IPv4 headers with non-random IP-IDs and some bits to transmit ? More...
 

Detailed Description

Generic framework for RFC3095-based compression profiles such as IP-only, UDP, UDP-Lite, ESP, and RTP profiles.

Author
Didier Barvaux didie.nosp@m.r.ba.nosp@m.rvaux.nosp@m.@tou.nosp@m.louse.nosp@m..viv.nosp@m.eris..nosp@m.com
Didier Barvaux didie.nosp@m.r@ba.nosp@m.rvaux.nosp@m..org

Function Documentation

rohc_ext_t decide_extension ( const struct rohc_comp_ctxt *const  context)

Decide what extension shall be used in the UO-1-ID/UOR-2 packet.

Extensions 0, 1 & 2 are IPv4 only because of the IP-ID.

Parameters
contextThe compression context
Returns
The extension code among ROHC_EXT_NONE, ROHC_EXT_0, ROHC_EXT_1 and ROHC_EXT_3 if successful, ROHC_EXT_UNKNOWN otherwise
static size_t get_nr_ipv4_non_rnd ( const struct rohc_comp_rfc3095_ctxt *const  ctxt)
inlinestatic

How many IP headers are IPv4 headers with non-random IP-IDs ?

Parameters
ctxtThe generic decompression context
Returns
The number of IPv4 headers with non-random IP-ID fields
static size_t get_nr_ipv4_non_rnd_with_bits ( const struct rohc_comp_rfc3095_ctxt *const  ctxt)
inlinestatic

How many IP headers are IPv4 headers with non-random IP-IDs and some bits to transmit ?

Parameters
ctxtThe generic decompression context
Returns
The number of IPv4 headers with non-random IP-ID fields and some bits to transmit
static bool is_inner_ip_id_bits_possible ( const struct rohc_comp_rfc3095_ctxt *const  ctxt,
const size_t  max_ip_id_bits_nr 
)
inlinestatic

May the inner IP header transmit the required non-random IP-ID bits?

Parameters
ctxtThe generic decompression context
max_ip_id_bits_nrThe maximum number of IP-ID bits that may be transmitted
Returns
true if the required IP-ID bits may be transmitted, false otherwise
static bool is_outer_ip_id_bits_possible ( const struct rohc_comp_rfc3095_ctxt *const  ctxt,
const size_t  max_ip_id_bits_nr 
)
inlinestatic

May the outer IP header transmit the required non-random IP-ID bits?

Parameters
ctxtThe generic decompression context
max_ip_id_bits_nrThe maximum number of IP-ID bits that may be transmitted
Returns
true if the required IP-ID bits may be transmitted, false otherwise
static bool no_inner_ip_id_bits_required ( const struct rohc_comp_rfc3095_ctxt *const  ctxt)
inlinestatic

Does the inner IP header require to transmit no non-random IP-ID bit?

Parameters
ctxtThe generic decompression context
Returns
true if no required inner IP-ID bit shall be transmitted, false otherwise
static bool no_outer_ip_id_bits_required ( const struct rohc_comp_rfc3095_ctxt *const  ctxt)
inlinestatic

Does the outer IP header require to transmit no non-random IP-ID bit?

Parameters
ctxtThe generic decompression context
Returns
true if no required outer IP-ID bit shall be transmitted, false otherwise
bool rohc_comp_rfc3095_check_profile ( const struct rohc_comp *const  comp,
const struct net_pkt *const  packet 
)

Check if the given packet corresponds to an IP-based profile.

Conditions are:

  • the version of the outer IP header is 4 or 6
  • if the outer IP header is IPv4, it does not contain options
  • the outer IP header is not an IP fragment
  • if there are at least 2 IP headers, the version of the inner IP header is 4 or 6
  • if there are at least 2 IP headers and if the inner IP header is IPv4, it does not contain options
  • if there are at least 2 IP headers, the inner IP header is not an IP fragment

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

Parameters
compThe ROHC compressor
packetThe packet to check
Returns
Whether the IP packet corresponds to the profile:
  • true if the IP packet corresponds to the profile,
  • false if the IP packet does not correspond to the profile
bool rohc_comp_rfc3095_create ( struct rohc_comp_ctxt *const  context,
const rohc_lsb_shift_t  sn_shift,
const struct net_pkt *const  packet 
)

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

Parameters
contextThe compression context
sn_shiftThe shift parameter (p) to use for encoding SN with W-LSB
packetThe packet given to initialize the new context
Returns
bool if successful, false otherwise
void rohc_comp_rfc3095_decide_state ( struct rohc_comp_ctxt *const  context)

Decide the state that should be used for the next packet.

The three states are:

  • Initialization and Refresh (IR),
  • First Order (FO),
  • Second Order (SO).
Parameters
contextThe compression context
void rohc_comp_rfc3095_destroy ( struct rohc_comp_ctxt *const  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
int rohc_comp_rfc3095_encode ( struct rohc_comp_ctxt *const  context,
const struct net_pkt *const  uncomp_pkt,
uint8_t *const  rohc_pkt,
const size_t  rohc_pkt_max_len,
rohc_packet_t *const  packet_type,
size_t *const  payload_offset 
)

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

  1. parse uncompressed packet (done in rohc_compress4)
  2. detect changes between the new uncompressed packet and the context
  3. decide new compressor state
  4. determine how many bytes are required for every field
  5. decide which packet to send
  6. code the ROHC header
  7. copy the packet payload (done in rohc_compress4)
  8. update the context with the new headers

    This function is one of the functions that must exist in one profile for the framework to work.
Parameters
contextThe compression context
uncomp_pktThe uncompressed packet to encode
rohc_pktOUT: The ROHC packet
rohc_pkt_max_lenThe maximum length of the ROHC packet
packet_typeOUT: The type of ROHC packet that is created
payload_offsetOUT: The offset for the payload in the IP packet
Returns
The length of the ROHC packet if successful, -1 otherwise
bool rohc_comp_rfc3095_feedback ( struct rohc_comp_ctxt *const  context,
const enum rohc_feedback_type  feedback_type,
const uint8_t *const  packet,
const size_t  packet_len,
const uint8_t *const  feedback_data,
const size_t  feedback_data_len 
)

Update the profile when feedback is received.

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

Parameters
contextThe compression context
feedback_typeThe feedback type
packetThe whole feedback packet with CID bits
packet_lenThe length of the whole feedback packet with CID bits
feedback_dataThe feedback data without the CID bits
feedback_data_lenThe length of the feedback data without the CID bits
Returns
true if the feedback was successfully handled, false if the feedback could not be taken into account
bool rohc_comp_rfc3095_is_sn_possible ( const struct rohc_comp_rfc3095_ctxt *const  rfc3095_ctxt,
const size_t  bits_nr,
const size_t  add_bits_nr 
)

Are the given SN field sizes possible?

Parameters
rfc3095_ctxtThe compression context
bits_nrThe base number of SN bits
add_bits_nrThe additional number of SN bits
Returns
true if the SN field is usable, false if not
void rohc_get_ipid_bits ( const struct rohc_comp_ctxt *const  context,
size_t *const  nr_innermost_bits,
size_t *const  nr_outermost_bits 
)

Get the number of non-random outer/inner IP-ID bits.

Parameters
contextThe compression context
nr_innermost_bitsOUT: the maximum number of IP-ID bits for the innermost IPv4 header
nr_outermost_bitsOUT: the maximum number of IP-ID bits for the outermost IP header