draft-ietf-rohc-rfc3095bis-rohcv2-profiles-01.txt   draft-ietf-rohc-rfc3095bis-rohcv2-profiles-02.txt 
Robust Header Compression G. Pelletier Robust Header Compression G. Pelletier
Internet-Draft K. Sandlund Internet-Draft K. Sandlund
Expires: November 26, 2007 Ericsson Intended status: Standards Track Ericsson
May 25, 2007 Expires: April 4, 2008 October 2, 2007
RObust Header Compression Version 2 (RoHCv2): Profiles for RTP, UDP, IP, RObust Header Compression Version 2 (ROHCv2): Profiles for RTP, UDP, IP,
ESP and UDP Lite ESP and UDP Lite
draft-ietf-rohc-rfc3095bis-rohcv2-profiles-01 draft-ietf-rohc-rfc3095bis-rohcv2-profiles-02
Status of this Memo Status of this Memo
By submitting this Internet-Draft, each author represents that any By submitting this Internet-Draft, each author represents that any
applicable patent or other IPR claims of which he or she is aware applicable patent or other IPR claims of which he or she is aware
have been or will be disclosed, and any of which he or she becomes have been or will be disclosed, and any of which he or she becomes
aware will be disclosed, in accordance with Section 6 of BCP 79. aware will be disclosed, in accordance with Section 6 of BCP 79.
Internet-Drafts are working documents of the Internet Engineering Internet-Drafts are working documents of the Internet Engineering
Task Force (IETF), its areas, and its working groups. Note that Task Force (IETF), its areas, and its working groups. Note that
skipping to change at page 1, line 35 skipping to change at page 1, line 35
and may be updated, replaced, or obsoleted by other documents at any and may be updated, replaced, or obsoleted by other documents at any
time. It is inappropriate to use Internet-Drafts as reference time. It is inappropriate to use Internet-Drafts as reference
material or to cite them other than as "work in progress." material or to cite them other than as "work in progress."
The list of current Internet-Drafts can be accessed at The list of current Internet-Drafts can be accessed at
http://www.ietf.org/ietf/1id-abstracts.txt. http://www.ietf.org/ietf/1id-abstracts.txt.
The list of Internet-Draft Shadow Directories can be accessed at The list of Internet-Draft Shadow Directories can be accessed at
http://www.ietf.org/shadow.html. http://www.ietf.org/shadow.html.
This Internet-Draft will expire on November 26, 2007. This Internet-Draft will expire on April 4, 2008.
Copyright Notice Copyright Notice
Copyright (C) The IETF Trust (2007). Copyright (C) The IETF Trust (2007).
Abstract Abstract
This document specifies ROHC (Robust Header Compression) profiles This document specifies ROHC (Robust Header Compression) profiles
that efficiently compress RTP/UDP/IP (Real-Time Transport Protocol, that efficiently compress RTP/UDP/IP (Real-Time Transport Protocol,
User Datagram Protocol, Internet Protocol), RTP/UDP-Lite/IP (User User Datagram Protocol, Internet Protocol), RTP/UDP-Lite/IP (User
Datagram Protocol Lite), UDP/IP, UDP-Lite/IP, IP and ESP/IP Datagram Protocol Lite), UDP/IP, UDP-Lite/IP, IP and ESP/IP
(Encapsulating Security Payload) headers. (Encapsulating Security Payload) headers.
This specification defines a second version of the profiles found in This specification defines a second version of the profiles found in
RFC 3095, RFC 3843 and RFC 4019; it supersedes their definition, but RFC 3095, RFC 3843 and RFC 4019; it supersedes their definition, but
does not obsolete them. does not obsolete them.
The RoHCv2 profiles introduce a number of simplifications to the The ROHCv2 profiles introduce a number of simplifications to the
rules and algorithms that govern the behavior of the compression rules and algorithms that govern the behavior of the compression
endpoints. It also defines robustness mechanisms that may be used by endpoints. It also defines robustness mechanisms that may be used by
a compressor implementation to increase the probability of a compressor implementation to increase the probability of
decompression success when packets can be lost and/or reordered on decompression success when packets can be lost and/or reordered on
the ROHC channel. Finally, the RoHCv2 profiles define its own the ROHC channel. Finally, the ROHCv2 profiles define its own
specific set of packet formats, using the ROHC formal notation. specific set of packet formats, using the ROHC formal notation.
Table of Contents Table of Contents
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 5 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4
2. Terminology . . . . . . . . . . . . . . . . . . . . . . . . . 5 2. Terminology . . . . . . . . . . . . . . . . . . . . . . . . . 4
3. Acronyms . . . . . . . . . . . . . . . . . . . . . . . . . . 7 3. Acronyms . . . . . . . . . . . . . . . . . . . . . . . . . . 6
4. Background (Informative) . . . . . . . . . . . . . . . . . . 7 4. Background (Informative) . . . . . . . . . . . . . . . . . . 7
4.1. Classification of header fields . . . . . . . . . . . . . 7 4.1. Classification of header fields . . . . . . . . . . . . . 7
4.2. Operational Characteristics of RoHCv2 Profiles . . . . . 8 4.2. Improvements of ROHCv2 over RFC3095 profiles . . . . . . 8
5. Overview of the RoHCv2 Profiles (Informative) . . . . . . . . 9 4.3. Operational Characteristics of ROHCv2 Profiles . . . . . 10
5.1. General Concepts . . . . . . . . . . . . . . . . . . . . 9 5. Overview of the ROHCv2 Profiles (Informative) . . . . . . . . 10
5.1.1. Control Fields and Context Updates . . . . . . . . . 9 5.1. Compressor Concepts . . . . . . . . . . . . . . . . . . . 11
5.2. Compressor Concepts . . . . . . . . . . . . . . . . . . . 10 5.1.1. Optimistic Approach . . . . . . . . . . . . . . . . . 11
5.2.1. Optimistic Approach . . . . . . . . . . . . . . . . . 10 5.1.2. Tradeoff between robustness to losses and to
5.2.2. Tradeoff between robustness to losses and to reordering . . . . . . . . . . . . . . . . . . . . . 11
reordering . . . . . . . . . . . . . . . . . . . . . 10 5.1.3. Interactions with the Decompressor Context . . . . . 13
5.2.3. Interactions with the Decompressor Context . . . . . 12 5.2. Decompressor Concepts . . . . . . . . . . . . . . . . . . 14
5.3. Decompressor Concepts . . . . . . . . . . . . . . . . . . 13 5.2.1. Decompressor State Machine . . . . . . . . . . . . . 14
5.3.1. Decompressor State Machine . . . . . . . . . . . . . 13 5.2.2. Decompressor Context Management . . . . . . . . . . . 17
5.3.2. Decompressor Context Management . . . . . . . . . . . 16 5.2.3. Feedback logic . . . . . . . . . . . . . . . . . . . 19
5.3.3. Feedback logic . . . . . . . . . . . . . . . . . . . 17 6. ROHCv2 Profiles (Normative) . . . . . . . . . . . . . . . . . 19
6. RoHCv2 Profiles (Normative) . . . . . . . . . . . . . . . . . 18 6.1. Channel Parameters, Segmentation and Reordering . . . . . 19
6.1. Profile Operation, per-context . . . . . . . . . . . . . 18 6.2. Profile Operation, per-context . . . . . . . . . . . . . 19
6.2. Control Fields . . . . . . . . . . . . . . . . . . . . . 19 6.3. Control Fields . . . . . . . . . . . . . . . . . . . . . 20
6.2.1. Master Sequence Number (MSN) . . . . . . . . . . . . 19 6.3.1. Master Sequence Number (MSN) . . . . . . . . . . . . 21
6.2.2. IP-ID behavior . . . . . . . . . . . . . . . . . . . 20 6.3.2. Reordering Ratio . . . . . . . . . . . . . . . . . . 21
6.3. Reconstruction and Verification . . . . . . . . . . . . . 20 6.3.3. IP-ID behavior . . . . . . . . . . . . . . . . . . . 21
6.4. Reordering and Segmentation . . . . . . . . . . . . . . . 20 6.3.4. UDP-Lite Coverage Behavior . . . . . . . . . . . . . 22
6.4.1. Optimistic Approach . . . . . . . . . . . . . . . . . 21 6.3.5. Timestamp Stride . . . . . . . . . . . . . . . . . . 22
6.5. Compressed Header Chains . . . . . . . . . . . . . . . . 21 6.3.6. Time Stride . . . . . . . . . . . . . . . . . . . . . 22
6.6. Packet Formats and Encoding Methods . . . . . . . . . . . 22 6.3.7. CRC-3 for Control Fields . . . . . . . . . . . . . . 22
6.6.1. baseheader_extension_headers . . . . . . . . . . . . 22 6.4. Reconstruction and Verification . . . . . . . . . . . . . 23
6.6.2. baseheader_outer_headers . . . . . . . . . . . . . . 23 6.5. Compressed Header Chains . . . . . . . . . . . . . . . . 23
6.6.3. inferred_udp_length . . . . . . . . . . . . . . . . . 23 6.6. Packet Formats and Encoding Methods . . . . . . . . . . . 25
6.6.4. inferred_ip_v4_header_checksum . . . . . . . . . . . 23 6.6.1. baseheader_extension_headers . . . . . . . . . . . . 25
6.6.5. inferred_mine_header_checksum . . . . . . . . . . . . 24 6.6.2. baseheader_outer_headers . . . . . . . . . . . . . . 25
6.6.6. inferred_ip_v4_length . . . . . . . . . . . . . . . . 24 6.6.3. inferred_udp_length . . . . . . . . . . . . . . . . . 25
6.6.7. inferred_ip_v6_length . . . . . . . . . . . . . . . . 25 6.6.4. inferred_ip_v4_header_checksum . . . . . . . . . . . 26
6.6.8. Scaled RTP Timestamp Encoding . . . . . . . . . . . . 25 6.6.5. inferred_mine_header_checksum . . . . . . . . . . . . 26
6.6.9. Timer-Based RTP Timestamp Encoding . . . . . . . . . 26 6.6.6. inferred_ip_v4_length . . . . . . . . . . . . . . . . 27
6.6.10. inferred_scaled_field . . . . . . . . . . . . . . . . 26 6.6.7. inferred_ip_v6_length . . . . . . . . . . . . . . . . 27
6.6.11. control_crc3_encoding . . . . . . . . . . . . . . . . 27 6.6.8. Scaled RTP Timestamp Encoding . . . . . . . . . . . . 28
6.6.12. inferred_sequential_ip_id . . . . . . . . . . . . . . 28 6.6.9. timer_based_lsb . . . . . . . . . . . . . . . . . . . 29
6.6.13. list_csrc(cc_value) . . . . . . . . . . . . . . . . . 28 6.6.10. inferred_scaled_field . . . . . . . . . . . . . . . . 30
6.7. Encoding Methods With External Parameters . . . . . . . . 32 6.6.11. control_crc3_encoding . . . . . . . . . . . . . . . . 31
6.8. Packet Formats . . . . . . . . . . . . . . . . . . . . . 36 6.6.12. inferred_sequential_ip_id . . . . . . . . . . . . . . 32
6.8.1. Initialization and Refresh Packet (IR) . . . . . . . 36 6.6.13. list_csrc(cc_value) . . . . . . . . . . . . . . . . . 32
6.8.2. IR Packet Payload Discard (IR-PD) . . . . . . . . . 37 6.7. Encoding Methods With External Parameters . . . . . . . . 36
6.8.3. Compressed Packet Formats (CO) . . . . . . . . . . . 38 6.8. Packet Formats . . . . . . . . . . . . . . . . . . . . . 39
6.9. Feedback Formats and Options . . . . . . . . . . . . . . 100 6.8.1. Initialization and Refresh Packet (IR) . . . . . . . 39
6.9.1. Feedback Formats . . . . . . . . . . . . . . . . . . 100 6.8.2. Compressed Packet Formats (CO) . . . . . . . . . . . 40
6.9. Feedback Formats and Options . . . . . . . . . . . . . . 99
6.9.1. Feedback Formats . . . . . . . . . . . . . . . . . . 99
6.9.2. Feedback Options . . . . . . . . . . . . . . . . . . 101 6.9.2. Feedback Options . . . . . . . . . . . . . . . . . . 101
7. Security Considerations . . . . . . . . . . . . . . . . . . . 104 7. Security Considerations . . . . . . . . . . . . . . . . . . . 103
8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 104 8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 103
9. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 106 9. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 104
10. References . . . . . . . . . . . . . . . . . . . . . . . . . 106 10. References . . . . . . . . . . . . . . . . . . . . . . . . . 105
10.1. Normative References . . . . . . . . . . . . . . . . . . 106 10.1. Normative References . . . . . . . . . . . . . . . . . . 105
10.2. Informative References . . . . . . . . . . . . . . . . . 107 10.2. Informative References . . . . . . . . . . . . . . . . . 106
Appendix A. Detailed classification of header fields . . . . 107 Appendix A. Detailed classification of header fields . . . . . 106
Appendix A.1. General classification . . . . . . . . . . . . . 108 Appendix A.1. IPv4 Header Fields . . . . . . . . . . . . . . . . 107
Appendix A.1.1. IPv4 header fields . . . . . . . . . . . . . . . 108 Appendix A.2. IPv6 Header Fields . . . . . . . . . . . . . . . . 109
Appendix A.1.2. IPv6 header fields . . . . . . . . . . . . . . . 110 Appendix A.3. UDP Header Fields . . . . . . . . . . . . . . . . 111
Appendix A.1.3. UDP header fields . . . . . . . . . . . . . . . 111 Appendix A.4. UDP-Lite Header Fields . . . . . . . . . . . . . . 111
Appendix A.1.4. UDP-Lite header fields . . . . . . . . . . . . . 111 Appendix A.5. RTP Header Fields . . . . . . . . . . . . . . . . 112
Appendix A.1.5. RTP header fields . . . . . . . . . . . . . . . 112 Appendix A.6. ESP Header Fields . . . . . . . . . . . . . . . . 114
Appendix A.1.6. ESP header fields . . . . . . . . . . . . . . . 113 Appendix A.7. IPv6 Extension Header Fields . . . . . . . . . . . 114
Appendix A.2. Analysis of change patterns of header fields . . 113 Appendix A.8. GRE Header Fields . . . . . . . . . . . . . . . . 115
Appendix A.2.1. IPv4 Identification . . . . . . . . . . . . . . 116 Appendix A.9. MINE Header Fields . . . . . . . . . . . . . . . . 116
Appendix A.2.2. IP Traffic Class / Type-Of-Service . . . . . . . 117 Appendix A.10. AH Header Fields . . . . . . . . . . . . . . . . . 117
Appendix A.2.3. IP Hop-limit / Time-To-Live . . . . . . . . . . 117 Appendix B. Compressor Implementation Guidelines . . . . . . . 117
Appendix A.2.4. IPv4 Don't Fragment . . . . . . . . . . . . . . 117 Appendix B.1. Reference Management . . . . . . . . . . . . . . . 118
Appendix A.2.5. UDP Checksum . . . . . . . . . . . . . . . . . . 117 Appendix B.2. Window-based LSB Encoding (W-LSB) . . . . . . . . 118
Appendix A.2.6. UDP-Lite Checksum Coverage . . . . . . . . . . . 117 Appendix B.3. W-LSB Encoding and Timer-based Compression . . . . 118
Appendix A.2.7. UDP-Lite Checksum . . . . . . . . . . . . . . . 117 Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 119
Appendix A.2.8. RTP CSRC Counter . . . . . . . . . . . . . . . . 117 Intellectual Property and Copyright Statements . . . . . . . . . 120
Appendix A.2.9. RTP Marker . . . . . . . . . . . . . . . . . . . 118
Appendix A.2.10. RTP Padding . . . . . . . . . . . . . . . . . . 118
Appendix A.2.11. RTP Extension . . . . . . . . . . . . . . . . . 118
Appendix A.2.12. RTP Payload Type . . . . . . . . . . . . . . . . 118
Appendix A.2.13. RTP Sequence Number . . . . . . . . . . . . . . 118
Appendix A.2.14. RTP Timestamp . . . . . . . . . . . . . . . . . 118
Appendix A.2.15. RTP Contributing Sources (CSRC) . . . . . . . . 119
Appendix A.2.16. ESP Sequence Number . . . . . . . . . . . . . . 119
Appendix B. Differences between RoHCv2 and RFC3095
profiles . . . . . . . . . . . . . . . . . . . . 119
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 120
Intellectual Property and Copyright Statements . . . . . . . . . 121
1. Introduction 1. Introduction
The ROHC WG has developed a header compression framework on top of The ROHC WG has developed a header compression framework on top of
which various profiles can be defined for different protocol sets or which various profiles can be defined for different protocol sets or
compression requirements. The ROHC framework was first documented in compression requirements. The ROHC framework was first documented in
[RFC3095], together with profiles for compression of RTP/UDP/IP [RFC3095], together with profiles for compression of RTP/UDP/IP
(Real-Time Transport Protocol, User Datagram Protocol, Internet (Real-Time Transport Protocol, User Datagram Protocol, Internet
Protocol), UDP/IP, IP and ESP/IP (Encapsulating Security Payload) Protocol), UDP/IP, IP and ESP/IP (Encapsulating Security Payload)
headers. Additional profiles for compression of IP headers [RFC3843] headers. Additional profiles for compression of IP headers [RFC3843]
and UDP-Lite (User Datagram Protocol Lite) headers [RFC4019] were and UDP-Lite (User Datagram Protocol Lite) headers [RFC4019] were
later specified to complete the initial set of ROHC profiles. later specified to complete the initial set of ROHC profiles.
This document defines an updated version for each of the above This document defines an updated version for each of the above
mentioned profiles, and its definition is based on the specification mentioned profiles, and its definition is based on the specification
of the RoHC framework as found in of the ROHC framework as found in [RFC4995].
[I-D.ietf-rohc-rfc3095bis-framework].
Specifically, this document defines header compression schemes for: Specifically, this document defines header compression schemes for:
o RTP/UDP/IP : profile 0x0101 o RTP/UDP/IP : profile 0x0101
o UDP/IP : profile 0x0102 o UDP/IP : profile 0x0102
o ESP/IP : profile 0x0103 o ESP/IP : profile 0x0103
o IP : profile 0x0104 o IP : profile 0x0104
o RTP/UDP-Lite/IP : profile 0x0107 o RTP/UDP-Lite/IP : profile 0x0107
o UDP-Lite/IP : profile 0x0108 o UDP-Lite/IP : profile 0x0108
ROHCv2 compresses the following type of extension headers: ROHCv2 compresses the following type of extension headers:
o AH [RFC4302] o AH [RFC4302]
o GRE [RFC2784][RFC2890] o GRE [RFC2784][RFC2890]
o MINE [RFC2004] o MINE [RFC2004]
o NULL-encrupted ESP [RFC4303] o NULL-encrypted ESP [RFC4303]
o IPv6 Destination Options header[RFC2460] o IPv6 Destination Options header[RFC2460]
o IPv6 Hop-by-hop Options header[RFC2460] o IPv6 Hop-by-hop Options header[RFC2460]
o IPv6 Routing header [RFC2460]. o IPv6 Routing header [RFC2460].
2. Terminology 2. Terminology
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
"SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
document are to be interpreted as described in RFC 2119 [RFC2119]. document are to be interpreted as described in RFC 2119 [RFC2119].
This document is consistent with the terminology found in the ROHC This document is consistent with the terminology found in the ROHC
framework [I-D.ietf-rohc-rfc3095bis-framework] and in the formal framework [RFC4995] and in the formal notation for ROHC [RFC4997].
notation for ROHC [I-D.ietf-rohc-formal-notation]. In addition, this In addition, this document uses or defines the following terms:
document uses or defines the following terms:
Acknowledgment Number
The Acknowledgment Number identifies what packet is being
acknowledged in the RoHCv2 feedback element. The value of this
field normally corresponds to the Master Sequence Number (MSN) of
the header that was last successfully decompressed, for the
compression context (CID) for which the feedback information
applies.
Chaining of Items Chaining of Items
A chain groups fields based on similar characteristics. ROHCv2 A chain of items groups fields based on similar characteristics.
defines chain items for static, dynamic and irregular fields. ROHCv2 defines chain items for static, dynamic and irregular
Chaining is done by appending an item for e.g. each header to the fields. Chaining is achieved by appending to the chain an item
chain in their order of appearance in the uncompressed packet. for e.g. each header in their order of appearance in the
Chaining is useful to construct compressed headers from an uncompressed packet. Chaining is useful to construct compressed
arbitrary number of any of the protocol headers for which a ROHCv2 headers from an arbitrary number of any of the protocol headers
profile defines a compressed format. for which a ROHCv2 profile defines a compressed format.
CRC-3 Control Validation
The CRC-3 control validation refers to the validation of the
control fields when receiving a CO header that contains a 3-bit
CRC calculated over the control fields that it carries and over
specific control fields in the context. In the formal definition
of the header formats, the 3-bit CRC is labelled "control_crc3"
and uses the "control_crc3_encoding" (See also Section 6.6.11).
Delta Delta
The delta refers to the difference in terms of the absolute value The delta refers to the difference in the absolute value of a
of a field between two consecutive packets and processed by the field between two consecutive packets being processed by the same
same compression endpoint. compression endpoint.
Reordering Depth Reordering Depth
The number of packets by which a packet made late in its sequence. The number of packets by which a packet is received late within
See definition of sequentially late packet below. its sequence due to reordering between the compressor and the
decompressor, i.e. reordering between packets associated with the
same context (CID). See definition of sequentially late packet
below.
ROHCv2 packet types ROHCv2 Packet Types
ROHCv2 profiles use two different packet types: the Initialization ROHCv2 profiles use two different packet types: the Initialization
and Refresh (IR) packet type, and the Compressed packet type (CO). and Refresh (IR) packet type, and the Compressed (CO) packet type.
Sequentially early packet
Sequentially Early Packet
A packet that reaches the decompressor before one or several A packet that reaches the decompressor before one or several
packets that were delayed over the channel, whereas all of the packets that were delayed over the channel, whereas all of the
said packets belong to the same header-compressed flow and are said packets belong to the same header-compressed flow and are
associated to the same compression context (CID). At the time of associated to the same compression context (CID). At the time of
the arrival of a sequentially early packet, the packet(s) delayed the arrival of a sequentially early packet, the packet(s) delayed
on the link cannot be differentiated from lost packet(s). on the link cannot be differentiated from lost packet(s).
Sequentially late packet Sequentially Late Packet
A packet is late within its sequence if it reaches the A packet is late within its sequence if it reaches the
decompressor after one or several other packets belonging to the decompressor after one or several other packets belonging to the
same CID have been received, although the sequentially late packet same CID have been received, although the sequentially late packet
was sent from the compressor before the other packet(s). was sent from the compressor before the other packet(s). How the
decompressor detects a sequentially late packet is outside the
scope of this specification, but it can for example use the MSN to
this purpose.
Timestamp stride (ts_stride) Timestamp Stride (ts_stride)
The timestamp stride (TS_STRIDE) is the expected increase in the
The timestamp stride (ts_stride) is the expected increase in the
timestamp value between two RTP packets with consecutive sequence timestamp value between two RTP packets with consecutive sequence
numbers. numbers. For example, for a media encoding with a sample rate of
8 kHz producing one frame every 20ms, the RTP timestamp will
typically increase by n * 160 (= 8000 * 0.02), for some integer n.
Time Stride (time_stride)
The time stride (time_stride) is the time interval equivalent to
one ts_stride, e.g., 20 ms in the example for the RTP timestamp
increment above.
3. Acronyms 3. Acronyms
This section lists most acronyms used for reference, in addition to This section lists most acronyms used for reference, in addition to
those defined in [I-D.ietf-rohc-rfc3095bis-framework]. those defined in [RFC4995].
AH Authentication Header. AH Authentication Header.
ESP Encapsulating Security Payload. ESP Encapsulating Security Payload.
GRE Generic Routing Encapsulation. RFC 2784, RFC 2890. GRE Generic Routing Encapsulation.
IC Initial Context state (decompressor) FC Full Context state (decompressor).
FC Full Context state (decompressor)
IP Internet Protocol. IP Internet Protocol.
LSB Least Significant Bits. LSB Least Significant Bits.
MINE Minimal Encapsulation in IP MINE Minimal Encapsulation in IP.
MSB Most Significant Bits. MSB Most Significant Bits.
MSN Master Sequence Number. MSN Master Sequence Number.
NC No Context state (decompressor). NC No Context state (decompressor).
OA Optimistic Approach. OA Optimistic Approach.
ROHCv2 Set of header compression profiles defined in this document RC Repair Context state (decompressor).
ROHC Header compression framework (RFC4995).
ROHCv2 Set of header compression profiles defined in this document.
RTP Real-time Transport Protocol. RTP Real-time Transport Protocol.
SSRC Synchronization source. Field in RTP header. SSRC Synchronization source. Field in RTP header.
CSRC Contributing source. Optional list of CSRCs in RTP header. CSRC Contributing source. Optional list of CSRCs in RTP header.
TC Traffic Class. Octet in IPv6 header. See also TOS. TC Traffic Class. Octet in IPv6 header. See also TOS.
TOS Type Of Service. Octet in IPv4 header. See also TC. TOS Type Of Service. Octet in IPv4 header. See also TC.
TS RTP Timestamp. TS RTP Timestamp.
UDP User Datagram Protocol. UDP User Datagram Protocol.
UDP-Lite User Datagram Protocol Lite. UDP-Lite User Datagram Protocol Lite.
4. Background (Informative) 4. Background (Informative)
This section provides background information on the compression This section provides background information on the compression
profiles defined in this document. The fundamentals of general profiles defined in this document. The fundamentals of general
header compression and of the ROHC framework may be found in section header compression and of the ROHC framework may be found in section
3 and 4 of [I-D.ietf-rohc-rfc3095bis-framework], respectively. The 3 and 4 of [RFC4995], respectively. The fundamentals of the formal
fundamentals of the formal notation for ROHC are defined in notation for ROHC are defined in [RFC4997]. [RFC4224] describes the
[I-D.ietf-rohc-formal-notation]. [RFC4224] describes the impacts of impacts of out-of-order delivery on profiles based on [RFC3095].
out-of-order delivery on profiles based on [RFC3095].
4.1. Classification of header fields 4.1. Classification of header fields
Section 3.1 of [I-D.ietf-rohc-rfc3095bis-framework] explains that Section 3.1 of [RFC4995] explains that header compression is possible
header compression is possible due to the fact that there is much due to the fact that there is much redundancy between field values
redundancy between field values within the headers of a packet, but within the headers of a packet, but especially between the headers of
especially between the headers of consecutive packets. consecutive packets.
Appendix A lists and classifies in detail all the header fields Appendix A lists and classifies in detail all the header fields
relevant to this document. The appendix concludes with relevant to this document. The appendix concludes with
recommendations on how the various fields should be handled by header recommendations on how the various fields should be handled by header
compression algorithms. compression algorithms.
The main conclusion is that most of the header fields can easily be The main conclusion is that most of the header fields can easily be
compressed away since they never or seldom change. A small number of compressed away since they never or seldom change. A small number of
fields however need more sophisticated mechanisms. fields however need more sophisticated mechanisms.
skipping to change at page 8, line 44 skipping to change at page 8, line 34
receiving end without violating its end-to-end properties, and is receiving end without violating its end-to-end properties, and is
thus sent as-is when enabled (mandatory with IPv6). The same applies thus sent as-is when enabled (mandatory with IPv6). The same applies
to the UDP-Lite Checksum (mandatory with both IPv4 and IPv6), while to the UDP-Lite Checksum (mandatory with both IPv4 and IPv6), while
the UDP-Lite Checksum Coverage may in some cases be compressible. the UDP-Lite Checksum Coverage may in some cases be compressible.
For IPv4, a similar correlation as the one of the RTP TS to the RTP For IPv4, a similar correlation as the one of the RTP TS to the RTP
SN is often observed between the Identifier field (IP-ID) and the SN is often observed between the Identifier field (IP-ID) and the
master sequence number used for compression (e.g. the RTP SN when master sequence number used for compression (e.g. the RTP SN when
compressing RTP headers). compressing RTP headers).
4.2. Operational Characteristics of RoHCv2 Profiles 4.2. Improvements of ROHCv2 over RFC3095 profiles
The ROHCv2 profiles can achieve compression efficiency and robustness
that are both at least equivalent to RFC3095 profiles, when used
under the same operating conditions. In particular, the size and bit
layout of the smallest compressed header (i.e. PT-0 format U/O-0 in
RFC3095, and pt_0_crc3 in ROHCv2) are identical.
There are a number of differences and improvements between profiles
defined in this document and their earlier version defined in RFC3095
[RFC3095]. This section provides an overview of some of the most
significant improvements:
Tolerance to reordering
Profiles defined in RFC3095 require that the channel between
compressor and decompressor provide in-order delivery between
compression endpoints. ROHCv2 profiles, however, can handle
robustly and efficiently a limited amount of reordering before and
after the compression point as part of the compression algorithm
itself.
Operational logic
Profiles in RFC3095 define multiple operational modes, each with
different updating logic and compressed header formats. ROHCv2
profiles operate in unidirectional operation until feedback is
first received for a context (CID), at which point bidirectional
is used; the formats are independent of what operational logic is
used.
IP extension header
Profiles in RFC3095 compressed IP Extension headers using list
compression. ROHCv2 profiles instead treat extension headers in
the same manner as other protocol headers, i.e. using the chaining
mechanism; it thus assumes that extension header are not added or
removed during the lifetime of a context (CID), otherwise
compression has to be restarted for this flow.
IP encapsulation
Profiles in RFC3095 can compress at most two levels of IP headers.
ROHCv2 profiles can compress an arbitrary number of IP headers.
List compression
ROHCv2 profiles does not support reference-based list compression.
Robustness and repairs
ROHCv2 profiles do not define a format for the IR-DYN packet;
instead, each profile defines a compressed header that can be used
to perform a more robust context repair using a 7-bit CRC
verification. This also implies that only the IR header can
change the association between a CID and the profile it uses.
Feedback
ROHCv2 profiles define a CRC in the format of the FEEDBACK-2, and
different feedback options are available.
4.3. Operational Characteristics of ROHCv2 Profiles
Robust header compression can be used over many type of link Robust header compression can be used over many type of link
technologies. Section 4.4 of [I-D.ietf-rohc-rfc3095bis-framework] technologies. Section 4.4 of [RFC4995] lists the operational
lists the operational characteristics of the ROHC channel. The characteristics of the ROHC channel. The ROHCv2 profiles address a
RoHCv2 profiles address a wide range of applications, and this wide range of applications, and this section summarizes some of the
section summarizes some of the operational characteristics that are operational characteristics that are specific to these profiles.
specific to these profiles.
Packet length Packet length
ROHCv2 profiles assume that the lower layer indicates the length ROHCv2 profiles assume that the lower layer indicates the length
of a compressed packet. ROHCv2 compressed headers do not contain of a compressed packet. ROHCv2 compressed headers do not contain
length information for the payload. length information for the payload.
Out-of-order delivery between compression endpoints Out-of-order delivery between compression endpoints
The definition of the RoHCv2 profiles places no strict requirement The definition of the ROHCv2 profiles places no strict requirement
on the delivery sequence between the compression endpoints, i.e. on the delivery sequence between the compression endpoints, i.e.
packets may be received in a different order than the compressor packets may be received in a different order than the compressor
sent them and still have a fair probability to be successfully sent them and still have a fair probability to be successfully
decompressed. decompressed.
However, frequent out-of-order delivery and/or significant However, frequent out-of-order delivery and/or significant
reordering depth will negatively impact the compression reordering depth will negatively impact the compression
efficiency. More specifically, if the compressor can operate efficiency. More specifically, if the compressor can operate
using a proper estimate of the reordering characteristics of the using a proper estimate of the reordering characteristics of the
path between the compression endpoints, larger headers can be sent path between the compression endpoints, larger headers can be sent
more often to increase the robustness against decompression more often to increase the robustness against decompression
failures due to out-of-order delivery. Otherwise, the compression failures due to out-of-order delivery. Otherwise, the compression
efficiency will be impaired from an increase in the frequency of efficiency will be impaired from an increase in the frequency of
decompression failures and recovery attempts. decompression failures and recovery attempts.
5. Overview of the RoHCv2 Profiles (Informative) 5. Overview of the ROHCv2 Profiles (Informative)
This section provides an overview of important and useful concepts of
ROHCv2 profiles. These concepts may be used as guidelines for
implementations but they are not part of the normative definition of
the profiles, as these concepts relates to the compression efficiency
of the protocol without impacting the interoperability
characteristics of an implementation.
5.1. General Concepts
5.1.1. Control Fields and Context Updates
Control fields have the same attributes and properties as
uncompressed fields [I-D.ietf-rohc-formal-notation]. These fields
are used for compression and decompression of some of the
uncompressed header fields. Updating the value of one or more
control field(s) is thus no less important than updating context
values for header fields. Control fields are defined in
[I-D.ietf-rohc-formal-notation].
Packet types that initialize or update the value of one or more
control field(s) thus include an additional 3-bit CRC, as defined by
the packet formats in Section 6.8. The CRC is calculated using the
UVALUE of the control field(s) that it covers.
This CRC validates all the control fields that are updated. Failure This section provides an overview of concepts that are important and
to verify this CRC should be interpreted by the decompressor as a useful to the ROHCv2 profiles. These concepts may be used as
decompression failure, in the algorithm it implements to assess the guidelines for implementations but they are not part of the normative
validity of its context. definition of the profiles, as these concepts relates to the
compression efficiency of the protocol without impacting the
interoperability characteristics of an implementation.
5.2. Compressor Concepts 5.1. Compressor Concepts
Header compression can be conceptually characterized as the Header compression can be conceptually characterized as the
interaction of a compressor with a decompressor state machine, one interaction of a compressor with a decompressor state machine, one
per context. The responsability of the compressor is to convey the per context. The responsibility of the compressor is to convey the
information needed to successfully decompress a packet, based on a information needed to successfully decompress a packet, based on a
certain confidence regarding the state of the decompressor context. certain confidence regarding the state of the decompressor context.
This confidence is obtained from the frequency and the type of This confidence is obtained from the frequency and the type of
information the compressor sends when updating the decompressor information the compressor sends when updating the decompressor
context, from the optimistic approach (Section 5.2.1) and optionally context, from the optimistic approach (Section 5.1.1) and optionally
from feedback messages received from the decompressor. from feedback messages received from the decompressor.
5.2.1. Optimistic Approach 5.1.1. Optimistic Approach
A compressor always uses the optimistic approach when it performs A compressor always uses the optimistic approach when it performs
context updates. The compressor normally repeats the same type of context updates. The compressor normally repeats the same type of
update until it is fairly confident that the decompressor has update until it is fairly confident that the decompressor has
successfully received the information. If the decompressor successfully received the information. If the decompressor
successfully receives any of the headers containing this update, successfully receives any of the headers containing this update,
state will be available for the decompressor to process smaller state will be available for the decompressor to process smaller
compressed headers. compressed headers.
If field X in the uncompressed header changes value, the compressor If field X in the uncompressed header changes value, the compressor
uses a packet type that contains an encoding of field X until it has uses a packet type that contains an encoding of field X until it has
gained confidence that the decompressor has received at least one gained confidence that the decompressor has received at least one
packet containing the new value for X. The compressor normally packet containing the new value for X. The compressor normally
selects a compressed format with the smallest header that can convey selects a compressed format with the smallest header that can convey
the changes needed to achieve confidence. the changes needed to achieve confidence.
The number N of repetitions for the optimistic approach that is The number of repetitions that is needed to obtain this confidence is
needed to obtain this confidence is normally related to the packet normally related to the packet loss and out-of-order delivery
loss and out-of-order delivery characteristics of the link where characteristics of the link where header compression is used; it is
header compression is used; it is thus not defined in this document thus not defined in this document and is left open to
and is left open to implementations. implementations.
5.2.2. Tradeoff between robustness to losses and to reordering 5.1.2. Tradeoff between robustness to losses and to reordering
The ability of a header compression algorithm to handle sequentially The ability of a header compression algorithm to handle sequentially
late packets is mainly limited by two factors: the interpretation late packets is mainly limited by two factors: the interpretation
interval offset of the sliding window used for LSB encoded fields interval offset of the sliding window used for LSB encoded fields
[I-D.ietf-rohc-formal-notation], and the optimistic approach [RFC4997], and the optimistic approach (See Section 5.1.1) for seldom
Section 5.2.1 for seldom changing fields. changing fields.
The interpretation interval offset specifies an upper limit for the LSB encoded fields:
maximum reordering depth, by which is it possible for decompressor to
recover the original value of a dynamically changing field that is
encoded using W-LSB. Its value is bound to the number of LSB
compressed bits in the compressed header format, and grows with the
number of bits transmitted. However, the offset and the LSB encoding
only provide robustness for the field that it compresses, and
(implicitly) for other sequentially changing fields that are derived
from that field.
The interpretation interval offset specifies an upper limit for
the maximum reordering depth, by which is it possible for the
decompressor to recover the original value of a dynamically
changing (i.e. sequentially incrementing) field that is encoded
using W-LSB. Its value is bound to the number of LSB compressed
bits in the compressed header format, and grows with the number of
bits transmitted. However, the offset and the LSB encoding only
provide robustness for the field that it compresses, and
(implicitly) for other sequentially changing fields that are
derived from that field.
This is shown in the figure below: This is shown in the figure below:
<--- interpretation interval (size is 2^k) ----> <--- interpretation interval (size is 2^k) ---->
|------------------+---------------------------| |------------------+---------------------------|
v_ref-p v_ref v_ref + (2^k-1) - p v_ref-p v_ref v_ref + (2^k-1) - p
Lower Upper Lower Upper
Bound Bound Bound Bound
<--- reordering --> <--------- losses ---------> <--- reordering --> <--------- losses --------->
where delta(SN) = p is the maximum negative delta, corresponding where p is the maximum negative delta, corresponding to the
to the maximum reordering depth for which the lsb encoding can maximum reordering depth for which the lsb encoding can recover
recover the original value of the field; the original value of the field;
where delta(SN) = (2^k-1) - p is the maximum positive delta,
corresponding to the maximum number of consecutive losses for
which the lsb encoding can recover the original value of the
field;
where v_ref is the reference value, as defined in the lsb encoding
method in [I-D.ietf-rohc-formal-notation].
The optimistic approach (Section 5.2.1) provides the upper limit for where (2^k-1) - p is the maximum positive delta, corresponding
the maximum reordering depth for seldom changing fields. to the maximum number of consecutive losses for which the lsb
encoding can recover the original value of the field
where v_ref is the reference value, as defined in the lsb
encoding method in [RFC4997].
There is thus a tradeoff between the robustness against reordering There is thus a tradeoff between the robustness against reordering
and the robustness against packet losses, with respect to the number and the robustness against packet losses, with respect to the
of MSN bits needed and the distribution of the interpretation number of MSN bits needed and the distribution of the
interval between negative and positive deltas in the MSN. interpretation interval between negative and positive deltas in
the MSN.
There is also a tradeoff between compression efficiency and Seldom changing fields
The optimistic approach (Section 5.1.1) provides the upper limit
for the maximum reordering depth for seldom changing fields.
There is thus a tradeoff between compression efficiency and
robustness. When only information on the MSN needs to be conveyed to robustness. When only information on the MSN needs to be conveyed to
the decompressor, the tradeoff relates to the number of compressed the decompressor, the tradeoff relates to the number of compressed
MSN bits in the compressed header format. Otherwise, the tradeoff MSN bits in the compressed header format. Otherwise, the tradeoff
relates to the implementation of the optimistic approach. relates to the implementation of the optimistic approach.
5.2.3. Interactions with the Decompressor Context In particular, compressor implementations should adjust their
optimistic approach strategy to match both packet loss and reordering
characteristics. For example, the number of repetitions for each
update of a non-LSB encoded field can be increased. The compressor
can ensure that each update is repeated until it is reasonably
confident that at least one packet containing the change has reached
the decompressor before the first packet sent after this sequence.
5.1.3. Interactions with the Decompressor Context
The compressor normally starts compression with the initial The compressor normally starts compression with the initial
assumption that the decompressor has no useful information to process assumption that the decompressor has no useful information to process
the new flow, and sends Initialization and Refresh (IR) packets. the new flow, and sends Initialization and Refresh (IR) packets.
Initially, when sending the first IR packet for a compressed flow, Initially, when sending the first IR packet for a compressed flow,
the compressor does not expect to receive feedback for that flow, the compressor does not expect to receive feedback for that flow,
until such feedback is first received. At this point, the compressor until such feedback is first received. At this point, the compressor
may then assume that the decompressor will continue to send feedback may then assume that the decompressor will continue to send feedback
in order to repair its context when necessary. The former is in order to repair its context when necessary. The former is
referred to as unidirectional operation, while the latter is called referred to as unidirectional operation, while the latter is called
bidirectional operation. bidirectional operation.
The compressor can then adjust the compression level based on its The compressor can then adjust the compression level (i.e. what
confidence that the decompressor has the necessary information to header format it selects) based on its confidence that the
successfully process the compressed headers that it selects. In decompressor has the necessary information to successfully process
other words, the responsibility of the compressor is to ensure that the compressed headers that it selects. In other words, the
the decompressor operates with state information that is sufficient responsibility of the compressor is to ensure that the decompressor
to allow decompression of the most efficient compressed header(s), operates with state information that is sufficient to allow
and to allow the decompressor to successfully recover that state decompression of the most efficient compressed header(s), and to
information as soon as possible otherwise. allow the decompressor to successfully recover that state information
as soon as possible otherwise.
The compressor thus has the entire responsability to ensure that the The compressor thus has the entire responsibility to ensure that the
decompressor has the proper information to decompress the type of decompressor has the proper information to decompress the type of
compressed header that it sends. In other words, the choice of compressed header that it sends. In other words, the choice of
compressed header depends on the following factors: compressed header depends on the following factors:
o the outcome of the encoding method applied to each field; o the outcome of the encoding method applied to each field;
o the optimistic approach, with respect to the characteristics of o the optimistic approach, with respect to the characteristics of
the channel; the channel;
o the type of operation (unidirectional or bidirectional), and if in o the type of operation (unidirectional or bidirectional), and if in
birectional operation, feedback received from the decompressor birectional operation, feedback received from the decompressor
(ACKs, NACKs, Static-NACK, and options). (ACKs, NACKs, STATIC-NACK, and options).
Encoding methods normally use previous value(s) from a history of Encoding methods normally use previous value(s) from a history of
packets whose headers it has previously compressed. The optimistic packets whose headers it has previously compressed. The optimistic
approach is meant to ensure that at least one compressed header approach is meant to ensure that at least one compressed header
containing the information to update the state for a field is containing the information to update the state for a field is
received. Finally, feedback indicates what actions the decompressor received. Finally, feedback indicates what actions the decompressor
has taken with respect its assumptions regarding the validity of its has taken with respect to its assumptions regarding the validity of
context (Section 5.3.2); it indicates what type of compressed header its context (Section 5.2.2); it indicates what type of compressed
the decompressor can or cannot decompress. header the decompressor can or cannot decompress.
The decompressor has the means to detect decompression failures for The decompressor has the means to detect decompression failures for
any type of compressed (CO) header, using the CRC verification. any type of compressed (CO) header, using the CRC verification.
Depending on the frequency and/or on the type of the failure, it Depending on the frequency and/or on the type of the failure, it
might send a negative acknowledgement (NACK) or an explicit request might send a negative acknowledgement (NACK) or an explicit request
for a complete context update (Static-NACK). However, the for a complete context update (STATIC-NACK). However, the
decompressor does not have the means to identify the cause of the decompressor does not have the means to identify the cause of the
failure, and in particular decompression of what field(s) is failure, and in particular decompression of what field(s) is
responsible for the failure. The compressor is thus always responsible for the failure. The compressor is thus always
reponsible to figure out what is the most suitable response to a responsible to determine what is the most suitable response to a
negative acknowledgement, using the confidence it has in the state of negative acknowledgement, using the confidence it has in the state of
the decompressor context, when selecting the type of compressed the decompressor context, when selecting the type of compressed
header it will use when compressing a header. header it will use when compressing a header.
5.3. Decompressor Concepts 5.2. Decompressor Concepts
The decompressor normally always uses the last received and The decompressor normally uses the last received and successfully
successfully validated (IR packets) or verified (CO packets) header validated (IR packets) or verified (CO packets) header as the
as the reference for future decompression. If the received packet is reference for future decompression. If the received packet is older
older than the current reference packet based on the MSN in the than the current reference packet based on the MSN in the compressed
compressed header, the decompressor may refrain from using this header, the decompressor may refrain from using this packet as the
packet as the new reference packet, even if the correctness of its new reference packet, even if the correctness of its header was
header was successfully verified. successfully verified.
The decompressor's responsibility is thus to minimally and The decompressor is responsible to always verify the outcome of the
consistently verify the outcome of the decompression attempt, update decompression attempt, to update its context when successful and
its context when successful and finally to request context repairs by finally to request context repairs by making coherent usage of
making coherent usage of feedback, once it starts using it. feedback, once it has started using feedback.
Specifically, the outcome of every decompression attempt is verified Specifically, the outcome of every decompression attempt is verified
using the CRC present in the compressed header; the decompressor using the CRC present in the compressed header; the decompressor
updates the context information when this outcome is successfully updates the context information when this outcome is successfully
verified; finally if the decompressor uses feedback once for a verified; finally if the decompressor uses feedback once for a
compressed flow then it will continue to do so for as long as the compressed flow then it will continue to do so for as long as the
corresponding context is associated with the same profile. corresponding context is associated with the same profile.
5.3.1. Decompressor State Machine 5.2.1. Decompressor State Machine
The decompressor operation may be represented as a state machine The decompressor operation may be represented as a state machine
defining three states: No Context (NC), Initial Context (IC) and Full defining three states: No Context (NC), Repair Context (RC) and Full
Context (FC). Context (FC).
The decompressor starts with no valid context, the NC state. The decompressor starts without a valid context, the NC state. Upon
Successful CRC-8 validation of an IR packet moves the decompressor to receiving an IR packet, the decompressor validates the integrity of
the IC state, where it stays until it successfully verifies a its header using the CRC-8 validation. If the IR header is
decompression attempt for a compressed header with a 7-bit CRC. The successfully validated, the decompressor updates the context and uses
this header as the reference header, and moves to the FC state. The
decompressor state machine normally does not leave the FC state once decompressor state machine normally does not leave the FC state once
it has entered this state; only repeated decompression failures will it has entered this state; only repeated decompression failures will
force the decompressor to transit downwards to a lower state. force the decompressor to transit downwards to a lower state. When
context damage is detected, the decompressor moves to the repair
context (RC) state, where it stays until it successfully verifies a
decompression attempt for a compressed header with a 7-bit CRC or for
an IR header. When static context damage is detected, the
decompressor moves back to the NC state.
Below is the state machine for the decompressor. Details of the Below is the state machine for the decompressor. Details of the
transitions between states and decompression logic are given in the transitions between states and decompression logic are given in the
sub-sections following the figure. sub-sections following the figure.
CRC-8(IR) or CRC-8(IR) Validation
CRC-8(IR) +----->----->----->----->----->----->----->----->----->----->----+
Validation | CRC-8(IR) |
CRC-7(CO) or | !CRC-8(IR) or CRC-7(CO) or or CRC-7(CO) |
CRC-8(IR) CRC-8(IR) CRC-8(IR) CRC-7(CO) CRC-3(CO) | PT not allowed CRC-8(IR) or CRC-3(CO) |
Failure Validation Validation Verification Verification | +--->---+ +--->----->----->----->---+ +--->---->---+ |
+--->---+ +-->---->--+ +-->----->--+ +-->---->--+ +-->---->--+ | | | | | | | |
| | | | | | | | | | | | v | v | v v
| v | v | v | v | v +-----------------+ +----------------------+ +--------------------+
+-----------------+ +----------------------+ +-------------------+ | No Context (NC) | | Repair Context (RC) | | Full Context (FC) |
| No Context (NC) | | Initial Context (IC) | | Full Context (FC) | +-----------------+ +----------------------+ +--------------------+
+-----------------+ +----------------------+ +-------------------+ ^ ^ Static Context | ^ !CRC-7(CO) or | ^ Context Damage | |
^ | ^ CRC-7(CO) | ^ | | | Damage Detected | | PT not allowed | | Detected | |
| Static Context | | Failure or | | Context Damage | | +--<-----<-----<--+ +----<------<----+ +--<-----<-----<--+ |
| Damage Detected | | PT not allowed | | Detected | | |
+--<-----<-----<--+ +----<------<----+ +--<-----<-----<--+ | Static Context Damage Detected |
+--<-----<-----<-----<-----<-----<-----<-----<-----<---------+
where: where:
CRC-8(IR) validation: successful CRC-8 validation for the IR CRC-8(IR): successful CRC-8 validation for the IR header.
header. !CRC-8(IR): Unsuccessful CRC-8 validation for the IR header.
CRC-7(CO) and/or CRC-3(CO) verification: successful CRC CRC-7(CO) and/or CRC-3(CO): successful CRC verification for the
verification for the CO header, based on the number of CRC bits decompression of a CO header, based on the number of CRC bits
carried in the CO header. carried in the CO header.
CRC-7(CO) failure: failure to CRC verify the decompression of a CO !CRC-7(CO): failure to CRC verify the decompression of a CO header
header carrying a 7-bit CRC. carrying a 7-bit CRC.
PT not allowed: the decompressor has received a packet type (PT) PT not allowed: the decompressor has received a packet type (PT)
for which the decopressor's current context does not provide for which the decompressor's current context does not provide
enough valid state information for that packet to be decompressed. enough valid state information for that packet to be decompressed.
Static Context Damaged Detected: see definition in Section 5.3.2. Static Context Damaged Detected: see definition in Section 5.2.2.
Context Damage Detected: see definition in Section 5.3.2. Context Damage Detected: see definition in Section 5.2.2.
5.3.1.1. No Context (NC) State 5.2.1.1. No Context (NC) State
Initially, while working in the No Context (NC) state, the Initially, while working in the No Context (NC) state, the
decompressor has not yet successfully validated an IR packet. decompressor has not yet successfully validated an IR header.
Attempting decompression: Attempting decompression:
In the NC state, only packets carrying sufficient information on In the NC state, only packets carrying sufficient information on
the static fields (i.e. IR packets) can be decompressed. the static fields (i.e. IR packets) can be decompressed.
Upward transition: Upward transition:
Upon receiving an IR packet, the decompressor validates the The decompressor can move to the Full Context (FC) state when the
integrity of its header using the CRC-8 validation. If the IR CRC validation of an 8-bit CRC in an IR header is successful.
packet is successfully validated, the decompressor updates the
context and use this packet as the reference packet. Once an IR
packet has initialized the context, the decompressor can transit
to the IC state.
Feedback logic: Feedback logic:
In the No Context state, the decompressor should send a STATIC- In the No Context state, the decompressor should send a STATIC-
NACK if a packet of a type other than IR is received, or if an IR NACK if a packet of a type other than IR is received, or if an IR
packet has failed the CRC-8 validation, subject to the feedback header has failed the CRC-8 validation, subject to the feedback
rate limitation as described in Section 5.3.3. rate limitation as described in Section 5.2.3.
5.3.1.2. Initial Context (IC) State 5.2.1.2. Repair Context (RC) State
In the IC state, the decompressor has successfully validated an IR In the Repair Context (RC) state, the decompressor has successfully
packet. decompressed packets for this context, but does not have confidence
that the entire context is valid.
Attempting decompression: Attempting decompression:
In the Initial Context state, only packets carrying sufficient In the RC state, only headers covered by an 8-bit CRC (i.e. IR)
information on the dynamic fields covered by an 8-bit CRC (i.e. or CO headers carrying a 7-bit CRC can be decompressed.
IR) or CO packets carrying a 7-bit CRC can be decompressed.
Upward transition: Upward transition:
The decompressor can move to the Full Context (FC) state when the The decompressor can move to the Full Context (FC) state when the
CRC verification succeeds for a CO header carrying a 7-bit CRC. CRC verification succeeds for a CO header carrying a 7-bit CRC or
validation of an 8-bit CRC in an IR header.
Downward transition: Downward transition:
The decompressor moves back to the NC state if it assumes static The decompressor moves back to the NC state if it assumes static
context damage. context damage.
Feedback logic: Feedback logic:
In the IC state, the decompressor should send a STATIC-NACK when In the RC state, the decompressor should send a STATIC-NACK when
CRC-8 validation of an IR fails, or when a CO header carrying a CRC-8 validation of an IR fails, or when a CO header carrying a
7-bit CRC fails and if static context damage is assumed, subject 7-bit CRC fails and static context damage is assumed, subject to
to the feedback rate limitation as described in Section 5.3.3. If the feedback rate limitation as described in Section 5.2.3. If
any other packet type is received, the decompressor should treat any other packet type is received, the decompressor should treat
it as a CRC verification failure when deciding if a NACK is to be it as a CRC verification failure when deciding if a NACK is to be
sent. sent.
5.3.1.3. Full Context (FC) State 5.2.1.3. Full Context (FC) State
In the FC state, the decompressor has successfully verified a CO In the Full Context (FC) state, the decompressor assumes that its
header with a 7-bit CRC. entire context is valid.
Attempting decompression: Attempting decompression:
In the Full Context state, decompression can be attempted In the FC state, decompression can be attempted regardless of the
regardless of the type of packet received. type of packet received.
Downward transition: Downward transition:
The decompressor moves back to the IC state if it assumes context The decompressor moves back to the RC state if it assumes context
damage, and back to the NC state if it assumes static context damage. If the decompressor assumes static context damage, it
damage. moves directly to the NC state.
Feedback logic: Feedback logic:
In the Full Context state, the decompressor should send a NACK In the FC state, the decompressor should send a NACK when CRC-8
when CRC-8 validation or CRC verification of any packet type fails validation or CRC verification of any header type fails and if
and if context damage is assumed, subject to the feedback rate context damage is assumed, or STATIC-NACK if static context damage
limitation as described in Section 5.3.3. is assumed, subject to the feedback rate limitation as described
in Section 5.2.3.
5.3.2. Decompressor Context Management 5.2.2. Decompressor Context Management
All header formats carry a CRC and are context updating. A packet All header formats carry a CRC and are context updating. A packet
for which the CRC succeeds updates the reference values of all header for which the CRC succeeds updates the reference values of all header
fields, either explicitly (from the information about a field carried fields, either explicitly (from the information about a field carried
within the compressed header) or implicitly (fields that are inferred within the compressed header) or implicitly (fields that are inferred
from other fields). from other fields).
The decompressor may assume that some or the entire context is The decompressor may assume that some or the entire context is
invalid, following one or more failures to validate or verify a invalid, when it fails to validate or to verify one or more headers
header using the CRC. Because the decompressor cannot know the exact using the CRC. Because the decompressor cannot know the exact
reason(s) for a CRC failure or what field caused it, the validity of reason(s) for a CRC failure or what field caused it, the validity of
the context hence does not refer to what exact context entry is the context hence does not refer to what specific part(s) of the
deemed valid or not. context is deemed valid or not.
Validity of the context rather relates to the detection of a problem Validity of the context rather relates to the detection of a problem
with the context. The decompressor first assume that the type of with the context. The decompressor first assume that the type of
information that most likely caused the failure(s) is the state that information that most likely caused the failure(s) is the state that
normally changes for each packet, i.e. context damage of the dynamic normally changes for each packet, i.e. context damage of the dynamic
part of the context. Upon repeated failures and unsuccessful part of the context. Upon repeated decompression failures and
repairs, the decompressor then assume that the entire context, unsuccessful repairs, the decompressor then assumes that the entire
including the static part, needs to be repaired, i.e. static context context, including the static part, needs to be repaired, i.e. static
damage. context damage. Failure to validate the 3-bit CRC that protects
control fields should be treated as a decompression failure when the
decompressor asserts the validity of its context.
Context Damage Detection Context Damage Detection
The assumption of context damage means that the decompressor will The assumption of context damage means that the decompressor will
not attemp decompression of a CO headers that carries a 3-bit CRC, not attempt decompression of a CO header that carries only a 3-bit
and only attempt decompression of IR headers, or CO headers CRC, and will only attempt decompression of IR headers, or CO
protected by a CRC-7. headers protected by a CRC-7.
Static Context Damage Detection Static Context Damage Detection
The assumption of static context damage means that the The assumption of static context damage means that the
decompressor refrains from attempting decompression of any type of decompressor refrains from attempting decompression of any type of
header other than the IR header, as it cannot know what part of header other than the IR header.
its context can be relied upon after first assuming context damage
and failed to repair its context, and as a result of too many
failures.
How these assumptions are made, i.e. how context damage is detected, How these assumptions are made, i.e. how context damage is detected,
is open to implementations. It can be based on the residual error is open to implementations. It can be based on the residual error
rate, where a low error rate makes the decompressor assume damage rate, where a low error rate makes the decompressor assume damage
more often than on a high rate link. more often than on a high rate link.
The decompressor implements these assumptions by selecting the type The decompressor implements these assumptions by selecting the type
of compressed header for it may attempt decompression. In other of compressed header for which it will attempt decompression. In
words, validity of the context refers to the ability of a other words, validity of the context refers to the ability of a
decompressor to attempt or not decompression of specific packet decompressor to attempt or not decompression of specific packet
types. types.
When RoHCv2 profiles are used over a channel that cannot guarantee When ROHCv2 profiles are used over a channel that cannot guarantee
in-order delivery, the decompressor may refrain to update its context in-order delivery, the decompressor may refrain from updating its
with the content of a sequentially late packet that is successfully context with the content of a sequentially late packet that is
decompressed. This is to avoid updating the context with information successfully decompressed. This is to avoid updating the context
that is older than what the decompressor already has in its context. with information that is older than what the decompressor already has
How the decompressor detects a sequentially late packet is outside in its context.
the scope of this specification, but it can for example use the MSN
to this purpose.
5.3.3. Feedback logic 5.2.3. Feedback logic
RoHCv2 profiles may be used in environments with or without feedback ROHCv2 profiles may be used in environments with or without feedback
capabilities from decompressor to compressor. RoHCv2 however assumes capabilities from decompressor to compressor. ROHCv2 however assumes
that if a ROHC feedback channel is available and if this channel is that if a ROHC feedback channel is available and if this channel is
used at least once by the decompressor for a specific context, this used at least once by the decompressor for a specific context, this
channel will be used during the entire compression operation for that channel will be used during the entire compression operation for that
context (i.e. bidirectional operation). context (i.e. bidirectional operation).
The RoHC framework defines 3 types of feedback messages: ACKs, NACKs The ROHC framework defines 3 types of feedback messages: ACKs, NACKs
and STATIC-NACKs. The semantics of each message if defined in and STATIC-NACKs. The semantics of each message if defined in
section 5.2.3.1. of [I-D.ietf-rohc-rfc3095bis-framework] What section 5.2.3.1. of [RFC4995]. What feedback to send is coupled to
feedback to send is coupled to the context management of the the context management of the decompressor, i.e. to the
decompressor, i.e. to the implementation of the context damage implementation of the context damage detection algorithms as
detection algorithms as described in Section 5.3.2. described in Section 5.2.2.
The decompressor should send a NACK when it assumes context damage, The decompressor should send a NACK when it assumes context damage,
and it should send a STATIC-NACK when it assumes static context and it should send a STATIC-NACK when it assumes static context
damage. The decompressor is not strictly expected to send ACK damage. The decompressor is not strictly expected to send ACK
feedback upon successful decompression, other than for the purpose of feedback upon successful decompression, other than for the purpose of
improving compression efficiency. improving compression efficiency.
When RoHCv2 profiles are used over a channel that cannot guarantee When ROHCv2 profiles are used over a channel that cannot guarantee
in-order delivery, the decompressor may refrain to send ACK feedback in-order delivery, the decompressor may refrain to send ACK feedback
for a sequentially late packet that is successfully decompressed. for a sequentially late packet that is successfully decompressed.
How the decompressor detects a sequentially late packet is outside
the scope of this specification, but it can for example use the MSN
to this purpose.
The decompressor should limit the rate at which it sends feedback, The decompressor should limit the rate at which it sends feedback,
for both ACKs and STATIC-NACK/NACKs, and should avoid sending for both ACKs and STATIC-NACK/NACKs, and should avoid sending
unnecessary duplicates of the same type of feedback message that may unnecessary duplicates of the same type of feedback message that may
be associated to the same event. be associated to the same event.
6. RoHCv2 Profiles (Normative) 6. ROHCv2 Profiles (Normative)
6.1. Profile Operation, per-context 6.1. Channel Parameters, Segmentation and Reordering
RoHCv2 profiles operates differently, per context, depending on how The compressor MUST NOT use ROHC segmentation (see [RFC4995] section
5.2.5), i.e. MRRU MUST be set to 0), if the configuration of the
ROHC channel contains at least one ROHCv2 profile in the list of
supported profiles (i.e. the PROFILES parameter) and if the channel
cannot guarantee in-order delivery of packets between compression
endpoints.
6.2. Profile Operation, per-context
ROHCv2 profiles operate differently, per context, depending on how
the decompressor makes use of the feedback channel, if any. Once the the decompressor makes use of the feedback channel, if any. Once the
decompressor uses the feedback channel for a context, it establishes decompressor uses the feedback channel for a context, it establishes
the feedback channel for that CID. the feedback channel for that CID.
The compressor always start assuming that the decompressor will not The compressor always start assuming that the decompressor will not
send feedback when it initializes a new context (see also , section send feedback when it initializes a new context (see also the
5.1.1. of [I-D.ietf-rohc-rfc3095bis-framework]), i.e. there is no definition of a new context insection 5.1.1. of [RFC4995]), i.e.
established feedback channel for the new context. There will always there is no established feedback channel for the new context. There
be a possibility of decompression failure with the optimistic will always be a possibility of decompression failure with the
approach, because the decompressor may not have received sufficient optimistic approach, because the decompressor may not have received
information for correct decompression. Therefore, until the sufficient information for correct decompression. Therefore, until
decompressor has established a feedback channel, the compressor the decompressor has established a feedback channel, the compressor
SHOULD periodically send IR packets. The periodicity can be based on SHOULD periodically send IR packets. The periodicity can be based on
timeouts, on the number of compressed packets sent for the flow, or timeouts, on the number of compressed packets sent for the flow, or
any other strategy the implementer chooses. any other strategy the implementer chooses.
The reception of either positive feedback (ACKs) or negative feedback The reception of either positive feedback (ACKs) or negative feedback
(NACKs) establishes the feedback channel from the decompressor for (NACKs or STATIC-NACKs) establishes the feedback channel from the
the context (CID) for which the feedback was received. Once there is decompressor for the context (CID) for which the feedback was
an established feedback channel for a specific context, the received. Once there is an established feedback channel for a
compressor can make use of this feedback to estimate the current specific context, the compressor can make use of this feedback to
state of the decompressor. This helps increasing the compression estimate the current state of the decompressor. This helps
efficiency by providing the information needed for the compressor to increasing the compression efficiency by providing the information
achieve the necessary confidence level. When the feedback channel is needed for the compressor to achieve the necessary confidence level.
established, it becomes superfluous for the compressor to send When the feedback channel is established, it becomes superfluous for
periodic refreshes, and instead it can rely entirely on the the compressor to send periodic refreshes, and instead it can rely
optimistic approach and feedback from the decompressor. entirely on the optimistic approach and feedback from the
decompressor.
The decompressor MAY send positive feedback (ACKs) to initially The decompressor MAY send positive feedback (ACKs) to initially
establish the feedback channel for a particular flow. Either establish the feedback channel for a particular flow. Either
positive feedback (ACKs) or negative feedback (NACKs) establishes positive feedback (ACKs) or negative feedback (NACKs) establishes
this channel. The decompressor is REQUIRED to continue sending this channel. The decompressor is REQUIRED to continue sending
feedback once it has established a feedback channel for a CID, for feedback once it has established a feedback channel for a CID, for
the lifetime of the context, i.e. until the CID is associated with a the lifetime of the context, i.e. until the CID is associated with a
different profile from the reception of an IR packet, to send error different profile from the reception of an IR packet, to send error
recovery requests and (optionally) acknowledgments of significant recovery requests and (optionally) acknowledgments of significant
context updates. context updates.
Due to the periodic refreshes and the lack of feedback for initiation Compression without an established feedback channel will be less
of error recovery, compression without an established feedback efficient, because of the periodic refreshes and from the lack of
channel will be less efficient and have a slightly higher probability feedback for initiation of error recovery; there will also be a
of loss propagation compared to the decompressor making use of slightly higher probability of loss propagation compared to the case
feedback. where the decompressor uses feedback.
6.2. Control Fields 6.3. Control Fields
RoHCv2 defines a number of control fields that are used by the ROHCv2 defines a number of control fields that are used by the
decompressor in its interpretation of the packet formats received decompressor in its interpretation of the packet formats received
from the compressor. from the compressor. The control fields listed in the following
subsections are all defined in Section 6.8.2.4 using ROHC-FN
A control field is a field that is transmitted from the compressor to [RFC4995].
the decompressor, but is not part of the uncompressed header. Values
for control fields can be set up in the context of both the
compressor and the decompressor. Once established at the
decompressor, the values of these fields MUST be kept until updated
by another packet.
6.2.1. Master Sequence Number (MSN) 6.3.1. Master Sequence Number (MSN)
The Master Sequence Number (MSN) field is either taken from a field The Master Sequence Number (MSN) field is either taken from a field
that already exists in each of the headers of the protocol that the that already exists in each of the headers of the protocol that the
profile compresses (e.g. RTP SN), or alternatively it is created at profile compresses (e.g. RTP SN), or alternatively it is created at
the compressor. the compressor. There is one MSN space per context (CID).
The MSN field has the following two functions: The MSN field has the following two functions:
o Differentiating between packets when sending feedback data. o Differentiating between reference headers when receiving feedback
data.
o Inferring the value of incrementing fields (e.g. IPv4 o Inferring the value of incrementing fields (e.g. IPv4
Identifier). Identifier).
The MSN field is present in every packet sent by the compressor. The The MSN field is present in every ROHCv2 header sent by the
MSN is sent in full in IR packets, while it is sent LSB encoded compressor. The MSN is sent in full in IR packets, while it can be
within CO header formats. The decompressor always sends the MSN as sent LSB encoded within CO header formats. The decompressor always
part of the feedback information. The compressor can later use the includes LSBs of the MSN in the Acknowledgment Number field in
MSN to infer which packet the decompressor is acknowledging. feedback (see Section 6.9). The compressor can later use this field
to infer what packet the decompressor is acknowledging.
For profiles for which the MSN is created by the compressor, the For profiles for which the MSN is created by the compressor, the
following rules applies: following applies:
o The compressor should only initialize a new MSN for the initial IR o The compressor should only initialize a new MSN for the initial IR
sent for a CID that corresponds to a context that is not already sent for a CID that corresponds to a context that is not already
associated with this profile; associated with this profile;
o When the MSN is initialized, it is initialized to a random value; o When the MSN is initialized, it is initialized to a random value;
o The value of the MSN is incremented by one for each packet that o The value of the MSN is incremented by one for each packet that
the compressor sends. the compressor sends for a specific CID.
6.2.2. IP-ID behavior 6.3.2. Reordering Ratio
The control field reorder_ratio specifies how much reordering is
handled by the LSB encoding of the MSN. This is useful when header
compression is performed over links with varying reordering
characteristics. The reorder_ratio control field is a means for the
compressor to adjust the robustness characteristics of the LSB
encoding method with respect to reordering and consecutive losses, as
described in Section 5.1.2.
6.3.3. IP-ID behavior
The IP-ID field of the IPv4 header can have different change The IP-ID field of the IPv4 header can have different change
patterns: sequential in network byte order, sequential byte-swapped, patterns: sequential in network byte order, sequential byte-swapped,
random or constant (a constant value of zero, although not conformant random or constant (a constant value of zero, although not conformant
with [RFC0791], as been observed in practice). The control field for with [RFC0791], has been observed in practice). There is one IP-ID
the IP-ID behavior determines which set of packet formats will be behavior control field per IP header. The control field for the
used. Note that these control fields are also used to determine the IP-ID behavior of the innermost IP header determines which set of
contents of the irregular chain item for each IP header. header formats will be used. The IP-ID behavior control field is
also used to determine the contents of the irregular chain item, for
each IP header.
If more than one level of IP headers is present, RoHCv2 profiles can ROHCv2 profiles can assign a sequential behavior (network byte order
assign a sequential behavior (network byte order or byte-swapped) or byte-swapped) only to the IP-ID of innermost IP header, when
only to the IP-ID of innermost IP header. This is because only this compressing more than one level of IP headers. This is because only
IP-ID can possibly have a sufficiently close correlation with the MSN the IP-ID of the innermost IP header is likely to have a sufficiently
to compress it as a sequentially changing field. Therefore, a close correlation with the MSN to compress it as a sequentially
compressor MUST assign either the constant zero IP-ID or the random changing field. Therefore, a compressor MUST assign either the
IP-ID behavior to tunneling headers. constant zero IP-ID or the random IP-ID behavior to tunneling
headers.
6.3. Reconstruction and Verification 6.3.4. UDP-Lite Coverage Behavior
The CRC carried within compressed headers MUST be used to verify The control field coverage_behavior specifies how the checksum
decompression. When the decompression is verified and successful, coverage field of the UDP-Lite header is compressed with RoHCv2. It
the decompressor updates the context with the information received in can indicate one of he following encoding methods: irregular, static
the current header; otherwise if the reconstructed header fails the or inferred compression.
CRC verification, these updates MUST NOT be performed.
A packet for which the decompression attempt cannot be verified using 6.3.5. Timestamp Stride
the CRC MUST NOT be delivered to upper layers.
Note: Decompressor implementations may attempt corrective or repair The ts_stride control field is used in scaled RTP timestamp encoding
measures prior to performing the above actions, and the result of any (see Section 6.6.8). It defines the expected increase in the RTP
decompression attempt MUST be verified using the CRC. timestamp between consecutive RTP sequence numbers.
6.4. Reordering and Segmentation 6.3.6. Time Stride
When ROHCv2 profiles are used on a channel that may reorder packets, The time_stride control field is used in timer-based compression
the compressor should take into account some extra considerations encoding (see Section 6.6.9). When timer-based compression is used,
compared to when used on a channel that guarantees in-order time_stride should be set to the expected difference in arrival time
delivery.ROHC Segmentation (see [I-D.ietf-rohc-rfc3095bis-framework] between consecutive RTP packets.
section 5.2.5) must not be used, i.e. MRRU MUST be set to 0).
6.4.1. Optimistic Approach 6.3.7. CRC-3 for Control Fields
The optimistic approach is affected by the reordering characteristics ROHCv2 profiles define a CRC-3 calculated over a number of control
of the channel when operating over a reordering channel. Compressor fields. This 3-bit CRC protecting the control fields is present in
implementations should therefore adjust their optimistic approach the header format for the co_common and co_repair header types.
strategy to match both packet loss and reordering characteristics.
For example, the number of repetitions for each update of a non-LSB Failure to validate the control fields using this CRC should be
encoded field can be increased. The compressor should ensure that considered as a decompression failure by the decompressor, in the
each such update is repeated until it is reasonably confident that at algorithm that assesses the validity of the context. However, if the
least one packet containing this change has reached the decompressor decompression attempt can be verified using either the CRC-3 or the
before the first packet sent after this sequence. CRC-7 calculated over the uncompressed header, the decompressor may
still forward the decompressed header to upper layers. This is
because the protected control fields are not always used for
decompression of the specific co_common or the co_repair header that
updates their respective value.
The CRC polynomial and coverage of this CRC-3 is defined in
Section 6.6.11.
6.4. Reconstruction and Verification
Validation of the IR header (8-bit CRC)
The decompressor MUST always validate the integrity of the IR
header using the 8-bit CRC carried within the IR header. When the
header is validated, the decompressor updates the context with the
information in the IR header. Otherwise, if the IR cannot be
validated, the context MUST NOT be updated and the IR header MUST
NOT be delivered to upper layers.
Verification of CO headers (3-bit CRC or 7-bit CRC)
The CRC carried within compressed headers MUST be used to verify
decompression of CO headers. When the decompression is verified
and successful, the decompressor updates the context with the
information received in the CO header; otherwise if the
reconstructed header fails the CRC verification, these updates
MUST NOT be performed.
A packet for which the decompression attempt cannot be verified
using the CRC MUST NOT be delivered to upper layers.
Decompressor implementations may attempt corrective or repair
measures on CO headers prior to performing the above actions, and
the result of any decompression attempt MUST be verified using the
CRC.
6.5. Compressed Header Chains 6.5. Compressed Header Chains
Some packet types use one or more chains containing sub-header Some packet types use one or more chains containing sub-header
information. The function of a chain is to group fields based on information. The function of a chain is to group fields based on
similar characteristics, such as static, dynamic or irregular fields. similar characteristics, such as static, dynamic or irregular fields.
Chaining is done by appending an item for each header to the chain in Chaining is done by appending an item for each header to the chain in
their order of appearance in the uncompressed packet, starting from their order of appearance in the uncompressed packet, starting from
the fields in the outermost header. the fields in the outermost header.
Static chain: Static chain:
The static chain consists of one item for each header of the chain The static chain consists of one item for each header of the chain
of protocol headers to be compressed, starting from the outermost of protocol headers to be compressed, starting from the outermost
IP header. In the formal description of the packet formats, this IP header. In the formal description of the packet formats, this
static chain item for each header type is labelled static chain item for each header type is labelled
<protocol_name>_static. The static chain is only used in IR <protocol_name>_static. The static chain is only used in the IR
packets. header format.
Dynamic chain: Dynamic chain:
The dynamic chain consists of one item for each header of the The dynamic chain consists of one item for each header of the
chain of protocol headers to be compressed, starting from the chain of protocol headers to be compressed, starting from the
outermost IP header. In the formal description of the packet outermost IP header. In the formal description of the packet
formats, the dynamic chain item for each header type is labelled formats, the dynamic chain item for each header type is labelled
<protocol_name>_dynamic. The dynamic chain is used in IR packet <protocol_name>_dynamic. The dynamic chain is only used in the IR
format header format.
Irregular chain: Irregular chain:
The structure of the irregular chain is analogous to the structure The structure of the irregular chain is analogous to the structure
of the static chain. For each compressed packet, the irregular of the static chain. For each compressed packet, the irregular
chain is appended at the specified location in the general format chain is appended at the specified location in the general format
of the compressed packets as defined in Section 6.8. The of the compressed packets as defined in Section 6.8. The
irregular chain is used for all CO packets. irregular chain is used in all CO packets.
The format of the irregular chain for the innermost IP header The format of the irregular chain for the innermost IP header
differs from the format of the one for the outer IP headers, since differs from the format used for the outer IP headers, because
this header is part of the compressed base header. What irregular this header is part of the compressed base header. In the
chain items to use is determined by the argument "is_innermost", definition of the packet formats using the formal notation, the
which is passed as an argument to the corresponding encoding argument "is_innermost" passed to the corresponding encoding
method (ipv4 or ipv6). The format of the irregular chain item for method (ipv4 or ipv6) determines what irregular chain items to
the outer IP headers is also determined using one flag for TTL/Hop use. The format of the irregular chain item for the outer IP
Limit and one for TOS/TC. These flags are defined in the format headers is also determined using one flag for TTL/Hop Limit and
of some of the compressed base headers. one for TOS/TC. These flags are defined in the format of some of
RoHCv2 profiles compresses extension headers as other headers, and the compressed base headers.
ROHCv2 profiles compresses extension headers as other headers, and
thus extension headers have a static chain, a dynamic chain and an thus extension headers have a static chain, a dynamic chain and an
irregular chain. irregular chain.
Chains are defined for all headers compressed by RoHCv2 profiles, ROHCv2 profiles define chains for all headers that can be compressed,
i.e. RTP [RFC3550], UDP [RFC0768], UDP Lite [RFC3828], IPv4 i.e. RTP [RFC3550], UDP [RFC0768], UDP Lite [RFC3828], IPv4
[RFC0791], IPv6 [RFC2460], AH [RFC4302], GRE [RFC2784][RFC2890], MINE [RFC0791], IPv6 [RFC2460], AH [RFC4302], GRE [RFC2784][RFC2890], MINE
[RFC2004], NULL-encrupted ESP [RFC4303], IPv6 Destination Options [RFC2004], NULL-encrypted ESP [RFC4303], IPv6 Destination Options
header[RFC2460], IPv6 Hop-by-hop Options header[RFC2460] and IPv6 header[RFC2460], IPv6 Hop-by-hop Options header[RFC2460] and IPv6
Routing header [RFC2460]. Routing header [RFC2460].
6.6. Packet Formats and Encoding Methods 6.6. Packet Formats and Encoding Methods
The packet formats used for are defined using the ROHC formal The packet formats are defined using the ROHC formal notation. Some
notation. Some of the encoding methods used in the packet formats of the encoding methods used in the packet formats are defined in
are defined in [I-D.ietf-rohc-formal-notation], while other methods [RFC4997], while other methods are defined in this section.
are defined in this section.
6.6.1. baseheader_extension_headers 6.6.1. baseheader_extension_headers
In CO packets (see Section 6.8.3), the innermost IP header can be The baseheader_extension_headers encoding method skips over all
combined with other header(s) (i.e. UDP, UDP Lite, RTP) to create fields of the extension headers of the innermost IP header, without
the compressed base header. In such case, the IP header may have a encoding any of the them. Fields in these extension headers are
number of extension headers between itself and the other headers. instead encoded in the irregular chain.
The base header defines some representation of these extension This encoding is used in CO headers (see Section 6.8.2). The
headers, to comply with the syntax of the formal notation; this innermost IP header is combined with other header(s) (i.e. UDP, UDP
encoding method provides this representation. The Lite, RTP) to create the compressed base header. In this case, there
baseheader_extension_headers encoding method skips over all fields of may be a number of extension headers between the IP headers and the
the extension headers of the innermost IP header, without encoding other headers.
any of the them. Fields in these extension headers are instead
encoded in the irregular chain. The base header defines a representation of the extension headers, to
comply with the syntax of the formal notation; this encoding method
provides this representation.
6.6.2. baseheader_outer_headers 6.6.2. baseheader_outer_headers
This encoding method, similarly to the baseheader_extension_headers The baseheader_outer_headers encoding method skips over all the
encoding method above, is needed to keep the definition of the packet fields of the extension header(s) that do not belong to the innermost
formats syntactically correct. It describe tunneling IP headers and IP header, without encoding any of them. Changing fields in outer
their respective extension headers (i.e. all headers located before
the innermost IP header) for CO headers (see Section 6.8.3). The
baseheader_outer_headers encoding method skips over all the fields of
the extension header(s) that do not belong to the innermost IP
header, without encoding any of them. Changed fields in outer
headers are instead handled by the irregular chain. headers are instead handled by the irregular chain.
This encoding method, similarly to the baseheader_extension_headers
encoding method above, is necessary to keep the definition of the
packet formats syntactically correct. It describes tunneling IP
headers and their respective extension headers (i.e. all headers
located before the innermost IP header) for CO headers (see
Section 6.8.2).
6.6.3. inferred_udp_length 6.6.3. inferred_udp_length
The UDP length field is inferred by the decompressor to be the size The decompressor infers the value of the UDP length field as being
of the UDP payload. This also means that the compressor MUST make the size of the UDP payload. The compressor must therefore ensure
sure that the UDP length field is consistent with the length field(s) that the UDP length field is consistent with the length field(s) of
of preceeding subheaders, i.e., there must not be any padding after preceeding subheaders, i.e., there must not be any padding after the
the UDP payload that is covered by the IP Length. UDP payload that is covered by the IP Length.
This encoding method is also used for the UDP-Lite Checksum Coverage
field, when it behaves in the same manner as the UDP length field
(i.e. when the checksum always covers the entire UDP-Lite payload).
6.6.4. inferred_ip_v4_header_checksum 6.6.4. inferred_ip_v4_header_checksum
This encoding method compresses the header checksum field of the IPv4 This encoding method compresses the header checksum field of the IPv4
header. This checksum is defined in RFC 791 [RFC0791] as follows: header. This checksum is defined in RFC 791 [RFC0791] as follows:
Header Checksum: 16 bits Header Checksum: 16 bits
A checksum on the header only. Since some header fields change A checksum on the header only. Since some header fields change
(e.g., time to live), this is recomputed and verified at each (e.g., time to live), this is recomputed and verified at each
point that the internet header is processed. point that the internet header is processed.
The checksum algorithm is: The checksum algorithm is:
The checksum field is the 16 bit one's complement of the one's The checksum field is the 16 bit one's complement of the one's
complement sum of all 16 bit words in the header. For purposes complement sum of all 16 bit words in the header. For purposes
of computing the checksum, the value of the checksum field is of computing the checksum, the value of the checksum field is
zero. zero.
As described above, the header checksum protects individual hops from As described above, the header checksum protects individual hops from
processing a corrupted header. When almost all IP header information processing a corrupted header. There is no reason to transmit this
is compressed away, and when decompression is verified by a CRC checksum when almost all IP header information is compressed away,
computed over the original header for every compressed packet, there and when decompression is verified by a CRC computed over the
is no point in having this additional checksum; instead it can be original header for every compressed packet; instead, the checksum
recomputed at the decompressor side. can be recomputed by the decompressor.
The "inferred_ip_v4_header_checksum" encoding method thus compresses The "inferred_ip_v4_header_checksum" encoding method thus compresses
the IPv4 header checksum down to a size of zero bit, i.e. no bits are the header checksum field of the IPv4 header down to a size of zero
transmitted in compressed headers for this field. Using this bits, i.e. no bits are transmitted in compressed headers for this
encoding method, the decompressor infers the value of this field field. Using this encoding method, the decompressor infers the value
using the computation above. of this field using the computation above.
The compressor MAY use the header checksum to validate the The compressor MAY use the header checksum to validate the
correctness of the header before compressing it, to avoid compressing correctness of the header before compressing it, to avoid processing
a corrupted header. a corrupted header.
6.6.5. inferred_mine_header_checksum 6.6.5. inferred_mine_header_checksum
This encoding method compresses the minimal encapsulation header This encoding method compresses the minimal encapsulation header
checksum. This checksum is defined in RFC 2004 [RFC2004] as follows: checksum. This checksum is defined in RFC 2004 [RFC2004] as follows:
Header Checksum Header Checksum
The 16-bit one's complement of the one's complement sum of all The 16-bit one's complement of the one's complement sum of all
16-bit words in the minimal forwarding header. For purposes of 16-bit words in the minimal forwarding header. For purposes of
computing the checksum, the value of the checksum field is 0. computing the checksum, the value of the checksum field is 0.
The IP header and IP payload (after the minimal forwarding The IP header and IP payload (after the minimal forwarding
header) are not included in this checksum computation. header) are not included in this checksum computation.
The "inferred_mine_header_checksum" encoding method compresses the The "inferred_mine_header_checksum" encoding method compresses the
minimal encapsulation header checksum down to a size of zero bit, minimal encapsulation header checksum down to a size of zero bits,
i.e. no bits are transmitted in compressed headers for this field. i.e. no bits are transmitted in compressed headers for this field.
Using this encoding method, the decompressor infers the value of this Using this encoding method, the decompressor infers the value of this
field using the above computation. field using the above computation.
The motivations for inferring this checksum are similar to the ones The motivations for inferring this checksum are similar to the ones
explained above in Section 6.6.4. explained above in Section 6.6.4.
The compressor MAY use the minimal encapsulation header checksum to The compressor MAY use the minimal encapsulation header checksum to
validate the correctness of the header before compressing it, to validate the correctness of the header before compressing it, to
avoid compressing a corrupted header. avoid processing a corrupted header.
6.6.6. inferred_ip_v4_length 6.6.6. inferred_ip_v4_length
This encoding method compresses the total length field of the IPv4 This encoding method compresses the total length field of the IPv4
header. The total length field of the IPv4 header is defined in RFC header. The total length field of the IPv4 header is defined in RFC
791 [RFC0791] as follows: 791 [RFC0791] as follows:
Total Length: 16 bits Total Length: 16 bits
Total Length is the length of the datagram, measured in octets, Total Length is the length of the datagram, measured in octets,
including internet header and data. This field allows the including internet header and data. This field allows the
length of a datagram to be up to 65,535 octets. length of a datagram to be up to 65,535 octets.
The "inferred_ip_v4_length" encoding method compresses the IPv4 The "inferred_ip_v4_length" encoding method compresses the IPv4
header checksum down to a size of zero bit, i.e. no bits are header checksum down to a size of zero bits, i.e. no bits are
transmitted in compressed headers for this field. Using this transmitted in compressed headers for this field. Using this
encoding method, the decompressor infers the value of this field by encoding method, the decompressor infers the value of this field by
counting in octets the length of the entire packet after counting in octets the length of the entire packet after
decompression. decompression.
6.6.7. inferred_ip_v6_length 6.6.7. inferred_ip_v6_length
This encoding method compresses the payload length field in the IPv6 This encoding method compresses the payload length field in the IPv6
header. This length field is defined in RFC 2460 [RFC2460] as header. This length field is defined in RFC 2460 [RFC2460] as
follows: follows:
Payload Length: 16-bit unsigned integer Payload Length: 16-bit unsigned integer
Length of the IPv6 payload, i.e., the rest of the packet Length of the IPv6 payload, i.e., the rest of the packet
following this IPv6 header, in octets. (Note that any following this IPv6 header, in octets. (Note that any
extension headers present are considered part of the payload, extension headers present are considered part of the payload,
i.e., included in the length count.) i.e., included in the length count.)
The "inferred_ip_v6_length" encoding method compresses the payload The "inferred_ip_v6_length" encoding method compresses the payload
length field of the IPv6 header down to a size of zero bit, i.e. no length field of the IPv6 header down to a size of zero bits, i.e. no
bits are transmitted in compressed headers for this field. Using bits are transmitted in compressed headers for this field. Using
this encoding method, the decompressor infers the value of this field this encoding method, the decompressor infers the value of this field
by counting in octets the length of the entire packet after by counting in octets the length of the entire packet after
decompression. decompression.
6.6.8. Scaled RTP Timestamp Encoding 6.6.8. Scaled RTP Timestamp Encoding
The RTP timestamp (TS) usually increases by a multiple of the RTP The RTP timestamp (TS) usually increases by a multiple of the RTP
Sequence Number's (SN) increase and is therefore a suitable candidate Sequence Number's (SN) increase and is therefore a suitable candidate
for scaled encoding. This scaling factor is labeled ts_stride in the for scaled encoding. This scaling factor is labeled ts_stride in the
definition of the profile in ROHC-FN Section 6.8. The compressor definition of the profile in ROHC-FN Section 6.8. The compressor
sets the scaling factor based on the change in TS with respect to the sets the scaling factor based on the change in TS with respect to the
change in the RTP SN. change in the RTP SN.
The initial value of the scaling factor ts_stride is always set to 1 As defined in Section 6.8.2.4, the initial value of the scaling
[NOTE: define what is initial? New context with this profile?]. factor ts_stride is always set to 160. For the compressor to start
When ts_stride is set to 1, scaling is not applied on the field for using scaled encoding using a value different than this default
any format. value, it must first explicitly transmit the new value of ts_stride
to the decompressor, using one of the packet types that can carry
this information. If the compressor decides to use the default
value, the stride does not need to be transmit in this step.
Initially, the scaling factor is set to 1, meaning that no actual Once the value of the scaling factor is established, before using the
scaling is performed even in the scaled packet formats. For the new scaling factor, the compressor must have enough confidence that
compressor to use a different scaling value, it must first explicitly the decompressor has successfully calculated the residue (ts_offset)
transmit the new value of ts_stride to the decompressor, using one of of the scaling function for the timestamp. This is done by sending
the packet types that can carry this information. Once the new value
of the scaling factor is established, before using the new scaling
factor, the compressor must have enough confidence that the
decompressor has successfully calculated the residue (ts_offset) of
the scaling function for the timestamp. This is done by sending
unscaled timestamp values to allow the decompressor to establish the unscaled timestamp values to allow the decompressor to establish the
residue based on the current ts_stride. The compressor MAY send the residue based on the current ts_stride. The compressor MAY send the
unscaled timestamp in the same packets as the ones establishing the unscaled timestamp in the same packets as the ones establishing the
new ts_stride value. new ts_stride value.
Once the compressor has gained enough confidence that both the value Once the compressor has gained enough confidence that both the value
of the scaling factor and the value of the residue have been of the scaling factor and the value of the residue have been
established in the decompressor, the compressor can start compressing established in the decompressor, the compressor can start compressing
packets using the new scaling factor. packets using the new scaling factor.
skipping to change at page 26, line 33 skipping to change at page 29, line 12
occurs, the compressor re-establishes the new residue value as occurs, the compressor re-establishes the new residue value as
described above. described above.
The compressor MAY use the scaled timestamp encoding; what value it The compressor MAY use the scaled timestamp encoding; what value it
will use as the scaling factor is up to the compressor will use as the scaling factor is up to the compressor
implementation, but to achive any gains from the scaling, the implementation, but to achive any gains from the scaling, the
ts_stride should be set to the value of the expected incease in ts_stride should be set to the value of the expected incease in
timestamp between consecutive sequence numbers. timestamp between consecutive sequence numbers.
When scaled timestamp encoding is used for packet formats that do not When scaled timestamp encoding is used for packet formats that do not
transmit any LSB-encoded timestamp bits at all, the Section 6.6.10 is transmit any LSB-encoded timestamp bits at all, the
used for encoding the timestamp. inferred_scaled_field encoding of Section 6.6.10 is used for encoding
the timestamp.
6.6.9. Timer-Based RTP Timestamp Encoding 6.6.9. timer_based_lsb
Text to be added. Same encoding method as in RFC 3095, section The timer-based compression encoding method, "timer_based_lsb",
4.5.4. compresses a field whose change pattern approximates a linear
function of the time of day.
This encoding uses the local clock to obtain an approximation of the
value that it encodes. The approximated value is then used as a
reference value together with the num_lsbs_param least-significant
bits received as the encoded value, where num_lsbs_param represents a
number of bits that is sufficient to uniquely represent the encoded
value in the presence of jitter between compression endpoints.
The clock resolution of the compressor or decompressor can be less
than time_stride; in this case, the difference, i.e., actual
resolution - time_stride, is treated as additional jitter in the
calculation of the number of LSBs that needs to be transmitted.
ts_scaled =:= timer_based_lsb(<time_stride_param>,
<num_lsbs_param>, <offset_param>)
The parameters "num_lsbs_param" and "offset_param" are the parameters
to use for the lsb encoding, i.e. the number of least significant
bits and the interpretation interval offset, respectively. The
parameter "time_stride_param" represents the context value of the
control field time_stride.
This encoding method always uses a scaled version of the field it
compresses.
The value of the field is decoded by calculating an approximation of
the uncompressed value, using:
tsc_ref_advanced = tsc_ref + (a_n - a_ref) / time_stride.
where:
- tsc_ref is a reference value of the scaled representation
of the field.
- a_n is the arrival time associated to the value to decode.
- a_ref is the arrival time associated to the reference header.
- tsc_ref_advanced is an approximation of the uncompressed value
of the field.
The lsb() encoding is then applied using the num_lsbs_param bits
received in the CO header and tsc_ref_advanced as "ref_value" (as per
Section 4.11.5 of [RFC4997]).
Appendix B.3 provides an example on how the compressor can calculate
jitter.
The control field time_stride controls whether or not the
timer_based_lsb method is used in the CO header. The decompressor
SHOULD send the CLOCK_RESOLUTION option if it receives a non-zero
time_stride value and it has not previously informed the compressor
that it supports timer-based compression using the CLOCK_RESOLUTION
option with a non-zero value. Whether the CLOCK_RESOLUTION is set to
a non-zero value or to a zero value is up to the implementation.
The support and usage of timer-based compression is optional for both
the compressor and the decompressor; the compressor is never required
to set the time_stride control field to a non-zero value when it has
received a non-zero value for the CLOCK_RESOLUTION option.
6.6.10. inferred_scaled_field 6.6.10. inferred_scaled_field
The "inferred_scaled_field" encoding method is used to encode a field The "inferred_scaled_field" encoding method is used to encode a field
that is defined as changing in relation to the MSN but for each that is defined as changing in relation to the MSN but for each
increase is scaled by an established scaling factor. This encoding increase is scaled by an established scaling factor. This encoding
method is to be used in the case when a packet format contains MSN method is to be used in the case when a packet format contains MSN
bits, but does not contain any bits for the scaled field. In this bits, but does not contain any bits for the scaled field. In this
case, the new value for the field being scaled is calculated case, the new value for the field being scaled is calculated
according to the following formula: according to the following formula:
unscaled_value = delta_msn * stride + previous_unscaled_value unscaled_value = delta_msn * stride + reference_unscaled_value
Where "delta_msn" is the difference is MSN between the previous value
of MSN in the context and the value of the MSN decompressed from this Where "delta_msn" is the difference in MSN between the reference
packet, "previous_unscaled_value" is the value of the field being value of the MSN in the context and the value of the MSN decompressed
scaled in the context, and "stride" is the scaling value for this from this packet, "reference_unscaled_value" is the value of the
field. field being scaled in the context, and "stride" is the scaling value
for this field.
For example, when this encoding method is applied to the RTP For example, when this encoding method is applied to the RTP
timestamp in the RTP profile, the calculation above becomes: timestamp in the RTP profile, the calculation above becomes:
timestamp = delta_msn * ts_stride + previous_timestamp
timestamp = delta_msn * ts_stride + reference_timestamp
6.6.11. control_crc3_encoding 6.6.11. control_crc3_encoding
The "control_crc3_encoding" method provides a CRC calculated over a The "control_crc3_encoding" method provides a CRC calculated over a
number of control fields. The definition of this encoding method is number of control fields. The definition of this encoding method is
the same as for the "crc" encoding method specified in section 4.11.6 the same as for the "crc" encoding method specified in section 4.11.6
of [I-D.ietf-rohc-formal-notation], with the difference that the data of [RFC4997], with the difference that the data that is covered by
that is covered by the CRC is given by a concatenated list of control the CRC is given by a concatenated list of control fields.
fields.
In other words, the definition of the control_crc3_encoding method is In other words, the definition of the control_crc3_encoding method is
equivalent to the following definition: equivalent to the following definition:
control_crc_encoding(data_value, data_length) control_crc_encoding(data_value, data_length)
{ {
UNCOMPRESSED { UNCOMPRESSED {
} }
COMPRESSED { COMPRESSED {
skipping to change at page 27, line 41 skipping to change at page 31, line 34
} }
COMPRESSED { COMPRESSED {
control_crc3 =:= control_crc3 =:=
crc(3, 0x06, 0x07, ctrl_data_value, ctrl_data_length) [ 3 ]; crc(3, 0x06, 0x07, ctrl_data_value, ctrl_data_length) [ 3 ];
} }
} }
where the parameter "ctrl_data_value" binds to the concatenated where the parameter "ctrl_data_value" binds to the concatenated
values of the following control fields, in the order listed below: values of the following control fields, in the order listed below:
o reorder_ratio, 2 bits padded by 6 MSB of zeroes o reorder_ratio, 2 bits padded by 6 MSB of zeroes
o ts_stride, 16 bits (applicable only for profiles 0x0101 and o ts_stride, 32 bits (applicable only for profiles 0x0101 and
0x0107) 0x0107)
o msn,16 bits (not applicable for profiles 0x0101 and 0x0107) o time_stride, 32 bits (applicable only for profiles 0x0101 and
0x0107)
o msn, 16 bits (not applicable for profiles 0x0101 and 0x0107, since
the RTP Sequence Number is already verified as part of the
uncompressed header)
o coverage_behavior, 2 bits padded by 6 MSB of zeroes, applicable
only to profiles 0x0107 and 0x0108
o ip_id_behavior, one octet for each IP header in the compressible
header chain starting from the outermost header. Each octet
consists of 2 bits padded by 6 MSBs of zeroes
The "ctrl_data_length" binds to the sum of the length of the control The "ctrl_data_length" binds to the sum of the length of the control
field(s) that are applicable. field(s) that are applicable.
A 3-bit CRC is used to validate the control fields that are updated A 3-bit CRC is used to validate the control fields that are updated
by the co_common and co_repair packet types; it cannot verify the by the co_common and co_repair packet types; it cannot verify the
outcome of a decompression attempt. The definition of this CRC comes outcome of a decompression attempt. The definition of this CRC comes
from the fact that the decompression of a header that carries and from the fact that the decompression of a header that carries and
updates control fields does not necessarily make use of these control updates control fields does not necessarily make use of these control
fields, and the update to the control fields is thus not protected by fields, and the update to the control fields is thus not protected by
the CRC-7 validation. the CRC-7 validation.
skipping to change at page 28, line 27 skipping to change at page 32, line 31
This encoding method is used when a sequential IP-ID behavior is used This encoding method is used when a sequential IP-ID behavior is used
(sequential or sequential byte-swapped) and no coded IP-ID bits are (sequential or sequential byte-swapped) and no coded IP-ID bits are
present in the compressed header. When these packet types are used, present in the compressed header. When these packet types are used,
the IP-ID offset from the MSN will be constant, and therefore, the the IP-ID offset from the MSN will be constant, and therefore, the
IP-ID will increase by the same amount as the MSN increases by IP-ID will increase by the same amount as the MSN increases by
(similar to the inferred_scaled_field encoding method). (similar to the inferred_scaled_field encoding method).
Therefore, the new value for the IP-ID is calculated according to the Therefore, the new value for the IP-ID is calculated according to the
following formula: following formula:
IP-ID = delta_msn + previous_IP_ID_value IP-ID = delta_msn + reference_IP_ID_value
Where "delta_msn" is the difference is MSN between the previous value Where "delta_msn" is the difference is MSN between the reference
of MSN in the context and the value of the MSN decompressed from this value of MSN in the context and the value of the MSN decompressed
packet, "previous_IP_ID_value" is the value of the IP-ID in the from this packet, "previous_IP_ID_value" is the value of the IP-ID in
context. the context.
If the IP-ID behavior is random or zero, this encoding method does If the IP-ID behavior is random or zero, this encoding method does
not update any fields. not update any fields.
6.6.13. list_csrc(cc_value) 6.6.13. list_csrc(cc_value)
This encoding method describes how the list of CSRC identifiers can This encoding method describes how the list of CSRC identifiers can
be compressed using list compression. This list compression operates be compressed using list compression. This list compression operates
by establishing content for the different CSRC identifiers (items) by establishing content for the different CSRC identifiers (items)
and list describing the order that they appear. and list describing the order that they appear.
The argument to this encoding method (cc_value) is the CC field from The argument to this encoding method (cc_value) is the value of the
the RTP header which the compressor passes to this encoding method. CC field from the RTP header which the compressor passes to this
The decompressor is required to bind the value of this argument to encoding method. The decompressor is required to bind the value of
the number of items in the list, which will allow the decompressor to this argument to the number of items in the list, which will allow
corectly reconstruct the CC field. the decompressor to corectly reconstruct the CC field.
6.6.13.1. List Compression 6.6.13.1. List Compression
The CSRC identifiers in the uncompressed packet can be represented as The CSRC identifiers in the uncompressed packet can be represented as
an ordered list, whose order and presence are usually constant an ordered list, whose order and presence are usually constant
between packets. The generic structure of such a list is as follows: between packets. The generic structure of such a list is as follows:
+--------+--------+--...--+--------+ +--------+--------+--...--+--------+
list: | item 1 | item 2 | | item n | list: | item 1 | item 2 | | item n |
+--------+--------+--...--+--------+ +--------+--------+--...--+--------+
When performing list compression on a CSRC list, each item is the When performing list compression on a CSRC list, each item is the
uncompressed value of one CSRC identifier. uncompressed value of one CSRC identifier.
The basic principles of list-based compression are the following: The basic principles of list-based compression are the following:
1) When a context is being initialized, a complete representation 1) When a context is being initialized, a complete representation
of the compressed list of options is transmitted. All items that of the list of CSRC identifiers is transmitted.
have any content are present in the compressed list of items sent
by the compressor.
Then, once the context has been initialized: Then, once the context has been initialized:
2) When the structure of the list is unchanged no information 2) When the structure of the list is unchanged, no information
about the list is sent in compressed headers. about the list is sent in compressed headers.
3) When the structure of the list changes, a compressed list is 3) When the structure of the list changes, a compressed list is
sent in the compressed header, including a representation of its sent in the compressed header, including a representation of its
structure and order. Previously unknown items are sent structure and order. Previously unknown items are sent
uncompressed in the list, while previously known items are only uncompressed in the list, while previously known items are only
represented by an index pointing to the context. represented by an index pointing to the context.
6.6.13.2. Table-based Item Compression 6.6.13.2. Table-based Item Compression
The Table-based item compression compresses individual items sent in The Table-based item compression compresses individual items sent in
skipping to change at page 30, line 5 skipping to change at page 34, line 5
items, indexed using "Index". The (Index, Item) pair is sent items, indexed using "Index". The (Index, Item) pair is sent
together in compressed lists until the compressor gains enough together in compressed lists until the compressor gains enough
confidence that the decompressor has observed the mapping between confidence that the decompressor has observed the mapping between
items and their respective index. Confidence is obtained from the items and their respective index. Confidence is obtained from the
reception of an acknowledgment from the decompressor, or by reception of an acknowledgment from the decompressor, or by
sending (Index, Item) pairs using the optimistic approach. Once sending (Index, Item) pairs using the optimistic approach. Once
confidence is obtained, the index alone is sent in compressed confidence is obtained, the index alone is sent in compressed
lists to indicate the presence of the item corresponding to this lists to indicate the presence of the item corresponding to this
index. index.
The compressor may reset its item table upon receiving negative
acknowledgement.
The compressor may reassign an existing index to a new item, by The compressor may reassign an existing index to a new item, by
re-establishing the mapping using the procedure described above. re-establishing the mapping using the procedure described above.
Decompressor Logic Decompressor Logic
The decompressor conceptually maintains an Item Table that The decompressor conceptually maintains an Item Table that
contains all (Index, Item) pairs received. The Item Table is contains all (Index, Item) pairs received. The Item Table is
updated whenever an (Index, Item) pair is received and updated whenever an (Index, Item) pair is received and
decompression is successfully verified using the CRC. The decompression is successfully verified using the CRC. The
decompressor retrieves the item from the table whenever an Index decompressor retrieves the item from the table whenever an Index
skipping to change at page 32, line 17 skipping to change at page 36, line 17
Item 1, ..., item n: Each item corresponds to an XI with X = 1 in Item 1, ..., item n: Each item corresponds to an XI with X = 1 in
XI 1, ..., XI m. Each entry in the item list is the uncompressed XI 1, ..., XI m. Each entry in the item list is the uncompressed
representation of one CSRC identifier. representation of one CSRC identifier.
6.6.13.4. Item Table Mappings 6.6.13.4. Item Table Mappings
The item table for list compression is limited to 16 different items, The item table for list compression is limited to 16 different items,
since the RTP header can only carry at most 15 simultaneous CSRC since the RTP header can only carry at most 15 simultaneous CSRC
identifiers. The effect of having more than 16 items will only cause identifiers. The effect of having more than 16 items will only cause
a slight overhead to the compressor when items are swappen in/out of a slight overhead to the compressor when items are swapped in/out of
the item table. the item table.
6.6.13.5. Compressed Lists in Dynamic Chain 6.6.13.5. Compressed Lists in Dynamic Chain
A compressed list that is part of the dynamic chain (e.g. in IR A compressed list that is part of the dynamic chain (i.e. in IR
packets) must have all its list items present, i.e. all X-bits in the packets) must have all its list items present, i.e. all X-bits in the
XI list MUST be set. All items previously established in the item XI list MUST be set. All items previously established in the item
table that are not present in the list decompressed from this packet table that are not present in the list decompressed from this packet
MUST also be retained in the decompressor context. MUST also be retained in the decompressor context.
6.7. Encoding Methods With External Parameters 6.7. Encoding Methods With External Parameters
A number of encoding methods in Section 6.8.3.2 have one or more A number of encoding methods in Section 6.8.2.4 have one or more
arguments for which the derivation of the parameter's value is arguments for which the derivation of the parameter's value is
outside the scope of the ROHC-FN specification of the header formats. outside the scope of the ROHC-FN specification of the header formats.
This section lists the encoding methods together with a definition of This section lists the encoding methods together with a definition of
each of their parameters. each of their parameters.
o ip_dest_opt(repair_flag): o esp_null(next_header_value):
repair_flag: This parameter must be set to the value that was
used for the corresponding "repair_flag" parameter of the
"[profilename]_baseheader" encoding method when extracting the
irregular chain for a compressed header; otherwise it is set to
zero and ignored for other types of chains.
o ip_hop_opt(repair_flag):
See definition of arguments for "ip_dest_opt" above.
o gre(repair_flag):
See definition of arguments for "ip_dest_opt" above.
o ah(repair_flag):
See definition of arguments for "ip_dest_opt" above.
o esp_null(next_header_value, repair_flag):
next_header_value: Set to the value of the Next Header field next_header_value: Set to the value of the Next Header field
located in the ESP trailer, usually 12 octets from the end of located in the ESP trailer, usually 12 octets from the end of
the packet. Compression of null-encrypted ESP headers should the packet. Compression of null-encrypted ESP headers should
only be performed when the compressor has prior knowledge of only be performed when the compressor has prior knowledge of
the exact location of the next header field. the exact location of the next header field.
repair_flag: This parameter must be set to the value that was o ipv6(profile, is_innermost, outer_ip_flag)):
used for the corresponding "repair_flag" parameter of the
"[profilename]_baseheader" encoding method when extracting the
irregular chain for a compressed header; otherwise it is set to
zero and ignored for other types of chains.
o ipv6(profile, is_innermost, ip_outer_flag, repair_flag)):
profile: Set to the profile number of the profile used to profile: Set to the 16-bit profile number of the profile used
compress this packet. to compress this packet.
is_innermost: This boolean flag is set to 1 when processing the is_innermost: This boolean flag is set to 1 when processing the
innermost IP header; otherwise it is set to 0. innermost IP header; otherwise it is set to 0.
repair_flag: This parameter must be set to the value that was outer_ip_flag: This parameter is set to 1 if one or more of a
used for the corresponding "repair_flag" parameter of the number of semi-static fields in outer IP headers have changed
"[profilename]_baseheader" encoding method when extracting the compared to their reference values in the context, otherwise it
irregular chain for a compressed header; otherwise it is set to is set to 0. The value used for this parameter is also used
zero and ignored for other types of chains. for the "outer_ip_flag" argument for a number of encoding
methods defined above, when these are processing the irregular
chain. This flag may only be set to 1 for the "co_common"
packet format in the different profiles.
o ipv4(profile, is_innermost, ip_outer_flag, repair_flag) o ipv4(profile, is_innermost, outer_ip_flag)
See definition of arguments for "ipv6" above. See definition of arguments for "ipv6" above.
o udp(profile) o udp(profile)
profile: Set to the profile number of the profile used to profile: Set to the 16-bit profile number of the profile used
compress this packet. to compress this packet.
o rtp(profile, ts_stride_value, time_stride_value) o rtp(profile, ts_stride_value, time_stride_value)
profile: Set to the profile number of the profile used to
compress this packet.
ts_stride_value: This parameter is set to a user-selected value profile: Set to the 16-bit profile number of the profile used
that is the expected increase in the RTP Timestamp between to compress this packet.
consecutive sequence numbers. See also Section 6.6.8.
time_stride_value: This parameter is set to a user-selected ts_stride_value: The value of this parameter should be set to
value that is the expected inter-arrival time between the expected increase in the RTP Timestamp between consecutive
consecutive packets for this flow. See also Section 6.6.9. RTP sequence numbers and the selected value is implementation-
specific. See also Section 6.6.8.
o esp(profile) time_stride_value: The value of this parameter should be set to
the expected inter-arrival time between consecutive packets for
the flow, and the selected value is implementation-specific.
It MUST NOT be set to a non-zero value, unless the compressor
has received a feedback message with the CLOCK_RESOLUTION
option set to a non-zero value. See also Section 6.6.9.
profile: Set to the profile number of the profile used to o esp(profile)
compress this packet. profile: Set to the 16-bit profile number of the profile used
to compress this packet.
o udp_lite(profile) o udp_lite(profile)
profile: Set to the profile number of the profile used to profile: Set to the 16-bit profile number of the profile used
compress this packet. to compress this packet.
o rtp_baseheader(profile, ts_stride_value, time_stride_value, o rtp_baseheader(profile, ts_stride_value, time_stride_value,
outer_ip_flag, repair_flag): outer_ip_flag):
profile: Set to the profile number of the profile used to profile: Set to the 16-bit profile number of the profile used
compress this packet. to compress this packet.
ts_stride_value: This parameter is set to a user-selected value ts_stride_value: The value of this parameter should be set to
that is the expected increase in the RTP Timestamp between the expected increase in the RTP Timestamp between consecutive
consecutive sequence numbers. See also Section 6.6.8. RTP sequence numbers and the selected value is implementation-
specific. See also Section 6.6.8.
time_stride_value: This parameter is set to a user-selected time_stride_value: The value of this parameter should be set to
value that is the expected inter-arrival time between the expected inter-arrival time between consecutive packets for
consecutive packets for this flow. See also Section 6.6.9. the flow, and the selected value is implementation-specific.
It MUST NOT be set to a non-zero value, unless the compressor
has received a feedback message with the CLOCK_RESOLUTION
option set to a non-zero value. See also Section 6.6.9.
outer_ip_flag: This parameter is set to 1 of one or more of a a outer_ip_flag: This parameter is set to 1 if one or more of a
number of semi-static fields in outer IP headers have changed number of semi-static fields in outer IP headers have changed
compared to their reference values in the context, otherwise it compared to their reference values in the context, otherwise it
is set to 0. The value used for this parameter is also used is set to 0. The value used for this parameter is also used
for the "outer_ip_flag" argument for a number of encoding for the "outer_ip_flag" argument for a number of encoding
methods defined above, when these are processing the irregular methods defined above, when these are processing the irregular
chain. This flag may only be set to 1 either for the chain. This flag may only be set to 1 either for the
"co_common" or the "co_repair" packet formats in the different "co_common" packet format in the different profiles.
profiles.
repair_flag: This parameter is set to 1 if the certain fields
in extension headers or outer IP headers have changed compared
to their reference values in the context, otherwise it is set
to 0. The value used for this parameter is also used for the
"repair_flag" argument for a number of encoding methods defined
above, when these are processing the irregular chain. This may
only be set to 1 for the "co_repair" packet formats in the
different profiles.
o udp_baseheader(profile, outer_ip_flag, repair_flag):
profile: Set to the profile number of the profile used to o udp_baseheader(profile, outer_ip_flag):
compress this packet.
outer_ip_flag: This parameter is set to 1 of one or more of a a profile: Set to the 16-bit profile number of the profile used
number of semi-static fields in outer IP headers have changed to compress this packet.
compared to their reference values in the context, otherwise it
is set to 0. The value used for this parameter is also used
for the "outer_ip_flag" argument for a number of encoding
methods defined above, when these are processing the irregular
chain. This flag may only be set to 1 either for the
"co_common" or the "co_repair" packet formats in the different
profiles.
repair_flag: This parameter is set to 1 if the certain fields outer_ip_flag: See definition of this argument for
in extension headers or outer IP headers have changed compared "rtp_baseheader" above.
to their reference values in the context, otherwise it is set
to 0. The value used for this parameter is also used for the
"repair_flag" argument for a number of encoding methods defined
above, when these are processing the irregular chain. This may
only be set to 1 for the "co_repair" packet formats in the
different profiles.
o esp_baseheader(profile, outer_ip_flag, repair_flag): o esp_baseheader(profile, outer_ip_flag):
See definition of arguments for "udp_baseheader" above. See definition of arguments for "udp_baseheader" above.
o iponly_baseheader(profile, outer_ip_flag, repair_flag): o iponly_baseheader(profile, outer_ip_flag):
See definition of arguments for "udp_baseheader" above. See definition of arguments for "udp_baseheader" above.
o udplite_rtp_baseheader(profile, ts_stride_value, o udplite_rtp_baseheader(profile, ts_stride_value,
time_stride_value, outer_ip_flag, repair_flag): time_stride_value, outer_ip_flag):
See definition of arguments for "rtp_baseheader" above. See definition of arguments for "rtp_baseheader" above.
o udplite_baseheader(profile, outer_ip_flag, repair_flag): o udplite_baseheader(profile, outer_ip_flag):
See definition of arguments for "udp_baseheader" above. See definition of arguments for "udp_baseheader" above.
6.8. Packet Formats 6.8. Packet Formats
ROHCv2 profiles use two different packet types: the Initialization ROHCv2 profiles use two different packet types: the Initialization
and Refresh (IR) packet type, and the Compressed packet type (CO). and Refresh (IR) packet type, and the Compressed packet type (CO).
Each packet type defines a number of packet formats: two packet Each packet type defines a number of packet formats: An IR packet
formats are defined for the IR type, and two sets base header formats format, and two sets base header formats are defined for the CO type
are defined for the CO type with one additional format that is common with a few additional formats that are common to both sets.
to both sets.
When the number of bits available in compressed header fields exceeds
the number of bits in the value, the most significant field is padded
with zeroes in its most significant bits.
Updating Properties: all packet types carry a CRC and are context
updating. Packets update the entire context besides the fields for
which they explicitly convey information for, since the context can
be expressed as the collection of the reference value of each field
together with the function established with respect to the MSN.
6.8.1. Initialization and Refresh Packet (IR) 6.8.1. Initialization and Refresh Packet (IR)
The IR packet format uses the structure of the ROHC IR packet as The IR packet format uses the structure of the ROHC IR packet as
defined in [I-D.ietf-rohc-rfc3095bis-framework], section 5.2.2.1. defined in [RFC4995], section 5.2.2.1.
Packet type: IR Packet type: IR
This packet type communicates the static part and the dynamic part This packet type communicates the static part and the dynamic part
of the context. of the context.
The ROHCv2 IR packet has the following format: The ROHCv2 IR packet has the following format:
0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
--- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
skipping to change at page 37, line 39 skipping to change at page 40, line 39
| | | |
/ Payload / variable length / Payload / variable length
| | | |
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Static chain: See Section 6.5. Static chain: See Section 6.5.
Dynamic chain: See Section 6.5. Dynamic chain: See Section 6.5.
Payload: The payload of the corresponding original packet, if any. Payload: The payload of the corresponding original packet, if any.
The presence of a payload is inferred from the packet length. The payload consists of all data after the last octet of the last
header compressed by the current profile. The presence of a
6.8.2. IR Packet Payload Discard (IR-PD) payload is inferred from the packet length.
The IR-PD packet format uses the structure of the ROHC IR packet as
defined in [I-D.ietf-rohc-rfc3095bis-framework], section 5.2.2.1.
Packet type: IR-PD
This packet type communicates the static part and the dynamic part
of the context, but without the payload of the original packet for
which it carries the header information.
The ROHCv2 IR packet has the following format:
0 1 2 3 4 5 6 7
--- --- --- --- --- --- --- ---
: Add-CID octet : if for small CIDs and (CID != 0)
+---+---+---+---+---+---+---+---+
| 1 1 1 1 1 1 0 0 | IR type octet
+---+---+---+---+---+---+---+---+
: :
/ 0-2 octets of CID / 1-2 octets if for large CIDs
: :
+---+---+---+---+---+---+---+---+
| Profile | 1 octet
+---+---+---+---+---+---+---+---+
| CRC | 1 octet
+---+---+---+---+---+---+---+---+
| |
/ Static chain / variable length
| |
- - - - - - - - - - - - - - - -
| |
/ Dynamic chain / variable length
| |
- - - - - - - - - - - - - - - -
Static chain: See Section 6.5.
Dynamic chain: See Section 6.5.
6.8.3. Compressed Packet Formats (CO) 6.8.2. Compressed Packet Formats (CO)
6.8.3.1. Design rationale for compressed base headers 6.8.2.1. Design rationale for compressed base headers
The compressed packet formats are defined as two separate sets for The compressed packet formats are defined as two separate sets for
each profile: one set for the packets where the innermost IP header each profile: one set for the packets where the innermost IP header
contains a sequential IP-ID (either network byte order or byte contains a sequential IP-ID (either network byte order or byte
swapped), and one set for the packets without sequential IP-ID swapped), and one set for the packets without sequential IP-ID
(either random, zero, or no IP-ID). (either random, zero, or no IP-ID). There are also a number of
common packet format shared between both sets. When described below,
the packet formats belonging to the sequential set contain "seq" in
their names, while those belonging to the non-sequential set contain
the "rnd" in their names.
The design of the packet formats is derived from the field behavior The design of the packet formats is derived from the field behavior
analysis found in Appendix A. analysis found in Appendix A.
All of the compressed base headers transmit LSB-encoded MSN bits and All of the compressed base headers transmit LSB-encoded MSN bits and
a CRC. a CRC.
The following packet formats exist for all profiles defined in this The following packet formats exist for all profiles defined in this
document, both for the sequential and random packet format sets: document, both for the sequential and random packet format sets:
o co_common: The common packet format is designed so that it can be o co_common: The common packet format is designed so that it can be
used for chagnes to all the dynamic fields in the context, but can used for changes to any dynamic field in the context, but can not
not always transmit all these fields uncompressed can be used. It always transmit all such fields uncompressed. It is therefore
is therefore useful for when some of the more rarely changing useful for when some of the more rarely changing fields in the
fields in the headers change. Since this packet format may modify headers change. Since this packet format may modify the value of
the value of the control fields that determine how the the control fields that determine how the decompressor interprets
decompressor interprets different compressed header format, it different compressed header format, it carries a 7-bit CRC to
carries a 7-bit CRC to reduce the probability of context reduce the probability of context corruption. This packet format
corruption. This packet format uses a large set of flags to uses a large set of flags to provide information about which
provide information about which fields are present in the packet fields are present in the packet format and can therefore be of
format and can therefore be of very varied size. very varied size. This packet format is similar to the UOR-2-
extension 3 packet format in [RFC3095]
o co_repair: This format is very similar to the co_common format o co_repair: This format is intended to be used when context damage
described above. The difference is that this packet is intended has been assumed, and therefore changing fields are transmit
to be used when context damage has been assumed, and therefore uncompressed in this format and contains a complete dynamic chain.
changing fields are transmit uncompressed when present in this This packet format should be considered a replacement for the IR-
format. This format also contains some options to transmit semi- DYN packet format which is not defined for the profiles defined in
static fields from extension headers which cannot be transmit with this document.
the co_common format. This packet format should be considered a
replacement for the IR-DYN packet format which is not defined for
the profiles defined in this document.
o pt_0_crc3: This packet format only transmit the MSN, and can o pt_0_crc3: This packet format only transmits the MSN, and can
therefore only be used to update the MSN and fields that are therefore only be used to update the MSN and fields that are
derived from the MSN, such as IP-ID and the RTP Timestamp (where derived from the MSN, such as IP-ID and the RTP Timestamp (where
applicable). This packet format is equivalent to the UO-0 packet applicable). This packet format is equivalent to the UO-0 packet
format in [RFC3095] format in [RFC3095]
o pt_0_crc7: This packet has the same properties as pt_0_crc3, but o pt_0_crc7: This packet has the same properties as pt_0_crc3, but
is instead protected by a 7-bit CRC and contains a larger amount is instead protected by a 7-bit CRC and contains a larger amount
of LSB-encoded MSN bits. This format is intended to be used for of LSB-encoded MSN bits. This format can for example be used on
the compressor to transmit from IC state to FC state (see ROHC channels that expect a high amount of reordering or link
Section 5.3.1 or it can be used on ROHC channels that expect a layers with high residual error rates.
high amount of reordering.
The following packet formats exist exclusively for profiles 0x101 and The following packet format descriptions apply to profiles 0x101 and
0x107. 0x107.
o pt_1_rnd: This format is a replacement for the UO-1 packet format o pt_1_rnd: This format is a replacement for the UO-1 packet format
in [RFC3095] and can be used to transmit changes in the MSN, RTP in [RFC3095] and can be used to transmit changes in the MSN, RTP
Marker bit and it can update the RTP timestamp using scaled Marker bit and it can update the RTP timestamp using scaled
timestamp encoding. timestamp encoding.
o pt_1_seq_id: This format is a replacement for the UO-1-ID packet o pt_1_seq_id: This format is a replacement for the UO-1-ID packet
format in [RFC3095] and can be used to transmit changes in the MSN format in [RFC3095] and can be used to transmit changes in the MSN
and IP-ID. and IP-ID.
skipping to change at page 40, line 31 skipping to change at page 42, line 39
o pt_2_seq_ts: This format is a replacement for the UO-2-TS packet o pt_2_seq_ts: This format is a replacement for the UO-2-TS packet
format in [RFC3095] and can be used to transmit changes in the format in [RFC3095] and can be used to transmit changes in the
MSN, RTP Marker bit and can update the RTP Timestamp using scaled MSN, RTP Marker bit and can update the RTP Timestamp using scaled
timestamp encoding. This format is also protected by a 7-bit CRC. timestamp encoding. This format is also protected by a 7-bit CRC.
o pt_2_seq_both: This format is replaces the UOR-2-ID extension 1 o pt_2_seq_both: This format is replaces the UOR-2-ID extension 1
format in [RFC3095] and can carry changes in both the RTP format in [RFC3095] and can carry changes in both the RTP
Timestamp and IP-ID in addition to the MSN and Marker bit. Timestamp and IP-ID in addition to the MSN and Marker bit.
The following packet formats exist exclusively for profiles 0x102, The following packet formats descriptions apply to profiles 0x102,
0x103, 0x104 and 0x108. 0x103, 0x104 and 0x108.
o pt_1_seq_id: This format is a replacement for the UO-1-ID packet o pt_1_seq_id: This format is a replacement for the UO-1-ID packet
format in [RFC3095] and can be used to transmit changes in the MSN format in [RFC3095] and can be used to transmit changes in the MSN
and IP-ID. and IP-ID.
o pt_2_rnd: This format is a replacement for the UOR-2 packet format o pt_2_rnd: This format is a replacement for the UOR-2 packet format
in [RFC3095] and can be used to transmit changes in the MSN and is in [RFC3095] and can be used to transmit changes in the MSN and is
protected by a 7-bit CRC. protected by a 7-bit CRC.
o pt_2_seq_id: This format is a replacement for the UO-2-ID packet o pt_2_seq_id: This format is a replacement for the UO-2-ID packet
format in [RFC3095] and can be used to transmit changes in the MSN format in [RFC3095] and can be used to transmit changes in the MSN
and IP-ID. This format is also protected by a 7-bit CRC. and IP-ID. This format is also protected by a 7-bit CRC.
6.8.3.2. General CO Header Format 6.8.2.2. co_repair Header Format
The ROHCv2 co_repair packet has the following format:
0 1 2 3 4 5 6 7
--- --- --- --- --- --- --- ---
: Add-CID octet : if for small CIDs and CID 1-15
+---+---+---+---+---+---+---+---+
| 1 1 1 1 1 0 1 1 | discriminator
+---+---+---+---+---+---+---+---+
: :
/ 0, 1, or 2 octets of CID / 1-2 octets if large CIDs
: :
+---+---+---+---+---+---+---+---+
|r1 | CRC-7 |
+---+---+---+---+---+---+---+---+
| r2 | CRC-3 |
+---+---+---+---+---+---+---+---+
| |
/ Dynamic chain / variable length
| |
- - - - - - - - - - - - - - - -
| |
/ Payload / variable length
| |
- - - - - - - - - - - - - - - -
r1: MUST be set to zero; otherwise, the decompressor MUST discard
the packet.
CRC-7: A 7-bit CRC over the entire uncompressed header, computed
using the crc7(data_value, data_length) encoding method defined in
Section 6.8.2.4, where data_value corresponds to the entire
uncompressed header chain and data_length the length of this
header chain.
r2: MUST be set to zero; otherwise, the decompressor MUST discard
the packet.
CRC-3: See Section 6.6.11.
Dynamic chain: See Section 6.5.
Payload: The payload of the corresponding original packet, if any.
The payload consists of all data after the last octet of the last
header compressed by the current profile. The presence of a
payload is inferred from the packet length.
6.8.2.3. General CO Header Format
The CO packets communicate irregularities in the packet header. All The CO packets communicate irregularities in the packet header. All
CO packets carry a CRC and can update the context. CO packets carry a CRC and can update the context. All CO formats
except for co_repair which is defined in Section 6.8.2.2 use the
general format defined in this section.
The general format for a compressed header is as follows: The general format for a compressed header is as follows:
0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
--- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
: Add-CID octet : if for small CIDs and CID 1-15 : Add-CID octet : if for small CIDs and CID 1-15
+---+---+---+---+---+---+---+---+ +---+---+---+---+---+---+---+---+
| first octet of base header | (with type indication) | first octet of base header | (with type indication)
+---+---+---+---+---+---+---+---+ +---+---+---+---+---+---+---+---+
: : : :
/ 0, 1, or 2 octets of CID / 1-2 octets if large CIDs / 0, 1, or 2 octets of CID / 1-2 octets if large CIDs
: : : :
+---+---+---+---+---+---+---+---+ +---+---+---+---+---+---+---+---+
skipping to change at page 41, line 27 skipping to change at page 44, line 44
+---+---+---+---+---+---+---+---+ +---+---+---+---+---+---+---+---+
: : : :
/ Irregular Chain / variable / Irregular Chain / variable
: : : :
--- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
The base header in the figure above is the compressed representation The base header in the figure above is the compressed representation
of the innermost IP header and other header(s), if any, in the of the innermost IP header and other header(s), if any, in the
uncompressed packet. uncompressed packet.
Upon receiving other types of packet, the decompressor will The entire set of base headers are defined in Section 6.8.2.4 using
decompress it. The decompressor MUST verify the correctness of the the ROHC Formal notation [RFC4997] .
decompressed packet by CRC check. If this verification succeeds, the
decompressor passes the decompressed packet to the system's network
layer. The decompressor will then use this packet as the reference
packet.
The entire set of base headers are defined using the ROHC Formal
notation [I-D.ietf-rohc-formal-notation] in the remainder of this
section.
// TODO: 6.8.2.4. Header Formats in ROHC-FN
// - PT_0/PT_1 packets? Use "tbc-optimized" or "msn-optimized"
//////////////////////////////////////////// ////////////////////////////////////////////
// Constants // Constants
//////////////////////////////////////////// ////////////////////////////////////////////
// IP-ID behavior constants // IP-ID behavior constants
IP_ID_BEHAVIOR_SEQUENTIAL = 0; IP_ID_BEHAVIOR_SEQUENTIAL = 0;
IP_ID_BEHAVIOR_SEQUENTIAL_SWAPPED = 1; IP_ID_BEHAVIOR_SEQUENTIAL_SWAPPED = 1;
IP_ID_BEHAVIOR_RANDOM = 2; IP_ID_BEHAVIOR_RANDOM = 2;
IP_ID_BEHAVIOR_ZERO = 3; IP_ID_BEHAVIOR_ZERO = 3;
// UDP-lite checksum coverage behavior constants // UDP-lite checksum coverage behavior constants
UDP_LITE_COVERAGE_INFERRED = 0; UDP_LITE_COVERAGE_INFERRED = 0;
UDP_LITE_COVERAGE_STATIC = 1; UDP_LITE_COVERAGE_STATIC = 1;
UDP_LITE_COVERAGE_IRREGULAR = 2; UDP_LITE_COVERAGE_IRREGULAR = 2;
UDP_LITE_COVERAGE_RESERVED = 3; UDP_LITE_COVERAGE_RESERVED = 3;
// Variable reordering offset // Variable reordering offset
REORDERING_NONE = 0; REORDERING_NONE = 0;
REORDERING_QUARTER = 1; REORDERING_QUARTER = 1;
REORDERING_HALF = 2; REORDERING_HALF = 2;
REORDERING_THREEQUARTERS = 3; REORDERING_THREEQUARTERS = 3;
skipping to change at page 42, line 24 skipping to change at page 45, line 30
REORDERING_THREEQUARTERS = 3; REORDERING_THREEQUARTERS = 3;
// Profile names and versions // Profile names and versions
PROFILE_RTP_0101 = 0x0101; PROFILE_RTP_0101 = 0x0101;
PROFILE_UDP_0102 = 0x0102; PROFILE_UDP_0102 = 0x0102;
PROFILE_ESP_0103 = 0x0103; PROFILE_ESP_0103 = 0x0103;
PROFILE_IP_0104 = 0x0104; PROFILE_IP_0104 = 0x0104;
PROFILE_RTP_0107 = 0x0107; // With UDP-LITE PROFILE_RTP_0107 = 0x0107; // With UDP-LITE
PROFILE_UDPLITE_0108 = 0x0108; // Without RTP PROFILE_UDPLITE_0108 = 0x0108; // Without RTP
// Default values for RTP timestamp encoding
TS_STRIDE_DEFAULT = 160;
TIME_STRIDE_DEFAULT = 0;
//////////////////////////////////////////// ////////////////////////////////////////////
// Global control fields // Global control fields
//////////////////////////////////////////// ////////////////////////////////////////////
CONTROL { CONTROL {
msn [ 16 ]; msn [ 16 ];
reorder_ratio [ 2 ]; reorder_ratio [ 2 ];
ip_id_offset [ 16 ]; // Used if innermost IP is IPv4
} }
/////////////////////////////////////////////// ///////////////////////////////////////////////
// Encoding methods not specified in FN syntax: // Encoding methods not specified in FN syntax:
/////////////////////////////////////////////// ///////////////////////////////////////////////
baseheader_extension_headers "defined in Section X.Y.Z"; baseheader_extension_headers "defined in Section 6.6.1";
baseheader_outer_headers "defined in Section X.Y.Z"; baseheader_outer_headers "defined in Section 6.6.2";
inferred_udp_length "defined in Section X.Y.Z"; control_crc3_encoding "defined in Section 6.6.11";
inferred_ip_v4_header_checksum "defined in Section X.Y.Z"; inferred_ip_v4_header_checksum "defined in Section 6.6.4";
inferred_mine_header_checksum "defined in Section X.Y.Z"; inferred_ip_v4_length "defined in Section 6.6.6";
inferred_ip_v4_length "defined in Section X.Y.Z"; inferred_ip_v6_length "defined in Section 6.6.7";
inferred_ip_v6_length "defined in Section X.Y.Z"; inferred_mine_header_checksum "defined in Section 6.6.5";
list_csrc(cc_value) "defined in Section X.Y.Z"; inferred_scaled_field "defined in Section 6.6.10";
inferred_scaled_field "defined in Section X.Y.Z"; inferred_sequential_ip_id "defined in Section 6.6.12";
inferred_sequential_ip_id "defined in Section X.Y.Z"; inferred_udp_length "defined in Section 6.6.3";
control_crc3_encoding "defined in Section X.Y.Z"; list_csrc(cc_value) "defined in Section 6.6.13";
timer_based_lsb(time_stride, k, p) "defined in Section X.Y.Z"; timer_based_lsb(time_stride, k, p) "defined in Section 6.6.9";
//////////////////////////////////////////// ////////////////////////////////////////////
// General encoding methods // General encoding methods
//////////////////////////////////////////// ////////////////////////////////////////////
reorder_choice reorder_choice
{ {
UNCOMPRESSED { UNCOMPRESSED {
ratio [ 2 ]; ratio [ 2 ];
} }
skipping to change at page 44, line 22 skipping to change at page 47, line 34
ENFORCE(flag == 1); ENFORCE(flag == 1);
item =:= irregular(32) [ 32 ]; item =:= irregular(32) [ 32 ];
} }
COMPRESSED not_present { COMPRESSED not_present {
ENFORCE(flag == 0); ENFORCE(flag == 0);
item =:= compressed_value(0, 0) [ 0 ]; item =:= compressed_value(0, 0) [ 0 ];
} }
} }
// Send the entire value, or keep previous value
sdvl_or_static(flag) sdvl_or_static(flag)
{ {
UNCOMPRESSED { UNCOMPRESSED {
field [ 32 ]; field [ 32 ];
} }
COMPRESSED present_7bit { COMPRESSED present_7bit {
ENFORCE(flag == 1); ENFORCE(flag == 1);
ENFORCE(field.UVALUE < 2^7); ENFORCE(field.UVALUE < 2^7);
ENFORCE(field.CVALUE == field.UVALUE); ENFORCE(field.CVALUE == field.UVALUE);
skipping to change at page 45, line 24 skipping to change at page 48, line 38
discriminator =:= '11111111' [ 8 ]; discriminator =:= '11111111' [ 8 ];
field [ 32 ]; field [ 32 ];
} }
COMPRESSED not_present { COMPRESSED not_present {
ENFORCE(flag == 0); ENFORCE(flag == 0);
field =:= static; field =:= static;
} }
} }
// Send the entire value, or revert to default value
sdvl_or_default(flag, default_value)
{
UNCOMPRESSED {
field [ 32 ];
}
COMPRESSED present_7bit {
ENFORCE(flag == 1);
ENFORCE(field.UVALUE < 2^7);
ENFORCE(field.CVALUE == field.UVALUE);
discriminator =:= '0' [ 1 ];
field [ 7 ];
}
COMPRESSED present_14bit {
ENFORCE(flag == 1);
ENFORCE(field.UVALUE < 2^14);
ENFORCE(field.CVALUE == field.UVALUE);
discriminator =:= '10' [ 2 ];
field [ 14 ];
}
COMPRESSED present_21bit {
ENFORCE(flag == 1);
ENFORCE(field.UVALUE < 2^21);
ENFORCE(field.CVALUE == field.UVALUE);
discriminator =:= '110' [ 3 ];
field [ 21 ];
}
COMPRESSED present_28bit {
ENFORCE(flag == 1);
ENFORCE(field.UVALUE < 2^28);
ENFORCE(field.CVALUE == field.UVALUE);
discriminator =:= '1110' [ 4 ];
field [ 28 ];
}
COMPRESSED present_32bit {
ENFORCE(flag == 1);
ENFORCE(field.CVALUE == field.UVALUE);
discriminator =:= '11111111' [ 8 ];
field [ 32 ];
}
COMPRESSED not_present {
ENFORCE(flag == 0);
field =:= uncompressed_value(32, default_value);
}
}
lsb_7_or_31 lsb_7_or_31
{ {
UNCOMPRESSED { UNCOMPRESSED {
item [ 32 ]; item [ 32 ];
} }
COMPRESSED lsb_7 { COMPRESSED lsb_7 {
discriminator =:= '0' [ 1 ]; discriminator =:= '0' [ 1 ];
item =:= lsb(7, ((2^7) / 4) - 1) [ 7 ]; item =:= lsb(7, ((2^7) / 4) - 1) [ 7 ];
} }
skipping to change at page 46, line 36 skipping to change at page 51, line 4
ENFORCE(scaled_value == 0); ENFORCE(scaled_value == 0);
} }
COMPRESSED scaling_used { COMPRESSED scaling_used {
ENFORCE(stride_value != 0); ENFORCE(stride_value != 0);
ENFORCE(residue_field.UVALUE == (unscaled_value % stride_value)); ENFORCE(residue_field.UVALUE == (unscaled_value % stride_value));
ENFORCE(unscaled_value == ENFORCE(unscaled_value ==
scaled_value * stride_value + residue_field.UVALUE); scaled_value * stride_value + residue_field.UVALUE);
} }
} }
//////////////////////////////////////////// ////////////////////////////////////////////
// IPv6 Destination options header // IPv6 Destination options header
//////////////////////////////////////////// ////////////////////////////////////////////
ip_dest_opt(repair_flag) ip_dest_opt
{ {
UNCOMPRESSED { UNCOMPRESSED {
next_header [ 8 ]; next_header [ 8 ];
length [ 8 ]; length [ 8 ];
value [ length.UVALUE * 64 + 48 ]; value [ length.UVALUE * 64 + 48 ];
} }
DEFAULT { DEFAULT {
length =:= static; length =:= static;
next_header =:= static; next_header =:= static;
skipping to change at page 47, line 17 skipping to change at page 51, line 33
next_header =:= irregular(8) [ 8 ]; next_header =:= irregular(8) [ 8 ];
length =:= irregular(8) [ 8 ]; length =:= irregular(8) [ 8 ];
} }
COMPRESSED dest_opt_dynamic { COMPRESSED dest_opt_dynamic {
value =:= value =:=
irregular(length.UVALUE * 64 + 48) [ length.UVALUE * 64 + 48 ]; irregular(length.UVALUE * 64 + 48) [ length.UVALUE * 64 + 48 ];
} }
COMPRESSED dest_opt_irregular { COMPRESSED dest_opt_irregular {
ENFORCE(repair_flag == 0);
} }
COMPRESSED dest_opt_repair_irregular {
ENFORCE(repair_flag == 1);
value =:=
irregular(length.UVALUE * 64 + 48) [ length.UVALUE * 64 + 48 ];
}
} }
//////////////////////////////////////////// ////////////////////////////////////////////
// IPv6 Hop-by-Hop options header // IPv6 Hop-by-Hop options header
//////////////////////////////////////////// ////////////////////////////////////////////
ip_hop_opt(repair_flag) ip_hop_opt
{ {
UNCOMPRESSED { UNCOMPRESSED {
next_header [ 8 ]; next_header [ 8 ];
length [ 8 ]; length [ 8 ];
value [ length.UVALUE * 64 + 48 ]; value [ length.UVALUE * 64 + 48 ];
} }
DEFAULT { DEFAULT {
length =:= static; length =:= static;
next_header =:= static; next_header =:= static;
skipping to change at page 48, line 8 skipping to change at page 52, line 18
next_header =:= irregular(8) [ 8 ]; next_header =:= irregular(8) [ 8 ];
length =:= irregular(8) [ 8 ]; length =:= irregular(8) [ 8 ];
} }
COMPRESSED hop_opt_dynamic { COMPRESSED hop_opt_dynamic {
value =:= value =:=
irregular(length.UVALUE*64+48) [ length.UVALUE * 64 + 48 ]; irregular(length.UVALUE*64+48) [ length.UVALUE * 64 + 48 ];
} }
COMPRESSED hop_opt_irregular { COMPRESSED hop_opt_irregular {
ENFORCE(repair_flag == 0);
} }
COMPRESSED hop_opt_repair_irregular {
ENFORCE(repair_flag == 1);
value =:=
irregular(length.UVALUE * 64 + 48) [ length.UVALUE * 64 + 48 ];
}
} }
//////////////////////////////////////////// ////////////////////////////////////////////
// IPv6 Routing header // IPv6 Routing header
//////////////////////////////////////////// ////////////////////////////////////////////
ip_rout_opt ip_rout_opt
{ {
UNCOMPRESSED { UNCOMPRESSED {
next_header [ 8 ]; next_header [ 8 ];
skipping to change at page 50, line 12 skipping to change at page 54, line 15
discriminator =:= compressed_value(1, 0) [ 1 ]; discriminator =:= compressed_value(1, 0) [ 1 ];
protocol =:= uncompressed_value(16, 0x0800) [ 0 ]; protocol =:= uncompressed_value(16, 0x0800) [ 0 ];
} }
COMPRESSED ether_v6 { COMPRESSED ether_v6 {
discriminator =:= compressed_value(1, 1) [ 1 ]; discriminator =:= compressed_value(1, 1) [ 1 ];
protocol =:= uncompressed_value(16, 0x86DD) [ 0 ]; protocol =:= uncompressed_value(16, 0x86DD) [ 0 ];
} }
} }
gre(repair_flag) gre
{ {
UNCOMPRESSED { UNCOMPRESSED {
c_flag [ 1 ]; c_flag [ 1 ];
r_flag =:= uncompressed_value(1, 0) [ 1 ]; r_flag =:= uncompressed_value(1, 0) [ 1 ];
k_flag [ 1 ]; k_flag [ 1 ];
s_flag [ 1 ]; s_flag [ 1 ];
reserved0 =:= uncompressed_value(9, 0) [ 9 ]; reserved0 =:= uncompressed_value(9, 0) [ 9 ];
version =:= uncompressed_value(3, 0) [ 3 ]; version =:= uncompressed_value(3, 0) [ 3 ];
protocol [ 16 ]; protocol [ 16 ];
checksum_and_res [ 0, 32 ]; checksum_and_res [ 0, 32 ];
skipping to change at page 51, line 4 skipping to change at page 55, line 7
key =:= optional_32(k_flag.UVALUE) [ 0, 32 ]; key =:= optional_32(k_flag.UVALUE) [ 0, 32 ];
} }
COMPRESSED gre_dynamic { COMPRESSED gre_dynamic {
checksum_and_res =:= checksum_and_res =:=
optional_checksum(c_flag.UVALUE) [ 0, 16 ]; optional_checksum(c_flag.UVALUE) [ 0, 16 ];
sequence_number =:= optional_32(s_flag.UVALUE) [ 0, 32 ]; sequence_number =:= optional_32(s_flag.UVALUE) [ 0, 32 ];
} }
COMPRESSED gre_irregular { COMPRESSED gre_irregular {
ENFORCE(repair_flag == 0);
checksum_and_res =:= optional_checksum(c_flag.UVALUE) [ 0, 16 ]; checksum_and_res =:= optional_checksum(c_flag.UVALUE) [ 0, 16 ];
sequence_number =:= sequence_number =:=
optional_lsb_7_or_31(s_flag.UVALUE) [ 0, 8, 32 ]; optional_lsb_7_or_31(s_flag.UVALUE) [ 0, 8, 32 ];
} }
COMPRESSED gre_repair_irregular {
ENFORCE(repair_flag == 1);
checksum_and_res =:= optional_checksum(c_flag.UVALUE) [ 0, 16 ];
sequence_number =:= optional_32(s_flag.UVALUE) [ 0, 32 ];
}
} }
///////////////////////////////////////////// /////////////////////////////////////////////
// MINE header // MINE header
///////////////////////////////////////////// /////////////////////////////////////////////
mine mine
{ {
UNCOMPRESSED { UNCOMPRESSED {
next_header [ 8 ]; next_header [ 8 ];
skipping to change at page 52, line 4 skipping to change at page 55, line 49
next_header =:= irregular(8) [ 8 ]; next_header =:= irregular(8) [ 8 ];
s_bit =:= irregular(1) [ 1 ]; s_bit =:= irregular(1) [ 1 ];
// Reserved bits are included to achieve byte-alignment // Reserved bits are included to achieve byte-alignment
res_bits =:= irregular(7) [ 7 ]; res_bits =:= irregular(7) [ 7 ];
orig_dest =:= irregular(32) [ 32 ]; orig_dest =:= irregular(32) [ 32 ];
orig_src =:= optional_32(s_bit.UVALUE) [ 0, 32 ]; orig_src =:= optional_32(s_bit.UVALUE) [ 0, 32 ];
} }
COMPRESSED mine_dynamic { COMPRESSED mine_dynamic {
} }
COMPRESSED mine_irregular { COMPRESSED mine_irregular {
} }
} }
///////////////////////////////////////////// /////////////////////////////////////////////
// Authentication Header (AH) // Authentication Header (AH)
///////////////////////////////////////////// /////////////////////////////////////////////
ah(repair_flag) ah
{ {
UNCOMPRESSED { UNCOMPRESSED {
next_header [ 8 ]; next_header [ 8 ];
length [ 8 ]; length [ 8 ];
res_bits [ 16 ]; res_bits =:= uncompressed_value(16, 0) [ 16 ];
spi [ 32 ]; spi [ 32 ];
sequence_number [ 32 ]; sequence_number [ 32 ];
auth_data [ length.UVALUE*32-32 ]; icv [ length.UVALUE*32-32 ];
} }
DEFAULT { DEFAULT {
next_header =:= static; next_header =:= static;
length =:= static; length =:= static;
res_bits =:= static;
spi =:= static; spi =:= static;
sequence_number =:= static; sequence_number =:= static;
} }
COMPRESSED ah_static { COMPRESSED ah_static {
next_header =:= irregular(8) [ 8 ]; next_header =:= irregular(8) [ 8 ];
length =:= irregular(8) [ 8 ]; length =:= irregular(8) [ 8 ];
spi =:= irregular(32) [ 32 ]; spi =:= irregular(32) [ 32 ];
} }
COMPRESSED ah_dynamic { COMPRESSED ah_dynamic {
sequence_number =:= irregular(32) [ 32 ]; sequence_number =:= irregular(32) [ 32 ];
auth_data =:= icv =:=
irregular(length.UVALUE*32-32) [ length.UVALUE*32-32 ]; irregular(length.UVALUE*32-32) [ length.UVALUE*32-32 ];
} }
COMPRESSED ah_irregular { COMPRESSED ah_irregular {
ENFORCE(repair_flag == 0);
sequence_number =:= lsb_7_or_31 [ 8, 32 ]; sequence_number =:= lsb_7_or_31 [ 8, 32 ];
auth_data =:= icv =:=
irregular(length.UVALUE*32-32) [ length.UVALUE*32-32 ]; irregular(length.UVALUE*32-32) [ length.UVALUE*32-32 ];
} }
COMPRESSED ah_repair_irregular {
ENFORCE(repair_flag == 1);
res_bits =:= irregular(16) [ 16 ];
sequence_number =:= irregular(32) [ 32 ];
auth_data =:=
irregular(length.UVALUE*32-32) [ length.UVALUE*32-32 ];
}
} }
///////////////////////////////////////////// /////////////////////////////////////////////
// ESP header (NULL encrypted) // ESP header (NULL encrypted)
///////////////////////////////////////////// /////////////////////////////////////////////
// The value of the next header field from the trailer // The value of the next header field from the trailer
// part of the packet is passed as a parameter. // part of the packet is passed as a parameter.
esp_null(next_header_value, repair_flag) esp_null(next_header_value)
{ {
UNCOMPRESSED { UNCOMPRESSED {
spi [ 32 ]; spi [ 32 ];
sequence_number [ 32 ]; sequence_number [ 32 ];
} }
CONTROL { CONTROL {
nh_field [ 8 ]; nh_field [ 8 ];
} }
skipping to change at page 53, line 44 skipping to change at page 57, line 33
COMPRESSED esp_static { COMPRESSED esp_static {
nh_field =:= compressed_value(8, next_header_value) [ 8 ]; nh_field =:= compressed_value(8, next_header_value) [ 8 ];
spi =:= irregular(32) [ 32 ]; spi =:= irregular(32) [ 32 ];
} }
COMPRESSED esp_dynamic { COMPRESSED esp_dynamic {
sequence_number =:= irregular(32) [ 32 ]; sequence_number =:= irregular(32) [ 32 ];
} }
COMPRESSED esp_irregular { COMPRESSED esp_irregular {
ENFORCE(repair_flag == 0);
sequence_number =:= lsb_7_or_31 [ 8, 32 ]; sequence_number =:= lsb_7_or_31 [ 8, 32 ];
} }
COMPRESSED esp_repair_irregular {
ENFORCE(repair_flag == 1);
sequence_number =:= irregular(32) [ 32 ];
}
} }
///////////////////////////////////////////// /////////////////////////////////////////////
// IPv6 Header // IPv6 Header
///////////////////////////////////////////// /////////////////////////////////////////////
fl_enc fl_enc
{ {
UNCOMPRESSED { UNCOMPRESSED {
flow_label [ 20 ]; flow_label [ 20 ];
skipping to change at page 54, line 29 skipping to change at page 58, line 12
flow_label =:= uncompressed_value(20, 0) [ 0 ]; flow_label =:= uncompressed_value(20, 0) [ 0 ];
reserved =:= '0000' [ 4 ]; reserved =:= '0000' [ 4 ];
} }
COMPRESSED fl_non_zero { COMPRESSED fl_non_zero {
discriminator =:= '1' [ 1 ]; discriminator =:= '1' [ 1 ];
flow_label =:= irregular(20) [ 20 ]; flow_label =:= irregular(20) [ 20 ];
} }
} }
ipv6(profile, is_innermost, ip_outer_flag, repair_flag) ipv6(profile, is_innermost, outer_ip_flag)
{ {
UNCOMPRESSED { UNCOMPRESSED {
version =:= uncompressed_value(4, 6) [ 4 ]; version =:= uncompressed_value(4, 6) [ 4 ];
tos_tc [ 8 ]; tos_tc [ 8 ];
flow_label [ 20 ]; flow_label [ 20 ];
payload_length [ 16 ]; payload_length [ 16 ];
next_header [ 8 ]; next_header [ 8 ];
ttl_hopl [ 8 ]; ttl_hopl [ 8 ];
src_addr [ 128 ]; src_addr [ 128 ];
dst_addr [ 128 ]; dst_addr [ 128 ];
skipping to change at page 55, line 42 skipping to change at page 59, line 26
} }
COMPRESSED ipv6_regular_dynamic { COMPRESSED ipv6_regular_dynamic {
ENFORCE((is_innermost == 0) || ENFORCE((is_innermost == 0) ||
(profile != PROFILE_IP_0104)); (profile != PROFILE_IP_0104));
tos_tc =:= irregular(8) [ 8 ]; tos_tc =:= irregular(8) [ 8 ];
ttl_hopl =:= irregular(8) [ 8 ]; ttl_hopl =:= irregular(8) [ 8 ];
} }
COMPRESSED ipv6_outer_irregular { COMPRESSED ipv6_outer_irregular {
ENFORCE(repair_flag == 0);
ENFORCE(is_innermost == 0); ENFORCE(is_innermost == 0);
tos_tc =:= tos_tc =:=
static_or_irreg(ip_outer_flag, 8) [ 0, 8 ]; static_or_irreg(outer_ip_flag, 8) [ 0, 8 ];
ttl_hopl =:= ttl_hopl =:=
static_or_irreg(ip_outer_flag, 8) [ 0, 8 ]; static_or_irreg(outer_ip_flag, 8) [ 0, 8 ];
} }
COMPRESSED ipv6_innermost_irregular { COMPRESSED ipv6_innermost_irregular {
ENFORCE(repair_flag == 0);
ENFORCE(is_innermost == 1); ENFORCE(is_innermost == 1);
} }
COMPRESSED ipv6_outer_repair_irregular {
ENFORCE(repair_flag == 1);
ENFORCE(is_innermost == 0);
tos_tc =:= static_or_irreg(ip_outer_flag, 8) [ 0, 8 ];
ttl_hopl =:= static_or_irreg(ip_outer_flag, 8) [ 0, 8 ];
}
COMPRESSED ipv6_innermost_repair_irregular {
ENFORCE(repair_flag == 1);
ENFORCE(is_innermost == 1);
}
} }
///////////////////////////////////////////// /////////////////////////////////////////////
// IPv4 Header // IPv4 Header
///////////////////////////////////////////// /////////////////////////////////////////////
ip_id_enc_dyn(behavior) ip_id_enc_dyn(behavior)
{ {
UNCOMPRESSED { UNCOMPRESSED {
ip_id [ 16 ]; ip_id [ 16 ];
} }
COMPRESSED ip_id_seq { COMPRESSED ip_id_seq {
ENFORCE((behavior == IP_ID_BEHAVIOR_SEQUENTIAL) || ENFORCE((behavior == IP_ID_BEHAVIOR_SEQUENTIAL) ||
(behavior == IP_ID_BEHAVIOR_SEQUENTIAL_SWAPPED) || (behavior == IP_ID_BEHAVIOR_SEQUENTIAL_SWAPPED));
(behavior == IP_ID_BEHAVIOR_RANDOM)); ENFORCE(ip_id_offset.UVALUE == ip_id.UVALUE - msn.UVALUE);
ip_id =:= irregular(16) [ 16 ];
}
COMPRESSED ip_id_random {
ENFORCE(behavior == IP_ID_BEHAVIOR_RANDOM);
ip_id =:= irregular(16) [ 16 ]; ip_id =:= irregular(16) [ 16 ];
} }
COMPRESSED ip_id_zero { COMPRESSED ip_id_zero {
ENFORCE(behavior == IP_ID_BEHAVIOR_ZERO); ENFORCE(behavior == IP_ID_BEHAVIOR_ZERO);
ip_id =:= uncompressed_value(16, 0) [ 0 ]; ip_id =:= uncompressed_value(16, 0) [ 0 ];
} }
} }
ip_id_enc_irreg(behavior) ip_id_enc_irreg(behavior)
skipping to change at page 58, line 5 skipping to change at page 61, line 30
ENFORCE(behavior.UVALUE == IP_ID_BEHAVIOR_RANDOM); ENFORCE(behavior.UVALUE == IP_ID_BEHAVIOR_RANDOM);
behavior [ 2 ]; behavior [ 2 ];
} }
COMPRESSED zero { COMPRESSED zero {
ENFORCE(behavior.UVALUE == IP_ID_BEHAVIOR_ZERO); ENFORCE(behavior.UVALUE == IP_ID_BEHAVIOR_ZERO);
behavior [ 2 ]; behavior [ 2 ];
} }
} }
variable_ipv4_fields(flag) ipv4(profile, is_innermost, outer_ip_flag)
{
UNCOMPRESSED {
df [ 1 ];
ip_id_behavior [ 2 ];
}
COMPRESSED not_present {
ENFORCE(flag == 0);
df =:= static;
ip_id_behavior =:= static;
}
COMPRESSED present {
ENFORCE(flag == 1);
reserved =:= '00000' [ 5 ];
df =:= irregular(1) [ 1 ];
ip_id_behavior =:= ip_id_behavior_choice(0) [ 2 ];
}
}
ipv4(profile, is_innermost, ip_outer_flag, repair_flag)
{ {
UNCOMPRESSED { UNCOMPRESSED {
version =:= uncompressed_value(4, 4) [ 4 ]; version =:= uncompressed_value(4, 4) [ 4 ];
hdr_length =:= uncompressed_value(4, 5) [ 4 ]; hdr_length =:= uncompressed_value(4, 5) [ 4 ];
tos_tc [ 8 ]; tos_tc [ 8 ];
length =:= inferred_ip_v4_length [ 16 ]; length =:= inferred_ip_v4_length [ 16 ];
ip_id [ 16 ]; ip_id [ 16 ];
rf =:= uncompressed_value(1, 0) [ 1 ]; rf =:= uncompressed_value(1, 0) [ 1 ];
df [ 1 ]; df [ 1 ];
mf =:= uncompressed_value(1, 0) [ 1 ]; mf =:= uncompressed_value(1, 0) [ 1 ];
skipping to change at page 60, line 4 skipping to change at page 63, line 8
COMPRESSED ipv4_regular_dynamic { COMPRESSED ipv4_regular_dynamic {
ENFORCE((is_innermost == 0) || ENFORCE((is_innermost == 0) ||
(profile != PROFILE_IP_0104)); (profile != PROFILE_IP_0104));
reserved =:= '00000' [ 5 ]; reserved =:= '00000' [ 5 ];
df =:= irregular(1) [ 1 ]; df =:= irregular(1) [ 1 ];
ip_id_behavior =:= ip_id_behavior_choice(is_innermost) [ 2 ]; ip_id_behavior =:= ip_id_behavior_choice(is_innermost) [ 2 ];
tos_tc =:= irregular(8) [ 8 ]; tos_tc =:= irregular(8) [ 8 ];
ttl_hopl =:= irregular(8) [ 8 ]; ttl_hopl =:= irregular(8) [ 8 ];
ip_id =:= ip_id_enc_dyn(ip_id_behavior.UVALUE) [ 0, 16 ]; ip_id =:= ip_id_enc_dyn(ip_id_behavior.UVALUE) [ 0, 16 ];
} }
COMPRESSED ipv4_outer_irregular { COMPRESSED ipv4_outer_irregular {
ENFORCE(repair_flag == 0);
ENFORCE(is_innermost == 0); ENFORCE(is_innermost == 0);
ip_id =:= ip_id_enc_irreg(ip_id_behavior.UVALUE) [ 0, 16 ]; ip_id =:= ip_id_enc_irreg(ip_id_behavior.UVALUE) [ 0, 16 ];
tos_tc =:= static_or_irreg(ip_outer_flag, 8) [ 0, 8 ]; tos_tc =:= static_or_irreg(outer_ip_flag, 8) [ 0, 8 ];
ttl_hopl =:= static_or_irreg(ip_outer_flag, 8) [ 0, 8 ]; ttl_hopl =:= static_or_irreg(outer_ip_flag, 8) [ 0, 8 ];
} }
COMPRESSED ipv4_innermost_irregular { COMPRESSED ipv4_innermost_irregular {
// Same format for repair and non-repair
ip_id =:= ip_id_enc_irreg(ip_id_behavior.UVALUE) [ 0, 16 ]; ip_id =:= ip_id_enc_irreg(ip_id_behavior.UVALUE) [ 0, 16 ];
ENFORCE(is_innermost == 1); ENFORCE(is_innermost == 1);
} }
COMPRESSED ipv4_outer_repair_irregular {
ENFORCE(repair_flag == 1);
ENFORCE(is_innermost == 0);
df : ip_id_behavior =:=
variable_ipv4_fields(outer_flag) [ 0, 8 ];
ip_id =:= ip_id_enc_irreg(ip_id_behavior.UVALUE) [ 0, 16 ];
tos_tc =:= static_or_irreg(ip_outer_flag, 8) [ 0, 8 ];
ttl_hopl =:= static_or_irreg(ip_outer_flag, 8) [ 0, 8 ];
}
} }
///////////////////////////////////////////// /////////////////////////////////////////////
// UDP Header // UDP Header
///////////////////////////////////////////// /////////////////////////////////////////////
udp(profile) udp(profile)
{ {
UNCOMPRESSED { UNCOMPRESSED {
ENFORCE((profile == PROFILE_RTP_0101) || ENFORCE((profile == PROFILE_RTP_0101) ||
(profile == PROFILE_UDP_0102)); (profile == PROFILE_UDP_0102));
src_port [ 16 ]; src_port [ 16 ];
dst_port [ 16 ]; dst_port [ 16 ];
udp_length =:= inferred_udp_length [ 16 ]; udp_length =:= inferred_udp_length [ 16 ];
checksum [ 16 ]; checksum [ 16 ];
} }
CONTROL {
checksum_used [ 1 ];
}
DEFAULT { DEFAULT {
src_port =:= static; src_port =:= static;
dst_port =:= static; dst_port =:= static;
checksum =:= irregular(16);
} }
COMPRESSED udp_static { COMPRESSED udp_static {
src_port =:= irregular(16) [ 16 ]; src_port =:= irregular(16) [ 16 ];
dst_port =:= irregular(16) [ 16 ]; dst_port =:= irregular(16) [ 16 ];
} }
COMPRESSED udp_endpoint_dynamic { COMPRESSED udp_endpoint_dynamic {
ENFORCE(profile == PROFILE_UDP_0102); ENFORCE(profile == PROFILE_UDP_0102);
checksum [ 16 ]; ENFORCE(checksum_used.UVALUE == (checksum.UVALUE != 0));
checksum =:= irregular(16) [ 16 ];
msn =:= irregular(16) [ 16 ]; msn =:= irregular(16) [ 16 ];
reserved =:= compressed_value(6, 0) [ 6 ]; reserved =:= compressed_value(6, 0) [ 6 ];
reorder_ratio =:= reorder_choice [ 2 ]; reorder_ratio =:= reorder_choice [ 2 ];
} }
COMPRESSED udp_regular_dynamic { COMPRESSED udp_regular_dynamic {
ENFORCE(profile == PROFILE_RTP_0101); ENFORCE(profile == PROFILE_RTP_0101);
checksum [ 16 ]; ENFORCE(checksum_used == (checksum.UVALUE != 0));
checksum =:= irregular(16) [ 16 ];
} }
COMPRESSED udp_zero_checksum_irregular { COMPRESSED udp_zero_checksum_irregular {
ENFORCE(checksum.UVALUE == 0); ENFORCE(checksum_used.UVALUE == 0);
checksum =:= uncompressed_value(16, 0) [ 0 ]; checksum =:= uncompressed_value(16, 0) [ 0 ];
} }
COMPRESSED udp_with_checksum_irregular { COMPRESSED udp_with_checksum_irregular {
ENFORCE(checksum.UVALUE != 0); ENFORCE(checksum_used.UVALUE == 1);
checksum [ 16 ]; checksum =:= irregular(16) [ 16 ];
} }
} }
///////////////////////////////////////////// /////////////////////////////////////////////
// RTP Header // RTP Header
///////////////////////////////////////////// /////////////////////////////////////////////
csrc_list_dynchain(presence, cc_value) csrc_list_dynchain(presence, cc_value)
{ {
skipping to change at page 62, line 36 skipping to change at page 65, line 33
ENFORCE(ts_stride_value == ts_stride.UVALUE); ENFORCE(ts_stride_value == ts_stride.UVALUE);
ts_stride [ 32 ]; ts_stride [ 32 ];
time_stride [ 32 ]; time_stride [ 32 ];
ts_scaled [ 32 ]; ts_scaled [ 32 ];
ts_offset =:= ts_offset =:=
field_scaling(ts_stride.UVALUE, ts_scaled.UVALUE, field_scaling(ts_stride.UVALUE, ts_scaled.UVALUE,
timestamp.UVALUE) [ 32 ]; timestamp.UVALUE) [ 32 ];
} }
INITIAL { INITIAL {
ts_stride =:= uncompressed_value(32, 0); ts_stride =:= uncompressed_value(32, TS_STRIDE_DEFAULT);
time_stride =:= uncompressed_value(32, 0); time_stride =:= uncompressed_value(32, TIME_STRIDE_DEFAULT);
} }
DEFAULT { DEFAULT {
ENFORCE(msn.UVALUE == sequence_number.UVALUE); ENFORCE(msn.UVALUE == sequence_number.UVALUE);
pad_bit =:= static; pad_bit =:= static;
extension =:= static; extension =:= static;
cc =:= static; cc =:= static;
marker =:= static; marker =:= static;
payload_type =:= static; payload_type =:= static;
sequence_number =:= static; sequence_number =:= static;
skipping to change at page 63, line 20 skipping to change at page 66, line 18
reorder_ratio =:= reorder_choice [ 2 ]; reorder_ratio =:= reorder_choice [ 2 ];
list_present =:= irregular(1) [ 1 ]; list_present =:= irregular(1) [ 1 ];
tss_indicator =:= irregular(1) [ 1 ]; tss_indicator =:= irregular(1) [ 1 ];
tis_indicator =:= irregular(1) [ 1 ]; tis_indicator =:= irregular(1) [ 1 ];
pad_bit =:= irregular(1) [ 1 ]; pad_bit =:= irregular(1) [ 1 ];
extension =:= irregular(1) [ 1 ]; extension =:= irregular(1) [ 1 ];
marker =:= irregular(1) [ 1 ]; marker =:= irregular(1) [ 1 ];
payload_type =:= irregular(7) [ 7 ]; payload_type =:= irregular(7) [ 7 ];
sequence_number =:= irregular(16) [ 16 ]; sequence_number =:= irregular(16) [ 16 ];
timestamp =:= irregular(32) [ 32 ]; timestamp =:= irregular(32) [ 32 ];
ts_stride =:= sdvl_or_static(tss_indicator) [ VARIABLE ]; ts_stride =:= sdvl_or_default(tss_indicator,
time_stride =:= sdvl_or_static(tis_indicator) [ VARIABLE ]; TS_STRIDE_DEFAULT) [ VARIABLE ];
time_stride =:= sdvl_or_default(tis_indicator,
TIME_STRIDE_DEFAULT) [ VARIABLE ];
csrc_list =:= csrc_list =:=
csrc_list_dynchain(list_present, cc.UVALUE) [ VARIABLE ]; csrc_list_dynchain(list_present, cc.UVALUE) [ VARIABLE ];
} }
COMPRESSED rtp_irregular { COMPRESSED rtp_irregular {
} }
} }
///////////////////////////////////////////// /////////////////////////////////////////////
// UDP-Lite Header // UDP-Lite Header
skipping to change at page 64, line 48 skipping to change at page 67, line 48
checksum [ 16 ]; checksum [ 16 ];
} }
CONTROL { CONTROL {
coverage_behavior [ 2 ]; coverage_behavior [ 2 ];
} }
DEFAULT { DEFAULT {
src_port =:= static; src_port =:= static;
dst_port =:= static; dst_port =:= static;
checksum_coverage =:= irregular(16);
checksum =:= irregular(16);
} }
COMPRESSED udp_lite_static { COMPRESSED udp_lite_static {
src_port =:= irregular(16) [ 16 ]; src_port =:= irregular(16) [ 16 ];
dst_port =:= irregular(16) [ 16 ]; dst_port =:= irregular(16) [ 16 ];
} }
COMPRESSED udp_lite_endpoint_dynamic { COMPRESSED udp_lite_endpoint_dynamic {
ENFORCE(profile == PROFILE_UDPLITE_0108); ENFORCE(profile == PROFILE_UDPLITE_0108);
reserved =:= compressed_value(4, 0) [ 4 ]; reserved =:= compressed_value(4, 0) [ 4 ];
coverage_behavior =:= irregular(2) [ 2 ]; coverage_behavior =:= irregular(2) [ 2 ];
reorder_ratio =:= reorder_choice [ 2 ]; reorder_ratio =:= reorder_choice [ 2 ];
skipping to change at page 65, line 16 skipping to change at page 68, line 14
dst_port =:= irregular(16) [ 16 ]; dst_port =:= irregular(16) [ 16 ];
} }
COMPRESSED udp_lite_endpoint_dynamic { COMPRESSED udp_lite_endpoint_dynamic {
ENFORCE(profile == PROFILE_UDPLITE_0108); ENFORCE(profile == PROFILE_UDPLITE_0108);
reserved =:= compressed_value(4, 0) [ 4 ]; reserved =:= compressed_value(4, 0) [ 4 ];
coverage_behavior =:= irregular(2) [ 2 ]; coverage_behavior =:= irregular(2) [ 2 ];
reorder_ratio =:= reorder_choice [ 2 ]; reorder_ratio =:= reorder_choice [ 2 ];
checksum_coverage =:= checksum_coverage =:=
checksum_coverage_dynchain(coverage_behavior.UVALUE) [ 16 ]; checksum_coverage_dynchain(coverage_behavior.UVALUE) [ 16 ];
checksum [ 16 ]; checksum =:= irregular(16) [ 16 ];
msn =:= irregular(16) [ 16 ]; msn =:= irregular(16) [ 16 ];
} }
COMPRESSED udp_lite_regular_dynamic { COMPRESSED udp_lite_regular_dynamic {
coverage_behavior =:= irregular(2) [ 2 ]; coverage_behavior =:= irregular(2) [ 2 ];
reserved =:= compressed_value(6, 0) [ 6 ]; reserved =:= compressed_value(6, 0) [ 6 ];
checksum_coverage =:= checksum_coverage =:=
checksum_coverage_dynchain(coverage_behavior.UVALUE) [ 16 ]; checksum_coverage_dynchain(coverage_behavior.UVALUE) [ 16 ];
checksum [ 16 ]; checksum =:= irregular(16) [ 16 ];
} }
COMPRESSED udp_lite_irregular { COMPRESSED udp_lite_irregular {
checksum_coverage =:= checksum_coverage =:=
checksum_coverage_dynchain(coverage_behavior.UVALUE) [ 0, 16 ]; checksum_coverage_irregular(coverage_behavior.UVALUE) [ 0, 16 ];
checksum [ 16 ]; checksum =:= irregular(16) [ 16 ];
} }
} }
///////////////////////////////////////////// /////////////////////////////////////////////
// ESP Header (Non-NULL encrypted // ESP Header (Non-NULL encrypted
// i.e. only used for the ESP profile) // i.e. only used for the ESP profile)
///////////////////////////////////////////// /////////////////////////////////////////////
esp(profile) esp(profile)
{ {
UNCOMPRESSED { UNCOMPRESSED {
ENFORCE(profile == PROFILE_ESP_0103); ENFORCE(profile == PROFILE_ESP_0103);
ENFORCE(msn.UVALUE == sequence_number.UVALUE % 65536);
spi [ 32 ]; spi [ 32 ];
sequence_number [ 32 ]; sequence_number [ 32 ];
} }
DEFAULT { DEFAULT {
ENFORCE(msn.UVALUE == sequence_number.UVALUE % 65536);
spi =:= static; spi =:= static;
sequence_number =:= static; sequence_number =:= static;
} }
COMPRESSED esp_static { COMPRESSED esp_static {
// Needs to be discriminated from ESP NULL headers, // Needs to be discriminated from ESP NULL headers,
// and therefore we have a dummy protocol field here. // and therefore we have a dummy protocol field here.
discriminator =:= uncompressed_value(8, 255) [ 8 ]; discriminator =:= uncompressed_value(8, 255) [ 8 ];
spi =:= irregular(32) [ 32 ]; spi =:= irregular(32) [ 32 ];
} }
COMPRESSED esp_dynamic { COMPRESSED esp_dynamic {
sequence_number =:= irregular(32) [ 32 ]; sequence_number =:= irregular(32) [ 32 ];
reserved =:= compressed_value(6, 0) [ 6 ]; reserved =:= compressed_value(6, 0) [ 6 ];
skipping to change at page 66, line 31 skipping to change at page 69, line 29
} }
/////////////////////////////////////////////////// ///////////////////////////////////////////////////
// Encoding methods used in the profiles' CO packets // Encoding methods used in the profiles' CO packets
/////////////////////////////////////////////////// ///////////////////////////////////////////////////
// Variable reordering offset used for MSN // Variable reordering offset used for MSN
msn_lsb(k) msn_lsb(k)
{ {
UNCOMPRESSED { UNCOMPRESSED {
master [ 16 ]; master [ VARIABLE ];
} }
COMPRESSED none { COMPRESSED none {
ENFORCE(reorder_ratio.UVALUE == REORDERING_NONE); ENFORCE(reorder_ratio.UVALUE == REORDERING_NONE);
master =:= lsb(k, 1); master =:= lsb(k, 1);
} }
COMPRESSED quarter { COMPRESSED quarter {
ENFORCE(reorder_ratio.UVALUE == REORDERING_QUARTER); ENFORCE(reorder_ratio.UVALUE == REORDERING_QUARTER);
master =:= lsb(k, ((2^k) / 4) - 1); master =:= lsb(k, ((2^k) / 4) - 1);
skipping to change at page 67, line 6 skipping to change at page 70, line 4
COMPRESSED half { COMPRESSED half {
ENFORCE(reorder_ratio.UVALUE == REORDERING_HALF); ENFORCE(reorder_ratio.UVALUE == REORDERING_HALF);
master =:= lsb(k, ((2^k) / 2) - 1); master =:= lsb(k, ((2^k) / 2) - 1);
} }
COMPRESSED threequarters { COMPRESSED threequarters {
ENFORCE(reorder_ratio.UVALUE == REORDERING_THREEQUARTERS); ENFORCE(reorder_ratio.UVALUE == REORDERING_THREEQUARTERS);
master =:= lsb(k, (((2^k) * 3) / 4) - 1); master =:= lsb(k, (((2^k) * 3) / 4) - 1);
} }
} }
ip_id_lsb(behavior, k) ip_id_lsb(behavior, k)
{ {
UNCOMPRESSED { UNCOMPRESSED {
ip_id [ 16 ]; ip_id [ 16 ];
} }
CONTROL { CONTROL {
ip_id_offset [ 16 ];
ip_id_nbo [ 16 ]; ip_id_nbo [ 16 ];
} }
COMPRESSED nbo { COMPRESSED nbo {
ENFORCE(behavior == IP_ID_BEHAVIOR_SEQUENTIAL); ENFORCE(behavior == IP_ID_BEHAVIOR_SEQUENTIAL);
ENFORCE(ip_id_offset.UVALUE == ip_id.UVALUE - msn.UVALUE); ENFORCE(ip_id_offset.UVALUE == ip_id.UVALUE - msn.UVALUE);
ip_id_offset =:= lsb(k, ((2^k) / 4) - 1) [ k ]; ip_id_offset =:= lsb(k, ((2^k) / 4) - 1) [ k ];
} }
COMPRESSED non_nbo { COMPRESSED non_nbo {
ENFORCE(behavior == IP_ID_BEHAVIOR_SEQUENTIAL_SWAPPED); ENFORCE(behavior == IP_ID_BEHAVIOR_SEQUENTIAL_SWAPPED);
ENFORCE(ip_id_nbo.UVALUE == ENFORCE(ip_id_nbo.UVALUE ==
(ip_id.UVALUE / 256) + (ip_id.UVALUE % 256) * 256); (ip_id.UVALUE / 256) + (ip_id.UVALUE % 256) * 256);
ENFORCE(ip_id_nbo.ULENGTH == 16); ENFORCE(ip_id_nbo.ULENGTH == 16);
ENFORCE(ip_id_offset.UVALUE == ip_id_nbo.UVALUE - msn.UVALUE); ENFORCE(ip_id_offset.UVALUE == ip_id_nbo.UVALUE - msn.UVALUE);
ip_id_offset =:= lsb(k, ((2^k) / 4) - 1) [ k ]; ip_id_offset =:= lsb(k, ((2^k) / 4) - 1) [ k ];
} }
} }
optional_ip_id_lsb(behavior, indicator) ip_id_sequential_variable(behavior, indicator)
{ {
UNCOMPRESSED { UNCOMPRESSED {
ip_id [ 16 ]; ip_id [ 16 ];
} }
COMPRESSED short { COMPRESSED short {
ENFORCE((behavior == IP_ID_BEHAVIOR_SEQUENTIAL) || ENFORCE((behavior == IP_ID_BEHAVIOR_SEQUENTIAL) ||
(behavior == IP_ID_BEHAVIOR_SEQUENTIAL_SWAPPED)); (behavior == IP_ID_BEHAVIOR_SEQUENTIAL_SWAPPED));
ENFORCE(indicator == 0); ENFORCE(indicator == 0);
ip_id =:= ip_id_lsb(behavior, 8) [ 8 ]; ip_id =:= ip_id_lsb(behavior, 8) [ 8 ];
} }
COMPRESSED long { COMPRESSED long {
ENFORCE((behavior == IP_ID_BEHAVIOR_SEQUENTIAL) || ENFORCE((behavior == IP_ID_BEHAVIOR_SEQUENTIAL) ||
(behavior == IP_ID_BEHAVIOR_SEQUENTIAL_SWAPPED)); (behavior == IP_ID_BEHAVIOR_SEQUENTIAL_SWAPPED));
ENFORCE(indicator == 1); ENFORCE(indicator == 1);
ENFORCE(ip_id_offset.UVALUE == ip_id.UVALUE - msn.UVALUE);
ip_id =:= irregular(16) [ 16 ]; ip_id =:= irregular(16) [ 16 ];
} }
COMPRESSED not_present { COMPRESSED not_present {
ENFORCE((behavior == IP_ID_BEHAVIOR_RANDOM) || ENFORCE((behavior == IP_ID_BEHAVIOR_RANDOM) ||
(behavior == IP_ID_BEHAVIOR_ZERO)); (behavior == IP_ID_BEHAVIOR_ZERO));
} }
} }
dont_fragment(version) dont_fragment(version)
skipping to change at page 68, line 25 skipping to change at page 71, line 22
df [ 1 ]; df [ 1 ];
} }
COMPRESSED v4 { COMPRESSED v4 {
ENFORCE(version == 4); ENFORCE(version == 4);
df =:= irregular(1) [ 1 ]; df =:= irregular(1) [ 1 ];
} }
COMPRESSED v6 { COMPRESSED v6 {
ENFORCE(version == 6); ENFORCE(version == 6);
df =:= compressed_value(1, 0) [ 1 ]; unused =:= compressed_value(1, 0) [ 1 ];
} }
} }
optional_pt(flag) pt_irr_or_static(flag)
{ {
UNCOMPRESSED { UNCOMPRESSED {
payload_type [ 7 ]; payload_type [ 7 ];
} }
COMPRESSED not_present { COMPRESSED not_present {
ENFORCE(flag == 0); ENFORCE(flag == 0);
payload_type =:= static [ 0 ]; payload_type =:= static [ 0 ];
} }
skipping to change at page 69, line 33 skipping to change at page 72, line 31
timestamp =:= timer_based_lsb(time_stride_value, k, timestamp =:= timer_based_lsb(time_stride_value, k,
((2^k) / 4) - 1); ((2^k) / 4) - 1);
} }
COMPRESSED regular { COMPRESSED regular {
ENFORCE(time_stride_value == 0); ENFORCE(time_stride_value == 0);
timestamp =:= lsb(k, ((2^k) / 4) - 1); timestamp =:= lsb(k, ((2^k) / 4) - 1);
} }
} }
irregular_or_nothing(flag) // Self-describing variable length encoding with reordering offset
{ sdvl_sn_lsb(field_width) {
UNCOMPRESSED { UNCOMPRESSED {
field [ 32 ]; field [ field_width ];
} }
COMPRESSED not_present { COMPRESSED lsb7 {
ENFORCE(flag == 0); discriminator =:= '0' [ 1 ];
field =:= msn_lsb(7) [ 7 ];
} }
COMPRESSED present { COMPRESSED lsb14 {
ENFORCE(flag == 1); discriminator =:= '10' [ 2 ];
field =:= irregular(32); field =:= msn_lsb(14) [ 14 ];
}
COMPRESSED lsb21 {
discriminator =:= '110' [ 3 ];
field =:= msn_lsb(21) [ 21 ];
}
COMPRESSED lsb28 {
discriminator =:= '1110' [ 4 ];
field =:= msn_lsb(28) [ 28 ];
}
COMPRESSED lsb32 {
discriminator =:= '11111111' [ 8 ];
field =:= irregular(field_width) [ field_width ];
} }
} }
// Self-describing variable length encoding // Self-describing variable length encoding
sdvl_lsb(field_width) sdvl_lsb(field_width)
{ {
UNCOMPRESSED { UNCOMPRESSED {
field [ field_width ]; field [ field_width ];
} }
skipping to change at page 71, line 26 skipping to change at page 74, line 39
COMPRESSED not_present { COMPRESSED not_present {
ENFORCE((tss_flag == 0) && (tsc_flag == 1)); ENFORCE((tss_flag == 0) && (tsc_flag == 1));
} }
} }
profile_1_7_flags1_enc(flag) profile_1_7_flags1_enc(flag)
{ {
UNCOMPRESSED { UNCOMPRESSED {
ip_outer_indicator [ 1 ]; ip_outer_indicator [ 1 ];
repair_indicator [ 1 ];
ttl_hopl_indicator [ 1 ]; ttl_hopl_indicator [ 1 ];
tos_tc_indicator [ 1 ]; tos_tc_indicator [ 1 ];
df [ 1 ];
ip_id_behavior [ 2 ]; ip_id_behavior [ 2 ];
reorder_ratio [ 2 ]; reorder_ratio [ 2 ];
} }
COMPRESSED not_present { COMPRESSED not_present {
ENFORCE(flag == 0); ENFORCE(flag == 0);
ENFORCE(ip_outer_indicator.CVALUE == 0); ENFORCE(ip_outer_indicator.CVALUE == 0);
ENFORCE(repair_indicator.CVALUE == 0);
ENFORCE(ttl_hopl_indicator.CVALUE == 0); ENFORCE(ttl_hopl_indicator.CVALUE == 0);
ENFORCE(tos_tc_indicator.CVALUE == 0); ENFORCE(tos_tc_indicator.CVALUE == 0);
df =:= static;
ip_id_behavior =:= static; ip_id_behavior =:= static;
reorder_ratio =:= static; reorder_ratio =:= static;
} }
COMPRESSED present { COMPRESSED present {
ENFORCE(flag == 1); ENFORCE(flag == 1);
ip_outer_indicator =:= irregular(1) [ 1 ]; ip_outer_indicator =:= irregular(1) [ 1 ];
repair_indicator =:= irregular(1) [ 1 ];
ttl_hopl_indicator =:= irregular(1) [ 1 ]; ttl_hopl_indicator =:= irregular(1) [ 1 ];
tos_tc_indicator =:= irregular(1) [ 1 ]; tos_tc_indicator =:= irregular(1) [ 1 ];
df =:= dont_fragment(ip_version) [ 1 ];
ip_id_behavior =:= ip_id_behavior_choice(1) [ 2 ]; ip_id_behavior =:= ip_id_behavior_choice(1) [ 2 ];
reorder_ratio =:= reorder_choice [ 2 ]; reorder_ratio =:= reorder_choice [ 2 ];
} }
} }
profile_1_flags2_enc(flag, ip_version) profile_1_flags2_enc(flag, ip_version)
{ {
UNCOMPRESSED { UNCOMPRESSED {
list_indicator [ 1 ]; list_indicator [ 1 ];
pt_indicator [ 1 ]; pt_indicator [ 1 ];
pad_bit [ 1 ]; pad_bit [ 1 ];
extension [ 1 ]; extension [ 1 ];
df [ 1 ];
time_stride_indicator [ 1 ]; time_stride_indicator [ 1 ];
} }
COMPRESSED not_present{ COMPRESSED not_present{
ENFORCE(flag == 0); ENFORCE(flag == 0);
ENFORCE(list_indicator.UVALUE == 0); ENFORCE(list_indicator.UVALUE == 0);
ENFORCE(pt_indicator.UVALUE == 0); ENFORCE(pt_indicator.UVALUE == 0);
ENFORCE(time_stride_indicator.UVALUE == 0); ENFORCE(time_stride_indicator.UVALUE == 0);
pad_bit =:= static; pad_bit =:= static;
extension =:= static; extension =:= static;
df =:= static;
} }
COMPRESSED present { COMPRESSED present {
ENFORCE(flag == 1); ENFORCE(flag == 1);
list_indicator =:= irregular(1) [ 1 ]; list_indicator =:= irregular(1) [ 1 ];
pt_indicator =:= irregular(1) [ 1 ]; pt_indicator =:= irregular(1) [ 1 ];
time_stride_indicator =:= irregular(1) [ 1 ]; time_stride_indicator =:= irregular(1) [ 1 ];
pad_bit =:= irregular(1) [ 1 ]; pad_bit =:= irregular(1) [ 1 ];
extension =:= irregular(1) [ 1 ]; extension =:= irregular(1) [ 1 ];
df =:= dont_fragment(ip_version) [ 1 ]; reserved =:= compressed_value(3, 0) [ 3 ];
reserved =:= compressed_value(2, 0) [ 2 ];
} }
} }
profile_2_3_4_flags_enc(flag, ip_version) profile_2_3_4_flags_enc(flag, ip_version)
{ {
UNCOMPRESSED { UNCOMPRESSED {
ip_outer_indicator [ 1 ]; ip_outer_indicator [ 1 ];
repair_indicator [ 1 ];
df [ 1 ]; df [ 1 ];
ip_id_behavior [ 2 ]; ip_id_behavior [ 2 ];
} }
COMPRESSED not_present { COMPRESSED not_present {
ENFORCE(flag == 0); ENFORCE(flag == 0);
ENFORCE(ip_outer_indicator.CVALUE == 0); ENFORCE(ip_outer_indicator.CVALUE == 0);
ENFORCE(repair_indicator.CVALUE == 0);
df =:= static; df =:= static;
ip_id_behavior =:= static; ip_id_behavior =:= static;
} }
COMPRESSED present { COMPRESSED present {
ENFORCE(flag == 1); ENFORCE(flag == 1);
ip_outer_indicator =:= irregular(1) [ 1 ]; ip_outer_indicator =:= irregular(1) [ 1 ];
repair_indicator =:= irregular(1) [ 1 ];
df =:= dont_fragment(ip_version) [ 1 ]; df =:= dont_fragment(ip_version) [ 1 ];
ip_id_behavior =:= ip_id_behavior_choice(1) [ 2 ]; ip_id_behavior =:= ip_id_behavior_choice(1) [ 2 ];
reserved =:= compressed_value(3, 0) [ 3 ]; reserved =:= compressed_value(4, 0) [ 4 ];
} }
} }
profile_8_flags_enc(flag) profile_8_flags_enc(flag, ip_version)
{ {
UNCOMPRESSED { UNCOMPRESSED {
ip_outer_indicator [ 1 ]; ip_outer_indicator [ 1 ];
repair_indicator [ 1 ];
df [ 1 ]; df [ 1 ];
ip_id_behavior [ 2 ]; ip_id_behavior [ 2 ];
coverage_behavior [ 2 ]; coverage_behavior [ 2 ];
} }
COMPRESSED not_present { COMPRESSED not_present {
ENFORCE(flag == 0); ENFORCE(flag == 0);
ENFORCE(ip_outer_indicator.CVALUE == 0); ENFORCE(ip_outer_indicator.CVALUE == 0);
ENFORCE(repair_indicator.CVALUE == 0);
df =:= static; df =:= static;
ip_id_behavior =:= static; ip_id_behavior =:= static;
coverage_behavior =:= static; coverage_behavior =:= static;
} }
COMPRESSED present { COMPRESSED present {
ENFORCE(flag == 1); ENFORCE(flag == 1);
reserved =:= compressed_value(1, 0) [ 1 ]; reserved =:= compressed_value(2, 0) [ 2 ];
ip_outer_indicator =:= irregular(1) [ 1 ]; ip_outer_indicator =:= irregular(1) [ 1 ];
repair_indicator =:= irregular(1) [ 1 ];
df =:= dont_fragment(ip_version) [ 1 ]; df =:= dont_fragment(ip_version) [ 1 ];
ip_id_behavior =:= ip_id_behavior_choice(1) [ 2 ]; ip_id_behavior =:= ip_id_behavior_choice(1) [ 2 ];
coverage_behavior =:= irregular(2) [ 2 ]; coverage_behavior =:= irregular(2) [ 2 ];
} }
} }
profile_7_flags2_enc(flag, ip_version) profile_7_flags2_enc(flag, ip_version)
{ {
UNCOMPRESSED { UNCOMPRESSED {
list_indicator [ 1 ]; list_indicator [ 1 ];
pt_indicator [ 1 ]; pt_indicator [ 1 ];
time_stride_indicator [ 1 ]; time_stride_indicator [ 1 ];
pad_bit [ 1 ]; pad_bit [ 1 ];
extension [ 1 ]; extension [ 1 ];
df [ 1 ];
coverage_behavior [ 2 ]; coverage_behavior [ 2 ];
} }
COMPRESSED not_present{ COMPRESSED not_present{
ENFORCE(flag == 0); ENFORCE(flag == 0);
ENFORCE(list_indicator.CVALUE == 0); ENFORCE(list_indicator.CVALUE == 0);
ENFORCE(pt_indicator.CVALUE == 0); ENFORCE(pt_indicator.CVALUE == 0);
ENFORCE(time_stride_indicator.CVALUE == 0); ENFORCE(time_stride_indicator.CVALUE == 0);
pad_bit =:= static; pad_bit =:= static;
extension =:= static; extension =:= static;
df =:= static;
coverage_behavior =:= static; coverage_behavior =:= static;
} }
COMPRESSED present { COMPRESSED present {
ENFORCE(flag == 1); ENFORCE(flag == 1);
reserved =:= compressed_value(1, 0) [ 1 ];
list_indicator =:= irregular(1) [ 1 ]; list_indicator =:= irregular(1) [ 1 ];
pt_indicator =:= irregular(1) [ 1 ]; pt_indicator =:= irregular(1) [ 1 ];
time_stride_indicator =:= irregular(1) [ 1 ]; time_stride_indicator =:= irregular(1) [ 1 ];
pad_bit =:= irregular(1) [ 1 ]; pad_bit =:= irregular(1) [ 1 ];
extension =:= irregular(1) [ 1 ]; extension =:= irregular(1) [ 1 ];
df =:= dont_fragment(ip_version) [ 1 ];
coverage_behavior =:= irregular(2) [ 2 ]; coverage_behavior =:= irregular(2) [ 2 ];
} }
} }
//////////////////////////////////////////// ////////////////////////////////////////////
// RTP profile // RTP profile
//////////////////////////////////////////// ////////////////////////////////////////////
rtp_baseheader(profile, ts_stride_value, time_stride_value, rtp_baseheader(profile, ts_stride_value, time_stride_value,
outer_ip_flag, repair_flag) outer_ip_flag)
{ {
UNCOMPRESSED v4 { UNCOMPRESSED v4 {
ENFORCE(msn.UVALUE == sequence_number.UVALUE); ENFORCE(msn.UVALUE == sequence_number.UVALUE);
outer_headers =:= baseheader_outer_headers [ VARIABLE ]; outer_headers =:= baseheader_outer_headers [ VARIABLE ];
ip_version =:= uncompressed_value(4, 4) [ 4 ]; ip_version =:= uncompressed_value(4, 4) [ 4 ];
header_length =:= uncompressed_value(4, 5) [ 4 ]; header_length =:= uncompressed_value(4, 5) [ 4 ];
tos_tc [ 8 ]; tos_tc [ 8 ];
length =:= inferred_ip_v4_length [ 16 ]; length =:= inferred_ip_v4_length [ 16 ];
ip_id [ 16 ]; ip_id [ 16 ];
rf =:= uncompressed_value(1, 0) [ 1 ]; rf =:= uncompressed_value(1, 0) [ 1 ];
skipping to change at page 76, line 5 skipping to change at page 79, line 9
rtp_version =:= uncompressed_value(2, 2) [ 2 ]; rtp_version =:= uncompressed_value(2, 2) [ 2 ];
pad_bit [ 1 ]; pad_bit [ 1 ];
extension [ 1 ]; extension [ 1 ];
cc [ 4 ]; cc [ 4 ];
marker [ 1 ]; marker [ 1 ];
payload_type [ 7 ]; payload_type [ 7 ];
sequence_number [ 16 ]; sequence_number [ 16 ];
timestamp [ 32 ]; timestamp [ 32 ];
ssrc [ 32 ]; ssrc [ 32 ];
csrc_list [ VARIABLE ]; csrc_list [ VARIABLE ];
df =:= uncompressed_value(0,0) [ 0 ];
ip_id =:= uncompressed_value(0,0) [ 0 ];
} }
CONTROL { CONTROL {
ENFORCE(time_stride_value == time_stride.UVALUE); ENFORCE(time_stride.UVALUE == time_stride_value);
ENFORCE(ts_stride.UVALUE == ts_stride_value); ENFORCE(ts_stride.UVALUE == ts_stride_value);
ENFORCE(profile == PROFILE_RTP_0101); ENFORCE(profile == PROFILE_RTP_0101);
ts_stride [ 32 ]; ts_stride [ 32 ];
time_stride [ 32 ]; time_stride [ 32 ];
ts_scaled [ 32 ]; ts_scaled [ 32 ];
ts_offset =:= field_scaling(ts_stride.UVALUE, ts_scaled.UVALUE, ts_offset =:= field_scaling(ts_stride.UVALUE, ts_scaled.UVALUE,
timestamp.UVALUE) [ 32 ]; timestamp.UVALUE) [ 32 ];
ip_id_behavior [ 2 ]; ip_id_behavior [ 2 ];
} }
INITIAL { INITIAL {
ts_stride =:= uncompressed_value(32, 0); ts_stride =:= uncompressed_value(32, TS_STRIDE_DEFAULT);
time_stride =:= uncompressed_value(32, 0); time_stride =:= uncompressed_value(32, TIME_STRIDE_DEFAULT);
} }
DEFAULT { DEFAULT {
ENFORCE(outer_ip_flag == 0); ENFORCE(outer_ip_flag == 0);
ENFORCE(repair_flag == 0);
tos_tc =:= static; tos_tc =:= static;
dest_addr =:= static; dest_addr =:= static;
ttl_hopl =:= static; ttl_hopl =:= static;
src_addr =:= static; src_addr =:= static;
df =:= static; df =:= static;
ip_id_behavior =:= static; ip_id_behavior =:= static;
flow_label =:= static; flow_label =:= static;
next_header =:= static; next_header =:= static;
src_port =:= static; src_port =:= static;
dst_port =:= static; dst_port =:= static;
udp_checksum =:= irregular(16);
pad_bit =:= static; pad_bit =:= static;
extension =:= static; extension =:= static;
cc =:= static; cc =:= static;
// When marker not present in packets, it is assumed 0 // When marker not present in packets, it is assumed 0
marker =:= uncompressed_value(1, 0); marker =:= uncompressed_value(1, 0);
payload_type =:= static; payload_type =:= static;
sequence_number =:= static; sequence_number =:= static;
timestamp =:= static; timestamp =:= static;
ssrc =:= static; ssrc =:= static;
csrc_list =:= static; csrc_list =:= static;
} }
// Replacement for UOR-2-ext3 // Replacement for UOR-2-ext3
COMPRESSED co_common { COMPRESSED co_common {
ENFORCE(repair_flag == 0);
ENFORCE(outer_ip_flag == outer_ip_indicator.CVALUE); ENFORCE(outer_ip_flag == outer_ip_indicator.CVALUE);
ENFORCE(repair_flag == repair_indicator.CVALUE);
discriminator =:= '11111010' [ 8 ]; discriminator =:= '11111010' [ 8 ];
marker =:= irregular(1) [ 1 ]; marker =:= irregular(1) [ 1 ];
header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ]; header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ];
flags1_indicator =:= irregular(1) [ 1 ]; flags1_indicator =:= irregular(1) [ 1 ];
flags2_indicator =:= irregular(1) [ 1 ]; flags2_indicator =:= irregular(1) [ 1 ];
tsc_indicator =:= irregular(1) [ 1 ]; tsc_indicator =:= irregular(1) [ 1 ];
tss_indicator =:= irregular(1) [ 1 ]; tss_indicator =:= irregular(1) [ 1 ];
ip_id_indicator =:= irregular(1) [ 1 ]; ip_id_indicator =:= irregular(1) [ 1 ];
control_crc3 =:= control_crc3_encoding [ 3 ]; control_crc3 =:= control_crc3_encoding [ 3 ];
outer_ip_indicator : repair_indicator : ttl_hopl_indicator : outer_ip_indicator : ttl_hopl_indicator :
tos_tc_indicator : ip_id_behavior : reorder_ratio =:= tos_tc_indicator : ip_id_behavior : reorder_ratio =:=
profile_1_7_flags1_enc(flags1_indicator.CVALUE) [ 0, 8 ]; profile_1_7_flags1_enc(flags1_indicator.CVALUE) [ 0, 8 ];
list_indicator : pt_indicator : tis_indicator :pad_bit : list_indicator : pt_indicator : tis_indicator :pad_bit :
extension : df =:= profile_1_flags2_enc(flags2_indicator.CVALUE, extension : df =:= profile_1_flags2_enc(flags2_indicator.CVALUE,
ip_version.UVALUE) [ 0, 8 ]; ip_version.UVALUE) [ 0, 8 ];
ip_id =:= optional_ip_id_lsb(ip_id_behavior.UVALUE,
ip_id_indicator.CVALUE) [ 0, 8, 16 ];
tos_tc =:= static_or_irreg(tos_tc_indicator.CVALUE, 8) [ 0, 8 ]; tos_tc =:= static_or_irreg(tos_tc_indicator.CVALUE, 8) [ 0, 8 ];
ttl_hopl =:= static_or_irreg(ttl_hopl_indicator.CVALUE, ttl_hopl =:= static_or_irreg(ttl_hopl_indicator.CVALUE,
ttl_hopl.ULENGTH) [ 0, 8 ]; ttl_hopl.ULENGTH) [ 0, 8 ];
payload_type =:= optional_pt(pt_indicator) [ 0, 8 ]; payload_type =:= pt_irr_or_static(pt_indicator) [ 0, 8 ];
sequence_number =:= sdvl_lsb(sequence_number.ULENGTH) [ VARIABLE ]; sequence_number =:=
sdvl_sn_lsb(sequence_number.ULENGTH) [ VARIABLE ];
ip_id =:= ip_id_sequential_variable(ip_id_behavior.UVALUE,
ip_id_indicator.CVALUE) [ 0, 8, 16 ];
ts_scaled =:= variable_scaled_timestamp(tss_indicator.CVALUE, ts_scaled =:= variable_scaled_timestamp(tss_indicator.CVALUE,
tsc_indicator, ts_stride.UVALUE) [ VARIABLE ]; tsc_indicator, ts_stride.UVALUE) [ VARIABLE ];
timestamp =:= variable_unscaled_timestamp(tss_indicator.CVALUE, timestamp =:= variable_unscaled_timestamp(tss_indicator.CVALUE,
tsc_indicator) [ VARIABLE ]; tsc_indicator) [ VARIABLE ];
ts_stride =:= sdvl_or_static(tss_indicator.CVALUE) [ VARIABLE ]; ts_stride =:= sdvl_or_static(tss_indicator.CVALUE) [ VARIABLE ];
time_stride =:= sdvl_or_static(tis_indicator.CVALUE) [ VARIABLE ]; time_stride =:= sdvl_or_static(tis_indicator.CVALUE) [ VARIABLE ];
csrc_list =:= csrc_list_presence(list_indicator.CVALUE, csrc_list =:= csrc_list_presence(list_indicator.CVALUE,
cc.UVALUE) [ VARIABLE ]; cc.UVALUE) [ VARIABLE ];
} }
// Context repair (IR-DYN replacement).
COMPRESSED co_repair {
ENFORCE(outer_ip_flag == outer_ip_indicator.CVALUE);
ENFORCE(repair_flag == repair_indicator.CVALUE);
discriminator =:= '11111011' [ 8 ];
marker =:= irregular(1) [ 1 ];
header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ];
flags1_indicator =:= irregular(1) [ 1 ];
flags2_indicator =:= irregular(1) [ 1 ];
timestamp_indicator =:= irregular(1) [ 1 ];
tss_indicator =:= irregular(1) [ 1 ];
ip_id_indicator =:= irregular(1) [ 1 ];
control_crc3 =:= control_crc3_encoding [ 3 ];
outer_ip_indicator : repair_indicator : ttl_hopl_indicator :
tos_tc_indicator : ip_id_behavior : reorder_ratio =:=
profile_1_7_flags1_enc(flags1_indicator.CVALUE) [ 0, 8 ];
list_indicator : pt_indicator : pad_bit : extension : df :
tis_indicator =:= profile_1_flags2_enc(flags2_indicator.CVALUE,
ip_version.UVALUE) [ 0, 8 ];
ip_id =:= optional_ip_id_lsb(ip_id_behavior.UVALUE,
ip_id_indicator.CVALUE) [ 0, 8, 16 ];
tos_tc =:=
static_or_irreg(tos_tc_indicator.CVALUE, 8) [ 0, 8 ];
ttl_hopl =:= static_or_irreg(ttl_hopl_indicator.CVALUE,
ttl_hopl.ULENGTH) [ 0, 8 ];
payload_type =:= optional_pt(pt_indicator) [ 0, 8 ];
sequence_number =:= irregular(16) [ 16 ];
timestamp =:=
irregular_or_nothing(timestamp_indicator) [ 0, 32 ];
ts_stride =:=
sdvl_or_static(tss_indicator) [ VARIABLE ];
time_stride =:=
sdvl_or_static(tis_indicator) [ VARIABLE ];
csrc_list =:=
csrc_list_presence(list_indicator.CVALUE, cc.UVALUE) [ VARIABLE ];
}
// UO-0 // UO-0
COMPRESSED pt_0_crc3 { COMPRESSED pt_0_crc3 {
discriminator =:= '0' [ 1 ]; discriminator =:= '0' [ 1 ];
msn =:= msn_lsb(4) [ 4 ]; msn =:= msn_lsb(4) [ 4 ];
header_crc =:= crc3(THIS.UVALUE, THIS.ULENGTH) [ 3 ]; header_crc =:= crc3(THIS.UVALUE, THIS.ULENGTH) [ 3 ];
timestamp =:= inferred_scaled_field [ 0 ]; timestamp =:= inferred_scaled_field [ 0 ];
ip_id =:= inferred_sequential_ip_id [ 0 ]; ip_id =:= inferred_sequential_ip_id [ 0 ];
} }
// New format, Type 0 with strong CRC and more SN bits // New format, Type 0 with strong CRC and more SN bits
COMPRESSED pt_0_crc7 { COMPRESSED pt_0_crc7 {
discriminator =:= '100' [ 3 ]; discriminator =:= '1000' [ 4 ];
msn =:= msn_lsb(6) [ 6 ]; msn =:= msn_lsb(5) [ 5 ];
header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ]; header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ];
timestamp =:= inferred_scaled_field [ 0 ]; timestamp =:= inferred_scaled_field [ 0 ];
ip_id =:= inferred_sequential_ip_id [ 0 ]; ip_id =:= inferred_sequential_ip_id [ 0 ];
} }
// UO-1 replacement // UO-1 replacement
COMPRESSED pt_1_rnd { COMPRESSED pt_1_rnd {
ENFORCE(ts_stride.UVALUE != 0); ENFORCE(ts_stride.UVALUE != 0);
ENFORCE((ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_RANDOM) || ENFORCE((ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_RANDOM) ||
(ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_ZERO)); (ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_ZERO));
discriminator =:= '101' [ 3 ]; discriminator =:= '101' [ 3 ];
msn =:= msn_lsb(5) [ 5 ]; msn =:= msn_lsb(4) [ 4 ];
marker =:= irregular(1) [ 1 ]; marker =:= irregular(1) [ 1 ];
ts_scaled =:= scaled_ts_lsb(time_stride.UVALUE, 4) [ 4 ]; ts_scaled =:= scaled_ts_lsb(time_stride.UVALUE, 5) [ 5 ];
header_crc =:= crc3(THIS.UVALUE, THIS.ULENGTH) [ 3 ]; header_crc =:= crc3(THIS.UVALUE, THIS.ULENGTH) [ 3 ];
} }
// UO-1-ID replacement // UO-1-ID replacement
COMPRESSED pt_1_seq_id { COMPRESSED pt_1_seq_id {
ENFORCE((ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_SEQUENTIAL) || ENFORCE((ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_SEQUENTIAL) ||
(ip_id_behavior.UVALUE == (ip_id_behavior.UVALUE ==
IP_ID_BEHAVIOR_SEQUENTIAL_SWAPPED)); IP_ID_BEHAVIOR_SEQUENTIAL_SWAPPED));
discriminator =:= '1010' [ 4 ]; discriminator =:= '1001' [ 4 ];
header_crc =:= crc3(THIS.UVALUE, THIS.ULENGTH) [ 3 ];
msn =:= msn_lsb(5) [ 5 ];
ip_id =:= ip_id_lsb(ip_id_behavior.UVALUE, 4) [ 4 ]; ip_id =:= ip_id_lsb(ip_id_behavior.UVALUE, 4) [ 4 ];
msn =:= msn_lsb(5) [ 5 ];
header_crc =:= crc3(THIS.UVALUE, THIS.ULENGTH) [ 3 ];
timestamp =:= inferred_scaled_field [ 0 ]; timestamp =:= inferred_scaled_field [ 0 ];
} }
// UO-1-TS replacement // UO-1-TS replacement
COMPRESSED pt_1_seq_ts { COMPRESSED pt_1_seq_ts {
ENFORCE(ts_stride.UVALUE != 0); ENFORCE(ts_stride.UVALUE != 0);
ENFORCE((ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_SEQUENTIAL) || ENFORCE((ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_SEQUENTIAL) ||
(ip_id_behavior.UVALUE == (ip_id_behavior.UVALUE ==
IP_ID_BEHAVIOR_SEQUENTIAL_SWAPPED)); IP_ID_BEHAVIOR_SEQUENTIAL_SWAPPED));
discriminator =:= '1011' [ 4 ]; discriminator =:= '101' [ 3 ];
marker =:= irregular(1) [ 1 ]; marker =:= irregular(1) [ 1 ];
header_crc =:= crc3(THIS.UVALUE, THIS.ULENGTH) [ 3 ];
msn =:= msn_lsb(4) [ 4 ]; msn =:= msn_lsb(4) [ 4 ];
ts_scaled =:= scaled_ts_lsb(time_stride.UVALUE, 4) [ 4 ]; ts_scaled =:= scaled_ts_lsb(time_stride.UVALUE, 5) [ 5 ];
header_crc =:= crc3(THIS.UVALUE, THIS.ULENGTH) [ 3 ];
} }
// UOR-2 replacement // UOR-2 replacement
COMPRESSED pt_2_rnd { COMPRESSED pt_2_rnd {
ENFORCE(ts_stride.UVALUE != 0); ENFORCE(ts_stride.UVALUE != 0);
ENFORCE((ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_RANDOM) || ENFORCE((ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_RANDOM) ||
(ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_ZERO)); (ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_ZERO));
discriminator =:= '110' [ 3 ]; discriminator =:= '110' [ 3 ];
msn =:= msn_lsb(7) [ 7 ]; msn =:= msn_lsb(7) [ 7 ];
ts_scaled =:= scaled_ts_lsb(time_stride.UVALUE, 6) [ 6 ]; ts_scaled =:= scaled_ts_lsb(time_stride.UVALUE, 6) [ 6 ];
skipping to change at page 80, line 39 skipping to change at page 83, line 4
ENFORCE((ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_SEQUENTIAL) || ENFORCE((ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_SEQUENTIAL) ||
(ip_id_behavior.UVALUE == (ip_id_behavior.UVALUE ==
IP_ID_BEHAVIOR_SEQUENTIAL_SWAPPED)); IP_ID_BEHAVIOR_SEQUENTIAL_SWAPPED));
discriminator =:= '1101' [ 4 ]; discriminator =:= '1101' [ 4 ];
msn =:= msn_lsb(7) [ 7 ]; msn =:= msn_lsb(7) [ 7 ];
ts_scaled =:= scaled_ts_lsb(time_stride.UVALUE, 5) [ 5 ]; ts_scaled =:= scaled_ts_lsb(time_stride.UVALUE, 5) [ 5 ];
marker =:= irregular(1) [ 1 ]; marker =:= irregular(1) [ 1 ];
header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ]; header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ];
} }
} }
//////////////////////////////////////////// ////////////////////////////////////////////
// UDP profile // UDP profile
//////////////////////////////////////////// ////////////////////////////////////////////
udp_baseheader(profile, outer_ip_flag, repair_flag) udp_baseheader(profile, outer_ip_flag)
{ {
UNCOMPRESSED v4 { UNCOMPRESSED v4 {
outer_headers =:= baseheader_outer_headers [ VARIABLE ]; outer_headers =:= baseheader_outer_headers [ VARIABLE ];
ip_version =:= uncompressed_value(4, 4) [ 4 ]; ip_version =:= uncompressed_value(4, 4) [ 4 ];
header_length =:= uncompressed_value(4, 5) [ 4 ]; header_length =:= uncompressed_value(4, 5) [ 4 ];
tos_tc [ 8 ]; tos_tc [ 8 ];
length =:= inferred_ip_v4_length [ 16 ]; length =:= inferred_ip_v4_length [ 16 ];
ip_id [ 16 ]; ip_id [ 16 ];
rf =:= uncompressed_value(1, 0) [ 1 ]; rf =:= uncompressed_value(1, 0) [ 1 ];
df [ 1 ]; df [ 1 ];
skipping to change at page 81, line 37 skipping to change at page 83, line 49
payload_length =:= inferred_ip_v6_length [ 16 ]; payload_length =:= inferred_ip_v6_length [ 16 ];
next_header [ 8 ]; next_header [ 8 ];
ttl_hopl [ 8 ]; ttl_hopl [ 8 ];
src_addr [ 128 ]; src_addr [ 128 ];
dest_addr [ 128 ]; dest_addr [ 128 ];
extension_headers =:= baseheader_extension_headers [ VARIABLE ]; extension_headers =:= baseheader_extension_headers [ VARIABLE ];
src_port [ 16 ]; src_port [ 16 ];
dst_port [ 16 ]; dst_port [ 16 ];
udp_length =:= inferred_udp_length [ 16 ]; udp_length =:= inferred_udp_length [ 16 ];
udp_checksum [ 16 ]; udp_checksum [ 16 ];
df =:= uncompressed_value(0,0) [ 0 ];
ip_id =:= uncompressed_value(0,0) [ 0 ];
} }
CONTROL { CONTROL {
ENFORCE(profile == PROFILE_UDP_0102); ENFORCE(profile == PROFILE_UDP_0102);
ip_id_behavior [ 2 ]; ip_id_behavior [ 2 ];
} }
DEFAULT { DEFAULT {
ENFORCE(outer_ip_flag == 0); ENFORCE(outer_ip_flag == 0);
ENFORCE(repair_flag == 0);
tos_tc =:= static; tos_tc =:= static;
dest_addr =:= static; dest_addr =:= static;
ip_version =:= static; ip_version =:= static;
ttl_hopl =:= static; ttl_hopl =:= static;
src_addr =:= static; src_addr =:= static;
df =:= static; df =:= static;
ip_id_behavior =:= static; ip_id_behavior =:= static;
flow_label =:= static; flow_label =:= static;
next_header =:= static; next_header =:= static;
src_port =:= static; src_port =:= static;
dst_port =:= static; dst_port =:= static;
udp_checksum =:= irregular(16);
} }
// Replacement for UOR-2-ext3 // Replacement for UOR-2-ext3
COMPRESSED co_common { COMPRESSED co_common {
ENFORCE(repair_flag == 0);
ENFORCE(outer_ip_flag == outer_ip_indicator.CVALUE); ENFORCE(outer_ip_flag == outer_ip_indicator.CVALUE);
ENFORCE(repair_flag == repair_indicator.CVALUE);
discriminator =:= '11111010' [ 8 ]; discriminator =:= '11111010' [ 8 ];
ip_id_indicator =:= irregular(1) [ 1 ]; ip_id_indicator =:= irregular(1) [ 1 ];
header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ]; header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ];
flags_indicator =:= irregular(1) [ 1 ]; flags_indicator =:= irregular(1) [ 1 ];
ttl_hopl_indicator =:= irregular(1) [ 1 ]; ttl_hopl_indicator =:= irregular(1) [ 1 ];
tos_tc_indicator =:= irregular(1) [ 1 ]; tos_tc_indicator =:= irregular(1) [ 1 ];
reorder_ratio =:= reorder_choice [ 2 ]; reorder_ratio =:= reorder_choice [ 2 ];
control_crc3 =:= control_crc3_encoding [ 3 ]; control_crc3 =:= control_crc3_encoding [ 3 ];
outer_ip_indicator : repair_indicator : df : outer_ip_indicator : df : ip_id_behavior =:=
ip_id_behavior =:= profile_2_3_4_flags_enc( profile_2_3_4_flags_enc(
flags_indicator.CVALUE, ip_version.UVALUE) [ 0, 8 ]; flags_indicator.CVALUE, ip_version.UVALUE) [ 0, 8 ];
ip_id =:= optional_ip_id_lsb(ip_id_behavior.UVALUE,
ip_id_indicator.CVALUE) [ 0, 8, 16 ];
tos_tc =:= static_or_irreg(tos_tc_indicator.CVALUE, 8) [ 0, 8 ]; tos_tc =:= static_or_irreg(tos_tc_indicator.CVALUE, 8) [ 0, 8 ];
ttl_hopl =:= static_or_irreg(ttl_hopl_indicator.CVALUE, ttl_hopl =:= static_or_irreg(ttl_hopl_indicator.CVALUE,
ttl_hopl.ULENGTH) [ 0, 8 ]; ttl_hopl.ULENGTH) [ 0, 8 ];
msn =:= msn_lsb(8) [ 8 ]; msn =:= msn_lsb(8) [ 8 ];
} ip_id =:= ip_id_sequential_variable(ip_id_behavior.UVALUE,
// Context repair (IR-DYN replacement).
COMPRESSED co_repair {
ENFORCE(outer_ip_flag == outer_ip_indicator.CVALUE);
ENFORCE(repair_flag == repair_indicator.CVALUE);
discriminator =:= '11111011' [ 8 ];
ip_id_indicator =:= irregular(1) [ 1 ];
header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ];
flags_indicator =:= irregular(1) [ 1 ];
ttl_hopl_indicator =:= irregular(1) [ 1 ];
tos_tc_indicator =:= irregular(1) [ 1 ];
reorder_ratio =:= reorder_choice [ 2 ];
control_crc3 =:= control_crc3_encoding [ 3 ];
outer_ip_indicator : repair_indicator : df :
ip_id_behavior =:= profile_2_3_4_flags_enc(
flags_indicator.CVALUE, ip_version.UVALUE) [ 0, 8 ];
ip_id =:= optional_ip_id_lsb(ip_id_behavior.UVALUE,
ip_id_indicator.CVALUE) [ 0, 8, 16 ]; ip_id_indicator.CVALUE) [ 0, 8, 16 ];
tos_tc =:= static_or_irreg(tos_tc_indicator.CVALUE, 8) [ 0, 8 ];
ttl_hopl =:= static_or_irreg(ttl_hopl_indicator.CVALUE,
ttl_hopl.ULENGTH) [ 0, 8 ];
msn =:= irregular(16) [ 16 ];
} }
// UO-0 // UO-0
COMPRESSED pt_0_crc3 { COMPRESSED pt_0_crc3 {
discriminator =:= '0' [ 1 ]; discriminator =:= '0' [ 1 ];
msn =:= msn_lsb(4) [ 4 ]; msn =:= msn_lsb(4) [ 4 ];
header_crc =:= crc3(THIS.UVALUE, THIS.ULENGTH) [ 3 ]; header_crc =:= crc3(THIS.UVALUE, THIS.ULENGTH) [ 3 ];
ip_id =:= inferred_sequential_ip_id [ 0 ]; ip_id =:= inferred_sequential_ip_id [ 0 ];
} }
skipping to change at page 84, line 16 skipping to change at page 85, line 50
ip_id =:= ip_id_lsb(ip_id_behavior.UVALUE, 5) [ 5 ]; ip_id =:= ip_id_lsb(ip_id_behavior.UVALUE, 5) [ 5 ];
header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ]; header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ];
msn =:= msn_lsb(8) [ 8 ]; msn =:= msn_lsb(8) [ 8 ];
} }
} }
//////////////////////////////////////////// ////////////////////////////////////////////
// ESP profile // ESP profile
//////////////////////////////////////////// ////////////////////////////////////////////
esp_baseheader(profile, outer_ip_flag, repair_flag) esp_baseheader(profile, outer_ip_flag)
{ {
UNCOMPRESSED v4 { UNCOMPRESSED v4 {
ENFORCE(msn.UVALUE == sequence_number.UVALUE % 65536); ENFORCE(msn.UVALUE == sequence_number.UVALUE % 65536);
outer_headers =:= baseheader_outer_headers [ VARIABLE ]; outer_headers =:= baseheader_outer_headers [ VARIABLE ];
ip_version =:= uncompressed_value(4, 4) [ 4 ]; ip_version =:= uncompressed_value(4, 4) [ 4 ];
header_length =:= uncompressed_value(4, 5) [ 4 ]; header_length =:= uncompressed_value(4, 5) [ 4 ];
tos_tc [ 8 ]; tos_tc [ 8 ];
length =:= inferred_ip_v4_length [ 16 ]; length =:= inferred_ip_v4_length [ 16 ];
ip_id [ 16 ]; ip_id [ 16 ];
rf =:= uncompressed_value(1, 0) [ 1 ]; rf =:= uncompressed_value(1, 0) [ 1 ];
skipping to change at page 85, line 7 skipping to change at page 86, line 41
tos_tc [ 8 ]; tos_tc [ 8 ];
flow_label [ 20 ]; flow_label [ 20 ];
payload_length =:= inferred_ip_v6_length [ 16 ]; payload_length =:= inferred_ip_v6_length [ 16 ];
next_header [ 8 ]; next_header [ 8 ];
ttl_hopl [ 8 ]; ttl_hopl [ 8 ];
src_addr [ 128 ]; src_addr [ 128 ];
dest_addr [ 128 ]; dest_addr [ 128 ];
extension_headers =:= baseheader_extension_headers [ VARIABLE ]; extension_headers =:= baseheader_extension_headers [ VARIABLE ];
spi [ 32 ]; spi [ 32 ];
sequence_number [ 32 ]; sequence_number [ 32 ];
df =:= uncompressed_value(0,0) [ 0 ];
ip_id =:= uncompressed_value(0,0) [ 0 ];
} }
CONTROL { CONTROL {
ENFORCE(profile == PROFILE_ESP_0103); ENFORCE(profile == PROFILE_ESP_0103);
ip_id_behavior [ 2 ]; ip_id_behavior [ 2 ];
} }
DEFAULT { DEFAULT {
ENFORCE(outer_ip_indicator == 0); ENFORCE(outer_ip_indicator == 0);
ENFORCE(repair_flag == 0);
tos_tc =:= static; tos_tc =:= static;
dest_addr =:= static; dest_addr =:= static;
ttl_hopl =:= static; ttl_hopl =:= static;
src_addr =:= static; src_addr =:= static;
df =:= static; df =:= static;
ip_id_behavior =:= static; ip_id_behavior =:= static;
flow_label =:= static; flow_label =:= static;
next_header =:= static; next_header =:= static;
spi =:= static; spi =:= static;
sequence_number =:= static; sequence_number =:= static;
} }
// Replacement for UOR-2-ext3 // Replacement for UOR-2-ext3
COMPRESSED co_common { COMPRESSED co_common {
ENFORCE(repair_flag == 0);
ENFORCE(outer_ip_flag == outer_ip_indicator.CVALUE); ENFORCE(outer_ip_flag == outer_ip_indicator.CVALUE);
ENFORCE(repair_flag == repair_indicator.CVALUE);
discriminator =:= '11111010' [ 8 ]; discriminator =:= '11111010' [ 8 ];
ip_id_indicator =:= irregular(1) [ 1 ]; ip_id_indicator =:= irregular(1) [ 1 ];
header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ]; header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ];
flags_indicator =:= irregular(1) [ 1 ]; flags_indicator =:= irregular(1) [ 1 ];
ttl_hopl_indicator =:= irregular(1) [ 1 ]; ttl_hopl_indicator =:= irregular(1) [ 1 ];
tos_tc_indicator =:= irregular(1) [ 1 ]; tos_tc_indicator =:= irregular(1) [ 1 ];
reorder_ratio =:= reorder_choice [ 2 ]; reorder_ratio =:= reorder_choice [ 2 ];
control_crc3 =:= control_crc3_encoding [ 3 ]; control_crc3 =:= control_crc3_encoding [ 3 ];
outer_ip_indicator : repair_indicator : df : outer_ip_indicator : df : ip_id_behavior =:=
ip_id_behavior =:= profile_2_3_4_flags_enc( profile_2_3_4_flags_enc(
flags_indicator.CVALUE, ip_version.UVALUE) [ 0, 8 ]; flags_indicator.CVALUE, ip_version.UVALUE) [ 0, 8 ];
ip_id =:= optional_ip_id_lsb(ip_id_behavior.UVALUE,
ip_id_indicator.CVALUE) [ 0, 8, 16 ];
tos_tc =:= static_or_irreg(tos_tc_indicator.CVALUE, 8) [ 0, 8 ]; tos_tc =:= static_or_irreg(tos_tc_indicator.CVALUE, 8) [ 0, 8 ];
ttl_hopl =:= static_or_irreg(ttl_hopl_indicator.CVALUE, ttl_hopl =:= static_or_irreg(ttl_hopl_indicator.CVALUE,
ttl_hopl.ULENGTH) [ 0, 8 ]; ttl_hopl.ULENGTH) [ 0, 8 ];
sequence_number =:= sdvl_lsb(sequence_number.ULENGTH) [ VARIABLE ]; sequence_number =:=
} sdvl_sn_lsb(sequence_number.ULENGTH) [ VARIABLE ];
ip_id =:= ip_id_sequential_variable(ip_id_behavior.UVALUE,
// Context repair (IR-DYN replacement).
COMPRESSED co_repair {
ENFORCE(outer_ip_flag == outer_ip_indicator.CVALUE);
ENFORCE(repair_flag == repair_indicator.CVALUE);
discriminator =:= '11111011' [ 8 ];
discriminator =:= '11111010' [ 8 ];
ip_id_indicator =:= irregular(1) [ 1 ];
header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ];
flags_indicator =:= irregular(1) [ 1 ];
ttl_hopl_indicator =:= irregular(1) [ 1 ];
tos_tc_indicator =:= irregular(1) [ 1 ];
reorder_ratio =:= reorder_choice [ 2 ];
control_crc3 =:= control_crc3_encoding [ 3 ];
outer_ip_indicator : repair_indicator : df :
ip_id_behavior =:= profile_2_3_4_flags_enc(
flags_indicator.CVALUE, ip_version.UVALUE) [ 0, 8 ];
ip_id =:= optional_ip_id_lsb(ip_id_behavior.UVALUE,
ip_id_indicator.CVALUE) [ 0, 8, 16 ]; ip_id_indicator.CVALUE) [ 0, 8, 16 ];
tos_tc =:= static_or_irreg(tos_tc_indicator.CVALUE, 8) [ 0, 8 ];
ttl_hopl =:= static_or_irreg(ttl_hopl_indicator.CVALUE,
ttl_hopl.ULENGTH) [ 0, 8 ];
sequence_number =:= irregular(32) [ 32 ];
} }
// Sequence number sent instead of MSN due to field length
// UO-0 // UO-0
COMPRESSED pt_0_crc3 { COMPRESSED pt_0_crc3 {
discriminator =:= '0' [ 1 ]; discriminator =:= '0' [ 1 ];
msn =:= msn_lsb(4) [ 4 ]; sequence_number =:= msn_lsb(4) [ 4 ];
header_crc =:= crc3(THIS.UVALUE, THIS.ULENGTH) [ 3 ]; header_crc =:= crc3(THIS.UVALUE, THIS.ULENGTH) [ 3 ];
ip_id =:= inferred_sequential_ip_id [ 0 ]; ip_id =:= inferred_sequential_ip_id [ 0 ];
} }
// New format, Type 0 with strong CRC and more SN bits // New format, Type 0 with strong CRC and more SN bits
COMPRESSED pt_0_crc7 { COMPRESSED pt_0_crc7 {
discriminator =:= '100' [ 3 ]; discriminator =:= '100' [ 3 ];
msn =:= msn_lsb(6) [ 6 ]; sequence_number =:= msn_lsb(6) [ 6 ];
header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ]; header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ];
ip_id =:= inferred_sequential_ip_id [ 0 ]; ip_id =:= inferred_sequential_ip_id [ 0 ];
} }
// UO-1-ID replacement (PT-1 only used for sequential) // UO-1-ID replacement (PT-1 only used for sequential)
COMPRESSED pt_1_seq_id { COMPRESSED pt_1_seq_id {
ENFORCE((ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_SEQUENTIAL) || ENFORCE((ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_SEQUENTIAL) ||
(ip_id_behavior.UVALUE == (ip_id_behavior.UVALUE ==
IP_ID_BEHAVIOR_SEQUENTIAL_SWAPPED)); IP_ID_BEHAVIOR_SEQUENTIAL_SWAPPED));
discriminator =:= '101' [ 3 ]; discriminato =:= '101' [ 3 ];
header_crc =:= crc3(THIS.UVALUE, THIS.ULENGTH) [ 3 ]; header_crc =:= crc3(THIS.UVALUE, THIS.ULENGTH) [ 3 ];
msn =:= msn_lsb(6) [ 6 ]; sequence_number =:= msn_lsb(6) [ 6 ];
ip_id =:= ip_id_lsb(ip_id_behavior.UVALUE, 4) [ 4 ]; ip_id =:= ip_id_lsb(ip_id_behavior.UVALUE, 4) [ 4 ];
} }
// UOR-2 replacement // UOR-2 replacement
COMPRESSED pt_2_rnd { COMPRESSED pt_2_rnd {
ENFORCE((ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_RANDOM) || ENFORCE((ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_RANDOM) ||
(ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_ZERO)); (ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_ZERO));
discriminator =:= '110' [ 3 ]; discriminator =:= '110' [ 3 ];
msn =:= msn_lsb(6) [ 6 ]; sequence_number =:= msn_lsb(6) [ 6 ];
header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ]; header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ];
} }
// UOR-2-ID replacement // UOR-2-ID replacement
COMPRESSED pt_2_seq_id { COMPRESSED pt_2_seq_id {
ENFORCE((ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_SEQUENTIAL) || ENFORCE((ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_SEQUENTIAL) ||
(ip_id_behavior.UVALUE == (ip_id_behavior.UVALUE ==
IP_ID_BEHAVIOR_SEQUENTIAL_SWAPPED)); IP_ID_BEHAVIOR_SEQUENTIAL_SWAPPED));
discriminator =:= '1100' [ 4 ]; discriminator =:= '1100' [ 4 ];
ip_id =:= ip_id_lsb(ip_id_behavior.UVALUE, 5) [ 5 ]; ip_id =:= ip_id_lsb(ip_id_behavior.UVALUE, 5) [ 5 ];
header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ]; header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ];
msn =:= msn_lsb(8) [ 8 ]; sequence_number =:= msn_lsb(8) [ 8 ];
} }
} }
//////////////////////////////////////////// ////////////////////////////////////////////
// IP-only profile // IP-only profile
//////////////////////////////////////////// ////////////////////////////////////////////
iponly_baseheader(profile, outer_ip_flag, repair_flag) iponly_baseheader(profile, outer_ip_flag)
{ {
UNCOMPRESSED v4 { UNCOMPRESSED v4 {
outer_headers =:= baseheader_outer_headers [ VARIABLE ]; outer_headers =:= baseheader_outer_headers [ VARIABLE ];
ip_version =:= uncompressed_value(4, 4) [ 4 ]; ip_version =:= uncompressed_value(4, 4) [ 4 ];
header_length =:= uncompressed_value(4, 5) [ 4 ]; header_length =:= uncompressed_value(4, 5) [ 4 ];
tos_tc [ 8 ]; tos_tc [ 8 ];
length =:= inferred_ip_v4_length [ 16 ]; length =:= inferred_ip_v4_length [ 16 ];
ip_id [ 16 ]; ip_id [ 16 ];
rf =:= uncompressed_value(1, 0) [ 1 ]; rf =:= uncompressed_value(1, 0) [ 1 ];
df [ 1 ]; df [ 1 ];
skipping to change at page 88, line 20 skipping to change at page 89, line 30
outer_headers =:= baseheader_outer_headers [ VARIABLE ]; outer_headers =:= baseheader_outer_headers [ VARIABLE ];
ip_version =:= uncompressed_value(4, 6) [ 4 ]; ip_version =:= uncompressed_value(4, 6) [ 4 ];
tos_tc [ 8 ]; tos_tc [ 8 ];
flow_label [ 20 ]; flow_label [ 20 ];
payload_length =:= inferred_ip_v6_length [ 16 ]; payload_length =:= inferred_ip_v6_length [ 16 ];
next_header [ 8 ]; next_header [ 8 ];
ttl_hopl [ 8 ]; ttl_hopl [ 8 ];
src_addr [ 128 ]; src_addr [ 128 ];
dest_addr [ 128 ]; dest_addr [ 128 ];
extension_headers =:= baseheader_extension_headers [ VARIABLE ]; extension_headers =:= baseheader_extension_headers [ VARIABLE ];
df =:= uncompressed_value(0,0) [ 0 ];
ip_id =:= uncompressed_value(0,0) [ 0 ];
} }
CONTROL { CONTROL {
ENFORCE(profile == PROFILE_IP_0104); ENFORCE(profile == PROFILE_IP_0104);
ip_id_behavior [ 2 ]; ip_id_behavior [ 2 ];
} }
DEFAULT { DEFAULT {
ENFORCE(outer_ip_indicator == 0); ENFORCE(outer_ip_indicator == 0);
ENFORCE(repair_flag == 0);
tos_tc =:= static; tos_tc =:= static;
dest_addr =:= static; dest_addr =:= static;
ttl_hopl =:= static; ttl_hopl =:= static;
src_addr =:= static; src_addr =:= static;
df =:= static; df =:= static;
ip_id_behavior =:= static; ip_id_behavior =:= static;
flow_label =:= static; flow_label =:= static;
next_header =:= static; next_header =:= static;
} }
// Replacement for UOR-2-ext3 // Replacement for UOR-2-ext3
COMPRESSED co_common { COMPRESSED co_common {
ENFORCE(repair_flag == 0);
ENFORCE(outer_ip_flag == outer_ip_indicator.CVALUE); ENFORCE(outer_ip_flag == outer_ip_indicator.CVALUE);
ENFORCE(repair_flag == repair_indicator.CVALUE);
discriminator =:= '11111010' [ 8 ]; discriminator =:= '11111010' [ 8 ];
ip_id_indicator =:= irregular(1) [ 1 ]; ip_id_indicator =:= irregular(1) [ 1 ];
header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ]; header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ];
flags_indicator =:= irregular(1) [ 1 ]; flags_indicator =:= irregular(1) [ 1 ];
ttl_hopl_indicator =:= irregular(1) [ 1 ]; ttl_hopl_indicator =:= irregular(1) [ 1 ];
tos_tc_indicator =:= irregular(1) [ 1 ]; tos_tc_indicator =:= irregular(1) [ 1 ];
reorder_ratio =:= reorder_choice [ 2 ]; reorder_ratio =:= reorder_choice [ 2 ];
control_crc3 =:= control_crc3_encoding [ 3 ]; control_crc3 =:= control_crc3_encoding [ 3 ];
outer_ip_indicator : repair_indicator : df : outer_ip_indicator : df : ip_id_behavior =:=
ip_id_behavior =:= profile_2_3_4_flags_enc( profile_2_3_4_flags_enc(
flags_indicator.CVALUE, ip_version.UVALUE) [ 0, 8 ]; flags_indicator.CVALUE, ip_version.UVALUE) [ 0, 8 ];
ip_id =:= optional_ip_id_lsb(ip_id_behavior.UVALUE,
ip_id_indicator.CVALUE) [ 0, 8, 16 ];
tos_tc =:= static_or_irreg(tos_tc_indicator.CVALUE, 8) [ 0, 8 ]; tos_tc =:= static_or_irreg(tos_tc_indicator.CVALUE, 8) [ 0, 8 ];
ttl_hopl =:= static_or_irreg(ttl_hopl_indicator.CVALUE, ttl_hopl =:= static_or_irreg(ttl_hopl_indicator.CVALUE,
ttl_hopl.ULENGTH) [ 0, 8 ]; ttl_hopl.ULENGTH) [ 0, 8 ];
msn =:= msn_lsb(8) [ 8 ]; msn =:= msn_lsb(8) [ 8 ];
} ip_id =:= ip_id_sequential_variable(ip_id_behavior.UVALUE,
// Context repair (IR-DYN replacement).
COMPRESSED co_repair {
ENFORCE(outer_ip_flag == outer_ip_indicator.CVALUE);
ENFORCE(repair_flag == repair_indicator.CVALUE);
discriminator =:= '11111011' [ 8 ];
ip_id_indicator =:= irregular(1) [ 1 ];
header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ];
flags_indicator =:= irregular(1) [ 1 ];
ttl_hopl_indicator =:= irregular(1) [ 1 ];
tos_tc_indicator =:= irregular(1) [ 1 ];
reorder_ratio =:= reorder_choice [ 2 ];
control_crc3 =:= control_crc3_encoding [ 3 ];
outer_ip_indicator : repair_indicator : df :
ip_id_behavior =:= profile_2_3_4_flags_enc(
flags_indicator.CVALUE, ip_version.UVALUE) [ 0, 8 ];
ip_id =:= optional_ip_id_lsb(ip_id_behavior.UVALUE,
ip_id_indicator.CVALUE) [ 0, 8, 16 ]; ip_id_indicator.CVALUE) [ 0, 8, 16 ];
tos_tc =:= static_or_irreg(tos_tc_indicator.CVALUE, 8) [ 0, 8 ];
ttl_hopl =:= static_or_irreg(ttl_hopl_indicator.CVALUE,
ttl_hopl.ULENGTH) [ 0, 8 ];
msn =:= irregular(16) [ 16 ];
} }
// UO-0 // UO-0
COMPRESSED pt_0_crc3 { COMPRESSED pt_0_crc3 {
discriminator =:= '0' [ 1 ]; discriminator =:= '0' [ 1 ];
msn =:= msn_lsb(4) [ 4 ]; msn =:= msn_lsb(4) [ 4 ];
header_crc =:= crc3(THIS.UVALUE, THIS.ULENGTH) [ 3 ]; header_crc =:= crc3(THIS.UVALUE, THIS.ULENGTH) [ 3 ];
ip_id =:= inferred_sequential_ip_id [ 0 ]; ip_id =:= inferred_sequential_ip_id [ 0 ];
} }
skipping to change at page 90, line 44 skipping to change at page 91, line 30
header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ]; header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ];
msn =:= msn_lsb(8) [ 8 ]; msn =:= msn_lsb(8) [ 8 ];
} }
} }
//////////////////////////////////////////// ////////////////////////////////////////////
// UDP-lite/RTP profile // UDP-lite/RTP profile
//////////////////////////////////////////// ////////////////////////////////////////////
udplite_rtp_baseheader(profile, ts_stride_value, time_stride_value, udplite_rtp_baseheader(profile, ts_stride_value, time_stride_value,
outer_ip_flag, repair_flag) outer_ip_flag)
{ {
UNCOMPRESSED v4 { UNCOMPRESSED v4 {
ENFORCE(msn.UVALUE == sequence_number.UVALUE); ENFORCE(msn.UVALUE == sequence_number.UVALUE);
outer_headers =:= baseheader_outer_headers [ VARIABLE ]; outer_headers =:= baseheader_outer_headers [ VARIABLE ];
ip_version =:= uncompressed_value(4, 4) [ 4 ]; ip_version =:= uncompressed_value(4, 4) [ 4 ];
header_length =:= uncompressed_value(4, 5) [ 4 ]; header_length =:= uncompressed_value(4, 5) [ 4 ];
tos_tc [ 8 ]; tos_tc [ 8 ];
length =:= inferred_ip_v4_length [ 16 ]; length =:= inferred_ip_v4_length [ 16 ];
ip_id [ 16 ]; ip_id [ 16 ];
rf =:= uncompressed_value(1, 0) [ 1 ]; rf =:= uncompressed_value(1, 0) [ 1 ];
skipping to change at page 92, line 10 skipping to change at page 92, line 44
rtp_version =:= uncompressed_value(2, 2) [ 2 ]; rtp_version =:= uncompressed_value(2, 2) [ 2 ];
pad_bit [ 1 ]; pad_bit [ 1 ];
extension [ 1 ]; extension [ 1 ];
cc [ 4 ]; cc [ 4 ];
marker [ 1 ]; marker [ 1 ];
payload_type [ 7 ]; payload_type [ 7 ];
sequence_number [ 16 ]; sequence_number [ 16 ];
timestamp [ 32 ]; timestamp [ 32 ];
ssrc [ 32 ]; ssrc [ 32 ];
csrc_list [ VARIABLE ]; csrc_list [ VARIABLE ];
df =:= uncompressed_value(0,0) [ 0 ];
ip_id =:= uncompressed_value(0,0) [ 0 ];
} }
CONTROL { CONTROL {
ENFORCE(time_stride_value == time_stride.UVALUE); ENFORCE(time_stride.UVALUE == time_stride_value);
ENFORCE(ts_stride.UVALUE == ts_stride_value); ENFORCE(ts_stride.UVALUE == ts_stride_value);
ENFORCE(profile == PROFILE_RTP_0107); ENFORCE(profile == PROFILE_RTP_0107);
ip_id_behavior [ 2 ]; ip_id_behavior [ 2 ];
coverage_behavior [ 2 ]; coverage_behavior [ 2 ];
ts_stride [ 32 ]; ts_stride [ 32 ];
time_stride [ 32 ]; time_stride [ 32 ];
ts_scaled [ 32 ]; ts_scaled [ 32 ];
ts_offset =:= field_scaling(ts_stride.UVALUE, ts_scaled.UVALUE, ts_offset =:= field_scaling(ts_stride.UVALUE, ts_scaled.UVALUE,
timestamp.UVALUE) [ 32 ]; timestamp.UVALUE) [ 32 ];
} }
DEFAULT { DEFAULT {
ENFORCE(outer_ip_indicator == 0); ENFORCE(outer_ip_indicator == 0);
ENFORCE(repair_flag == 0);
tos_tc =:= static; tos_tc =:= static;
dest_addr =:= static; dest_addr =:= static;
ttl_hopl =:= static; ttl_hopl =:= static;
src_addr =:= static; src_addr =:= static;
df =:= static; df =:= static;
ip_id_behavior =:= static; ip_id_behavior =:= static;
flow_label =:= static; flow_label =:= static;
next_header =:= static; next_header =:= static;
src_port =:= static; src_port =:= static;
dst_port =:= static; dst_port =:= static;
checksum_coverage =:= irregular(16);
udp_checksum =:= irregular(16);
pad_bit =:= static; pad_bit =:= static;
extension =:= static; extension =:= static;
cc =:= static; cc =:= static;
// When marker not present in packets, it is assumed 0 // When marker not present in packets, it is assumed 0
marker =:= uncompressed_value(1, 0); marker =:= uncompressed_value(1, 0);
payload_type =:= static; payload_type =:= static;
sequence_number =:= static; sequence_number =:= static;
timestamp =:= static; timestamp =:= static;
ssrc =:= static; ssrc =:= static;
csrc_list =:= static; csrc_list =:= static;
skipping to change at page 93, line 4 skipping to change at page 93, line 36
extension =:= static; extension =:= static;
cc =:= static; cc =:= static;
// When marker not present in packets, it is assumed 0 // When marker not present in packets, it is assumed 0
marker =:= uncompressed_value(1, 0); marker =:= uncompressed_value(1, 0);
payload_type =:= static; payload_type =:= static;
sequence_number =:= static; sequence_number =:= static;
timestamp =:= static; timestamp =:= static;
ssrc =:= static; ssrc =:= static;
csrc_list =:= static; csrc_list =:= static;
} }
// Replacement for UOR-2-ext3 // Replacement for UOR-2-ext3
COMPRESSED co_common { COMPRESSED co_common {
ENFORCE(repair_flag == 0);
ENFORCE(outer_ip_flag == outer_ip_indicator.CVALUE); ENFORCE(outer_ip_flag == outer_ip_indicator.CVALUE);
ENFORCE(repair_flag == repair_indicator.CVALUE);
discriminator =:= '11111010' [ 8 ]; discriminator =:= '11111010' [ 8 ];
marker =:= irregular(1) [ 1 ]; marker =:= irregular(1) [ 1 ];
header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ]; header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ];
flags1_indicator =:= irregular(1) [ 1 ]; flags1_indicator =:= irregular(1) [ 1 ];
flags2_indicator =:= irregular(1) [ 1 ]; flags2_indicator =:= irregular(1) [ 1 ];
tsc_indicator =:= irregular(1) [ 1 ]; tsc_indicator =:= irregular(1) [ 1 ];
tss_indicator =:= irregular(1) [ 1 ]; tss_indicator =:= irregular(1) [ 1 ];
ip_id_indicator =:= irregular(1) [ 1 ]; ip_id_indicator =:= irregular(1) [ 1 ];
control_crc3 =:= control_crc3_encoding [ 3 ]; control_crc3 =:= control_crc3_encoding [ 3 ];
outer_ip_indicator : repair_indicator : ttl_hopl_indicator : outer_ip_indicator : ttl_hopl_indicator :
tos_tc_indicator : ip_id_behavior : reorder_ratio =:= tos_tc_indicator : ip_id_behavior : reorder_ratio =:=
profile_1_7_flags1_enc(flags1_indicator.CVALUE) [ 0, 8 ]; profile_1_7_flags1_enc(flags1_indicator.CVALUE) [ 0, 8 ];
list_indicator : tis_indicator : pt_indicator : pad_bit : list_indicator : tis_indicator : pt_indicator : pad_bit :
extension : df : coverage_behavior =:= extension : df : coverage_behavior =:=
profile_7_flags2_enc(flags2_indicator.CVALUE, profile_7_flags2_enc(flags2_indicator.CVALUE,
ip_version.UVALUE) [ 0, 8 ]; ip_version.UVALUE) [ 0, 8 ];
ip_id =:= optional_ip_id_lsb(ip_id_behavior.UVALUE,
ip_id_indicator.CVALUE) [ 0, 8, 16 ];
tos_tc =:= static_or_irreg(tos_tc_indicator.CVALUE, 8) [ 0, 8 ]; tos_tc =:= static_or_irreg(tos_tc_indicator.CVALUE, 8) [ 0, 8 ];
ttl_hopl =:= static_or_irreg(ttl_hopl_indicator.CVALUE, ttl_hopl =:= static_or_irreg(ttl_hopl_indicator.CVALUE,
ttl_hopl.ULENGTH) [ 0, 8 ]; ttl_hopl.ULENGTH) [ 0, 8 ];
payload_type =:= optional_pt(pt_indicator.CVALUE) [ 0, 8 ]; payload_type =:= pt_irr_or_static(pt_indicator.CVALUE) [ 0, 8 ];
sequence_number =:= sdvl_lsb(sequence_number.ULENGTH) [ 8, 16, 24 ]; sequence_number =:=
sdvl_sn_lsb(sequence_number.ULENGTH) [ VARIABLE ];
ip_id =:= ip_id_sequential_variable(ip_id_behavior.UVALUE,
ip_id_indicator.CVALUE) [ 0, 8, 16 ];
ts_scaled =:= variable_scaled_timestamp(tss_indicator.CVALUE, ts_scaled =:= variable_scaled_timestamp(tss_indicator.CVALUE,
tsc_indicator.CVALUE, ts_stride.UVALUE) [ VARIABLE ]; tsc_indicator.CVALUE, ts_stride.UVALUE) [ VARIABLE ];
timestamp =:= variable_unscaled_timestamp(tss_indicator.CVALUE, timestamp =:= variable_unscaled_timestamp(tss_indicator.CVALUE,
tsc_indicator.CVALUE) [ VARIABLE ]; tsc_indicator.CVALUE) [ VARIABLE ];
ts_stride =:= sdvl_or_static(tss_indicator.CVALUE) [ VARIABLE ]; ts_stride =:= sdvl_or_static(tss_indicator.CVALUE) [ VARIABLE ];
time_stride =:= sdvl_or_static(tis_indicator.CVALUE) [ VARIABLE ]; time_stride =:= sdvl_or_static(tis_indicator.CVALUE) [ VARIABLE ];
csrc_list =:= csrc_list =:=
csrc_list_presence(list_indicator.CVALUE, csrc_list_presence(list_indicator.CVALUE,
cc.UVALUE) [ VARIABLE ]; cc.UVALUE) [ VARIABLE ];
} }
// Context repair (IR-DYN replacement).
COMPRESSED co_repair {
ENFORCE(outer_ip_flag == outer_ip_indicator.CVALUE);
ENFORCE(repair_flag == repair_indicator.CVALUE);
discriminator =:= '11111011' [ 8 ];
marker =:= irregular(1) [ 1 ];
header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ];
flags1_indicator =:= irregular(1) [ 1 ];
flags2_indicator =:= irregular(1) [ 1 ];
timestamp_indicator =:= irregular(1) [ 1 ];
tss_indicator =:= irregular(1) [ 1 ];
ip_id_indicator =:= irregular(1) [ 1 ];
control_crc3 =:= control_crc3_encoding [ 3 ];
outer_ip_indicator : repair_indicator : ttl_hopl_indicator :
tos_tc_indicator : ip_id_behavior : reorder_ratio =:=
profile_1_7_flags1_enc(flags1_indicator.CVALUE) [ 0, 8 ];
list_indicator : tis_indicator : pt_indicator : pad_bit :
extension : df : coverage_behavior =:=
profile_7_flags2_enc(flags2_indicator.CVALUE,
ip_version.UVALUE) [ 0, 8 ];
ip_id =:= optional_ip_id_lsb(ip_id_behavior.UVALUE,
ip_id_indicator.CVALUE) [ 0, 8, 16 ];
tos_tc =:= static_or_irreg(tos_tc_indicator.CVALUE, 8) [ 0, 8 ];
ttl_hopl =:= static_or_irreg(ttl_hopl_indicator.CVALUE,
ttl_hopl.ULENGTH) [ 0, 8 ];
payload_type =:= optional_pt(pt_indicator.CVALUE) [ 0, 8 ];
sequence_number =:= irregular(16) [ 16 ];
timestamp =:=
irregular_or_nothing(timestamp_indicator.CVALUE) [ 0, 32 ];
ts_stride =:= sdvl_or_static(tss_indicator.CVALUE) [ VARIABLE ];
time_stride =:= sdvl_or_static(tis_indicator.CVALUE) [ VARIABLE ];
csrc_list =:= csrc_list_presence(list_indicator.CVALUE,
cc.UVALUE) [ VARIABLE ];
}
// UO-0 // UO-0
COMPRESSED pt_0_crc3 { COMPRESSED pt_0_crc3 {
discriminator =:= '0' [ 1 ]; discriminator =:= '0' [ 1 ];
msn =:= msn_lsb(4) [ 4 ]; msn =:= msn_lsb(4) [ 4 ];
header_crc =:= crc3(THIS.UVALUE, THIS.ULENGTH) [ 3 ]; header_crc =:= crc3(THIS.UVALUE, THIS.ULENGTH) [ 3 ];
timestamp =:= inferred_scaled_field [ 0 ]; timestamp =:= inferred_scaled_field [ 0 ];
ip_id =:= inferred_sequential_ip_id [ 0 ]; ip_id =:= inferred_sequential_ip_id [ 0 ];
} }
// New format, Type 0 with strong CRC and more SN bits // New format, Type 0 with strong CRC and more SN bits
COMPRESSED pt_0_crc7 { COMPRESSED pt_0_crc7 {
discriminator =:= '100' [ 3 ]; discriminator =:= '1000' [ 4 ];
msn =:= msn_lsb(6) [ 6 ]; msn =:= msn_lsb(5) [ 5 ];
header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ]; header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ];
timestamp =:= inferred_scaled_field [ 0 ]; timestamp =:= inferred_scaled_field [ 0 ];
ip_id =:= inferred_sequential_ip_id [ 0 ]; ip_id =:= inferred_sequential_ip_id [ 0 ];
} }
// UO-1 replacement // UO-1 replacement
COMPRESSED pt_1_rnd { COMPRESSED pt_1_rnd {
ENFORCE(ts_stride.UVALUE != 0);
ENFORCE((ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_RANDOM) || ENFORCE((ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_RANDOM) ||
(ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_ZERO)); (ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_ZERO));
discriminator =:= '101' [ 3 ]; discriminator =:= '101' [ 3 ];
msn =:= msn_lsb(5) [ 5 ]; msn =:= msn_lsb(4) [ 4 ];
marker =:= irregular(1) [ 1 ]; marker =:= irregular(1) [ 1 ];
ts_scaled =:= scaled_ts_lsb(time_stride.UVALUE, 4) [ 4 ]; ts_scaled =:= scaled_ts_lsb(time_stride.UVALUE, 5) [ 5 ];
header_crc =:= crc3(THIS.UVALUE, THIS.ULENGTH) [ 3 ]; header_crc =:= crc3(THIS.UVALUE, THIS.ULENGTH) [ 3 ];
} }
// UO-1-ID replacement // UO-1-ID replacement
COMPRESSED pt_1_seq_id { COMPRESSED pt_1_seq_id {
ENFORCE((ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_SEQUENTIAL) || ENFORCE((ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_SEQUENTIAL) ||
(ip_id_behavior.UVALUE == (ip_id_behavior.UVALUE ==
IP_ID_BEHAVIOR_SEQUENTIAL_SWAPPED)); IP_ID_BEHAVIOR_SEQUENTIAL_SWAPPED));
discriminator =:= '1010' [ 4 ]; discriminator =:= '1001' [ 4 ];
header_crc =:= crc3(THIS.UVALUE, THIS.ULENGTH) [ 3 ];
msn =:= msn_lsb(5) [ 5 ];
ip_id =:= ip_id_lsb(ip_id_behavior.UVALUE, 4) [ 4 ]; ip_id =:= ip_id_lsb(ip_id_behavior.UVALUE, 4) [ 4 ];
msn =:= msn_lsb(5) [ 5 ];
header_crc =:= crc3(THIS.UVALUE, THIS.ULENGTH) [ 3 ];
timestamp =:= inferred_scaled_field [ 0 ]; timestamp =:= inferred_scaled_field [ 0 ];
} }
// UO-1-TS replacement // UO-1-TS replacement
COMPRESSED pt_1_seq_ts { COMPRESSED pt_1_seq_ts {
ENFORCE(ts_stride.UVALUE != 0); ENFORCE(ts_stride.UVALUE != 0);
ENFORCE((ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_SEQUENTIAL) || ENFORCE((ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_SEQUENTIAL) ||
(ip_id_behavior.UVALUE == (ip_id_behavior.UVALUE ==
IP_ID_BEHAVIOR_SEQUENTIAL_SWAPPED)); IP_ID_BEHAVIOR_SEQUENTIAL_SWAPPED));
discriminator =:= '1011' [ 4 ]; discriminator =:= '101' [ 3 ];
marker =:= irregular(1) [ 1 ]; marker =:= irregular(1) [ 1 ];
header_crc =:= crc3(THIS.UVALUE, THIS.ULENGTH) [ 3 ];
msn =:= msn_lsb(4) [ 4 ]; msn =:= msn_lsb(4) [ 4 ];
ts_scaled =:= scaled_ts_lsb(time_stride.UVALUE, 4) [ 4 ]; ts_scaled =:= scaled_ts_lsb(time_stride.UVALUE, 5) [ 5 ];
header_crc =:= crc3(THIS.UVALUE, THIS.ULENGTH) [ 3 ];
} }
// UOR-2 replacement // UOR-2 replacement
COMPRESSED pt_2_rnd { COMPRESSED pt_2_rnd {
ENFORCE(ts_stride.UVALUE != 0); ENFORCE(ts_stride.UVALUE != 0);
ENFORCE((ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_RANDOM) || ENFORCE((ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_RANDOM) ||
(ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_ZERO)); (ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_ZERO));
discriminator =:= '110' [ 3 ]; discriminator =:= '110' [ 3 ];
msn =:= msn_lsb(7) [ 7 ]; msn =:= msn_lsb(7) [ 7 ];
ts_scaled =:= scaled_ts_lsb(time_stride.UVALUE, 6) [ 6 ]; ts_scaled =:= scaled_ts_lsb(time_stride.UVALUE, 6) [ 6 ];
skipping to change at page 96, line 46 skipping to change at page 96, line 42
ts_scaled =:= scaled_ts_lsb(time_stride.UVALUE, 5) [ 5 ]; ts_scaled =:= scaled_ts_lsb(time_stride.UVALUE, 5) [ 5 ];
marker =:= irregular(1) [ 1 ]; marker =:= irregular(1) [ 1 ];
header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ]; header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ];
} }
} }
//////////////////////////////////////////// ////////////////////////////////////////////
// UDP-lite profile // UDP-lite profile
//////////////////////////////////////////// ////////////////////////////////////////////
udplite_baseheader(profile, outer_ip_flag, repair_flag) udplite_baseheader(profile, outer_ip_flag)
{ {
UNCOMPRESSED v4 { UNCOMPRESSED v4 {
outer_headers =:= baseheader_outer_headers [ VARIABLE ]; outer_headers =:= baseheader_outer_headers [ VARIABLE ];
ip_version =:= uncompressed_value(4, 4) [ 4 ]; ip_version =:= uncompressed_value(4, 4) [ 4 ];
header_length =:= uncompressed_value(4, 5) [ 4 ]; header_length =:= uncompressed_value(4, 5) [ 4 ];
tos_tc [ 8 ]; tos_tc [ 8 ];
length =:= inferred_ip_v4_length [ 16 ]; length =:= inferred_ip_v4_length [ 16 ];
ip_id [ 16 ]; ip_id [ 16 ];
rf =:= uncompressed_value(1, 0) [ 1 ]; rf =:= uncompressed_value(1, 0) [ 1 ];
df [ 1 ]; df [ 1 ];
skipping to change at page 97, line 39 skipping to change at page 97, line 35
payload_length =:= inferred_ip_v6_length [ 16 ]; payload_length =:= inferred_ip_v6_length [ 16 ];
next_header [ 8 ]; next_header [ 8 ];
ttl_hopl [ 8 ]; ttl_hopl [ 8 ];
src_addr [ 128 ]; src_addr [ 128 ];
dest_addr [ 128 ]; dest_addr [ 128 ];
extension_headers =:= baseheader_extension_headers [ VARIABLE ]; extension_headers =:= baseheader_extension_headers [ VARIABLE ];
src_port [ 16 ]; src_port [ 16 ];
dst_port [ 16 ]; dst_port [ 16 ];
checksum_coverage [ 16 ]; checksum_coverage [ 16 ];
udp_checksum [ 16 ]; udp_checksum [ 16 ];
df =:= uncompressed_value(0,0) [ 0 ];
ip_id =:= uncompressed_value(0,0) [ 0 ];
} }
CONTROL { CONTROL {
ENFORCE(profile == PROFILE_UDPLITE_0108); ENFORCE(profile == PROFILE_UDPLITE_0108);
ip_id_behavior [ 2 ]; ip_id_behavior [ 2 ];
coverage_behavior [ 2 ]; coverage_behavior [ 2 ];
} }
DEFAULT { DEFAULT {
ENFORCE(outer_ip_indicator == 0); ENFORCE(outer_ip_indicator == 0);
ENFORCE(repair_flag == 0);
tos_tc =:= static; tos_tc =:= static;
dest_addr =:= static; dest_addr =:= static;
ttl_hopl =:= static; ttl_hopl =:= static;
src_addr =:= static; src_addr =:= static;
df =:= static; df =:= static;
ip_id_behavior =:= static; ip_id_behavior =:= static;
flow_label =:= static; flow_label =:= static;
next_header =:= static; next_header =:= static;
src_port =:= static; src_port =:= static;
dst_port =:= static; dst_port =:= static;
checksum_coverage =:= irregular(16);
udp_checksum =:= irregular(16);
} }
// Replacement for UOR-2-ext3 // Replacement for UOR-2-ext3
COMPRESSED co_common { COMPRESSED co_common {
ENFORCE(repair_flag == 0);
ENFORCE(outer_ip_flag == outer_ip_indicator.CVALUE); ENFORCE(outer_ip_flag == outer_ip_indicator.CVALUE);
ENFORCE(repair_flag == repair_indicator.CVALUE);
discriminator =:= '11111010' [ 8 ]; discriminator =:= '11111010' [ 8 ];
reorder_ratio =:= reorder_choice [ 2 ];
ip_id_indicator =:= irregular(1) [ 1 ]; ip_id_indicator =:= irregular(1) [ 1 ];
header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ]; header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ];
flags_indicator =:= irregular(1) [ 1 ]; flags_indicator =:= irregular(1) [ 1 ];
ttl_hopl_indicator =:= irregular(1) [ 1 ]; ttl_hopl_indicator =:= irregular(1) [ 1 ];
tos_tc_indicator =:= irregular(1) [ 1 ]; tos_tc_indicator =:= irregular(1) [ 1 ];
reorder_ratio =:= reorder_choice [ 2 ];
control_crc3 =:= control_crc3_encoding [ 3 ]; control_crc3 =:= control_crc3_encoding [ 3 ];
outer_ip_indicator : repair_indicator : df : outer_ip_indicator : df : ip_id_behavior :
ip_id_behavior : coverage_behavior =:= coverage_behavior =:=
profile_8_flags_enc(flags_indicator.CVALUE) [ 0, 8 ]; profile_8_flags_enc(flags_indicator.CVALUE,
ip_id =:= optional_ip_id_lsb(ip_id_behavior.UVALUE, ip_version.UVALUE) [ 0, 8 ];
ip_id_indicator.CVALUE) [ 0, 8, 16 ];
tos_tc =:= static_or_irreg(tos_tc_indicator.CVALUE, 8) [ 0, 8 ]; tos_tc =:= static_or_irreg(tos_tc_indicator.CVALUE, 8) [ 0, 8 ];
ttl_hopl =:= static_or_irreg(ttl_hopl_indicator.CVALUE, ttl_hopl =:= static_or_irreg(ttl_hopl_indicator.CVALUE,
ttl_hopl.ULENGTH) [ 0, 8 ]; ttl_hopl.ULENGTH) [ 0, 8 ];
msn =:= msn_lsb(8) [ 8 ]; msn =:= msn_lsb(8) [ 8 ];
} ip_id =:= ip_id_sequential_variable(ip_id_behavior.UVALUE,
// Context repair (IR-DYN replacement).
COMPRESSED co_repair {
ENFORCE(outer_ip_flag == outer_ip_indicator.CVALUE);
ENFORCE(repair_flag == repair_indicator.CVALUE);
discriminator =:= '11111011' [ 8 ];
reorder_ratio =:= reorder_choice [ 2 ];
ip_id_indicator =:= irregular(1) [ 1 ];
header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ];
flags_indicator =:= irregular(1) [ 1 ];
ttl_hopl_indicator =:= irregular(1) [ 1 ];
tos_tc_indicator =:= irregular(1) [ 1 ];
control_crc3 =:= control_crc3_encoding [ 3 ];
outer_ip_indicator : repair_indicator : df :
ip_id_behavior : coverage_behavior =:=
profile_8_flags_enc(flags_indicator.CVALUE) [ 0, 8 ];
msn =:= msn_lsb(16) [ 8 ];
ip_id =:= optional_ip_id_lsb(ip_id_behavior.UVALUE,
ip_id_indicator.CVALUE) [ 0, 8, 16 ]; ip_id_indicator.CVALUE) [ 0, 8, 16 ];
tos_tc =:= static_or_irreg(tos_tc_indicator.CVALUE, 8) [ 0, 8 ];
ttl_hopl =:= static_or_irreg(ttl_hopl_indicator.CVALUE,
ttl_hopl.ULENGTH) [ 0, 8 ];
} }
// UO-0 // UO-0
COMPRESSED pt_0_crc3 { COMPRESSED pt_0_crc3 {
discriminator =:= '0' [ 1 ]; discriminator =:= '0' [ 1 ];
msn =:= msn_lsb(4) [ 4 ]; msn =:= msn_lsb(4) [ 4 ];
header_crc =:= crc3(THIS.UVALUE, THIS.ULENGTH) [ 3 ]; header_crc =:= crc3(THIS.UVALUE, THIS.ULENGTH) [ 3 ];
ip_id =:= inferred_sequential_ip_id [ 0 ]; ip_id =:= inferred_sequential_ip_id [ 0 ];
} }
skipping to change at page 100, line 20 skipping to change at page 99, line 39
header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ]; header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ];
msn =:= msn_lsb(8) [ 8 ]; msn =:= msn_lsb(8) [ 8 ];
} }
} }
6.9. Feedback Formats and Options 6.9. Feedback Formats and Options
6.9.1. Feedback Formats 6.9.1. Feedback Formats
This section describes the feedback format for ROHCv2 profiles, using This section describes the feedback format for ROHCv2 profiles, using
the formats described in section 5.2.3 of the formats described in section 5.2.3 of [RFC4995].
[I-D.ietf-rohc-rfc3095bis-framework].
All feedback formats carry a field labelled MSN, which contain LSBs The Acknowledgment Number field of the feedback formats contains the
of the MSN described in Section 6.2.1. The sequence number to use is least significant bits of the MSN (see Section 6.3.1) that
the MSN corresponding to the last header that was successfully CRC-8 corresponds to the reference header that is being acknowledged. A
validated or CRC verified. reference header is a header that has been successfully CRC-8
validated or CRC verified. If there is no reference header
available, the feedback MUST carry an ACKNUMBER-NOT-VALID option.
FEEDBACK-1 FEEDBACK-1
0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
+---+---+---+---+---+---+---+---+ +---+---+---+---+---+---+---+---+
| MSN | | Acknowledgment Number |
+---+---+---+---+---+---+---+---+ +---+---+---+---+---+---+---+---+
MSN: The lsb-encoded master sequence number. Acknowledgment Number: The eight least significant bits of the
MSN.
A FEEDBACK-1 is an ACK. In order to send a NACK or a STATIC-NACK, A FEEDBACK-1 is an ACK. In order to send a NACK or a STATIC-NACK,
FEEDBACK-2 must be used. FEEDBACK-2 must be used.
FEEDBACK-2 FEEDBACK-2
0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
+---+---+---+---+---+---+---+---+ +---+---+---+---+---+---+---+---+
|Acktype| MSN | |Acktype| Acknowledgment Number |
+---+---+---+---+---+---+---+---+ +---+---+---+---+---+---+---+---+
| MSN | | Acknowledgment Number |
+---+---+---+---+---+---+---+---+ +---+---+---+---+---+---+---+---+
| CRC | | CRC |
+---+---+---+---+---+---+---+---+ +---+---+---+---+---+---+---+---+
/ Feedback options / / Feedback options /
+---+---+---+---+---+---+---+---+ +---+---+---+---+---+---+---+---+
Acktype: Acktype:
0 = ACK 0 = ACK
1 = NACK 1 = NACK
2 = STATIC-NACK 2 = STATIC-NACK
3 is reserved (MUST NOT be used for parsability) 3 is reserved (MUST NOT be used for parsability)
MSN: The lsb-encoded master sequence number. Acknowledgment Number: The least significant bits of the MSN.
CRC: 8-bit CRC computed over the entire feedback payload including CRC: 8-bit CRC computed over the entire feedback payload including
any CID fields but excluding the packet type, the 'Size' field and any CID fields but excluding the packet type, the 'Size' field and
the 'Code' octet, using the polynomial defined in the 'Code' octet, using the polynomial defined in [RFC4995],
[I-D.ietf-rohc-rfc3095bis-framework]. If the CID is given with an Section 5.3.1.1. If the CID is given with an Add-CID octet, the
Add-CID octet, the Add-CID octet immediately precedes the Add-CID octet immediately precedes the FEEDBACK-1 or FEEDBACK-2
FEEDBACK-1 or FEEDBACK-2 format. For purposes of computing the format. For purposes of computing the CRC, the CRC field is zero.
CRC, the CRC field is zero.
Feedback options: A variable number of feedback options, see Feedback options: A variable number of feedback options, see
Section 6.9.2. Options may appear in any order. Section 6.9.2. Options may appear in any order.
A FEEDBACK-2 of type NACK or STATIC-NACK is always implicitely an A FEEDBACK-2 of type NACK or STATIC-NACK is always implicitely an
acknowlegement for a successfully decompressed packet, which packet acknowlegement for a successfully decompressed packet, which
corresponds to the MSN of the feedback element, unless the MSN-NOT- corresponds to a packet whose LSBs match the Acknowledgment Number of
VALID option Section 6.9.2.2 appears in the feedback element. the feedback element, unless the ACKNUMBER-NOT-VALID option
Section 6.9.2.2 appears in the feedback element.
The FEEDBACK-2 format always carry a CRC and is thus more robust than The FEEDBACK-2 format always carry a CRC and is thus more robust than
the FEEDBACK-1 format. When receiving FEEDBACK-2, the compressor the FEEDBACK-1 format. When receiving FEEDBACK-2, the compressor
MUST verify the information by computing the CRC and comparing the MUST verify the information by computing the CRC and comparing the
result with the CRC carried in the feedback format. If the two are result with the CRC carried in the feedback format. If the two are
not identical, the feedback element MUST be discarded. not identical, the feedback element MUST be discarded.
6.9.2. Feedback Options 6.9.2. Feedback Options
A feedback option has variable length and the following general A feedback option has variable length and the following general
format: format:
0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
+---+---+---+---+---+---+---+---+ +---+---+---+---+---+---+---+---+
| Opt Type | Opt Len | | Opt Type | Opt Len |
+---+---+---+---+---+---+---+---+ +---+---+---+---+---+---+---+---+
/ option data / Opt Length (octets) / option data / Opt Length (octets)
+---+---+---+---+---+---+---+---+ +---+---+---+---+---+---+---+---+
The CRC option contains an 8-bit CRC computed over the entire
feedback payload including any CID fields but excluding the packet
type, the 'Size' field and the 'Code' octet, using the polynomial of
[I-D.ietf-rohc-rfc3095bis-framework], section 5.3.1.1.
6.9.2.1. The REJECT option 6.9.2.1. The REJECT option
The REJECT option informs the compressor that the decompressor does The REJECT option informs the compressor that the decompressor does
not have sufficient resources to handle the flow. not have sufficient resources to handle the flow.
+---+---+---+---+---+---+---+---+ +---+---+---+---+---+---+---+---+
| Opt Type = 2 | Opt Len = 0 | | Opt Type = 2 | Opt Len = 0 |
+---+---+---+---+---+---+---+---+ +---+---+---+---+---+---+---+---+
When receiving a REJECT option, the compressor MUST stop compressing When receiving a REJECT option, the compressor MUST stop compressing
the packet flow, and SHOULD refrain from attempting to increase the the packet flow, and SHOULD refrain from attempting to increase the
number of compressed packet flows for some time. Any FEEDBACK packet number of compressed packet flows for some time. The REJECT option
carrying a REJECT option MUST also carry a CRC option. The REJECT MUST NOT appear more than once in the FEEDBACK-2 format, otherwise
option MUST NOT appear more than once in the FEEDBACK-2 format, the compressor MUST discard the entire feedback element.
otherwise the decompressor MUST discard the entire feedback element.
6.9.2.2. The MSN-NOT-VALID option 6.9.2.2. The ACKNUMBER-NOT-VALID option
The MSN-NOT-VALID option indicates that the MSN of the feedback is The ACKNUMBER-NOT-VALID option indicates that the Acknowledgment
not valid. Number field of the feedback is not valid.
+---+---+---+---+---+---+---+---+ +---+---+---+---+---+---+---+---+
| Opt Type = 3 | Opt Len = 0 | | Opt Type = 3 | Opt Len = 0 |
+---+---+---+---+---+---+---+---+ +---+---+---+---+---+---+---+---+
A compressor MUST NOT use the MSN of the feedback to find the A compressor MUST NOT use the Acknowledgment Number of the feedback
corresponding sent header when this option is present. Consequently, to find the corresponding sent header when this option is present.
a NACK or a STATIC-NACK feedback type sent with the MSN-NOT-VALID
option is equivalent to a STATIC-NACK with respect to the type of
context repair requested by the decompressor.
The MSN-NOT-VALID option MUST NOT appear more than once in the When this option is used, the Acknowledgment Number field of the
FEEDBACK-2 format is set to zero. Consequently, a NACK or a STATIC-
NACK feedback type sent with the ACKNUMBER-NOT-VALID option is
equivalent to a STATIC-NACK with respect to the type of context
repair requested by the decompressor.
The ACKNUMBER-NOT-VALID option MUST NOT appear more than once in the
FEEDBACK-2 format and MUST NOT appear in the same feedback element as FEEDBACK-2 format and MUST NOT appear in the same feedback element as
the MSN option, otherwise the decompressor MUST discard the entire the MSN option, otherwise the compressor MUST discard the entire
feedback element. feedback element.
6.9.2.3. The MSN option 6.9.2.3. The CONTEXT_MEMORY Feedback Option
The MSN option provides 8 additional bits of MSN.
+---+---+---+---+---+---+---+---+
| Opt Type = 4 | Opt Len = 1 |
+---+---+---+---+---+---+---+---+
| MSN |
+---+---+---+---+---+---+---+---+
the bits in the MSN option are concatenated with the MSN bits in the
FEEDBACK-2 format, with the bits in the FEEDBACK-2 format being the
most significant bits. The MSN option MAY appear more than once in
the FEEDBACK-2 format, in which case the MSN is given by
concatenating the MSN fields of each occurance of the MSN option.
The MSN option MUST NOT appear in the same feedback element as the
MSN-NOT-VALID option, otherwise the decompressor MUST discard the
entire feedback element.
6.9.2.4. The CONTEXT_MEMORY Feedback Option
The CONTEXT_MEMORY option informs the compressor that the The CONTEXT_MEMORY option informs the compressor that the
decompressor does not have sufficient memory resources to handle the decompressor does not have sufficient memory resources to handle the
context of the packet flow, as the flow is currently compressed. context of the packet flow, as the flow is currently compressed.
0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
+---+---+---+---+---+---+---+---+ +---+---+---+---+---+---+---+---+
| Opt Type = 9 | Opt Len = 0 | | Opt Type = 9 | Opt Len = 0 |
+---+---+---+---+---+---+---+---+ +---+---+---+---+---+---+---+---+
When receiving a CONTEXT_MEMORY option, the compressor SHOULD take When receiving a CONTEXT_MEMORY option, the compressor SHOULD take
actions to compress the packet flow in a way that requires less actions to compress the packet flow in a way that requires less
decompressor memory resources, or stop compressing the packet flow. decompressor memory resources, or stop compressing the packet flow.
The CONTEXT_MEMORY option MUST NOT appear more than once in the The CONTEXT_MEMORY option MUST NOT appear more than once in the
FEEDBACK-2 format, otherwise the decompressor MUST discard the entire FEEDBACK-2 format, otherwise the compressor MUST discard the entire
feedback element. feedback element.
6.9.2.5. The CONTROL_FIELDS_UPDATE Feedback Option 6.9.2.4. The CLOCK_RESOLUTION Feedback Option
The CONTROL_FIELDS_UPDATE option informs the compressor that the The CLOCK_RESOLUTION option informs the compressor of the clock
decompressor considers its set of control fields to be invalid, or resolution of the decompressor. It also informs whether the
that those have not been established. decompressor supports timer-based compression of the RTP TS timestamp
(see Section 6.6.9) or not. The CLOCK_RESOLUTION option is
applicable per channel, i.e. it applies to any context associated
with a profile for which the option is relevant between one
compressor and decompressor pair.
0 1 2 3 4 5 6 7
+---+---+---+---+---+---+---+---+ +---+---+---+---+---+---+---+---+
| Opt Type = 10 | Opt Len = 0 | | Opt Type = 10 | Opt Len = 1 |
+---+---+---+---+---+---+---+---+
| clock resolution (ms) |
+---+---+---+---+---+---+---+---+ +---+---+---+---+---+---+---+---+
When receiving the CONTROL_FIELDS_UPDATE option in a feedback The smallest clock resolution which can be indicated is 1
element, the compressor SHOULD select a packet format that can update millisecond. The value zero has a special meaning: it indicates that
the control fields covered by the control_crc3 encoding method the decompressor cannot do timer-based compression of the RTP
Section 6.6.11. Timestamp. The CLOCK_RESOLUTION option MUST NOT appear more than
once in the FEEDBACK-2 format, otherwise the compressor MUST discard
The CONTROL_FIELDS_UPDATE option MUST NOT appear more than once in the entire feedback element.
the FEEDBACK-2 format, otherwise the decompressor MUST discard the
entire feedback element.
6.9.2.6. Unknown option types 6.9.2.5. Unknown option types
If an option type unknown to the compressor is encountered, it must If an option type other than those defined in this document is
continue parsing the rest of the FEEDBACK packet, which is possible encountered, the compressor MUST discard the entire feedback element.
since the length of the option is explicit, but MUST otherwise ignore
the unknown option.
7. Security Considerations 7. Security Considerations
Because encryption eliminates the redundancy that header compression
schemes try to exploit, there is some inducement to forego encryption
of headers in order to enable operation over low-bandwidth links.
However, for those cases where encryption of data (and not headers)
is sufficient, RTP does specify an alternative encryption method in
which only the RTP payload is encrypted and the headers are left in
the clear. That would still allow header compression to be applied.
ROHC compression is transparent with regard to the RTP Sequence
Number and RTP Timestamp fields, so the values of those fields can be
used as the basis of payload encryption schemes (e.g., for
computation of an initialization vector).
A malfunctioning or malicious header compressor could cause the A malfunctioning or malicious header compressor could cause the
header decompressor to reconstitute packets that do not match the header decompressor to reconstitute packets that do not match the
original packets but still have valid IP, UDP and RTP headers and original packets but still have valid IP, UDP and RTP headers and
possibly also valid UDP checksums. Such corruption may be detected possibly also valid UDP checksums. Such corruption may be detected
with end-to-end authentication and integrity mechanisms which will with end-to-end authentication and integrity mechanisms which will
not be affected by the compression. Moreover, this header not be affected by the compression. Moreover, this header
compression scheme uses an internal checksum for verification of compression scheme uses an internal checksum for verification of
reconstructed headers. This reduces the probability of producing reconstructed headers. This reduces the probability of producing
decompressed headers not matching the original ones without this decompressed headers not matching the original ones without this
being noticed. being noticed.
Denial-of-service attacks are possible if an intruder can introduce Denial-of-service attacks are possible if an intruder can introduce
(for example) bogus IR, IR-PD or FEEDBACK packets onto the link and (for example) bogus IR or FEEDBACK packets onto the link and thereby
thereby cause compression efficiency to be reduced. However, an cause compression efficiency to be reduced. However, an intruder
intruder having the ability to inject arbitrary packets at the link having the ability to inject arbitrary packets at the link layer in
layer in this manner raises additional security issues that dwarf this manner raises additional security issues that dwarf those
those related to the use of header compression. related to the use of header compression.
8. IANA Considerations 8. IANA Considerations
The following ROHC profile identifiers have been reserved by the IANA The following ROHC profile identifiers have been reserved by the IANA
for the profiles defined in this document: for the profiles defined in this document:
Identifier Profile Identifier Profile
---------- ------- ---------- -------
0x0101 ROHCv2 RTP 0x0101 ROHCv2 RTP
0x0102 ROHCv2 UDP 0x0102 ROHCv2 UDP
0x0103 ROHCv2 ESP 0x0103 ROHCv2 ESP
0x0104 ROHCv2 IP 0x0104 ROHCv2 IP
0x0107 ROHCv2 RTP/UDP-Lite 0x0107 ROHCv2 RTP/UDP-Lite
0x0108 ROHCv2 UDP-Lite 0x0108 ROHCv2 UDP-Lite
<# Editor's Note: To be removed before publication #> <# Editor's Note: To be removed before publication #>
skipping to change at page 105, line 40 skipping to change at page 104, line 26
0xnn02 Reserved 0xnn02 Reserved
0x0003 ROHC ESP RFC 3095 0x0003 ROHC ESP RFC 3095
0x0103 ROHCv2 ESP [RFCXXXX (this)] 0x0103 ROHCv2 ESP [RFCXXXX (this)]
0xnn03 Reserved 0xnn03 Reserved
0x0004 ROHC IP RFC 3843 0x0004 ROHC IP RFC 3843
0x0104 ROHCv2 IP [RFCXXXX (this)] 0x0104 ROHCv2 IP [RFCXXXX (this)]
0xnn04 Reserved 0xnn04 Reserved
0x0005 ROHC LLA RFC 4362 0x0005 ROHC LLA RFC 4362
0x0105 ROHC LLA with R-mode RFC 3408 0x0105 ROHC LLA with R-mode RFC 3408
0xnn05 Reserved 0xnn05 Reserved
0xnn06 To be Assigned by IANA 0x0006 ROHC TCP RFC4996
0xnn06 Reserved
0x0007 ROHC RTP/UDP-Lite RFC 4019 0x0007 ROHC RTP/UDP-L