proto_ipv6_routing.h:beautify output
[netsniff-ng.git] / src / proto_ipv6_routing.h
blob710824337a197668def744d77836764e01800efa
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 Routing Header described in RFC2460
7 */
9 #ifndef PROTO_IPV6_ROUTING_H
10 #define PROTO_IPV6_ROUTING_H
12 #include <stdio.h>
13 #include <stdint.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"
19 #include "built_in.h"
21 #define ROUTING_HEADER_TYPE_0 0x00
23 struct routinghdr {
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;
28 } __packed;
30 struct routinghdr_0 {
31 uint32_t reserved;
32 uint32_t addresses[0];
33 } __packed;
35 struct ipv6_adrr {
36 uint32_t first_block;
37 uint32_t second_block;
38 uint32_t third_block;
39 uint32_t fourth_block;
40 } __packed;
42 static inline void dissect_routinghdr_type_0(struct pkt_buff *pkt,
43 uint8_t *hdr_ext_len)
45 uint8_t num_addr;
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)
52 return;
54 tprintf("Res (0x%x)", routing_0->reserved);
56 num_addr = *hdr_ext_len * 8 / sizeof(*addr);
57 while (num_addr--) {
58 addr = (struct ipv6_adrr *) pkt_pull(pkt, sizeof(*addr));
59 if (addr == NULL)
60 return;
62 tprintf("\n\t Address: %s",
63 inet_ntop(AF_INET6, addr, address,
64 sizeof(address)));
68 static inline void routing(struct pkt_buff *pkt)
70 uint8_t hdr_ext_len;
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;
77 if (routing == NULL)
78 return;
80 tprintf("\t [ Routing ");
81 tprintf("NextHdr (%u), ", routing->h_next_header);
82 tprintf("HdrExtLen (%u, %u Bytes), ", routing->h_hdr_ext_len,
83 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);
90 break;
91 default:
92 tprintf("Type %u is unknown", routing->h_routing_type);
95 tprintf(" ]\n");
97 pkt_set_proto(pkt, &eth_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));
105 if (routing == NULL)
106 return;
108 tprintf(" Routing ");
109 tprintf("Addresses (%u)",
110 routing->h_hdr_ext_len * 8 / sizeof(struct ipv6_adrr));
112 pkt_set_proto(pkt, &eth_lay3, routing->h_next_header);
115 struct protocol ipv6_routing_ops = {
116 .key = 0x2B,
117 .print_full = routing,
118 .print_less = routing_less,
121 #endif /* PROTO_IPV6_ROUTING_H */