ROHC compression/decompression library
rfc6846.h
Go to the documentation of this file.
1 /*
2  * Copyright 2012,2013,2014 Didier Barvaux
3  * Copyright 2013,2018 Viveris Technologies
4  * Copyright 2012 WBX
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20 
21 /**
22  * @file rfc6846.h
23  * @brief ROHC packets for the ROHCv1 IP/TCP profile defined in RFC6846
24  * @author FWX <rohc_team@dialine.fr>
25  * @author Didier Barvaux <didier@barvaux.org>
26  * @author Didier Barvaux <didier.barvaux@toulouse.viveris.com>
27  */
28 
29 #ifndef ROHC_PROTOCOLS_RFC6846_H
30 #define ROHC_PROTOCOLS_RFC6846_H
31 
32 #include <stdint.h>
33 
34 #ifdef __KERNEL__
35 # include <endian.h>
36 #else
37 # include "config.h" /* for WORDS_BIGENDIAN */
38 #endif
39 
40 
41 /* See RFC6846 §7.1 and §7.2 */
42 #define ROHC_PACKET_TYPE_IR 0xFD
43 #define ROHC_PACKET_TYPE_IR_CR 0xfc
44 #define ROHC_PACKET_TYPE_IR_DYN 0xF8
45 
46 
47 
48 /************************************************************************
49  * Compressed TCP options *
50  ************************************************************************/
51 
52 
53 /**
54  * @brief The maximum length of TCP options supported by the TCP profile
55  *
56  * The SACK option may contain 4 blocks of 8 bytes each, so 2+4*8=34 bytes
57  */
58 #define ROHC_TCP_OPT_MAX_LEN 34U
59 
60 
61 /**
62  * @brief The largest index that may be used to identify one TCP option
63  *
64  * The ROHC standard defines that one TCP option is identified by an index. It
65  * also defines that index is in range [0 ; 15].
66  */
67 #define MAX_TCP_OPTION_INDEX 15U
68 
69 
70 #define TCP_INDEX_NOP 0U
71 #define TCP_INDEX_EOL 1U
72 #define TCP_INDEX_MSS 2U
73 #define TCP_INDEX_WS 3U
74 #define TCP_INDEX_TS 4U
75 #define TCP_INDEX_SACK_PERM 5U
76 #define TCP_INDEX_SACK 6U
77 #define TCP_INDEX_GENERIC7 7U
78 #define TCP_INDEX_GENERIC8 8U
79 #define TCP_INDEX_GENERIC9 9U
80 #define TCP_INDEX_GENERIC10 10U
81 #define TCP_INDEX_GENERIC11 11U
82 #define TCP_INDEX_GENERIC12 12U
83 #define TCP_INDEX_GENERIC13 13U
84 #define TCP_INDEX_GENERIC14 14U
85 #define TCP_INDEX_GENERIC15 15U
86 
87 
88 
89 /************************************************************************
90  * Compressed IPv4 header *
91  ************************************************************************/
92 
93 /**
94  * @brief The IPv4 static part
95  *
96  * See RFC4996 page 62
97  */
98 typedef struct
99 {
100 #if WORDS_BIGENDIAN == 1
101  uint8_t version_flag:1;
102  uint8_t reserved:7;
103 #else
104  uint8_t reserved:7;
105  uint8_t version_flag:1;
106 #endif
107  uint8_t protocol;
108  uint32_t src_addr;
109  uint32_t dst_addr;
110 } __attribute__((packed)) ipv4_static_t;
111 
112 
113 /**
114  * @brief The IPv4 dynamic part without IP-ID field
115  *
116  * See RFC4996 page 62
117  */
118 typedef struct
119 {
120 #if WORDS_BIGENDIAN == 1
121  uint8_t reserved:5;
122  uint8_t df:1;
123  uint8_t ip_id_behavior:2;
124  uint8_t dscp:6;
125  uint8_t ip_ecn_flags:2;
126 #else
127  uint8_t ip_id_behavior:2;
128  uint8_t df:1;
129  uint8_t reserved:5;
130  uint8_t ip_ecn_flags:2;
131  uint8_t dscp:6;
132 #endif
133  uint8_t ttl_hopl;
134 } __attribute__((packed)) ipv4_dynamic1_t;
135 
136 
137 /**
138  * @brief The IPv4 dynamic part with IP-ID field
139  *
140  * See RFC4996 page 62
141  */
142 typedef struct
143 {
144 #if WORDS_BIGENDIAN == 1
145  uint8_t reserved:5;
146  uint8_t df:1;
147  uint8_t ip_id_behavior:2;
148  uint8_t dscp:6;
149  uint8_t ip_ecn_flags:2;
150 #else
151  uint8_t ip_id_behavior:2;
152  uint8_t df:1;
153  uint8_t reserved:5;
154  uint8_t ip_ecn_flags:2;
155  uint8_t dscp:6;
156 #endif
157  uint8_t ttl_hopl;
158  uint16_t ip_id;
159 } __attribute__((packed)) ipv4_dynamic2_t;
160 
161 
162 /**
163  * @brief The IPv4 replicate part
164  *
165  * See RFC6846 page 64
166  */
167 typedef struct
168 {
169 #if WORDS_BIGENDIAN == 1
170  uint8_t reserved:4; /* reserved =:= '0000' [ 4 ]; */
171  uint8_t ip_id_behavior:2; /* ip_id_behavior_innermost =:= irregular(2) [ 2 ]; */
172  uint8_t ttl_flag:1; /* ttl_flag =:= irregular(1) [ 1 ]; */
173  uint8_t df:1; /* df =:= irregular(1) [ 1 ]; */
174  uint8_t dscp:6; /* dscp =:= irregular(6) [ 6 ]; */
175  uint8_t ip_ecn_flags:2; /* ip_ecn_flags =:= irregular(2) [ 2 ]; */
176 #else
177  uint8_t df:1;
178  uint8_t ttl_flag:1;
179  uint8_t ip_id_behavior:2;
180  uint8_t reserved:4;
181  uint8_t ip_ecn_flags:2;
182  uint8_t dscp:6;
183 #endif
184  /* ip_id =:= ip_id_enc_dyn(ip_id_behavior_innermost.UVALUE) [ 0, 16 ]; */
185  /* ttl_hopl =:= static_or_irreg(ttl_flag.UVALUE, 8) [ 0, 8 ]; */
186 } __attribute__((packed)) ipv4_replicate_t;
187 
188 
189 
190 /************************************************************************
191  * Compressed IPv6 base header and its extension headers *
192  ************************************************************************/
193 
194 /** The static part of IPv6 option header */
195 typedef struct
196 {
197  uint8_t next_header;
198  uint8_t length;
199 } __attribute__((packed)) ip_opt_static_t;
200 
201 
202 /** The static part of IPv6 Destination option header */
203 typedef struct
204 {
205  uint8_t next_header;
206  uint8_t length;
207 } __attribute__((packed)) ip_dest_opt_static_t;
208 
209 
210 /** The static part of IPv6 Hop-by-Hop option header */
211 typedef struct
212 {
213  uint8_t next_header;
214  uint8_t length;
215 } __attribute__((packed)) ip_hop_opt_static_t;
216 
217 
218 /** The static part of IPv6 Routing option header */
219 typedef struct
220 {
221  uint8_t next_header;
222  uint8_t length;
223  uint8_t value[1];
224 } __attribute__((packed)) ip_rout_opt_static_t;
225 
226 
227 /**
228  * @brief The IPv6 static part, null flow_label encoded with 1 bit
229  *
230  * See RFC4996 page 58
231  */
232 typedef struct
233 {
234 #if WORDS_BIGENDIAN == 1
235  uint8_t version_flag:1;
236  uint8_t reserved1:2;
237  uint8_t flow_label_enc_discriminator:1;
238  uint8_t reserved2:4;
239 #else
240  uint8_t reserved2:4;
242  uint8_t reserved1:2;
243  uint8_t version_flag:1;
244 #endif
245  uint8_t next_header;
246  uint32_t src_addr[4];
247  uint32_t dst_addr[4];
248 } __attribute__((packed)) ipv6_static1_t;
249 
250 
251 /**
252  * @brief The IPv6 static part, flow_label encoded with 1+20 bits
253  *
254  * See RFC4996 page 59
255  */
256 typedef struct
257 {
258 #if WORDS_BIGENDIAN == 1
259  uint8_t version_flag:1;
260  uint8_t reserved:2;
261  uint8_t flow_label_enc_discriminator:1;
262  uint8_t flow_label1:4;
263 #else
264  uint8_t flow_label1:4;
266  uint8_t reserved:2;
267  uint8_t version_flag:1;
268 #endif
269  uint16_t flow_label2;
270  uint8_t next_header;
271  uint32_t src_addr[4];
272  uint32_t dst_addr[4];
273 } __attribute__((packed)) ipv6_static2_t;
274 
275 
276 /**
277  * @brief The IPv6 dynamic part
278  *
279  * See RFC4996 page 59
280  */
281 typedef struct
282 {
283 #if WORDS_BIGENDIAN == 1
284  uint8_t dscp:6;
285  uint8_t ip_ecn_flags:2;
286 #else
287  uint8_t ip_ecn_flags:2;
288  uint8_t dscp:6;
289 #endif
290  uint8_t ttl_hopl;
291 } __attribute__((packed)) ipv6_dynamic_t;
292 
293 
294 /**
295  * @brief The IPv6 replicate part with short Flow Label
296  *
297  * See RFC6846 page 60
298  */
299 typedef struct
300 {
301 #if WORDS_BIGENDIAN == 1
302  uint8_t dscp:6; /* dscp =:= irregular(6) [ 6 ]; */
303  uint8_t ip_ecn_flags:2; /* ip_ecn_flags =:= irregular(2) [ 2 ]; */
304  uint8_t reserved1:3; /* reserved =:= '000' [ 3 ]; */
305  uint8_t fl_enc_flag:1; /* flow_label =:= fl_enc [ 1 ]; */
306  uint8_t reserved2:4; /* reserved =:= '0000' [ 4 ]; */
307 #else
308  uint8_t ip_ecn_flags:2;
309  uint8_t dscp:6;
310  uint8_t reserved2:4;
311  uint8_t fl_enc_flag:1;
312  uint8_t reserved1:3;
313 #endif
314 } __attribute__((packed)) ipv6_replicate1_t;
315 
316 
317 /**
318  * @brief The IPv6 replicate part with long Flow Label
319  *
320  * See RFC6846 page 60
321  */
322 typedef struct
323 {
324 #if WORDS_BIGENDIAN == 1
325  uint8_t dscp:6; /* dscp =:= irregular(6) [ 6 ]; */
326  uint8_t ip_ecn_flags:2; /* ip_ecn_flags =:= irregular(2) [ 2 ]; */
327  uint8_t reserved:3; /* reserved =:= '000' [ 3 ]; */
328  uint8_t fl_enc_flag:1; /* flow_label =:= fl_enc [ 21 ]; */
329  uint8_t flow_label1:4;
330 #else
331  uint8_t ip_ecn_flags:2;
332  uint8_t dscp:6;
333  uint8_t flow_label1:4;
334  uint8_t fl_enc_flag:1;
335  uint8_t reserved:3;
336 #endif
337  uint16_t flow_label2;
338 } __attribute__((packed)) ipv6_replicate2_t;
339 
340 
341 
342 /************************************************************************
343  * Compressed TCP header and its options *
344  ************************************************************************/
345 
346 /**
347  * @brief The TCP static part
348  *
349  * See RFC4996 page 73/74
350  */
351 typedef struct
352 {
353  uint16_t src_port; /**< irregular(16) [ 16 ] */
354  uint16_t dst_port; /**< irregular(16) [ 16 ] */
355 } __attribute__((packed)) tcp_static_t;
356 
357 
358 /**
359  * @brief The TCP dynamic part
360  *
361  * See RFC4996 page 73/74
362  */
363 typedef struct
364 {
365 #if WORDS_BIGENDIAN == 1
366  uint8_t ecn_used:1; /**< one_bit_choice [ 1 ] */
367  uint8_t ack_stride_flag:1; /**< irregular(1) [ 1 ] */
368  uint8_t ack_zero:1; /**< irregular(1) [ 1 ] */
369  uint8_t urp_zero:1; /**< irregular(1) [ 1 ] */
370  uint8_t tcp_res_flags:4; /**< irregular(4) [ 4 ] */
371 
372  uint8_t tcp_ecn_flags:2; /**< irregular(2) [ 2 ] */
373  uint8_t urg_flag:1; /**< irregular(1) [ 1 ] */
374  uint8_t ack_flag:1; /**< irregular(1) [ 1 ] */
375  uint8_t psh_flag:1; /**< irregular(1) [ 1 ] */
376  uint8_t rsf_flags:3; /**< irregular(3) [ 3 ] */
377 #else
378  uint8_t tcp_res_flags:4;
379  uint8_t urp_zero:1;
380  uint8_t ack_zero:1;
381  uint8_t ack_stride_flag:1;
382  uint8_t ecn_used:1;
383 
384  uint8_t rsf_flags:3;
385  uint8_t psh_flag:1;
386  uint8_t ack_flag:1;
387  uint8_t urg_flag:1;
388  uint8_t tcp_ecn_flags:2;
389 #endif
390  uint16_t msn; /**< irregular(16) [ 16 ] */
391  uint32_t seq_num; /**< irregular(32) [ 32 ] */
392 
393  /* variable fields:
394  * zero_or_irreg(ack_zero.CVALUE, 32) [ 0, 32 ]
395  * irregular(16) [ 16 ]
396  * irregular(16) [ 16 ]
397  * zero_or_irreg(urp_zero.CVALUE, 16) [ 0, 16 ]
398  * static_or_irreg(ack_stride_flag.CVALUE, 16) [ 0, 16 ]
399  * list_tcp_options [ VARIABLE ]
400  */
401 
402 } __attribute__((packed)) tcp_dynamic_t;
403 
404 
405 /**
406  * @brief The different presence flags for port_replicate() encoding scheme
407  */
408 enum
409 {
410  ROHC_TCP_PORT_STATIC = 0, /**< port is static, so it is not transmitted */
411  ROHC_TCP_PORT_LSB8 = 1, /**< port is not static and it is compressible */
412  ROHC_TCP_PORT_IRREGULAR = 2, /**< port is not static and it is not compressible */
413  ROHC_TCP_PORT_RESERVED = 3, /**< reserved value */
414 };
415 
416 
417 /**
418  * @brief The TCP replicate part
419  *
420  * See RFC6846 pages 75-76
421  */
422 typedef struct
423 {
424 #if WORDS_BIGENDIAN == 1
425  uint8_t reserved:1; /**< reserved '0' [ 1 ] */
426  uint8_t window_presence:1; /**< irregular(1) [ 1 ] */
427  uint8_t list_present:1; /**< irregular(1) [ 1 ] */
428  uint8_t src_port_presence:2; /**< irregular(2) [ 2 ] */
429  uint8_t dst_port_presence:2; /**< irregular(2) [ 2 ] */
430  uint8_t ack_stride_flag:1; /**< irregular(1) [ 1 ] */
431 
432  uint8_t ack_presence:1; /**< irregular(1) [ 1 ] */
433  uint8_t urp_presence:1; /**< irregular(1) [ 1 ] */
434  uint8_t urg_flag:1; /**< irregular(1) [ 1 ] */
435  uint8_t ack_flag:1; /**< irregular(1) [ 1 ] */
436  uint8_t psh_flag:1; /**< irregular(1) [ 1 ] */
437  uint8_t rsf_flags:2; /**< rsf_index_enc [ 2 ] */
438  uint8_t ecn_used:1; /**< one_bit_choice [ 1 ] */
439 #else
440  uint8_t ack_stride_flag:1;
441  uint8_t dst_port_presence:2;
442  uint8_t src_port_presence:2;
443  uint8_t list_present:1;
444  uint8_t window_presence:1;
445  uint8_t reserved:1;
446 
447  uint8_t ecn_used:1;
448  uint8_t rsf_flags:2;
449  uint8_t psh_flag:1;
450  uint8_t ack_flag:1;
451  uint8_t urg_flag:1;
452  uint8_t urp_presence:1;
453  uint8_t ack_presence:1;
454 #endif
455  uint16_t msn; /**< irregular(16) [ 16 ] */
456  uint32_t seq_num; /**< irregular(32) [ 32 ] */
457 
458  /* variable fields:
459  * src_port =:= port_replicate(src_port_presence) [ 0, 8, 16 ]
460  * dst_port =:= port_replicate(dst_port_presence) [ 0, 8, 16 ]
461  * window =:= static_or_irreg(window_presence, 16) [ 0, 16 ]
462  * urg_point =:= static_or_irreg(urp_presence, 16) [ 0, 16 ]
463  * ack_number =:= static_or_irreg(ack_presence, 32) [ 0, 32 ]
464  * ecn_padding =:= optional_2bit_padding(ecn_used.CVALUE) [ 0, 2 ]
465  * tcp_res_flags =:= static_or_irreg(ecn_used.CVALUE, 4) [ 0, 4 ]
466  * tcp_ecn_flags =:= static_or_irreg(ecn_used.CVALUE, 2) [ 0, 2 ]
467  * checksum =:= irregular(16) [ 16 ]
468  * ack_stride =:= static_or_irreg(ack_stride_flag.CVALUE, 16) [ 0, 16 ]
469  * options =:= tcp_list_presence_enc(list_present.CVALUE) [ VARIABLE ]
470  */
471 
472 } __attribute__((packed)) tcp_replicate_t;
473 
474 
475 /**
476  * @brief The Common compressed packet format
477  *
478  * See RFC4996 page 80/81
479  */
480 typedef struct
481 {
482 #if WORDS_BIGENDIAN == 1
483 
484  uint8_t discriminator:7; /**< '1111101' [ 7 ] */
485  uint8_t ttl_hopl_outer_flag:1; /**< compressed_value(1,
486  ttl_irregular_chain_flag) [ 1 ] */
487 
488  uint8_t ack_flag:1; /**< irregular(1) [ 1 ] */
489  uint8_t psh_flag:1; /**< irregular(1) [ 1 ] */
490  uint8_t rsf_flags:2; /**< rsf_index_enc [ 2 ] */
491  uint8_t msn:4; /**< lsb(4, 4) [ 4 ] */
492 
493  uint8_t seq_indicator:2; /**< irregular(2) [ 2 ] */
494  uint8_t ack_indicator:2; /**< irregular(2) [ 2 ] */
495  uint8_t ack_stride_indicator:1; /**< irregular(1) [ 1 ] */
496  uint8_t window_indicator:1; /**< irregular(1) [ 1 ] */
497  uint8_t ip_id_indicator:1; /**< irregular(1) [ 1 ] */
498  uint8_t urg_ptr_present:1; /**< irregular(1) [ 1 ] */
499 
500  uint8_t reserved:1; /**< compressed_value(1, 0) [ 1 ] */
501  uint8_t ecn_used:1; /**< one_bit_choice [ 1 ] */
502  uint8_t dscp_present:1; /**< irregular(1) [ 1 ] */
503  uint8_t ttl_hopl_present:1; /**< irregular(1) [ 1 ] */
504  uint8_t list_present:1; /**< irregular(1) [ 1 ] */
505  uint8_t ip_id_behavior:2; /**< ip_id_behavior_choice(true) [ 2 ] */
506  uint8_t urg_flag:1; /**< irregular(1) [ 1 ] */
507 
508  uint8_t df:1; /**< dont_fragment(version.UVALUE) [ 1 ] */
509  uint8_t header_crc:7; /**< crc7(THIS.UVALUE,THIS.ULENGTH) [ 7 ] */
510 
511 #else
512 
514  uint8_t discriminator:7;
515 
516  uint8_t msn:4;
517  uint8_t rsf_flags:2;
518  uint8_t psh_flag:1;
519  uint8_t ack_flag:1;
520 
521  uint8_t urg_ptr_present:1;
522  uint8_t ip_id_indicator:1;
523  uint8_t window_indicator:1;
525  uint8_t ack_indicator:2;
526  uint8_t seq_indicator:2;
527 
528  uint8_t urg_flag:1;
529  uint8_t ip_id_behavior:2;
530  uint8_t list_present:1;
531  uint8_t ttl_hopl_present:1;
532  uint8_t dscp_present:1;
533  uint8_t ecn_used:1;
534  uint8_t reserved:1;
535 
536  uint8_t header_crc:7;
537  uint8_t df:1;
538 
539 #endif
540 
541  /* variable fields:
542  * variable_length_32_enc(seq_indicator.CVALUE) [ 0, 8, 16, 32 ]
543  * variable_length_32_enc(ack_indicator.CVALUE) [ 0, 8, 16, 32 ]
544  * static_or_irreg(ack_stride_indicator.CVALUE, 16) [ 0, 16 ]
545  * static_or_irreg(window_indicator.CVALUE, 16) [ 0, 16 ]
546  * optional_ip_id_lsb(ip_id_behavior.UVALUE,ip_id_indicator.CVALUE) [ 0, 8, 16 ]
547  * static_or_irreg(urg_ptr_present.CVALUE, 16) [ 0, 16 ]
548  * dscp_enc-dscp_present.CVALUE) [ 0, 8 ]
549  * static_or_irreg(ttl_hopl_present.CVALUE, 8) [ 0, 8 ]
550  * tcp_list_presence_enc(list_present.CVALUE) [ VARIABLE ]
551  * irregular chain [ VARIABLE ]
552  */
553 
554 } __attribute__((packed)) co_common_t;
555 
556 
557 /**
558  * @brief The rnd_1 compressed packet format
559  *
560  * Send LSBs of sequence number
561  * See RFC4996 page 81
562  */
563 typedef struct
564 {
565 #if WORDS_BIGENDIAN == 1
566  uint8_t discriminator:6; /**< '101110' [ 6 ] */
567  uint8_t seq_num1:2; /**< lsb(18, 65535) [ 18 ] */
568  uint16_t seq_num2; /**< sequel of \e seq_num1 [ - ] */
569  uint8_t msn:4; /**< lsb(4, 4) [ 4 ] */
570  uint8_t psh_flag:1; /**< irregular(1) [ 1 ] */
571  uint8_t header_crc:3; /**< crc3(THIS.UVALUE, THIS.ULENGTH) [ 3 ] */
572 #else
573  uint8_t seq_num1:2;
574  uint8_t discriminator:6;
575  uint16_t seq_num2;
576  uint8_t header_crc:3;
577  uint8_t psh_flag:1;
578  uint8_t msn:4;
579 #endif
580  /* irregular chain [ VARIABLE ] */
581 } __attribute__((packed)) rnd_1_t;
582 
583 
584 /**
585  * @brief The rnd_2 compressed packet format
586  *
587  * Send scaled sequence number LSBs
588  * See RFC4996 page 81
589  */
590 typedef struct
591 {
592 #if WORDS_BIGENDIAN == 1
593  uint8_t discriminator:4; /**< '1100' [ 4 ] */
594  uint8_t seq_num_scaled:4; /**< lsb(4, 7) [ 4 ] */
595  uint8_t msn:4; /**< lsb(4, 4) [ 4 ] */
596  uint8_t psh_flag:1; /**< irregular(1) [ 1 ] */
597  uint8_t header_crc:3; /**< crc3(THIS.UVALUE, THIS.ULENGTH) [ 3 ] */
598 #else
599  uint8_t seq_num_scaled:4;
600  uint8_t discriminator:4;
601  uint8_t header_crc:3;
602  uint8_t psh_flag:1;
603  uint8_t msn:4;
604 #endif
605  /* irregular chain [ VARIABLE ] */
606 } __attribute__((packed)) rnd_2_t;
607 
608 
609 /**
610  * @brief The rnd_3 compressed packet format
611  *
612  * Send acknowledgment number LSBs
613  * See RFC4996 page 81
614  */
615 typedef struct
616 {
617 #if WORDS_BIGENDIAN == 1
618  uint8_t discriminator:1; /**< '0' [ 1 ] */
619  uint8_t ack_num1:7; /**< lsb(15, 8191) [ 15 ] */
620  uint8_t ack_num2; /**< sequel of \e ack_num1 [ - ] */
621  uint8_t msn:4; /**< lsb(4, 4) [ 4 ] */
622  uint8_t psh_flag:1; /**< irregular(1) [ 1 ] */
623  uint8_t header_crc:3; /**< crc3(THIS.UVALUE, THIS.ULENGTH) [ 3 ] */
624 #else
625  uint8_t ack_num1:7;
626  uint8_t discriminator:1;
627  uint8_t ack_num2:8;
628  uint8_t header_crc:3;
629  uint8_t psh_flag:1;
630  uint8_t msn:4;
631 #endif
632  /* irregular chain [ VARIABLE ] */
633 } __attribute__((packed)) rnd_3_t;
634 
635 
636 /**
637  * @brief The rnd_4 compressed packet format
638  *
639  * Send acknowlegment number scaled
640  * See RFC4996 page 81
641  */
642 typedef struct
643 {
644 #if WORDS_BIGENDIAN == 1
645  uint8_t discriminator:4; /**< '1101' [ 4 ] */
646  uint8_t ack_num_scaled:4; /**< lsb(4, 3) [ 4 ] */
647  uint8_t msn:4; /**< lsb(4, 4) [ 4 ] */
648  uint8_t psh_flag:1; /**< irregular(1) [ 1 ] */
649  uint8_t header_crc:3; /**< crc3(THIS.UVALUE, THIS.ULENGTH) [ 3 ] */
650 #else
651  uint8_t ack_num_scaled:4;
652  uint8_t discriminator:4;
653  uint8_t header_crc:3;
654  uint8_t psh_flag:1;
655  uint8_t msn:4;
656 #endif
657  /* irregular chain [ VARIABLE ] */
658 } __attribute__((packed)) rnd_4_t;
659 
660 
661 /**
662  * @brief The rnd_5 compressed packet format
663  *
664  * Send ACK and sequence number
665  * See RFC4996 page 82
666  */
667 typedef struct
668 {
669 #if WORDS_BIGENDIAN == 1
670  uint8_t discriminator:3; /**< '100' [ 3 ] */
671  uint8_t psh_flag:1; /**< irregular(1) [ 1 ] */
672  uint8_t msn:4; /**< lsb(4, 4) [ 4 ] */
673  uint32_t header_crc:3; /**< crc3(THIS.UVALUE, THIS.ULENGTH) [ 3 ] */
674  uint32_t seq_num1:5; /**< lsb(14, 8191) [ 14 ] */
675  uint32_t seq_num2:8; /**< sequel of \e seq_num1 [ - ] */
676  uint32_t seq_num3:1; /**< sequel of \e seq_num1 and \e seq_num2 [ - ] */
677  uint32_t ack_num1:7; /**< lsb(15, 8191) [ 15 ] */
678  uint32_t ack_num2:8; /**< sequel of \e ack_num1 [ - ] */
679 #else
680  uint8_t msn:4;
681  uint8_t psh_flag:1;
682  uint8_t discriminator:3;
683  uint8_t seq_num1:5;
684  uint8_t header_crc:3;
685  uint8_t seq_num2;
686  uint8_t ack_num1:7;
687  uint8_t seq_num3:1;
688  uint8_t ack_num2;
689 #endif
690  /* irregular chain [ VARIABLE ] */
691 } __attribute__((packed)) rnd_5_t;
692 
693 
694 /**
695  * @brief The rnd_6 compressed packet format
696  *
697  * Send both ACK and scaled sequence number LSBs
698  * See RFC4996 page 82
699  */
700 typedef struct
701 {
702 #if WORDS_BIGENDIAN == 1
703  uint8_t discriminator:4; /**< '1010' [ 4 ] */
704  uint8_t header_crc:3; /**< crc3(THIS.UVALUE, THIS.ULENGTH) [ 3 ] */
705  uint8_t psh_flag:1; /**< irregular(1) [ 1 ] */
706 #else
707  uint8_t psh_flag:1;
708  uint8_t header_crc:3;
709  uint8_t discriminator:4;
710 #endif
711  uint16_t ack_num; /**< lsb(16, 16383) [ 16 ] */
712 #if WORDS_BIGENDIAN == 1
713  uint8_t msn:4; /**< lsb(4, 4) [ 4 ] */
714  uint8_t seq_num_scaled:4; /**< lsb(4, 7) [ 4 ] */
715 #else
716  uint8_t seq_num_scaled:4;
717  uint8_t msn:4;
718 #endif
719  /* irregular chain [ VARIABLE ] */
720 } __attribute__((packed)) rnd_6_t;
721 
722 
723 /**
724  * @brief The rnd_7 compressed packet format
725  *
726  * Send ACK and window
727  * See RFC4996 page 82
728  */
729 typedef struct
730 {
731 #if WORDS_BIGENDIAN == 1
732  uint8_t discriminator:6; /**< '101111' [ 6 ] */
733  uint8_t ack_num1:2; /**< lsb(18, 65535) [ 18 ] */
734  uint16_t ack_num2; /**< sequel of \e ack_num1 [ - ]*/
735 #else
736  uint8_t ack_num1:2;
737  uint8_t discriminator:6;
738  uint16_t ack_num2;
739 #endif
740  uint16_t window; /**< irregular(16) [ 16 ] */
741 #if WORDS_BIGENDIAN == 1
742  uint8_t msn:4; /**< lsb(4, 4) [ 4 ] */
743  uint8_t psh_flag:1; /**< irregular(1) [ 1 ] */
744  uint8_t header_crc:3; /**< crc3(THIS.UVALUE, THIS.ULENGTH) [ 3 ] */
745 #else
746  uint8_t header_crc:3;
747  uint8_t psh_flag:1;
748  uint8_t msn:4;
749 #endif
750  /* irregular chain [ VARIABLE ] */
751 } __attribute__((packed)) rnd_7_t;
752 
753 
754 /**
755  * @brief The rnd_8 compressed packet format
756  *
757  * Can send LSBs of TTL, RSF flags, change ECN behavior and options list
758  * See RFC4996 page 82
759  */
760 typedef struct
761 {
762 #if WORDS_BIGENDIAN == 1
763  uint8_t discriminator:5; /**< '10110' [ 5 ] */
764  uint8_t rsf_flags:2; /**< rsf_index_enc [ 2 ] */
765  uint8_t list_present:1; /**< irregular(1) [ 1 ] */
766  uint16_t header_crc:7; /**< crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ] */
767  uint16_t msn1:1; /**< lsb(4, 4) [ 4 ] */
768  uint16_t msn2:3; /**< sequel of \e msn1 [ - ] */
769  uint16_t psh_flag:1; /**< irregular(1) [ 1 ] */
770  uint16_t ttl_hopl:3; /**< lsb(3, 3) [ 3 ] */
771  uint16_t ecn_used:1; /**< one_bit_choice [ 1 ] */
772 #else
773  uint8_t list_present:1;
774  uint8_t rsf_flags:2;
775  uint8_t discriminator:5;
776  uint8_t msn1:1;
777  uint8_t header_crc:7;
778  uint8_t ecn_used:1;
779  uint8_t ttl_hopl:3;
780  uint8_t psh_flag:1;
781  uint8_t msn2:3;
782 #endif
783  uint16_t seq_num; /**< lsb(16, 65535) [ 16 ] */
784  uint16_t ack_num; /**< lsb(16, 16383) [ 16 ] */
785  uint8_t options[0]; /**< tcp_list_presence_enc(list_present.CVALUE)
786  [ VARIABLE ] */
787  /* irregular chain [ VARIABLE ] */
788 } __attribute__((packed)) rnd_8_t;
789 
790 
791 /**
792  * @brief The seq_1 compressed packet format
793  *
794  * Send LSBs of sequence number
795  * See RFC4996 page 83
796  */
797 typedef struct
798 {
799 #if WORDS_BIGENDIAN == 1
800  uint8_t discriminator:4; /**< '1010' [ 4 ] */
801  uint8_t ip_id:4; /**< ip_id_lsb(ip_id_behavior.UVALUE, 4, 3) [ 4 ] */
802 #else
803  uint8_t ip_id:4;
804  uint8_t discriminator:4;
805 #endif
806  uint16_t seq_num; /**< lsb(16, 32767) [ 16 ] */
807 #if WORDS_BIGENDIAN == 1
808  uint8_t msn:4; /**< lsb(4, 4) [ 4 ] */
809  uint8_t psh_flag:1; /**< irregular(1) [ 1 ] */
810  uint8_t header_crc:3; /**< crc3(THIS.UVALUE, THIS.ULENGTH) [ 3 ] */
811 #else
812  uint8_t header_crc:3;
813  uint8_t psh_flag:1;
814  uint8_t msn:4;
815 #endif
816  /* irregular chain [ VARIABLE ] */
817 } __attribute__((packed)) seq_1_t;
818 
819 
820 /**
821  * @brief The seq_2 compressed packet format
822  *
823  * Send scaled sequence number LSBs
824  * See RFC4996 page 83
825  */
826 typedef struct
827 {
828 #if WORDS_BIGENDIAN == 1
829  uint16_t discriminator:5; /**< '11010' [ 5 ] */
830  uint16_t ip_id1:3; /**< ip_id_lsb(ip_id_behavior.UVALUE, 7, 3) [ 7 ] */
831  uint16_t ip_id2:4; /**< sequel of ip_id1 [ - ] */
832  uint16_t seq_num_scaled:4; /**< lsb(4, 7) [ 4 ] */
833  uint8_t msn:4; /**< lsb(4, 4) [ 4 ] */
834  uint8_t psh_flag:1; /**< irregular(1) [ 1 ] */
835  uint8_t header_crc:3; /**< crc3(THIS.UVALUE, THIS.ULENGTH) [ 3 ] */
836 #else
837  uint8_t ip_id1:3;
838  uint8_t discriminator:5;
839  uint8_t seq_num_scaled:4;
840  uint8_t ip_id2:4;
841  uint8_t header_crc:3;
842  uint8_t psh_flag:1;
843  uint8_t msn:4;
844 #endif
845  /* irregular chain [ VARIABLE ] */
846 } __attribute__((packed)) seq_2_t;
847 
848 
849 /**
850  * @brief The seq_3 compressed packet format
851  *
852  * Send acknowledgment number LSBs
853  * See RFC4996 page 83
854  */
855 typedef struct
856 {
857 #if WORDS_BIGENDIAN == 1
858  uint8_t discriminator:4; /**< '1001' [ 4 ] */
859  uint8_t ip_id:4; /**< ip_id_lsb(ip_id_behavior.UVALUE, 4, 3) [ 4 ] */
860 #else
861  uint8_t ip_id:4;
862  uint8_t discriminator:4;
863 #endif
864  uint16_t ack_num; /**< lsb(16, 16383) [ 16 ] */
865 #if WORDS_BIGENDIAN == 1
866  uint8_t msn:4; /**< lsb(4, 4) [ 4 ] */
867  uint8_t psh_flag:1; /**< irregular(1) [ 1 ] */
868  uint8_t header_crc:3; /**< crc3(THIS.UVALUE, THIS.ULENGTH) [ 3 ] */
869 #else
870  uint8_t header_crc:3;
871  uint8_t psh_flag:1;
872  uint8_t msn:4;
873 #endif
874  /* irregular chain [ VARIABLE ] */
875 } __attribute__((packed)) seq_3_t;
876 
877 
878 /**
879  * @brief The seq_4 compressed packet format
880  *
881  * Send scaled acknowledgment number scaled
882  * See RFC4996 page 84
883  */
884 typedef struct
885 {
886 #if WORDS_BIGENDIAN == 1
887  uint8_t discriminator:1; /**< '0' [ 1 ] */
888  uint8_t ack_num_scaled:4; /**< lsb(4, 3) [ 4 ] */
889  uint8_t ip_id:3; /**< ip_id_lsb(ip_id_behavior.UVALUE, 3, 1) [ 3 ] */
890  uint8_t msn:4; /**< lsb(4, 4) [ 4 ] */
891  uint8_t psh_flag:1; /**< irregular(1) [ 1 ] */
892  uint8_t header_crc:3; /**< crc3(THIS.UVALUE, THIS.ULENGTH) [ 3 ] */
893 #else
894  uint8_t ip_id:3;
895  uint8_t ack_num_scaled:4;
896  uint8_t discriminator:1;
897  uint8_t header_crc:3;
898  uint8_t psh_flag:1;
899  uint8_t msn:4;
900 #endif
901  /* irregular chain [ VARIABLE ] */
902 } __attribute__((packed)) seq_4_t;
903 
904 
905 /**
906  * @brief The seq_5 compressed packet format
907  *
908  * Send ACK and sequence number
909  * See RFC4996 page 84
910  */
911 typedef struct
912 {
913 #if WORDS_BIGENDIAN == 1
914  uint8_t discriminator:4; /**< '1000' [ 4 ] */
915  uint8_t ip_id:4; /**< ip_id_lsb(ip_id_behavior.UVALUE, 4, 3) [ 4 ] */
916 #else
917  uint8_t ip_id:4;
918  uint8_t discriminator:4;
919 #endif
920  uint16_t ack_num; /**< lsb(16, 16383) [ 16 ] */
921  uint16_t seq_num; /**< lsb(16, 32767) [ 16 ] */
922 #if WORDS_BIGENDIAN == 1
923  uint8_t msn:4; /**< lsb(4, 4) [ 4 ] */
924  uint8_t psh_flag:1; /**< irregular(1) [ 1 ] */
925  uint8_t header_crc:3; /**< crc3(THIS.UVALUE, THIS.ULENGTH) [ 3 ] */
926 #else
927  uint8_t header_crc:3;
928  uint8_t psh_flag:1;
929  uint8_t msn:4;
930 #endif
931  /* irregular chain [ VARIABLE ] */
932 } __attribute__((packed)) seq_5_t;
933 
934 
935 /**
936  * @brief The seq_6 compressed packet format
937  *
938  * Send both ACK and scaled sequence number LSBs
939  * See RFC4996 page 84
940  */
941 typedef struct
942 {
943 #if WORDS_BIGENDIAN == 1
944  uint16_t discriminator:5; /**< '11011' [ 5 ] */
945  uint16_t seq_num_scaled1:3; /**< lsb(4, 7) [ 4 ] */
946  uint16_t seq_num_scaled2:1; /**< sequel of \e seq_num_scaled1 [ 4 ] */
947  uint16_t ip_id:7; /**< ip_id_lsb(ip_id_behavior.UVALUE, 7, 3) [ 7 ] */
948 #else
949  uint8_t seq_num_scaled1:3;
950  uint8_t discriminator:5;
951  uint8_t ip_id:7;
952  uint8_t seq_num_scaled2:1;
953 #endif
954  uint16_t ack_num; /**< lsb(16, 16383) [ 16 ] */
955 #if WORDS_BIGENDIAN == 1
956  uint8_t msn:4; /**< lsb(4, 4) [ 4 ] */
957  uint8_t psh_flag:1; /**< irregular(1) [ 1 ] */
958  uint8_t header_crc:3; /**< crc3(THIS.UVALUE, THIS.ULENGTH) [ 3 ] */
959 #else
960  uint8_t header_crc:3;
961  uint8_t psh_flag:1;
962  uint8_t msn:4;
963 #endif
964  /* irregular chain [ VARIABLE ] */
965 } __attribute__((packed)) seq_6_t;
966 
967 
968 /**
969  * @brief The seq_7 compressed packet format
970  *
971  * Send ACK and window
972  * See RFC4996 page 85
973  */
974 typedef struct
975 {
976 #if WORDS_BIGENDIAN == 1
977  uint8_t discriminator:4; /**< '1100' [ 4 ] */
978  uint8_t window1:4; /**< lsb(15, 16383) [ 15 ] */
979  uint8_t window2; /**< sequel of \e window1 [ - ] */
980  uint8_t window3:3; /**< sequel of \e window1 and \e window2 [ - ] */
981  uint8_t ip_id:5; /**< ip_id_lsb(ip_id_behavior.UVALUE, 5, 3) [ 5 ] */
982  uint16_t ack_num; /**< lsb(16, 32767) [ 16 ] */
983  uint8_t msn:4; /**< lsb(4, 4) [ 4 ] */
984  uint8_t psh_flag:1; /**< irregular(1) [ 1 ] */
985  uint8_t header_crc:3; /**< crc3(THIS.UVALUE, THIS.ULENGTH) [ 3 ] */
986 #else
987  uint8_t window1:4;
988  uint8_t discriminator:4;
989  uint8_t window2;
990  uint8_t ip_id:5;
991  uint8_t window3:3;
992  uint16_t ack_num;
993  uint8_t header_crc:3;
994  uint8_t psh_flag:1;
995  uint8_t msn:4;
996 #endif
997  /* irregular chain [ VARIABLE ] */
998 } __attribute__((packed)) seq_7_t;
999 
1000 
1001 /**
1002  * @brief The seq_8 compressed packet format
1003  *
1004  * Can send LSBs of TTL, RSF flags, change ECN behavior, and options list
1005  * See RFC4996 page 85
1006  */
1007 typedef struct
1008 {
1009 #if WORDS_BIGENDIAN == 1
1010  uint8_t discriminator:4; /**< '1011' [ 4 ] */
1011  uint8_t ip_id:4; /**< ip_id_lsb(ip_id_behavior.UVALUE, 4, 3) [ 4 ] */
1012  uint8_t list_present:1; /**< irregular(1) [ 1 ] */
1013  uint8_t header_crc:7; /**< crc7(THIS.UVALUE, THIS.ULENGTH) [ 7 ] */
1014  uint8_t msn:4; /**< lsb(4, 4) [ 4 ] */
1015  uint8_t psh_flag:1; /**< irregular(1) [ 1 ] */
1016  uint8_t ttl_hopl:3; /**< lsb(3, 3) [ 3 ] */
1017  uint8_t ecn_used:1; /**< one_bit_choice [ 1 ] */
1018  uint8_t ack_num1:7; /**< lsb(15, 8191) [ 15 ] */
1019  uint8_t ack_num2; /**< sequel of \e ack_num1 [ - ] */
1020  uint8_t rsf_flags:2; /**< rsf_index_enc [ 2 ] */
1021  uint8_t seq_num1:6; /**< lsb(14, 8191) [ 14 ] */
1022  uint8_t seq_num2; /**< sequel of \e seq_num1 [ - ] */
1023 #else
1024  uint8_t ip_id:4;
1025  uint8_t discriminator:4;
1026  uint8_t header_crc:7;
1027  uint8_t list_present:1;
1028  uint8_t ttl_hopl:3;
1029  uint8_t psh_flag:1;
1030  uint8_t msn:4;
1031  uint8_t ack_num1:7;
1032  uint8_t ecn_used:1;
1033  uint8_t ack_num2;
1034  uint8_t seq_num1:6;
1035  uint8_t rsf_flags:2;
1036  uint8_t seq_num2:8;
1037 #endif
1038  uint8_t options[0]; /**< tcp_list_presence_enc(list_present.CVALUE)
1039  [ VARIABLE ] */
1040  /* irregular chain [ VARIABLE ] */
1041 } __attribute__((packed)) seq_8_t;
1042 
1043 
1044 
1045 #endif /* ROHC_PROTOCOLS_RFC6846_H */
1046 
uint8_t rsf_flags
Definition: rfc6846.h:448
uint8_t ack_num1
Definition: rfc6846.h:1031
uint8_t psh_flag
Definition: rfc6846.h:681
uint8_t discriminator
Definition: rfc6846.h:950
uint8_t ttl_hopl_present
Definition: rfc6846.h:531
The rnd_1 compressed packet format.
Definition: rfc6846.h:563
The TCP replicate part.
Definition: rfc6846.h:422
uint8_t flow_label_enc_discriminator
Definition: rfc6846.h:241
uint8_t rsf_flags
Definition: rfc6846.h:774
uint8_t ack_presence
Definition: rfc6846.h:453
uint8_t ip_ecn_flags
Definition: rfc6846.h:308
uint8_t list_present
Definition: rfc6846.h:773
The rnd_6 compressed packet format.
Definition: rfc6846.h:700
uint8_t ip_id_behavior
Definition: rfc6846.h:151
uint8_t ack_num1
Definition: rfc6846.h:625
uint8_t psh_flag
Definition: rfc6846.h:577
uint16_t flow_label2
Definition: rfc6846.h:337
uint8_t ack_num2
Definition: rfc6846.h:627
uint8_t ip_ecn_flags
Definition: rfc6846.h:154
uint8_t ip_id
Definition: rfc6846.h:951
uint8_t reserved2
Definition: rfc6846.h:310
uint8_t urp_presence
Definition: rfc6846.h:452
Definition: rfc6846.h:203
uint8_t discriminator
Definition: rfc6846.h:652
uint8_t ecn_used
Definition: rfc6846.h:778
uint8_t version_flag
Definition: rfc6846.h:243
uint8_t discriminator
Definition: rfc6846.h:709
uint8_t ip_id_behavior
Definition: rfc6846.h:529
uint8_t df
Definition: rfc6846.h:537
The rnd_2 compressed packet format.
Definition: rfc6846.h:590
uint8_t msn
Definition: rfc6846.h:680
uint16_t msn
Definition: rfc6846.h:455
uint8_t discriminator
Definition: rfc6846.h:1025
uint8_t msn
Definition: rfc6846.h:748
uint8_t next_header
Definition: rfc6846.h:221
uint8_t ack_zero
Definition: rfc6846.h:380
uint8_t ip_id_indicator
Definition: rfc6846.h:522
The rnd_8 compressed packet format.
Definition: rfc6846.h:760
uint8_t flow_label_enc_discriminator
Definition: rfc6846.h:265
uint8_t reserved
Definition: rfc6846.h:335
uint8_t ip_id
Definition: rfc6846.h:803
uint8_t psh_flag
Definition: rfc6846.h:898
uint8_t header_crc
Definition: rfc6846.h:601
uint16_t ack_num
Definition: rfc6846.h:864
uint8_t version_flag
Definition: rfc6846.h:267
uint8_t urg_flag
Definition: rfc6846.h:528
uint8_t list_present
Definition: rfc6846.h:1027
uint8_t msn
Definition: rfc6846.h:843
uint8_t seq_num_scaled
Definition: rfc6846.h:716
uint8_t psh_flag
Definition: rfc6846.h:449
uint8_t ack_flag
Definition: rfc6846.h:386
uint16_t seq_num
Definition: rfc6846.h:921
The IPv6 static part, flow_label encoded with 1+20 bits.
Definition: rfc6846.h:256
uint8_t discriminator
Definition: rfc6846.h:838
uint16_t ack_num
Definition: rfc6846.h:711
uint8_t psh_flag
Definition: rfc6846.h:961
uint16_t msn
Definition: rfc6846.h:390
Definition: rfc6846.h:219
uint8_t seq_num1
Definition: rfc6846.h:683
uint8_t window1
Definition: rfc6846.h:987
The rnd_7 compressed packet format.
Definition: rfc6846.h:729
uint8_t psh_flag
Definition: rfc6846.h:629
uint8_t ack_num1
Definition: rfc6846.h:686
uint8_t window2
Definition: rfc6846.h:989
uint8_t rsf_flags
Definition: rfc6846.h:1035
uint8_t dscp
Definition: rfc6846.h:288
The rnd_4 compressed packet format.
Definition: rfc6846.h:642
uint8_t ttl_hopl
Definition: rfc6846.h:1028
uint8_t ttl_hopl
Definition: rfc6846.h:133
uint8_t discriminator
Definition: rfc6846.h:896
uint8_t discriminator
Definition: rfc6846.h:804
Definition: rfc6846.h:211
Definition: rfc6846.h:195
uint8_t reserved1
Definition: rfc6846.h:312
The TCP static part.
Definition: rfc6846.h:351
uint8_t df
Definition: rfc6846.h:152
uint8_t ip_id
Definition: rfc6846.h:1024
The rnd_5 compressed packet format.
Definition: rfc6846.h:667
uint8_t ack_stride_flag
Definition: rfc6846.h:381
The IPv6 dynamic part.
Definition: rfc6846.h:281
uint8_t ttl_flag
Definition: rfc6846.h:178
uint8_t src_port_presence
Definition: rfc6846.h:442
uint8_t ack_stride_flag
Definition: rfc6846.h:440
uint8_t psh_flag
Definition: rfc6846.h:707
uint8_t length
Definition: rfc6846.h:214
uint8_t ecn_used
Definition: rfc6846.h:447
uint8_t window_indicator
Definition: rfc6846.h:523
uint32_t seq_num
Definition: rfc6846.h:391
uint8_t ecn_used
Definition: rfc6846.h:1032
uint8_t flow_label1
Definition: rfc6846.h:333
uint8_t msn
Definition: rfc6846.h:655
uint8_t psh_flag
Definition: rfc6846.h:1029
The rnd_3 compressed packet format.
Definition: rfc6846.h:615
uint8_t ip_ecn_flags
Definition: rfc6846.h:181
uint8_t flow_label1
Definition: rfc6846.h:264
uint16_t ip_id
Definition: rfc6846.h:158
uint8_t window3
Definition: rfc6846.h:991
uint8_t ecn_used
Definition: rfc6846.h:533
uint8_t reserved
Definition: rfc6846.h:180
uint8_t ack_num1
Definition: rfc6846.h:736
The seq_1 compressed packet format.
Definition: rfc6846.h:797
uint8_t reserved
Definition: rfc6846.h:534
uint8_t ip_id1
Definition: rfc6846.h:837
uint8_t header_crc
Definition: rfc6846.h:993
uint8_t ip_id
Definition: rfc6846.h:861
uint8_t reserved
Definition: rfc6846.h:445
The IPv4 dynamic part without IP-ID field.
Definition: rfc6846.h:118
uint8_t fl_enc_flag
Definition: rfc6846.h:334
The seq_6 compressed packet format.
Definition: rfc6846.h:941
uint8_t fl_enc_flag
Definition: rfc6846.h:311
uint8_t ip_id_behavior
Definition: rfc6846.h:179
uint16_t ack_num
Definition: rfc6846.h:784
uint16_t ack_num
Definition: rfc6846.h:992
uint8_t ttl_hopl
Definition: rfc6846.h:157
uint8_t psh_flag
Definition: rfc6846.h:602
uint8_t msn1
Definition: rfc6846.h:776
uint8_t discriminator
Definition: rfc6846.h:862
uint8_t discriminator
Definition: rfc6846.h:918
uint16_t src_port
Definition: rfc6846.h:353
uint8_t seq_num_scaled
Definition: rfc6846.h:599
uint8_t ip_ecn_flags
Definition: rfc6846.h:287
uint8_t list_present
Definition: rfc6846.h:530
uint8_t header_crc
Definition: rfc6846.h:960
uint8_t rsf_flags
Definition: rfc6846.h:384
uint8_t discriminator
Definition: rfc6846.h:600
uint16_t seq_num2
Definition: rfc6846.h:575
uint8_t ttl_hopl
Definition: rfc6846.h:290
uint8_t urg_flag
Definition: rfc6846.h:387
uint8_t psh_flag
Definition: rfc6846.h:780
uint8_t urg_flag
Definition: rfc6846.h:451
The TCP dynamic part.
Definition: rfc6846.h:363
The seq_2 compressed packet format.
Definition: rfc6846.h:826
The IPv6 static part, null flow_label encoded with 1 bit.
Definition: rfc6846.h:232
uint8_t ecn_used
Definition: rfc6846.h:382
uint8_t dst_port_presence
Definition: rfc6846.h:441
uint8_t ack_num2
Definition: rfc6846.h:688
The IPv6 replicate part with short Flow Label.
Definition: rfc6846.h:299
The IPv4 dynamic part with IP-ID field.
Definition: rfc6846.h:142
Definition: rfc6846.h:411
uint8_t tcp_res_flags
Definition: rfc6846.h:378
uint8_t header_crc
Definition: rfc6846.h:746
uint8_t header_crc
Definition: rfc6846.h:927
The seq_8 compressed packet format.
Definition: rfc6846.h:1007
uint8_t next_header
Definition: rfc6846.h:270
uint8_t psh_flag
Definition: rfc6846.h:842
uint8_t psh_flag
Definition: rfc6846.h:747
uint8_t seq_num_scaled2
Definition: rfc6846.h:952
uint16_t seq_num
Definition: rfc6846.h:783
The IPv4 static part.
Definition: rfc5225.h:51
uint8_t header_crc
Definition: rfc6846.h:653
uint8_t dscp
Definition: rfc6846.h:182
uint8_t header_crc
Definition: rfc6846.h:628
The IPv6 replicate part with long Flow Label.
Definition: rfc6846.h:322
uint16_t dst_port
Definition: rfc6846.h:354
uint8_t ttl_hopl
Definition: rfc6846.h:779
uint16_t flow_label2
Definition: rfc6846.h:269
uint8_t msn
Definition: rfc6846.h:872
Definition: rfc6846.h:413
uint8_t psh_flag
Definition: rfc6846.h:994
uint8_t ack_stride_indicator
Definition: rfc6846.h:524
uint8_t next_header
Definition: rfc6846.h:245
The seq_7 compressed packet format.
Definition: rfc6846.h:974
uint8_t tcp_ecn_flags
Definition: rfc6846.h:388
uint8_t length
Definition: rfc6846.h:198
uint8_t discriminator
Definition: rfc6846.h:988
uint8_t psh_flag
Definition: rfc6846.h:518
uint16_t ack_num
Definition: rfc6846.h:954
uint16_t window
Definition: rfc6846.h:740
uint8_t seq_num2
Definition: rfc6846.h:685
uint8_t msn
Definition: rfc6846.h:962
Definition: rfc6846.h:410
uint8_t msn
Definition: rfc6846.h:814
uint8_t msn
Definition: rfc6846.h:603
The seq_4 compressed packet format.
Definition: rfc6846.h:884
uint8_t header_crc
Definition: rfc6846.h:1026
uint8_t msn
Definition: rfc6846.h:516
uint8_t ip_id
Definition: rfc6846.h:990
uint8_t header_crc
Definition: rfc6846.h:684
uint8_t ip_ecn_flags
Definition: rfc6846.h:130
uint8_t reserved
Definition: rfc6846.h:153
uint8_t psh_flag
Definition: rfc6846.h:385
uint8_t seq_num2
Definition: rfc6846.h:1036
uint8_t urg_ptr_present
Definition: rfc6846.h:521
uint8_t discriminator
Definition: rfc6846.h:737
uint8_t ttl_hopl_outer_flag
Definition: rfc6846.h:513
uint8_t psh_flag
Definition: rfc6846.h:813
uint8_t discriminator
Definition: rfc6846.h:682
The seq_5 compressed packet format.
Definition: rfc6846.h:911
uint8_t length
Definition: rfc6846.h:222
uint8_t msn
Definition: rfc6846.h:899
uint8_t rsf_flags
Definition: rfc6846.h:517
uint8_t dscp
Definition: rfc6846.h:332
uint16_t seq_num
Definition: rfc6846.h:806
uint8_t ip_id_behavior
Definition: rfc6846.h:127
The IPv4 replicate part.
Definition: rfc6846.h:167
The seq_3 compressed packet format.
Definition: rfc6846.h:855
uint8_t next_header
Definition: rfc6846.h:213
uint8_t header_crc
Definition: rfc6846.h:870
uint8_t seq_num1
Definition: rfc6846.h:1034
uint8_t ack_num2
Definition: rfc6846.h:1033
uint8_t psh_flag
Definition: rfc6846.h:654
uint8_t dscp
Definition: rfc6846.h:155
uint8_t header_crc
Definition: rfc6846.h:708
uint8_t ip_id2
Definition: rfc6846.h:840
uint8_t dscp_present
Definition: rfc6846.h:532
uint8_t df
Definition: rfc6846.h:177
uint8_t reserved
Definition: rfc6846.h:129
uint8_t discriminator
Definition: rfc6846.h:626
uint8_t ip_id
Definition: rfc6846.h:894
uint8_t next_header
Definition: rfc6846.h:205
uint8_t msn
Definition: rfc6846.h:630
uint16_t ack_num
Definition: rfc6846.h:920
uint8_t discriminator
Definition: rfc6846.h:775
uint8_t reserved2
Definition: rfc6846.h:240
uint8_t ack_flag
Definition: rfc6846.h:519
uint8_t next_header
Definition: rfc6846.h:197
uint8_t length
Definition: rfc6846.h:206
uint8_t seq_indicator
Definition: rfc6846.h:526
uint8_t msn
Definition: rfc6846.h:1030
uint8_t window_presence
Definition: rfc6846.h:444
uint32_t seq_num
Definition: rfc6846.h:456
uint8_t ack_flag
Definition: rfc6846.h:450
uint8_t msn
Definition: rfc6846.h:578
uint8_t msn2
Definition: rfc6846.h:781
uint8_t header_crc
Definition: rfc6846.h:897
uint8_t psh_flag
Definition: rfc6846.h:871
uint8_t dscp
Definition: rfc6846.h:131
uint8_t seq_num1
Definition: rfc6846.h:573
uint8_t ack_num_scaled
Definition: rfc6846.h:895
uint8_t msn
Definition: rfc6846.h:929
uint8_t urp_zero
Definition: rfc6846.h:379
The Common compressed packet format.
Definition: rfc6846.h:480
uint8_t reserved
Definition: rfc6846.h:266
uint8_t ack_num_scaled
Definition: rfc6846.h:651
uint8_t seq_num3
Definition: rfc6846.h:687
uint8_t header_crc
Definition: rfc6846.h:777
uint8_t msn
Definition: rfc6846.h:995
uint8_t psh_flag
Definition: rfc6846.h:928
Definition: rfc6846.h:412
uint8_t ip_ecn_flags
Definition: rfc6846.h:331
uint8_t header_crc
Definition: rfc6846.h:576
uint8_t list_present
Definition: rfc6846.h:443
uint8_t header_crc
Definition: rfc6846.h:841
uint8_t df
Definition: rfc6846.h:128
uint8_t ack_indicator
Definition: rfc6846.h:525
uint8_t header_crc
Definition: rfc6846.h:536
uint8_t msn
Definition: rfc6846.h:717
uint8_t reserved1
Definition: rfc6846.h:242
uint8_t ip_id
Definition: rfc6846.h:917
uint8_t discriminator
Definition: rfc6846.h:514
uint8_t seq_num_scaled
Definition: rfc6846.h:839
uint16_t ack_num2
Definition: rfc6846.h:738
uint8_t seq_num_scaled1
Definition: rfc6846.h:949
uint8_t header_crc
Definition: rfc6846.h:812
uint8_t dscp
Definition: rfc6846.h:309
uint8_t discriminator
Definition: rfc6846.h:574