< draft-ietf-rohc-tcp-15.txt   draft-ietf-rohc-tcp-16.txt >
Robust Header Compression G. Pelletier Robust Header Compression G. Pelletier
Internet-Draft L. Jonsson Internet-Draft L. Jonsson
Intended status: Standards Track K. Sandlund Intended status: Standards Track K. Sandlund
Expires: June 14, 2007 Ericsson Expires: August 6, 2007 Ericsson
M. West M. West
Siemens/Roke Manor Siemens/Roke Manor
December 11, 2006 February 2, 2007
RObust Header Compression (ROHC): A Profile for TCP/IP (ROHC-TCP) RObust Header Compression (ROHC): A Profile for TCP/IP (ROHC-TCP)
draft-ietf-rohc-tcp-15 draft-ietf-rohc-tcp-16
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 37 skipping to change at page 1, line 37
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 14, 2007. This Internet-Draft will expire on August 6, 2007.
Copyright Notice Copyright Notice
Copyright (C) The IETF Trust (2006). Copyright (C) The IETF Trust (2007).
Abstract Abstract
This document specifies a ROHC (Robust Header Compression) profile This document specifies a ROHC (Robust Header Compression) profile
for compression of TCP/IP packets. The profile, called ROHC-TCP, for compression of TCP/IP packets. The profile, called ROHC-TCP,
provides efficient and robust compression of TCP headers, including provides efficient and robust compression of TCP headers, including
frequently used TCP options such as SACK (Selective Acknowledgments) frequently used TCP options such as SACK (Selective Acknowledgments)
and Timestamps. and Timestamps.
ROHC-TCP works well when used over links with significant error rates ROHC-TCP works well when used over links with significant error rates
skipping to change at page 3, line 8 skipping to change at page 3, line 8
6.3.5. Compressed Lists in Dynamic Chain . . . . . . . . . . 28 6.3.5. Compressed Lists in Dynamic Chain . . . . . . . . . . 28
6.3.6. Irregular Chain Items for TCP Options . . . . . . . . 28 6.3.6. Irregular Chain Items for TCP Options . . . . . . . . 28
6.3.7. Replication of TCP Options . . . . . . . . . . . . . . 28 6.3.7. Replication of TCP Options . . . . . . . . . . . . . . 28
6.4. Profile-specific Encoding Methods . . . . . . . . . . . . 29 6.4. Profile-specific Encoding Methods . . . . . . . . . . . . 29
6.4.1. inferred_ip_v4_header_checksum . . . . . . . . . . . . 29 6.4.1. inferred_ip_v4_header_checksum . . . . . . . . . . . . 29
6.4.2. inferred_mine_header_checksum . . . . . . . . . . . . 29 6.4.2. inferred_mine_header_checksum . . . . . . . . . . . . 29
6.4.3. inferred_ip_v4_length . . . . . . . . . . . . . . . . 30 6.4.3. inferred_ip_v4_length . . . . . . . . . . . . . . . . 30
6.4.4. inferred_ip_v6_length . . . . . . . . . . . . . . . . 30 6.4.4. inferred_ip_v6_length . . . . . . . . . . . . . . . . 30
6.4.5. inferred_offset . . . . . . . . . . . . . . . . . . . 31 6.4.5. inferred_offset . . . . . . . . . . . . . . . . . . . 31
6.4.6. baseheader_extension_headers . . . . . . . . . . . . . 31 6.4.6. baseheader_extension_headers . . . . . . . . . . . . . 31
6.4.7. baseheader_outer_headers . . . . . . . . . . . . . . . 32 6.4.7. baseheader_outer_headers . . . . . . . . . . . . . . . 31
6.4.8. Scaled Encoding of Fields . . . . . . . . . . . . . . 32 6.4.8. Scaled Encoding of Fields . . . . . . . . . . . . . . 32
6.5. Encoding Methods With External Parameters . . . . . . . . 34 6.5. Encoding Methods With External Parameters . . . . . . . . 34
7. Packet Types (Normative) . . . . . . . . . . . . . . . . . . . 36 7. Packet Types (Normative) . . . . . . . . . . . . . . . . . . . 36
7.1. Initialization and Refresh Packets (IR) . . . . . . . . . 36 7.1. Initialization and Refresh Packets (IR) . . . . . . . . . 36
7.2. Context Replication Packets (IR-CR) . . . . . . . . . . . 38 7.2. Context Replication Packets (IR-CR) . . . . . . . . . . . 38
7.3. Compressed Packets (CO) . . . . . . . . . . . . . . . . . 40 7.3. Compressed Packets (CO) . . . . . . . . . . . . . . . . . 40
8. Header Formats (Normative) . . . . . . . . . . . . . . . . . . 41 8. Header Formats (Normative) . . . . . . . . . . . . . . . . . . 41
8.1. Design Rationale for Compressed Base Headers . . . . . . . 42 8.1. Design Rationale for Compressed Base Headers . . . . . . . 42
8.2. Formal Definition of Header Formats . . . . . . . . . . . 45 8.2. Formal Definition of Header Formats . . . . . . . . . . . 45
8.3. Feedback Formats and Options . . . . . . . . . . . . . . . 85 8.3. Feedback Formats and Options . . . . . . . . . . . . . . . 85
skipping to change at page 13, line 32 skipping to change at page 13, line 32
and send IR and/or IR-DYN packets. These refreshes can be based on and send IR and/or IR-DYN packets. These refreshes can be based on
timeouts, on the number of compressed packets sent for the flow or timeouts, on the number of compressed packets sent for the flow or
any other strategy specific to the implementation. Once the feedback any other strategy specific to the implementation. Once the feedback
channel is established, the decompressor MAY stop performing periodic channel is established, the decompressor MAY stop performing periodic
refreshes. refreshes.
5.2.2. Feedback Logic 5.2.2. Feedback Logic
The semantics of feedback messages, acknowledgements (ACKs) and The semantics of feedback messages, acknowledgements (ACKs) and
negative acknowledgments (NACKs or STATIC-NACKs), are defined in negative acknowledgments (NACKs or STATIC-NACKs), are defined in
section 5.2.3.1 of [I-D.ietf-rohc-rfc3095bis-framework]. section 5.2.4.1 of [I-D.ietf-rohc-rfc3095bis-framework].
5.2.2.1. Optional Acknowledgments (ACKs) 5.2.2.1. Optional Acknowledgments (ACKs)
The compressor MAY use acknowledgment feedback (ACKs) to move to a The compressor MAY use acknowledgment feedback (ACKs) to move to a
higher compression state. higher compression state.
Upon reception of an ACK for a context-updating packet, the Upon reception of an ACK for a context-updating packet, the
compressor obtains confidence that the decompressor has received the compressor obtains confidence that the decompressor has received the
acknowledged packet and that it has observed changes in the packet acknowledged packet and that it has observed changes in the packet
flow up to the acknowledged packet. flow up to the acknowledged packet.
skipping to change at page 29, line 41 skipping to change at page 29, line 41
is compressed away, and when decompression is verified by a CRC is compressed away, and when decompression is verified by a CRC
computed over the original header for every compressed packet, there computed over the original header for every compressed packet, there
is no point in having this additional checksum; instead it can be is no point in having this additional checksum; instead it can be
recomputed at the decompressor side. recomputed at the decompressor side.
The "inferred_ip_v4_header_checksum" encoding method thus compresses The "inferred_ip_v4_header_checksum" encoding method thus compresses
the IPv4 header checksum down to a size of zero bits. Using this the IPv4 header checksum down to a size of zero bits. Using this
encoding method, the decompressor infers the value of this field encoding method, the decompressor infers the value of this field
using the computation above. using the computation above.
The compressor MAY use the header checksum to validate the This encoding method implicitely assumes that the compressor will not
correctness of the header before compressing it, to avoid compressing process a corrupted header; otherwise it cannot guarantee that the
a corrupted header. checksum as recomputed by the decompressor will be bitwise identical
to its original value before compression.
6.4.2. inferred_mine_header_checksum 6.4.2. inferred_mine_header_checksum
This encoding method compresses the minimal encapsulation header This encoding method compresses the minimal encapsulation header
checksum. This checksum is defined in [RFC2004] as follows: checksum. This checksum is defined in [RFC2004] as follows:
Header Checksum Header Checksum
The 16-bit one's complement of the one's complement sum of all The 16-bit one's complement of the one's complement sum of all
16-bit words in the minimal forwarding header. For purposes of 16-bit words in the minimal forwarding header. For purposes of
computing the checksum, the value of the checksum field is 0. computing the checksum, the value of the checksum field is 0.
The IP header and IP payload (after the minimal forwarding The IP header and IP payload (after the minimal forwarding
header) are not included in this checksum computation. header) are not included in this checksum computation.
The "inferred_mine_header_checksum" encoding method compresses the The "inferred_mine_header_checksum" encoding method compresses the
minimal encapsulation header checksum down to a size of zero bit, minimal encapsulation header checksum down to a size of zero bit,
i.e. no bits are transmitted in compressed headers for this field. i.e. no bits are transmitted in compressed headers for this field.
Using this encoding method, the decompressor infers the value of this Using this encoding method, the decompressor infers the value of this
field using the above computation. field using the above computation.
The motivations for inferring this checksum are similar to the ones The motivations and the assumptions for inferring this checksum are
explained above in Section 6.4.1. similar to the ones explained above in Section 6.4.1.
The compressor MAY use the minimal encapsulation header checksum to
validate the correctness of the header before compressing it, to
avoid compressing a corrupted header.
6.4.3. inferred_ip_v4_length 6.4.3. inferred_ip_v4_length
This encoding method compresses the total length field of the IPv4 This encoding method compresses the total length field of the IPv4
header. The total length field of the IPv4 header is defined in header. The total length field of the IPv4 header is defined in
[RFC0791] as follows: [RFC0791] as follows:
Total Length: 16 bits Total Length: 16 bits
Total Length is the length of the datagram, measured in octets, Total Length is the length of the datagram, measured in octets,
skipping to change at page 58, line 24 skipping to change at page 58, line 24
// If extracting the irregular chain for an compressed packet: // If extracting the irregular chain for an compressed packet:
// - ttl_irregular_chain_flag must have the same value as it had when // - ttl_irregular_chain_flag must have the same value as it had when
// processing co_baseheader. // processing co_baseheader.
// - ip_inner_ecn is bound in this encoding method and the value that // - ip_inner_ecn is bound in this encoding method and the value that
// it gets bound to should be passed to the tcp encoding method // it gets bound to should be passed to the tcp encoding method
// For other formats than the irregular chain, these two are ignored // For other formats than the irregular chain, these two are ignored
ipv6(is_innermost, ttl_irregular_chain_flag, ip_inner_ecn) ipv6(is_innermost, ttl_irregular_chain_flag, ip_inner_ecn)
{ {
UNCOMPRESSED { UNCOMPRESSED {
version =:= uncompressed_value(4, 6) [ 4 ]; version =:= uncompressed_value(4, 6) [ 4 ];
tos_tc [ 6 ]; dscp [ 6 ];
ip_ecn_flags [ 2 ]; ip_ecn_flags [ 2 ];
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 ];
} }
DEFAULT { DEFAULT {
tos_tc =:= static; dscp =:= static;
ip_ecn_flags =:= static; ip_ecn_flags =:= 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 ]; reserved =:= '00' [ 2 ];
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_dynamic { COMPRESSED ipv6_dynamic {
tos_tc =:= irregular(6) [ 6 ]; dscp =:= irregular(6) [ 6 ];
ip_ecn_flags =:= irregular(2) [ 2 ]; ip_ecn_flags =:= irregular(2) [ 2 ];
ttl_hopl =:= irregular(8) [ 8 ]; ttl_hopl =:= irregular(8) [ 8 ];
} }
COMPRESSED ipv6_replicate { COMPRESSED ipv6_replicate {
tos_tc =:= irregular(6) [ 6 ]; dscp =:= irregular(6) [ 6 ];
ip_ecn_flags =:= irregular(2) [ 2 ]; ip_ecn_flags =:= irregular(2) [ 2 ];
reserved =:= '000' [ 3 ]; reserved =:= '000' [ 3 ];
flow_label =:= fl_enc [ 5, 21 ]; flow_label =:= fl_enc [ 5, 21 ];
} }
COMPRESSED ipv6_outer_without_ttl_irregular { COMPRESSED ipv6_outer_without_ttl_irregular {
tos_tc =:= static_or_irreg(ecn_used.UVALUE, 6) [ 0, 6 ]; dscp =:= static_or_irreg(ecn_used.UVALUE, 6) [ 0, 6 ];
ip_ecn_flags =:= static_or_irreg(ecn_used.UVALUE, 2) [ 0, 2 ]; ip_ecn_flags =:= static_or_irreg(ecn_used.UVALUE, 2) [ 0, 2 ];
ENFORCE(ttl_irregular_chain_flag == 0); ENFORCE(ttl_irregular_chain_flag == 0);
ENFORCE(is_innermost == false); ENFORCE(is_innermost == false);
} }
COMPRESSED ipv6_outer_with_ttl_irregular { COMPRESSED ipv6_outer_with_ttl_irregular {
tos_tc =:= static_or_irreg(ecn_used.UVALUE, 6) [ 0, 6 ]; dscp =:= static_or_irreg(ecn_used.UVALUE, 6) [ 0, 6 ];
ip_ecn_flags =:= static_or_irreg(ecn_used.UVALUE, 2) [ 0, 2 ]; ip_ecn_flags =:= static_or_irreg(ecn_used.UVALUE, 2) [ 0, 2 ];
ttl_hopl =:= irregular(8) [ 8 ]; ttl_hopl =:= irregular(8) [ 8 ];
ENFORCE(ttl_irregular_chain_flag == 1); ENFORCE(ttl_irregular_chain_flag == 1);
ENFORCE(is_innermost == false); ENFORCE(is_innermost == false);
} }
COMPRESSED ipv6_innermost_irregular { COMPRESSED ipv6_innermost_irregular {
ENFORCE(ip_inner_ecn == ip_ecn_flags.UVALUE); ENFORCE(ip_inner_ecn == ip_ecn_flags.UVALUE);
ENFORCE(is_innermost == true); ENFORCE(is_innermost == true);
} }
skipping to change at page 61, line 37 skipping to change at page 61, line 37
// - ttl_irregular_chain_flag must have the same value as it had when // - ttl_irregular_chain_flag must have the same value as it had when
// processing co_baseheader. // processing co_baseheader.
// - ip_inner_ecn is bound in this encoding method and the value that // - ip_inner_ecn is bound in this encoding method and the value that
// it gets bound to should be passed to the tcp encoding method // it gets bound to should be passed to the tcp encoding method
// For other formats than the irregular chain, these two are ignored // For other formats than the irregular chain, these two are ignored
ipv4(is_innermost, ttl_irregular_chain_flag, ip_inner_ecn) ipv4(is_innermost, ttl_irregular_chain_flag, ip_inner_ecn)
{ {
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 [ 6 ]; dscp [ 6 ];
ip_ecn_flags [ 2 ]; ip_ecn_flags [ 2 ];
length [ 16 ]; 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 [ 16 ]; checksum [ 16 ];
src_addr [ 32 ]; src_addr [ 32 ];
dst_addr [ 32 ]; dst_addr [ 32 ];
} }
CONTROL { CONTROL {
ip_id_behavior [ 2 ]; ip_id_behavior [ 2 ];
} }
DEFAULT { DEFAULT {
tos_tc =:= static; dscp =:= static;
ip_ecn_flags =:= static; ip_ecn_flags =:= static;
length =:= inferred_ip_v4_length; length =:= inferred_ip_v4_length;
df =:= static; df =:= static;
ttl_hopl =:= static; ttl_hopl =:= static;
protocol =:= static; protocol =:= static;
checksum =:= inferred_ip_v4_header_checksum; checksum =:= inferred_ip_v4_header_checksum;
src_addr =:= static; src_addr =:= static;
dst_addr =:= static; dst_addr =:= static;
ip_id_behavior =:= static; ip_id_behavior =:= static;
} }
skipping to change at page 62, line 32 skipping to change at page 62, line 32
reserved =:= '0000000' [ 7 ]; reserved =:= '0000000' [ 7 ];
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_dynamic { COMPRESSED ipv4_dynamic {
reserved =:= '00000' [ 5 ]; reserved =:= '00000' [ 5 ];
df =:= irregular(1) [ 1 ]; df =:= irregular(1) [ 1 ];
ip_id_behavior =:= ip_id_behavior_choice(is_innermost) [ 2 ]; ip_id_behavior =:= ip_id_behavior_choice(is_innermost) [ 2 ];
tos_tc =:= irregular(6) [ 6 ]; dscp =:= irregular(6) [ 6 ];
ip_ecn_flags =:= irregular(2) [ 2 ]; ip_ecn_flags =:= irregular(2) [ 2 ];
ttl_hopl =:= irregular(8) [ 8 ]; ttl_hopl =:= irregular(8) [ 8 ];
ip_id =:= ip_id =:=
ip_id_enc_dyn(ip_id_behavior.UVALUE) [ 0, 16 ]; ip_id_enc_dyn(ip_id_behavior.UVALUE) [ 0, 16 ];
} }
COMPRESSED ipv4_replicate { COMPRESSED ipv4_replicate {
reserved =:= '0000' [ 4 ]; reserved =:= '0000' [ 4 ];
ip_id_behavior =:= ip_id_behavior_choice(is_innermost) [ 2 ]; ip_id_behavior =:= ip_id_behavior_choice(is_innermost) [ 2 ];
ttl_flag =:= irregular(1) [ 1 ]; ttl_flag =:= irregular(1) [ 1 ];
df =:= irregular(1) [ 1 ]; df =:= irregular(1) [ 1 ];
tos_tc =:= irregular(6) [ 6 ]; dscp =:= irregular(6) [ 6 ];
ip_ecn_flags =:= irregular(2) [ 2 ]; ip_ecn_flags =:= irregular(2) [ 2 ];
ip_id =:= ip_id =:=
ip_id_enc_dyn(ip_id_behavior.UVALUE) [ 0, 16 ]; ip_id_enc_dyn(ip_id_behavior.UVALUE) [ 0, 16 ];
ttl_hopl =:= ttl_hopl =:=
static_or_irreg(ttl_flag.UVALUE, 8) [ 0, 8 ]; static_or_irreg(ttl_flag.UVALUE, 8) [ 0, 8 ];
} }
COMPRESSED ipv4_outer_without_ttl_irregular { COMPRESSED ipv4_outer_without_ttl_irregular {
ip_id =:= ip_id =:=
ip_id_enc_irreg(ip_id_behavior.UVALUE) [ 0, 16 ]; ip_id_enc_irreg(ip_id_behavior.UVALUE) [ 0, 16 ];
tos_tc =:= static_or_irreg(ecn_used.UVALUE, 6) [ 0, 6 ]; dscp =:= static_or_irreg(ecn_used.UVALUE, 6) [ 0, 6 ];
ip_ecn_flags =:= static_or_irreg(ecn_used.UVALUE, 2) [ 0, 2 ]; ip_ecn_flags =:= static_or_irreg(ecn_used.UVALUE, 2) [ 0, 2 ];
ENFORCE(ttl_irregular_chain_flag == 0); ENFORCE(ttl_irregular_chain_flag == 0);
ENFORCE(is_innermost == false); ENFORCE(is_innermost == false);
} }
COMPRESSED ipv4_outer_with_ttl_irregular { COMPRESSED ipv4_outer_with_ttl_irregular {
ip_id =:= ip_id =:=
ip_id_enc_irreg(ip_id_behavior.UVALUE) [ 0, 16 ]; ip_id_enc_irreg(ip_id_behavior.UVALUE) [ 0, 16 ];
tos_tc =:= static_or_irreg(ecn_used.UVALUE, 6) [ 0, 6 ]; dscp =:= static_or_irreg(ecn_used.UVALUE, 6) [ 0, 6 ];
ip_ecn_flags =:= static_or_irreg(ecn_used.UVALUE, 2) [ 0, 2 ]; ip_ecn_flags =:= static_or_irreg(ecn_used.UVALUE, 2) [ 0, 2 ];
ttl_hopl =:= irregular(8) [ 8 ]; ttl_hopl =:= irregular(8) [ 8 ];
ENFORCE(is_innermost == false); ENFORCE(is_innermost == false);
ENFORCE(ttl_irregular_chain_flag == 1); ENFORCE(ttl_irregular_chain_flag == 1);
} }
COMPRESSED ipv4_innermost_irregular { COMPRESSED ipv4_innermost_irregular {
ip_id =:= ip_id =:=
ip_id_enc_irreg(ip_id_behavior.UVALUE) [ 0, 16 ]; ip_id_enc_irreg(ip_id_behavior.UVALUE) [ 0, 16 ];
ENFORCE(ip_inner_ecn == ip_ecn_flags.UVALUE); ENFORCE(ip_inner_ecn == ip_ecn_flags.UVALUE);
skipping to change at page 75, line 16 skipping to change at page 75, line 16
tcp_ecn_flags =:= tcp_ecn_flags =:=
static_or_irreg(ecn_used.CVALUE, 2) [ 0, 2 ]; static_or_irreg(ecn_used.CVALUE, 2) [ 0, 2 ];
checksum =:= irregular(16) [ 16 ]; checksum =:= irregular(16) [ 16 ];
} }
} }
/////////////////////////////////////////////////// ///////////////////////////////////////////////////
// Encoding methods used in compressed base headers // Encoding methods used in compressed base headers
/////////////////////////////////////////////////// ///////////////////////////////////////////////////
tos_tc_enc(flag) dscp_enc(flag)
{ {
UNCOMPRESSED { UNCOMPRESSED {
tos_tc [ 6 ]; dscp [ 6 ];
} }
COMPRESSED static_enc { COMPRESSED static_enc {
tos_tc =:= static [ 0 ]; dscp =:= static [ 0 ];
ENFORCE(flag == 0); ENFORCE(flag == 0);
} }
COMPRESSED irreg { COMPRESSED irreg {
tos_tc =:= irregular(6) [ 6 ]; dscp =:= irregular(6) [ 6 ];
padding =:= compressed_value(2, 0) [ 2 ]; padding =:= compressed_value(2, 0) [ 2 ];
ENFORCE(flag == 1); ENFORCE(flag == 1);
} }
} }
ip_id_lsb(behavior, k, p) ip_id_lsb(behavior, k, p)
{ {
UNCOMPRESSED { UNCOMPRESSED {
ip_id [ 16 ]; ip_id [ 16 ];
} }
skipping to change at page 77, line 26 skipping to change at page 77, line 26
// of an outer header has changed. The same value must be passed as // of an outer header has changed. The same value must be passed as
// an argument to the ipv4/ipv6 encoding methods when extracting // an argument to the ipv4/ipv6 encoding methods when extracting
// the irregular chain items. // the irregular chain items.
co_baseheader(payload_size, ack_stride_value, co_baseheader(payload_size, ack_stride_value,
ttl_irregular_chain_flag) ttl_irregular_chain_flag)
{ {
UNCOMPRESSED v4 { UNCOMPRESSED v4 {
outer_headers =:= baseheader_outer_headers [ VARIABLE ]; outer_headers =:= baseheader_outer_headers [ VARIABLE ];
version =:= uncompressed_value(4, 4) [ 4 ]; version =:= uncompressed_value(4, 4) [ 4 ];
header_length =:= uncompressed_value(4, 5) [ 4 ]; header_length =:= uncompressed_value(4, 5) [ 4 ];
tos_tc [ 6 ]; dscp [ 6 ];
ip_ecn_flags [ 2 ]; ip_ecn_flags [ 2 ];
length [ 16 ]; 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 ];
next_header [ 8 ]; next_header [ 8 ];
checksum [ 16 ]; checksum [ 16 ];
skipping to change at page 78, line 12 skipping to change at page 78, line 12
rsf_flags [ 3 ]; rsf_flags [ 3 ];
window [ 16 ]; window [ 16 ];
tcp_checksum [ 16 ]; tcp_checksum [ 16 ];
urg_ptr [ 16 ]; urg_ptr [ 16 ];
options [ (data_offset.UVALUE-5)*32 ]; options [ (data_offset.UVALUE-5)*32 ];
} }
UNCOMPRESSED v6 { UNCOMPRESSED v6 {
outer_headers =:= baseheader_outer_headers [ VARIABLE ]; outer_headers =:= baseheader_outer_headers [ VARIABLE ];
version =:= uncompressed_value(4, 6) [ 4 ]; version =:= uncompressed_value(4, 6) [ 4 ];
tos_tc [ 6 ]; dscp [ 6 ];
ip_ecn_flags [ 2 ]; ip_ecn_flags [ 2 ];
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 ];
dest_addr [ 128 ]; dest_addr [ 128 ];
extension_headers =:= baseheader_extension_headers [ VARIABLE ]; extension_headers =:= baseheader_extension_headers [ VARIABLE ];
src_port [ 16 ]; src_port [ 16 ];
dest_port [ 16 ]; dest_port [ 16 ];
skipping to change at page 79, line 14 skipping to change at page 79, line 14
INITIAL { INITIAL {
ack_stride =:= uncompressed_value(16, 0); ack_stride =:= uncompressed_value(16, 0);
} }
DEFAULT { DEFAULT {
tcp_ecn_flags =:= static; tcp_ecn_flags =:= static;
data_offset =:= inferred_offset; data_offset =:= inferred_offset;
tcp_res_flags =:= static; tcp_res_flags =:= static;
rsf_flags =:= uncompressed_value(3, 0); rsf_flags =:= uncompressed_value(3, 0);
dest_port =:= static; dest_port =:= static;
tos_tc =:= static; dscp =:= static;
src_port =:= static; src_port =:= static;
urg_flag =:= uncompressed_value(1, 0); urg_flag =:= uncompressed_value(1, 0);
window =:= static; window =:= static;
dest_addr =:= static; dest_addr =:= static;
version =:= static; version =:= static;
ttl_hopl =:= static; ttl_hopl =:= static;
src_addr =:= static; src_addr =:= static;
df =:= static; df =:= static;
ack_number =:= static; ack_number =:= static;
urg_ptr =:= static; urg_ptr =:= static;
skipping to change at page 80, line 18 skipping to change at page 80, line 18
rsf_flags =:= rsf_index_enc [ 2 ]; rsf_flags =:= rsf_index_enc [ 2 ];
msn =:= lsb(4, 4) [ 4 ]; msn =:= lsb(4, 4) [ 4 ];
seq_indicator =:= irregular(2) [ 2 ]; seq_indicator =:= irregular(2) [ 2 ];
ack_indicator =:= irregular(2) [ 2 ]; ack_indicator =:= irregular(2) [ 2 ];
ack_stride_indicator =:= irregular(1) [ 1 ]; ack_stride_indicator =:= irregular(1) [ 1 ];
window_indicator =:= irregular(1) [ 1 ]; window_indicator =:= irregular(1) [ 1 ];
ip_id_indicator =:= irregular(1) [ 1 ]; ip_id_indicator =:= irregular(1) [ 1 ];
urg_ptr_present =:= irregular(1) [ 1 ]; urg_ptr_present =:= irregular(1) [ 1 ];
reserved =:= compressed_value(1, 0) [ 1 ]; reserved =:= compressed_value(1, 0) [ 1 ];
ecn_used =:= one_bit_choice [ 1 ]; ecn_used =:= one_bit_choice [ 1 ];
tos_tc_present =:= irregular(1) [ 1 ]; dscp_present =:= irregular(1) [ 1 ];
ttl_hopl_present =:= irregular(1) [ 1 ]; ttl_hopl_present =:= irregular(1) [ 1 ];
list_present =:= irregular(1) [ 1 ]; list_present =:= irregular(1) [ 1 ];
ip_id_behavior =:= ip_id_behavior_choice(true) [ 2 ]; ip_id_behavior =:= ip_id_behavior_choice(true) [ 2 ];
urg_flag =:= irregular(1) [ 1 ]; urg_flag =:= irregular(1) [ 1 ];
df =:= dont_fragment(version.UVALUE) [ 1 ]; df =:= dont_fragment(version.UVALUE) [ 1 ];
header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ]; header_crc =:= crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ];
seq_number =:= seq_number =:=
variable_length_32_enc(seq_indicator.CVALUE) [ 0, 8, 16, 32 ]; variable_length_32_enc(seq_indicator.CVALUE) [ 0, 8, 16, 32 ];
ack_number =:= ack_number =:=
variable_length_32_enc(ack_indicator.CVALUE) [ 0, 8, 16, 32 ]; variable_length_32_enc(ack_indicator.CVALUE) [ 0, 8, 16, 32 ];
ack_stride =:= ack_stride =:=
static_or_irreg(ack_stride_indicator.CVALUE, 16) [ 0, 16 ]; static_or_irreg(ack_stride_indicator.CVALUE, 16) [ 0, 16 ];
window =:= window =:=
static_or_irreg(window_indicator.CVALUE, 16) [ 0, 16 ]; static_or_irreg(window_indicator.CVALUE, 16) [ 0, 16 ];
ip_id =:= ip_id =:=
optional_ip_id_lsb(ip_id_behavior.UVALUE, optional_ip_id_lsb(ip_id_behavior.UVALUE,
ip_id_indicator.CVALUE) [ 0, 8, 16 ]; ip_id_indicator.CVALUE) [ 0, 8, 16 ];
urg_ptr =:= urg_ptr =:=
static_or_irreg(urg_ptr_present.CVALUE, 16) [ 0, 16 ]; static_or_irreg(urg_ptr_present.CVALUE, 16) [ 0, 16 ];
tos_tc =:= dscp =:=
tos_tc_enc(tos_tc_present.CVALUE) [ 0, 8 ]; dscp_enc(dscp_present.CVALUE) [ 0, 8 ];
ttl_hopl =:= ttl_hopl =:=
static_or_irreg(ttl_hopl_present.CVALUE, 8) [ 0, 8 ]; static_or_irreg(ttl_hopl_present.CVALUE, 8) [ 0, 8 ];
options =:= options =:=
tcp_list_presence_enc(list_present.CVALUE) [ VARIABLE ]; tcp_list_presence_enc(list_present.CVALUE) [ VARIABLE ];
} }
// Send LSBs of sequence number // Send LSBs of sequence number
COMPRESSED rnd_1 { COMPRESSED rnd_1 {
discriminator =:= '101110' [ 6 ]; discriminator =:= '101110' [ 6 ];
seq_number =:= lsb(18, 65535) [ 18 ]; seq_number =:= lsb(18, 65535) [ 18 ];
skipping to change at page 90, line 17 skipping to change at page 90, line 17
by Sally Floyd who provided a review at the request of the Transport by Sally Floyd who provided a review at the request of the Transport
Area Directors. Area Directors.
12. References 12. References
12.1. Normative References 12.1. Normative References
[I-D.ietf-rohc-formal-notation] [I-D.ietf-rohc-formal-notation]
Pelletier, G. and R. Finking, "Formal Notation for Robust Pelletier, G. and R. Finking, "Formal Notation for Robust
Header Compression (ROHC-FN)", Header Compression (ROHC-FN)",
draft-ietf-rohc-formal-notation-12 (work in progress), draft-ietf-rohc-formal-notation-13 (work in progress),
November 2006. December 2006.
[I-D.ietf-rohc-rfc3095bis-framework] [I-D.ietf-rohc-rfc3095bis-framework]
Jonsson, L., Pelletier, G., and K. Sandlund, "The RObust Jonsson, L., Pelletier, G., and K. Sandlund, "The RObust
Header Compression (ROHC) Framework", Header Compression (ROHC) Framework",
draft-ietf-rohc-rfc3095bis-framework-02 (work in draft-ietf-rohc-rfc3095bis-framework-02 (work in
progress), October 2006. progress), October 2006.
[RFC0791] Postel, J., "Internet Protocol", STD 5, RFC 791, [RFC0791] Postel, J., "Internet Protocol", STD 5, RFC 791,
September 1981. September 1981.
skipping to change at page 93, line 7 skipping to change at page 93, line 7
Roke Manor Research Ltd. Roke Manor Research Ltd.
Romsey, Hampshire SO51 0ZN Romsey, Hampshire SO51 0ZN
UK UK
Phone: +44 1794 833311 Phone: +44 1794 833311
Email: mark.a.west@roke.co.uk Email: mark.a.west@roke.co.uk
URI: http://www.roke.co.uk URI: http://www.roke.co.uk
Full Copyright Statement Full Copyright Statement
Copyright (C) The IETF Trust (2006). Copyright (C) The IETF Trust (2007).
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. 32 change blocks. 
41 lines changed or deleted 38 lines changed or added

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