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 Destination Options Header described in RFC2460
9 #ifndef PROTO_IPV6_DEST_OPTS_H
10 #define PROTO_IPV6_DEST_OPTS_H
14 #include <netinet/in.h> /* for ntohs() */
16 #include "proto_struct.h"
17 #include "dissector_eth.h"
21 uint8_t h_next_header
;
26 static inline void dissect_opt_dest(struct pkt_buff
*pkt
, size_t *opt_len
)
28 /* Have to been upgraded.
29 * http://tools.ietf.org/html/rfc2460#section-4.2
30 * Look also for proto_ipv6_hop_by_hop.h, it needs
34 tprintf(", Option(s) recognized ");
36 /* If adding dissector reduce opt_len for each using of pkt_pull
41 static inline void dest_opts(struct pkt_buff
*pkt
)
45 struct dest_optshdr
*dest_ops
;
47 dest_ops
= (struct dest_optshdr
*) pkt_pull(pkt
, sizeof(*dest_ops
));
49 /* Total Header Length in Bytes */
50 hdr_ext_len
= (dest_ops
->hdr_len
+ 1) * 8;
51 /* Options length in Bytes */
52 opt_len
= hdr_ext_len
- sizeof(*dest_ops
);
53 if (dest_ops
== NULL
|| opt_len
> pkt_len(pkt
))
56 tprintf("\t [ Destination Options ");
57 tprintf("NextHdr (%u), ", dest_ops
->h_next_header
);
58 tprintf("HdrExtLen (%u, %u Bytes)", dest_ops
->hdr_len
,
61 dissect_opt_dest(pkt
, &opt_len
);
65 pkt_pull(pkt
, opt_len
);
66 pkt_set_proto(pkt
, ð_lay3
, dest_ops
->h_next_header
);
69 static inline void dest_opts_less(struct pkt_buff
*pkt
)
73 struct dest_optshdr
*dest_ops
;
75 dest_ops
= (struct dest_optshdr
*) pkt_pull(pkt
, sizeof(*dest_ops
));
77 /* Total Header Length in Bytes */
78 hdr_ext_len
= (dest_ops
->hdr_len
+ 1) * 8;
79 /* Options length in Bytes */
80 opt_len
= hdr_ext_len
- sizeof(*dest_ops
);
81 if (dest_ops
== NULL
|| opt_len
> pkt_len(pkt
))
86 pkt_pull(pkt
, opt_len
);
87 pkt_set_proto(pkt
, ð_lay3
, dest_ops
->h_next_header
);
90 struct protocol ipv6_dest_opts_ops
= {
92 .print_full
= dest_opts
,
93 .print_less
= dest_opts_less
,
96 #endif /* PROTO_IPV6_DEST_OPTS_H */