improving dissector_fuzz
[netsniff-ng.git] / src / proto_ipv6_fragm.h
blob01450bd3f60d68280af24d0d735f3b84935aee9d
1 /*
2 * netsniff-ng - the packet sniffing beast
3 * Copyright 2012 Markus Amend <markus@netsniff-ng.org>
4 * Subject to the GPL, version 2.
6 * IPv6 Fragmentation Header described in RFC2460
7 */
9 #ifndef PROTO_IPV6_FRAGM_H
10 #define PROTO_IPV6_FRAGM_H
12 #include <stdio.h>
13 #include <stdint.h>
14 #include <netinet/in.h> /* for ntohs() */
16 #include "proto_struct.h"
17 #include "dissector_eth.h"
18 #include "built_in.h"
20 struct fragmhdr {
21 uint8_t h_fragm_next_header;
22 uint8_t h_fragm_reserved;
23 uint16_t h_fragm_off_res_M;
24 uint32_t h_fragm_identification;
25 } __packed;
27 static inline void fragm(struct pkt_buff *pkt)
29 uint16_t off_res_M;
30 struct fragmhdr *fragm_ops;
32 fragm_ops = (struct fragmhdr *) pkt_pull(pkt, sizeof(*fragm_ops));
33 if (fragm_ops == NULL)
34 return;
36 off_res_M = ntohs(fragm_ops->h_fragm_off_res_M);
38 tprintf("\t [ Fragment ");
39 tprintf("NextHdr (%u), ", fragm_ops->h_fragm_next_header);
40 tprintf("Reserved (%u), ", fragm_ops->h_fragm_reserved);
41 tprintf("Offset (%u), ", off_res_M >> 3);
42 tprintf("Res (%u), ", (off_res_M >> 1) & 0x3);
43 tprintf("M flag (%u), ", off_res_M & 0x1);
44 tprintf("Identification (%u)",
45 ntohl(fragm_ops->h_fragm_identification));
46 tprintf(" ]\n");
48 pkt_set_proto(pkt, &eth_lay3, fragm_ops->h_fragm_next_header);
51 static inline void fragm_less(struct pkt_buff *pkt)
53 uint16_t off_res_M;
54 struct fragmhdr *fragm_ops;
56 fragm_ops = (struct fragmhdr *) pkt_pull(pkt, sizeof(*fragm_ops));
57 if (fragm_ops == NULL)
58 return;
60 off_res_M = ntohs(fragm_ops->h_fragm_off_res_M);
62 tprintf(" FragmOffs %u", off_res_M >> 3);
64 pkt_set_proto(pkt, &eth_lay3, fragm_ops->h_fragm_next_header);
67 struct protocol ipv6_fragm_ops = {
68 .key = 0x2C,
69 .print_full = fragm,
70 .print_less = fragm_less,
73 #endif /* PROTO_IPV6_FRAGM_H */