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 Routing Header described in RFC2460
9 #ifndef PROTO_IPV6_ROUTING_H
10 #define PROTO_IPV6_ROUTING_H
14 #include <netinet/in.h> /* for ntohs() */
15 #include <arpa/inet.h> /* for inet_ntop() */
17 #include "proto_struct.h"
18 #include "dissector_eth.h"
21 #define ROUTING_HEADER_TYPE_0 0x00
24 uint8_t h_next_header
;
25 uint8_t h_hdr_ext_len
;
26 uint8_t h_routing_type
;
27 uint8_t h_segments_left
;
32 uint32_t addresses
[0];
37 uint32_t second_block
;
39 uint32_t fourth_block
;
42 static inline void dissect_routinghdr_type_0(struct pkt_buff
*pkt
,
46 char address
[INET6_ADDRSTRLEN
];
47 struct ipv6_adrr
*addr
;
48 struct routinghdr_0
*routing_0
;
50 routing_0
= (struct routinghdr_0
*) pkt_pull(pkt
, sizeof(*routing_0
));
51 if (routing_0
== NULL
)
54 tprintf("Res (0x%x)", routing_0
->reserved
);
56 num_addr
= *hdr_ext_len
* 8 / sizeof(*addr
);
58 addr
= (struct ipv6_adrr
*) pkt_pull(pkt
, sizeof(*addr
));
62 tprintf("\n\t Address: %s",
63 inet_ntop(AF_INET6
, addr
, address
,
68 static inline void routing(struct pkt_buff
*pkt
)
71 struct routinghdr
*routing
;
73 routing
= (struct routinghdr
*) pkt_pull(pkt
, sizeof(*routing
));
75 /* Total Header Length in Bytes */
76 hdr_ext_len
= (routing
->h_hdr_ext_len
+ 1) * 8;
80 tprintf("\t [ Routing ");
81 tprintf("NextHdr (%u), ", routing
->h_next_header
);
82 tprintf("HdrExtLen (%u, %u Bytes), ", routing
->h_hdr_ext_len
,
84 tprintf("Type (%u), ", routing
->h_routing_type
);
85 tprintf("Left (%u), ", routing
->h_segments_left
);
87 switch (routing
->h_routing_type
) {
88 case ROUTING_HEADER_TYPE_0
:
89 dissect_routinghdr_type_0(pkt
, &routing
->h_hdr_ext_len
);
92 tprintf("Type %u is unknown", routing
->h_routing_type
);
97 pkt_set_proto(pkt
, ð_lay3
, routing
->h_next_header
);
100 static inline void routing_less(struct pkt_buff
*pkt
)
102 struct routinghdr
*routing
;
104 routing
= (struct routinghdr
*) pkt_pull(pkt
, sizeof(*routing
));
108 tprintf(" Routing ");
109 tprintf("Addresses (%u)",
110 routing
->h_hdr_ext_len
* 8 / sizeof(struct ipv6_adrr
));
112 pkt_set_proto(pkt
, ð_lay3
, routing
->h_next_header
);
115 struct protocol ipv6_routing_ops
= {
117 .print_full
= routing
,
118 .print_less
= routing_less
,
121 #endif /* PROTO_IPV6_ROUTING_H */