draft-ietf-rohc-rfc3095bis-rohcv2-profiles-04.txt   draft-ietf-rohc-rfc3095bis-rohcv2-profiles-05.txt 
Robust Header Compression G. Pelletier Robust Header Compression G. Pelletier
Internet-Draft K. Sandlund Internet-Draft K. Sandlund
Intended status: Standards Track Ericsson Intended status: Standards Track Ericsson
Expires: July 14, 2008 January 11, 2008 Expires: August 1, 2008 January 29, 2008
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-04 draft-ietf-rohc-rfc3095bis-rohcv2-profiles-05
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 July 14, 2008. This Internet-Draft will expire on August 1, 2008.
Copyright Notice Copyright Notice
Copyright (C) The IETF Trust (2008). Copyright (C) The IETF Trust (2008).
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
skipping to change at page 2, line 13 skipping to change at page 2, line 13
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 header formats, using the ROHC formal notation.
Table of Contents Table of Contents
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4
2. Terminology . . . . . . . . . . . . . . . . . . . . . . . . . 4 2. Terminology . . . . . . . . . . . . . . . . . . . . . . . . . 4
3. Acronyms . . . . . . . . . . . . . . . . . . . . . . . . . . 6 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. Improvements of ROHCv2 over RFC3095 profiles . . . . . . 8 4.2. Improvements of ROHCv2 over RFC3095 profiles . . . . . . 8
4.3. Operational Characteristics of ROHCv2 Profiles . . . . . 10 4.3. Operational Characteristics of ROHCv2 Profiles . . . . . 10
skipping to change at page 2, line 47 skipping to change at page 2, line 47
6.3. Control Fields . . . . . . . . . . . . . . . . . . . . . 20 6.3. Control Fields . . . . . . . . . . . . . . . . . . . . . 20
6.3.1. Master Sequence Number (MSN) . . . . . . . . . . . . 21 6.3.1. Master Sequence Number (MSN) . . . . . . . . . . . . 21
6.3.2. Reordering Ratio . . . . . . . . . . . . . . . . . . 21 6.3.2. Reordering Ratio . . . . . . . . . . . . . . . . . . 21
6.3.3. IP-ID behavior . . . . . . . . . . . . . . . . . . . 22 6.3.3. IP-ID behavior . . . . . . . . . . . . . . . . . . . 22
6.3.4. UDP-Lite Coverage Behavior . . . . . . . . . . . . . 22 6.3.4. UDP-Lite Coverage Behavior . . . . . . . . . . . . . 22
6.3.5. Timestamp Stride . . . . . . . . . . . . . . . . . . 22 6.3.5. Timestamp Stride . . . . . . . . . . . . . . . . . . 22
6.3.6. Time Stride . . . . . . . . . . . . . . . . . . . . . 22 6.3.6. Time Stride . . . . . . . . . . . . . . . . . . . . . 22
6.3.7. CRC-3 for Control Fields . . . . . . . . . . . . . . 22 6.3.7. CRC-3 for Control Fields . . . . . . . . . . . . . . 22
6.4. Reconstruction and Verification . . . . . . . . . . . . . 23 6.4. Reconstruction and Verification . . . . . . . . . . . . . 23
6.5. Compressed Header Chains . . . . . . . . . . . . . . . . 23 6.5. Compressed Header Chains . . . . . . . . . . . . . . . . 23
6.6. Packet Formats and Encoding Methods . . . . . . . . . . . 25 6.6. Header Formats and Encoding Methods . . . . . . . . . . . 25
6.6.1. baseheader_extension_headers . . . . . . . . . . . . 25 6.6.1. baseheader_extension_headers . . . . . . . . . . . . 25
6.6.2. baseheader_outer_headers . . . . . . . . . . . . . . 26 6.6.2. baseheader_outer_headers . . . . . . . . . . . . . . 26
6.6.3. inferred_udp_length . . . . . . . . . . . . . . . . . 26 6.6.3. inferred_udp_length . . . . . . . . . . . . . . . . . 26
6.6.4. inferred_ip_v4_header_checksum . . . . . . . . . . . 26 6.6.4. inferred_ip_v4_header_checksum . . . . . . . . . . . 26
6.6.5. inferred_mine_header_checksum . . . . . . . . . . . . 27 6.6.5. inferred_mine_header_checksum . . . . . . . . . . . . 27
6.6.6. inferred_ip_v4_length . . . . . . . . . . . . . . . . 27 6.6.6. inferred_ip_v4_length . . . . . . . . . . . . . . . . 28
6.6.7. inferred_ip_v6_length . . . . . . . . . . . . . . . . 28 6.6.7. inferred_ip_v6_length . . . . . . . . . . . . . . . . 28
6.6.8. Scaled RTP Timestamp Compression . . . . . . . . . . 28 6.6.8. Scaled RTP Timestamp Compression . . . . . . . . . . 28
6.6.9. timer_based_lsb . . . . . . . . . . . . . . . . . . . 30 6.6.9. timer_based_lsb . . . . . . . . . . . . . . . . . . . 30
6.6.10. inferred_scaled_field . . . . . . . . . . . . . . . . 31 6.6.10. inferred_scaled_field . . . . . . . . . . . . . . . . 31
6.6.11. control_crc3_encoding . . . . . . . . . . . . . . . . 31 6.6.11. control_crc3_encoding . . . . . . . . . . . . . . . . 32
6.6.12. inferred_sequential_ip_id . . . . . . . . . . . . . . 32 6.6.12. inferred_sequential_ip_id . . . . . . . . . . . . . . 33
6.6.13. list_csrc(cc_value) . . . . . . . . . . . . . . . . . 33 6.6.13. list_csrc(cc_value) . . . . . . . . . . . . . . . . . 33
6.7. Encoding Methods With External Parameters as Arguments . 37 6.7. Encoding Methods With External Parameters as Arguments . 37
6.8. Packet Formats . . . . . . . . . . . . . . . . . . . . . 39 6.8. Header Formats . . . . . . . . . . . . . . . . . . . . . 39
6.8.1. Initialization and Refresh Packet (IR) . . . . . . . 39 6.8.1. Initialization and Refresh Header Format (IR) . . . . 39
6.8.2. Compressed Packet Formats (CO) . . . . . . . . . . . 41 6.8.2. Compressed Header Formats (CO) . . . . . . . . . . . 40
6.9. Feedback Formats and Options . . . . . . . . . . . . . . 99 6.9. Feedback Formats and Options . . . . . . . . . . . . . . 99
6.9.1. Feedback Formats . . . . . . . . . . . . . . . . . . 99 6.9.1. Feedback Formats . . . . . . . . . . . . . . . . . . 99
6.9.2. Feedback Options . . . . . . . . . . . . . . . . . . 101 6.9.2. Feedback Options . . . . . . . . . . . . . . . . . . 101
7. Security Considerations . . . . . . . . . . . . . . . . . . . 103 7. Security Considerations . . . . . . . . . . . . . . . . . . . 103
8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 103 8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 103
9. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 104 9. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 104
10. References . . . . . . . . . . . . . . . . . . . . . . . . . 104 10. References . . . . . . . . . . . . . . . . . . . . . . . . . 105
10.1. Normative References . . . . . . . . . . . . . . . . . . 104 10.1. Normative References . . . . . . . . . . . . . . . . . . 105
10.2. Informative References . . . . . . . . . . . . . . . . . 105 10.2. Informative References . . . . . . . . . . . . . . . . . 106
Appendix A. Detailed classification of header fields . . . . . 106 Appendix A. Detailed classification of header fields . . . . . 106
Appendix A.1. IPv4 Header Fields . . . . . . . . . . . . . . . . 107 Appendix A.1. IPv4 Header Fields . . . . . . . . . . . . . . . . 107
Appendix A.2. IPv6 Header Fields . . . . . . . . . . . . . . . . 109 Appendix A.2. IPv6 Header Fields . . . . . . . . . . . . . . . . 109
Appendix A.3. UDP Header Fields . . . . . . . . . . . . . . . . 111 Appendix A.3. UDP Header Fields . . . . . . . . . . . . . . . . 111
Appendix A.4. UDP-Lite Header Fields . . . . . . . . . . . . . . 111 Appendix A.4. UDP-Lite Header Fields . . . . . . . . . . . . . . 111
Appendix A.5. RTP Header Fields . . . . . . . . . . . . . . . . 112 Appendix A.5. RTP Header Fields . . . . . . . . . . . . . . . . 112
Appendix A.6. ESP Header Fields . . . . . . . . . . . . . . . . 114 Appendix A.6. ESP Header Fields . . . . . . . . . . . . . . . . 114
Appendix A.7. IPv6 Extension Header Fields . . . . . . . . . . . 114 Appendix A.7. IPv6 Extension Header Fields . . . . . . . . . . . 114
Appendix A.8. GRE Header Fields . . . . . . . . . . . . . . . . 115 Appendix A.8. GRE Header Fields . . . . . . . . . . . . . . . . 115
Appendix A.9. MINE Header Fields . . . . . . . . . . . . . . . . 116 Appendix A.9. MINE Header Fields . . . . . . . . . . . . . . . . 116
skipping to change at page 5, line 15 skipping to change at page 5, line 15
acknowledged in the RoHCv2 feedback element (See Section 6.9). acknowledged in the RoHCv2 feedback element (See Section 6.9).
The value of this field normally corresponds to the Master The value of this field normally corresponds to the Master
Sequence Number (MSN) of the header that was last successfully Sequence Number (MSN) of the header that was last successfully
decompressed, for the compression context (CID) for which the decompressed, for the compression context (CID) for which the
feedback information applies. feedback information applies.
Chaining of Items Chaining of Items
A chain of items groups fields based on similar characteristics. A chain of items groups fields based on similar characteristics.
ROHCv2 defines chain items for static, dynamic and irregular ROHCv2 defines chain items for static, dynamic and irregular
fields. Chaining is achieved by appending to the chain an item fields. Chaining is achieved by appending an item to the chain
for each header in their order of appearance in the uncompressed for each header in their order of appearance in the uncompressed
packet. Chaining is useful to construct compressed headers from packet. Chaining is useful to construct compressed headers from
an arbitrary number of any of the protocol headers for which a an arbitrary number of any of the protocol headers for which a
ROHCv2 profile defines a compressed format. ROHCv2 profile defines a compressed format.
CRC-3 Control Fields Validation CRC-3 Control Fields Validation
The CRC-3 control fields validation refers to the validation of The CRC-3 control fields validation refers to the validation of
the control fields. This validation is performed by the the control fields. This validation is performed by the
decompressor when it receives a CO header that contains a 3-bit decompressor when it receives a CO header that contains a 3-bit
skipping to change at page 5, line 46 skipping to change at page 5, line 46
compression endpoint. compression endpoint.
Reordering Depth Reordering Depth
The number of packets by which a packet is received late within The number of packets by which a packet is received late within
its sequence due to reordering between the compressor and the its sequence due to reordering between the compressor and the
decompressor, i.e. reordering between packets associated with the decompressor, i.e. reordering between packets associated with the
same context (CID). See definition of sequentially late packet same context (CID). See definition of sequentially late packet
below. below.
ROHCv2 Packet Types ROHCv2 Header Types
ROHCv2 profiles use two different packet types: the Initialization ROHCv2 profiles use two different header types: the Initialization
and Refresh (IR) packet type, and the Compressed (CO) packet type. and Refresh (IR) header type, and the Compressed (CO) header 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).
skipping to change at page 7, line 21 skipping to change at page 7, line 21
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.
RC Repair Context state (decompressor). RC Repair Context state (decompressor).
ROHC Header compression framework (RFC4995). ROHC Header compression framework (RFC4995).
ROHCv2 Set of header compression profiles defined in this document. 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. The RTP header contains an optional list
TC Traffic Class. Octet in IPv6 header. See also TOS. of contributing sources.
TOS Type Of Service. Octet in IPv4 header. See also TC. TC Traffic Class. Field in the IPv6 header. See also TOS.
TOS Type Of Service. Field in the IPv4 header. See also TC.
TS RTP Timestamp. TS RTP Timestamp.
TTL Time to Live. Field in the IPv4 header.
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 [RFC4995], respectively. The fundamentals of the formal 3 and 4 of [RFC4995], respectively. The fundamentals of the formal
notation for ROHC are defined in [RFC4997]. [RFC4224] describes the notation for ROHC are defined in [RFC4997]. [RFC4224] describes the
skipping to change at page 8, line 37 skipping to change at page 8, line 39
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. Improvements of ROHCv2 over RFC3095 profiles 4.2. Improvements of ROHCv2 over RFC3095 profiles
The ROHCv2 profiles can achieve compression efficiency and robustness The ROHCv2 profiles can achieve compression efficiency and robustness
that are both at least equivalent to RFC3095 profiles [RFC3095], when that are both at least equivalent to RFC 3095 profiles [RFC3095],
used under the same operating conditions. In particular, the size when used under the same operating conditions. In particular, the
and bit layout of the smallest compressed header (i.e. PT-0 format size and bit layout of the smallest compressed header (i.e. PT-0
U/O-0 in RFC3095, and pt_0_crc3 in ROHCv2) are identical. format U/O-0 in RFC 3095, and pt_0_crc3 in ROHCv2) are identical.
There are a number of differences and improvements between profiles There are a number of differences and improvements between profiles
defined in this document and their earlier version defined in defined in this document and their earlier version defined in RFC
RFC3095. This section provides an overview of some of the most 3095. This section provides an overview of some of the most
significant improvements: significant improvements:
Tolerance to reordering Tolerance to reordering
Profiles defined in RFC3095 require that the channel between Profiles defined in RFC3095 require that the channel between
compressor and decompressor provide in-order delivery between compressor and decompressor provide in-order delivery between
compression endpoints. ROHCv2 profiles, however, can handle compression endpoints. ROHCv2 profiles, however, can handle
robustly and efficiently a limited amount of reordering after the robustly and efficiently a limited amount of reordering after the
compression point as part of the compression algorithm itself. In compression point as part of the compression algorithm itself. In
addition, this improved support for reordering makes it possible addition, this improved support for reordering makes it possible
for ROHCv2 profiles to handle prelink reordering more efficiently. for ROHCv2 profiles to handle prelink reordering more efficiently.
skipping to change at page 9, line 32 skipping to change at page 9, line 32
Profiles in RFC3095 compress IP Extension headers using list Profiles in RFC3095 compress IP Extension headers using list
compression. ROHCv2 profiles instead treat extension headers in compression. ROHCv2 profiles instead treat extension headers in
the same manner as other protocol headers, i.e. using the chaining the same manner as other protocol headers, i.e. using the chaining
mechanism; it thus assumes that extension header are not added or mechanism; it thus assumes that extension header are not added or
removed during the lifetime of a context (CID), otherwise removed during the lifetime of a context (CID), otherwise
compression has to be restarted for this flow. compression has to be restarted for this flow.
IP encapsulation IP encapsulation
Profiles in RFC3095 can compress at most two levels of IP headers. Profiles in RFC 3095 can compress at most two levels of IP
ROHCv2 profiles can compress an arbitrary number of IP headers. headers. ROHCv2 profiles can compress an arbitrary number of IP
headers.
List compression List compression
ROHCv2 profiles do not support reference-based list compression. ROHCv2 profiles do not support reference-based list compression.
Robustness and repairs Robustness and repairs
ROHCv2 profiles do not define a format for the IR-DYN packet; ROHCv2 profiles do not define a format for the IR-DYN packet;
instead, each profile defines a compressed header that can be used instead, each profile defines a compressed header that can be used
to perform a more robust context repair using a 7-bit CRC to perform a more robust context repair using a 7-bit CRC
verification. This also implies that only the IR header can verification. This also implies that only the IR header can
change the association between a CID and the profile it uses. change the association between a CID and the profile it uses.
Feedback Feedback
ROHCv2 profiles mandate a CRC in the format of the FEEDBACK-2, ROHCv2 profiles mandate a CRC in the format of the FEEDBACK-2,
while this is optional in RFC 3095. A different set of feedback while this is optional in RFC 3095. A different set of feedback
options is also used in ROHCv2 compared to RFC 3095. options is also used in ROHCv2 compared to RFC 3095.
4.3. Operational Characteristics of ROHCv2 Profiles 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 different link
technologies. Section 4.4 of [RFC4995] lists the operational technologies. Section 4.4 of [RFC4995] lists the operational
characteristics of the ROHC channel. The ROHCv2 profiles address a characteristics of the ROHC channel. The ROHCv2 profiles address a
wide range of applications, and this section summarizes some of the wide range of applications, and this section summarizes some of the
operational characteristics that are specific to these profiles. operational characteristics that are 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.
skipping to change at page 11, line 30 skipping to change at page 11, line 30
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 header 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 of repetitions that is needed to obtain this confidence is The number of repetitions that is needed to obtain this confidence is
normally related to the packet loss and out-of-order delivery normally related to the packet loss and out-of-order delivery
characteristics of the link where header compression is used; it is characteristics of the link where header compression is used; it is
thus not defined in this document and is left open to thus not defined in this document and is left open to
implementations. implementations.
skipping to change at page 13, line 33 skipping to change at page 13, line 33
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 (i.e. what The compressor can then adjust the compression level (i.e. what
header format it selects) based on its confidence that the header format it selects) based on its confidence that the
decompressor has the necessary information to successfully process decompressor has the necessary information to successfully process
the compressed headers that it selects. the compressed headers that it selects.
In other words, the responsibility of the compressor are to ensure In other words, the responsibilities of the compressor are to ensure
that the decompressor operates with state information that is that the decompressor operates with state information that is
sufficient to successfully decompress the type of compressed sufficient to successfully decompress the type of compressed
header(s) it receives, and to allow the decompressor to successfully header(s) it receives, and to allow the decompressor to successfully
recover that state information as soon as possible otherwise. The recover that state information as soon as possible otherwise. The
compressor therefore selects the type of compressed header based on compressor therefore selects the type of compressed header based on
the following factors: 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;
skipping to change at page 14, line 9 skipping to change at page 14, line 9
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 to its assumptions regarding the validity of has taken with respect to its assumptions regarding the validity of
its context (Section 5.2.2); it indicates what type of compressed its context (Section 5.2.2); it indicates what type of compressed
header 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 compressed (CO) header format, 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
responsible to determine 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.
skipping to change at page 20, line 6 skipping to change at page 20, line 6
profiles (i.e. the PROFILES parameter) and if the channel cannot profiles (i.e. the PROFILES parameter) and if the channel cannot
guarantee in-order delivery of packets between compression endpoints. guarantee in-order delivery of packets between compression endpoints.
6.2. Profile Operation, per-context 6.2. Profile Operation, per-context
ROHCv2 profiles operate differently, per context, depending on how 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 starts with the assumption that the
send feedback when it initializes a new context (see also the decompressor will not send feedback when it initializes a new context
definition of a new context in section 5.1.1. of [RFC4995]), i.e. (see also the definition of a new context in section 5.1.1. of
there is no established feedback channel for the new context. At [RFC4995]), i.e. there is no established feedback channel for the new
this point, despite the use of the optimistic approach, decompression context. At this point, despite the use of the optimistic approach,
failure is still possible because the decompressor may not have decompression failure is still possible because the decompressor may
received sufficient information to correctly decompress the packets; not have received sufficient information to correctly decompress the
therefore, until the decompressor has established a feedback channel, packets; therefore, until the decompressor has established a feedback
the compressor SHOULD periodically send IR packets. The periodicity channel, the compressor SHOULD periodically send IR packets. The
can be based on timeouts, on the number of compressed packets sent periodicity can be based on timeouts, on the number of compressed
for the flow, or any other strategy the implementer chooses. packets sent for the flow, or 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 or STATIC-NACKs) from the decompressor establishes the (NACKs or STATIC-NACKs) from the decompressor establishes the
feedback channel for the context (CID) for which the feedback was feedback channel for the context (CID) for which the feedback was
received. Once there is an established feedback channel for a received. Once there is an established feedback channel for a
specific context, the compressor can make use of this feedback to specific context, the compressor can make use of this feedback to
estimate the current state of the decompressor. This helps estimate the current state of the decompressor. This helps
increasing the compression efficiency by providing the information increasing the compression efficiency by providing the information
needed for the compressor to achieve the necessary confidence level. needed for the compressor to achieve the necessary confidence level.
When the feedback channel is established, it becomes superfluous for When the feedback channel is established, it becomes superfluous for
skipping to change at page 20, line 50 skipping to change at page 20, line 51
Compression without an established feedback channel will be less Compression without an established feedback channel will be less
efficient, because of the periodic refreshes and from the lack of efficient, because of the periodic refreshes and from the lack of
feedback to trigger error recovery; there will also be a slightly feedback to trigger error recovery; there will also be a slightly
higher probability of loss propagation compared to the case where the higher probability of loss propagation compared to the case where the
decompressor uses feedback. decompressor uses feedback.
6.3. 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 header formats received
from the compressor. The control fields listed in the following from the compressor. The control fields listed in the following
subsections are defined using the formal notation [RFC4997] in subsections are defined using the formal notation [RFC4997] in
Section 6.8.2.4. Section 6.8.2.4.
6.3.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 one of the headers of the protocol that the that already exists in one 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. There is one MSN space per context (CID). 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 reference headers when receiving feedback o Differentiating between reference headers when receiving feedback
data; data;
o Inferring the value of incrementing fields (e.g. IPv4 o Inferring the value of incrementing fields (e.g. IPv4
Identifier). Identifier).
There is one MSN field in every ROHCv2 header, i.e. the MSN is always There is one MSN field in every ROHCv2 header, i.e. the MSN is always
present in each packet type sent by the compressor. The MSN is sent present in each header type sent by the compressor. The MSN is sent
in full in IR packets, while it can be lsb encoded within CO header in full in IR headers, while it can be lsb encoded within CO header
formats. The decompressor always includes LSBs of the MSN in the formats. The decompressor always includes LSBs of the MSN in the
Acknowledgment Number field in feedback (see Section 6.9). The Acknowledgment Number field in feedback (see Section 6.9). The
compressor can later use this field to infer what packet the compressor can later use this field to infer what packet the
decompressor is acknowledging. decompressor is acknowledging.
For profiles for which the MSN is created by the compressor (i.e. For profiles for which the MSN is created by the compressor (i.e.
0x0102, 0x0104 and 0x0108), the following applies: 0x0102, 0x0104 and 0x0108), the following applies:
o The compressor only initializes the MSN for a context when that o The compressor only initializes the MSN for a context when that
context is first created or when the profile associated with a context is first created or when the profile associated with a
skipping to change at page 23, line 50 skipping to change at page 23, line 50
A packet for which the decompression attempt cannot be verified A packet for which the decompression attempt cannot be verified
using the CRC MUST NOT be delivered to upper layers. using the CRC MUST NOT be delivered to upper layers.
Decompressor implementations may attempt corrective or repair Decompressor implementations may attempt corrective or repair
measures on CO headers prior to performing the above actions, and measures on CO headers prior to performing the above actions, and
the result of any decompression attempt MUST be verified using the the result of any decompression attempt MUST be verified using the
CRC. CRC.
6.5. Compressed Header Chains 6.5. Compressed Header Chains
Some packet types use one or more chains containing sub-header Some header 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.
In the text below, the term <protocol_name> is used to identify In the text below, the term <protocol_name> is used to identify
formal notation names corresponding to different protocol headers. formal notation names corresponding to different protocol headers.
The mapping between these is defined in the following table: The mapping between these is defined in the following table:
+---------------------------------+---------------+ +----------------------------------+---------------+
| Protocol | protocol_name | | Protocol | protocol_name |
+---------------------------------+---------------+ +----------------------------------+---------------+
| IPv4 RFC791 | ipv4 | | IPv4 RFC 0791 | ipv4 |
| IPv6 RFC2460 | ipv6 | | IPv6 RFC2460 | ipv6 |
| UDP RFC768 | udp | | UDP RFC 0768 | udp |
| RTP RFC3550 | rtp | | RTP RFC3550 | rtp |
| ESP RFC4303 | esp | | ESP RFC4303 | esp |
| UDP-Lite RFC3828 | udp_lite | | UDP-Lite RFC3828 | udp_lite |
| AH RFC4302 | ah | | AH RFC4302 | ah |
| GRE RFC2784,RFC2890 | gre | | GRE RFC2784,RFC2890 | gre |
| MINE RFC2004 | mine | | MINE RFC2004 | mine |
| IPv6 Destination Option RFC2460 | dest_opt | | IPv6 Destination Option RFC2460 | dest_opt |
| IPv6 Hop-by-hop Options RFC2460 | hop_opt | | IPv6 Hop-by-hop Options RFC2460 | hop_opt |
| IPv6 Routing Header RFC2460 | rout_opt | | IPv6 Routing Header RFC2460 | rout_opt |
+---------------------------------+---------------+ +----------------------------------+---------------+
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 that is compressed, starting from the of protocol headers that is compressed, starting from the
outermost IP header. In the formal description of the packet outermost IP header. In the formal description of the header
formats, this static chain item for each header type is labelled formats, this static chain item for each header type is labelled
<protocol_name>_static. The static chain is only used in the IR <protocol_name>_static. The static chain is only used in the IR
header format. 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 that is compressed, starting from the chain of protocol headers that is compressed, starting from the
outermost IP header. In the formal description of the packet outermost IP header. In the formal description of the header
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 only used in the IR <protocol_name>_dynamic. The dynamic chain is only used in the IR
header format. and co_repair header formats.
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 header that uses the
chain is appended at a specific location in the general format of general format of Section 6.8, the irregular chain is appended at
the compressed packets as defined in Section 6.8. In the formal a specific location in the general format of the compressed
description of the packet formats, the irregular chain item for headers. In the formal description of the header formats, the
each header type is a format whose name is suffixed by irregular chain item for each header type is a format whose name
"_irregular". The irregular chain is used in all CO packets. is suffixed by "_irregular". The irregular chain is used in all
CO headers, except for the co_repair format.
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 used for the outer IP headers, because differs from the format used for the outer IP headers, because
this header is part of the compressed base header. In the this header is part of the compressed base header. In the
definition of the packet formats using the formal notation, the definition of the header formats using the formal notation, the
argument "is_innermost" passed to the corresponding encoding argument "is_innermost" passed to the corresponding encoding
method (ipv4 or ipv6) determines what irregular chain items to method (ipv4 or ipv6) determines what irregular chain items to
use. The format of the irregular chain item for the outer IP use. The format of the irregular chain item for the outer IP
headers is also determined using one flag for TTL/Hop Limit and headers is also determined using one flag for TTL/Hop Limit and
one for TOS/TC. These flags are defined in the format of some of TOS/TC. This flag is defined in the format of some of the
the compressed base headers. compressed base headers.
ROHCv2 profiles compresses extension headers as other headers, and ROHCv2 profiles compress extension headers as other headers, and thus
thus extension headers have a static chain, a dynamic chain and an extension headers have a static chain, a dynamic chain and an
irregular chain. irregular chain.
ROHCv2 profiles define chains for all headers that can be compressed, ROHCv2 profiles define chains for all headers that can be compressed,
i.e. RTP [RFC3550], UDP [RFC0768], ESP[RFC4303], UDP Lite [RFC3828], i.e. RTP [RFC3550], UDP [RFC0768], ESP [RFC4303], UDP Lite
IPv4 [RFC0791], IPv6 [RFC2460], AH [RFC4302], GRE [RFC2784][RFC2890], [RFC3828], IPv4 [RFC0791], IPv6 [RFC2460], AH [RFC4302], GRE
MINE [RFC2004], IPv6 Destination Options header[RFC2460], IPv6 Hop- [RFC2784][RFC2890], MINE [RFC2004], IPv6 Destination Options header
by-hop Options header [RFC2460] and IPv6 Routing header [RFC2460]. [RFC2460], IPv6 Hop-by-hop Options header [RFC2460] and IPv6 Routing
header [RFC2460].
6.6. Packet Formats and Encoding Methods 6.6. Header Formats and Encoding Methods
The packet formats are defined using the ROHC formal notation. Some The header formats are defined using the ROHC formal notation. Some
of the encoding methods used in the packet formats are defined in of the encoding methods used in the header formats are defined in
[RFC4997], while other methods are defined in this section. [RFC4997], while other methods are defined in this section.
6.6.1. baseheader_extension_headers 6.6.1. baseheader_extension_headers
The baseheader_extension_headers encoding method skips over all The baseheader_extension_headers encoding method skips over all
fields of the extension headers of the innermost IP header, without fields of the extension headers of the innermost IP header, without
encoding any of them. Fields in these extension headers are instead encoding any of them. Fields in these extension headers are instead
encoded in the irregular chain. encoded in the irregular chain.
This encoding is used in CO headers (see Section 6.8.2). The This encoding is used in CO headers (see Section 6.8.2). The
skipping to change at page 26, line 18 skipping to change at page 26, line 19
6.6.2. baseheader_outer_headers 6.6.2. baseheader_outer_headers
The baseheader_outer_headers encoding method skips over all the The baseheader_outer_headers encoding method skips over all the
fields of the extension header(s) that do not belong to the innermost fields of the extension header(s) that do not belong to the innermost
IP header, without encoding any of them. Changing fields in outer IP header, without encoding any of them. Changing 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 This encoding method, similarly to the baseheader_extension_headers
encoding method above, is necessary to keep the definition of the encoding method above, is necessary to keep the definition of the
packet formats syntactically correct. It describes tunneling IP header formats syntactically correct. It describes tunneling IP
headers and their respective extension headers (i.e. all headers headers and their respective extension headers (i.e. all headers
located before the innermost IP header) for CO headers (see located before the innermost IP header) for CO headers (see
Section 6.8.2). Section 6.8.2).
6.6.3. inferred_udp_length 6.6.3. inferred_udp_length
The decompressor infers the value of the UDP length field as being The decompressor infers the value of the UDP length field as being
the size of the UDP payload. The compressor must therefore ensure the sum of the UDP header length and the UDP payload length. The
that the UDP length field is consistent with the length field(s) of compressor must therefore ensure that the UDP length field is
preceding subheaders, i.e., there must not be any padding after the consistent with the length field(s) of preceding subheaders, i.e.,
UDP payload that is covered by the IP Length. there must not be any padding after the UDP payload that is covered
by the IP Length.
This encoding method is also used for the UDP-Lite Checksum Coverage 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 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). (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:
skipping to change at page 28, line 40 skipping to change at page 28, line 47
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 bits, 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 Compression 6.6.8. Scaled RTP Timestamp Compression
This section provide additional details on encodings used to scale This section provides additional details on encodings used to scale
the RTP timestamp, as defined in the formal notation in the RTP timestamp, as defined in the formal notation in
Section 6.8.2.4. Section 6.8.2.4.
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 the formal notation . The compressor definition of the profile in the formal notation . 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 default value of the scaling factor ts_stride is 160, as defined The default value of the scaling factor ts_stride is 160, as defined
in Section 6.8.2.4. To use a different value for ts_stride, the in Section 6.8.2.4. To use a different value for ts_stride, the
compressor explicitly updates the value of ts_stride to the compressor explicitly updates the value of ts_stride to the
decompressor using one of the packet types that can carry this decompressor using one of the header formats that can carry this
information. information.
When the compressor uses a scaling factor that is different than the When the compressor uses a scaling factor that is different than the
default value of ts_stride, it can only use the new scaling factor default value of ts_stride, it can only use the new scaling factor
once it has have enough confidence that the decompressor has once it has enough confidence that the decompressor has successfully
successfully calculated the residue (ts_offset) of the scaling calculated the residue (ts_offset) of the scaling function for the
function for the timestamp. The compressor achieves this by sending timestamp. The compressor achieves this by sending unscaled
unscaled timestamp values, to allow the decompressor to establish the timestamp values, to allow the decompressor to establish the residue
residue based on the current ts_stride. The compressor MAY send the based on the current ts_stride. The compressor MAY send the unscaled
unscaled timestamp in the same compressed header(s) used to establish timestamp in the same compressed header(s) used to establish the
the value of ts_stride. value of ts_stride.
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.
When the compressor detects that the residue (ts_offset) value has When the compressor detects that the residue (ts_offset) value has
changed, it MUST NOT select a compressed header format that uses the changed, it MUST NOT select a compressed header format that uses the
scaled timestamp encoding before it has re-established the residue as scaled timestamp encoding before it has re-established the residue as
described above. described above.
skipping to change at page 29, line 48 skipping to change at page 30, line 8
Whether or not the scaling is applied to the RTP TS field is up to Whether or not the scaling is applied to the RTP TS field is up to
the compressor implementation (i.e. The use of scaling is optional), the compressor implementation (i.e. The use of scaling is optional),
and is indicated by the tsc_indicator control field. In case scaling and is indicated by the tsc_indicator control field. In case scaling
is applied to the RTP TS field, the value of ts_stride used by the is applied to the RTP TS field, the value of ts_stride used by the
compressor is up to the implementation. A value of ts_stride that is compressor is up to the implementation. A value of ts_stride that is
set to the expected increase in RTP timestamp between consecutive set to the expected increase in RTP timestamp between consecutive
unit increase of the RTP SN will provide the most gain for the scaled unit increase of the RTP SN will provide the most gain for the scaled
encoding. Other values may provide the same gain in some situations, encoding. Other values may provide the same gain in some situations,
but may reduce the gain in others. but may reduce the gain in others.
When scaled timestamp encoding is used for packet formats that do not When scaled timestamp encoding is used for header formats that do not
transmit any lsb-encoded timestamp bits at all, the transmit any lsb-encoded timestamp bits at all, the
inferred_scaled_field encoding of Section 6.6.10 is used for encoding inferred_scaled_field encoding of Section 6.6.10 is used for encoding
the timestamp. the timestamp.
6.6.9. timer_based_lsb 6.6.9. timer_based_lsb
The timer-based compression encoding method, "timer_based_lsb", The timer-based compression encoding method, "timer_based_lsb",
compresses a field whose change pattern approximates a linear compresses a field whose change pattern approximates a linear
function of the time of day. function of the time of day.
skipping to change at page 32, line 34 skipping to change at page 32, line 47
o coverage_behavior, 2 bits padded with 6 MSB of zeroes (only to o coverage_behavior, 2 bits padded with 6 MSB of zeroes (only to
profiles 0x0107 and 0x0108) profiles 0x0107 and 0x0108)
o ip_id_behavior, one octet for each IP header in the compressible o ip_id_behavior, one octet for each IP header in the compressible
header chain starting from the outermost header. Each octet header chain starting from the outermost header. Each octet
consists of 2 bits padded with 6 MSBs of zeroes consists of 2 bits padded with 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 to the specific profile. field(s) that are applicable to the specific profile.
The decompressor uses the resulting 3-bit CRC to validate the control The decompressor uses the resulting 3-bit CRC to validate the control
fields that are updated by the co_common and co_repair packet types; fields that are updated by the co_common and co_repair header
this CRC cannot be used to verify the outcome of a decompression formats; this CRC cannot be used to verify the outcome of a
attempt. decompression attempt.
This CRC protects the update of control fields, as the updated values This CRC protects the update of control fields, as the updated values
are not always used to decompress the header that carries them and are not always used to decompress the header that carries them and
thus are not protected by the CRC-7 verification. This prevents thus are not protected by the CRC-7 verification. This prevents
impairments that could occur in case the decompression of a co_common impairments that could occur in case the decompression of a co_common
or of a co_repair succeeds and the decompressor would send positive or of a co_repair succeeds and the decompressor would send positive
feedback, while for some reason the control fields would be feedback, while for some reason the control fields would be
incorrectly updated. incorrectly updated.
6.6.12. inferred_sequential_ip_id 6.6.12. inferred_sequential_ip_id
skipping to change at page 34, line 10 skipping to change at page 34, line 27
The basic principles of list-based compression are the following: The basic principles of list-based compression are the following:
When initializing the context: When initializing the context:
1) The complete representation of the list of CSRC identifiers is 1) The complete representation of the list of CSRC identifiers is
transmitted. transmitted.
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 list is unchanged, a compressed header that does not
about the list is sent in compressed headers. contain information about the list can be used.
3) When the structure of the list changes, a compressed list is 3) When the list changes, a compressed list is sent in the
sent in the compressed header, including a representation of its compressed header, including a representation of its structure and
structure and order. Previously unknown items are sent order. Previously unknown items are sent uncompressed in the
uncompressed in the list, while previously known items are only list, while previously known items are only represented by an
represented by an index pointing to the item stored in the index pointing to the item stored in the context.
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
compressed lists. The compressor assigns a unique identifier, compressed lists. The compressor assigns a unique identifier,
"Index", to each item "Item" of a list. "Index", to each item "Item" of a list.
Compressor Logic Compressor Logic
The compressor conceptually maintains an Item Table containing all The compressor conceptually maintains an Item Table containing all
skipping to change at page 37, line 9 skipping to change at page 37, line 22
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 in the item identifiers. The effect of having more than 16 items in the item
table will only cause a slight overhead to the compressor when items table will only cause a slight overhead to the compressor when items
are swapped in/out of the item table. are swapped in/out of 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 (i.e. in IR A compressed list that is part of the dynamic chain must have all its
packets) must have all its list items present, i.e. all X-bits in the list items present, i.e. all X-bits in the XI list MUST be set. All
XI list MUST be set. All items previously established in the item items previously established in the item table that are not present
table that are not present in the list decompressed from this packet in the list decompressed from this packet MUST also be retained in
MUST also be retained in the decompressor context. the decompressor context.
6.7. Encoding Methods With External Parameters as Arguments 6.7. Encoding Methods With External Parameters as Arguments
A number of encoding methods in Section 6.8.2.4 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.
List of encoding methods with external parameters as arguments, from List of encoding methods with external parameters as arguments, from
Section 6.8.2.4: Section 6.8.2.4:
skipping to change at page 38, line 39 skipping to change at page 39, line 9
Set to a 2-bit integer value, using one of the constants whose Set to a 2-bit integer value, using one of the constants whose
name begins with the prefix UDP_LITE_COVERAGE_ and as defined name begins with the prefix UDP_LITE_COVERAGE_ and as defined
in Section 6.8.2.4. in Section 6.8.2.4.
o outer_ip_flag: o outer_ip_flag:
This parameter is set to 1 if at least one of the TOS/TC or This parameter is set to 1 if at least one of the TOS/TC or
TTL/Hop Limit fields in outer IP headers has changed compared TTL/Hop Limit fields in outer IP headers has changed compared
to their reference values in the context, otherwise it is set to their reference values in the context, otherwise it is set
to 0. This flag may only be set to 1 for the "co_common" to 0. This flag may only be set to 1 for the "co_common"
packet format in the different profiles. header format in the different profiles.
o is_innermost: o is_innermost:
This boolean flag is set to 1 when processing the innermost of This boolean flag is set to 1 when processing the innermost of
the compressible IP headers; otherwise it is set to 0. the compressible IP headers; otherwise it is set to 0.
o ts_stride_value o ts_stride_value
The value of this parameter should be set to the expected The value of this parameter should be set to the expected
increase in the RTP Timestamp between consecutive RTP sequence increase in the RTP Timestamp between consecutive RTP sequence
numbers. The value selected is implementation-specific. See numbers. The value selected is implementation-specific. See
also Section 6.6.8. also Section 6.6.8.
o time_stride_value o time_stride_value
The value of this parameter should be set to the expected The value of this parameter should be set to the expected
inter-arrival time between consecutive packets for the flow. inter-arrival time between consecutive packets for the flow.
The value selected is implementation-specific. This parameter The value selected is implementation-specific. This parameter
skipping to change at page 39, line 18 skipping to change at page 39, line 32
o time_stride_value o time_stride_value
The value of this parameter should be set to the expected The value of this parameter should be set to the expected
inter-arrival time between consecutive packets for the flow. inter-arrival time between consecutive packets for the flow.
The value selected is implementation-specific. This parameter The value selected is implementation-specific. This parameter
MUST be set to zero, unless the compressor has received a MUST be set to zero, unless the compressor has received a
feedback message with the CLOCK_RESOLUTION option set to a non- feedback message with the CLOCK_RESOLUTION option set to a non-
zero value. See also Section 6.6.9. zero value. See also Section 6.6.9.
6.8. Packet Formats 6.8. Header Formats
ROHCv2 profiles use two different packet types: the Initialization ROHCv2 profiles use two different header types: the Initialization
and Refresh (IR) packet type, and the Compressed packet type (CO). and Refresh (IR) header type, and the Compressed header type (CO).
The CO packet type defines a number of packet formats: there are two The CO header type defines a number of header formats: there are two
sets of base header formats, with a few additional formats that are sets of base header formats, with a few additional formats that are
common to both sets. common to both sets.
6.8.1. Initialization and Refresh Packet (IR) 6.8.1. Initialization and Refresh Header Format (IR)
The IR packet format uses the structure of the ROHC IR packet as The IR header format uses the structure of the ROHC IR header as
defined in [RFC4995], section 5.2.2.1. defined in [RFC4995], section 5.2.2.1.
Packet type: IR Header type: IR
This header format communicates the static part and the dynamic
This packet type communicates the static part and the dynamic part part of the context.
of the context.
The ROHCv2 IR packet has the following format: The ROHCv2 IR header has the following format:
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 != 0) : Add-CID octet : if for small CIDs and (CID != 0)
+---+---+---+---+---+---+---+---+ +---+---+---+---+---+---+---+---+
| 1 1 1 1 1 1 0 1 | IR type octet | 1 1 1 1 1 1 0 1 | IR type octet
+---+---+---+---+---+---+---+---+ +---+---+---+---+---+---+---+---+
: : : :
/ 0-2 octets of CID / 1-2 octets if for large CIDs / 0-2 octets of CID / 1-2 octets if for large CIDs
: : : :
skipping to change at page 40, line 29 skipping to change at page 40, line 31
| CRC | 1 octet | CRC | 1 octet
+---+---+---+---+---+---+---+---+ +---+---+---+---+---+---+---+---+
| | | |
/ Static chain / variable length / Static chain / variable length
| | | |
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| | | |
/ Dynamic chain / variable length / Dynamic chain / variable length
| | | |
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| |
/ Payload / variable length
| |
- - - - - - - - - - - - - - - -
CRC: 8-bit CRC over the entire IR-header, including any CID fields CRC: 8-bit CRC over the entire IR-header, including any CID fields
and up until the end of the dynamic chain, using the polynomial and up until the end of the dynamic chain, using the polynomial
defined in [RFC4995]. For purposes of computing the CRC, the CRC defined in [RFC4995]. For purposes of computing the CRC, the CRC
field is zero. field is zero.
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. 6.8.2. Compressed Header Formats (CO)
The payload consists of all data after the last octet of the last
header compressed by the profile indicated in the Profile field.
The presence of a payload is inferred from the packet length.
6.8.2. Compressed Packet Formats (CO)
6.8.2.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 header 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 headers 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 headers without sequential IP-ID
(either random, zero, or no IP-ID). There are also a number of (either random, zero, or no IP-ID). There are also a number of
common packet format shared between both sets. In the description common header formats shared between both sets. In the description
below, the naming convention used for packet formats that belong to below, the naming convention used for header formats that belong to
the sequential set is to include "seq" in the name of the format, the sequential set is to include "seq" in the name of the format,
while similarly "rnd" is used for those that belong to the non- while similarly "rnd" is used for those that belong to the non-
sequential set. sequential set.
The design of the packet formats is derived from the field behavior The design of the header 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 header formats exist for all profiles defined in this
document, and are common to both the sequential and the random packet document, and are common to both the sequential and the random header
format sets: format sets:
o co_common: This format can be used to update the context when the o co_common: This format can be used to update the context when the
established change pattern of a dynamic field changes, for any of established change pattern of a dynamic field changes, for any of
the dynamic fields. However, not all dynamic fields are updated the dynamic fields. However, not all dynamic fields are updated
by conveying their uncompressed value; some fields can only be by conveying their uncompressed value; some fields can only be
transmitted using a compressed representation. This format is transmitted using a compressed representation. This format is
especially useful when a rarely changing field needs to be especially useful when a rarely changing field needs to be
updated. This format contains a set of flags to indicate what updated. This format contains a set of flags to indicate what
fields are present in the header, and its size can vary fields are present in the header, and its size can vary
accordingly. This format is protected by a 7-bit CRC. It can accordingly. This format is protected by a 7-bit CRC. It can
update controls fields, and it thus also carries a 3-bit CRC to update control fields, and it thus also carries a 3-bit CRC to
protect those fields as well. This format is similar in purpose protect those fields as well. This format is similar in purpose
to the UOR-2-extension 3 format of [RFC3095]. to the UOR-2-extension 3 format of [RFC3095].
o co_repair: This format can be used to update the context of all o co_repair: This format can be used to update the context of all
the dynamic fields by conveying their uncompressed value. This is the dynamic fields by conveying their uncompressed value. This is
especially useful when context damage is assumed (e.g. from the especially useful when context damage is assumed (e.g. from the
reception of a NACK) and a context repair is performed. This reception of a NACK) and a context repair is performed. This
format is protected by a 7-bit CRC. It also carries a 3-bit CRC format is protected by a 7-bit CRC. It also carries a 3-bit CRC
over the control fields, which control fields it can also update. over the control fields, which control fields it can also update.
This format is similar in purpose to the IR-DYN format of This format is similar in purpose to the IR-DYN format of
[RFC3095] when performing context repairs. [RFC3095] when performing context repairs.
o pt_0_crc3: This format conveys only the MSN; it can therefore only o pt_0_crc3: This format conveys only the MSN; it can therefore only
update the MSN and fields that are derived from the MSN, such as update the MSN and fields that are derived from the MSN, such as
IP-ID and the RTP Timestamp (for applicable profiles). It is IP-ID and the RTP Timestamp (for applicable profiles). It is
protected by a 3-bit CRC. This format is equivalent to the UO-0 protected by a 3-bit CRC. This format is equivalent to the UO-0
packet format in [RFC3095]. header format in [RFC3095].
o pt_0_crc7: This format has the same properties as pt_0_crc3, but o pt_0_crc7: This format 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 useful in environments of lsb-encoded MSN bits. This format is useful in environments
where a high amount of reordering or a high residual error rate where a high amount of reordering or a high residual error rate
can occur. can occur.
The following packet format descriptions apply to profiles 0x0101 and The following header format descriptions apply to profiles 0x0101 and
0x0107. 0x0107.
o pt_1_rnd: This format can convey changes to the MSN, to the RTP o pt_1_rnd: This format can convey changes to the MSN, to the 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. It is protected by a 3-bit CRC. It is timestamp encoding. It is protected by a 3-bit CRC. It is
similar in purpose to the UO-1 format in [RFC3095]. similar in purpose to the UO-1 format in [RFC3095].
o pt_1_seq_id: This format can convey changes to the MSN and to the o pt_1_seq_id: This format can convey changes to the MSN and to the
IP-ID. It is protected by a 3-bit CRC. It is similar in purpose IP-ID. It is protected by a 3-bit CRC. It is similar in purpose
to the UO-1-ID format in [RFC3095]. to the UO-1-ID format in [RFC3095].
skipping to change at page 43, line 5 skipping to change at page 42, line 40
o pt_2_seq_ts: This format can convey changes to the MSN, to the RTP o pt_2_seq_ts: This format can convey changes to the MSN, to the 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. It is protected by a 7-bit CRC. It is timestamp encoding. It is protected by a 7-bit CRC. It is
similar in purpose to the UO-2-TS format in [RFC3095]. similar in purpose to the UO-2-TS format in [RFC3095].
o pt_2_seq_both: This format can convey changes to both the RTP o pt_2_seq_both: This format can convey changes to both the RTP
Timestamp and IP-ID, in addition to the MSN and to the Marker bit. Timestamp and IP-ID, in addition to the MSN and to the Marker bit.
It is protected by a 7-bit CRC. It is similar in purpose to the It is protected by a 7-bit CRC. It is similar in purpose to the
UOR-2-ID extension 1 format in [RFC3095]. UOR-2-ID extension 1 format in [RFC3095].
The following packet formats descriptions apply to profiles 0x0102, The following header formats descriptions apply to profiles 0x0102,
0x0103, 0x0104 and 0x0108. 0x0103, 0x0104 and 0x0108.
o pt_1_seq_id: This format can convey changes to the MSN and to the o pt_1_seq_id: This format can convey changes to the MSN and to the
IP-ID. It is protected by a 7-bit CRC. It is similar in purpose IP-ID. It is protected by a 7-bit CRC. It is similar in purpose
to the UO-1-ID format in [RFC3095]. to the UO-1-ID format in [RFC3095].
o pt_2_seq_id: This format can convey changes to the MSN and to the o pt_2_seq_id: This format can convey changes to the MSN and to the
IP-ID. It is protected by a 7-bit CRC. It is similar in purpose IP-ID. It is protected by a 7-bit CRC. It is similar in purpose
to the UO-2-ID format in [RFC3095]. to the UO-2-ID format in [RFC3095].
6.8.2.2. co_repair Header Format 6.8.2.2. co_repair Header Format
The ROHCv2 co_repair packet has the following format: The ROHCv2 co_repair header has the following format:
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
+---+---+---+---+---+---+---+---+ +---+---+---+---+---+---+---+---+
| 1 1 1 1 1 0 1 1 | discriminator | 1 1 1 1 1 0 1 1 | discriminator
+---+---+---+---+---+---+---+---+ +---+---+---+---+---+---+---+---+
: : : :
/ 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
: : : :
+---+---+---+---+---+---+---+---+ +---+---+---+---+---+---+---+---+
|r1 | CRC-7 | |r1 | CRC-7 |
+---+---+---+---+---+---+---+---+ +---+---+---+---+---+---+---+---+
| r2 | CRC-3 | | r2 | CRC-3 |
+---+---+---+---+---+---+---+---+ +---+---+---+---+---+---+---+---+
| | | |
/ Dynamic chain / variable length / Dynamic chain / variable length
| | | |
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| |
/ Payload / variable length
| |
- - - - - - - - - - - - - - - -
r1: MUST be set to zero; otherwise, the decompressor MUST discard r1: MUST be set to zero; otherwise, the decompressor MUST discard
the packet. the packet.
CRC-7: A 7-bit CRC over the entire uncompressed header, computed CRC-7: A 7-bit CRC over the entire uncompressed header, computed
using the crc7(data_value, data_length) encoding method defined in using the crc7(data_value, data_length) encoding method defined in
Section 6.8.2.4, where data_value corresponds to the entire Section 6.8.2.4, where data_value corresponds to the entire
uncompressed header chain and where data_length corresponds to the uncompressed header chain and where data_length corresponds to the
length of this header chain. length of this header chain.
r2: MUST be set to zero; otherwise, the decompressor MUST discard r2: MUST be set to zero; otherwise, the decompressor MUST discard
the packet. the packet.
CRC-3: Encoded using the control_crc3_encoding method defined in CRC-3: Encoded using the control_crc3_encoding method defined in
Section 6.6.11. Section 6.6.11.
Dynamic chain: See Section 6.5. 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 6.8.2.3. General CO Header Format
The CO header format communicates irregularities in the packet The CO header format communicates irregularities in the packet
header. All CO formats carry a CRC and can update the context. All header. All CO formats carry a CRC and can update the context. All
CO header formats use the general format defined in this section, CO header formats use the general format defined in this section,
with the exception of the co_repair format which is defined in with the exception of the co_repair format which is defined in
Section 6.8.2.2 . Section 6.8.2.2 .
The general format for a compressed header is as follows: The general format for a compressed header is as follows:
skipping to change at page 44, line 48 skipping to change at page 44, line 27
/ remainder of base header / variable length / remainder of base header / variable length
+---+---+---+---+---+---+---+---+ +---+---+---+---+---+---+---+---+
: : : :
/ Irregular Chain / variable length / Irregular Chain / variable length
: : : :
--- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
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. The base header formats are defined in uncompressed packet. The base header formats are defined in
Section 6.8.2.4. In the formal description of the packet formats, Section 6.8.2.4. In the formal description of the header formats,
the base header for each profile is labelled the base header for each profile is labelled
<profile_name>_baseheader, where <profile_name> is defined in the <profile_name>_baseheader, where <profile_name> is defined in the
following table: following table:
+------------------+----------------+ +------------------+----------------+
| Profile number | profile_name | | Profile number | profile_name |
+------------------+----------------+ +------------------+----------------+
| 0x0101 | rtp | | 0x0101 | rtp |
| 0x0102 | udp | | 0x0102 | udp |
| 0x0103 | esp | | 0x0103 | esp |
skipping to change at page 46, line 27 skipping to change at page 46, line 6
//////////////////////////////////////////// ////////////////////////////////////////////
// Global control fields // Global control fields
//////////////////////////////////////////// ////////////////////////////////////////////
CONTROL { CONTROL {
profile [ 16 ]; profile [ 16 ];
msn [ 16 ]; msn [ 16 ];
reorder_ratio [ 2 ]; reorder_ratio [ 2 ];
// ip_id fields are for innermost IP header only // ip_id fields are for innermost IP header only
ip_id_offset [ 16 ]; ip_id_offset [ 16 ];
ip_id_behavior_innermost [ 16 ]; ip_id_behavior_innermost [ 2 ];
// The following are only used in RTP-based profiles // The following are only used in RTP-based profiles
ts_stride [ 32 ]; ts_stride [ 32 ];
time_stride [ 32 ]; time_stride [ 32 ];
ts_scaled [ 32 ]; ts_scaled [ 32 ];
ts_offset [ 32 ]; ts_offset [ 32 ];
// UDP-lite-based profiles only
coverage_behavior [ 2 ];
} }
/////////////////////////////////////////////// ///////////////////////////////////////////////
// Encoding methods not specified in FN syntax: // Encoding methods not specified in FN syntax:
/////////////////////////////////////////////// ///////////////////////////////////////////////
baseheader_extension_headers "defined in Section 6.6.1"; baseheader_extension_headers "defined in Section 6.6.1";
baseheader_outer_headers "defined in Section 6.6.2"; baseheader_outer_headers "defined in Section 6.6.2";
control_crc3_encoding "defined in Section 6.6.11"; control_crc3_encoding "defined in Section 6.6.11";
inferred_ip_v4_header_checksum "defined in Section 6.6.4"; inferred_ip_v4_header_checksum "defined in Section 6.6.4";
skipping to change at page 61, line 27 skipping to change at page 61, line 11
reorder_ratio =:= irregular(2) [ 2 ]; reorder_ratio =:= irregular(2) [ 2 ];
df =:= irregular(1) [ 1 ]; df =:= irregular(1) [ 1 ];
ip_id_behavior_innermost =:= irregular(2) [ 2 ]; ip_id_behavior_innermost =:= irregular(2) [ 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_innermost.UVALUE) [ 0, 16 ]; ip_id =:= ip_id_enc_dyn(ip_id_behavior_innermost.UVALUE) [ 0, 16 ];
msn =:= irregular(16) [ 16 ]; msn =:= irregular(16) [ 16 ];
} }
COMPRESSED ipv4_regular_innermost_dynamic { COMPRESSED ipv4_regular_innermost_dynamic {
ENFORCE((is_innermost == 1) || (profile_value != PROFILE_IP_0104)); ENFORCE((is_innermost == 1) && (profile_value != PROFILE_IP_0104));
ENFORCE(ip_id_behavior_innermost.UVALUE == ip_id_behavior_value); ENFORCE(ip_id_behavior_innermost.UVALUE == ip_id_behavior_value);
reserved =:= '00000' [ 5 ]; reserved =:= '00000' [ 5 ];
df =:= irregular(1) [ 1 ]; df =:= irregular(1) [ 1 ];
ip_id_behavior_innermost =:= irregular(2) [ 2 ]; ip_id_behavior_innermost =:= irregular(2) [ 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_innermost.UVALUE) [ 0, 16 ]; ip_id =:= ip_id_enc_dyn(ip_id_behavior_innermost.UVALUE) [ 0, 16 ];
} }
COMPRESSED ipv4_outer_dynamic { COMPRESSED ipv4_outer_dynamic {
ENFORCE((is_innermost == 0) || (profile_value != PROFILE_IP_0104)); ENFORCE(is_innermost == 0);
ENFORCE(ip_id_behavior_outer.UVALUE == ip_id_behavior_value); ENFORCE(ip_id_behavior_outer.UVALUE == ip_id_behavior_value);
reserved =:= '00000' [ 5 ]; reserved =:= '00000' [ 5 ];
df =:= irregular(1) [ 1 ]; df =:= irregular(1) [ 1 ];
ip_id_behavior_outer =:= irregular(2) [ 2 ]; ip_id_behavior_outer =:= irregular(2) [ 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_outer.UVALUE) [ 0, 16 ]; ip_id =:= ip_id_enc_dyn(ip_id_behavior_outer.UVALUE) [ 0, 16 ];
} }
COMPRESSED ipv4_outer_irregular { COMPRESSED ipv4_outer_irregular {
skipping to change at page 62, line 40 skipping to change at page 62, line 25
CONTROL { CONTROL {
ENFORCE(profile == profile_value); ENFORCE(profile == profile_value);
ENFORCE(reorder_ratio.UVALUE == reorder_ratio_value); ENFORCE(reorder_ratio.UVALUE == reorder_ratio_value);
checksum_used [ 1 ]; checksum_used [ 1 ];
} }
DEFAULT { DEFAULT {
src_port =:= static; src_port =:= static;
dst_port =:= static; dst_port =:= static;
checksum_used =:= static;
} }
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_value == PROFILE_UDP_0102); ENFORCE(profile_value == PROFILE_UDP_0102);
ENFORCE(profile == PROFILE_UDP_0102); ENFORCE(profile == PROFILE_UDP_0102);
ENFORCE(checksum_used.UVALUE == (checksum.UVALUE != 0)); ENFORCE(checksum_used.UVALUE == (checksum.UVALUE != 0));
checksum =:= irregular(16) [ 16 ]; 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 =:= irregular(2) [ 2 ]; reorder_ratio =:= irregular(2) [ 2 ];
} }
COMPRESSED udp_regular_dynamic { COMPRESSED udp_regular_dynamic {
ENFORCE(profile_value == PROFILE_RTP_0101); ENFORCE(profile_value == PROFILE_RTP_0101);
ENFORCE(checksum_used == (checksum.UVALUE != 0)); ENFORCE(checksum_used.UVALUE == (checksum.UVALUE != 0));
checksum =:= irregular(16) [ 16 ]; checksum =:= irregular(16) [ 16 ];
} }
COMPRESSED udp_zero_checksum_irregular { COMPRESSED udp_zero_checksum_irregular {
ENFORCE(checksum_used.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_used.UVALUE == 1); ENFORCE(checksum_used.UVALUE == 1);
checksum =:= irregular(16) [ 16 ]; checksum =:= irregular(16) [ 16 ];
} }
} }
///////////////////////////////////////////// /////////////////////////////////////////////
// RTP Header // RTP Header
///////////////////////////////////////////// /////////////////////////////////////////////
skipping to change at page 65, line 18 skipping to change at page 64, line 50
reorder_ratio =:= irregular(2) [ 2 ]; reorder_ratio =:= irregular(2) [ 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_default(tss_indicator, ts_stride =:= sdvl_or_default(tss_indicator.CVALUE,
TS_STRIDE_DEFAULT) [ VARIABLE ]; TS_STRIDE_DEFAULT) [ VARIABLE ];
time_stride =:= sdvl_or_default(tis_indicator, time_stride =:= sdvl_or_default(tis_indicator.CVALUE,
TIME_STRIDE_DEFAULT) [ VARIABLE ]; TIME_STRIDE_DEFAULT) [ VARIABLE ];
csrc_list =:= csrc_list =:= csrc_list_dynchain(list_present.CVALUE,
csrc_list_dynchain(list_present, cc.UVALUE) [ VARIABLE ]; cc.UVALUE) [ VARIABLE ];
} }
COMPRESSED rtp_irregular { COMPRESSED rtp_irregular {
} }
} }
///////////////////////////////////////////// /////////////////////////////////////////////
// UDP-Lite Header // UDP-Lite Header
///////////////////////////////////////////// /////////////////////////////////////////////
skipping to change at page 66, line 45 skipping to change at page 66, line 29
src_port [ 16 ]; src_port [ 16 ];
dst_port [ 16 ]; dst_port [ 16 ];
checksum_coverage [ 16 ]; checksum_coverage [ 16 ];
checksum [ 16 ]; checksum [ 16 ];
} }
CONTROL { CONTROL {
ENFORCE(profile == profile_value); ENFORCE(profile == profile_value);
ENFORCE(coverage_behavior.UVALUE == coverage_behavior_value); ENFORCE(coverage_behavior.UVALUE == coverage_behavior_value);
ENFORCE(reorder_ratio.UVALUE == reorder_ratio_value); ENFORCE(reorder_ratio.UVALUE == reorder_ratio_value);
coverage_behavior [ 2 ];
} }
DEFAULT { DEFAULT {
src_port =:= static; src_port =:= static;
dst_port =:= static; dst_port =:= static;
coverage_behavior =:= static;
} }
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_value == PROFILE_UDPLITE_0108); ENFORCE(profile_value == 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 =:= irregular(2) [ 2 ]; reorder_ratio =:= irregular(2) [ 2 ];
skipping to change at page 67, line 19 skipping to change at page 67, line 4
COMPRESSED udp_lite_endpoint_dynamic { COMPRESSED udp_lite_endpoint_dynamic {
ENFORCE(profile_value == PROFILE_UDPLITE_0108); ENFORCE(profile_value == 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 =:= irregular(2) [ 2 ]; reorder_ratio =:= irregular(2) [ 2 ];
checksum_coverage =:= checksum_coverage =:=
checksum_coverage_dynchain(coverage_behavior.UVALUE) [ 16 ]; checksum_coverage_dynchain(coverage_behavior.UVALUE) [ 16 ];
checksum =:= irregular(16) [ 16 ]; checksum =:= irregular(16) [ 16 ];
msn =:= irregular(16) [ 16 ]; msn =:= irregular(16) [ 16 ];
} }
COMPRESSED udp_lite_regular_dynamic { COMPRESSED udp_lite_regular_dynamic {
ENFORCE(profile_value == PROFILE_RTP_0107);
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 =:= irregular(16) [ 16 ]; checksum =:= irregular(16) [ 16 ];
} }
COMPRESSED udp_lite_irregular { COMPRESSED udp_lite_irregular {
checksum_coverage =:= checksum_coverage =:=
checksum_coverage_irregular(coverage_behavior.UVALUE) [ 0, 16 ]; checksum_coverage_irregular(coverage_behavior.UVALUE) [ 0, 16 ];
skipping to change at page 68, line 18 skipping to change at page 68, line 4
COMPRESSED esp_static { COMPRESSED esp_static {
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 ];
reorder_ratio =:= irregular(2) [ 2 ]; reorder_ratio =:= irregular(2) [ 2 ];
} }
COMPRESSED esp_irregular { COMPRESSED esp_irregular {
} }
} }
/////////////////////////////////////////////////// ///////////////////////////////////////////////////
// Encoding methods used in the profiles' CO packets // Encoding methods used in the profiles' CO headers
/////////////////////////////////////////////////// ///////////////////////////////////////////////////
// Variable reordering offset used for MSN // Variable reordering offset used for MSN
msn_lsb(k) msn_lsb(k)
{ {
UNCOMPRESSED { UNCOMPRESSED {
master [ VARIABLE ]; master [ VARIABLE ];
} }
COMPRESSED none { COMPRESSED none {
skipping to change at page 70, line 15 skipping to change at page 69, line 48
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)
{ {
UNCOMPRESSED { UNCOMPRESSED {
df [ 1 ]; df [ 0, 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);
unused =:= compressed_value(1, 0) [ 1 ]; unused =:= compressed_value(1, 0) [ 1 ];
skipping to change at page 74, line 22 skipping to change at page 74, line 7
ENFORCE(((tss_flag == 1) && (tsc_flag == 0)) || ENFORCE(((tss_flag == 1) && (tsc_flag == 0)) ||
((tss_flag == 0) && (tsc_flag == 0))); ((tss_flag == 0) && (tsc_flag == 0)));
timestamp =:= sdvl_lsb(32); timestamp =:= sdvl_lsb(32);
} }
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, ip_version)
{ {
UNCOMPRESSED { UNCOMPRESSED {
ip_outer_indicator [ 1 ]; ip_outer_indicator [ 1 ];
ttl_hopl_indicator [ 1 ]; ttl_hopl_indicator [ 1 ];
tos_tc_indicator [ 1 ]; tos_tc_indicator [ 1 ];
df [ 1 ]; df [ 0, 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(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; df =:= static;
skipping to change at page 75, line 5 skipping to change at page 74, line 39
ENFORCE(flag == 1); ENFORCE(flag == 1);
ip_outer_indicator =:= irregular(1) [ 1 ]; ip_outer_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 ]; df =:= dont_fragment(ip_version) [ 1 ];
ip_id_behavior =:= irregular(2) [ 2 ]; ip_id_behavior =:= irregular(2) [ 2 ];
reorder_ratio =:= irregular(2) [ 2 ]; reorder_ratio =:= irregular(2) [ 2 ];
} }
} }
profile_1_flags2_enc(flag, ip_version) profile_1_flags2_enc(flag)
{ {
UNCOMPRESSED { UNCOMPRESSED {
list_indicator [ 1 ]; list_indicator [ 1 ];
pt_indicator [ 1 ]; pt_indicator [ 1 ];
time_stride_indicator [ 1 ];
pad_bit [ 1 ]; pad_bit [ 1 ];
extension [ 1 ]; extension [ 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;
} }
skipping to change at page 75, line 39 skipping to change at page 75, line 25
pad_bit =:= irregular(1) [ 1 ]; pad_bit =:= irregular(1) [ 1 ];
extension =:= irregular(1) [ 1 ]; extension =:= irregular(1) [ 1 ];
reserved =:= compressed_value(3, 0) [ 3 ]; reserved =:= compressed_value(3, 0) [ 3 ];
} }
} }
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 ];
df [ 1 ]; df [ 0, 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);
df =:= static; df =:= static;
ip_id_behavior =:= static; ip_id_behavior =:= static;
} }
skipping to change at page 76, line 14 skipping to change at page 75, line 49
df =:= dont_fragment(ip_version) [ 1 ]; df =:= dont_fragment(ip_version) [ 1 ];
ip_id_behavior =:= irregular(2) [ 2 ]; ip_id_behavior =:= irregular(2) [ 2 ];
reserved =:= compressed_value(4, 0) [ 4 ]; reserved =:= compressed_value(4, 0) [ 4 ];
} }
} }
profile_8_flags_enc(flag, ip_version) profile_8_flags_enc(flag, ip_version)
{ {
UNCOMPRESSED { UNCOMPRESSED {
ip_outer_indicator [ 1 ]; ip_outer_indicator [ 1 ];
df [ 1 ]; df [ 0, 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);
df =:= static; df =:= static;
ip_id_behavior =:= static; ip_id_behavior =:= static;
coverage_behavior =:= static; coverage_behavior =:= static;
skipping to change at page 76, line 37 skipping to change at page 76, line 24
COMPRESSED present { COMPRESSED present {
ENFORCE(flag == 1); ENFORCE(flag == 1);
reserved =:= compressed_value(2, 0) [ 2 ]; reserved =:= compressed_value(2, 0) [ 2 ];
ip_outer_indicator =:= irregular(1) [ 1 ]; ip_outer_indicator =:= irregular(1) [ 1 ];
df =:= dont_fragment(ip_version) [ 1 ]; df =:= dont_fragment(ip_version) [ 1 ];
ip_id_behavior =:= irregular(2) [ 2 ]; ip_id_behavior =:= irregular(2) [ 2 ];
coverage_behavior =:= irregular(2) [ 2 ]; coverage_behavior =:= irregular(2) [ 2 ];
} }
} }
profile_7_flags2_enc(flag, ip_version) profile_7_flags2_enc(flag)
{ {
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 ];
coverage_behavior [ 2 ]; coverage_behavior [ 2 ];
} }
skipping to change at page 79, line 40 skipping to change at page 79, line 27
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;
ts_stride =:= static; ts_stride =:= static;
time_stride =:= static; time_stride =:= static;
ts_scaled =:= static; ts_scaled =:= static;
ts_offset =:= static; ts_offset =:= static;
reorder_ratio =:= static;
ip_id_behavior_innermost =:= static;
} }
// Replacement for UOR-2-ext3 // Replacement for UOR-2-ext3
COMPRESSED co_common { COMPRESSED co_common {
ENFORCE(outer_ip_flag == outer_ip_indicator.CVALUE); ENFORCE(outer_ip_flag == outer_ip_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 : ttl_hopl_indicator : outer_ip_indicator : ttl_hopl_indicator :
tos_tc_indicator : df : ip_id_behavior_innermost : reorder_ratio tos_tc_indicator : df : ip_id_behavior_innermost : reorder_ratio
=:= profile_1_7_flags1_enc(flags1_indicator.CVALUE) [ 0, 8 ]; =:= profile_1_7_flags1_enc(flags1_indicator.CVALUE,
list_indicator : pt_indicator : tis_indicator : pad_bit :
extension =:= profile_1_flags2_enc(flags2_indicator.CVALUE,
ip_version.UVALUE) [ 0, 8 ]; ip_version.UVALUE) [ 0, 8 ];
list_indicator : pt_indicator : tis_indicator : pad_bit :
extension =:= profile_1_flags2_enc(
flags2_indicator.CVALUE) [ 0, 8 ];
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 =:= pt_irr_or_static(pt_indicator) [ 0, 8 ]; payload_type =:= pt_irr_or_static(pt_indicator) [ 0, 8 ];
sequence_number =:= sequence_number =:=
sdvl_sn_lsb(sequence_number.ULENGTH) [ VARIABLE ]; sdvl_sn_lsb(sequence_number.ULENGTH) [ VARIABLE ];
ip_id =:= ip_id_sequential_variable( ip_id =:= ip_id_sequential_variable(
ip_id_behavior_innermost.UVALUE, ip_id_behavior_innermost.UVALUE,
ip_id_indicator.CVALUE) [ 0, 8, 16 ]; ip_id_indicator.CVALUE) [ 0, 8, 16 ];
ts_scaled =:= variable_scaled_timestamp(tss_indicator.CVALUE, ts_scaled =:= variable_scaled_timestamp(tss_indicator.CVALUE,
skipping to change at page 81, line 10 skipping to change at page 80, line 48
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_innermost.UVALUE == ENFORCE((ip_id_behavior_innermost.UVALUE ==
IP_ID_BEHAVIOR_RANDOM) || IP_ID_BEHAVIOR_RANDOM) ||
(ip_id_behavior_innermost.UVALUE == IP_ID_BEHAVIOR_ZERO)); (ip_id_behavior_innermost.UVALUE == IP_ID_BEHAVIOR_ZERO));
discriminator =:= '101' [ 3 ]; discriminator =:= '101' [ 3 ];
msn =:= msn_lsb(4) [ 4 ];
marker =:= irregular(1) [ 1 ]; marker =:= irregular(1) [ 1 ];
msn =:= msn_lsb(4) [ 4 ];
ts_scaled =:= scaled_ts_lsb(time_stride.UVALUE, 5) [ 5 ]; 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_innermost.UVALUE == ENFORCE((ip_id_behavior_innermost.UVALUE ==
IP_ID_BEHAVIOR_SEQUENTIAL) || IP_ID_BEHAVIOR_SEQUENTIAL) ||
(ip_id_behavior_innermost.UVALUE == (ip_id_behavior_innermost.UVALUE ==
IP_ID_BEHAVIOR_SEQUENTIAL_SWAPPED)); IP_ID_BEHAVIOR_SEQUENTIAL_SWAPPED));
skipping to change at page 81, line 41 skipping to change at page 81, line 31
ENFORCE(ts_stride.UVALUE != 0); ENFORCE(ts_stride.UVALUE != 0);
ENFORCE((ip_id_behavior_innermost.UVALUE == ENFORCE((ip_id_behavior_innermost.UVALUE ==
IP_ID_BEHAVIOR_SEQUENTIAL) || IP_ID_BEHAVIOR_SEQUENTIAL) ||
(ip_id_behavior_innermost.UVALUE == (ip_id_behavior_innermost.UVALUE ==
IP_ID_BEHAVIOR_SEQUENTIAL_SWAPPED)); IP_ID_BEHAVIOR_SEQUENTIAL_SWAPPED));
discriminator =:= '101' [ 3 ]; discriminator =:= '101' [ 3 ];
marker =:= irregular(1) [ 1 ]; marker =:= irregular(1) [ 1 ];
msn =:= msn_lsb(4) [ 4 ]; msn =:= msn_lsb(4) [ 4 ];
ts_scaled =:= scaled_ts_lsb(time_stride.UVALUE, 5) [ 5 ]; 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 ];
ip_id =:= inferred_sequential_ip_id [ 0 ];
} }
// 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_innermost.UVALUE == ENFORCE((ip_id_behavior_innermost.UVALUE ==
IP_ID_BEHAVIOR_RANDOM) || IP_ID_BEHAVIOR_RANDOM) ||
(ip_id_behavior_innermost.UVALUE == IP_ID_BEHAVIOR_ZERO)); (ip_id_behavior_innermost.UVALUE == IP_ID_BEHAVIOR_ZERO));
discriminator =:= '110' [ 3 ]; discriminator =:= '110' [ 3 ];
msn =:= msn_lsb(7) [ 7 ]; msn =:= msn_lsb(7) [ 7 ];
skipping to change at page 82, line 48 skipping to change at page 82, line 39
ENFORCE(ts_stride.UVALUE != 0); ENFORCE(ts_stride.UVALUE != 0);
ENFORCE((ip_id_behavior_innermost.UVALUE == ENFORCE((ip_id_behavior_innermost.UVALUE ==
IP_ID_BEHAVIOR_SEQUENTIAL) || IP_ID_BEHAVIOR_SEQUENTIAL) ||
(ip_id_behavior_innermost.UVALUE == (ip_id_behavior_innermost.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 ];
ip_id =:= inferred_sequential_ip_id [ 0 ];
} }
} }
//////////////////////////////////////////// ////////////////////////////////////////////
// UDP profile // UDP profile
//////////////////////////////////////////// ////////////////////////////////////////////
udp_baseheader(profile_value, outer_ip_flag, ip_id_behavior_value, udp_baseheader(profile_value, outer_ip_flag, ip_id_behavior_value,
reorder_ratio_value) reorder_ratio_value)
{ {
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 ];
skipping to change at page 84, line 23 skipping to change at page 84, line 16
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;
flow_label =:= static; flow_label =:= static;
next_header =:= static; next_header =:= static;
src_port =:= static; src_port =:= static;
dst_port =:= static; dst_port =:= static;
reorder_ratio =:= static;
ip_id_behavior_innermost =:= static;
} }
// Replacement for UOR-2-ext3 // Replacement for UOR-2-ext3
COMPRESSED co_common { COMPRESSED co_common {
ENFORCE(outer_ip_flag == outer_ip_indicator.CVALUE); ENFORCE(outer_ip_flag == outer_ip_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 ];
skipping to change at page 87, line 10 skipping to change at page 87, line 5
ENFORCE(outer_ip_flag == 0); ENFORCE(outer_ip_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;
flow_label =:= static; flow_label =:= static;
next_header =:= static; next_header =:= static;
spi =:= static; spi =:= static;
sequence_number =:= static; sequence_number =:= static;
reorder_ratio =:= static;
ip_id_behavior_innermost =:= static;
} }
// Replacement for UOR-2-ext3 // Replacement for UOR-2-ext3
COMPRESSED co_common { COMPRESSED co_common {
ENFORCE(outer_ip_flag == outer_ip_indicator.CVALUE); ENFORCE(outer_ip_flag == outer_ip_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 ];
skipping to change at page 89, line 39 skipping to change at page 89, line 36
DEFAULT { DEFAULT {
ENFORCE(outer_ip_flag == 0); ENFORCE(outer_ip_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;
flow_label =:= static; flow_label =:= static;
next_header =:= static; next_header =:= static;
reorder_ratio =:= static;
ip_id_behavior_innermost =:= static;
} }
// Replacement for UOR-2-ext3 // Replacement for UOR-2-ext3
COMPRESSED co_common { COMPRESSED co_common {
ENFORCE(outer_ip_flag == outer_ip_indicator.CVALUE); ENFORCE(outer_ip_flag == outer_ip_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 ];
skipping to change at page 90, line 26 skipping to change at page 90, line 25
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 ];
} }
// 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(7) [ 6 ]; msn =:= 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_innermost.UVALUE == ENFORCE((ip_id_behavior_innermost.UVALUE ==
IP_ID_BEHAVIOR_SEQUENTIAL) || IP_ID_BEHAVIOR_SEQUENTIAL) ||
(ip_id_behavior_innermost.UVALUE == (ip_id_behavior_innermost.UVALUE ==
IP_ID_BEHAVIOR_SEQUENTIAL_SWAPPED)); IP_ID_BEHAVIOR_SEQUENTIAL_SWAPPED));
skipping to change at page 92, line 41 skipping to change at page 92, line 40
} }
CONTROL { CONTROL {
ENFORCE(profile_value == PROFILE_RTP_0107); ENFORCE(profile_value == PROFILE_RTP_0107);
ENFORCE(profile == profile_value); ENFORCE(profile == profile_value);
ENFORCE(time_stride.UVALUE == time_stride_value); ENFORCE(time_stride.UVALUE == time_stride_value);
ENFORCE(ts_stride.UVALUE == ts_stride_value); ENFORCE(ts_stride.UVALUE == ts_stride_value);
ENFORCE(coverage_behavior.UVALUE == coverage_behavior_value); ENFORCE(coverage_behavior.UVALUE == coverage_behavior_value);
ENFORCE(reorder_ratio.UVALUE == reorder_ratio_value); ENFORCE(reorder_ratio.UVALUE == reorder_ratio_value);
ENFORCE(ip_id_behavior_innermost.UVALUE == ip_id_behavior_value); ENFORCE(ip_id_behavior_innermost.UVALUE == ip_id_behavior_value);
coverage_behavior [ 2 ];
dummy_field =:= field_scaling(ts_stride.UVALUE, dummy_field =:= field_scaling(ts_stride.UVALUE,
ts_scaled.UVALUE, timestamp.UVALUE, ts_offset.UVALUE) [ 0 ]; ts_scaled.UVALUE, timestamp.UVALUE, ts_offset.UVALUE) [ 0 ];
} }
INITIAL { INITIAL {
ts_stride =:= uncompressed_value(32, TS_STRIDE_DEFAULT); ts_stride =:= uncompressed_value(32, TS_STRIDE_DEFAULT);
time_stride =:= uncompressed_value(32, TIME_STRIDE_DEFAULT); time_stride =:= uncompressed_value(32, TIME_STRIDE_DEFAULT);
} }
DEFAULT { DEFAULT {
skipping to change at page 93, line 28 skipping to change at page 93, line 26
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;
ts_stride =:= static; ts_stride =:= static;
time_stride =:= static; time_stride =:= static;
ts_scaled =:= static; ts_scaled =:= static;
ts_offset =:= static; ts_offset =:= static;
reorder_ratio =:= static;
ip_id_behavior_innermost =:= static;
} }
// Replacement for UOR-2-ext3 // Replacement for UOR-2-ext3
COMPRESSED co_common { COMPRESSED co_common {
ENFORCE(outer_ip_flag == outer_ip_indicator.CVALUE); ENFORCE(outer_ip_flag == outer_ip_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 : ttl_hopl_indicator : outer_ip_indicator : ttl_hopl_indicator :
tos_tc_indicator : df : ip_id_behavior_innermost : reorder_ratio tos_tc_indicator : df : ip_id_behavior_innermost : reorder_ratio
=:= profile_1_7_flags1_enc(flags1_indicator.CVALUE) [ 0, 8 ]; =:= profile_1_7_flags1_enc(flags1_indicator.CVALUE,
list_indicator : tis_indicator : pt_indicator : pad_bit :
extension : coverage_behavior =:=
profile_7_flags2_enc(flags2_indicator.CVALUE,
ip_version.UVALUE) [ 0, 8 ]; ip_version.UVALUE) [ 0, 8 ];
list_indicator : pt_indicator : tis_indicator : pad_bit :
extension : coverage_behavior =:=
profile_7_flags2_enc(flags2_indicator.CVALUE) [ 0, 8 ];
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 =:=
ttl_hopl.ULENGTH) [ 0, 8 ]; static_or_irreg(ttl_hopl_indicator.CVALUE, 8) [ 0, 8 ];
payload_type =:= pt_irr_or_static(pt_indicator.CVALUE) [ 0, 8 ]; payload_type =:= pt_irr_or_static(pt_indicator.CVALUE) [ 0, 8 ];
sequence_number =:= sequence_number =:=
sdvl_sn_lsb(sequence_number.ULENGTH) [ VARIABLE ]; sdvl_sn_lsb(sequence_number.ULENGTH) [ VARIABLE ];
ip_id =:= ip_id_sequential_variable(ip_id_behavior_innermost.UVALUE, ip_id =:= ip_id_sequential_variable(ip_id_behavior_innermost.UVALUE,
ip_id_indicator.CVALUE) [ 0, 8, 16 ]; 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, tsc_indicator.CVALUE, ts_stride.UVALUE,
time_stride.UVALUE) [ VARIABLE ]; time_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 ];
skipping to change at page 94, line 47 skipping to change at page 94, line 47
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_innermost.UVALUE == ENFORCE((ip_id_behavior_innermost.UVALUE ==
IP_ID_BEHAVIOR_RANDOM) || IP_ID_BEHAVIOR_RANDOM) ||
(ip_id_behavior_innermost.UVALUE == IP_ID_BEHAVIOR_ZERO)); (ip_id_behavior_innermost.UVALUE == IP_ID_BEHAVIOR_ZERO));
discriminator =:= '101' [ 3 ]; discriminator =:= '101' [ 3 ];
msn =:= msn_lsb(4) [ 4 ];
marker =:= irregular(1) [ 1 ]; marker =:= irregular(1) [ 1 ];
msn =:= msn_lsb(4) [ 4 ];
ts_scaled =:= scaled_ts_lsb(time_stride.UVALUE, 5) [ 5 ]; 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_innermost.UVALUE == ENFORCE((ip_id_behavior_innermost.UVALUE ==
IP_ID_BEHAVIOR_SEQUENTIAL) || IP_ID_BEHAVIOR_SEQUENTIAL) ||
(ip_id_behavior_innermost.UVALUE == (ip_id_behavior_innermost.UVALUE ==
IP_ID_BEHAVIOR_SEQUENTIAL_SWAPPED)); IP_ID_BEHAVIOR_SEQUENTIAL_SWAPPED));
discriminator =:= '1001' [ 4 ]; discriminator =:= '1001' [ 4 ];
skipping to change at page 95, line 29 skipping to change at page 95, line 29
ENFORCE(ts_stride.UVALUE != 0); ENFORCE(ts_stride.UVALUE != 0);
ENFORCE((ip_id_behavior_innermost.UVALUE == ENFORCE((ip_id_behavior_innermost.UVALUE ==
IP_ID_BEHAVIOR_SEQUENTIAL) || IP_ID_BEHAVIOR_SEQUENTIAL) ||
(ip_id_behavior_innermost.UVALUE == (ip_id_behavior_innermost.UVALUE ==
IP_ID_BEHAVIOR_SEQUENTIAL_SWAPPED)); IP_ID_BEHAVIOR_SEQUENTIAL_SWAPPED));
discriminator =:= '101' [ 3 ]; discriminator =:= '101' [ 3 ];
marker =:= irregular(1) [ 1 ]; marker =:= irregular(1) [ 1 ];
msn =:= msn_lsb(4) [ 4 ]; msn =:= msn_lsb(4) [ 4 ];
ts_scaled =:= scaled_ts_lsb(time_stride.UVALUE, 5) [ 5 ]; 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 ];
ip_id =:= inferred_sequential_ip_id [ 0 ];
} }
// 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_innermost.UVALUE == ENFORCE((ip_id_behavior_innermost.UVALUE ==
IP_ID_BEHAVIOR_RANDOM) || IP_ID_BEHAVIOR_RANDOM) ||
(ip_id_behavior_innermost.UVALUE == IP_ID_BEHAVIOR_ZERO)); (ip_id_behavior_innermost.UVALUE == IP_ID_BEHAVIOR_ZERO));
discriminator =:= '110' [ 3 ]; discriminator =:= '110' [ 3 ];
msn =:= msn_lsb(7) [ 7 ]; msn =:= msn_lsb(7) [ 7 ];
skipping to change at page 96, line 36 skipping to change at page 96, line 37
ENFORCE(ts_stride.UVALUE != 0); ENFORCE(ts_stride.UVALUE != 0);
ENFORCE((ip_id_behavior_innermost.UVALUE == ENFORCE((ip_id_behavior_innermost.UVALUE ==
IP_ID_BEHAVIOR_SEQUENTIAL) || IP_ID_BEHAVIOR_SEQUENTIAL) ||
(ip_id_behavior_innermost.UVALUE == (ip_id_behavior_innermost.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 ];
ip_id =:= inferred_sequential_ip_id [ 0 ];
} }
} }
//////////////////////////////////////////// ////////////////////////////////////////////
// UDP-lite profile // UDP-lite profile
//////////////////////////////////////////// ////////////////////////////////////////////
udplite_baseheader(profile_value, outer_ip_flag, ip_id_behavior_value, udplite_baseheader(profile_value, outer_ip_flag, ip_id_behavior_value,
reorder_ratio_value, coverage_behavior_value) reorder_ratio_value, coverage_behavior_value)
{ {
skipping to change at page 97, line 47 skipping to change at page 97, line 49
df =:= uncompressed_value(0,0) [ 0 ]; df =:= uncompressed_value(0,0) [ 0 ];
ip_id =:= uncompressed_value(0,0) [ 0 ]; ip_id =:= uncompressed_value(0,0) [ 0 ];
} }
CONTROL { CONTROL {
ENFORCE(profile_value == PROFILE_UDPLITE_0108); ENFORCE(profile_value == PROFILE_UDPLITE_0108);
ENFORCE(profile == profile_value); ENFORCE(profile == profile_value);
ENFORCE(coverage_behavior.UVALUE == coverage_behavior_value); ENFORCE(coverage_behavior.UVALUE == coverage_behavior_value);
ENFORCE(reorder_ratio.UVALUE == reorder_ratio_value); ENFORCE(reorder_ratio.UVALUE == reorder_ratio_value);
ENFORCE(ip_id_behavior_innermost.UVALUE == ip_id_behavior_value); ENFORCE(ip_id_behavior_innermost.UVALUE == ip_id_behavior_value);
coverage_behavior [ 2 ];
} }
DEFAULT { DEFAULT {
ENFORCE(outer_ip_flag == 0); ENFORCE(outer_ip_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;
flow_label =:= static; flow_label =:= static;
next_header =:= static; next_header =:= static;
src_port =:= static; src_port =:= static;
dst_port =:= static; dst_port =:= static;
reorder_ratio =:= static;
ip_id_behavior_innermost =:= static;
} }
// Replacement for UOR-2-ext3 // Replacement for UOR-2-ext3
COMPRESSED co_common { COMPRESSED co_common {
ENFORCE(outer_ip_flag == outer_ip_indicator.CVALUE); ENFORCE(outer_ip_flag == outer_ip_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 ];
skipping to change at page 98, line 49 skipping to change at page 99, line 4
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 ];
} }
// 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(7) [ 6 ]; msn =:= 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_innermost.UVALUE == ENFORCE((ip_id_behavior_innermost.UVALUE ==
IP_ID_BEHAVIOR_SEQUENTIAL) || IP_ID_BEHAVIOR_SEQUENTIAL) ||
(ip_id_behavior_innermost.UVALUE == (ip_id_behavior_innermost.UVALUE ==
IP_ID_BEHAVIOR_SEQUENTIAL_SWAPPED)); IP_ID_BEHAVIOR_SEQUENTIAL_SWAPPED));
skipping to change at page 100, line 33 skipping to change at page 100, line 41
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)
Acknowledgment Number: The least significant bits of the MSN. 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 feedback type, the 'Size' field
the 'Code' octet, using the polynomial defined in [RFC4995], and the 'Code' octet, using the polynomial defined in [RFC4995],
Section 5.3.1.1. If the CID is given with an Add-CID octet, the Section 5.3.1.1. If the CID is given with an Add-CID octet, the
Add-CID octet immediately precedes the FEEDBACK-1 or FEEDBACK-2 Add-CID octet immediately precedes the FEEDBACK-1 or FEEDBACK-2
format. For purposes of computing the CRC, the CRC field is zero. format. For purposes of computing the 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 implicitly an A FEEDBACK-2 of type NACK or STATIC-NACK is always implicitly an
acknowledgment for a successfully decompressed packet, which acknowledgment for a successfully decompressed packet, which
corresponds to a packet whose LSBs match the Acknowledgment Number of corresponds to a packet whose LSBs match the Acknowledgment Number of
skipping to change at page 107, line 7 skipping to change at page 107, line 12
STATIC-KNOWN - These fields are expected to have well-known values STATIC-KNOWN - These fields are expected to have well-known values
and therefore do not need to be communicated at all. and therefore do not need to be communicated at all.
SEMISTATIC These fields are unchanged most of the time. However, SEMISTATIC These fields are unchanged most of the time. However,
occasionally the value changes but will revert to its original value. occasionally the value changes but will revert to its original value.
For ROHCv2, the values of such fields do not need to be possible to For ROHCv2, the values of such fields do not need to be possible to
change with the smallest compressed packet formats, but should be change with the smallest compressed packet formats, but should be
possible to change via slightly larger compressed packets. possible to change via slightly larger compressed packets.
RARELY CHANGING (RC) These are fields that change their values RARELY CHANGING (RACH) These are fields that change their values
occasionally and then keep their new values. For ROHCv2, the values occasionally and then keep their new values. For ROHCv2, the values
of such fields do not need to be possible to change with the smallest of such fields do not need to be possible to change with the smallest
compressed packet formats, but should be possible to change via compressed packet formats, but should be possible to change via
slightly larger compressed packets. slightly larger compressed packets.
IRREGULAR These are the fields for which no useful change pattern can IRREGULAR These are the fields for which no useful change pattern can
be identified and should be transmitted uncompressed in all be identified and should be transmitted uncompressed in all
compressed packets. compressed packets.
PATTERN These field that change between each packet, but change in a PATTERN These are fields that change between each packet, but change
predictable pattern. in a predictable pattern.
Appendix A.1. IPv4 Header Fields Appendix A.1. IPv4 Header Fields
+------------------------+----------------+ +------------------------+----------------+
| Field | Class | | Field | Class |
+------------------------+----------------+ +------------------------+----------------+
| Version | STATIC-KNOWN | | Version | STATIC-KNOWN |
| Header Length | STATIC-KNOWN | | Header Length | STATIC-KNOWN |
| Type Of Service | RC | | Type Of Service | RACH |
| Packet Length | INFERRED | | Packet Length | INFERRED |
| Identification | | | Identification | |
| Sequential | PATTERN | | Sequential | PATTERN |
| Seq. swap | PATTERN | | Seq. swap | PATTERN |
| Random | IRREGULAR | | Random | IRREGULAR |
| Zero | STATIC | | Zero | STATIC |
| Reserved flag | STATIC-KNOWN | | Reserved flag | STATIC-KNOWN |
| Don't Fragment flag | RC | | Don't Fragment flag | RACH |
| More Fragments flag | STATIC-KNOWN | | More Fragments flag | STATIC-KNOWN |
| Fragment Offset | STATIC-KNOWN | | Fragment Offset | STATIC-KNOWN |
| Time To Live | RC | | Time To Live | RACH |
| Protocol | STATIC-DEF | | Protocol | STATIC-DEF |
| Header Checksum | INFERRED | | Header Checksum | INFERRED |
| Source Address | STATIC-DEF | | Source Address | STATIC-DEF |
| Destination Address | STATIC-DEF | | Destination Address | STATIC-DEF |
+------------------------+----------------+ +------------------------+----------------+
Version Version
The version field states which IP version is used, and is set to The version field states which IP version is used, and is set to
the value four. the value four.
Header Length Header Length
As long no options are present in the IP header, the header length As long no options are present in the IP header, the header length
is constant with the value five. If there are options, the field is constant with the value five. If there are options, the field
could be RC or STATIC-DEF, but only option-less headers are could be RACH or STATIC-DEF, but only option-less headers are
compressed by ROHCv2 profiles. The field is therefore classified compressed by ROHCv2 profiles. The field is therefore classified
as STATIC-KNOWN. as STATIC-KNOWN.
Type Of Service Type Of Service
The Type Of Service field is expected to be constant during the The Type Of Service field is expected to be constant during the
lifetime of a flow or to change relatively seldom. lifetime of a flow or to change relatively seldom.
Packet Length Packet Length
Information about packet length is expected to be provided by the Information about packet length is expected to be provided by the
link layer. The field is therefore classified as INFERRED. link layer. The field is therefore classified as INFERRED.
skipping to change at page 108, line 47 skipping to change at page 109, line 4
compression to make it behave exactly as the Sequential compression to make it behave exactly as the Sequential
behavior. behavior.
Random Random
Some IP stacks assign IP ID values using a pseudo-random number Some IP stacks assign IP ID values using a pseudo-random number
generator. There is thus no correlation between the ID values generator. There is thus no correlation between the ID values
of subsequent datagrams, and therefore there is no way to of subsequent datagrams, and therefore there is no way to
predict the IP ID value for the next datagram. For header predict the IP ID value for the next datagram. For header
compression purposes, this means that the IP ID field needs to compression purposes, this means that the IP ID field needs to
be sent uncompressed with each datagram, resulting in two extra be sent uncompressed with each datagram, resulting in two extra
octets of header. octets of header.
Zero Zero
This behavior, although not a legal implementation of IPv4 is This behavior, although not a legal implementation of IPv4 is
sometimes seen in existing IPv4 stacks. When this behavior is sometimes seen in existing IPv4 stacks. When this behavior is
used, all IP packets have the IP-ID value set to zero. used, all IP packets have the IP-ID value set to zero.
Flags Flags
The Reserved flag must be set to zero and is therefore classified The Reserved flag must be set to zero and is therefore classified
as STATIC-KNOWN. The Don't Fragment (DF) flag will changes rarely as STATIC-KNOWN. The Don't Fragment (DF) flag will changes rarely
and is therefore classified as RC. Finally, the More Fragments and is therefore classified as RACH. Finally, the More Fragments
(MF) flag is expected to be zero because IP fragments will not be (MF) flag is expected to be zero because IP fragments will not be
compressed by ROHC and is therefore classified as STATIC-KNOWN. compressed by ROHC and is therefore classified as STATIC-KNOWN.
Fragment Offset Fragment Offset
Under the assumption that no fragmentation occurs, the fragment Under the assumption that no fragmentation occurs, the fragment
offset is always zero and is therefore classified as STATIC-KNOWN. offset is always zero and is therefore classified as STATIC-KNOWN.
Time To Live Time To Live
Time To Live field is expected to be constant during the lifetime Time To Live field is expected to be constant during the lifetime
of a flow or to alternate between a limited number of values due of a flow or to alternate between a limited number of values due
skipping to change at page 110, line 8 skipping to change at page 110, line 8
Source and Destination addresses Source and Destination addresses
These fields are part of the definition of a flow and must thus be These fields are part of the definition of a flow and must thus be
constant for all packets in the flow. constant for all packets in the flow.
Appendix A.2. IPv6 Header Fields Appendix A.2. IPv6 Header Fields
+----------------------+----------------+ +----------------------+----------------+
| Field | Class | | Field | Class |
+----------------------+----------------+ +----------------------+----------------+
| Version | STATIC-KNOWN | | Version | STATIC-KNOWN |
| Traffic Class | RC | | Traffic Class | RACH |
| Flow Label | STATIC-DEF | | Flow Label | STATIC-DEF |
| Payload Length | INFERRED | | Payload Length | INFERRED |
| Next Header | STATIC-DEF | | Next Header | STATIC-DEF |
| Hop Limit | RC | | Hop Limit | RACH |
| Source Address | STATIC-DEF | | Source Address | STATIC-DEF |
| Destination Address | STATIC-DEF | | Destination Address | STATIC-DEF |
+----------------------+----------------+ +----------------------+----------------+
Version Version
The version field states which IP version is used, and is set to The version field states which IP version is used, and is set to
the value six. the value six.
Traffic Class Traffic Class
The Traffic Class field is expected to be constant during the The Traffic Class field is expected to be constant during the
skipping to change at page 112, line 28 skipping to change at page 112, line 28
is governed by the value of the checksum coverage and minimally is governed by the value of the checksum coverage and minimally
includes the UDP-Lite header. The checksum is a changing field includes the UDP-Lite header. The checksum is a changing field
that must always be sent as-is. that must always be sent as-is.
Appendix A.5. RTP Header Fields Appendix A.5. RTP Header Fields
+----------------+----------------+ +----------------+----------------+
| Field | Class | | Field | Class |
+----------------+----------------+ +----------------+----------------+
| Version | STATIC-KNOWN | | Version | STATIC-KNOWN |
| Padding | RC | | Padding | RACH |
| Extension | RC | | Extension | RACH |
| CSRC Counter | RC | | CSRC Counter | RACH |
| Marker | SEMISTATIC | | Marker | SEMISTATIC |
| Payload Type | RC | | Payload Type | RACH |
| Sequence Number| PATTERN | | Sequence Number| PATTERN |
| Timestamp | PATTERN | | Timestamp | PATTERN |
| SSRC | STATIC-DEF | | SSRC | STATIC-DEF |
| CSRC | RC | | CSRC | RACH |
+----------------+----------------+ +----------------+----------------+
Version Version
This field is expected to have the value two and the field is This field is expected to have the value two and the field is
therefore classified as STATIC-KNOWN. therefore classified as STATIC-KNOWN.
Padding Padding
The use of this field is application-dependent, but when payload The use of this field is application-dependent, but when payload
padding is used it is likely to be present in most or all packets. padding is used it is likely to be present in most or all packets.
The field is classified as RC to allow for the case where the The field is classified as RACH to allow for the case where the
value of this field changes. value of this field changes.
Extension Extension
If RTP extensions are used by the application, these extensions If RTP extensions are used by the application, these extensions
are often present in all packets, although the use of extensions are often present in all packets, although the use of extensions
is infrequent. To allow efficient compression of a flow using is infrequent. To allow efficient compression of a flow using
extensions in only a few packets, this field is classified as RC. extensions in only a few packets, this field is classified as
RACH.
CSRC Count CSRC Count
This field indicates the number of CSRC items present in the CSRC This field indicates the number of CSRC items present in the CSRC
list. This number is expected to be mostly constant on a packet- list. This number is expected to be mostly constant on a packet-
to-packet basis and when it changes, change by small amounts. As to-packet basis and when it changes, change by small amounts. As
long as no RTP mixer is used, the value of this field will be long as no RTP mixer is used, the value of this field will be
zero. zero.
Marker Marker
For audio, the marker bit should be set only in the first packet For audio, the marker bit should be set only in the first packet
of a talkspurt, while for video it should be set in the last of a talkspurt, while for video it should be set in the last
packet of every picture. This means that in both cases the RTP packet of every picture. This means that in both cases the RTP
marker is classified as SEMISTATIC. marker is classified as SEMISTATIC.
Payload Type Payload Type
Applications could adapt to congestion by changing payload type Applications could adapt to congestion by changing payload type
and/or frame sizes, but that is not expected to happen frequently, and/or frame sizes, but that is not expected to happen frequently,
so this field is classified as RC. so this field is classified as RACH.
RTP Sequence Number RTP Sequence Number
The RTP Sequence Number will be incremented by one for each packet The RTP Sequence Number will be incremented by one for each packet
sent. sent.
Timestamp Timestamp
In the audio case: In the audio case:
As long as there are no pauses in the audio stream, the RTP As long as there are no pauses in the audio stream, the RTP
Timestamp will be incremented by a constant value, Timestamp will be incremented by a constant value,
corresponding to the number of samples in the speech frame. It corresponding to the number of samples in the speech frame. It
skipping to change at page 114, line 44 skipping to change at page 114, line 44
+-----------------------+---------------+ +-----------------------+---------------+
| Field | Class | | Field | Class |
+-----------------------+---------------+ +-----------------------+---------------+
| Next Header | STATIC-DEF | | Next Header | STATIC-DEF |
| Ext Hdr Len | | | Ext Hdr Len | |
| Routing | STATIC-DEF | | Routing | STATIC-DEF |
| Hop-by-hop | STATIC | | Hop-by-hop | STATIC |
| Destination | STATIC | | Destination | STATIC |
| Options | | | Options | |
| Routing | STATIC-DEF | | Routing | STATIC-DEF |
| Hop-by-hop | RC | | Hop-by-hop | RACH |
| Destination | RC | | Destination | RACH |
+-----------------------+---------------+ +-----------------------+---------------+
Next Header Next Header
This field will have the same value in all packets of a flow and This field will have the same value in all packets of a flow and
is therefore classified as STATIC-DEF. is therefore classified as STATIC-DEF.
Ext Hdr Len Ext Hdr Len
For the Routing header, it is expected that the length remains For the Routing header, it is expected that the length remains
constant for the duration of the flow, and a change in the length constant for the duration of the flow, and a change in the length
should be classified as a new flow by the ROHC compressor. For should be classified as a new flow by the ROHC compressor. For
skipping to change at page 119, line 26 skipping to change at page 119, line 26
This information may for example come from lower layers. This information may for example come from lower layers.
A compressor implementation can determine whether the difference in A compressor implementation can determine whether the difference in
clock resolution between compressor and decompressor induces an error clock resolution between compressor and decompressor induces an error
when performing integer arithmetics; it can then treat this error as when performing integer arithmetics; it can then treat this error as
additional jitter. additional jitter.
After obtaining estimates for the jitters, the number of bits needed After obtaining estimates for the jitters, the number of bits needed
to transmit is obtained using the following calculation: to transmit is obtained using the following calculation:
ceiling(log2(2 * (Max_Jitter_BC + Max_Jitter_CD + 2) + 1) ceiling(log2(2 * (Max_Jitter_BC + Max_Jitter_CD + 2) + 1))
This number is then used to select a packet format which contains at This number is then used to select a packet format which contains at
least this many scaled timestamp bits. least this many scaled timestamp bits.
Authors' Addresses Authors' Addresses
Ghyslain Pelletier Ghyslain Pelletier
Ericsson Ericsson
Box 920 Box 920
Lulea SE-971 28 Lulea SE-971 28
 End of changes. 140 change blocks. 
210 lines changed or deleted 216 lines changed or added

This html diff was produced by rfcdiff 1.34. The latest version is available from http://tools.ietf.org/tools/rfcdiff/