2 * IPv6 Routing 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.
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 uint8_t h_next_header
;
22 uint8_t h_hdr_ext_len
;
23 uint8_t h_routing_type
;
24 uint8_t h_segments_left
;
25 } __attribute__((packed
));
27 static inline void routing(uint8_t *packet
, size_t len
)
30 struct routinghdr
*routing
= (struct routinghdr
*) packet
;
32 hdr_ext_len
= (routing
->h_hdr_ext_len
+ 1) * 8;
33 if (len
< hdr_ext_len
|| len
< sizeof(struct routinghdr
))
36 tprintf("\t [ Routing ");
37 tprintf("NextHdr (%u), ", routing
->h_next_header
);
38 tprintf("HdrExtLen (%u), ", hdr_ext_len
);
39 tprintf("Type (%u), ", routing
->h_routing_type
);
40 tprintf("Left (%u), ", routing
->h_segments_left
);
41 if(routing
->h_routing_type
== 0) {
42 char address
[INET6_ADDRSTRLEN
];
43 for (int i
= sizeof(struct routinghdr
) + 4;
44 i
< hdr_ext_len
; i
+= 16) {
45 tprintf("\n\tAdress: ");
46 inet_ntop(AF_INET6
, &packet
[i
], address
,
48 tprintf("%s %u", address
,INET6_ADDRSTRLEN
);
51 tprintf("Appendix 0x");
52 for (uint8_t i
= sizeof(struct routinghdr
);
54 tprintf("%02x",(uint8_t) packet
[i
]);
59 static inline void routing_less(uint8_t *packet
, size_t len
)
62 struct routinghdr
*routing
= (struct routinghdr
*) packet
;
64 hdr_ext_len
= (routing
->h_hdr_ext_len
+ 1) * 8;
65 if (len
< hdr_ext_len
|| len
< sizeof(struct routinghdr
))
68 tprintf(" Routing Type %u", routing
->h_routing_type
);
71 static inline void routing_next(uint8_t *packet
, size_t len
,
72 struct hash_table
**table
,
73 unsigned int *key
, size_t *off
)
76 struct routinghdr
*routing
= (struct routinghdr
*) packet
;
78 hdr_ext_len
= (routing
->h_hdr_ext_len
+ 1) * 8;
79 if (len
< hdr_ext_len
|| len
< sizeof(struct routinghdr
))
83 (*key
) = routing
->h_next_header
;
92 struct protocol ipv6_routing_ops
= {
94 .print_full
= routing
,
95 .print_less
= routing_less
,
96 .print_pay_ascii
= empty
,
97 .print_pay_hex
= empty
,
98 .print_pay_none
= routing
,
99 .print_all_cstyle
= __hex2
,
100 .print_all_hex
= __hex
,
101 .proto_next
= routing_next
,
104 #endif /* ROUTING_H */