dissector_eth: also include id into macro
[netsniff-ng.git] / src / proto_ipv6_fragm.h
blobc7a5c80cce5dafc97721e154d50b924b345d38a9
1 /*
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.
7 */
9 #ifndef FRAGM_H
10 #define 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"
19 struct fragmhdr {
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)
28 uint16_t off_res_M;
29 struct fragmhdr *fragm = (struct fragmhdr *) packet;
31 if (len < sizeof(struct fragmhdr))
32 return;
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));
43 tprintf(" ]\n");
46 static inline void fragm_less(uint8_t *packet, size_t len)
48 uint16_t off_res_M;
49 struct fragmhdr *fragm = (struct fragmhdr *) packet;
51 if (len < sizeof(struct fragmhdr))
52 return;
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))
65 return;
66 (*off) = sizeof(struct fragmhdr);
67 (*key) = fragm->h_fragm_next_header;
68 (*table) = &eth_lay3;
71 struct protocol ipv6_fragm_ops = {
72 .key = 0x2C,
73 .print_full = fragm,
74 .print_less = fragm_less,
75 .print_pay_ascii = empty,
76 .print_pay_hex = empty,
77 .print_pay_none = fragm,
78 .print_all_hex = hex,
79 .proto_next = fragm_next,
82 #endif /* FRAGM_H */