idnits 2.17.00 (12 Aug 2021) /tmp/idnits5874/draft-brinkmann-rohc-3095-fn-00.txt: Checking boilerplate required by RFC 5378 and the IETF Trust (see https://trustee.ietf.org/license-info): ---------------------------------------------------------------------------- ** It looks like you're using RFC 3978 boilerplate. You should update this to the boilerplate described in the IETF Trust License Policy document (see https://trustee.ietf.org/license-info), which is required now. -- Found old boilerplate from RFC 3978, Section 5.1.a on line 17. -- Found old boilerplate from RFC 3978, Section 5.5 on line 1019. -- Found old boilerplate from RFC 3979, Section 5, paragraph 1 on line 996. -- Found old boilerplate from RFC 3979, Section 5, paragraph 2 on line 1003. -- Found old boilerplate from RFC 3979, Section 5, paragraph 3 on line 1009. ** The document seems to lack an RFC 3978 Section 5.1 IPR Disclosure Acknowledgement. ** This document has an original RFC 3978 Section 5.4 Copyright Line, instead of the newer IETF Trust Copyright according to RFC 4748. ** This document has an original RFC 3978 Section 5.5 Disclaimer, instead of the newer disclaimer which includes the IETF Trust according to RFC 4748. ** The document uses RFC 3667 boilerplate or RFC 3978-like boilerplate instead of verbatim RFC 3978 boilerplate. After 6 May 2005, submission of drafts without verbatim RFC 3978 boilerplate is not accepted. The following non-3978 patterns matched text found in the document. That text should be removed or replaced: This document is an Internet-Draft and is subject to all provisions of Section 3 of RFC 3667. By submitting this Internet-Draft, each author represents that any 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 aware will be disclosed, in accordance with Section 6 of BCP 79. Checking nits according to https://www.ietf.org/id-info/1id-guidelines.txt: ---------------------------------------------------------------------------- == No 'Intended status' indicated for this document; assuming Proposed Standard Checking nits according to https://www.ietf.org/id-info/checklist : ---------------------------------------------------------------------------- ** The document seems to lack a Security Considerations section. ** The document seems to lack an IANA Considerations section. (See Section 2.2 of https://www.ietf.org/id-info/checklist for how to handle the case when there are no actions for IANA.) ** The document seems to lack separate sections for Informative/Normative References. All references will be assumed normative when checking for downward references. ** There are 21 instances of too long lines in the document, the longest one being 4 characters in excess of 72. ** There are 597 instances of lines with control characters in the document. ** The abstract seems to contain references ([2]), which it shouldn't. Please replace those with straight textual mentions of the documents in question. == There are 1 instance of lines with non-RFC6890-compliant IPv4 addresses in the document. If these are example addresses, they should be changed. ** The document seems to lack a both a reference to RFC 2119 and the recommended RFC 2119 boilerplate, even if it appears to use RFC 2119 keywords. RFC 2119 keyword, line 763: '...% FIXME: context MUST NOT contain IPv4...' RFC 2119 keyword, line 781: '...% FIXME: context MUST contain at least...' Miscellaneous warnings: ---------------------------------------------------------------------------- == The copyright year in the RFC 3978 Section 5.4 Copyright Line does not match the current year -- The document seems to lack a disclaimer for pre-RFC5378 work, but may have content which was first submitted before 10 November 2008. If you have contacted all the original authors and they are all willing to grant the BCP78 rights to the IETF Trust, then this is fine, and you can ignore this comment. If not, you may need to add the pre-RFC5378 disclaimer. (See the Legal Provisions document at https://trustee.ietf.org/license-info for more information.) -- The document date (October 18, 2004) is 6417 days in the past. Is this intentional? Checking references for intended status: Proposed Standard ---------------------------------------------------------------------------- (See RFCs 3967 and 4897 for information about using normative references to lower-maturity documents in RFCs) == Outdated reference: draft-ietf-rohc-formal-notation has been published as RFC 4997 == Outdated reference: draft-ietf-rohc-tcp has been published as RFC 4996 ** Obsolete normative reference: RFC 3242 (ref. '4') (Obsoleted by RFC 4362) == Outdated reference: draft-ietf-rohc-udp-lite has been published as RFC 4019 Summary: 13 errors (**), 0 flaws (~~), 6 warnings (==), 7 comments (--). Run idnits with the --verbose option for more detailed information about the items above. -------------------------------------------------------------------------------- 2 Robust Header Compression E. Brinkmann 3 Internet-Draft C. Bormann 4 Expires: April 18, 2005 Universitaet Bremen TZI 5 October 18, 2004 7 RTP-ROHC in ROHC Formal Notation 8 draft-brinkmann-rohc-3095-fn-00.txt 10 Status of this Memo 12 This document is an Internet-Draft and is subject to all provisions 13 of section 3 of RFC 3667. By submitting this Internet-Draft, each 14 author represents that any applicable patent or other IPR claims of 15 which he or she is aware have been or will be disclosed, and any of 16 which he or she become aware will be disclosed, in accordance with 17 RFC 3668. 19 Internet-Drafts are working documents of the Internet Engineering 20 Task Force (IETF), its areas, and its working groups. Note that 21 other groups may also distribute working documents as 22 Internet-Drafts. 24 Internet-Drafts are draft documents valid for a maximum of six months 25 and may be updated, replaced, or obsoleted by other documents at any 26 time. It is inappropriate to use Internet-Drafts as reference 27 material or to cite them other than as "work in progress." 29 The list of current Internet-Drafts can be accessed at 30 http://www.ietf.org/ietf/1id-abstracts.txt. 32 The list of Internet-Draft Shadow Directories can be accessed at 33 http://www.ietf.org/shadow.html. 35 This Internet-Draft will expire on April 18, 2005. 37 Copyright Notice 39 Copyright (C) The Internet Society (2004). 41 Abstract 43 RFC 3095 [2] defines four ROHC profiles for the header compression of 44 IP, UDP, RTP, ESP, and related protocol headers. RFC 3095 is defined 45 in English language and taditional RFC box notation. The present 46 document gives a definition of RFC 3095's packet formats in the ROHC 47 Formal Notation that was defined to facilitate the development of the 48 TCP header compression ROHC profile. 50 $Revision: 1.10 $ 52 Table of Contents 54 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 55 2. RFC 3095 Formal Notation Specification . . . . . . . . . . . 3 56 3. References . . . . . . . . . . . . . . . . . . . . . . . . . 21 57 Authors' Addresses . . . . . . . . . . . . . . . . . . . . . 22 58 Intellectual Property and Copyright Statements . . . . . . . 23 60 1. Introduction 62 RFC 3095 [2] defines four ROHC profiles for the header compression of 63 IP, UDP, RTP, ESP, and related protocol headers. RFC 3095 is defined 64 in English language and taditional RFC box notation. 66 ROHC FN [1] is a formal notation designed to help with the creation 67 of new ROHC RFC-3095 [2] header compression profiles, in particular 68 the TCP ROHC [3] profile currently under development. 70 The present document gives a definition of RFC 3095's packet formats 71 in the ROHC Formal Notation defined for the TCP header compression 72 ROHC profile. 74 This work is intended to serve three purposes: 75 o validate ROHC-FN further by showing that large parts of RFC 3095 76 can be reasonably specified in it, 77 o facilitate work on automatic validation and test case generation 78 for RFC 3095, and 79 o possibly contribute to a Draft Standard version of RFC 3095 and 80 related profiles (LLA [4], R-mode LLA [5], IP ROHC [6], and 81 UDP-lite based RTP ROHC [7]), in case it is decided to use ROHC-FN 82 to facilitate advancing these documents to Draft Standards level. 84 A number of caveats apply to the current version of the 85 specification: 86 o Formats are currently defined for profile 0x0001 (RTP) only. The 87 other RFC 3095 profiles, as well as the profiles for the related 88 standards, will be added once the profile 0x0001 specification 89 stabilizes. 90 o The current specification is based on an interim state of the 91 ROHC-FN notation. This interim state has significant changes from 92 the -03 version [1] referenced above. Further changes might occur 93 on the way to the -04 version of the notation, which cannot be 94 tracked in this document because a later draft deadline applies to 95 the notation. 96 o There are still a few open issues. In particular, the way list 97 notation can be used to represent RFC 3095 list compression is not 98 yet entirely worked out. Further open issues include the handling 99 of GRE and authentication header data and the encoding of 100 extension formats. Finally, the extent to which the expressive 101 power of the notation should be used to express the english 102 language constraints noted with the individual packet formats 103 needs to be decided. See the FIXMEs below for details. 105 2. RFC 3095 Formal Notation Specification 106 %% RFC 3095 Profile 0x0001 (RTP/UDP/IP) in ROHC-FN 107 % $Revision: 1.20 $ 109 % TODO: 110 % 111 % - handle AH and GRE 112 % - extension formats 113 % - CSRC list (currently defined as static, must use list encoding) 114 % - further conditions for selection / disambiguation between different 115 % packet formats in rtp_udp_ip structure (for R-1*, UO-1* and UOR-2*, 116 % see comments below and notes in RFC 3095) 117 % - better description for encoding methods not defined in FN 118 % (RTP timestamp encoding and others) 120 % Notes: 121 % 122 % - This specification uses the field attributes 'context_value' and 123 % 'context_length' which are not defined in the current FN draft 124 % to refer to a field's context value. 126 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 127 % 128 % Encoding methods used in this profile that are not defined in FN: 130 ah_data(ah) === "Encoding of authentication header data according to 131 section 5.8.4.2 of RFC 3095"; 132 % FIXME: AH handling needs some extensions to decide at which 133 % place in the compressed header the data appear (depending on 134 % the conditions specified in 5.8.4.2). 136 inferred_ipv4_length === "This encoding method does not generate any bits 137 in the compressed header. Upon decompression the uncomp_value 138 attribute of the IPv4 total length field is inferred from the 139 amount of uncompressed data."; 141 inferred_ipv6_length === "This encoding method does not generate any bits 142 in the compressed header. Upon decompression the uncomp_value 143 attribute of the IPv6 payload length field is inferred from 144 the amount of uncompressed data."; 146 inferred_udp_length === "This encoding method does not generate any bits 147 in the compressed header. Upon decompression the uncomp_value 148 attribute of the UDP length field is inferred from the amount 149 of uncompressed data."; 151 inferred_ipv4_header_checksum === "This encoding method does not generate 152 any bits in the compressed header. Upon decompression the 153 checksum value is re-calculated from the uncompressed header 154 data as specified in section 3.1 of RFC 791."; 156 inferred_rtp_timestamp === "This encoding method does not generate any 157 bits in the compressed header. Upon decompression the 158 uncompressed timestamp value is calculated from the RTP 159 sequence number."; 160 % FIXME: Detailed description / reference 162 rtp_timestamp(bits) === "Compresses RTP timestamps as described in 163 section 5.7 of RFC 3095"; 164 % 165 % If value(TIME_STRIDE) > 0, timer-based compression of the RTP 166 % Timestamp is used (see section 4.5.4). 167 % 168 % If value(Tsc) = 1, Scaled RTP Timestamp encoding is used before 169 % compression (see section 4.5.3), and default-slope(TS) = 1. 170 % 171 % If value(Tsc) = 0, the Timestamp value is compressed as-is, and 172 % default-slope(TS) = value(TS_STRIDE). 173 % 174 % The interpretation intervals, see section 4.5.1, are defined as 175 % follows: 176 % 177 % p = 2^(bits(TS)-2) - 1 179 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 180 % 181 % Misc Stuff 182 % 184 crc3 (data_value, data_length) === 185 { 186 uncompressed_format = ; 188 compressed_format = crc_value, %[ 3 ] 189 { 190 crc_value ::= crc(3, 0x06, 0x07, data_value, data_length); 191 }; 192 }; 194 crc7 (data_value, data_length) === 195 { 196 uncompressed_format = ; 198 compressed_format = crc_value, %[ 7 ] 199 { 200 crc_value ::= crc(7, 0x79, 0x7f, data_value, data_length); 201 }; 202 }; 204 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 205 % 206 % IPv4 Header 207 % 209 ipv4 (id, rnd, nbo) === { 211 uncompressed_format = version, %[ 4 ] 212 hdr_length, %[ 4 ] 213 tos, %[ 6 ] 214 ecn_flags, %[ 2 ] 215 length, %[ 16 ] 216 ip_id, %[ 16 ] 217 df, %[ 1 ] 218 mf, %[ 1 ] 219 rf, %[ 1 ] 220 offset, %[ 13 ] 221 ttl, %[ 8 ] 222 protocol, %[ 8 ] 223 checksum, %[ 16 ] 224 src_addr, %[ 32 ] 225 dst_addr; %[ 32 ] 227 default_methods = 228 { 229 % FIXME: The fields ip_id_rnd and ip_id_nbo are flags that 230 % are NOT present in the compressed or uncompressed IPv4 231 % header. They should be bound with the RND and NBO flags 232 % corresponding to this IPv4 header. 233 % 234 let (ip_id_rnd:uncomp_length == 1); 235 let (ip_id_nbo:uncomp_length == 1); 237 version ::= uncompressed_value(4, 4); 238 hdr_length ::= uncompressed_value(4, 5); 239 tos ::= static; 240 ecn_flags ::= static; 241 length ::= inferred_ipv4_length; 242 ip_id ::= irregular(16); 243 ip_id_rnd ::= static; 244 ip_id_nbo ::= static; 245 df ::= static; 246 mf ::= uncompressed_value(1, 0); 247 rf ::= static; 248 offset ::= uncompressed_value(13, 0); 249 ttl ::= static; 250 protocol ::= static; % in RTP/UDP/IP profile always 17 (UDP) 251 checksum ::= inferred_ipv4_header_checksum; 252 src_addr ::= static; 253 dst_addr ::= static; 254 }; 256 format_ipv4 = 257 { 258 let (id == ip_id:uncomp_value); 259 let (rnd == ip_id_rnd:uncomp_value); 260 let (nbo == ip_id_nbo:uncomp_value); 261 }; 263 }; 265 ip_id_offset (nbits, sn, id1, rnd1, nbo1, id2, rnd2, nbo2) === { 266 % id1 (+ rnd1, nbo1) = IP-ID of inner IP header 267 % id2 (+ rnd2, nbo2) = IP-ID of outer IP header 269 % This encoding method will succeed only when rnd (which 270 % should be the RND or RND2 flag) is 0, i.e. packet formats 271 % using this method are not applicable to packet streams with 272 % random IP-IDs. 274 uncompressed_format = ; 276 format_inner_nbo = ip_id, 277 { 278 let (rnd1 == 0); 279 let (nbo1 == 1); 281 let (ip_id:uncomp_value == id1 - sn); 282 let (ip_id:uncomp_length == 16); 284 ip_id ::= lsb(nbits, 0); 285 }; 287 format_inner_non_nbo = ip_id, 288 { 289 let (rnd1 == 0); 290 let (nbo1 == 0); 292 let (ip_id:uncomp_value == 293 ((id1 / 256) + (id1 & 255) * 256) - sn); 294 let (ip_id:uncomp_length == 16); 296 ip_id ::= lsb(nbits, 0); 297 }; 299 format_outer_nbo = ip_id, 300 { 301 let (rnd1 == null || rnd1 == 1); 302 let (rnd2 == 0); 303 let (nbo2 == 1); 305 let (ip_id:uncomp_value == id2 - sn); 306 let (ip_id:uncomp_length == 16); 308 ip_id ::= lsb(nbits, 0); 309 }; 311 format_outer_non_nbo = ip_id, 312 { 313 let (rnd1 == null || rnd1 == 1); 314 let (rnd2 == 0); 315 let (nbo2 == 0); 317 let (ip_id:uncomp_value == 318 ((id2 / 256) + (id2 & 255) * 256) - sn); 319 let (ip_id:uncomp_length == 16); 321 ip_id ::= lsb(nbits, 0); 322 }; 324 }; 326 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 327 % 328 % IPv6 Header 329 % 331 ipv6 === { 333 uncompressed_format = version, %[ 4 ] 334 traffic_class, %[ 6 ] 335 ecn_flags, %[ 2 ] 336 flow_label, %[ 20 ] 337 payload_length, %[ 16 ] 338 next_header, %[ 8 ] 339 hop_limit, %[ 8 ] 340 src_addr, %[ 128 ] 341 dst_addr; %[ 128 ] 343 default_methods = 344 { 345 version ::= uncompressed_value(4, 6); 346 traffic_class ::= static; 347 ecn_flags ::= static; 348 flow_label ::= static; 349 payload_length ::= inferred_ipv6_length; 350 next_header ::= static; 351 hop_limit ::= static; 352 src_addr ::= static; 353 dst_addr ::= static; 354 }; 356 compressed_format = ; 358 }; 360 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 361 % 362 % IP Headers 363 % 364 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 366 ip_headers (id1, rnd1, nbo1, id2, rnd2, nbo2) === { 367 % id1 (+ rnd1, nbo1) = IP-ID of inner IP header 368 % id2 (+ rnd2, nbo2) = IP-ID of outer IP header 370 uncompressed_format_ipv4 = ipv4_header; 372 uncompressed_format_ipv6 = ipv6_header; 374 uncompressed_format_ipv4v4 = outer_ipv4_header, 375 inner_ipv4_header; 377 uncompressed_format_ipv4v6 = outer_ipv4_header, 378 inner_ipv6_header; 380 uncompressed_format_ipv6v4 = outer_ipv6_header, 381 inner_ipv4_header; 383 uncompressed_format_ipv6v6 = outer_ipv6_header, 384 inner_ipv6_header; 386 format_ipv4 = 387 { 388 ipv4_header ::= ipv4(id1, rnd1, nbo1); 389 let (id2 == null); 390 let (rnd2 == null); 391 let (nbo2 == null); 392 }; 394 format_ipv6 = 395 { 396 ipv6_header ::= ipv6; 397 let (id1 == null); 398 let (rnd1 == null); 399 let (nbo1 == null); 400 let (id2 == null); 401 let (rnd2 == null); 402 let (nbo2 == null); 403 }; 405 format_ipv4v4 = 406 { 407 outer_ipv4_header ::= ipv4(id2, rnd2, nbo2); 408 inner_ipv4_header ::= ipv4(id1, rnd1, nbo1); 409 }; 411 format_ipv4v6 = 412 { 413 outer_ipv4_header ::= ipv4(id2, rnd2, nbo2); 414 inner_ipv6_header ::= ipv6; 415 let (id1 == null); 416 let (rnd1 == null); 417 let (nbo1 == null); 418 }; 420 format_ipv6v4 = 421 { 422 outer_ipv6_header ::= ipv6; 423 inner_ipv4_header ::= ipv4(id1, rnd1, nbo1); 424 let (id2 == null); 425 let (rnd2 == null); 426 let (nbo2 == null); 427 }; 429 format_ipv6v6 = 430 { 431 outer_ipv6_header ::= ipv6; 432 inner_ipv6_header ::= ipv6; 433 let (id1 == null); 434 let (rnd1 == null); 435 let (nbo1 == null); 436 let (id2 == null); 437 let (rnd2 == null); 438 let (nbo2 == null); 439 }; 441 }; 443 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 444 % 445 % UDP Header 446 % 447 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 449 udp_header (udpcs, udpcs_ctx) === { 451 uncompressed_format = udp_src_port, %[ 16 ] 452 udp_dst_port, %[ 16 ] 453 udp_length, %[ 16 ] 454 udp_checksum; %[ 16 ] 456 default_methods = 457 { 458 udp_src_port ::= static; 459 udp_dst_port ::= static; 460 udp_length ::= inferred_udp_length; 461 udp_checksum ::= irregular(16); % NOTE: This is used 462 % for the uncompressed 463 }; % side of it only: 465 format_compressed = % NOTE: udp_checksum not present here! 466 { 467 let (udp_checksum:uncomp_length == 16); 468 let (udpcs == udp_checksum:uncomp_value); 469 let (udp_checksum:context_length == 16); 470 let (udpcs_ctx == udp_checksum:context_value); 471 }; 473 }; 475 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 476 % 477 % Extension formats (section 5.7.5 of RFC 3095) 478 % 479 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 480 extension (x) === { 482 uncompressed_format = ; 484 format_without_extension = 485 { 486 let (x == 0); 487 }; 489 % FIXME: The following four extension formats do not yet contain 490 % the encodings for their fields. These will need several additional 491 % structures (in particular for the optional fields) to be defined. 492 % A number of values will have to be passed as additional parameters 493 % to this structure as their uncompressed side is defined in other 494 % structures. 496 format_extension0 = discriminator, %[ 2 ] 497 sn, %[ 3 ] 498 pt, %[ 3 ] 499 { 500 let (x == 1); 501 discriminator ::= '00'; 502 }; 504 format_extension1 = discriminator, %[ 2 ] 505 sn, %[ 3 ] 506 pt, %[ 3 ] 507 mt, %[ 8 ] 508 { 509 let (x == 1); 510 discriminator ::= '01'; 511 }; 513 format_extension2 = discriminator, %[ 2 ] 514 sn, %[ 3 ] 515 pt, %[ 11 ] 516 mt, %[ 8 ] 517 { 518 let (x == 1); 519 discriminator ::= '10'; 520 }; 522 format_extension3 = discriminator, %[ 2 ] 523 s, %[ 1 ] 524 r_ts, %[ 1 ] 525 tsc, %[ 1 ] 526 i, %[ 1 ] 527 ip, %[ 1 ] 528 rtp, %[ 1 ] 529 inner_ip_flags, % 0 or 7 bits 530 ip2, % 0 or 1 bit 531 outer_ip_flags, % 0 or 8 bits 532 sn, % 0 or 8 bits 533 ts, % 0 to 4 octets 534 inner_ip_fields, % optional, variable length 535 ip_id, % 0 or 16 bits 536 outer_ip_fields, % optional, variable length 537 rtp_flags_and_fields, % optional, variable length 538 { 539 let (x == 1); 540 discriminator ::= '11'; 541 }; 543 }; 545 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 546 % 547 % Random Parts 548 % 549 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 551 random_ip_id (id, rnd) === { 553 uncompressed_format = ; 555 format_without_ip_id = 556 { 557 let (rnd == 0); 558 }; 560 format_with_ip_id = ip_id, 561 { 562 let (rnd == 1); 563 let (id == ip_id:uncomp_value); 564 ip_id ::= irregular(16); 565 }; 567 }; 569 random_ah_data (ah) === { 571 uncompressed_format = ; 573 format_without_ah_data = 574 { 575 let (ah == null); 576 }; 578 format_with_ah_data = ah_data, 579 { 580 let (ah != null); 581 ah_data ::= ah_data(ah); 582 }; 584 }; 586 random_gre_checksum (gre) === { 588 uncompressed_format = ; 590 format_without_gre_checksum = 591 { 592 let (gre == null); 593 }; 595 format_with_gre_checksum = gre_checksum, 596 { 597 let (gre != null); 598 let (gre == gre_checksum:uncomp_value); 599 gre_checksum ::= irregular(16); 600 }; 602 }; 604 random_ip_data (id, rnd, ah, gre) === { 606 uncompressed_format = ; 608 compressed_format = ip_id, 609 ah_data, 610 gre_checksum, 611 { 612 ip_id ::= random_ip_id(id, rnd); 613 ah_data ::= random_ah_data(ah); 614 gre_checksum ::= random_gre_checksum(gre); 615 }; 617 }; 618 random_udp_checksum (udpcs, udpcs_ctx) === { 620 uncompressed_format = ; 622 format_without_udp_checksum = 623 { 624 let (udpcs_ctx == 0); 625 let (udpcs == 0); 626 }; 628 format_with_udp_checksum = udp_checksum, 629 { 630 let (udpcs_ctx != 0); 631 let (udpcs == udp_checksum:uncomp_value); 632 udp_checksum ::= irregular(16); 633 }; 635 }; 637 random_parts (id1, rnd1, id2, rnd2, 638 ah1, ah2, gre1, gre2, udpcs, udpcs_ctx) === { 640 uncompressed_format = ; 642 compressed_format = outer_ip, 643 inner_ip, 644 udp_checksum, 645 { 646 outer_ip ::= random_ip_data(id1, rnd1, ah1, gre1); 647 inner_ip ::= random_ip_data(id2, rnd2, ah2, gre2); 648 udp_checksum ::= random_udp_checksum(udpcs, udpcs_ctx); 649 }; 651 }; 653 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 654 % 655 % RTP/UDP/IP Header 656 % 657 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 659 R = 0; % compression modes 660 U = 1; 661 O = 2; 662 rtp_udp_ip === { 664 uncompressed_format = ip_headers, 665 udp_header, %[ 8 ] 666 version, %[ 2 ] 667 padding, %[ 1 ] 668 rtpext, %[ 1 ] 669 csrc_count, %[ 4 ] 670 marker, %[ 1 ] 671 payload, %[ 7 ] 672 seq_number, %[ 16 ] 673 timestamp, %[ 32 ] 674 ssrc, %[ 32 ] 675 csrc; 677 default_methods = 678 { 679 % FIXME: The mode field represents the current mode of 680 % operation. This binding is not yet specified by means 681 % of the FN syntax. 682 let (mode:uncomp_length == 2); 684 mode ::= static; 685 % 686 ip_headers ::= ip_headers(id1, rnd1, nbo1, 687 id2, rnd2, nbo2); 688 % 689 udp_header ::= udp_header(udpcs, udpcs_ctx); 690 % 691 version ::= uncompressed_value(2, 2); 692 padding ::= static; 693 rtpext ::= static; 694 csrc_count ::= static; 695 marker ::= static; 696 payload ::= static; 697 timestamp ::= inferred_rtp_timestamp; 698 ssrc ::= static; 699 csrc ::= static; 700 % 701 x ::= irregular(1); 702 extension ::= extension(x); 703 % 704 % FIXME: AH data and GRE checksums 705 random_parts ::= random_parts(id1, rnd1, 706 id2, rnd2, 707 null, null, % AH data 1 + 2 708 null, null, % GRE checksums 709 udpcs, udpcs_ctx); 710 }; 712 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 713 % 714 %%%% 5.7.1. Packet type 0: UO-0, R-0, R-0-CCR 716 format_r_0 = discriminator, %[ 2 ] 717 seq_number, %[ 6 ] 718 random_parts, 719 { 720 let (mode:uncomp_value == R); 722 discriminator ::= '00'; 723 seq_number ::= lsb(6, 1); 724 }; 726 format_r_0_crc = discriminator, %[ 2 ] 727 seq_number, %[ 7 ] 728 crc, %[ 7 ] 729 random_parts, 730 { 731 let (mode:uncomp_value == R); 733 discriminator ::= '01'; 734 seq_number ::= lsb(7, 3); 735 crc ::= crc7(this:uncomp_value, this:uncomp_length); 736 }; 738 format_uo_0 = discriminator, %[ 1 ] 739 seq_number, %[ 4 ] 740 crc, %[ 3 ] 741 random_parts, 742 { 743 let (mode:uncomp_value == U || mode:uncomp_value == O); 745 discriminator ::= '0'; 746 seq_number ::= lsb(4, 1); 747 crc ::= crc3(this:uncomp_value, this:uncomp_length); 748 }; 750 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 751 % 752 %%%% 5.7.2. Packet type 1 (R-mode): R-1, R-1-TS, R-1-ID 754 format_r_1 = discriminator, %[ 2 ] 755 seq_number, %[ 6 ] 756 marker, %[ 1 ] 757 x, %[ 1 ] 758 timestamp, %[ 6 ] 759 extension, 760 random_parts, 761 { 762 let (mode:uncomp_value == R); 763 % FIXME: context MUST NOT contain IPv4 headers with value(RND) = 0 765 discriminator ::= '10'; 766 seq_number ::= lsb(6, 1); 767 marker ::= irregular(1); 768 timestamp ::= rtp_timestamp(6); 769 }; 771 format_r_1_id = discriminator, %[ 2 ] 772 seq_number, %[ 6 ] 773 marker, %[ 1 ] 774 x, %[ 1 ] 775 t, %[ 1 ] 776 ip_id, %[ 5 ] 777 extension, 778 random_parts, 779 { 780 let (mode:uncomp_value == R); 781 % FIXME: context MUST contain at least one IPv4 header 782 let (rnd1 == 0 || rnd2 == 0); 784 discriminator ::= '10'; 785 seq_number ::= lsb(6, 1); 786 marker ::= irregular(1); 787 t ::= '0'; 788 ip_id ::= ip_id_offset(5, seq_number:uncomp_value, 789 id1, rnd1, nbo1, 790 id2, rnd2, nbo2); 791 }; 793 format_r_1_ts = discriminator, %[ 2 ] 794 seq_number, %[ 6 ] 795 marker, %[ 1 ] 796 x, %[ 1 ] 797 t, %[ 1 ] 798 timestamp, %[ 5 ] 799 extension, 800 random_parts, 801 { 802 let (mode:uncomp_value == R); % FIXME: see note in 3095 803 discriminator ::= '10'; 804 seq_number ::= lsb(6, 1); 805 marker ::= irregular(1); 806 t ::= '1'; 807 timestamp ::= rtp_timestamp(5); 808 }; 810 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 811 % 812 %%%% 5.7.3. Packet type 1 (U/O-mode): UO-1, UO-1-ID, UO-1-TS 814 format_uo_1 = discriminator, %[ 2 ] 815 timestamp, %[ 6 ] 816 marker, %[ 1 ] 817 seq_number, %[ 4 ] 818 crc, %[ 3 ] 819 random_parts, 820 { 821 let (mode:uncomp_value == U || mode:uncomp_value == O); 822 % FIXME: see note in 3095 824 discriminator ::= '10'; 825 timestamp ::= rtp_timestamp(6); 826 marker ::= irregular(1); 827 seq_number ::= lsb(4, 1); 828 crc ::= crc3(this:uncomp_value, this:uncomp_length); 829 }; 831 format_uo_1_id = discriminator, %[ 2 ] 832 t, %[ 1 ] 833 ip_id, %[ 5 ] 834 x, %[ 1 ] 835 seq_number, %[ 4 ] 836 crc, %[ 3 ] 837 extension, 838 random_parts, 839 { 840 let (mode:uncomp_value == U || mode:uncomp_value == O); 841 % FIXME: see note in 3095 843 discriminator ::= '10'; 844 t ::= '0'; 845 ip_id ::= ip_id_offset(5, seq_number:uncomp_value, 846 id1, rnd1, nbo1, 847 id2, rnd2, nbo2); 848 seq_number ::= lsb(4, 1); 849 crc ::= crc3(this:uncomp_value, this:uncomp_length); 850 }; 851 format_uo_1_ts = discriminator, %[ 2 ] 852 t, %[ 1 ] 853 timestamp, %[ 5 ] 854 marker, %[ 1 ] 855 seq_number, %[ 4 ] 856 crc, %[ 3 ] 857 random_parts, 858 { 859 let (mode:uncomp_value == U || mode:uncomp_value == O); 860 % FIXME: see note in 3095 862 discriminator ::= '10'; 863 t ::= '1'; 864 timestamp ::= rtp_timestamp(5); 865 marker ::= irregular(1); 866 seq_number ::= lsb(4, 1); 867 crc ::= crc3(this:uncomp_value, this:uncomp_length); 868 }; 870 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 871 % 872 %%%% 5.7.4. Packet type 2: UOR-2 874 format_uor_2 = discriminator, %[ 3 ] 875 timestamp, %[ 6 ] 876 marker, %[ 1 ] 877 seq_number, %[ 6 ] 878 x, %[ 1 ] 879 crc, %[ 7 ] 880 extension, 881 random_parts, 882 { 883 % FIXME: restrictions (see note in 3095) 884 discriminator ::= '110'; 885 timestamp ::= rtp_timestamp(6); 886 marker ::= irregular(1); 887 seq_number ::= lsb(6, 1); 888 crc ::= crc7(this:uncomp_value, this:uncomp_length); 889 }; 891 format_uor_2_id = discriminator, %[ 3 ] 892 ip_id, %[ 5 ] 893 t, %[ 1 ] 894 marker, %[ 1 ] 895 seq_number, %[ 6 ] 896 x, %[ 1 ] 897 crc, %[ 7 ] 898 extension, 899 random_parts, 900 { 901 % FIXME: restrictions (see note in 3095) 902 discriminator ::= '110'; 903 ip_id ::= ip_id_offset(5, seq_number:uncomp_value, 904 id1, rnd1, nbo1, 905 id2, rnd2, nbo2); 906 t ::= '0'; 907 marker ::= irregular(1); 908 seq_number ::= lsb(6, 1); 909 crc ::= crc7(this:uncomp_value, this:uncomp_length); 910 }; 912 format_uor_2_ts = discriminator, %[ 3 ] 913 timestamp, %[ 5 ] 914 t, %[ 1 ] 915 marker, %[ 1 ] 916 seq_number, %[ 6 ] 917 x, %[ 1 ] 918 crc, %[ 7 ] 919 extension, 920 random_parts, 921 { 922 % FIXME: restrictions (see note in 3095) 923 discriminator ::= '110'; 924 timestamp ::= rtp_timestamp(5); 925 t ::= '1'; 926 marker ::= irregular(1); 927 seq_number ::= lsb(6, 1); 928 crc ::= crc7(this:uncomp_value, this:uncomp_length); 929 }; 931 }; 933 3 References 935 [1] Price, R., "Formal Notation for Robust Header Compression 936 (ROHC-FN)", draft-ietf-rohc-formal-notation-03 (work in 937 progress), July 2004. 939 [2] Bormann, C., Burmeister, C., Degermark, M., Fukushima, H., 940 Hannu, H., Jonsson, L-E., Hakenberg, R., Koren, T., Le, K., Liu, 941 Z., Martensson, A., Miyazaki, A., Svanbro, K., Wiebke, T., 942 Yoshimura, T. and H. Zheng, "RObust Header Compression (ROHC): 943 Framework and four profiles: RTP, UDP, ESP, and uncompressed", 944 RFC 3095, July 2001. 946 [3] Pelletier, G., "RObust Header Compression (ROHC): Profile for 947 TCP/IP (ROHC-TCP)", draft-ietf-rohc-tcp-07 (work in progress), 948 July 2004. 950 [4] Jonsson, L-E. and G. Pelletier, "RObust Header Compression 951 (ROHC): A Link-Layer Assisted Profile for IP/UDP/RTP", RFC 3242, 952 April 2002. 954 [5] Liu, Z. and K. Le, "Zero-byte Support for Bidirectional Reliable 955 Mode (R-mode) in Extended Link-Layer Assisted RObust Header 956 Compression (ROHC) Profile", RFC 3408, December 2002. 958 [6] Jonsson, L-E. and G. Pelletier, "RObust Header Compression 959 (ROHC): A Compression Profile for IP", RFC 3843, June 2004. 961 [7] Pelletier, G., "RObust Header Compression (ROHC):Profiles for 962 UDP-Lite", draft-ietf-rohc-udp-lite-04 (work in progress), June 963 2004. 965 Authors' Addresses 967 Eilert Brinkmann 968 Universitaet Bremen TZI 969 Postfach 330440 970 Bremen D-28334 971 Germany 973 Phone: +49 421 218 7845 974 Fax: +49 421 218 7000 975 EMail: eilert@tzi.org 977 Carsten Bormann 978 Universitaet Bremen TZI 979 Postfach 330440 980 Bremen D-28334 981 Germany 983 Phone: +49 421 218 7024 984 Fax: +49 421 218 7000 985 EMail: cabo@tzi.org 987 Intellectual Property Statement 989 The IETF takes no position regarding the validity or scope of any 990 Intellectual Property Rights or other rights that might be claimed to 991 pertain to the implementation or use of the technology described in 992 this document or the extent to which any license under such rights 993 might or might not be available; nor does it represent that it has 994 made any independent effort to identify any such rights. Information 995 on the procedures with respect to rights in RFC documents can be 996 found in BCP 78 and BCP 79. 998 Copies of IPR disclosures made to the IETF Secretariat and any 999 assurances of licenses to be made available, or the result of an 1000 attempt made to obtain a general license or permission for the use of 1001 such proprietary rights by implementers or users of this 1002 specification can be obtained from the IETF on-line IPR repository at 1003 http://www.ietf.org/ipr. 1005 The IETF invites any interested party to bring to its attention any 1006 copyrights, patents or patent applications, or other proprietary 1007 rights that may cover technology that may be required to implement 1008 this standard. Please address the information to the IETF at 1009 ietf-ipr@ietf.org. 1011 Disclaimer of Validity 1013 This document and the information contained herein are provided on an 1014 "AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS 1015 OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY AND THE INTERNET 1016 ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, 1017 INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE 1018 INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED 1019 WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. 1021 Copyright Statement 1023 Copyright (C) The Internet Society (2004). This document is subject 1024 to the rights, licenses and restrictions contained in BCP 78, and 1025 except as set forth therein, the authors retain all their rights. 1027 Acknowledgment 1029 Funding for the RFC Editor function is currently provided by the 1030 Internet Society.