ROHC compression/decompression library
|
Generic framework for RFC3095-based compression profiles such as IP-only, UDP, UDP-Lite, ESP, and RTP profiles. More...
#include "rohc_comp_rfc3095.h"
#include "c_rtp.h"
#include "rohc_traces.h"
#include "rohc_traces_internal.h"
#include "rohc_debug.h"
#include "rohc_packets.h"
#include "rohc_utils.h"
#include "rohc_bit_ops.h"
#include "schemes/cid.h"
#include "schemes/ip_id_offset.h"
#include "schemes/comp_list_ipv6.h"
#include "sdvl.h"
#include "crc.h"
#include <stdint.h>
#include <string.h>
#include <assert.h>
#include "config.h"
Macros | |
#define | MOD_TOS 0x0001 |
#define | MOD_TTL 0x0010 |
#define | MOD_PROTOCOL 0x0020 |
#define | MOD_IPV6_EXT_LIST_STRUCT 0x0002 |
#define | MOD_IPV6_EXT_LIST_CONTENT 0x0004 |
#define | MOD_ERROR 0x0008 |
Functions | |
static bool | ip_header_info_new (struct ip_header_info *const header_info, const struct ip_packet *const ip, const size_t list_trans_nr, const size_t wlsb_window_width, rohc_trace_callback2_t trace_cb, void *const trace_cb_priv, const int profile_id) |
Initialize the IP header info stored in the context. More... | |
static void | ip_header_info_free (struct ip_header_info *const header_info) |
Reset the given IP header info. More... | |
static void | c_init_tmp_variables (struct generic_tmp_vars *const tmp_vars) |
Initialize all temporary variables stored in the context. More... | |
static rohc_packet_t | decide_packet (struct rohc_comp_ctxt *const context) |
Decide which packet to send when in the different states. More... | |
static rohc_ext_t | decide_extension_uor2 (const struct rohc_comp_ctxt *const context, const size_t nr_innermost_ip_id_bits, const size_t nr_outermost_ip_id_bits) |
Decide what extension shall be used in the UOR-2 packet (non-RTP). More... | |
static rohc_ext_t | decide_extension_uor2rtp (const struct rohc_comp_ctxt *const context, const size_t nr_innermost_ip_id_bits, const size_t nr_outermost_ip_id_bits) |
Decide what extension shall be used in the UOR-2 packet (RTP). More... | |
static rohc_ext_t | decide_extension_uor2ts (const struct rohc_comp_ctxt *const context, const size_t nr_innermost_ip_id_bits, const size_t nr_outermost_ip_id_bits) |
Decide what extension shall be used in the UO-1-ID/UOR-2 packet. More... | |
static rohc_ext_t | decide_extension_uor2id (const struct rohc_comp_ctxt *const context, const size_t nr_innermost_ip_id_bits, const size_t nr_outermost_ip_id_bits) |
Decide what extension shall be used in the UOR-2-ID packet. More... | |
static rohc_ext_t | decide_extension_uo1id (const struct rohc_comp_ctxt *const context, const size_t nr_innermost_ip_id_bits, const size_t nr_outermost_ip_id_bits) |
Decide what extension shall be used in the UO-1-ID packet. More... | |
static int | code_packet (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) |
Build the ROHC packet to send. More... | |
static int | code_IR_packet (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) |
Build the IR packet. More... | |
static int | code_IR_DYN_packet (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) |
Build the IR-DYN packet. More... | |
static int | rohc_code_static_part (const struct rohc_comp_ctxt *const context, const struct net_pkt *const uncomp_pkt, uint8_t *const rohc_pkt, int counter) |
Build the static part of the IR packet. More... | |
static int | rohc_code_static_ip_part (const struct rohc_comp_ctxt *const context, struct ip_header_info *const header_info, const struct ip_packet *const ip, uint8_t *const dest, int counter) |
Build the static part of one IP header for the IR packet. More... | |
static int | code_ipv4_static_part (const struct rohc_comp_ctxt *const context, struct ip_header_info *const header_info, const struct ip_packet *const ip, uint8_t *const dest, int counter) |
Build the IPv4 static part of the IR packet. More... | |
static int | code_ipv6_static_part (const struct rohc_comp_ctxt *const context, struct ip_header_info *const header_info, const struct ip_packet *const ip, uint8_t *const dest, int counter) |
Build the IPv6 static part of the IR packet. More... | |
static int | rohc_code_dynamic_part (const struct rohc_comp_ctxt *const context, const struct net_pkt *const uncomp_pkt, uint8_t *const rohc_pkt, int counter) |
Build the dynamic part of the IR and IR-DYN packets. More... | |
static int | rohc_code_dynamic_ip_part (const struct rohc_comp_ctxt *const context, const unsigned int hdr_pos, struct ip_header_info *const header_info, const struct ip_packet *const ip, uint8_t *const dest, int counter) |
Build the dynamic part of one IP header for the IR/IR-DYN packets. More... | |
static int | code_ipv4_dynamic_part (const struct rohc_comp_ctxt *const context, struct ip_header_info *const header_info, const struct ip_packet *const ip, uint8_t *const dest, int counter) |
Build the IPv4 dynamic part of the IR and IR-DYN packets. More... | |
static int | code_ipv6_dynamic_part (const struct rohc_comp_ctxt *const context, const unsigned int hdr_pos, struct ip_header_info *const header_info, const struct ip_packet *const ip, uint8_t *const dest, int counter) |
Build the IPv6 dynamic part of the IR and IR-DYN packets. More... | |
static int | code_uo_remainder (struct rohc_comp_ctxt *const context, const struct net_pkt *const uncomp_pkt, uint8_t *const dest, int counter) |
Build the tail of the UO packet. More... | |
static int | code_UO0_packet (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) |
Build the UO-0 packet. More... | |
static int | rohc_comp_rfc3095_build_uo1_pkt (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) |
Build the UO-1 packet for the non-RTP profiles. More... | |
static int | rohc_comp_rfc3095_build_uo1rtp_pkt (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) |
Build the UO-1 packet for the RTP profiles. More... | |
static int | rohc_comp_rfc3095_build_uo1ts_pkt (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) |
Build the UO-1-TS packet. More... | |
static int | rohc_comp_rfc3095_build_uo1id_pkt (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) |
Build the UO-1-ID packet. More... | |
static int | code_UO2_packet (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) |
Build the UO-2 packet. More... | |
static int | code_UOR2_bytes (const struct rohc_comp_ctxt *const context, const rohc_ext_t extension, uint8_t *const f_byte, uint8_t *const s_byte, uint8_t *const t_byte) |
Code some fields of the UOR-2 packet. More... | |
static int | code_UOR2_RTP_bytes (const struct rohc_comp_ctxt *const context, const rohc_ext_t extension, uint8_t *const f_byte, uint8_t *const s_byte, uint8_t *const t_byte) |
Code some fields of the UOR-2-RTP packet. More... | |
static int | code_UOR2_TS_bytes (const struct rohc_comp_ctxt *const context, const rohc_ext_t extension, uint8_t *const f_byte, uint8_t *const s_byte, uint8_t *const t_byte) |
Code some fields of the UOR-2-TS packet. More... | |
static int | code_UOR2_ID_bytes (const struct rohc_comp_ctxt *const context, const rohc_ext_t extension, uint8_t *const f_byte, uint8_t *const s_byte, uint8_t *const t_byte) |
Code some fields of the UOR-2-ID packet. More... | |
static int | code_EXT0_packet (const struct rohc_comp_ctxt *const context, uint8_t *const dest, int counter) |
Build the extension 0 of the UO-2 packet. More... | |
static int | code_EXT1_packet (const struct rohc_comp_ctxt *const context, uint8_t *const dest, int counter) |
Build the extension 1 of the UO-2 packet. More... | |
static int | code_EXT2_packet (const struct rohc_comp_ctxt *const context, uint8_t *const dest, int counter) |
Build the extension 2 of the UO-2 packet. More... | |
static int | code_EXT3_packet (struct rohc_comp_ctxt *const context, const struct net_pkt *const uncomp_pkt, uint8_t *const dest, int counter) |
Build the extension 3 of the UO* packet types. More... | |
static int | code_EXT3_rtp_packet (struct rohc_comp_ctxt *const context, const struct net_pkt *const uncomp_pkt, uint8_t *const dest, int counter) |
Build the extension 3 of the UO-2 packet. More... | |
static int | code_EXT3_nortp_packet (struct rohc_comp_ctxt *const context, const struct net_pkt *const uncomp_pkt, uint8_t *const dest, int counter) |
Build the extension 3 of the UO-2 packet. More... | |
static int | rtp_header_flags_and_fields (const struct rohc_comp_ctxt *const context, const struct ip_packet *const ip, uint8_t *const dest, int counter) |
static int | header_flags (const struct rohc_comp_ctxt *const context, struct ip_header_info *const header_info, const unsigned short changed_f, const struct ip_packet *const ip, const int ip2_or_I2, uint8_t *const dest, int counter) |
Build inner or outer IP header flags. More... | |
static int | header_fields (const struct rohc_comp_ctxt *const context, struct ip_header_info *const header_info, const unsigned short changed_f, const struct ip_packet *const ip, const int I, const ip_header_pos_t ip_hdr_pos, uint8_t *const dest, int counter) |
Build inner or outer IP header fields. More... | |
static uint8_t | compute_uo_crc (const struct rohc_comp_rfc3095_ctxt *rfc3095_ctxt, const struct net_pkt *const uncomp_pkt, const rohc_crc_type_t crc_type, const uint8_t crc_init, const uint8_t *const crc_table) |
Compute the CRC for a UO* packet. More... | |
static void | update_context (struct rohc_comp_ctxt *const context, const struct net_pkt *const uncomp_pkt) |
Update the compression context with the successfully compressed packet. More... | |
static void | update_context_ip_hdr (struct ip_header_info *const ip_flags, const struct ip_packet *const ip) |
Update the IP information with the IP header. More... | |
static bool | rohc_comp_rfc3095_detect_changes (struct rohc_comp_ctxt *const context, const struct net_pkt *const uncomp_pkt) |
Detect changes between packet and context. More... | |
static int | changed_static_both_hdr (struct rohc_comp_ctxt *const context, const struct net_pkt *const uncomp_pkt) |
Check if the static parts of the context changed in any of the two IP headers. More... | |
static int | changed_static_one_hdr (struct rohc_comp_ctxt *const context, const unsigned short changed_fields, struct ip_header_info *const header_info) |
Check if the static part of the context changed in the new IP packet. More... | |
static int | changed_dynamic_both_hdr (struct rohc_comp_ctxt *const context, const struct net_pkt *const uncomp_pkt) |
Check if the dynamic parts of the context changed in any of the two IP headers. More... | |
static int | changed_dynamic_one_hdr (struct rohc_comp_ctxt *const context, const unsigned short changed_fields, struct ip_header_info *const header_info, const struct ip_packet *const ip) |
Check if the dynamic part of the context changed in the IP packet. More... | |
static unsigned short | detect_changed_fields (const struct rohc_comp_ctxt *const context, struct ip_header_info *const header_info, const struct ip_packet *const ip) |
Find the IP fields that changed between the profile and a new IP packet. More... | |
static bool | is_field_changed (const unsigned short changed_fields, const unsigned short check_field) |
Check if a specified IP field has changed. More... | |
static void | detect_ip_id_behaviours (struct rohc_comp_ctxt *const context, const struct net_pkt *const uncomp_pkt) |
Detect the behaviour of the IP-ID fields of the IPv4 headers. More... | |
static void | detect_ip_id_behaviour (const struct rohc_comp_ctxt *const context, struct ip_header_info *const header_info, const struct ip_packet *const ip) |
Detect the behaviour of the IP-ID field of the given IPv4 header. More... | |
static bool | encode_uncomp_fields (struct rohc_comp_ctxt *const context, const struct net_pkt *const uncomp_pkt) |
Encode uncompressed fields with the corresponding encoding scheme. More... | |
static void | rohc_get_innermost_ipv4_non_rnd (const struct rohc_comp_ctxt *const context, ip_header_pos_t *const pos, size_t *const nr_bits, uint16_t *const offset) |
Determine the number of IP-ID bits and the IP-ID offset of the innermost IPv4 header with non-random IP-ID. More... | |
static void | rohc_comp_rfc3095_get_ext3_I_flags (const struct rohc_comp_ctxt *const context, const struct net_pkt *const uncomp_pkt, const rohc_packet_t packet_type, const size_t nr_ip_id_bits, const size_t nr_ip_id_bits2, ip_header_pos_t *const innermost_ipv4_non_rnd, uint8_t *const I, uint8_t *const I2) |
Determine the values of the I and I2 flags for UO* extension 3. More... | |
static bool | rohc_comp_rfc3095_feedback_2 (struct rohc_comp_ctxt *const context, 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-2 is received. More... | |
static void | rohc_comp_rfc3095_feedback_ack (struct rohc_comp_ctxt *const context, const uint32_t sn_bits, const size_t sn_bits_nr, const bool sn_not_valid) |
Perform the required actions after the reception of a positive ACK. More... | |
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... | |
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... | |
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... | |
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... | |
Generic framework for RFC3095-based compression profiles such as IP-only, UDP, UDP-Lite, ESP, and RTP profiles.
#define MOD_ERROR 0x0008 |
A flag to indicate that an errror occurred
#define MOD_IPV6_EXT_LIST_CONTENT 0x0004 |
A flag to indicate that the content of the IPv6 extension headers list changed in IP header
#define MOD_IPV6_EXT_LIST_STRUCT 0x0002 |
A flag to indicate that the structure of the IPv6 extension headers list changed in IP header
#define MOD_PROTOCOL 0x0020 |
A flag to indicate that the IPv4 Protocol field changed in IP header
#define MOD_TOS 0x0001 |
A flag to indicate that IPv4 Type Of Service field changed in IP header
#define MOD_TTL 0x0010 |
A flag to indicate that IPv4 Time To Live field changed in IP header
|
static |
Initialize all temporary variables stored in the context.
tmp_vars | The temporary variables to initialize |
|
static |
Check if the dynamic parts of the context changed in any of the two IP headers.
context | The compression context |
uncomp_pkt | The uncompressed packet |
|
static |
Check if the dynamic part of the context changed in the IP packet.
The fields classified as CHANGING by RFC need to be checked for change. The fields are:
The IP-ID changes are managed outside of this function.
Although classified as STATIC, the IPv4 Don't Fragment flag is not part of the static initialization, but of the dynamic initialization. It needs to be checked for change.
Other flags are checked for change for IPv4. There are IP-ID related flags:
context | The compression context |
changed_fields | The fields that changed, created by the function changed_fields |
header_info | The header info stored in the profile |
ip | The header of the new IP packet |
|
static |
Check if the static parts of the context changed in any of the two IP headers.
context | The compression context |
uncomp_pkt | The uncompressed packet |
|
static |
Check if the static part of the context changed in the new IP packet.
The fields classified as STATIC-DEF by RFC do not need to be checked for change. These fields are constant for all packets in a stream (ie. a profile context). So, the Source Address and Destination Address fields are not checked for change for both IPv4 and IPv6. The Flow Label is not checked for IPv6.
Although not classified as STATIC-DEF, the Version field is the same for all packets in a stream (ie. a profile context) and therefore does not need to be checked for change neither for IPv4 nor IPv6.
Although classified as STATIC, the IPv4 Don't Fragment flag is not part of the static initialization, but of the dynamic initialization.
Summary:
context | The compression context |
changed_fields | The fields that changed, created by the function changed_fields |
header_info | The header info stored in the profile |
|
static |
Build the extension 0 of the UO-2 packet.
Extension 0 for non-RTP profiles (5.11.4): +---+---+---+---+---+---+---+---+ 1 | 0 0 | SN | IP-ID | +---+---+---+---+---+---+---+---+ Extension 0 for RTP profile (5.7.5): +---+---+---+---+---+---+---+---+ 1 | 0 0 | SN | +T | +---+---+---+---+---+---+---+---+ if T = 0 -> +T = IP-ID -> -T = TS if T = 1 -> +T = TS -> -T = IP-ID no T bit -> +T = -T = TS
context | The compression context |
dest | The rohc-packet-under-build buffer |
counter | The current position in the rohc-packet-under-build buffer |
|
static |
Build the extension 1 of the UO-2 packet.
Extension 1 for non-RTP profiles (5.11.4): +---+---+---+---+---+---+---+---+ 1 | 0 1 | SN | IP-ID | +---+---+---+---+---+---+---+---+ 2 | IP-ID | +---+---+---+---+---+---+---+---+ Extension 1 for RTP profile (5.7.5): +---+---+---+---+---+---+---+---+ 1 | 0 1 | SN | +T | +---+---+---+---+---+---+---+---+ 2 | -T | +---+---+---+---+---+---+---+---+ if T = 0 -> +T = IP-ID -> -T = TS if T = 1 -> +T = TS -> -T = IP-ID no T bit -> +T = -T = TS
context | The compression context |
dest | The rohc-packet-under-build buffer |
counter | The current position in the rohc-packet-under-build buffer |
|
static |
Build the extension 2 of the UO-2 packet.
Extension 2 for non-RTP profiles (5.11.4): +---+---+---+---+---+---+---+---+ 1 | 1 0 | SN | IP-ID2 | +---+---+---+---+---+---+---+---+ 2 | IP-ID2 | +---+---+---+---+---+---+---+---+ 3 | IP-ID | +---+---+---+---+---+---+---+---+ IP-ID2 is for outer IP-ID field Extension 2 for RTP profile (5.7.5): +---+---+---+---+---+---+---+---+ 1 | 1 0 | SN | +T | +---+---+---+---+---+---+---+---+ 2 | +T | +---+---+---+---+---+---+---+---+ 3 | -T | +---+---+---+---+---+---+---+---+ if T = 0 -> +T = IP-ID -> -T = TS if T = 1 -> +T = TS -> -T = IP-ID no T bit -> +T = -T = TS
context | The compression context |
dest | The rohc-packet-under-build buffer |
counter | The current position in the rohc-packet-under-build buffer |
|
static |
Build the extension 3 of the UO-2 packet.
Extension 3 for non-RTP profiles (5.7.5 & 5.11.4): 0 1 2 3 4 5 6 7 +-----+-----+-----+-----+-----+-----+-----+-----+ 1 | 1 1 | S | Mode | I | ip | ip2 | +-----+-----+-----+-----+-----+-----+-----+-----+ 2 | Inner IP header flags | | if ip = 1 +-----+-----+-----+-----+-----+-----+-----+-----+ 3 | Outer IP header flags | if ip2 = 1 +-----+-----+-----+-----+-----+-----+-----+-----+ 4 | SN | if S = 1 +-----+-----+-----+-----+-----+-----+-----+-----+ | | 5 / Inner IP header fields / variable, | | if ip = 1 +-----+-----+-----+-----+-----+-----+-----+-----+ 6 | IP-ID | 2 octets, if I = 1 +-----+-----+-----+-----+-----+-----+-----+-----+ | | 7 / Outer IP header fields / variable, | | if ip2 = 1 +-----+-----+-----+-----+-----+-----+-----+-----+
context | The compression context |
uncomp_pkt | The uncompressed packet to encode |
dest | The rohc-packet-under-build buffer |
counter | The current position in the rohc-packet-under-build buffer |
|
static |
Build the extension 3 of the UO* packet types.
context | The compression context |
uncomp_pkt | The uncompressed packet to encode |
dest | The rohc-packet-under-build buffer |
counter | The current position in the rohc-packet-under-build buffer |
|
static |
Build the extension 3 of the UO-2 packet.
Extension 3 for RTP profile (5.7.5): 0 1 2 3 4 5 6 7 +-----+-----+-----+-----+-----+-----+-----+-----+ 1 | 1 1 | S |R-TS | Tsc | I | ip | rtp | +-----+-----+-----+-----+-----+-----+-----+-----+ 2 | Inner IP header flags | ip2 | if ip = 1 +-----+-----+-----+-----+-----+-----+-----+-----+ 3 | Outer IP header flags | if ip2 = 1 +-----+-----+-----+-----+-----+-----+-----+-----+ 4 | SN | if S = 1 +-----+-----+-----+-----+-----+-----+-----+-----+ | | 5 / TS / 1-4 octets, if R-TS = 1 | | +-----+-----+-----+-----+-----+-----+-----+-----+ | | 6 / Inner IP header fields / variable, | | if ip = 1 +-----+-----+-----+-----+-----+-----+-----+-----+ 7 | IP-ID | 2 octets, if I = 1 +-----+-----+-----+-----+-----+-----+-----+-----+ | | 8 / Outer IP header fields / variable, | | if ip2 = 1 +-----+-----+-----+-----+-----+-----+-----+-----+ | | variable, 9 / RTP Header flags and fields / if rtp = 1 | | +-----+-----+-----+-----+-----+-----+-----+-----+
context | The compression context |
uncomp_pkt | The uncompressed packet to encode |
dest | The rohc-packet-under-build buffer |
counter | The current position in the rohc-packet-under-build buffer |
|
static |
Build the IPv4 dynamic part of the IR and IR-DYN packets.
Dynamic part IPv4 (5.7.7.4): +---+---+---+---+---+---+---+---+ 1 | Type of Service | +---+---+---+---+---+---+---+---+ 2 | Time to Live | +---+---+---+---+---+---+---+---+ 3 / Identification / 2 octets, sent verbatim +---+---+---+---+---+---+---+---+ 4 | DF|RND|NBO|SID| 0 | +---+---+---+---+---+---+---+---+ 5 / Generic extension header list / variable length +---+---+---+---+---+---+---+---+
context | The compression context |
header_info | The IP header info stored in the profile |
ip | The IPv4 header the dynamic part is built for |
dest | The rohc-packet-under-build buffer |
counter | The current position in the rohc-packet-under-build buffer |
|
static |
Build the IPv4 static part of the IR packet.
Static part IPv4 (5.7.7.4): +---+---+---+---+---+---+---+---+ 1 | Version = 4 | 0 | +---+---+---+---+---+---+---+---+ 2 | Protocol | +---+---+---+---+---+---+---+---+ 3 / Source Address / 4 octets +---+---+---+---+---+---+---+---+ 4 / Destination Address / 4 octets +---+---+---+---+---+---+---+---+
context | The compression context |
header_info | The IP header info stored in the profile |
ip | The IPv4 header the static part is built for |
dest | The rohc-packet-under-build buffer |
counter | The current position in the rohc-packet-under-build buffer |
|
static |
Build the IPv6 dynamic part of the IR and IR-DYN packets.
Dynamic part IPv6 (5.7.7.3): +---+---+---+---+---+---+---+---+ 1 | Traffic Class | 1 octet +---+---+---+---+---+---+---+---+ 2 | Hop Limit | 1 octet +---+---+---+---+---+---+---+---+ 3 / Generic extension header list / variable length +---+---+---+---+---+---+---+---+
context | The compression context |
hdr_pos | The position of the IP header: 1 for the outer header or 2 for the inner IP header |
header_info | The IP header info stored in the profile |
ip | The IPv6 header the dynamic part is built for |
dest | The rohc-packet-under-build buffer |
counter | The current position in the rohc-packet-under-build buffer |
|
static |
Build the IPv6 static part of the IR packet.
Static part IPv6 (5.7.7.3): +---+---+---+---+---+---+---+---+ 1 | Version = 6 |Flow Label(msb)| 1 octet +---+---+---+---+---+---+---+---+ 2 / Flow Label (lsb) / 2 octets +---+---+---+---+---+---+---+---+ 3 | Next Header | 1 octet +---+---+---+---+---+---+---+---+ 4 / Source Address / 16 octets +---+---+---+---+---+---+---+---+ 5 / Destination Address / 16 octets +---+---+---+---+---+---+---+---+
context | The compression context |
header_info | The IP header info stored in the profile |
ip | The IPv6 header the static part is built for |
dest | The rohc-packet-under-build buffer |
counter | The current position in the rohc-packet-under-build buffer |
|
static |
Build the IR-DYN packet.
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 nor ESP +---+---+---+---+---+---+---+---+ : : / Payload / variable length : : - - - - - - - - - - - - - - - -
context | The compression context |
uncomp_pkt | The uncompressed packet to encode |
rohc_pkt | OUT: The ROHC packet |
rohc_pkt_max_len | The maximum length of the ROHC packet |
|
static |
Build the IR packet.
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 nor ESP +---+---+---+---+---+---+---+---+ | | | Payload | variable length | | - - - - - - - - - - - - - - - -
context | The compression context |
uncomp_pkt | The uncompressed packet to encode |
rohc_pkt | OUT: The ROHC packet |
rohc_pkt_max_len | The maximum length of the ROHC packet |
|
static |
Build the ROHC packet to send.
context | The compression context |
uncomp_pkt | The uncompressed packet to encode |
rohc_pkt | OUT: The ROHC packet |
rohc_pkt_max_len | The maximum length of the ROHC packet |
|
static |
Build the UO-0 packet.
0 1 2 3 4 5 6 7 --- --- --- --- --- --- --- --- 1 : Add-CID octet : +---+---+---+---+---+---+---+---+ 2 | first octet of base header | +---+---+---+---+---+---+---+---+ : : 3 / 0, 1, or 2 octets of CID / : : +---+---+---+---+---+---+---+---+ UO-0 (5.7.1) 0 1 2 3 4 5 6 7 +---+---+---+---+---+---+---+---+ 2 | 0 | SN | CRC | +===+===+===+===+===+===+===+===+
context | The compression context |
uncomp_pkt | The uncompressed packet to encode |
rohc_pkt | OUT: The ROHC packet |
rohc_pkt_max_len | The maximum length of the ROHC packet |
|
static |
Build the UO-2 packet.
0 1 2 3 4 5 6 7 --- --- --- --- --- --- --- --- 1 : Add-CID octet : +---+---+---+---+---+---+---+---+ 2 | first octet of base header | +---+---+---+---+---+---+---+---+ : : 3 / 0, 1, or 2 octets of CID / : : +---+---+---+---+---+---+---+---+ UOR-2 (5.11.3): 0 1 2 3 4 5 6 7 +---+---+---+---+---+---+---+---+ 2 | 1 1 0 | SN | +===+===+===+===+===+===+===+===+ 5 | X | CRC | +---+---+---+---+---+---+---+---+ UOR-2-RTP (5.7.4): 0 1 2 3 4 5 6 7 +---+---+---+---+---+---+---+---+ 2 | 1 1 0 | TS | +===+===+===+===+===+===+===+===+ 4 | TS| M | SN | +---+---+---+---+---+---+---+---+ 5 | X | CRC | +---+---+---+---+---+---+---+---+ UOR-2-TS (5.7.4): 0 1 2 3 4 5 6 7 +---+---+---+---+---+---+---+---+ 2 | 1 1 0 | TS | +===+===+===+===+===+===+===+===+ 4 |T=1| M | SN | +---+---+---+---+---+---+---+---+ 5 | X | CRC | +---+---+---+---+---+---+---+---+ UOR-2-ID (5.7.4): 0 1 2 3 4 5 6 7 +---+---+---+---+---+---+---+---+ 2 | 1 1 0 | IP-ID | +===+===+===+===+===+===+===+===+ 4 |T=0| M | SN | +---+---+---+---+---+---+---+---+ 5 | X | CRC | +---+---+---+---+---+---+---+---+ +---+---+---+---+---+---+---+---+ : : 6 / Extension / : : --- --- --- --- --- --- --- --- X: X = 0 indicates that no extension is present; X = 1 indicates that an extension is present. T: T = 0 indicates format UOR-2-ID; T = 1 indicates format UOR-2-TS.
context | The compression context |
uncomp_pkt | The uncompressed packet to encode |
rohc_pkt | OUT: The ROHC packet |
rohc_pkt_max_len | The maximum length of the ROHC packet |
|
static |
Build the tail of the UO packet.
The general format for the UO packets is: 0 1 2 3 4 5 6 7 --- --- --- --- --- --- --- --- 1 : Add-CID octet : | +---+---+---+---+---+---+---+---+ | 2 | first octet of base header | | +---+---+---+---+---+---+---+---+ | : : | 3 / 0, 1, or 2 octets of CID / | : : | +---+---+---+---+---+---+---+---+ | 4 / remainder of base header / | +---+---+---+---+---+---+---+---+ | : : | 5 / Extension / | : : | --- --- --- --- --- --- --- --- | : : | 6 + IP-ID of outer IPv4 header + : : (see section 5.7 or [RFC-3095]) --- --- --- --- --- --- --- --- 7 / AH data for outer list / | --- --- --- --- --- --- --- --- | : : | 8 + GRE checksum + | : : | --- --- --- --- --- --- --- --- | : : | 9 + IP-ID of inner IPv4 header + | : : | --- --- --- --- --- --- --- --- | 10 / AH data for inner list / | --- --- --- --- --- --- --- --- | : : | 11 + GRE checksum + | : : | --- --- --- --- --- --- --- --- : List of : 12 / Dynamic chains / variable, given by static chain : for additional IP headers : (includes no SN) --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- : : RTP/UDP profiles only [RFC-3095] 13 + UDP Checksum + 2 octets, : : if context(UDP Checksum) != 0 --- --- --- --- --- --- --- ---
Parts 7, 8, 10, 11 and 12 are not supported. Parts 1, 2, 3, 4 and 5 are built in packet-specific functions. Parts 6 and 9 are built in this function. Part 13 is built in profile-specific function.
context | The compression context |
uncomp_pkt | The uncompressed packet to encode |
dest | The rohc-packet-under-build buffer |
counter | The current position in the rohc-packet-under-build buffer |
|
static |
Code some fields of the UOR-2 packet.
This function is called by code_UO2_packet. It should not be called directly.
UOR-2 (5.11.3): 0 1 2 3 4 5 6 7 +---+---+---+---+---+---+---+---+ 2 | 1 1 0 | SN | +===+===+===+===+===+===+===+===+ 5 | X | CRC | +---+---+---+---+---+---+---+---+
context | The compression context |
extension | The extension that will be appended to the packet |
f_byte | IN/OUT: The first byte of the UOR-2 packet |
s_byte | IN/OUT: Not used by the UOR-2 packet |
t_byte | IN/OUT: The second byte of the UOR-2 packet |
|
static |
Code some fields of the UOR-2-ID packet.
This function is called by code_UO2_packet. It should not be called directly.
UOR-2-ID (5.7.4): 0 1 2 3 4 5 6 7 +---+---+---+---+---+---+---+---+ 2 | 1 1 0 | IP-ID | +===+===+===+===+===+===+===+===+ 4 |T=0| M | SN | +---+---+---+---+---+---+---+---+ 5 | X | CRC | +---+---+---+---+---+---+---+---+
context | The compression context |
extension | The extension that will be appended to the packet |
f_byte | IN/OUT: The first byte of the UOR-2-ID packet |
s_byte | IN/OUT: The second byte of the UOR-2-ID packet |
t_byte | IN/OUT: The third byte of the UOR-2-ID packet |
|
static |
Code some fields of the UOR-2-RTP packet.
This function is called by code_UO2_packet. It should not be called directly.
UOR-2-RTP (5.7.4): 0 1 2 3 4 5 6 7 +---+---+---+---+---+---+---+---+ 2 | 1 1 0 | TS | +===+===+===+===+===+===+===+===+ 4 | TS| M | SN | +---+---+---+---+---+---+---+---+ 5 | X | CRC | +---+---+---+---+---+---+---+---+
context | The compression context |
extension | The extension that will be appended to the packet |
f_byte | IN/OUT: The first byte of the UOR-2-RTP packet |
s_byte | IN/OUT: The second byte of the UOR-2-RTP packet |
t_byte | IN/OUT: The third byte of the UOR-2-RTP packet |
|
static |
Code some fields of the UOR-2-TS packet.
This function is called by code_UO2_packet. It should not be called directly.
UOR-2-TS (5.7.4): 0 1 2 3 4 5 6 7 +---+---+---+---+---+---+---+---+ 2 | 1 1 0 | TS | +===+===+===+===+===+===+===+===+ 4 |T=1| M | SN | +---+---+---+---+---+---+---+---+ 5 | X | CRC | +---+---+---+---+---+---+---+---+
context | The compression context |
extension | The extension that will be appended to the packet |
f_byte | IN/OUT: The first byte of the UOR-2-TS packet |
s_byte | IN/OUT: The second byte of the UOR-2-TS packet |
t_byte | IN/OUT: The third byte of the UOR-2-TS packet |
|
static |
Compute the CRC for a UO* packet.
rfc3095_ctxt | The generic compression context |
uncomp_pkt | The uncompressed packet to encode |
crc_type | The type of CRC to compute |
crc_init | The initial value of the CRC |
crc_table | The table of pre-computed CRC |
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.
context | The compression context |
|
static |
Decide what extension shall be used in the UO-1-ID packet.
Extensions 0, 1 & 2 are IPv4 only because of the IP-ID.
context | The compression context |
nr_innermost_ip_id_bits | The number of IP-ID bits of the innermost IPv4 header |
nr_outermost_ip_id_bits | The number of IP-ID bits of the outermost IPv4 header |
|
static |
Decide what extension shall be used in the UOR-2 packet (non-RTP).
Extensions 0, 1 & 2 are IPv4 only because of the IP-ID.
context | The compression context |
nr_innermost_ip_id_bits | The number of IP-ID bits of the innermost IPv4 header |
nr_outermost_ip_id_bits | The number of IP-ID bits of the outermost IPv4 header |
|
static |
Decide what extension shall be used in the UOR-2-ID packet.
Extensions 0, 1 & 2 are IPv4 only because of the IP-ID.
context | The compression context |
nr_innermost_ip_id_bits | The number of IP-ID bits of the innermost IPv4 header |
nr_outermost_ip_id_bits | The number of IP-ID bits of the outermost IPv4 header |
|
static |
Decide what extension shall be used in the UOR-2 packet (RTP).
Extensions 0, 1 & 2 are IPv4 only because of the IP-ID.
context | The compression context |
nr_innermost_ip_id_bits | The number of IP-ID bits of the innermost IPv4 header |
nr_outermost_ip_id_bits | The number of IP-ID bits of the outermost IPv4 header |
|
static |
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.
context | The compression context |
nr_innermost_ip_id_bits | The number of IP-ID bits of the innermost IPv4 header |
nr_outermost_ip_id_bits | The number of IP-ID bits of the outermost IPv4 header |
|
static |
Decide which packet to send when in the different states.
In IR state, IR packets are used. In FO and SO, the profile-specific functions are called if they are defined, otherwise IR packets are used.
context | The compression context |
|
static |
Find the IP fields that changed between the profile and a new IP packet.
Only some fields are checked for change in the compression process, so only check these ones to avoid useless work. The fields to check are: TOS/TC, TTL/HL and Protocol/Next Header.
context | The compression context |
header_info | The header info stored in the profile |
ip | The header of the new IP packet |
|
static |
Detect the behaviour of the IP-ID field of the given IPv4 header.
Detect how the IP-ID field behave:
context | The compression context |
header_info | The header info stored in the profile |
ip | One IPv4 header |
|
static |
Detect the behaviour of the IP-ID fields of the IPv4 headers.
Detect how the IP-ID fields behave:
context | The compression context |
uncomp_pkt | The uncompressed packet |
|
static |
Encode uncompressed fields with the corresponding encoding scheme.
context | The compression context |
uncomp_pkt | The uncompressed packet to encode |
|
static |
Build inner or outer IP header fields.
This function is used to code the IP header fields of the extension 3 of the UO-2 packet. The function is called twice (one for inner IP header and one for outer IP header) with different arguments.
+-----+-----+-----+-----+-----+-----+-----+-----+ 1 | Type of Service/Traffic Class | if TOS = 1 ..... ..... ..... ..... ..... ..... ..... ..... 2 | Time to Live/Hop Limit | if TTL = 1 ..... ..... ..... ..... ..... ..... ..... ..... 3 | Protocol/Next Header | if PR = 1 ..... ..... ..... ..... ..... ..... ..... ..... 4 / IP extension headers / variable, if IPX = 1 ..... ..... ..... ..... ..... ..... ..... ..... For outer IP-ID: ..... ..... ..... ..... ..... ..... ..... ..... 5 | IP-ID | 2 octets, ..... ..... ..... ..... ..... ..... ..... ..... if I2 = 1
Part 4 is not supported.
context | The compression context |
header_info | The header info stored in the profile |
changed_f | The fields that changed, created by the function changed_fields |
ip | One inner or outer IP header |
I | The I flag of the IP header |
ip_hdr_pos | The position of the IP header |
dest | The rohc-packet-under-build buffer |
counter | The current position in the rohc-packet-under-build buffer |
|
static |
Build inner or outer IP header flags.
This function is used to code the IP header fields of the extension 3 of the UO-2 packet. The function is called twice (one for inner IP header and one for outer IP header) with different arguments.
Header flags for IP and UDP profiles (5.11.4): For inner flags: +-----+-----+-----+-----+-----+-----+-----+-----+ 1 | Inner IP header flags | | if ip = 1 | TOS | TTL | DF | PR | IPX | NBO | RND | ip2 | ip2 = 0 if non-RTP +-----+-----+-----+-----+-----+-----+-----+-----+ or for outer flags: +-----+-----+-----+-----+-----+-----+-----+-----+ 2 | Outer IP header flags | | TOS2| TTL2| DF2 | PR2 |IPX2 |NBO2 |RND2 | I2 | if ip2 = 1 +-----+-----+-----+-----+-----+-----+-----+-----+
context | The compression context |
header_info | The header info stored in the profile |
changed_f | The fields that changed, created by the function changed_fields |
ip | One inner or outer IP header |
ip2_or_I2 | Whether the ip2 (inner, RTP only) or I2 (outer) flag is set or not |
dest | The rohc-packet-under-build buffer |
counter | The current position in the rohc-packet-under-build buffer |
|
static |
Reset the given IP header info.
header_info | The IP header info to reset |
|
static |
Initialize the IP header info stored in the context.
header_info | The IP header info to initialize |
ip | The IP header |
list_trans_nr | The number of uncompressed transmissions for list compression (L) |
wlsb_window_width | The width of the W-LSB sliding window for IPv4 IP-ID (must be > 0) |
trace_cb | The function to call for printing traces |
trace_cb_priv | An optional private context, may be NULL |
profile_id | The ID of the associated compression profile |
|
static |
Check if a specified IP field has changed.
changed_fields | The fields that changed, created by the function changed_fields |
check_field | The field for which to check a change |
|
static |
Build the dynamic part of one IP header for the IR/IR-DYN packets.
context | The compression context |
hdr_pos | The position of the IP header: 1 for the outer header or 2 for the inner IP header |
header_info | The IP header info stored in the profile |
ip | The IP header the dynamic part is built for |
dest | The rohc-packet-under-build buffer |
counter | The current position in the rohc-packet-under-build buffer |
|
static |
Build the dynamic part of the IR and IR-DYN packets.
context | The compression context |
uncomp_pkt | The uncompressed packet to encode |
rohc_pkt | The rohc-packet-under-build buffer |
counter | The current position in the rohc-packet-under-build buffer |
|
static |
Build the static part of one IP header for the IR packet.
context | The compression context |
header_info | The IP header info stored in the profile |
ip | The IP header the static part is built for |
dest | The rohc-packet-under-build buffer |
counter | The current position in the rohc-packet-under-build buffer |
|
static |
Build the static part of the IR packet.
context | The compression context |
uncomp_pkt | The uncompressed packet to encode |
rohc_pkt | The rohc-packet-under-build buffer |
counter | The current position in the rohc-packet-under-build buffer |
|
static |
Build the UO-1 packet for the non-RTP profiles.
The UO-1 packet type cannot be used if there is no IPv4 header in the context or if value(RND) and value(RND2) are both 1.
0 1 2 3 4 5 6 7 --- --- --- --- --- --- --- --- 1 : Add-CID octet : +---+---+---+---+---+---+---+---+ 2 | first octet of base header | +---+---+---+---+---+---+---+---+ : : 3 / 0, 1, or 2 octets of CID / : : +---+---+---+---+---+---+---+---+ UO-1 (5.11.3): 0 1 2 3 4 5 6 7 +---+---+---+---+---+---+---+---+ 2 | 1 0 | IP-ID | +===+===+===+===+===+===+===+===+ 4 | SN | CRC | +---+---+---+---+---+---+---+---+
context | The compression context | |
uncomp_pkt | The uncompressed packet to encode | |
[out] | rohc_pkt | The ROHC packet |
rohc_pkt_max_len | The maximum length of the ROHC packet |
|
static |
Build the UO-1-ID packet.
The UO-1-ID packet type cannot be used if there is no IPv4 header in the context or if value(RND) and value(RND2) are both 1.
0 1 2 3 4 5 6 7 --- --- --- --- --- --- --- --- 1 : Add-CID octet : +---+---+---+---+---+---+---+---+ 2 | first octet of base header | +---+---+---+---+---+---+---+---+ : : 3 / 0, 1, or 2 octets of CID / : : +---+---+---+---+---+---+---+---+ UO-1-ID (5.7.3): 0 1 2 3 4 5 6 7 +---+---+---+---+---+---+---+---+ 2 | 1 0 |T=0| IP-ID | +===+===+===+===+===+===+===+===+ 4 | X | SN | CRC | +---+---+---+---+---+---+---+---+ X: X = 0 indicates that no extension is present; X = 1 indicates that an extension is present. T: T = 0 indicates format UO-1-ID; T = 1 indicates format UO-1-TS.
context | The compression context | |
uncomp_pkt | The uncompressed packet to encode | |
[out] | rohc_pkt | The ROHC packet |
rohc_pkt_max_len | The maximum length of the ROHC packet |
|
static |
Build the UO-1 packet for the RTP profiles.
The UO-1 packet type cannot be used if there is no IPv4 header in the context or if value(RND) and value(RND2) are both 1.
0 1 2 3 4 5 6 7 --- --- --- --- --- --- --- --- 1 : Add-CID octet : +---+---+---+---+---+---+---+---+ 2 | first octet of base header | +---+---+---+---+---+---+---+---+ : : 3 / 0, 1, or 2 octets of CID / : : +---+---+---+---+---+---+---+---+ UO-1 (5.7.3): 0 1 2 3 4 5 6 7 +---+---+---+---+---+---+---+---+ 2 | 1 0 | TS | +===+===+===+===+===+===+===+===+ 4 | M | SN | CRC | +---+---+---+---+---+---+---+---+
context | The compression context | |
uncomp_pkt | The uncompressed packet to encode | |
[out] | rohc_pkt | The ROHC packet |
rohc_pkt_max_len | The maximum length of the ROHC packet |
|
static |
Build the UO-1-TS packet.
0 1 2 3 4 5 6 7 --- --- --- --- --- --- --- --- 1 : Add-CID octet : +---+---+---+---+---+---+---+---+ 2 | first octet of base header | +---+---+---+---+---+---+---+---+ : : 3 / 0, 1, or 2 octets of CID / : : +---+---+---+---+---+---+---+---+ UO-1-TS (5.7.3): 0 1 2 3 4 5 6 7 +---+---+---+---+---+---+---+---+ 2 | 1 0 |T=1| TS | +===+===+===+===+===+===+===+===+ 4 | M | SN | CRC | +---+---+---+---+---+---+---+---+ T: T = 0 indicates format UO-1-ID; T = 1 indicates format UO-1-TS.
context | The compression context | |
uncomp_pkt | The uncompressed packet to encode | |
[out] | rohc_pkt | The ROHC packet |
rohc_pkt_max_len | The maximum length of the ROHC packet |
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:
This function is one of the functions that must exist in one profile for the framework to work.
comp | The ROHC compressor |
packet | The packet to check |
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.
context | The compression context |
sn_shift | The shift parameter (p) to use for encoding SN with W-LSB |
packet | The packet given to initialize the new context |
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:
context | The 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.
context | The compression context |
|
static |
Detect changes between packet and context.
context | The compression context to compare |
uncomp_pkt | The uncompressed packet to compare |
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.
context | The compression context |
uncomp_pkt | The uncompressed packet to encode |
rohc_pkt | OUT: The ROHC packet |
rohc_pkt_max_len | The maximum length of the ROHC packet |
packet_type | OUT: The type of ROHC packet that is created |
payload_offset | OUT: The offset for the payload in the IP packet |
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.
context | The compression context |
feedback_type | The feedback type |
packet | The whole feedback packet with CID bits |
packet_len | The length of the whole feedback packet with CID bits |
feedback_data | The feedback data without the CID bits |
feedback_data_len | The length of the feedback data without the CID bits |
|
static |
Update the profile when FEEDBACK-2 is received.
context | The compression context |
packet | The whole feedback packet with CID bits |
packet_len | The length of the whole feedback packet with CID bits |
feedback_data | The feedback data without the CID bits |
feedback_data_len | The length of the feedback data without the CID bits |
|
static |
Perform the required actions after the reception of a positive ACK.
context | The compression context that received a positive ACK |
sn_bits | The LSB bits of the acknowledged SN |
sn_bits_nr | The number of LSB bits of the acknowledged SN |
sn_not_valid | Whether the received SN may be considered as valid or not |
|
static |
Determine the values of the I and I2 flags for UO* extension 3.
context | The compression context | |
uncomp_pkt | The uncompressed packet to encode | |
packet_type | The type of packet that is being built | |
nr_ip_id_bits | The number of IP-ID bits for the first IP header | |
nr_ip_id_bits2 | The number of IP-ID bits for the second IP header (if any) | |
[out] | innermost_ipv4_non_rnd | The position of the innermost IPv4 header with a non-random IP-ID field |
[out] | I | The value of the I flag in UO extension 3, ie. whether the innermost IPv4 header with a non-random IP-ID needs to transmit some IP-ID bits |
[out] | I2 | The value of the I2 flag in UO extension 3, ie. whether the 2nd innermost IPv4 header with a non-random IP-ID needs to transmit some IP-ID bits |
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?
rfc3095_ctxt | The compression context |
bits_nr | The base number of SN bits |
add_bits_nr | The additional number of SN bits |
|
static |
Determine the number of IP-ID bits and the IP-ID offset of the innermost IPv4 header with non-random IP-ID.
context | The compression context |
pos | OUT: The position of the header |
nr_bits | OUT: the number of IP-ID bits of the found header |
offset | OUT: the IP-ID offset of the found header |
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.
context | The compression context |
nr_innermost_bits | OUT: the maximum number of IP-ID bits for the innermost IPv4 header |
nr_outermost_bits | OUT: the maximum number of IP-ID bits for the outermost IP header |
|
static |
|
static |
Update the compression context with the successfully compressed packet.
context | The compression context to update |
uncomp_pkt | The uncompressed packet that updates the context |
|
static |
Update the IP information with the IP header.
ip_flags | The IP context to update |
ip | The uncompressed IP header that updates the context |