| < 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/ | ||||