2 * IPv6 Fragmentation Header described in RFC2460
3 * programmed by Markus Amend 2012 as a contribution to
4 * netsniff-ng - the packet sniffing beast
5 * Copyright 2012 Markus Amend.
6 * Subject to the GPL, version 2.
14 #include <netinet/in.h> /* for ntohs() */
16 #include "proto_struct.h"
17 #include "dissector_eth.h"
20 uint8_t h_fragm_next_header
;
21 uint8_t h_fragm_reserved
;
22 uint16_t h_fragm_off_res_M
;
23 uint32_t h_fragm_identification
;
24 } __attribute__((packed
));
26 static inline void fragm(uint8_t *packet
, size_t len
)
29 struct fragmhdr
*fragm
= (struct fragmhdr
*) packet
;
31 if (len
< sizeof(struct fragmhdr
))
34 off_res_M
= ntohs(fragm
->h_fragm_off_res_M
);
36 tprintf("\t [ Fragment ");
37 tprintf("NextHdr (%u), ", fragm
->h_fragm_next_header
);
38 tprintf("Reserved (%u), ", fragm
->h_fragm_reserved
);
39 tprintf("Offset (%u), ", off_res_M
>> 3);
40 tprintf("Res (%u), ", (off_res_M
>> 1) & 0x3);
41 tprintf("M flag (%u), ", off_res_M
& 0x1);
42 tprintf("Identification (%u) ", ntohs(fragm
->h_fragm_identification
));
46 static inline void fragm_less(uint8_t *packet
, size_t len
)
49 struct fragmhdr
*fragm
= (struct fragmhdr
*) packet
;
51 if (len
< sizeof(struct fragmhdr
))
54 off_res_M
= ntohs(fragm
->h_fragm_off_res_M
);
56 tprintf(" FragmOffs %u", off_res_M
>> 3);
59 static inline void fragm_next(uint8_t *packet
, size_t len
,
60 struct hash_table
**table
,
61 unsigned int *key
, size_t *off
)
63 struct fragmhdr
*fragm
= (struct fragmhdr
*) packet
;
64 if (len
< sizeof(struct fragmhdr
))
66 (*off
) = sizeof(struct fragmhdr
);
67 (*key
) = fragm
->h_fragm_next_header
;
71 struct protocol ipv6_fragm_ops
= {
74 .print_less
= fragm_less
,
75 .print_pay_ascii
= empty
,
76 .print_pay_hex
= empty
,
77 .print_pay_none
= fragm
,
79 .proto_next
= fragm_next
,