2 * netsniff-ng - the packet sniffing beast
3 * Copyright 2012 Markus Amend <markus@netsniff-ng.org>, Deutsche Flugsicherung GmbH
4 * Subject to the GPL, version 2.
6 * IPv6 Destination Options Header described in RFC2460
11 #include <netinet/in.h> /* for ntohs() */
15 #include "dissector_eth.h"
20 uint8_t h_next_header
;
25 static void dissect_opt_dest(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_hop_by_hop.h, it needs
33 tprintf(", Option(s) recognized ");
35 /* If adding dissector reduce opt_len for each using of pkt_pull
40 static void dest_opts(struct pkt_buff
*pkt
)
44 struct dest_optshdr
*dest_ops
;
46 dest_ops
= (struct dest_optshdr
*) pkt_pull(pkt
, sizeof(*dest_ops
));
50 /* Total Header Length in Bytes */
51 hdr_ext_len
= (dest_ops
->hdr_len
+ 1) * 8;
52 /* Options length in Bytes */
53 opt_len
= hdr_ext_len
- sizeof(*dest_ops
);
55 tprintf("\t [ Destination Options ");
56 tprintf("NextHdr (%u), ", dest_ops
->h_next_header
);
57 if (opt_len
> pkt_len(pkt
) || opt_len
< 0) {
58 tprintf("HdrExtLen (%u, %u Bytes, %s)", dest_ops
->hdr_len
,
59 hdr_ext_len
, colorize_start_full(black
, red
)
60 "invalid" colorize_end());
63 tprintf("HdrExtLen (%u, %u Bytes)", dest_ops
->hdr_len
,
66 dissect_opt_dest(pkt
, &opt_len
);
70 pkt_pull(pkt
, opt_len
);
71 pkt_set_proto(pkt
, ð_lay3
, dest_ops
->h_next_header
);
74 static void dest_opts_less(struct pkt_buff
*pkt
)
78 struct dest_optshdr
*dest_ops
;
80 dest_ops
= (struct dest_optshdr
*) pkt_pull(pkt
, sizeof(*dest_ops
));
84 /* Total Header Length in Bytes */
85 hdr_ext_len
= (dest_ops
->hdr_len
+ 1) * 8;
86 /* Options length in Bytes */
87 opt_len
= hdr_ext_len
- sizeof(*dest_ops
);
88 if (opt_len
> pkt_len(pkt
) || opt_len
< 0)
93 pkt_pull(pkt
, opt_len
);
94 pkt_set_proto(pkt
, ð_lay3
, dest_ops
->h_next_header
);
97 struct protocol ipv6_dest_opts_ops
= {
99 .print_full
= dest_opts
,
100 .print_less
= dest_opts_less
,
103 EXPORT_SYMBOL(ipv6_dest_opts_ops
);