dissector_80211: start of 80211 collection
[netsniff-ng.git] / src / proto_ipv6_hop_by_hop.h
blob635e880cce5e92047121a289e390eafa13296d24
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 Hop-By-Hop Header described in RFC2460
7 */
9 #ifndef PROTO_IPV6_HOP_BY_HOP_H
10 #define PROTO_IPV6_HOP_BY_HOP_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 hop_by_hophdr {
21 uint8_t h_next_header;
22 uint8_t hdr_len;
23 } __packed;
25 static inline void dissect_opt_hop (struct pkt_buff *pkt, ssize_t *opt_len)
27 /* Have to been upgraded.
28 * http://tools.ietf.org/html/rfc2460#section-4.2
29 * Look also for proto_ipv6_dest_opts.h, it needs
30 * dissect_opt(), too.
32 if (*opt_len)
33 tprintf(", Option(s) recognized ");
35 /* If adding dissector reduce opt_len for each using of pkt_pull
36 * to the same size.
40 static inline void hop_by_hop(struct pkt_buff *pkt)
42 uint16_t hdr_ext_len;
43 ssize_t opt_len;
44 struct hop_by_hophdr *hop_ops;
46 hop_ops = (struct hop_by_hophdr *) pkt_pull(pkt, sizeof(*hop_ops));
48 /* Total Header Length in Bytes */
49 hdr_ext_len = (hop_ops->hdr_len + 1) * 8;
50 /* Options length in Bytes */
51 opt_len = hdr_ext_len - sizeof(*hop_ops);
52 if (hop_ops == NULL)
53 return;
55 tprintf("\t [ Hop-by-Hop Options ");
56 tprintf("NextHdr (%u), ", hop_ops->h_next_header);
57 if (opt_len > pkt_len(pkt) || opt_len < 0){
58 tprintf("HdrExtLen (%u, %u Bytes, %s)", hop_ops->hdr_len,
59 hdr_ext_len, colorize_start_full(black, red)
60 "invalid" colorize_end());
61 return;
63 tprintf("HdrExtLen (%u, %u Bytes)", hop_ops->hdr_len,
64 hdr_ext_len);
66 dissect_opt_hop(pkt, &opt_len);
68 tprintf(" ]\n");
70 pkt_pull(pkt, opt_len);
71 pkt_set_proto(pkt, &eth_lay3, hop_ops->h_next_header);
74 static inline void hop_by_hop_less(struct pkt_buff *pkt)
76 uint16_t hdr_ext_len;
77 ssize_t opt_len;
78 struct hop_by_hophdr *hop_ops;
80 hop_ops = (struct hop_by_hophdr *) pkt_pull(pkt, sizeof(*hop_ops));
82 /* Total Header Length in Bytes */
83 hdr_ext_len = (hop_ops->hdr_len + 1) * 8;
84 /* Options length in Bytes */
85 opt_len = hdr_ext_len - sizeof(*hop_ops);
86 if (hop_ops == NULL || opt_len > pkt_len(pkt) || opt_len < 0)
87 return;
89 tprintf(" Hop Ops");
91 pkt_pull(pkt, opt_len);
92 pkt_set_proto(pkt, &eth_lay3, hop_ops->h_next_header);
95 struct protocol ipv6_hop_by_hop_ops = {
96 .key = 0x0,
97 .print_full = hop_by_hop,
98 .print_less = hop_by_hop_less,
101 #endif /* PROTO_IPV6_HOP_BY_HOP_H */