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