c_rtp.c File Reference

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

#include "c_rtp.h"
#include "c_udp.h"
#include "rohc_traces_internal.h"
#include "rohc_packets.h"
#include "rohc_utils.h"
#include "sdvl.h"
#include "crc.h"
#include <stdlib.h>
#include <string.h>
#include <assert.h>
Include dependency graph for c_rtp.c:

Functions

static bool c_rtp_create (struct rohc_comp_ctxt *const context, const struct net_pkt *const packet)
 Create a new RTP context and initialize it thanks to the given IP/UDP/RTP packet.
static void c_rtp_destroy (struct rohc_comp_ctxt *const context)
 Destroy the RTP context.
static bool c_rtp_check_profile (const struct rohc_comp *const comp, const struct net_pkt *const packet)
 Check if the given packet corresponds to the RTP profile.
static bool c_rtp_check_context (const struct rohc_comp_ctxt *const context, const struct net_pkt *const packet)
 Check if the IP/UDP/RTP packet belongs to the context.
static int c_rtp_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/UDP/RTP packet according to a pattern decided by several different factors.
static void rtp_decide_state (struct rohc_comp_ctxt *const context)
 Decide the state that should be used for the next packet compressed with the ROHC RTP profile.
static rohc_packet_t c_rtp_decide_FO_packet (const struct rohc_comp_ctxt *context)
 Decide which packet to send when in First Order (FO) state.
static rohc_packet_t c_rtp_decide_SO_packet (const struct rohc_comp_ctxt *context)
 Decide which packet to send when in Second Order (SO) state.
static rohc_ext_t c_rtp_decide_extension (const struct rohc_comp_ctxt *context)
 Decide what extension shall be used in the UO-1/UO-2 packet.
static uint32_t c_rtp_get_next_sn (const struct rohc_comp_ctxt *const context, const struct net_pkt *const uncomp_pkt)
 Determine the SN value for the next packet.
static bool rtp_encode_uncomp_fields (struct rohc_comp_ctxt *const context, const struct net_pkt *const uncomp_pkt)
 Encode uncompressed RTP fields.
static size_t rtp_code_static_rtp_part (const struct rohc_comp_ctxt *const context, const uint8_t *const next_header, uint8_t *const dest, const size_t counter)
 Build the static part of the UDP/RTP headers.
static size_t rtp_code_dynamic_rtp_part (const struct rohc_comp_ctxt *const context, const uint8_t *const next_header, uint8_t *const dest, const size_t counter)
 Build the dynamic part of the UDP/RTP headers.
static int rtp_changed_rtp_dynamic (const struct rohc_comp_ctxt *const context, const struct udphdr *const udp, const struct rtphdr *const rtp)
 Check if the dynamic part of the UDP/RTP headers changed.

Variables

struct rohc_comp_profile c_rtp_profile
 Define the compression part of the RTP profile as described in the RFC 3095.

Detailed Description

ROHC compression context for the RTP profile.

Author:
David Moreau from TAS
Didier Barvaux <didier.barvaux@toulouse.viveris.com>
Didier Barvaux <didier@barvaux.org>

Function Documentation

static bool c_rtp_check_context ( const struct rohc_comp_ctxt *const   context,
const struct net_pkt *const   packet 
) [static]

Check if the IP/UDP/RTP 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
  • the SSRC field of the RTP header must match the one in the context

All the context but the last one are done by the c_udp_check_context() function.

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

Parameters:
context The compression context
packet The IP/UDP/RTP packet to check
Returns:
true if the IP/UDP/RTP packet belongs to the context false if it does not belong to the context
See also:
c_udp_check_context
static bool c_rtp_check_profile ( const struct rohc_comp *const   comp,
const struct net_pkt *const   packet 
) [static]

Check if the given packet corresponds to the RTP profile.

Conditions are:

  • the transport protocol is UDP
  • the version of the outer IP header is 4 or 6
  • 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, the inner IP header is not an IP fragment
  • the inner IP payload is at least 8-byte long for UDP header
  • the UDP Length field and the UDP payload match
  • the UDP payload is at least 12-byte long for RTP header
  • the UDP ports are in the list of RTP ports or the user-defined RTP callback function detected one RTP packet
See also:
c_udp_check_profile

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

Parameters:
comp The ROHC compressor
packet The 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
static bool c_rtp_create ( struct rohc_comp_ctxt *const   context,
const struct net_pkt *const   packet 
) [static]

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

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

Parameters:
context The compression context
packet The IP/UDP/RTP packet given to initialize the new context
Returns:
true if successful, false otherwise
static rohc_ext_t c_rtp_decide_extension ( const struct rohc_comp_ctxt context  )  [static]

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

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

Parameters:
context The compression context
Returns:
The extension code among ROHC_EXT_NO, ROHC_EXT_0, ROHC_EXT_1 and ROHC_EXT_3 if successful, ROHC_EXT_UNKNOWN otherwise
static rohc_packet_t c_rtp_decide_FO_packet ( const struct rohc_comp_ctxt context  )  [static]

Decide which packet to send when in First Order (FO) state.

Packets that can be used are the IR-DYN and UO-2 packets.

See also:
decide_packet
Parameters:
context The compression context
Returns:
The packet type among:
  • ROHC_PACKET_UOR_2_RTP
  • ROHC_PACKET_UOR_2_TS
  • ROHC_PACKET_UOR_2_ID
  • ROHC_PACKET_IR_DYN
static rohc_packet_t c_rtp_decide_SO_packet ( const struct rohc_comp_ctxt context  )  [static]

Decide which packet to send when in Second Order (SO) state.

Packets that can be used are the UO-0, UO-1 and UO-2 (with or without extensions) packets.

See also:
decide_packet
Parameters:
context The compression context
Returns:
The packet type among:
  • ROHC_PACKET_UO_0
  • ROHC_PACKET_UO_1_RTP
  • ROHC_PACKET_UO_1_TS
  • ROHC_PACKET_UO_1_ID
  • ROHC_PACKET_UOR_2_RTP
  • ROHC_PACKET_UOR_2_TS
  • ROHC_PACKET_UOR_2_ID
  • ROHC_PACKET_IR_DYN
static void c_rtp_destroy ( struct rohc_comp_ctxt *const   context  )  [static]

Destroy the RTP context.

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

Parameters:
context The RTP compression context to destroy
static int c_rtp_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 
) [static]

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

Parameters:
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
Returns:
The length of the ROHC packet if successful, -1 otherwise
static uint32_t c_rtp_get_next_sn ( const struct rohc_comp_ctxt *const   context,
const struct net_pkt *const   uncomp_pkt 
) [static]

Determine the SN value for the next packet.

Profile SN is the 16-bit RTP SN.

Parameters:
context The compression context
uncomp_pkt The uncompressed packet to encode
Returns:
The SN
static int rtp_changed_rtp_dynamic ( const struct rohc_comp_ctxt *const   context,
const struct udphdr *const   udp,
const struct rtphdr *const   rtp 
) [static]

Check if the dynamic part of the UDP/RTP headers changed.

Parameters:
context The compression context
udp The UDP header
rtp The RTP header
Returns:
The number of UDP/RTP fields that changed
static size_t rtp_code_dynamic_rtp_part ( const struct rohc_comp_ctxt *const   context,
const uint8_t *const   next_header,
uint8_t *const   dest,
const size_t  counter 
) [static]

Build the dynamic part of the UDP/RTP headers.


 Dynamic part of UDP header (5.7.7.5):

    +---+---+---+---+---+---+---+---+
 1  /           Checksum            /   2 octets
    +---+---+---+---+---+---+---+---+

 Dynamic part of RTP header (5.7.7.6):

    +---+---+---+---+---+---+---+---+
 2  |  V=2  | P | RX|      CC       |  (RX is NOT the RTP X bit)
    +---+---+---+---+---+---+---+---+
 3  | M |            PT             |
    +---+---+---+---+---+---+---+---+
 4  /      RTP Sequence Number      /  2 octets
    +---+---+---+---+---+---+---+---+
 5  /   RTP Timestamp (absolute)    /  4 octets
    +---+---+---+---+---+---+---+---+
 6  /      Generic CSRC list        /  variable length
    +---+---+---+---+---+---+---+---+
 7  : Reserved  | X |  Mode |TIS|TSS:  if RX = 1
    +---+---+---+---+---+---+---+---+
 8  :         TS_Stride             :  1-4 octets, if TSS = 1
    +---+---+---+---+---+---+---+---+
 9  :         Time_Stride           :  1-4 octets, if TIS = 1
    +---+---+---+---+---+---+---+---+

Parts 6 & 9 are not supported yet. The TIS flag in part 7 is not supported.

Parameters:
context The compression context
next_header The UDP/RTP headers
dest The rohc-packet-under-build buffer
counter The current position in the rohc-packet-under-build buffer
Returns:
The new position in the rohc-packet-under-build buffer
static size_t rtp_code_static_rtp_part ( const struct rohc_comp_ctxt *const   context,
const uint8_t *const   next_header,
uint8_t *const   dest,
const size_t  counter 
) [static]

Build the static part of the UDP/RTP headers.


 Static part of UDP header (5.7.7.5):

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

 Static part of RTP header (5.7.7.6):

    +---+---+---+---+---+---+---+---+
 3  /             SSRC              /   4 octets
    +---+---+---+---+---+---+---+---+

Parts 1 & 2 are done by the udp_code_static_udp_part() function. Part 3 is done by this function.

Parameters:
context The compression context
next_header The UDP/RTP headers
dest The rohc-packet-under-build buffer
counter The current position in the rohc-packet-under-build buffer
Returns:
The new position in the rohc-packet-under-build buffer
See also:
udp_code_static_udp_part
static void rtp_decide_state ( struct rohc_comp_ctxt *const   context  )  [static]

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

The three states are:

  • Initialization and Refresh (IR),
  • First Order (FO),
  • Second Order (SO).
Parameters:
context The compression context
static bool rtp_encode_uncomp_fields ( struct rohc_comp_ctxt *const   context,
const struct net_pkt *const   uncomp_pkt 
) [static]

Encode uncompressed RTP fields.

Handle the RTP TS field.

Parameters:
context The compression context
uncomp_pkt The uncompressed packet to encode
Returns:
true in case of success, false otherwise

Variable Documentation

Initial value:
{
        .id             = ROHC_PROFILE_RTP, 
        .protocol       = ROHC_IPPROTO_UDP, 
        .create         = c_rtp_create,     
        .destroy        = c_rtp_destroy,
        .check_profile  = c_rtp_check_profile,
        .check_context  = c_rtp_check_context,
        .encode         = c_rtp_encode,
        .reinit_context = rohc_comp_reinit_context,
        .feedback       = rohc_comp_rfc3095_feedback,
}

Define the compression part of the RTP profile as described in the RFC 3095.


Generated on 4 Jul 2018 for ROHC compression/decompression library by  doxygen 1.6.1