draft-ietf-rohc-rfc3095bis-rohcv2-profiles-03.txt   draft-ietf-rohc-rfc3095bis-rohcv2-profiles-04.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: June 15, 2008 December 13, 2007 Expires: July 14, 2008 January 11, 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-03 draft-ietf-rohc-rfc3095bis-rohcv2-profiles-04
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 June 15, 2008. This Internet-Draft will expire on July 14, 2008.
Copyright Notice Copyright Notice
Copyright (C) The IETF Trust (2007). 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
Datagram Protocol Lite), UDP/IP, UDP-Lite/IP, IP and ESP/IP Datagram Protocol Lite), UDP/IP, UDP-Lite/IP, IP and ESP/IP
(Encapsulating Security Payload) headers. (Encapsulating Security Payload) headers.
This specification defines a second version of the profiles found in This specification defines a second version of the profiles found in
skipping to change at page 3, line 24 skipping to change at page 3, line 24
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. Packet Formats . . . . . . . . . . . . . . . . . . . . . 39
6.8.1. Initialization and Refresh Packet (IR) . . . . . . . 39 6.8.1. Initialization and Refresh Packet (IR) . . . . . . . 39
6.8.2. Compressed Packet Formats (CO) . . . . . . . . . . . 41 6.8.2. Compressed Packet Formats (CO) . . . . . . . . . . . 41
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 . . . . . . . . . . . . . . . . . . . . . . . . . 105 10. References . . . . . . . . . . . . . . . . . . . . . . . . . 104
10.1. Normative References . . . . . . . . . . . . . . . . . . 105 10.1. Normative References . . . . . . . . . . . . . . . . . . 104
10.2. Informative References . . . . . . . . . . . . . . . . . 106 10.2. Informative References . . . . . . . . . . . . . . . . . 105
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 37, line 24 skipping to change at page 37, line 24
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:
o udp(profile, reorder_ratio_value) o udp(profile_value, reorder_ratio_value)
o udp_lite(profile, reorder_ratio_value, coverage_behavior_value) o udp_lite(profile_value, reorder_ratio_value,
o esp(profile, reorder_ratio_value) coverage_behavior_value)
o rtp(profile, ts_stride_value, time_stride_value, o esp(profile_value, reorder_ratio_value)
o rtp(profile_value, ts_stride_value, time_stride_value,
reorder_ratio_value) reorder_ratio_value)
o ipv4(profile, is_innermost, outer_ip_flag, ip_id_behavior_value, o ipv4(profile_value, is_innermost, outer_ip_flag,
ip_id_behavior_value, reorder_ratio_value))
o ipv6(profile_value, is_innermost, outer_ip_flag,
reorder_ratio_value)) reorder_ratio_value))
o ipv6(profile, is_innermost, outer_ip_flag, reorder_ratio_value)) o iponly_baseheader(profile_value, outer_ip_flag,
o iponly_baseheader(profile, outer_ip_flag, ip_id_behavior_value, ip_id_behavior_value, reorder_ratio_value)
reorder_ratio_value) o udp_baseheader(profile_value, outer_ip_flag, ip_id_behavior_value,
o udp_baseheader(profile, outer_ip_flag, ip_id_behavior_value,
reorder_ratio_value)
o udplite_baseheader(profile, outer_ip_flag, ip_id_behavior_value,
reorder_ratio_value) reorder_ratio_value)
o esp_baseheader(profile, outer_ip_flag, ip_id_behavior_value, o udplite_baseheader(profile_value, outer_ip_flag,
ip_id_behavior_value, reorder_ratio_value)
o esp_baseheader(profile_value, outer_ip_flag, ip_id_behavior_value,
reorder_ratio_value) reorder_ratio_value)
o rtp_baseheader(profile, ts_stride_value, time_stride_value, o rtp_baseheader(profile_value, ts_stride_value, time_stride_value,
outer_ip_flag, ip_id_behavior_value, reorder_ratio_value) outer_ip_flag, ip_id_behavior_value, reorder_ratio_value)
o udplite_rtp_baseheader(profile, ts_stride_value, o udplite_rtp_baseheader(profile_value, ts_stride_value,
time_stride_value, outer_ip_flag, ip_id_behavior_value, time_stride_value, outer_ip_flag, ip_id_behavior_value,
reorder_ratio_value, coverage_behavior_value) reorder_ratio_value, coverage_behavior_value)
The following applies for all parameters listed below: At the
compressor, the value of the parameter is set according to the
recommendations for each parameter. At the decompressor, the value
of the parameter is set to undefined and will get bound by encoding
methods, except where otherwise noted.
List of external arguments with their respective definition: List of external arguments with their respective definition:
o profile: o profile_value:
Set to the 16-bit number that identifies the profile used to Set to the 16-bit number that identifies the profile used to
compress this packet. compress this packet. When processing the static chain at the
decompressor, this parameter is set to the value of the profile
field in the IR header (see Section 6.8.1).
o reorder_ratio_value: o reorder_ratio_value:
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 REORDERING_ and as defined in name begins with the prefix REORDERING_ and as defined in
Section 6.8.2.4. Section 6.8.2.4.
o ip_id_behavior_value: o ip_id_behavior_value:
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
skipping to change at page 38, line 28 skipping to change at page 38, line 35
Section 6.8.2.4. Section 6.8.2.4.
o coverage_behavior_value: o coverage_behavior_value:
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 semi-static This parameter is set to 1 if at least one of the TOS/TC or
fields in outer IP headers has changed compared to their TTL/Hop Limit fields in outer IP headers has changed compared
reference values in the context, otherwise it is set to 0. The to their reference values in the context, otherwise it is set
value used for this parameter is also used for the to 0. This flag may only be set to 1 for the "co_common"
"outer_ip_flag" argument for a number of encoding methods packet format in the different profiles.
defined above, when these are processing the irregular chain.
This flag may only be set to 1 for the "co_common" packet
format in the different profiles.
o is_innermost: o is_innermost:
This boolean flag is set to 1 when processing the innermost IP This boolean flag is set to 1 when processing the innermost of
header; 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
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. Packet Formats
ROHCv2 profiles use two different packet types: the Initialization ROHCv2 profiles use two different packet types: the Initialization
skipping to change at page 46, line 22 skipping to change at page 46, line 22
// Default values for RTP timestamp encoding // Default values for RTP timestamp encoding
TS_STRIDE_DEFAULT = 160; TS_STRIDE_DEFAULT = 160;
TIME_STRIDE_DEFAULT = 0; TIME_STRIDE_DEFAULT = 0;
//////////////////////////////////////////// ////////////////////////////////////////////
// Global control fields // Global control fields
//////////////////////////////////////////// ////////////////////////////////////////////
CONTROL { CONTROL {
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 [ 16 ];
// 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 ];
skipping to change at page 46, line 52 skipping to change at page 47, line 4
inferred_ip_v4_length "defined in Section 6.6.6"; inferred_ip_v4_length "defined in Section 6.6.6";
inferred_ip_v6_length "defined in Section 6.6.7"; inferred_ip_v6_length "defined in Section 6.6.7";
inferred_mine_header_checksum "defined in Section 6.6.5"; inferred_mine_header_checksum "defined in Section 6.6.5";
inferred_scaled_field "defined in Section 6.6.10"; inferred_scaled_field "defined in Section 6.6.10";
inferred_sequential_ip_id "defined in Section 6.6.12"; inferred_sequential_ip_id "defined in Section 6.6.12";
inferred_udp_length "defined in Section 6.6.3"; inferred_udp_length "defined in Section 6.6.3";
list_csrc(cc_value) "defined in Section 6.6.13"; list_csrc(cc_value) "defined in Section 6.6.13";
timer_based_lsb(time_stride, k, p) "defined in Section 6.6.9"; timer_based_lsb(time_stride, k, p) "defined in Section 6.6.9";
//////////////////////////////////////////// ////////////////////////////////////////////
// General encoding methods
// General encoding methods
//////////////////////////////////////////// ////////////////////////////////////////////
static_or_irreg(flag, width) static_or_irreg(flag, width)
{ {
UNCOMPRESSED { UNCOMPRESSED {
field [ width ]; field [ width ];
} }
COMPRESSED irreg_enc { COMPRESSED irreg_enc {
ENFORCE(flag == 1); ENFORCE(flag == 1);
skipping to change at page 57, line 34 skipping to change at page 57, line 36
flow_label =:= uncompressed_value(20, 0) [ 0 ]; flow_label =:= uncompressed_value(20, 0) [ 0 ];
reserved =:= '0000' [ 4 ]; reserved =:= '0000' [ 4 ];
} }
COMPRESSED fl_non_zero { COMPRESSED fl_non_zero {
discriminator =:= '1' [ 1 ]; discriminator =:= '1' [ 1 ];
flow_label =:= irregular(20) [ 20 ]; flow_label =:= irregular(20) [ 20 ];
} }
} }
ipv6(profile, is_innermost, outer_ip_flag, reorder_ratio_value) ipv6(profile_value, is_innermost, outer_ip_flag, reorder_ratio_value)
{ {
UNCOMPRESSED { UNCOMPRESSED {
version =:= uncompressed_value(4, 6) [ 4 ]; version =:= uncompressed_value(4, 6) [ 4 ];
tos_tc [ 8 ]; tos_tc [ 8 ];
flow_label [ 20 ]; flow_label [ 20 ];
payload_length [ 16 ]; payload_length [ 16 ];
next_header [ 8 ]; next_header [ 8 ];
ttl_hopl [ 8 ]; ttl_hopl [ 8 ];
src_addr [ 128 ]; src_addr [ 128 ];
dst_addr [ 128 ]; dst_addr [ 128 ];
} }
CONTROL { CONTROL {
ENFORCE(profile == profile_value);
ENFORCE(reorder_ratio.UVALUE == reorder_ratio_value); ENFORCE(reorder_ratio.UVALUE == reorder_ratio_value);
ENFORCE(innermost_ip.UVALUE == is_innermost);
innermost_ip [ 1 ];
} }
DEFAULT { DEFAULT {
tos_tc =:= static; tos_tc =:= static;
flow_label =:= static; flow_label =:= static;
payload_length =:= inferred_ip_v6_length; payload_length =:= inferred_ip_v6_length;
next_header =:= static; next_header =:= static;
ttl_hopl =:= static; ttl_hopl =:= static;
src_addr =:= static; src_addr =:= static;
dst_addr =:= static; dst_addr =:= static;
} }
COMPRESSED ipv6_static { COMPRESSED ipv6_static {
version_flag =:= '1' [ 1 ]; version_flag =:= '1' [ 1 ];
reserved =:= '00' [ 2 ]; innermost_ip =:= irregular(1) [ 1 ];
flow_label =:= fl_enc [ 5, 21 ];
next_header =:= irregular(8) [ 8 ];
src_addr =:= irregular(128) [ 128 ];
dst_addr =:= irregular(128) [ 128 ];
}
COMPRESSED ipv6_endpoint_static {
ENFORCE((is_innermost == 1) &&
(profile == PROFILE_IP_0104));
version_flag =:= '1' [ 1 ];
innermost_indicator =:= compressed_value(1, 1) [ 1 ];
reserved =:= '0' [ 1 ]; reserved =:= '0' [ 1 ];
flow_label =:= fl_enc [ 5, 21 ]; flow_label =:= fl_enc [ 5, 21 ];
next_header =:= irregular(8) [ 8 ]; next_header =:= irregular(8) [ 8 ];
src_addr =:= irregular(128) [ 128 ]; src_addr =:= irregular(128) [ 128 ];
dst_addr =:= irregular(128) [ 128 ]; dst_addr =:= irregular(128) [ 128 ];
} }
COMPRESSED ipv6_endpoint_dynamic { COMPRESSED ipv6_endpoint_dynamic {
ENFORCE((is_innermost == 1) && ENFORCE((is_innermost == 1) &&
(profile == PROFILE_IP_0104)); (profile_value == PROFILE_IP_0104));
tos_tc =:= irregular(8) [ 8 ]; tos_tc =:= irregular(8) [ 8 ];
ttl_hopl =:= irregular(8) [ 8 ]; ttl_hopl =:= irregular(8) [ 8 ];
reserved =:= compressed_value(6, 0) [ 6 ]; reserved =:= compressed_value(6, 0) [ 6 ];
reorder_ratio =:= irregular(2) [ 2 ]; reorder_ratio =:= irregular(2) [ 2 ];
msn =:= irregular(16) [ 16 ]; msn =:= irregular(16) [ 16 ];
} }
COMPRESSED ipv6_regular_dynamic { COMPRESSED ipv6_regular_dynamic {
ENFORCE((is_innermost == 0) || ENFORCE((is_innermost == 0) ||
(profile != PROFILE_IP_0104)); (profile_value != PROFILE_IP_0104));
tos_tc =:= irregular(8) [ 8 ]; tos_tc =:= irregular(8) [ 8 ];
ttl_hopl =:= irregular(8) [ 8 ]; ttl_hopl =:= irregular(8) [ 8 ];
} }
COMPRESSED ipv6_outer_irregular { COMPRESSED ipv6_outer_irregular {
ENFORCE(is_innermost == 0); ENFORCE(is_innermost == 0);
tos_tc =:= tos_tc =:=
static_or_irreg(outer_ip_flag, 8) [ 0, 8 ]; static_or_irreg(outer_ip_flag, 8) [ 0, 8 ];
ttl_hopl =:= ttl_hopl =:=
static_or_irreg(outer_ip_flag, 8) [ 0, 8 ]; static_or_irreg(outer_ip_flag, 8) [ 0, 8 ];
skipping to change at page 60, line 22 skipping to change at page 60, line 15
ENFORCE(behavior == IP_ID_BEHAVIOR_RANDOM); ENFORCE(behavior == IP_ID_BEHAVIOR_RANDOM);
ip_id =:= irregular(16) [ 16 ]; ip_id =:= irregular(16) [ 16 ];
} }
COMPRESSED ip_id_zero { COMPRESSED ip_id_zero {
ENFORCE(behavior == IP_ID_BEHAVIOR_ZERO); ENFORCE(behavior == IP_ID_BEHAVIOR_ZERO);
ip_id =:= uncompressed_value(16, 0) [ 0 ]; ip_id =:= uncompressed_value(16, 0) [ 0 ];
} }
} }
ipv4(profile, is_innermost, outer_ip_flag, ip_id_behavior_value, ipv4(profile_value, is_innermost, outer_ip_flag, ip_id_behavior_value,
reorder_ratio_value) reorder_ratio_value)
{ {
UNCOMPRESSED { UNCOMPRESSED {
version =:= uncompressed_value(4, 4) [ 4 ]; version =:= uncompressed_value(4, 4) [ 4 ];
hdr_length =:= uncompressed_value(4, 5) [ 4 ]; hdr_length =:= uncompressed_value(4, 5) [ 4 ];
tos_tc [ 8 ]; tos_tc [ 8 ];
length =:= inferred_ip_v4_length [ 16 ]; length =:= inferred_ip_v4_length [ 16 ];
ip_id [ 16 ]; ip_id [ 16 ];
rf =:= uncompressed_value(1, 0) [ 1 ]; rf =:= uncompressed_value(1, 0) [ 1 ];
df [ 1 ]; df [ 1 ];
mf =:= uncompressed_value(1, 0) [ 1 ]; mf =:= uncompressed_value(1, 0) [ 1 ];
frag_offset =:= uncompressed_value(13, 0) [ 13 ]; frag_offset =:= uncompressed_value(13, 0) [ 13 ];
ttl_hopl [ 8 ]; ttl_hopl [ 8 ];
protocol [ 8 ]; protocol [ 8 ];
checksum =:= inferred_ip_v4_header_checksum [ 16 ]; checksum =:= inferred_ip_v4_header_checksum [ 16 ];
src_addr [ 32 ]; src_addr [ 32 ];
dst_addr [ 32 ]; dst_addr [ 32 ];
} }
CONTROL { CONTROL {
ENFORCE(profile == profile_value);
ENFORCE(reorder_ratio.UVALUE == reorder_ratio_value); ENFORCE(reorder_ratio.UVALUE == reorder_ratio_value);
ENFORCE(ip_id_behavior.UVALUE == ip_id_behavior_value); ENFORCE(innermost_ip.UVALUE == is_innermost);
ip_id_behavior_outer [ 2 ]; ip_id_behavior_outer [ 2 ];
innermost_ip [ 1 ];
} }
DEFAULT { DEFAULT {
tos_tc =:= static; tos_tc =:= static;
df =:= static; df =:= static;
ttl_hopl =:= static; ttl_hopl =:= static;
protocol =:= static; protocol =:= static;
src_addr =:= static; src_addr =:= static;
dst_addr =:= static; dst_addr =:= static;
ip_id_behavior =:= static; ip_id_behavior_outer =:= static;
} }
COMPRESSED ipv4_static { COMPRESSED ipv4_static {
version_flag =:= '0' [ 1 ]; version_flag =:= '0' [ 1 ];
reserved =:= '0000000' [ 7 ]; innermost_ip =:= irregular(1) [ 1 ];
protocol =:= irregular(8) [ 8 ];
src_addr =:= irregular(32) [ 32 ];
dst_addr =:= irregular(32) [ 32 ];
}
COMPRESSED ipv4_endpoint_static {
ENFORCE((is_innermost == 1) &&
(profile == PROFILE_IP_0104));
version_flag =:= '0' [ 1 ];
innermost_indicator =:= compressed_value(1, 1) [ 1 ];
reserved =:= '000000' [ 6 ]; reserved =:= '000000' [ 6 ];
protocol =:= irregular(8) [ 8 ]; protocol =:= irregular(8) [ 8 ];
src_addr =:= irregular(32) [ 32 ]; src_addr =:= irregular(32) [ 32 ];
dst_addr =:= irregular(32) [ 32 ]; dst_addr =:= irregular(32) [ 32 ];
} }
COMPRESSED ipv4_endpoint_innermost_dynamic { COMPRESSED ipv4_endpoint_innermost_dynamic {
ENFORCE((is_innermost == 1) && ENFORCE((is_innermost == 1) && (profile_value == PROFILE_IP_0104));
(profile == PROFILE_IP_0104)); ENFORCE(ip_id_behavior_innermost.UVALUE == ip_id_behavior_value);
reserved =:= '000' [ 3 ]; reserved =:= '000' [ 3 ];
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.UVALUE) [ 0, 16 ]; ip_id =:= ip_id_enc_dyn(ip_id_behavior_innermost.UVALUE) [ 0, 16 ];
msn =:= irregular(16) [ 16 ];
}
COMPRESSED ipv4_endpoint_outer_dynamic {
ENFORCE((is_innermost == 0) &&
(profile == PROFILE_IP_0104));
reserved =:= '000' [ 3 ];
reorder_ratio =:= irregular(2) [ 2 ];
df =:= irregular(1) [ 1 ];
ip_id_behavior_outer =:= irregular(2) [ 2 ];
tos_tc =:= irregular(8) [ 8 ];
ttl_hopl =:= irregular(8) [ 8 ];
ip_id =:= ip_id_enc_dyn(ip_id_behavior.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) || ENFORCE((is_innermost == 1) || (profile_value != PROFILE_IP_0104));
(profile != PROFILE_IP_0104)); 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.UVALUE) [ 0, 16 ]; ip_id =:= ip_id_enc_dyn(ip_id_behavior_innermost.UVALUE) [ 0, 16 ];
} }
COMPRESSED ipv4_regular_outer_dynamic { COMPRESSED ipv4_outer_dynamic {
ENFORCE((is_innermost == 0) || ENFORCE((is_innermost == 0) || (profile_value != PROFILE_IP_0104));
(profile != PROFILE_IP_0104)); 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.UVALUE) [ 0, 16 ]; ip_id =:= ip_id_enc_dyn(ip_id_behavior_outer.UVALUE) [ 0, 16 ];
} }
COMPRESSED ipv4_outer_irregular { COMPRESSED ipv4_outer_irregular {
ENFORCE(is_innermost == 0); ENFORCE(is_innermost == 0);
ip_id =:= ip_id =:=
ip_id_enc_irreg(ip_id_behavior_outer.UVALUE) [ 0, 16 ]; ip_id_enc_irreg(ip_id_behavior_outer.UVALUE) [ 0, 16 ];
tos_tc =:= static_or_irreg(outer_ip_flag, 8) [ 0, 8 ]; tos_tc =:= static_or_irreg(outer_ip_flag, 8) [ 0, 8 ];
ttl_hopl =:= static_or_irreg(outer_ip_flag, 8) [ 0, 8 ]; ttl_hopl =:= static_or_irreg(outer_ip_flag, 8) [ 0, 8 ];
} }
skipping to change at page 62, line 49 skipping to change at page 62, line 20
ip_id =:= ip_id =:=
ip_id_enc_irreg(ip_id_behavior_innermost.UVALUE) [ 0, 16 ]; ip_id_enc_irreg(ip_id_behavior_innermost.UVALUE) [ 0, 16 ];
} }
} }
///////////////////////////////////////////// /////////////////////////////////////////////
// UDP Header // UDP Header
///////////////////////////////////////////// /////////////////////////////////////////////
udp(profile, reorder_ratio_value) udp(profile_value, reorder_ratio_value)
{ {
UNCOMPRESSED { UNCOMPRESSED {
ENFORCE((profile == PROFILE_RTP_0101) || ENFORCE((profile_value == PROFILE_RTP_0101) ||
(profile == PROFILE_UDP_0102)); (profile_value == PROFILE_UDP_0102));
src_port [ 16 ]; src_port [ 16 ];
dst_port [ 16 ]; dst_port [ 16 ];
udp_length =:= inferred_udp_length [ 16 ]; udp_length =:= inferred_udp_length [ 16 ];
checksum [ 16 ]; checksum [ 16 ];
} }
CONTROL { CONTROL {
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;
} }
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 == 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 == PROFILE_RTP_0101); ENFORCE(profile_value == PROFILE_RTP_0101);
ENFORCE(checksum_used == (checksum.UVALUE != 0)); ENFORCE(checksum_used == (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 {
skipping to change at page 64, line 29 skipping to change at page 63, line 49
ENFORCE(presence == 0); ENFORCE(presence == 0);
csrc_list =:= uncompressed_value(0, 0) [ 0 ]; csrc_list =:= uncompressed_value(0, 0) [ 0 ];
} }
COMPRESSED list_present { COMPRESSED list_present {
ENFORCE(presence == 1); ENFORCE(presence == 1);
csrc_list =:= list_csrc(cc_value) [ VARIABLE ]; csrc_list =:= list_csrc(cc_value) [ VARIABLE ];
} }
} }
rtp(profile, ts_stride_value, time_stride_value, rtp(profile_value, ts_stride_value, time_stride_value,
reorder_ratio_value) reorder_ratio_value)
{ {
UNCOMPRESSED { UNCOMPRESSED {
ENFORCE((profile == PROFILE_RTP_0101) || ENFORCE((profile_value == PROFILE_RTP_0101) ||
(profile == PROFILE_RTP_0107)); (profile_value == PROFILE_RTP_0107));
rtp_version =:= uncompressed_value(2, 0) [ 2 ]; rtp_version =:= uncompressed_value(2, 0) [ 2 ];
pad_bit [ 1 ]; pad_bit [ 1 ];
extension [ 1 ]; extension [ 1 ];
cc [ 4 ]; cc [ 4 ];
marker [ 1 ]; marker [ 1 ];
payload_type [ 7 ]; payload_type [ 7 ];
sequence_number [ 16 ]; sequence_number [ 16 ];
timestamp [ 32 ]; timestamp [ 32 ];
ssrc [ 32 ]; ssrc [ 32 ];
csrc_list [ cc.UVALUE * 32 ]; csrc_list [ cc.UVALUE * 32 ];
} }
CONTROL { CONTROL {
ENFORCE(profile == profile_value);
ENFORCE(reorder_ratio.UVALUE == reorder_ratio_value); ENFORCE(reorder_ratio.UVALUE == reorder_ratio_value);
ENFORCE(time_stride_value == time_stride.UVALUE); ENFORCE(time_stride_value == time_stride.UVALUE);
ENFORCE(ts_stride_value == ts_stride.UVALUE); ENFORCE(ts_stride_value == ts_stride.UVALUE);
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);
skipping to change at page 67, line 8 skipping to change at page 66, line 30
ENFORCE(behavior == UDP_LITE_COVERAGE_STATIC); ENFORCE(behavior == UDP_LITE_COVERAGE_STATIC);
checksum_coverage =:= static [ 0 ]; checksum_coverage =:= static [ 0 ];
} }
COMPRESSED irregular_coverage { COMPRESSED irregular_coverage {
ENFORCE(behavior == UDP_LITE_COVERAGE_IRREGULAR); ENFORCE(behavior == UDP_LITE_COVERAGE_IRREGULAR);
checksum_coverage =:= irregular(16) [ 16 ]; checksum_coverage =:= irregular(16) [ 16 ];
} }
} }
udp_lite(profile, reorder_ratio_value, coverage_behavior_value) udp_lite(profile_value, reorder_ratio_value, coverage_behavior_value)
{ {
UNCOMPRESSED { UNCOMPRESSED {
ENFORCE((profile == PROFILE_RTP_0107) || ENFORCE((profile_value == PROFILE_RTP_0107) ||
(profile == PROFILE_UDPLITE_0108)); (profile_value == PROFILE_UDPLITE_0108));
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(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 ]; coverage_behavior [ 2 ];
} }
DEFAULT { DEFAULT {
src_port =:= static; src_port =:= static;
dst_port =:= static; dst_port =:= 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 == 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 {
skipping to change at page 68, line 17 skipping to change at page 67, line 39
checksum_coverage =:= checksum_coverage =:=
checksum_coverage_irregular(coverage_behavior.UVALUE) [ 0, 16 ]; checksum_coverage_irregular(coverage_behavior.UVALUE) [ 0, 16 ];
checksum =:= irregular(16) [ 16 ]; checksum =:= irregular(16) [ 16 ];
} }
} }
///////////////////////////////////////////// /////////////////////////////////////////////
// ESP Header // ESP Header
///////////////////////////////////////////// /////////////////////////////////////////////
esp(profile, reorder_ratio_value) esp(profile_value, reorder_ratio_value)
{ {
UNCOMPRESSED { UNCOMPRESSED {
ENFORCE(profile == PROFILE_ESP_0103); ENFORCE(profile_value == PROFILE_ESP_0103);
ENFORCE(msn.UVALUE == sequence_number.UVALUE % 65536); ENFORCE(msn.UVALUE == sequence_number.UVALUE % 65536);
spi [ 32 ]; spi [ 32 ];
sequence_number [ 32 ]; sequence_number [ 32 ];
} }
CONTROL { CONTROL {
ENFORCE(profile == profile_value);
ENFORCE(reorder_ratio.UVALUE == reorder_ratio_value); ENFORCE(reorder_ratio.UVALUE == reorder_ratio_value);
} }
DEFAULT { DEFAULT {
spi =:= static; spi =:= static;
sequence_number =:= static; sequence_number =:= static;
} }
COMPRESSED esp_static { COMPRESSED esp_static {
spi =:= irregular(32) [ 32 ]; spi =:= irregular(32) [ 32 ];
} }
COMPRESSED esp_dynamic { COMPRESSED esp_dynamic {
skipping to change at page 78, line 5 skipping to change at page 77, line 26
pad_bit =:= irregular(1) [ 1 ]; pad_bit =:= irregular(1) [ 1 ];
extension =:= irregular(1) [ 1 ]; extension =:= irregular(1) [ 1 ];
coverage_behavior =:= irregular(2) [ 2 ]; coverage_behavior =:= irregular(2) [ 2 ];
} }
} }
//////////////////////////////////////////// ////////////////////////////////////////////
// RTP profile // RTP profile
//////////////////////////////////////////// ////////////////////////////////////////////
rtp_baseheader(profile, ts_stride_value, time_stride_value, rtp_baseheader(profile_value, ts_stride_value, time_stride_value,
outer_ip_flag, ip_id_behavior_value, outer_ip_flag, ip_id_behavior_value,
reorder_ratio_value) reorder_ratio_value)
{ {
UNCOMPRESSED v4 { UNCOMPRESSED v4 {
ENFORCE(msn.UVALUE == sequence_number.UVALUE); ENFORCE(msn.UVALUE == sequence_number.UVALUE);
outer_headers =:= baseheader_outer_headers [ VARIABLE ]; outer_headers =:= baseheader_outer_headers [ VARIABLE ];
ip_version =:= uncompressed_value(4, 4) [ 4 ]; ip_version =:= uncompressed_value(4, 4) [ 4 ];
header_length =:= uncompressed_value(4, 5) [ 4 ]; header_length =:= uncompressed_value(4, 5) [ 4 ];
tos_tc [ 8 ]; tos_tc [ 8 ];
length =:= inferred_ip_v4_length [ 16 ]; length =:= inferred_ip_v4_length [ 16 ];
skipping to change at page 78, line 44 skipping to change at page 78, line 17
cc [ 4 ]; cc [ 4 ];
marker [ 1 ]; marker [ 1 ];
payload_type [ 7 ]; payload_type [ 7 ];
sequence_number [ 16 ]; sequence_number [ 16 ];
timestamp [ 32 ]; timestamp [ 32 ];
ssrc [ 32 ]; ssrc [ 32 ];
csrc_list [ VARIABLE ]; csrc_list [ VARIABLE ];
} }
UNCOMPRESSED v6 { UNCOMPRESSED v6 {
ENFORCE(ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_RANDOM); ENFORCE(ip_id_behavior_innermost.UVALUE == IP_ID_BEHAVIOR_RANDOM);
ENFORCE(msn.UVALUE == sequence_number.UVALUE); ENFORCE(msn.UVALUE == sequence_number.UVALUE);
outer_headers =:= baseheader_outer_headers [ VARIABLE ]; outer_headers =:= baseheader_outer_headers [ VARIABLE ];
ip_version =:= uncompressed_value(4, 6) [ 4 ]; ip_version =:= uncompressed_value(4, 6) [ 4 ];
tos_tc [ 8 ]; tos_tc [ 8 ];
flow_label [ 20 ]; flow_label [ 20 ];
payload_length =:= inferred_ip_v6_length [ 16 ]; payload_length =:= inferred_ip_v6_length [ 16 ];
next_header [ 8 ]; next_header [ 8 ];
ttl_hopl [ 8 ]; ttl_hopl [ 8 ];
src_addr [ 128 ]; src_addr [ 128 ];
dest_addr [ 128 ]; dest_addr [ 128 ];
skipping to change at page 79, line 26 skipping to change at page 78, line 48
payload_type [ 7 ]; payload_type [ 7 ];
sequence_number [ 16 ]; sequence_number [ 16 ];
timestamp [ 32 ]; timestamp [ 32 ];
ssrc [ 32 ]; ssrc [ 32 ];
csrc_list [ VARIABLE ]; csrc_list [ VARIABLE ];
df =:= uncompressed_value(0,0) [ 0 ]; 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_RTP_0101);
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(reorder_ratio.UVALUE == reorder_ratio_value); ENFORCE(reorder_ratio.UVALUE == reorder_ratio_value);
ENFORCE(ip_id_behavior.UVALUE == ip_id_behavior_value); ENFORCE(ip_id_behavior_innermost.UVALUE == ip_id_behavior_value);
ENFORCE(profile == PROFILE_RTP_0101);
ip_id_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 {
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;
ip_id_behavior =:= static;
flow_label =:= static; flow_label =:= static;
next_header =:= static; next_header =:= static;
src_port =:= static; src_port =:= static;
dst_port =:= static; dst_port =:= static;
pad_bit =:= static; pad_bit =:= static;
extension =:= static; extension =:= static;
cc =:= static; cc =:= static;
// When marker not present in packets, it is assumed 0 // When marker not present in packets, it is assumed 0
marker =:= uncompressed_value(1, 0); marker =:= uncompressed_value(1, 0);
payload_type =:= static; payload_type =:= static;
skipping to change at page 80, line 35 skipping to change at page 80, line 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 : 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) [ 0, 8 ];
list_indicator : pt_indicator : tis_indicator : pad_bit : list_indicator : pt_indicator : tis_indicator : pad_bit :
extension =:= profile_1_flags2_enc(flags2_indicator.CVALUE, extension =:= profile_1_flags2_enc(flags2_indicator.CVALUE,
ip_version.UVALUE) [ 0, 8 ]; ip_version.UVALUE) [ 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_behavior.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 ];
ts_stride =:= sdvl_or_static(tss_indicator.CVALUE) [ VARIABLE ]; ts_stride =:= sdvl_or_static(tss_indicator.CVALUE) [ VARIABLE ];
time_stride =:= sdvl_or_static(tis_indicator.CVALUE) [ VARIABLE ]; time_stride =:= sdvl_or_static(tis_indicator.CVALUE) [ VARIABLE ];
csrc_list =:= csrc_list_presence(list_indicator.CVALUE, csrc_list =:= csrc_list_presence(list_indicator.CVALUE,
cc.UVALUE) [ VARIABLE ]; cc.UVALUE) [ VARIABLE ];
skipping to change at page 81, line 32 skipping to change at page 81, line 6
discriminator =:= '1000' [ 4 ]; discriminator =:= '1000' [ 4 ];
msn =:= msn_lsb(5) [ 5 ]; msn =:= msn_lsb(5) [ 5 ];
header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ]; header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ];
timestamp =:= inferred_scaled_field [ 0 ]; timestamp =:= inferred_scaled_field [ 0 ];
ip_id =:= inferred_sequential_ip_id [ 0 ]; ip_id =:= inferred_sequential_ip_id [ 0 ];
} }
// UO-1 replacement // UO-1 replacement
COMPRESSED pt_1_rnd { COMPRESSED pt_1_rnd {
ENFORCE(ts_stride.UVALUE != 0); ENFORCE(ts_stride.UVALUE != 0);
ENFORCE((ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_RANDOM) || ENFORCE((ip_id_behavior_innermost.UVALUE ==
(ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_ZERO)); IP_ID_BEHAVIOR_RANDOM) ||
(ip_id_behavior_innermost.UVALUE == IP_ID_BEHAVIOR_ZERO));
discriminator =:= '101' [ 3 ]; discriminator =:= '101' [ 3 ];
msn =:= msn_lsb(4) [ 4 ]; msn =:= msn_lsb(4) [ 4 ];
marker =:= irregular(1) [ 1 ]; marker =:= irregular(1) [ 1 ];
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.UVALUE == IP_ID_BEHAVIOR_SEQUENTIAL) || ENFORCE((ip_id_behavior_innermost.UVALUE ==
(ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_SEQUENTIAL) ||
(ip_id_behavior_innermost.UVALUE ==
IP_ID_BEHAVIOR_SEQUENTIAL_SWAPPED)); IP_ID_BEHAVIOR_SEQUENTIAL_SWAPPED));
discriminator =:= '1001' [ 4 ]; discriminator =:= '1001' [ 4 ];
ip_id =:= ip_id_lsb(ip_id_behavior.UVALUE, 4) [ 4 ]; ip_id =:= ip_id_lsb(ip_id_behavior_innermost.UVALUE, 4) [ 4 ];
msn =:= msn_lsb(5) [ 5 ]; msn =:= msn_lsb(5) [ 5 ];
header_crc =:= crc3(THIS.UVALUE, THIS.ULENGTH) [ 3 ]; header_crc =:= crc3(THIS.UVALUE, THIS.ULENGTH) [ 3 ];
timestamp =:= inferred_scaled_field [ 0 ]; timestamp =:= inferred_scaled_field [ 0 ];
} }
// UO-1-TS replacement // UO-1-TS replacement
COMPRESSED pt_1_seq_ts { COMPRESSED pt_1_seq_ts {
ENFORCE(ts_stride.UVALUE != 0); ENFORCE(ts_stride.UVALUE != 0);
ENFORCE((ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_SEQUENTIAL) || ENFORCE((ip_id_behavior_innermost.UVALUE ==
(ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_SEQUENTIAL) ||
(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 ];
} }
// UOR-2 replacement // UOR-2 replacement
COMPRESSED pt_2_rnd { COMPRESSED pt_2_rnd {
ENFORCE(ts_stride.UVALUE != 0); ENFORCE(ts_stride.UVALUE != 0);
ENFORCE((ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_RANDOM) || ENFORCE((ip_id_behavior_innermost.UVALUE ==
(ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_ZERO)); IP_ID_BEHAVIOR_RANDOM) ||
(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 ];
ts_scaled =:= scaled_ts_lsb(time_stride.UVALUE, 6) [ 6 ]; ts_scaled =:= scaled_ts_lsb(time_stride.UVALUE, 6) [ 6 ];
marker =:= irregular(1) [ 1 ]; marker =:= irregular(1) [ 1 ];
header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ]; header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ];
} }
// UOR-2-ID replacement // UOR-2-ID replacement
COMPRESSED pt_2_seq_id { COMPRESSED pt_2_seq_id {
ENFORCE((ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_SEQUENTIAL) || ENFORCE((ip_id_behavior_innermost.UVALUE ==
(ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_SEQUENTIAL) ||
(ip_id_behavior_innermost.UVALUE ==
IP_ID_BEHAVIOR_SEQUENTIAL_SWAPPED)); IP_ID_BEHAVIOR_SEQUENTIAL_SWAPPED));
discriminator =:= '11000' [ 5 ]; discriminator =:= '11000' [ 5 ];
msn =:= msn_lsb(7) [ 7 ]; msn =:= msn_lsb(7) [ 7 ];
ip_id =:= ip_id_lsb(ip_id_behavior.UVALUE, 5) [ 5 ]; ip_id =:= ip_id_lsb(ip_id_behavior_innermost.UVALUE, 5) [ 5 ];
header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ]; header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ];
timestamp =:= inferred_scaled_field [ 0 ]; timestamp =:= inferred_scaled_field [ 0 ];
} }
// UOR-2-ID-ext1 replacement (both TS and IP-ID) // UOR-2-ID-ext1 replacement (both TS and IP-ID)
COMPRESSED pt_2_seq_both { COMPRESSED pt_2_seq_both {
ENFORCE(ts_stride.UVALUE != 0); ENFORCE(ts_stride.UVALUE != 0);
ENFORCE((ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_SEQUENTIAL) || ENFORCE((ip_id_behavior_innermost.UVALUE ==
(ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_SEQUENTIAL) ||
(ip_id_behavior_innermost.UVALUE ==
IP_ID_BEHAVIOR_SEQUENTIAL_SWAPPED)); IP_ID_BEHAVIOR_SEQUENTIAL_SWAPPED));
discriminator =:= '11001' [ 5 ]; discriminator =:= '11001' [ 5 ];
msn =:= msn_lsb(7) [ 7 ]; msn =:= msn_lsb(7) [ 7 ];
ip_id =:= ip_id_lsb(ip_id_behavior.UVALUE, 5) [ 5 ]; ip_id =:= ip_id_lsb(ip_id_behavior_innermost.UVALUE, 5) [ 5 ];
header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ]; header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ];
ts_scaled =:= scaled_ts_lsb(time_stride.UVALUE, 7) [ 7 ]; ts_scaled =:= scaled_ts_lsb(time_stride.UVALUE, 7) [ 7 ];
marker =:= irregular(1) [ 1 ]; marker =:= irregular(1) [ 1 ];
} }
// UOR-2-TS replacement // UOR-2-TS replacement
COMPRESSED pt_2_seq_ts { COMPRESSED pt_2_seq_ts {
ENFORCE(ts_stride.UVALUE != 0); ENFORCE(ts_stride.UVALUE != 0);
ENFORCE((ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_SEQUENTIAL) || ENFORCE((ip_id_behavior_innermost.UVALUE ==
(ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_SEQUENTIAL) ||
(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 ];
} }
} }
//////////////////////////////////////////// ////////////////////////////////////////////
skipping to change at page 83, line 22 skipping to change at page 83, line 4
IP_ID_BEHAVIOR_SEQUENTIAL_SWAPPED)); IP_ID_BEHAVIOR_SEQUENTIAL_SWAPPED));
discriminator =:= '1101' [ 4 ]; discriminator =:= '1101' [ 4 ];
msn =:= msn_lsb(7) [ 7 ]; msn =:= msn_lsb(7) [ 7 ];
ts_scaled =:= scaled_ts_lsb(time_stride.UVALUE, 5) [ 5 ]; ts_scaled =:= scaled_ts_lsb(time_stride.UVALUE, 5) [ 5 ];
marker =:= irregular(1) [ 1 ]; marker =:= irregular(1) [ 1 ];
header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ]; header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ];
} }
} }
//////////////////////////////////////////// ////////////////////////////////////////////
// UDP profile // UDP profile
//////////////////////////////////////////// ////////////////////////////////////////////
udp_baseheader(profile, outer_ip_flag, 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 ];
tos_tc [ 8 ]; tos_tc [ 8 ];
length =:= inferred_ip_v4_length [ 16 ]; length =:= inferred_ip_v4_length [ 16 ];
ip_id [ 16 ]; ip_id [ 16 ];
rf =:= uncompressed_value(1, 0) [ 1 ]; rf =:= uncompressed_value(1, 0) [ 1 ];
skipping to change at page 84, line 22 skipping to change at page 84, line 4
src_addr [ 128 ]; src_addr [ 128 ];
dest_addr [ 128 ]; dest_addr [ 128 ];
extension_headers =:= baseheader_extension_headers [ VARIABLE ]; extension_headers =:= baseheader_extension_headers [ VARIABLE ];
src_port [ 16 ]; src_port [ 16 ];
dst_port [ 16 ]; dst_port [ 16 ];
udp_length =:= inferred_udp_length [ 16 ]; udp_length =:= inferred_udp_length [ 16 ];
udp_checksum [ 16 ]; udp_checksum [ 16 ];
df =:= uncompressed_value(0,0) [ 0 ]; 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_UDP_0102);
ENFORCE(profile == profile_value);
ENFORCE(reorder_ratio.UVALUE == reorder_ratio_value); ENFORCE(reorder_ratio.UVALUE == reorder_ratio_value);
ENFORCE(ip_id_behavior.UVALUE == ip_id_behavior_value); ENFORCE(ip_id_behavior_innermost.UVALUE == ip_id_behavior_value);
ENFORCE(profile == PROFILE_UDP_0102);
ip_id_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;
ip_version =:= static; ip_version =:= static;
ttl_hopl =:= static; ttl_hopl =:= static;
src_addr =:= static; src_addr =:= static;
df =:= static; df =:= static;
ip_id_behavior =:= static;
flow_label =:= static; flow_label =:= static;
next_header =:= static; next_header =:= static;
src_port =:= static; src_port =:= static;
dst_port =:= static; dst_port =:= 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 ];
tos_tc_indicator =:= irregular(1) [ 1 ]; tos_tc_indicator =:= irregular(1) [ 1 ];
reorder_ratio =:= irregular(2) [ 2 ]; reorder_ratio =:= irregular(2) [ 2 ];
control_crc3 =:= control_crc3_encoding [ 3 ]; control_crc3 =:= control_crc3_encoding [ 3 ];
outer_ip_indicator : df : ip_id_behavior =:= outer_ip_indicator : df : ip_id_behavior_innermost =:=
profile_2_3_4_flags_enc( profile_2_3_4_flags_enc(
flags_indicator.CVALUE, ip_version.UVALUE) [ 0, 8 ]; flags_indicator.CVALUE, ip_version.UVALUE) [ 0, 8 ];
tos_tc =:= static_or_irreg(tos_tc_indicator.CVALUE, 8) [ 0, 8 ]; tos_tc =:= static_or_irreg(tos_tc_indicator.CVALUE, 8) [ 0, 8 ];
ttl_hopl =:= static_or_irreg(ttl_hopl_indicator.CVALUE, ttl_hopl =:= static_or_irreg(ttl_hopl_indicator.CVALUE,
ttl_hopl.ULENGTH) [ 0, 8 ]; ttl_hopl.ULENGTH) [ 0, 8 ];
msn =:= msn_lsb(8) [ 8 ]; msn =:= msn_lsb(8) [ 8 ];
ip_id =:= ip_id_sequential_variable(ip_id_behavior.UVALUE, 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 ];
} }
// UO-0 // UO-0
COMPRESSED pt_0_crc3 { COMPRESSED pt_0_crc3 {
discriminator =:= '0' [ 1 ]; discriminator =:= '0' [ 1 ];
msn =:= msn_lsb(4) [ 4 ]; msn =:= msn_lsb(4) [ 4 ];
header_crc =:= crc3(THIS.UVALUE, THIS.ULENGTH) [ 3 ]; header_crc =:= crc3(THIS.UVALUE, THIS.ULENGTH) [ 3 ];
ip_id =:= inferred_sequential_ip_id [ 0 ]; ip_id =:= inferred_sequential_ip_id [ 0 ];
} }
skipping to change at page 85, line 37 skipping to change at page 85, line 17
// New format, Type 0 with strong CRC and more SN bits // New format, Type 0 with strong CRC and more SN bits
COMPRESSED pt_0_crc7 { COMPRESSED pt_0_crc7 {
discriminator =:= '100' [ 3 ]; discriminator =:= '100' [ 3 ];
msn =:= msn_lsb(6) [ 6 ]; 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.UVALUE == IP_ID_BEHAVIOR_SEQUENTIAL) || ENFORCE((ip_id_behavior_innermost.UVALUE ==
(ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_SEQUENTIAL) ||
(ip_id_behavior_innermost.UVALUE ==
IP_ID_BEHAVIOR_SEQUENTIAL_SWAPPED)); IP_ID_BEHAVIOR_SEQUENTIAL_SWAPPED));
discriminator =:= '101' [ 3 ]; discriminator =:= '101' [ 3 ];
header_crc =:= crc3(THIS.UVALUE, THIS.ULENGTH) [ 3 ]; header_crc =:= crc3(THIS.UVALUE, THIS.ULENGTH) [ 3 ];
msn =:= msn_lsb(6) [ 6 ]; msn =:= msn_lsb(6) [ 6 ];
ip_id =:= ip_id_lsb(ip_id_behavior.UVALUE, 4) [ 4 ]; ip_id =:= ip_id_lsb(ip_id_behavior_innermost.UVALUE, 4) [ 4 ];
} }
// UOR-2-ID replacement // UOR-2-ID replacement
COMPRESSED pt_2_seq_id { COMPRESSED pt_2_seq_id {
ENFORCE((ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_SEQUENTIAL) || ENFORCE((ip_id_behavior_innermost.UVALUE ==
(ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_SEQUENTIAL) ||
(ip_id_behavior_innermost.UVALUE ==
IP_ID_BEHAVIOR_SEQUENTIAL_SWAPPED)); IP_ID_BEHAVIOR_SEQUENTIAL_SWAPPED));
discriminator =:= '110' [ 3 ]; discriminator =:= '110' [ 3 ];
ip_id =:= ip_id_lsb(ip_id_behavior.UVALUE, 6) [ 6 ]; ip_id =:= ip_id_lsb(ip_id_behavior_innermost.UVALUE, 6) [ 6 ];
header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ]; header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ];
msn =:= msn_lsb(8) [ 8 ]; msn =:= msn_lsb(8) [ 8 ];
} }
} }
//////////////////////////////////////////// ////////////////////////////////////////////
// ESP profile // ESP profile
//////////////////////////////////////////// ////////////////////////////////////////////
esp_baseheader(profile, outer_ip_flag, ip_id_behavior_value, esp_baseheader(profile_value, outer_ip_flag, ip_id_behavior_value,
reorder_ratio_value) reorder_ratio_value)
{ {
UNCOMPRESSED v4 { UNCOMPRESSED v4 {
ENFORCE(msn.UVALUE == sequence_number.UVALUE % 65536); ENFORCE(msn.UVALUE == sequence_number.UVALUE % 65536);
outer_headers =:= baseheader_outer_headers [ VARIABLE ]; outer_headers =:= baseheader_outer_headers [ VARIABLE ];
ip_version =:= uncompressed_value(4, 4) [ 4 ]; ip_version =:= uncompressed_value(4, 4) [ 4 ];
header_length =:= uncompressed_value(4, 5) [ 4 ]; header_length =:= uncompressed_value(4, 5) [ 4 ];
tos_tc [ 8 ]; tos_tc [ 8 ];
length =:= inferred_ip_v4_length [ 16 ]; length =:= inferred_ip_v4_length [ 16 ];
ip_id [ 16 ]; ip_id [ 16 ];
skipping to change at page 86, line 41 skipping to change at page 86, line 23
ip_checksum =:= inferred_ip_v4_header_checksum [ 16 ]; ip_checksum =:= inferred_ip_v4_header_checksum [ 16 ];
src_addr [ 32 ]; src_addr [ 32 ];
dest_addr [ 32 ]; dest_addr [ 32 ];
extension_headers =:= baseheader_extension_headers [ VARIABLE ]; extension_headers =:= baseheader_extension_headers [ VARIABLE ];
spi [ 32 ]; spi [ 32 ];
sequence_number [ 32 ]; sequence_number [ 32 ];
} }
UNCOMPRESSED v6 { UNCOMPRESSED v6 {
ENFORCE(msn.UVALUE == (sequence_number.UVALUE % 65536)); ENFORCE(msn.UVALUE == (sequence_number.UVALUE % 65536));
ENFORCE(ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_RANDOM); ENFORCE(ip_id_behavior_innermost.UVALUE == IP_ID_BEHAVIOR_RANDOM);
outer_headers =:= baseheader_outer_headers [ VARIABLE ]; outer_headers =:= baseheader_outer_headers [ VARIABLE ];
ip_version =:= uncompressed_value(4, 6) [ 4 ]; ip_version =:= uncompressed_value(4, 6) [ 4 ];
tos_tc [ 8 ]; tos_tc [ 8 ];
flow_label [ 20 ]; flow_label [ 20 ];
payload_length =:= inferred_ip_v6_length [ 16 ]; payload_length =:= inferred_ip_v6_length [ 16 ];
next_header [ 8 ]; next_header [ 8 ];
ttl_hopl [ 8 ]; ttl_hopl [ 8 ];
src_addr [ 128 ]; src_addr [ 128 ];
dest_addr [ 128 ]; dest_addr [ 128 ];
extension_headers =:= baseheader_extension_headers [ VARIABLE ]; extension_headers =:= baseheader_extension_headers [ VARIABLE ];
spi [ 32 ]; spi [ 32 ];
sequence_number [ 32 ]; sequence_number [ 32 ];
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(ip_id_behavior.UVALUE == ip_id_behavior_value); ENFORCE(profile_value == PROFILE_ESP_0103);
ENFORCE(profile == profile_value);
ENFORCE(ip_id_behavior_innermost.UVALUE == ip_id_behavior_value);
ENFORCE(reorder_ratio.UVALUE == reorder_ratio_value); ENFORCE(reorder_ratio.UVALUE == reorder_ratio_value);
ENFORCE(profile == PROFILE_ESP_0103);
ip_id_behavior [ 2 ];
} }
DEFAULT { DEFAULT {
ENFORCE(outer_ip_indicator == 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;
ip_id_behavior =:= static;
flow_label =:= static; flow_label =:= static;
next_header =:= static; next_header =:= static;
spi =:= static; spi =:= static;
sequence_number =:= static; sequence_number =:= static;
} }
// Replacement for UOR-2-ext3 // Replacement for UOR-2-ext3
COMPRESSED co_common { COMPRESSED co_common {
ENFORCE(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 ];
tos_tc_indicator =:= irregular(1) [ 1 ]; tos_tc_indicator =:= irregular(1) [ 1 ];
reorder_ratio =:= irregular(2) [ 2 ]; reorder_ratio =:= irregular(2) [ 2 ];
control_crc3 =:= control_crc3_encoding [ 3 ]; control_crc3 =:= control_crc3_encoding [ 3 ];
outer_ip_indicator : df : ip_id_behavior =:= outer_ip_indicator : df : ip_id_behavior_innermost =:=
profile_2_3_4_flags_enc( profile_2_3_4_flags_enc(
flags_indicator.CVALUE, ip_version.UVALUE) [ 0, 8 ]; flags_indicator.CVALUE, ip_version.UVALUE) [ 0, 8 ];
tos_tc =:= static_or_irreg(tos_tc_indicator.CVALUE, 8) [ 0, 8 ]; tos_tc =:= static_or_irreg(tos_tc_indicator.CVALUE, 8) [ 0, 8 ];
ttl_hopl =:= static_or_irreg(ttl_hopl_indicator.CVALUE, ttl_hopl =:= static_or_irreg(ttl_hopl_indicator.CVALUE,
ttl_hopl.ULENGTH) [ 0, 8 ]; ttl_hopl.ULENGTH) [ 0, 8 ];
sequence_number =:= 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.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 ];
} }
// Sequence number sent instead of MSN due to field length // Sequence number sent instead of MSN due to field length
// UO-0 // UO-0
COMPRESSED pt_0_crc3 { COMPRESSED pt_0_crc3 {
discriminator =:= '0' [ 1 ]; discriminator =:= '0' [ 1 ];
sequence_number =:= msn_lsb(4) [ 4 ]; sequence_number =:= msn_lsb(4) [ 4 ];
header_crc =:= crc3(THIS.UVALUE, THIS.ULENGTH) [ 3 ]; header_crc =:= crc3(THIS.UVALUE, THIS.ULENGTH) [ 3 ];
ip_id =:= inferred_sequential_ip_id [ 0 ]; ip_id =:= inferred_sequential_ip_id [ 0 ];
skipping to change at page 88, line 23 skipping to change at page 88, line 4
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 ];
sequence_number =:= msn_lsb(6) [ 6 ]; sequence_number =:= msn_lsb(6) [ 6 ];
header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ]; header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ];
ip_id =:= inferred_sequential_ip_id [ 0 ]; ip_id =:= inferred_sequential_ip_id [ 0 ];
} }
// UO-1-ID replacement (PT-1 only used for sequential) // UO-1-ID replacement (PT-1 only used for sequential)
COMPRESSED pt_1_seq_id { COMPRESSED pt_1_seq_id {
ENFORCE((ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_SEQUENTIAL) || ENFORCE((ip_id_behavior_innermost.UVALUE ==
(ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_SEQUENTIAL) ||
(ip_id_behavior_innermost.UVALUE ==
IP_ID_BEHAVIOR_SEQUENTIAL_SWAPPED)); IP_ID_BEHAVIOR_SEQUENTIAL_SWAPPED));
discriminator =:= '101' [ 3 ]; discriminator =:= '101' [ 3 ];
header_crc =:= crc3(THIS.UVALUE, THIS.ULENGTH) [ 3 ]; header_crc =:= crc3(THIS.UVALUE, THIS.ULENGTH) [ 3 ];
sequence_number =:= msn_lsb(6) [ 6 ]; sequence_number =:= msn_lsb(6) [ 6 ];
ip_id =:= ip_id_lsb(ip_id_behavior.UVALUE, 4) [ 4 ]; ip_id =:= ip_id_lsb(ip_id_behavior_innermost.UVALUE, 4) [ 4 ];
} }
// UOR-2-ID replacement // UOR-2-ID replacement
COMPRESSED pt_2_seq_id { COMPRESSED pt_2_seq_id {
ENFORCE((ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_SEQUENTIAL) || ENFORCE((ip_id_behavior_innermost.UVALUE ==
(ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_SEQUENTIAL) ||
(ip_id_behavior_innermost.UVALUE ==
IP_ID_BEHAVIOR_SEQUENTIAL_SWAPPED)); IP_ID_BEHAVIOR_SEQUENTIAL_SWAPPED));
discriminator =:= '110' [ 3 ]; discriminator =:= '110' [ 3 ];
ip_id =:= ip_id_lsb(ip_id_behavior.UVALUE, 6) [ 6 ]; ip_id =:= ip_id_lsb(ip_id_behavior_innermost.UVALUE, 6) [ 6 ];
header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ]; header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ];
sequence_number =:= msn_lsb(8) [ 8 ]; sequence_number =:= msn_lsb(8) [ 8 ];
} }
} }
//////////////////////////////////////////// ////////////////////////////////////////////
// IP-only profile // IP-only profile
//////////////////////////////////////////// ////////////////////////////////////////////
iponly_baseheader(profile, outer_ip_flag, ip_id_behavior_value, iponly_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 ];
tos_tc [ 8 ]; tos_tc [ 8 ];
length =:= inferred_ip_v4_length [ 16 ]; length =:= inferred_ip_v4_length [ 16 ];
ip_id [ 16 ]; ip_id [ 16 ];
rf =:= uncompressed_value(1, 0) [ 1 ]; rf =:= uncompressed_value(1, 0) [ 1 ];
skipping to change at page 89, line 26 skipping to change at page 89, line 8
frag_offset =:= uncompressed_value(13, 0) [ 13 ]; frag_offset =:= uncompressed_value(13, 0) [ 13 ];
ttl_hopl [ 8 ]; ttl_hopl [ 8 ];
next_header [ 8 ]; next_header [ 8 ];
ip_checksum =:= inferred_ip_v4_header_checksum [ 16 ]; ip_checksum =:= inferred_ip_v4_header_checksum [ 16 ];
src_addr [ 32 ]; src_addr [ 32 ];
dest_addr [ 32 ]; dest_addr [ 32 ];
extension_headers =:= baseheader_extension_headers [ VARIABLE ]; extension_headers =:= baseheader_extension_headers [ VARIABLE ];
} }
UNCOMPRESSED v6 { UNCOMPRESSED v6 {
ENFORCE(ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_RANDOM); ENFORCE(ip_id_behavior_innermost.UVALUE == IP_ID_BEHAVIOR_RANDOM);
outer_headers =:= baseheader_outer_headers [ VARIABLE ]; outer_headers =:= baseheader_outer_headers [ VARIABLE ];
ip_version =:= uncompressed_value(4, 6) [ 4 ]; ip_version =:= uncompressed_value(4, 6) [ 4 ];
tos_tc [ 8 ]; tos_tc [ 8 ];
flow_label [ 20 ]; flow_label [ 20 ];
payload_length =:= inferred_ip_v6_length [ 16 ]; payload_length =:= inferred_ip_v6_length [ 16 ];
next_header [ 8 ]; next_header [ 8 ];
ttl_hopl [ 8 ]; ttl_hopl [ 8 ];
src_addr [ 128 ]; src_addr [ 128 ];
dest_addr [ 128 ]; dest_addr [ 128 ];
extension_headers =:= baseheader_extension_headers [ VARIABLE ]; extension_headers =:= baseheader_extension_headers [ VARIABLE ];
df =:= uncompressed_value(0,0) [ 0 ]; 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_IP_0104);
ENFORCE(profile == profile_value);
ENFORCE(reorder_ratio.UVALUE == reorder_ratio_value); ENFORCE(reorder_ratio.UVALUE == reorder_ratio_value);
ENFORCE(ip_id_behavior.UVALUE == ip_id_behavior_value); ENFORCE(ip_id_behavior_innermost.UVALUE == ip_id_behavior_value);
ENFORCE(profile == PROFILE_IP_0104);
ip_id_behavior [ 2 ];
} }
DEFAULT { DEFAULT {
ENFORCE(outer_ip_indicator == 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;
ip_id_behavior =:= static;
flow_label =:= static; flow_label =:= static;
next_header =:= static; next_header =:= static;
} }
// Replacement for UOR-2-ext3 // Replacement for UOR-2-ext3
COMPRESSED co_common { COMPRESSED co_common {
ENFORCE(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 ];
tos_tc_indicator =:= irregular(1) [ 1 ]; tos_tc_indicator =:= irregular(1) [ 1 ];
reorder_ratio =:= irregular(2) [ 2 ]; reorder_ratio =:= irregular(2) [ 2 ];
control_crc3 =:= control_crc3_encoding [ 3 ]; control_crc3 =:= control_crc3_encoding [ 3 ];
outer_ip_indicator : df : ip_id_behavior =:= outer_ip_indicator : df : ip_id_behavior_innermost =:=
profile_2_3_4_flags_enc( profile_2_3_4_flags_enc(
flags_indicator.CVALUE, ip_version.UVALUE) [ 0, 8 ]; flags_indicator.CVALUE, ip_version.UVALUE) [ 0, 8 ];
tos_tc =:= static_or_irreg(tos_tc_indicator.CVALUE, 8) [ 0, 8 ]; tos_tc =:= static_or_irreg(tos_tc_indicator.CVALUE, 8) [ 0, 8 ];
ttl_hopl =:= static_or_irreg(ttl_hopl_indicator.CVALUE, ttl_hopl =:= static_or_irreg(ttl_hopl_indicator.CVALUE,
ttl_hopl.ULENGTH) [ 0, 8 ]; ttl_hopl.ULENGTH) [ 0, 8 ];
msn =:= msn_lsb(8) [ 8 ]; msn =:= msn_lsb(8) [ 8 ];
ip_id =:= ip_id_sequential_variable(ip_id_behavior.UVALUE, 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 ];
} }
// UO-0 // UO-0
COMPRESSED pt_0_crc3 { COMPRESSED pt_0_crc3 {
discriminator =:= '0' [ 1 ]; discriminator =:= '0' [ 1 ];
msn =:= msn_lsb(4) [ 4 ]; msn =:= msn_lsb(4) [ 4 ];
header_crc =:= crc3(THIS.UVALUE, THIS.ULENGTH) [ 3 ]; header_crc =:= crc3(THIS.UVALUE, THIS.ULENGTH) [ 3 ];
ip_id =:= inferred_sequential_ip_id [ 0 ]; ip_id =:= inferred_sequential_ip_id [ 0 ];
} }
skipping to change at page 91, line 4 skipping to change at page 90, line 33
// 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(7) [ 6 ];
header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ]; header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ];
ip_id =:= inferred_sequential_ip_id [ 0 ]; ip_id =:= inferred_sequential_ip_id [ 0 ];
} }
// UO-1-ID replacement (PT-1 only used for sequential) // UO-1-ID replacement (PT-1 only used for sequential)
COMPRESSED pt_1_seq_id { COMPRESSED pt_1_seq_id {
ENFORCE((ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_SEQUENTIAL) || ENFORCE((ip_id_behavior_innermost.UVALUE ==
(ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_SEQUENTIAL) ||
(ip_id_behavior_innermost.UVALUE ==
IP_ID_BEHAVIOR_SEQUENTIAL_SWAPPED)); IP_ID_BEHAVIOR_SEQUENTIAL_SWAPPED));
discriminator =:= '101' [ 3 ]; discriminator =:= '101' [ 3 ];
header_crc =:= crc3(THIS.UVALUE, THIS.ULENGTH) [ 3 ]; header_crc =:= crc3(THIS.UVALUE, THIS.ULENGTH) [ 3 ];
msn =:= msn_lsb(6) [ 6 ]; msn =:= msn_lsb(6) [ 6 ];
ip_id =:= ip_id_lsb(ip_id_behavior.UVALUE, 4) [ 4 ]; ip_id =:= ip_id_lsb(ip_id_behavior_innermost.UVALUE, 4) [ 4 ];
} }
// UOR-2-ID replacement // UOR-2-ID replacement
COMPRESSED pt_2_seq_id { COMPRESSED pt_2_seq_id {
ENFORCE((ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_SEQUENTIAL) || ENFORCE((ip_id_behavior_innermost.UVALUE ==
(ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_SEQUENTIAL) ||
(ip_id_behavior_innermost.UVALUE ==
IP_ID_BEHAVIOR_SEQUENTIAL_SWAPPED)); IP_ID_BEHAVIOR_SEQUENTIAL_SWAPPED));
discriminator =:= '110' [ 3 ]; discriminator =:= '110' [ 3 ];
ip_id =:= ip_id_lsb(ip_id_behavior.UVALUE, 6) [ 6 ]; ip_id =:= ip_id_lsb(ip_id_behavior_innermost.UVALUE, 6) [ 6 ];
header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ]; header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ];
msn =:= msn_lsb(8) [ 8 ]; msn =:= msn_lsb(8) [ 8 ];
} }
} }
//////////////////////////////////////////// ////////////////////////////////////////////
// UDP-lite/RTP profile // UDP-lite/RTP profile
//////////////////////////////////////////// ////////////////////////////////////////////
udplite_rtp_baseheader(profile, ts_stride_value, time_stride_value, udplite_rtp_baseheader(profile_value, ts_stride_value,
outer_ip_flag, ip_id_behavior_value, time_stride_value, outer_ip_flag,
reorder_ratio_value, coverage_behavior_value) ip_id_behavior_value, reorder_ratio_value,
coverage_behavior_value)
{ {
UNCOMPRESSED v4 { UNCOMPRESSED v4 {
ENFORCE(msn.UVALUE == sequence_number.UVALUE); ENFORCE(msn.UVALUE == sequence_number.UVALUE);
outer_headers =:= baseheader_outer_headers [ VARIABLE ]; outer_headers =:= baseheader_outer_headers [ VARIABLE ];
ip_version =:= uncompressed_value(4, 4) [ 4 ]; ip_version =:= uncompressed_value(4, 4) [ 4 ];
header_length =:= uncompressed_value(4, 5) [ 4 ]; header_length =:= uncompressed_value(4, 5) [ 4 ];
tos_tc [ 8 ]; tos_tc [ 8 ];
length =:= inferred_ip_v4_length [ 16 ]; length =:= inferred_ip_v4_length [ 16 ];
ip_id [ 16 ]; ip_id [ 16 ];
rf =:= uncompressed_value(1, 0) [ 1 ]; rf =:= uncompressed_value(1, 0) [ 1 ];
skipping to change at page 92, line 20 skipping to change at page 92, line 4
cc [ 4 ]; cc [ 4 ];
marker [ 1 ]; marker [ 1 ];
payload_type [ 7 ]; payload_type [ 7 ];
sequence_number [ 16 ]; sequence_number [ 16 ];
timestamp [ 32 ]; timestamp [ 32 ];
ssrc [ 32 ]; ssrc [ 32 ];
csrc_list [ VARIABLE ]; csrc_list [ VARIABLE ];
} }
UNCOMPRESSED v6 { UNCOMPRESSED v6 {
ENFORCE(ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_RANDOM); ENFORCE(ip_id_behavior_innermost.UVALUE == IP_ID_BEHAVIOR_RANDOM);
outer_headers =:= baseheader_outer_headers [ VARIABLE ]; outer_headers =:= baseheader_outer_headers [ VARIABLE ];
ip_version =:= uncompressed_value(4, 6) [ 4 ]; ip_version =:= uncompressed_value(4, 6) [ 4 ];
tos_tc [ 8 ]; tos_tc [ 8 ];
flow_label [ 20 ]; flow_label [ 20 ];
payload_length =:= inferred_ip_v6_length [ 16 ]; payload_length =:= inferred_ip_v6_length [ 16 ];
next_header [ 8 ]; next_header [ 8 ];
ttl_hopl [ 8 ]; ttl_hopl [ 8 ];
src_addr [ 128 ]; src_addr [ 128 ];
dest_addr [ 128 ]; dest_addr [ 128 ];
extension_headers =:= baseheader_extension_headers [ VARIABLE ]; extension_headers =:= baseheader_extension_headers [ VARIABLE ];
skipping to change at page 92, line 50 skipping to change at page 92, line 34
payload_type [ 7 ]; payload_type [ 7 ];
sequence_number [ 16 ]; sequence_number [ 16 ];
timestamp [ 32 ]; timestamp [ 32 ];
ssrc [ 32 ]; ssrc [ 32 ];
csrc_list [ VARIABLE ]; csrc_list [ VARIABLE ];
df =:= uncompressed_value(0,0) [ 0 ]; 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_RTP_0107);
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.UVALUE == ip_id_behavior_value); ENFORCE(ip_id_behavior_innermost.UVALUE == ip_id_behavior_value);
ENFORCE(profile == PROFILE_RTP_0107);
ip_id_behavior [ 2 ];
coverage_behavior [ 2 ]; 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 {
ENFORCE(outer_ip_indicator == 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;
ip_id_behavior =:= static;
flow_label =:= static; flow_label =:= static;
next_header =:= static; next_header =:= static;
src_port =:= static; src_port =:= static;
dst_port =:= static; dst_port =:= static;
pad_bit =:= static; pad_bit =:= static;
extension =:= static; extension =:= static;
cc =:= static; cc =:= static;
// When marker not present in packets, it is assumed 0 // When marker not present in packets, it is assumed 0
marker =:= uncompressed_value(1, 0); marker =:= uncompressed_value(1, 0);
payload_type =:= static; payload_type =:= static;
skipping to change at page 94, line 13 skipping to change at page 93, line 44
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 : 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) [ 0, 8 ];
list_indicator : tis_indicator : pt_indicator : pad_bit : list_indicator : tis_indicator : pt_indicator : pad_bit :
extension : coverage_behavior =:= extension : coverage_behavior =:=
profile_7_flags2_enc(flags2_indicator.CVALUE, profile_7_flags2_enc(flags2_indicator.CVALUE,
ip_version.UVALUE) [ 0, 8 ]; ip_version.UVALUE) [ 0, 8 ];
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.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.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 ];
ts_stride =:= sdvl_or_static(tss_indicator.CVALUE) [ VARIABLE ]; ts_stride =:= sdvl_or_static(tss_indicator.CVALUE) [ VARIABLE ];
time_stride =:= sdvl_or_static(tis_indicator.CVALUE) [ VARIABLE ]; time_stride =:= sdvl_or_static(tis_indicator.CVALUE) [ VARIABLE ];
csrc_list =:= csrc_list =:=
csrc_list_presence(list_indicator.CVALUE, csrc_list_presence(list_indicator.CVALUE,
skipping to change at page 95, line 12 skipping to change at page 94, line 43
discriminator =:= '1000' [ 4 ]; discriminator =:= '1000' [ 4 ];
msn =:= msn_lsb(5) [ 5 ]; msn =:= msn_lsb(5) [ 5 ];
header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ]; header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ];
timestamp =:= inferred_scaled_field [ 0 ]; timestamp =:= inferred_scaled_field [ 0 ];
ip_id =:= inferred_sequential_ip_id [ 0 ]; ip_id =:= inferred_sequential_ip_id [ 0 ];
} }
// UO-1 replacement // UO-1 replacement
COMPRESSED pt_1_rnd { COMPRESSED pt_1_rnd {
ENFORCE(ts_stride.UVALUE != 0); ENFORCE(ts_stride.UVALUE != 0);
ENFORCE((ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_RANDOM) || ENFORCE((ip_id_behavior_innermost.UVALUE ==
(ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_ZERO)); IP_ID_BEHAVIOR_RANDOM) ||
(ip_id_behavior_innermost.UVALUE == IP_ID_BEHAVIOR_ZERO));
discriminator =:= '101' [ 3 ]; discriminator =:= '101' [ 3 ];
msn =:= msn_lsb(4) [ 4 ]; msn =:= msn_lsb(4) [ 4 ];
marker =:= irregular(1) [ 1 ]; marker =:= irregular(1) [ 1 ];
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.UVALUE == IP_ID_BEHAVIOR_SEQUENTIAL) || ENFORCE((ip_id_behavior_innermost.UVALUE ==
(ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_SEQUENTIAL) ||
(ip_id_behavior_innermost.UVALUE ==
IP_ID_BEHAVIOR_SEQUENTIAL_SWAPPED)); IP_ID_BEHAVIOR_SEQUENTIAL_SWAPPED));
discriminator =:= '1001' [ 4 ]; discriminator =:= '1001' [ 4 ];
ip_id =:= ip_id_lsb(ip_id_behavior.UVALUE, 4) [ 4 ]; ip_id =:= ip_id_lsb(ip_id_behavior_innermost.UVALUE, 4) [ 4 ];
msn =:= msn_lsb(5) [ 5 ]; msn =:= msn_lsb(5) [ 5 ];
header_crc =:= crc3(THIS.UVALUE, THIS.ULENGTH) [ 3 ]; header_crc =:= crc3(THIS.UVALUE, THIS.ULENGTH) [ 3 ];
timestamp =:= inferred_scaled_field [ 0 ]; timestamp =:= inferred_scaled_field [ 0 ];
} }
// UO-1-TS replacement // UO-1-TS replacement
COMPRESSED pt_1_seq_ts { COMPRESSED pt_1_seq_ts {
ENFORCE(ts_stride.UVALUE != 0); ENFORCE(ts_stride.UVALUE != 0);
ENFORCE((ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_SEQUENTIAL) || ENFORCE((ip_id_behavior_innermost.UVALUE ==
(ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_SEQUENTIAL) ||
(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 ];
} }
// UOR-2 replacement // UOR-2 replacement
COMPRESSED pt_2_rnd { COMPRESSED pt_2_rnd {
ENFORCE(ts_stride.UVALUE != 0); ENFORCE(ts_stride.UVALUE != 0);
ENFORCE((ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_RANDOM) || ENFORCE((ip_id_behavior_innermost.UVALUE ==
(ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_ZERO)); IP_ID_BEHAVIOR_RANDOM) ||
(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 ];
ts_scaled =:= scaled_ts_lsb(time_stride.UVALUE, 6) [ 6 ]; ts_scaled =:= scaled_ts_lsb(time_stride.UVALUE, 6) [ 6 ];
marker =:= irregular(1) [ 1 ]; marker =:= irregular(1) [ 1 ];
header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ]; header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ];
} }
// UOR-2-ID replacement // UOR-2-ID replacement
COMPRESSED pt_2_seq_id { COMPRESSED pt_2_seq_id {
ENFORCE((ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_SEQUENTIAL) || ENFORCE((ip_id_behavior_innermost.UVALUE ==
(ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_SEQUENTIAL) ||
(ip_id_behavior_innermost.UVALUE ==
IP_ID_BEHAVIOR_SEQUENTIAL_SWAPPED)); IP_ID_BEHAVIOR_SEQUENTIAL_SWAPPED));
discriminator =:= '11000' [ 5 ]; discriminator =:= '11000' [ 5 ];
msn =:= msn_lsb(7) [ 7 ]; msn =:= msn_lsb(7) [ 7 ];
ip_id =:= ip_id_lsb(ip_id_behavior.UVALUE, 5) [ 5 ]; ip_id =:= ip_id_lsb(ip_id_behavior_innermost.UVALUE, 5) [ 5 ];
header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ]; header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ];
timestamp =:= inferred_scaled_field [ 0 ]; timestamp =:= inferred_scaled_field [ 0 ];
} }
// UOR-2-ID-ext1 replacement (both TS and IP-ID) // UOR-2-ID-ext1 replacement (both TS and IP-ID)
COMPRESSED pt_2_seq_both { COMPRESSED pt_2_seq_both {
ENFORCE(ts_stride.UVALUE != 0); ENFORCE(ts_stride.UVALUE != 0);
ENFORCE((ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_SEQUENTIAL) || ENFORCE((ip_id_behavior_innermost.UVALUE ==
(ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_SEQUENTIAL) ||
(ip_id_behavior_innermost.UVALUE ==
IP_ID_BEHAVIOR_SEQUENTIAL_SWAPPED)); IP_ID_BEHAVIOR_SEQUENTIAL_SWAPPED));
discriminator =:= '11001' [ 5 ]; discriminator =:= '11001' [ 5 ];
msn =:= msn_lsb(7) [ 7 ]; msn =:= msn_lsb(7) [ 7 ];
ip_id =:= ip_id_lsb(ip_id_behavior.UVALUE, 5) [ 5 ]; ip_id =:= ip_id_lsb(ip_id_behavior_innermost.UVALUE, 5) [ 5 ];
header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ]; header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ];
ts_scaled =:= scaled_ts_lsb(time_stride.UVALUE, 7) [ 7 ]; ts_scaled =:= scaled_ts_lsb(time_stride.UVALUE, 7) [ 7 ];
marker =:= irregular(1) [ 1 ]; marker =:= irregular(1) [ 1 ];
} }
// UOR-2-TS replacement // UOR-2-TS replacement
COMPRESSED pt_2_seq_ts { COMPRESSED pt_2_seq_ts {
ENFORCE(ts_stride.UVALUE != 0); ENFORCE(ts_stride.UVALUE != 0);
ENFORCE((ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_SEQUENTIAL) || ENFORCE((ip_id_behavior_innermost.UVALUE ==
(ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_SEQUENTIAL) ||
(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 ];
} }
} }
//////////////////////////////////////////// ////////////////////////////////////////////
skipping to change at page 97, line 4 skipping to change at page 96, line 41
discriminator =:= '1101' [ 4 ]; discriminator =:= '1101' [ 4 ];
msn =:= msn_lsb(7) [ 7 ]; msn =:= msn_lsb(7) [ 7 ];
ts_scaled =:= scaled_ts_lsb(time_stride.UVALUE, 5) [ 5 ]; ts_scaled =:= scaled_ts_lsb(time_stride.UVALUE, 5) [ 5 ];
marker =:= irregular(1) [ 1 ]; marker =:= irregular(1) [ 1 ];
header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ]; header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ];
} }
} }
//////////////////////////////////////////// ////////////////////////////////////////////
// UDP-lite profile // UDP-lite profile
//////////////////////////////////////////// ////////////////////////////////////////////
udplite_baseheader(profile, 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)
{ {
UNCOMPRESSED v4 { UNCOMPRESSED v4 {
outer_headers =:= baseheader_outer_headers [ VARIABLE ]; outer_headers =:= baseheader_outer_headers [ VARIABLE ];
ip_version =:= uncompressed_value(4, 4) [ 4 ]; ip_version =:= uncompressed_value(4, 4) [ 4 ];
header_length =:= uncompressed_value(4, 5) [ 4 ]; header_length =:= uncompressed_value(4, 5) [ 4 ];
tos_tc [ 8 ]; tos_tc [ 8 ];
length =:= inferred_ip_v4_length [ 16 ]; length =:= inferred_ip_v4_length [ 16 ];
ip_id [ 16 ]; ip_id [ 16 ];
rf =:= uncompressed_value(1, 0) [ 1 ]; rf =:= uncompressed_value(1, 0) [ 1 ];
skipping to change at page 97, line 34 skipping to change at page 97, line 22
src_addr [ 32 ]; src_addr [ 32 ];
dest_addr [ 32 ]; dest_addr [ 32 ];
extension_headers =:= baseheader_extension_headers [ VARIABLE ]; extension_headers =:= baseheader_extension_headers [ VARIABLE ];
src_port [ 16 ]; src_port [ 16 ];
dst_port [ 16 ]; dst_port [ 16 ];
checksum_coverage [ 16 ]; checksum_coverage [ 16 ];
udp_checksum [ 16 ]; udp_checksum [ 16 ];
} }
UNCOMPRESSED v6 { UNCOMPRESSED v6 {
ENFORCE(ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_RANDOM); ENFORCE(ip_id_behavior_innermost.UVALUE == IP_ID_BEHAVIOR_RANDOM);
outer_headers =:= baseheader_outer_headers [ VARIABLE ]; outer_headers =:= baseheader_outer_headers [ VARIABLE ];
ip_version =:= uncompressed_value(4, 6) [ 4 ]; ip_version =:= uncompressed_value(4, 6) [ 4 ];
tos_tc [ 8 ]; tos_tc [ 8 ];
flow_label [ 20 ]; flow_label [ 20 ];
payload_length =:= inferred_ip_v6_length [ 16 ]; payload_length =:= inferred_ip_v6_length [ 16 ];
next_header [ 8 ]; next_header [ 8 ];
ttl_hopl [ 8 ]; ttl_hopl [ 8 ];
src_addr [ 128 ]; src_addr [ 128 ];
dest_addr [ 128 ]; dest_addr [ 128 ];
extension_headers =:= baseheader_extension_headers [ VARIABLE ]; extension_headers =:= baseheader_extension_headers [ VARIABLE ];
skipping to change at page 98, line 4 skipping to change at page 97, line 40
src_addr [ 128 ]; src_addr [ 128 ];
dest_addr [ 128 ]; dest_addr [ 128 ];
extension_headers =:= baseheader_extension_headers [ VARIABLE ]; extension_headers =:= baseheader_extension_headers [ VARIABLE ];
src_port [ 16 ]; src_port [ 16 ];
dst_port [ 16 ]; dst_port [ 16 ];
checksum_coverage [ 16 ]; checksum_coverage [ 16 ];
udp_checksum [ 16 ]; udp_checksum [ 16 ];
df =:= uncompressed_value(0,0) [ 0 ]; 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 == 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.UVALUE == ip_id_behavior_value); ENFORCE(ip_id_behavior_innermost.UVALUE == ip_id_behavior_value);
ENFORCE(profile == PROFILE_UDPLITE_0108);
ip_id_behavior [ 2 ];
coverage_behavior [ 2 ]; coverage_behavior [ 2 ];
} }
DEFAULT { DEFAULT {
ENFORCE(outer_ip_indicator == 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;
ip_id_behavior =:= static;
flow_label =:= static; flow_label =:= static;
next_header =:= static; next_header =:= static;
src_port =:= static; src_port =:= static;
dst_port =:= static; dst_port =:= static;
} }
// 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 ];
tos_tc_indicator =:= irregular(1) [ 1 ]; tos_tc_indicator =:= irregular(1) [ 1 ];
reorder_ratio =:= irregular(2) [ 2 ]; reorder_ratio =:= irregular(2) [ 2 ];
control_crc3 =:= control_crc3_encoding [ 3 ]; control_crc3 =:= control_crc3_encoding [ 3 ];
outer_ip_indicator : df : ip_id_behavior : outer_ip_indicator : df : ip_id_behavior_innermost :
coverage_behavior =:= coverage_behavior =:=
profile_8_flags_enc(flags_indicator.CVALUE, profile_8_flags_enc(flags_indicator.CVALUE,
ip_version.UVALUE) [ 0, 8 ]; ip_version.UVALUE) [ 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 ];
msn =:= msn_lsb(8) [ 8 ]; msn =:= msn_lsb(8) [ 8 ];
ip_id =:= ip_id_sequential_variable(ip_id_behavior.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 ];
} }
// UO-0 // UO-0
COMPRESSED pt_0_crc3 { COMPRESSED pt_0_crc3 {
discriminator =:= '0' [ 1 ]; discriminator =:= '0' [ 1 ];
msn =:= msn_lsb(4) [ 4 ]; msn =:= msn_lsb(4) [ 4 ];
header_crc =:= crc3(THIS.UVALUE, THIS.ULENGTH) [ 3 ]; header_crc =:= crc3(THIS.UVALUE, THIS.ULENGTH) [ 3 ];
ip_id =:= inferred_sequential_ip_id [ 0 ]; ip_id =:= inferred_sequential_ip_id [ 0 ];
} }
skipping to change at page 99, line 20 skipping to change at page 99, line 8
// 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(7) [ 6 ];
header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ]; header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ];
ip_id =:= inferred_sequential_ip_id [ 0 ]; ip_id =:= inferred_sequential_ip_id [ 0 ];
} }
// UO-1-ID replacement (PT-1 only used for sequential) // UO-1-ID replacement (PT-1 only used for sequential)
COMPRESSED pt_1_seq_id { COMPRESSED pt_1_seq_id {
ENFORCE((ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_SEQUENTIAL) || ENFORCE((ip_id_behavior_innermost.UVALUE ==
(ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_SEQUENTIAL) ||
(ip_id_behavior_innermost.UVALUE ==
IP_ID_BEHAVIOR_SEQUENTIAL_SWAPPED)); IP_ID_BEHAVIOR_SEQUENTIAL_SWAPPED));
discriminator =:= '101' [ 3 ]; discriminator =:= '101' [ 3 ];
header_crc =:= crc3(THIS.UVALUE, THIS.ULENGTH) [ 3 ]; header_crc =:= crc3(THIS.UVALUE, THIS.ULENGTH) [ 3 ];
msn =:= msn_lsb(6) [ 6 ]; msn =:= msn_lsb(6) [ 6 ];
ip_id =:= ip_id_lsb(ip_id_behavior.UVALUE, 4) [ 4 ]; ip_id =:= ip_id_lsb(ip_id_behavior_innermost.UVALUE, 4) [ 4 ];
} }
// UOR-2-ID replacement // UOR-2-ID replacement
COMPRESSED pt_2_seq_id { COMPRESSED pt_2_seq_id {
ENFORCE((ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_SEQUENTIAL) || ENFORCE((ip_id_behavior_innermost.UVALUE ==
(ip_id_behavior.UVALUE == IP_ID_BEHAVIOR_SEQUENTIAL) ||
(ip_id_behavior_innermost.UVALUE ==
IP_ID_BEHAVIOR_SEQUENTIAL_SWAPPED)); IP_ID_BEHAVIOR_SEQUENTIAL_SWAPPED));
discriminator =:= '110' [ 3 ]; discriminator =:= '110' [ 3 ];
ip_id =:= ip_id_lsb(ip_id_behavior.UVALUE, 6) [ 6 ]; ip_id =:= ip_id_lsb(ip_id_behavior_innermost.UVALUE, 6) [ 6 ];
header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ]; header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ];
msn =:= msn_lsb(8) [ 8 ]; msn =:= msn_lsb(8) [ 8 ];
} }
} }
6.9. Feedback Formats and Options 6.9. Feedback Formats and Options
6.9.1. Feedback Formats 6.9.1. Feedback Formats
This section describes the feedback format for ROHCv2 profiles, using This section describes the feedback format for ROHCv2 profiles, using
skipping to change at page 121, line 7 skipping to change at page 121, line 7
Ericsson Ericsson
Box 920 Box 920
Lulea SE-971 28 Lulea SE-971 28
Sweden Sweden
Phone: +46 (0) 8 404 41 58 Phone: +46 (0) 8 404 41 58
Email: kristofer.sandlund@ericsson.com Email: kristofer.sandlund@ericsson.com
Full Copyright Statement Full Copyright Statement
Copyright (C) The IETF Trust (2007). Copyright (C) The IETF Trust (2008).
This document is subject to the rights, licenses and restrictions This document is subject to the rights, licenses and restrictions
contained in BCP 78, and except as set forth therein, the authors contained in BCP 78, and except as set forth therein, the authors
retain all their rights. retain all their rights.
This document and the information contained herein are provided on an This document and the information contained herein are provided on an
"AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS "AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS
OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY, THE IETF TRUST AND OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY, THE IETF TRUST AND
THE INTERNET ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS THE INTERNET ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF
 End of changes. 146 change blocks. 
221 lines changed or deleted 219 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/