00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #ifndef ROHC_PROTOCOLS_TCP_H
00030 #define ROHC_PROTOCOLS_TCP_H
00031
00032 #include <stdint.h>
00033 #include <assert.h>
00034
00035 #ifdef __KERNEL__
00036 # include <endian.h>
00037 #else
00038 # include "config.h"
00039 #endif
00040
00041
00042
00043
00044 #define ROHC_PACKET_TYPE_IR 0xFD
00045 #define ROHC_PACKET_TYPE_IR_DYN 0xF8
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058 #define ROHC_TCP_MAX_IP_HDRS 10U
00059
00060
00061
00062
00063
00064
00065
00066
00067 #define ROHC_TCP_MAX_IP_EXT_HDRS 20U
00068
00069
00070
00071
00072
00073
00074
00075
00076 #define MAX_TCP_OPTION_INDEX 15U
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087 #define ROHC_TCP_OPTS_MAX_PROTO 40U
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102 #define ROHC_TCP_OPTS_MAX 15U
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115 struct tcphdr
00116 {
00117 uint16_t src_port;
00118 uint16_t dst_port;
00119 uint32_t seq_num;
00120 uint32_t ack_num;
00121 #if WORDS_BIGENDIAN == 1
00122 uint8_t data_offset:4;
00123 uint8_t res_flags:4;
00124 uint8_t ecn_flags:2;
00125 uint8_t urg_flag:1;
00126 uint8_t ack_flag:1;
00127 uint8_t psh_flag:1;
00128 uint8_t rsf_flags:3;
00129 #else
00130 uint8_t res_flags:4;
00131 uint8_t data_offset:4;
00132 uint8_t rsf_flags:3;
00133 uint8_t psh_flag:1;
00134 uint8_t ack_flag:1;
00135 uint8_t urg_flag:1;
00136 uint8_t ecn_flags:2;
00137 #endif
00138 uint16_t window;
00139 uint16_t checksum;
00140 uint16_t urg_ptr;
00141 uint8_t options[0];
00142 } __attribute__((packed));
00143
00144
00145
00146 #define RSF_RST_ONLY 0x04
00147 #define RSF_SYN_ONLY 0x02
00148 #define RSF_FIN_ONLY 0x01
00149 #define RSF_NONE 0x00
00150
00151
00152
00153
00154
00155
00156
00157
00158 typedef enum
00159 {
00160 TCP_OPT_EOL = 0U,
00161 TCP_OPT_NOP = 1U,
00162 TCP_OPT_MSS = 2U,
00163 #define TCP_OLEN_MSS 4U
00164 TCP_OPT_WS = 3U,
00165 #define TCP_OLEN_WS 3U
00166 TCP_OPT_SACK_PERM = 4U,
00167 #define TCP_OLEN_SACK_PERM 2U
00168 TCP_OPT_SACK = 5U,
00169 TCP_OPT_TS = 8U,
00170 #define TCP_OLEN_TS 10U
00171 TCP_OPT_MAX = 255U
00172
00173 } rohc_tcp_option_type_t;
00174
00175
00176 #define TCP_INDEX_NOP 0U
00177 #define TCP_INDEX_EOL 1U
00178 #define TCP_INDEX_MSS 2U
00179 #define TCP_INDEX_WS 3U
00180 #define TCP_INDEX_TS 4U
00181 #define TCP_INDEX_SACK_PERM 5U
00182 #define TCP_INDEX_SACK 6U
00183 #define TCP_INDEX_GENERIC7 7U
00184 #define TCP_INDEX_GENERIC8 8U
00185 #define TCP_INDEX_GENERIC9 9U
00186 #define TCP_INDEX_GENERIC10 10U
00187 #define TCP_INDEX_GENERIC11 11U
00188 #define TCP_INDEX_GENERIC12 12U
00189 #define TCP_INDEX_GENERIC13 13U
00190 #define TCP_INDEX_GENERIC14 14U
00191 #define TCP_INDEX_GENERIC15 15U
00192
00193
00194
00195
00196
00197
00198
00199
00200 typedef struct
00201 {
00202 uint32_t block_start;
00203 uint32_t block_end;
00204 } __attribute__((packed)) sack_block_t;
00205
00206
00207
00208 #define TCP_SACK_BLOCKS_MAX_NR 4U
00209
00210
00211
00212 struct tcp_option_timestamp
00213 {
00214 uint32_t ts;
00215 uint32_t ts_reply;
00216 } __attribute__((packed));
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229 typedef struct
00230 {
00231 #if WORDS_BIGENDIAN == 1
00232 uint8_t version_flag:1;
00233 uint8_t reserved:7;
00234 #else
00235 uint8_t reserved:7;
00236 uint8_t version_flag:1;
00237 #endif
00238 uint8_t protocol;
00239 uint32_t src_addr;
00240 uint32_t dst_addr;
00241 } __attribute__((packed)) ipv4_static_t;
00242
00243
00244
00245 typedef enum
00246 {
00247 IP_ID_BEHAVIOR_SEQ = 0,
00248 IP_ID_BEHAVIOR_SEQ_SWAP = 1,
00249 IP_ID_BEHAVIOR_RAND = 2,
00250 IP_ID_BEHAVIOR_ZERO = 3,
00251 } tcp_ip_id_behavior_t;
00252
00253
00254
00255
00256
00257
00258
00259 typedef struct
00260 {
00261 #if WORDS_BIGENDIAN == 1
00262 uint8_t reserved:5;
00263 uint8_t df:1;
00264 uint8_t ip_id_behavior:2;
00265 uint8_t dscp:6;
00266 uint8_t ip_ecn_flags:2;
00267 #else
00268 uint8_t ip_id_behavior:2;
00269 uint8_t df:1;
00270 uint8_t reserved:5;
00271 uint8_t ip_ecn_flags:2;
00272 uint8_t dscp:6;
00273 #endif
00274 uint8_t ttl_hopl;
00275 } __attribute__((packed)) ipv4_dynamic1_t;
00276
00277
00278
00279
00280
00281
00282
00283 typedef struct
00284 {
00285 #if WORDS_BIGENDIAN == 1
00286 uint8_t reserved:5;
00287 uint8_t df:1;
00288 uint8_t ip_id_behavior:2;
00289 uint8_t dscp:6;
00290 uint8_t ip_ecn_flags:2;
00291 #else
00292 uint8_t ip_id_behavior:2;
00293 uint8_t df:1;
00294 uint8_t reserved:5;
00295 uint8_t ip_ecn_flags:2;
00296 uint8_t dscp:6;
00297 #endif
00298 uint8_t ttl_hopl;
00299 uint16_t ip_id;
00300 } __attribute__((packed)) ipv4_dynamic2_t;
00301
00302
00303
00304
00305
00306
00307
00308
00309 typedef struct
00310 {
00311 uint8_t next_header;
00312 uint8_t length;
00313 } __attribute__((packed)) ip_opt_static_t;
00314
00315
00316
00317 typedef struct
00318 {
00319 uint8_t next_header;
00320 uint8_t length;
00321 } __attribute__((packed)) ip_dest_opt_static_t;
00322
00323
00324
00325 typedef struct
00326 {
00327 uint8_t next_header;
00328 uint8_t length;
00329 } __attribute__((packed)) ip_hop_opt_static_t;
00330
00331
00332
00333 typedef struct
00334 {
00335 uint8_t next_header;
00336 uint8_t length;
00337 uint8_t value[1];
00338 } __attribute__((packed)) ip_rout_opt_static_t;
00339
00340
00341
00342
00343
00344
00345
00346 typedef struct
00347 {
00348 #if WORDS_BIGENDIAN == 1
00349 uint8_t version_flag:1;
00350 uint8_t reserved1:2;
00351 uint8_t flow_label_enc_discriminator:1;
00352 uint8_t reserved2:4;
00353 #else
00354 uint8_t reserved2:4;
00355 uint8_t flow_label_enc_discriminator:1;
00356 uint8_t reserved1:2;
00357 uint8_t version_flag:1;
00358 #endif
00359 uint8_t next_header;
00360 uint32_t src_addr[4];
00361 uint32_t dst_addr[4];
00362 } __attribute__((packed)) ipv6_static1_t;
00363
00364
00365
00366
00367
00368
00369
00370 typedef struct
00371 {
00372 #if WORDS_BIGENDIAN == 1
00373 uint8_t version_flag:1;
00374 uint8_t reserved:2;
00375 uint8_t flow_label_enc_discriminator:1;
00376 uint8_t flow_label1:4;
00377 #else
00378 uint8_t flow_label1:4;
00379 uint8_t flow_label_enc_discriminator:1;
00380 uint8_t reserved:2;
00381 uint8_t version_flag:1;
00382 #endif
00383 uint16_t flow_label2;
00384 uint8_t next_header;
00385 uint32_t src_addr[4];
00386 uint32_t dst_addr[4];
00387 } __attribute__((packed)) ipv6_static2_t;
00388
00389
00390
00391
00392
00393
00394
00395 typedef struct
00396 {
00397 #if WORDS_BIGENDIAN == 1
00398 uint8_t dscp:6;
00399 uint8_t ip_ecn_flags:2;
00400 #else
00401 uint8_t ip_ecn_flags:2;
00402 uint8_t dscp:6;
00403 #endif
00404 uint8_t ttl_hopl;
00405 } __attribute__((packed)) ipv6_dynamic_t;
00406
00407
00408
00409
00410
00411
00412
00413
00414
00415
00416
00417
00418 typedef struct
00419 {
00420 uint16_t src_port;
00421 uint16_t dst_port;
00422 } __attribute__((packed)) tcp_static_t;
00423
00424
00425
00426
00427
00428
00429
00430 typedef struct
00431 {
00432 #if WORDS_BIGENDIAN == 1
00433 uint8_t ecn_used:1;
00434 uint8_t ack_stride_flag:1;
00435 uint8_t ack_zero:1;
00436 uint8_t urp_zero:1;
00437 uint8_t tcp_res_flags:4;
00438
00439 uint8_t tcp_ecn_flags:2;
00440 uint8_t urg_flag:1;
00441 uint8_t ack_flag:1;
00442 uint8_t psh_flag:1;
00443 uint8_t rsf_flags:3;
00444 #else
00445 uint8_t tcp_res_flags:4;
00446 uint8_t urp_zero:1;
00447 uint8_t ack_zero:1;
00448 uint8_t ack_stride_flag:1;
00449 uint8_t ecn_used:1;
00450
00451 uint8_t rsf_flags:3;
00452 uint8_t psh_flag:1;
00453 uint8_t ack_flag:1;
00454 uint8_t urg_flag:1;
00455 uint8_t tcp_ecn_flags:2;
00456 #endif
00457 uint16_t msn;
00458 uint32_t seq_num;
00459
00460
00461
00462
00463
00464
00465
00466
00467
00468
00469 } __attribute__((packed)) tcp_dynamic_t;
00470
00471
00472
00473
00474
00475
00476
00477 typedef struct
00478 {
00479 #if WORDS_BIGENDIAN == 1
00480
00481 uint8_t discriminator:7;
00482 uint8_t ttl_hopl_outer_flag:1;
00483
00484
00485 uint8_t ack_flag:1;
00486 uint8_t psh_flag:1;
00487 uint8_t rsf_flags:2;
00488 uint8_t msn:4;
00489
00490 uint8_t seq_indicator:2;
00491 uint8_t ack_indicator:2;
00492 uint8_t ack_stride_indicator:1;
00493 uint8_t window_indicator:1;
00494 uint8_t ip_id_indicator:1;
00495 uint8_t urg_ptr_present:1;
00496
00497 uint8_t reserved:1;
00498 uint8_t ecn_used:1;
00499 uint8_t dscp_present:1;
00500 uint8_t ttl_hopl_present:1;
00501 uint8_t list_present:1;
00502 uint8_t ip_id_behavior:2;
00503 uint8_t urg_flag:1;
00504
00505 uint8_t df:1;
00506 uint8_t header_crc:7;
00507
00508 #else
00509
00510 uint8_t ttl_hopl_outer_flag:1;
00511 uint8_t discriminator:7;
00512
00513 uint8_t msn:4;
00514 uint8_t rsf_flags:2;
00515 uint8_t psh_flag:1;
00516 uint8_t ack_flag:1;
00517
00518 uint8_t urg_ptr_present:1;
00519 uint8_t ip_id_indicator:1;
00520 uint8_t window_indicator:1;
00521 uint8_t ack_stride_indicator:1;
00522 uint8_t ack_indicator:2;
00523 uint8_t seq_indicator:2;
00524
00525 uint8_t urg_flag:1;
00526 uint8_t ip_id_behavior:2;
00527 uint8_t list_present:1;
00528 uint8_t ttl_hopl_present:1;
00529 uint8_t dscp_present:1;
00530 uint8_t ecn_used:1;
00531 uint8_t reserved:1;
00532
00533 uint8_t header_crc:7;
00534 uint8_t df:1;
00535
00536 #endif
00537
00538
00539
00540
00541
00542
00543
00544
00545
00546
00547
00548
00549
00550
00551 } __attribute__((packed)) co_common_t;
00552
00553
00554
00555
00556
00557
00558
00559
00560 typedef struct
00561 {
00562 #if WORDS_BIGENDIAN == 1
00563 uint8_t discriminator:6;
00564 uint8_t seq_num1:2;
00565 uint16_t seq_num2;
00566 uint8_t msn:4;
00567 uint8_t psh_flag:1;
00568 uint8_t header_crc:3;
00569 #else
00570 uint8_t seq_num1:2;
00571 uint8_t discriminator:6;
00572 uint16_t seq_num2;
00573 uint8_t header_crc:3;
00574 uint8_t psh_flag:1;
00575 uint8_t msn:4;
00576 #endif
00577
00578 } __attribute__((packed)) rnd_1_t;
00579
00580
00581
00582
00583
00584
00585
00586
00587 typedef struct
00588 {
00589 #if WORDS_BIGENDIAN == 1
00590 uint8_t discriminator:4;
00591 uint8_t seq_num_scaled:4;
00592 uint8_t msn:4;
00593 uint8_t psh_flag:1;
00594 uint8_t header_crc:3;
00595 #else
00596 uint8_t seq_num_scaled:4;
00597 uint8_t discriminator:4;
00598 uint8_t header_crc:3;
00599 uint8_t psh_flag:1;
00600 uint8_t msn:4;
00601 #endif
00602
00603 } __attribute__((packed)) rnd_2_t;
00604
00605
00606
00607
00608
00609
00610
00611
00612 typedef struct
00613 {
00614 #if WORDS_BIGENDIAN == 1
00615 uint16_t discriminator:1;
00616 uint8_t ack_num1:7;
00617 uint8_t ack_num2;
00618 uint8_t msn:4;
00619 uint8_t psh_flag:1;
00620 uint8_t header_crc:3;
00621 #else
00622 uint8_t ack_num1:7;
00623 uint8_t discriminator:1;
00624 uint8_t ack_num2:8;
00625 uint8_t header_crc:3;
00626 uint8_t psh_flag:1;
00627 uint8_t msn:4;
00628 #endif
00629
00630 } __attribute__((packed)) rnd_3_t;
00631
00632
00633
00634
00635
00636
00637
00638
00639 typedef struct
00640 {
00641 #if WORDS_BIGENDIAN == 1
00642 uint8_t discriminator:4;
00643 uint8_t ack_num_scaled:4;
00644 uint8_t msn:4;
00645 uint8_t psh_flag:1;
00646 uint8_t header_crc:3;
00647 #else
00648 uint8_t ack_num_scaled:4;
00649 uint8_t discriminator:4;
00650 uint8_t header_crc:3;
00651 uint8_t psh_flag:1;
00652 uint8_t msn:4;
00653 #endif
00654
00655 } __attribute__((packed)) rnd_4_t;
00656
00657
00658
00659
00660
00661
00662
00663
00664 typedef struct
00665 {
00666 #if WORDS_BIGENDIAN == 1
00667 uint8_t discriminator:3;
00668 uint8_t psh_flag:1;
00669 uint8_t msn:4;
00670 uint32_t header_crc:3;
00671 uint32_t seq_num1:5;
00672 uint32_t seq_num2:8;
00673 uint32_t seq_num3:1;
00674 uint32_t ack_num1:7;
00675 uint32_t ack_num2:8;
00676 #else
00677 uint8_t msn:4;
00678 uint8_t psh_flag:1;
00679 uint8_t discriminator:3;
00680 uint8_t seq_num1:5;
00681 uint8_t header_crc:3;
00682 uint8_t seq_num2;
00683 uint8_t ack_num1:7;
00684 uint8_t seq_num3:1;
00685 uint8_t ack_num2;
00686 #endif
00687
00688 } __attribute__((packed)) rnd_5_t;
00689
00690
00691
00692
00693
00694
00695
00696
00697 typedef struct
00698 {
00699 #if WORDS_BIGENDIAN == 1
00700 uint8_t discriminator:4;
00701 uint8_t header_crc:3;
00702 uint8_t psh_flag:1;
00703 #else
00704 uint8_t psh_flag:1;
00705 uint8_t header_crc:3;
00706 uint8_t discriminator:4;
00707 #endif
00708 uint16_t ack_num;
00709 #if WORDS_BIGENDIAN == 1
00710 uint8_t msn:4;
00711 uint8_t seq_num_scaled:4;
00712 #else
00713 uint8_t seq_num_scaled:4;
00714 uint8_t msn:4;
00715 #endif
00716
00717 } __attribute__((packed)) rnd_6_t;
00718
00719
00720
00721
00722
00723
00724
00725
00726 typedef struct
00727 {
00728 #if WORDS_BIGENDIAN == 1
00729 uint8_t discriminator:6;
00730 uint8_t ack_num1:2;
00731 uint16_t ack_num2;
00732 #else
00733 uint8_t ack_num1:2;
00734 uint8_t discriminator:6;
00735 uint16_t ack_num2;
00736 #endif
00737 uint16_t window;
00738 #if WORDS_BIGENDIAN == 1
00739 uint8_t msn:4;
00740 uint8_t psh_flag:1;
00741 uint8_t header_crc:3;
00742 #else
00743 uint8_t header_crc:3;
00744 uint8_t psh_flag:1;
00745 uint8_t msn:4;
00746 #endif
00747
00748 } __attribute__((packed)) rnd_7_t;
00749
00750
00751
00752
00753
00754
00755
00756
00757 typedef struct
00758 {
00759 #if WORDS_BIGENDIAN == 1
00760 uint8_t discriminator:5;
00761 uint8_t rsf_flags:2;
00762 uint8_t list_present:1;
00763 uint16_t header_crc:7;
00764 uint16_t msn1:1;
00765 uint16_t msn2:3;
00766 uint16_t psh_flag:1;
00767 uint16_t ttl_hopl:3;
00768 uint16_t ecn_used:1;
00769 #else
00770 uint8_t list_present:1;
00771 uint8_t rsf_flags:2;
00772 uint8_t discriminator:5;
00773 uint8_t msn1:1;
00774 uint8_t header_crc:7;
00775 uint8_t ecn_used:1;
00776 uint8_t ttl_hopl:3;
00777 uint8_t psh_flag:1;
00778 uint8_t msn2:3;
00779 #endif
00780 uint16_t seq_num;
00781 uint16_t ack_num;
00782 uint8_t options[0];
00783
00784
00785 } __attribute__((packed)) rnd_8_t;
00786
00787
00788
00789
00790
00791
00792
00793
00794 typedef struct
00795 {
00796 #if WORDS_BIGENDIAN == 1
00797 uint8_t discriminator:4;
00798 uint8_t ip_id:4;
00799 #else
00800 uint8_t ip_id:4;
00801 uint8_t discriminator:4;
00802 #endif
00803 uint16_t seq_num;
00804 #if WORDS_BIGENDIAN == 1
00805 uint8_t msn:4;
00806 uint8_t psh_flag:1;
00807 uint8_t header_crc:3;
00808 #else
00809 uint8_t header_crc:3;
00810 uint8_t psh_flag:1;
00811 uint8_t msn:4;
00812 #endif
00813
00814 } __attribute__((packed)) seq_1_t;
00815
00816
00817
00818
00819
00820
00821
00822
00823 typedef struct
00824 {
00825 #if WORDS_BIGENDIAN == 1
00826 uint16_t discriminator:5;
00827 uint16_t ip_id1:3;
00828 uint16_t ip_id2:4;
00829 uint16_t seq_num_scaled:4;
00830 uint8_t msn:4;
00831 uint8_t psh_flag:1;
00832 uint8_t header_crc:3;
00833 #else
00834 uint8_t ip_id1:3;
00835 uint8_t discriminator:5;
00836 uint8_t seq_num_scaled:4;
00837 uint8_t ip_id2:4;
00838 uint8_t header_crc:3;
00839 uint8_t psh_flag:1;
00840 uint8_t msn:4;
00841 #endif
00842
00843 } __attribute__((packed)) seq_2_t;
00844
00845
00846
00847
00848
00849
00850
00851
00852 typedef struct
00853 {
00854 #if WORDS_BIGENDIAN == 1
00855 uint8_t discriminator:4;
00856 uint8_t ip_id:4;
00857 #else
00858 uint8_t ip_id:4;
00859 uint8_t discriminator:4;
00860 #endif
00861 uint16_t ack_num;
00862 #if WORDS_BIGENDIAN == 1
00863 uint8_t msn:4;
00864 uint8_t psh_flag:1;
00865 uint8_t header_crc:3;
00866 #else
00867 uint8_t header_crc:3;
00868 uint8_t psh_flag:1;
00869 uint8_t msn:4;
00870 #endif
00871
00872 } __attribute__((packed)) seq_3_t;
00873
00874
00875
00876
00877
00878
00879
00880
00881 typedef struct
00882 {
00883 #if WORDS_BIGENDIAN == 1
00884 uint8_t discriminator:1;
00885 uint8_t ack_num_scaled:4;
00886 uint8_t ip_id:3;
00887 uint8_t msn:4;
00888 uint8_t psh_flag:1;
00889 uint8_t header_crc:3;
00890 #else
00891 uint8_t ip_id:3;
00892 uint8_t ack_num_scaled:4;
00893 uint8_t discriminator:1;
00894 uint8_t header_crc:3;
00895 uint8_t psh_flag:1;
00896 uint8_t msn:4;
00897 #endif
00898
00899 } __attribute__((packed)) seq_4_t;
00900
00901
00902
00903
00904
00905
00906
00907
00908 typedef struct
00909 {
00910 #if WORDS_BIGENDIAN == 1
00911 uint8_t discriminator:4;
00912 uint8_t ip_id:4;
00913 #else
00914 uint8_t ip_id:4;
00915 uint8_t discriminator:4;
00916 #endif
00917 uint16_t ack_num;
00918 uint16_t seq_num;
00919 #if WORDS_BIGENDIAN == 1
00920 uint8_t msn:4;
00921 uint8_t psh_flag:1;
00922 uint8_t header_crc:3;
00923 #else
00924 uint8_t header_crc:3;
00925 uint8_t psh_flag:1;
00926 uint8_t msn:4;
00927 #endif
00928
00929 } __attribute__((packed)) seq_5_t;
00930
00931
00932
00933
00934
00935
00936
00937
00938 typedef struct
00939 {
00940 #if WORDS_BIGENDIAN == 1
00941 uint16_t discriminator:5;
00942 uint16_t seq_num_scaled1:3;
00943 uint16_t seq_num_scaled2:1;
00944 uint16_t ip_id:7;
00945 #else
00946 uint8_t seq_num_scaled1:3;
00947 uint8_t discriminator:5;
00948 uint8_t ip_id:7;
00949 uint8_t seq_num_scaled2:1;
00950 #endif
00951 uint16_t ack_num;
00952 #if WORDS_BIGENDIAN == 1
00953 uint8_t msn:4;
00954 uint8_t psh_flag:1;
00955 uint8_t header_crc:3;
00956 #else
00957 uint8_t header_crc:3;
00958 uint8_t psh_flag:1;
00959 uint8_t msn:4;
00960 #endif
00961
00962 } __attribute__((packed)) seq_6_t;
00963
00964
00965
00966
00967
00968
00969
00970
00971 typedef struct
00972 {
00973 #if WORDS_BIGENDIAN == 1
00974 uint8_t discriminator:4;
00975 uint8_t window1:4;
00976 uint8_t window2;
00977 uint8_t window3:3;
00978 uint8_t ip_id:5;
00979 uint16_t ack_num;
00980 uint8_t msn:4;
00981 uint8_t psh_flag:1;
00982 uint8_t header_crc:3;
00983 #else
00984 uint8_t window1:4;
00985 uint8_t discriminator:4;
00986 uint8_t window2;
00987 uint8_t ip_id:5;
00988 uint8_t window3:3;
00989 uint16_t ack_num;
00990 uint8_t header_crc:3;
00991 uint8_t psh_flag:1;
00992 uint8_t msn:4;
00993 #endif
00994
00995 } __attribute__((packed)) seq_7_t;
00996
00997
00998
00999
01000
01001
01002
01003
01004 typedef struct
01005 {
01006 #if WORDS_BIGENDIAN == 1
01007 uint8_t discriminator:4;
01008 uint8_t ip_id:4;
01009 uint8_t list_present:1;
01010 uint8_t header_crc:7;
01011 uint8_t msn:4;
01012 uint8_t psh_flag:1;
01013 uint8_t ttl_hopl:3;
01014 uint8_t ecn_used:1;
01015 uint8_t ack_num1:7;
01016 uint8_t ack_num2;
01017 uint8_t rsf_flags:2;
01018 uint8_t seq_num1:6;
01019 uint8_t seq_num2;
01020 #else
01021 uint8_t ip_id:4;
01022 uint8_t discriminator:4;
01023 uint8_t header_crc:7;
01024 uint8_t list_present:1;
01025 uint8_t ttl_hopl:3;
01026 uint8_t psh_flag:1;
01027 uint8_t msn:4;
01028 uint8_t ack_num1:7;
01029 uint8_t ecn_used:1;
01030 uint8_t ack_num2;
01031 uint8_t seq_num1:6;
01032 uint8_t rsf_flags:2;
01033 uint8_t seq_num2:8;
01034 #endif
01035 uint8_t options[0];
01036
01037
01038 } __attribute__((packed)) seq_8_t;
01039
01040
01041
01042
01043
01044
01045
01046 static inline char * tcp_ip_id_behavior_get_descr(const tcp_ip_id_behavior_t ip_id_behavior)
01047 __attribute__((warn_unused_result, const));
01048
01049 static inline char * tcp_opt_get_descr(const uint8_t opt_type)
01050 __attribute__((warn_unused_result, const));
01051
01052
01053
01054
01055
01056
01057
01058
01059 static inline char * tcp_ip_id_behavior_get_descr(const tcp_ip_id_behavior_t behavior)
01060 {
01061 switch(behavior)
01062 {
01063 case IP_ID_BEHAVIOR_SEQ:
01064 return "sequential";
01065 case IP_ID_BEHAVIOR_SEQ_SWAP:
01066 return "sequential swapped";
01067 case IP_ID_BEHAVIOR_RAND:
01068 return "random";
01069 case IP_ID_BEHAVIOR_ZERO:
01070 return "constant zero";
01071 default:
01072 return "unknown IP-ID behavior";
01073 }
01074 }
01075
01076
01077
01078
01079
01080
01081
01082
01083 static inline char * tcp_opt_get_descr(const uint8_t opt_type)
01084 {
01085 switch(opt_type)
01086 {
01087 case TCP_OPT_EOL:
01088 return "EOL";
01089 case TCP_OPT_NOP:
01090 return "NOP";
01091 case TCP_OPT_MSS:
01092 return "MSS";
01093 case TCP_OPT_WS:
01094 return "Window Scale";
01095 case TCP_OPT_SACK_PERM:
01096 return "SACK permitted";
01097 case TCP_OPT_SACK:
01098 return "SACK";
01099 case TCP_OPT_TS:
01100 return "Timestamp";
01101 default:
01102 return "generic";
01103 }
01104 }
01105
01106
01107 #endif
01108