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 "protocols/uncomp_pkt_hdrs.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  rfc3095_ip_hdr_changes
 
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 struct rohc_pkt_hdrs *const uncomp_pkt_hdrs)
 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...
 
rohc_ext_t decide_extension (const struct rohc_comp_ctxt *const context, const rohc_packet_t packet_type)
 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 rohc_pkt_hdrs *const uncomp_pkt_hdrs, uint8_t *const rohc_pkt, const size_t rohc_pkt_max_len, rohc_packet_t *const packet_type)
 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_get_ipid_bits (const struct rohc_comp_ctxt *const context, bool *const innermost_ip_id_changed, bool *const innermost_ip_id_3bits_possible, bool *const innermost_ip_id_5bits_possible, bool *const innermost_ip_id_8bits_possible, bool *const innermost_ip_id_11bits_possible, bool *const outermost_ip_id_changed, bool *const outermost_ip_id_11bits_possible)
 Get the number of non-random outer/inner 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...
 
static bool does_at_least_one_sid_change (const struct rohc_comp_rfc3095_ctxt *const ctxt, const uint8_t oa_repetitions_nr)
 at least one SID flag changed now or in the last few packets? More...
 
static bool does_at_least_one_rnd_change (const struct rohc_comp_rfc3095_ctxt *const ctxt, const uint8_t oa_repetitions_nr)
 at least one RND flag changed now or in the last few packets? 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

◆ decide_extension()

rohc_ext_t decide_extension ( const struct rohc_comp_ctxt *const  context,
const rohc_packet_t  packet_type 
)

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
packet_typeThe type of ROHC packet that is created
Returns
The extension code among ROHC_EXT_NONE, ROHC_EXT_0, ROHC_EXT_1 and ROHC_EXT_3 if successful, ROHC_EXT_UNKNOWN otherwise

◆ does_at_least_one_rnd_change()

static bool does_at_least_one_rnd_change ( const struct rohc_comp_rfc3095_ctxt *const  ctxt,
const uint8_t  oa_repetitions_nr 
)
inlinestatic

at least one RND flag changed now or in the last few packets?

Parameters
ctxtThe generic compression context
oa_repetitions_nrThe number of Optimistic Approach repetitions
Returns
true if at least one RND flag changed now or in last few packets, false otherwise

◆ does_at_least_one_sid_change()

static bool does_at_least_one_sid_change ( const struct rohc_comp_rfc3095_ctxt *const  ctxt,
const uint8_t  oa_repetitions_nr 
)
inlinestatic

at least one SID flag changed now or in the last few packets?

Parameters
ctxtThe generic compression context
oa_repetitions_nrThe number of Optimistic Approach repetitions
Returns
true if at least one SID flag changed now or in last few packets, false otherwise

◆ get_nr_ipv4_non_rnd()

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

◆ get_nr_ipv4_non_rnd_with_bits()

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 compression context
Returns
The number of IPv4 headers with non-random IP-ID fields and some bits to transmit

◆ rohc_comp_rfc3095_create()

bool rohc_comp_rfc3095_create ( struct rohc_comp_ctxt *const  context,
const struct rohc_pkt_hdrs *const  uncomp_pkt_hdrs 
)

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

Parameters
contextThe compression context
uncomp_pkt_hdrsThe uncompressed headers to initialize the new context
Returns
true if successful, false otherwise

◆ rohc_comp_rfc3095_destroy()

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

◆ rohc_comp_rfc3095_encode()

int rohc_comp_rfc3095_encode ( struct rohc_comp_ctxt *const  context,
const struct rohc_pkt_hdrs *const  uncomp_pkt_hdrs,
uint8_t *const  rohc_pkt,
const size_t  rohc_pkt_max_len,
rohc_packet_t *const  packet_type 
)

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_pkt_hdrsThe uncompressed headers 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
Returns
The length of the ROHC packet if successful, -1 otherwise

◆ rohc_comp_rfc3095_feedback()

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

◆ rohc_get_ipid_bits()

void rohc_get_ipid_bits ( const struct rohc_comp_ctxt *const  context,
bool *const  innermost_ip_id_changed,
bool *const  innermost_ip_id_3bits_possible,
bool *const  innermost_ip_id_5bits_possible,
bool *const  innermost_ip_id_8bits_possible,
bool *const  innermost_ip_id_11bits_possible,
bool *const  outermost_ip_id_changed,
bool *const  outermost_ip_id_11bits_possible 
)

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

Parameters
contextThe compression context
[out]innermost_ip_id_changedWhether the innermost IP-ID changed
[out]innermost_ip_id_3bits_possibleWhether the innermost IP-ID may be encoded on 3 bits
[out]innermost_ip_id_5bits_possibleWhether the innermost IP-ID may be encoded on 5 bits
[out]innermost_ip_id_8bits_possibleWhether the innermost IP-ID may be encoded on 8 bits
[out]innermost_ip_id_11bits_possibleWhether the innermost IP-ID may be encoded on 11 bits
[out]outermost_ip_id_changedWhether the outermost IP-ID changed
[out]outermost_ip_id_11bits_possibleWhether the outermost IP-ID may be encoded on 11 bits