141c99275SPeter Avalos /*
241c99275SPeter Avalos * Copyright (c) 1998-2007 The TCPDUMP project
327bfbee1SPeter Avalos * Copyright (c) 2009 Florian Forster
441c99275SPeter Avalos *
541c99275SPeter Avalos * Redistribution and use in source and binary forms, with or without
641c99275SPeter Avalos * modification, are permitted provided that: (1) source code
741c99275SPeter Avalos * distributions retain the above copyright notice and this paragraph
841c99275SPeter Avalos * in its entirety, and (2) distributions including binary code include
941c99275SPeter Avalos * the above copyright notice and this paragraph in its entirety in
1041c99275SPeter Avalos * the documentation or other materials provided with the distribution.
1141c99275SPeter Avalos * THIS SOFTWARE IS PROVIDED ``AS IS'' AND
1241c99275SPeter Avalos * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT
1341c99275SPeter Avalos * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
1441c99275SPeter Avalos * FOR A PARTICULAR PURPOSE.
1541c99275SPeter Avalos *
16411677aeSAaron LI * Original code by Hannes Gredler <hannes@gredler.at>
1727bfbee1SPeter Avalos * IPv6 additions by Florian Forster <octo at verplant.org>
1841c99275SPeter Avalos */
1941c99275SPeter Avalos
20411677aeSAaron LI /* \summary: Optimized Link State Routing Protocol (OLSR) printer */
21411677aeSAaron LI
22411677aeSAaron LI /* specification: RFC 3626 */
23411677aeSAaron LI
2441c99275SPeter Avalos #ifdef HAVE_CONFIG_H
25*ed775ee7SAntonio Huete Jimenez #include <config.h>
2641c99275SPeter Avalos #endif
2741c99275SPeter Avalos
28*ed775ee7SAntonio Huete Jimenez #include "netdissect-stdinc.h"
2941c99275SPeter Avalos
30411677aeSAaron LI #include "netdissect.h"
3141c99275SPeter Avalos #include "addrtoname.h"
3241c99275SPeter Avalos #include "extract.h"
3341c99275SPeter Avalos
3441c99275SPeter Avalos /*
3541c99275SPeter Avalos * RFC 3626 common header
3641c99275SPeter Avalos *
3741c99275SPeter Avalos * 0 1 2 3
3841c99275SPeter Avalos * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
3941c99275SPeter Avalos * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
4041c99275SPeter Avalos * | Packet Length | Packet Sequence Number |
4141c99275SPeter Avalos * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
4241c99275SPeter Avalos * | Message Type | Vtime | Message Size |
4341c99275SPeter Avalos * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
4441c99275SPeter Avalos * | Originator Address |
4541c99275SPeter Avalos * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
4641c99275SPeter Avalos * | Time To Live | Hop Count | Message Sequence Number |
4741c99275SPeter Avalos * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
4841c99275SPeter Avalos * | |
4941c99275SPeter Avalos * : MESSAGE :
5041c99275SPeter Avalos * | |
5141c99275SPeter Avalos * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
5241c99275SPeter Avalos * | Message Type | Vtime | Message Size |
5341c99275SPeter Avalos * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
5441c99275SPeter Avalos * | Originator Address |
5541c99275SPeter Avalos * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
5641c99275SPeter Avalos * | Time To Live | Hop Count | Message Sequence Number |
5741c99275SPeter Avalos * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
5841c99275SPeter Avalos * | |
5941c99275SPeter Avalos * : MESSAGE :
6041c99275SPeter Avalos * | |
6141c99275SPeter Avalos * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
6241c99275SPeter Avalos * : :
6341c99275SPeter Avalos */
6441c99275SPeter Avalos
6541c99275SPeter Avalos struct olsr_common {
66*ed775ee7SAntonio Huete Jimenez nd_uint16_t packet_len;
67*ed775ee7SAntonio Huete Jimenez nd_uint16_t packet_seq;
6841c99275SPeter Avalos };
6941c99275SPeter Avalos
7041c99275SPeter Avalos #define OLSR_HELLO_MSG 1 /* rfc3626 */
7141c99275SPeter Avalos #define OLSR_TC_MSG 2 /* rfc3626 */
7241c99275SPeter Avalos #define OLSR_MID_MSG 3 /* rfc3626 */
7341c99275SPeter Avalos #define OLSR_HNA_MSG 4 /* rfc3626 */
7441c99275SPeter Avalos #define OLSR_POWERINFO_MSG 128
7541c99275SPeter Avalos #define OLSR_NAMESERVICE_MSG 130
7641c99275SPeter Avalos #define OLSR_HELLO_LQ_MSG 201 /* LQ extensions olsr.org */
7741c99275SPeter Avalos #define OLSR_TC_LQ_MSG 202 /* LQ extensions olsr.org */
7841c99275SPeter Avalos
79411677aeSAaron LI static const struct tok olsr_msg_values[] = {
8041c99275SPeter Avalos { OLSR_HELLO_MSG, "Hello" },
8141c99275SPeter Avalos { OLSR_TC_MSG, "TC" },
8241c99275SPeter Avalos { OLSR_MID_MSG, "MID" },
8341c99275SPeter Avalos { OLSR_HNA_MSG, "HNA" },
8441c99275SPeter Avalos { OLSR_POWERINFO_MSG, "Powerinfo" },
8541c99275SPeter Avalos { OLSR_NAMESERVICE_MSG, "Nameservice" },
8641c99275SPeter Avalos { OLSR_HELLO_LQ_MSG, "Hello-LQ" },
8741c99275SPeter Avalos { OLSR_TC_LQ_MSG, "TC-LQ" },
8841c99275SPeter Avalos { 0, NULL}
8941c99275SPeter Avalos };
9041c99275SPeter Avalos
9127bfbee1SPeter Avalos struct olsr_msg4 {
92*ed775ee7SAntonio Huete Jimenez nd_uint8_t msg_type;
93*ed775ee7SAntonio Huete Jimenez nd_uint8_t vtime;
94*ed775ee7SAntonio Huete Jimenez nd_uint16_t msg_len;
95*ed775ee7SAntonio Huete Jimenez nd_ipv4 originator;
96*ed775ee7SAntonio Huete Jimenez nd_uint8_t ttl;
97*ed775ee7SAntonio Huete Jimenez nd_uint8_t hopcount;
98*ed775ee7SAntonio Huete Jimenez nd_uint16_t msg_seq;
9941c99275SPeter Avalos };
10041c99275SPeter Avalos
10127bfbee1SPeter Avalos struct olsr_msg6 {
102*ed775ee7SAntonio Huete Jimenez nd_uint8_t msg_type;
103*ed775ee7SAntonio Huete Jimenez nd_uint8_t vtime;
104*ed775ee7SAntonio Huete Jimenez nd_uint16_t msg_len;
105*ed775ee7SAntonio Huete Jimenez nd_ipv6 originator;
106*ed775ee7SAntonio Huete Jimenez nd_uint8_t ttl;
107*ed775ee7SAntonio Huete Jimenez nd_uint8_t hopcount;
108*ed775ee7SAntonio Huete Jimenez nd_uint16_t msg_seq;
10927bfbee1SPeter Avalos };
11027bfbee1SPeter Avalos
11141c99275SPeter Avalos struct olsr_hello {
112*ed775ee7SAntonio Huete Jimenez nd_byte res[2];
113*ed775ee7SAntonio Huete Jimenez nd_uint8_t htime;
114*ed775ee7SAntonio Huete Jimenez nd_uint8_t will;
11541c99275SPeter Avalos };
11641c99275SPeter Avalos
11741c99275SPeter Avalos struct olsr_hello_link {
118*ed775ee7SAntonio Huete Jimenez nd_uint8_t link_code;
119*ed775ee7SAntonio Huete Jimenez nd_byte res;
120*ed775ee7SAntonio Huete Jimenez nd_uint16_t len;
12141c99275SPeter Avalos };
12241c99275SPeter Avalos
12341c99275SPeter Avalos struct olsr_tc {
124*ed775ee7SAntonio Huete Jimenez nd_uint16_t ans_seq;
125*ed775ee7SAntonio Huete Jimenez nd_byte res[2];
12641c99275SPeter Avalos };
12741c99275SPeter Avalos
12827bfbee1SPeter Avalos struct olsr_hna4 {
129*ed775ee7SAntonio Huete Jimenez nd_ipv4 network;
130*ed775ee7SAntonio Huete Jimenez nd_ipv4 mask;
13141c99275SPeter Avalos };
13241c99275SPeter Avalos
13327bfbee1SPeter Avalos struct olsr_hna6 {
134*ed775ee7SAntonio Huete Jimenez nd_ipv6 network;
135*ed775ee7SAntonio Huete Jimenez nd_ipv6 mask;
136411677aeSAaron LI };
137411677aeSAaron LI
138411677aeSAaron LI
139411677aeSAaron LI /** gateway HNA flags */
140411677aeSAaron LI enum gateway_hna_flags {
141411677aeSAaron LI GW_HNA_FLAG_LINKSPEED = 1 << 0,
142411677aeSAaron LI GW_HNA_FLAG_IPV4 = 1 << 1,
143411677aeSAaron LI GW_HNA_FLAG_IPV4_NAT = 1 << 2,
144411677aeSAaron LI GW_HNA_FLAG_IPV6 = 1 << 3,
145411677aeSAaron LI GW_HNA_FLAG_IPV6PREFIX = 1 << 4
146411677aeSAaron LI };
147411677aeSAaron LI
148411677aeSAaron LI /** gateway HNA field byte offsets in the netmask field of the HNA */
149411677aeSAaron LI enum gateway_hna_fields {
150411677aeSAaron LI GW_HNA_PAD = 0,
151411677aeSAaron LI GW_HNA_FLAGS = 1,
152411677aeSAaron LI GW_HNA_UPLINK = 2,
153411677aeSAaron LI GW_HNA_DOWNLINK = 3,
154411677aeSAaron LI GW_HNA_V6PREFIXLEN = 4,
155411677aeSAaron LI GW_HNA_V6PREFIX = 5
15627bfbee1SPeter Avalos };
15727bfbee1SPeter Avalos
15841c99275SPeter Avalos
15941c99275SPeter Avalos #define OLSR_EXTRACT_LINK_TYPE(link_code) (link_code & 0x3)
16041c99275SPeter Avalos #define OLSR_EXTRACT_NEIGHBOR_TYPE(link_code) (link_code >> 2)
16141c99275SPeter Avalos
162411677aeSAaron LI static const struct tok olsr_link_type_values[] = {
16341c99275SPeter Avalos { 0, "Unspecified" },
16441c99275SPeter Avalos { 1, "Asymmetric" },
16541c99275SPeter Avalos { 2, "Symmetric" },
16641c99275SPeter Avalos { 3, "Lost" },
16741c99275SPeter Avalos { 0, NULL}
16841c99275SPeter Avalos };
16941c99275SPeter Avalos
170411677aeSAaron LI static const struct tok olsr_neighbor_type_values[] = {
17141c99275SPeter Avalos { 0, "Not-Neighbor" },
17241c99275SPeter Avalos { 1, "Symmetric" },
17341c99275SPeter Avalos { 2, "Symmetric-MPR" },
17441c99275SPeter Avalos { 0, NULL}
17541c99275SPeter Avalos };
17641c99275SPeter Avalos
17727bfbee1SPeter Avalos struct olsr_lq_neighbor4 {
178*ed775ee7SAntonio Huete Jimenez nd_ipv4 neighbor;
179*ed775ee7SAntonio Huete Jimenez nd_uint8_t link_quality;
180*ed775ee7SAntonio Huete Jimenez nd_uint8_t neighbor_link_quality;
181*ed775ee7SAntonio Huete Jimenez nd_byte res[2];
18241c99275SPeter Avalos };
18341c99275SPeter Avalos
18427bfbee1SPeter Avalos struct olsr_lq_neighbor6 {
185*ed775ee7SAntonio Huete Jimenez nd_ipv6 neighbor;
186*ed775ee7SAntonio Huete Jimenez nd_uint8_t link_quality;
187*ed775ee7SAntonio Huete Jimenez nd_uint8_t neighbor_link_quality;
188*ed775ee7SAntonio Huete Jimenez nd_byte res[2];
18927bfbee1SPeter Avalos };
19027bfbee1SPeter Avalos
191411677aeSAaron LI #define MAX_SMARTGW_SPEED 320000000
192411677aeSAaron LI
193411677aeSAaron LI /**
194411677aeSAaron LI * Convert an encoded 1 byte transport value (5 bits mantissa, 3 bits exponent)
195411677aeSAaron LI * to an uplink/downlink speed value
196411677aeSAaron LI *
197411677aeSAaron LI * @param value the encoded 1 byte transport value
198411677aeSAaron LI * @return the uplink/downlink speed value (in kbit/s)
199411677aeSAaron LI */
deserialize_gw_speed(uint8_t value)200411677aeSAaron LI static uint32_t deserialize_gw_speed(uint8_t value) {
201411677aeSAaron LI uint32_t speed;
202411677aeSAaron LI uint32_t exp;
203411677aeSAaron LI
204411677aeSAaron LI if (!value) {
205411677aeSAaron LI return 0;
206411677aeSAaron LI }
207411677aeSAaron LI
208411677aeSAaron LI if (value == UINT8_MAX) {
209411677aeSAaron LI /* maximum value: also return maximum value */
210411677aeSAaron LI return MAX_SMARTGW_SPEED;
211411677aeSAaron LI }
212411677aeSAaron LI
213411677aeSAaron LI speed = (value >> 3) + 1;
214411677aeSAaron LI exp = value & 7;
215411677aeSAaron LI
216*ed775ee7SAntonio Huete Jimenez while (exp != 0) {
217411677aeSAaron LI speed *= 10;
218*ed775ee7SAntonio Huete Jimenez exp--;
219411677aeSAaron LI }
220411677aeSAaron LI return speed;
221411677aeSAaron LI }
222411677aeSAaron LI
22341c99275SPeter Avalos /*
22441c99275SPeter Avalos * macro to convert the 8-bit mantissa/exponent to a double float
22541c99275SPeter Avalos * taken from olsr.org.
22641c99275SPeter Avalos */
22741c99275SPeter Avalos #define VTIME_SCALE_FACTOR 0.0625
22841c99275SPeter Avalos #define ME_TO_DOUBLE(me) \
22941c99275SPeter Avalos (double)(VTIME_SCALE_FACTOR*(1+(double)(me>>4)/16)*(double)(1<<(me&0x0F)))
23041c99275SPeter Avalos
23141c99275SPeter Avalos /*
23241c99275SPeter Avalos * print a neighbor list with LQ extensions.
23341c99275SPeter Avalos */
234411677aeSAaron LI static int
olsr_print_lq_neighbor4(netdissect_options * ndo,const u_char * msg_data,u_int hello_len)235411677aeSAaron LI olsr_print_lq_neighbor4(netdissect_options *ndo,
236411677aeSAaron LI const u_char *msg_data, u_int hello_len)
23741c99275SPeter Avalos {
238411677aeSAaron LI const struct olsr_lq_neighbor4 *lq_neighbor;
23941c99275SPeter Avalos
24027bfbee1SPeter Avalos while (hello_len >= sizeof(struct olsr_lq_neighbor4)) {
24141c99275SPeter Avalos
242411677aeSAaron LI lq_neighbor = (const struct olsr_lq_neighbor4 *)msg_data;
243*ed775ee7SAntonio Huete Jimenez ND_TCHECK_SIZE(lq_neighbor);
24441c99275SPeter Avalos
245*ed775ee7SAntonio Huete Jimenez ND_PRINT("\n\t neighbor %s, link-quality %.2f%%"
246411677aeSAaron LI ", neighbor-link-quality %.2f%%",
247*ed775ee7SAntonio Huete Jimenez GET_IPADDR_STRING(lq_neighbor->neighbor),
248*ed775ee7SAntonio Huete Jimenez ((double) GET_U_1(lq_neighbor->link_quality)/2.55),
249*ed775ee7SAntonio Huete Jimenez ((double) GET_U_1(lq_neighbor->neighbor_link_quality)/2.55));
25041c99275SPeter Avalos
25127bfbee1SPeter Avalos msg_data += sizeof(struct olsr_lq_neighbor4);
25227bfbee1SPeter Avalos hello_len -= sizeof(struct olsr_lq_neighbor4);
25341c99275SPeter Avalos }
254411677aeSAaron LI return (0);
255*ed775ee7SAntonio Huete Jimenez trunc:
256*ed775ee7SAntonio Huete Jimenez return -1;
25741c99275SPeter Avalos }
25841c99275SPeter Avalos
259411677aeSAaron LI static int
olsr_print_lq_neighbor6(netdissect_options * ndo,const u_char * msg_data,u_int hello_len)260411677aeSAaron LI olsr_print_lq_neighbor6(netdissect_options *ndo,
261411677aeSAaron LI const u_char *msg_data, u_int hello_len)
26227bfbee1SPeter Avalos {
263411677aeSAaron LI const struct olsr_lq_neighbor6 *lq_neighbor;
26427bfbee1SPeter Avalos
26527bfbee1SPeter Avalos while (hello_len >= sizeof(struct olsr_lq_neighbor6)) {
26627bfbee1SPeter Avalos
267411677aeSAaron LI lq_neighbor = (const struct olsr_lq_neighbor6 *)msg_data;
268*ed775ee7SAntonio Huete Jimenez ND_TCHECK_SIZE(lq_neighbor);
26927bfbee1SPeter Avalos
270*ed775ee7SAntonio Huete Jimenez ND_PRINT("\n\t neighbor %s, link-quality %.2f%%"
271411677aeSAaron LI ", neighbor-link-quality %.2f%%",
272*ed775ee7SAntonio Huete Jimenez GET_IP6ADDR_STRING(lq_neighbor->neighbor),
273*ed775ee7SAntonio Huete Jimenez ((double) GET_U_1(lq_neighbor->link_quality)/2.55),
274*ed775ee7SAntonio Huete Jimenez ((double) GET_U_1(lq_neighbor->neighbor_link_quality)/2.55));
27527bfbee1SPeter Avalos
27627bfbee1SPeter Avalos msg_data += sizeof(struct olsr_lq_neighbor6);
27727bfbee1SPeter Avalos hello_len -= sizeof(struct olsr_lq_neighbor6);
27827bfbee1SPeter Avalos }
279411677aeSAaron LI return (0);
280*ed775ee7SAntonio Huete Jimenez trunc:
281*ed775ee7SAntonio Huete Jimenez return -1;
28227bfbee1SPeter Avalos }
28327bfbee1SPeter Avalos
28441c99275SPeter Avalos /*
28541c99275SPeter Avalos * print a neighbor list.
28641c99275SPeter Avalos */
287411677aeSAaron LI static int
olsr_print_neighbor(netdissect_options * ndo,const u_char * msg_data,u_int hello_len)288411677aeSAaron LI olsr_print_neighbor(netdissect_options *ndo,
289411677aeSAaron LI const u_char *msg_data, u_int hello_len)
29041c99275SPeter Avalos {
29141c99275SPeter Avalos int neighbor;
29241c99275SPeter Avalos
293*ed775ee7SAntonio Huete Jimenez ND_PRINT("\n\t neighbor\n\t\t");
29441c99275SPeter Avalos neighbor = 1;
29541c99275SPeter Avalos
296*ed775ee7SAntonio Huete Jimenez while (hello_len >= sizeof(nd_ipv4)) {
29741c99275SPeter Avalos /* print 4 neighbors per line */
298*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s%s", GET_IPADDR_STRING(msg_data),
299*ed775ee7SAntonio Huete Jimenez neighbor % 4 == 0 ? "\n\t\t" : " ");
30041c99275SPeter Avalos
301*ed775ee7SAntonio Huete Jimenez msg_data += sizeof(nd_ipv4);
302*ed775ee7SAntonio Huete Jimenez hello_len -= sizeof(nd_ipv4);
30341c99275SPeter Avalos }
304411677aeSAaron LI return (0);
30541c99275SPeter Avalos }
30641c99275SPeter Avalos
30741c99275SPeter Avalos
30841c99275SPeter Avalos void
olsr_print(netdissect_options * ndo,const u_char * pptr,u_int length,int is_ipv6)309411677aeSAaron LI olsr_print(netdissect_options *ndo,
310411677aeSAaron LI const u_char *pptr, u_int length, int is_ipv6)
31141c99275SPeter Avalos {
31241c99275SPeter Avalos union {
31341c99275SPeter Avalos const struct olsr_common *common;
31427bfbee1SPeter Avalos const struct olsr_msg4 *msg4;
31527bfbee1SPeter Avalos const struct olsr_msg6 *msg6;
31641c99275SPeter Avalos const struct olsr_hello *hello;
31741c99275SPeter Avalos const struct olsr_hello_link *hello_link;
31841c99275SPeter Avalos const struct olsr_tc *tc;
31927bfbee1SPeter Avalos const struct olsr_hna4 *hna;
32041c99275SPeter Avalos } ptr;
32141c99275SPeter Avalos
32227bfbee1SPeter Avalos u_int msg_type, msg_len, msg_tlen, hello_len;
323411677aeSAaron LI uint16_t name_entry_type, name_entry_len;
32427bfbee1SPeter Avalos u_int name_entry_padding;
325411677aeSAaron LI uint8_t link_type, neighbor_type;
32641c99275SPeter Avalos const u_char *tptr, *msg_data;
32741c99275SPeter Avalos
328*ed775ee7SAntonio Huete Jimenez ndo->ndo_protocol = "olsr";
32941c99275SPeter Avalos tptr = pptr;
33041c99275SPeter Avalos
331*ed775ee7SAntonio Huete Jimenez nd_print_protocol_caps(ndo);
332*ed775ee7SAntonio Huete Jimenez ND_PRINT("v%u", (is_ipv6) ? 6 : 4);
333*ed775ee7SAntonio Huete Jimenez
33441c99275SPeter Avalos if (length < sizeof(struct olsr_common)) {
33541c99275SPeter Avalos goto trunc;
33641c99275SPeter Avalos }
33741c99275SPeter Avalos
338*ed775ee7SAntonio Huete Jimenez ND_TCHECK_LEN(tptr, sizeof(struct olsr_common));
33941c99275SPeter Avalos
340411677aeSAaron LI ptr.common = (const struct olsr_common *)tptr;
341*ed775ee7SAntonio Huete Jimenez length = ND_MIN(length, GET_BE_U_2(ptr.common->packet_len));
34241c99275SPeter Avalos
343*ed775ee7SAntonio Huete Jimenez ND_PRINT(", seq 0x%04x, length %u",
344*ed775ee7SAntonio Huete Jimenez GET_BE_U_2(ptr.common->packet_seq),
345*ed775ee7SAntonio Huete Jimenez length);
34641c99275SPeter Avalos
34741c99275SPeter Avalos tptr += sizeof(struct olsr_common);
34841c99275SPeter Avalos
34941c99275SPeter Avalos /*
35041c99275SPeter Avalos * In non-verbose mode, just print version.
35141c99275SPeter Avalos */
352411677aeSAaron LI if (ndo->ndo_vflag < 1) {
35341c99275SPeter Avalos return;
35441c99275SPeter Avalos }
35541c99275SPeter Avalos
35641c99275SPeter Avalos while (tptr < (pptr+length)) {
35727bfbee1SPeter Avalos union
35827bfbee1SPeter Avalos {
359411677aeSAaron LI const struct olsr_msg4 *v4;
360411677aeSAaron LI const struct olsr_msg6 *v6;
36127bfbee1SPeter Avalos } msgptr;
36227bfbee1SPeter Avalos int msg_len_valid = 0;
36341c99275SPeter Avalos
36427bfbee1SPeter Avalos if (is_ipv6)
36527bfbee1SPeter Avalos {
366*ed775ee7SAntonio Huete Jimenez ND_TCHECK_LEN(tptr, sizeof(struct olsr_msg6));
367411677aeSAaron LI msgptr.v6 = (const struct olsr_msg6 *) tptr;
368*ed775ee7SAntonio Huete Jimenez msg_type = GET_U_1(msgptr.v6->msg_type);
369*ed775ee7SAntonio Huete Jimenez msg_len = GET_BE_U_2(msgptr.v6->msg_len);
37027bfbee1SPeter Avalos if ((msg_len >= sizeof (struct olsr_msg6))
37127bfbee1SPeter Avalos && (msg_len <= length))
37227bfbee1SPeter Avalos msg_len_valid = 1;
37341c99275SPeter Avalos
37441c99275SPeter Avalos /* infinite loop check */
37541c99275SPeter Avalos if (msg_type == 0 || msg_len == 0) {
37641c99275SPeter Avalos return;
37741c99275SPeter Avalos }
37841c99275SPeter Avalos
379*ed775ee7SAntonio Huete Jimenez ND_PRINT("\n\t%s Message (%#04x), originator %s, ttl %u, hop %u"
380411677aeSAaron LI "\n\t vtime %.3fs, msg-seq 0x%04x, length %u%s",
38141c99275SPeter Avalos tok2str(olsr_msg_values, "Unknown", msg_type),
382*ed775ee7SAntonio Huete Jimenez msg_type, GET_IP6ADDR_STRING(msgptr.v6->originator),
383*ed775ee7SAntonio Huete Jimenez GET_U_1(msgptr.v6->ttl),
384*ed775ee7SAntonio Huete Jimenez GET_U_1(msgptr.v6->hopcount),
385*ed775ee7SAntonio Huete Jimenez ME_TO_DOUBLE(GET_U_1(msgptr.v6->vtime)),
386*ed775ee7SAntonio Huete Jimenez GET_BE_U_2(msgptr.v6->msg_seq),
387*ed775ee7SAntonio Huete Jimenez msg_len, (msg_len_valid == 0) ? " (invalid)" : "");
388411677aeSAaron LI if (!msg_len_valid) {
389411677aeSAaron LI return;
390411677aeSAaron LI }
39141c99275SPeter Avalos
39227bfbee1SPeter Avalos msg_tlen = msg_len - sizeof(struct olsr_msg6);
39327bfbee1SPeter Avalos msg_data = tptr + sizeof(struct olsr_msg6);
39427bfbee1SPeter Avalos }
39527bfbee1SPeter Avalos else /* (!is_ipv6) */
39627bfbee1SPeter Avalos {
397*ed775ee7SAntonio Huete Jimenez ND_TCHECK_LEN(tptr, sizeof(struct olsr_msg4));
398411677aeSAaron LI msgptr.v4 = (const struct olsr_msg4 *) tptr;
399*ed775ee7SAntonio Huete Jimenez msg_type = GET_U_1(msgptr.v4->msg_type);
400*ed775ee7SAntonio Huete Jimenez msg_len = GET_BE_U_2(msgptr.v4->msg_len);
40127bfbee1SPeter Avalos if ((msg_len >= sizeof (struct olsr_msg4))
40227bfbee1SPeter Avalos && (msg_len <= length))
40327bfbee1SPeter Avalos msg_len_valid = 1;
40427bfbee1SPeter Avalos
40527bfbee1SPeter Avalos /* infinite loop check */
40627bfbee1SPeter Avalos if (msg_type == 0 || msg_len == 0) {
40727bfbee1SPeter Avalos return;
40827bfbee1SPeter Avalos }
40927bfbee1SPeter Avalos
410*ed775ee7SAntonio Huete Jimenez ND_PRINT("\n\t%s Message (%#04x), originator %s, ttl %u, hop %u"
411411677aeSAaron LI "\n\t vtime %.3fs, msg-seq 0x%04x, length %u%s",
41227bfbee1SPeter Avalos tok2str(olsr_msg_values, "Unknown", msg_type),
413*ed775ee7SAntonio Huete Jimenez msg_type, GET_IPADDR_STRING(msgptr.v4->originator),
414*ed775ee7SAntonio Huete Jimenez GET_U_1(msgptr.v4->ttl),
415*ed775ee7SAntonio Huete Jimenez GET_U_1(msgptr.v4->hopcount),
416*ed775ee7SAntonio Huete Jimenez ME_TO_DOUBLE(GET_U_1(msgptr.v4->vtime)),
417*ed775ee7SAntonio Huete Jimenez GET_BE_U_2(msgptr.v4->msg_seq),
418*ed775ee7SAntonio Huete Jimenez msg_len, (msg_len_valid == 0) ? " (invalid)" : "");
419411677aeSAaron LI if (!msg_len_valid) {
420411677aeSAaron LI return;
421411677aeSAaron LI }
42227bfbee1SPeter Avalos
42327bfbee1SPeter Avalos msg_tlen = msg_len - sizeof(struct olsr_msg4);
42427bfbee1SPeter Avalos msg_data = tptr + sizeof(struct olsr_msg4);
42527bfbee1SPeter Avalos }
42641c99275SPeter Avalos
42741c99275SPeter Avalos switch (msg_type) {
42841c99275SPeter Avalos case OLSR_HELLO_MSG:
42941c99275SPeter Avalos case OLSR_HELLO_LQ_MSG:
430411677aeSAaron LI if (msg_tlen < sizeof(struct olsr_hello))
43141c99275SPeter Avalos goto trunc;
432*ed775ee7SAntonio Huete Jimenez ND_TCHECK_LEN(msg_data, sizeof(struct olsr_hello));
43341c99275SPeter Avalos
434411677aeSAaron LI ptr.hello = (const struct olsr_hello *)msg_data;
435*ed775ee7SAntonio Huete Jimenez ND_PRINT("\n\t hello-time %.3fs, MPR willingness %u",
436*ed775ee7SAntonio Huete Jimenez ME_TO_DOUBLE(GET_U_1(ptr.hello->htime)),
437*ed775ee7SAntonio Huete Jimenez GET_U_1(ptr.hello->will));
43841c99275SPeter Avalos msg_data += sizeof(struct olsr_hello);
43941c99275SPeter Avalos msg_tlen -= sizeof(struct olsr_hello);
44041c99275SPeter Avalos
44141c99275SPeter Avalos while (msg_tlen >= sizeof(struct olsr_hello_link)) {
44227bfbee1SPeter Avalos int hello_len_valid = 0;
44341c99275SPeter Avalos
44441c99275SPeter Avalos /*
44541c99275SPeter Avalos * link-type.
44641c99275SPeter Avalos */
447*ed775ee7SAntonio Huete Jimenez ND_TCHECK_LEN(msg_data, sizeof(struct olsr_hello_link));
44841c99275SPeter Avalos
449411677aeSAaron LI ptr.hello_link = (const struct olsr_hello_link *)msg_data;
45041c99275SPeter Avalos
451*ed775ee7SAntonio Huete Jimenez hello_len = GET_BE_U_2(ptr.hello_link->len);
452*ed775ee7SAntonio Huete Jimenez link_type = OLSR_EXTRACT_LINK_TYPE(GET_U_1(ptr.hello_link->link_code));
453*ed775ee7SAntonio Huete Jimenez neighbor_type = OLSR_EXTRACT_NEIGHBOR_TYPE(GET_U_1(ptr.hello_link->link_code));
45441c99275SPeter Avalos
45527bfbee1SPeter Avalos if ((hello_len <= msg_tlen)
45627bfbee1SPeter Avalos && (hello_len >= sizeof(struct olsr_hello_link)))
45727bfbee1SPeter Avalos hello_len_valid = 1;
45827bfbee1SPeter Avalos
459*ed775ee7SAntonio Huete Jimenez ND_PRINT("\n\t link-type %s, neighbor-type %s, len %u%s",
46041c99275SPeter Avalos tok2str(olsr_link_type_values, "Unknown", link_type),
46141c99275SPeter Avalos tok2str(olsr_neighbor_type_values, "Unknown", neighbor_type),
46227bfbee1SPeter Avalos hello_len,
463*ed775ee7SAntonio Huete Jimenez (hello_len_valid == 0) ? " (invalid)" : "");
46427bfbee1SPeter Avalos
46527bfbee1SPeter Avalos if (hello_len_valid == 0)
46627bfbee1SPeter Avalos break;
46741c99275SPeter Avalos
46841c99275SPeter Avalos msg_data += sizeof(struct olsr_hello_link);
46941c99275SPeter Avalos msg_tlen -= sizeof(struct olsr_hello_link);
47041c99275SPeter Avalos hello_len -= sizeof(struct olsr_hello_link);
47141c99275SPeter Avalos
472*ed775ee7SAntonio Huete Jimenez ND_TCHECK_LEN(msg_data, hello_len);
47341c99275SPeter Avalos if (msg_type == OLSR_HELLO_MSG) {
474411677aeSAaron LI if (olsr_print_neighbor(ndo, msg_data, hello_len) == -1)
475411677aeSAaron LI goto trunc;
47641c99275SPeter Avalos } else {
477411677aeSAaron LI if (is_ipv6) {
478411677aeSAaron LI if (olsr_print_lq_neighbor6(ndo, msg_data, hello_len) == -1)
479411677aeSAaron LI goto trunc;
480411677aeSAaron LI } else {
481411677aeSAaron LI if (olsr_print_lq_neighbor4(ndo, msg_data, hello_len) == -1)
482411677aeSAaron LI goto trunc;
483411677aeSAaron LI }
48441c99275SPeter Avalos }
48541c99275SPeter Avalos
48641c99275SPeter Avalos msg_data += hello_len;
48741c99275SPeter Avalos msg_tlen -= hello_len;
48841c99275SPeter Avalos }
48941c99275SPeter Avalos break;
49041c99275SPeter Avalos
49141c99275SPeter Avalos case OLSR_TC_MSG:
49241c99275SPeter Avalos case OLSR_TC_LQ_MSG:
493411677aeSAaron LI if (msg_tlen < sizeof(struct olsr_tc))
49441c99275SPeter Avalos goto trunc;
495*ed775ee7SAntonio Huete Jimenez ND_TCHECK_LEN(msg_data, sizeof(struct olsr_tc));
49641c99275SPeter Avalos
497411677aeSAaron LI ptr.tc = (const struct olsr_tc *)msg_data;
498*ed775ee7SAntonio Huete Jimenez ND_PRINT("\n\t advertised neighbor seq 0x%04x",
499*ed775ee7SAntonio Huete Jimenez GET_BE_U_2(ptr.tc->ans_seq));
50041c99275SPeter Avalos msg_data += sizeof(struct olsr_tc);
50141c99275SPeter Avalos msg_tlen -= sizeof(struct olsr_tc);
50241c99275SPeter Avalos
50341c99275SPeter Avalos if (msg_type == OLSR_TC_MSG) {
504411677aeSAaron LI if (olsr_print_neighbor(ndo, msg_data, msg_tlen) == -1)
505411677aeSAaron LI goto trunc;
50641c99275SPeter Avalos } else {
507411677aeSAaron LI if (is_ipv6) {
508411677aeSAaron LI if (olsr_print_lq_neighbor6(ndo, msg_data, msg_tlen) == -1)
509411677aeSAaron LI goto trunc;
510411677aeSAaron LI } else {
511411677aeSAaron LI if (olsr_print_lq_neighbor4(ndo, msg_data, msg_tlen) == -1)
512411677aeSAaron LI goto trunc;
513411677aeSAaron LI }
51441c99275SPeter Avalos }
51541c99275SPeter Avalos break;
51641c99275SPeter Avalos
51741c99275SPeter Avalos case OLSR_MID_MSG:
51827bfbee1SPeter Avalos {
519*ed775ee7SAntonio Huete Jimenez u_int addr_size = (u_int)sizeof(nd_ipv4);
52027bfbee1SPeter Avalos
52127bfbee1SPeter Avalos if (is_ipv6)
522*ed775ee7SAntonio Huete Jimenez addr_size = (u_int)sizeof(nd_ipv6);
52327bfbee1SPeter Avalos
52427bfbee1SPeter Avalos while (msg_tlen >= addr_size) {
525*ed775ee7SAntonio Huete Jimenez ND_TCHECK_LEN(msg_data, addr_size);
526*ed775ee7SAntonio Huete Jimenez ND_PRINT("\n\t interface address %s",
527*ed775ee7SAntonio Huete Jimenez is_ipv6 ? GET_IP6ADDR_STRING(msg_data) :
528*ed775ee7SAntonio Huete Jimenez GET_IPADDR_STRING(msg_data));
52941c99275SPeter Avalos
53027bfbee1SPeter Avalos msg_data += addr_size;
53127bfbee1SPeter Avalos msg_tlen -= addr_size;
53241c99275SPeter Avalos }
53341c99275SPeter Avalos break;
53427bfbee1SPeter Avalos }
53541c99275SPeter Avalos
53641c99275SPeter Avalos case OLSR_HNA_MSG:
53727bfbee1SPeter Avalos if (is_ipv6)
53827bfbee1SPeter Avalos {
53927bfbee1SPeter Avalos int i = 0;
540411677aeSAaron LI
541*ed775ee7SAntonio Huete Jimenez ND_PRINT("\n\t Advertised networks (total %u)",
542*ed775ee7SAntonio Huete Jimenez (unsigned int) (msg_tlen / sizeof(struct olsr_hna6)));
543411677aeSAaron LI
54427bfbee1SPeter Avalos while (msg_tlen >= sizeof(struct olsr_hna6)) {
545411677aeSAaron LI const struct olsr_hna6 *hna6;
54627bfbee1SPeter Avalos
547*ed775ee7SAntonio Huete Jimenez ND_TCHECK_LEN(msg_data, sizeof(struct olsr_hna6));
54841c99275SPeter Avalos
549411677aeSAaron LI hna6 = (const struct olsr_hna6 *)msg_data;
55027bfbee1SPeter Avalos
551*ed775ee7SAntonio Huete Jimenez ND_PRINT("\n\t #%i: %s/%u",
552*ed775ee7SAntonio Huete Jimenez i, GET_IP6ADDR_STRING(hna6->network),
553*ed775ee7SAntonio Huete Jimenez mask62plen (hna6->mask));
55427bfbee1SPeter Avalos
55527bfbee1SPeter Avalos msg_data += sizeof(struct olsr_hna6);
55627bfbee1SPeter Avalos msg_tlen -= sizeof(struct olsr_hna6);
55727bfbee1SPeter Avalos }
55827bfbee1SPeter Avalos }
55927bfbee1SPeter Avalos else
56027bfbee1SPeter Avalos {
56127bfbee1SPeter Avalos int col = 0;
56227bfbee1SPeter Avalos
563*ed775ee7SAntonio Huete Jimenez ND_PRINT("\n\t Advertised networks (total %u)",
564*ed775ee7SAntonio Huete Jimenez (unsigned int) (msg_tlen / sizeof(struct olsr_hna4)));
565411677aeSAaron LI
566411677aeSAaron LI while (msg_tlen >= sizeof(struct olsr_hna4)) {
567*ed775ee7SAntonio Huete Jimenez ND_TCHECK_LEN(msg_data, sizeof(struct olsr_hna4));
568411677aeSAaron LI
569411677aeSAaron LI ptr.hna = (const struct olsr_hna4 *)msg_data;
57041c99275SPeter Avalos
57141c99275SPeter Avalos /* print 4 prefixes per line */
572411677aeSAaron LI if (!ptr.hna->network[0] && !ptr.hna->network[1] &&
573411677aeSAaron LI !ptr.hna->network[2] && !ptr.hna->network[3] &&
574411677aeSAaron LI !ptr.hna->mask[GW_HNA_PAD] &&
575411677aeSAaron LI ptr.hna->mask[GW_HNA_FLAGS]) {
576411677aeSAaron LI /* smart gateway */
577*ed775ee7SAntonio Huete Jimenez ND_PRINT("%sSmart-Gateway:%s%s%s%s%s %u/%u",
578411677aeSAaron LI col == 0 ? "\n\t " : ", ", /* indent */
579411677aeSAaron LI /* sgw */
580411677aeSAaron LI /* LINKSPEED */
581411677aeSAaron LI (ptr.hna->mask[GW_HNA_FLAGS] &
582411677aeSAaron LI GW_HNA_FLAG_LINKSPEED) ? " LINKSPEED" : "",
583411677aeSAaron LI /* IPV4 */
584411677aeSAaron LI (ptr.hna->mask[GW_HNA_FLAGS] &
585411677aeSAaron LI GW_HNA_FLAG_IPV4) ? " IPV4" : "",
586411677aeSAaron LI /* IPV4-NAT */
587411677aeSAaron LI (ptr.hna->mask[GW_HNA_FLAGS] &
588411677aeSAaron LI GW_HNA_FLAG_IPV4_NAT) ? " IPV4-NAT" : "",
589411677aeSAaron LI /* IPV6 */
590411677aeSAaron LI (ptr.hna->mask[GW_HNA_FLAGS] &
591411677aeSAaron LI GW_HNA_FLAG_IPV6) ? " IPV6" : "",
592411677aeSAaron LI /* IPv6PREFIX */
593411677aeSAaron LI (ptr.hna->mask[GW_HNA_FLAGS] &
594411677aeSAaron LI GW_HNA_FLAG_IPV6PREFIX) ? " IPv6-PREFIX" : "",
595411677aeSAaron LI /* uplink */
596411677aeSAaron LI (ptr.hna->mask[GW_HNA_FLAGS] &
597411677aeSAaron LI GW_HNA_FLAG_LINKSPEED) ?
598411677aeSAaron LI deserialize_gw_speed(ptr.hna->mask[GW_HNA_UPLINK]) : 0,
599411677aeSAaron LI /* downlink */
600411677aeSAaron LI (ptr.hna->mask[GW_HNA_FLAGS] &
601411677aeSAaron LI GW_HNA_FLAG_LINKSPEED) ?
602411677aeSAaron LI deserialize_gw_speed(ptr.hna->mask[GW_HNA_DOWNLINK]) : 0
603*ed775ee7SAntonio Huete Jimenez );
604411677aeSAaron LI } else {
605411677aeSAaron LI /* normal route */
606*ed775ee7SAntonio Huete Jimenez ND_PRINT("%s%s/%u",
607411677aeSAaron LI col == 0 ? "\n\t " : ", ",
608*ed775ee7SAntonio Huete Jimenez GET_IPADDR_STRING(ptr.hna->network),
609*ed775ee7SAntonio Huete Jimenez mask2plen(GET_BE_U_4(ptr.hna->mask)));
610411677aeSAaron LI }
61141c99275SPeter Avalos
61227bfbee1SPeter Avalos msg_data += sizeof(struct olsr_hna4);
61327bfbee1SPeter Avalos msg_tlen -= sizeof(struct olsr_hna4);
61427bfbee1SPeter Avalos
61527bfbee1SPeter Avalos col = (col + 1) % 4;
61627bfbee1SPeter Avalos }
61741c99275SPeter Avalos }
61841c99275SPeter Avalos break;
61941c99275SPeter Avalos
62027bfbee1SPeter Avalos case OLSR_NAMESERVICE_MSG:
62127bfbee1SPeter Avalos {
622411677aeSAaron LI u_int name_entries;
623411677aeSAaron LI u_int addr_size;
624411677aeSAaron LI int name_entries_valid;
62527bfbee1SPeter Avalos u_int i;
62627bfbee1SPeter Avalos
627411677aeSAaron LI if (msg_tlen < 4)
628411677aeSAaron LI goto trunc;
629411677aeSAaron LI
630*ed775ee7SAntonio Huete Jimenez name_entries = GET_BE_U_2(msg_data + 2);
631411677aeSAaron LI addr_size = 4;
63227bfbee1SPeter Avalos if (is_ipv6)
63327bfbee1SPeter Avalos addr_size = 16;
63427bfbee1SPeter Avalos
635411677aeSAaron LI name_entries_valid = 0;
63627bfbee1SPeter Avalos if ((name_entries > 0)
63727bfbee1SPeter Avalos && ((name_entries * (4 + addr_size)) <= msg_tlen))
63827bfbee1SPeter Avalos name_entries_valid = 1;
63927bfbee1SPeter Avalos
640*ed775ee7SAntonio Huete Jimenez ND_PRINT("\n\t Version %u, Entries %u%s",
641*ed775ee7SAntonio Huete Jimenez GET_BE_U_2(msg_data),
642*ed775ee7SAntonio Huete Jimenez name_entries, (name_entries_valid == 0) ? " (invalid)" : "");
64327bfbee1SPeter Avalos
64427bfbee1SPeter Avalos if (name_entries_valid == 0)
64527bfbee1SPeter Avalos break;
64627bfbee1SPeter Avalos
64727bfbee1SPeter Avalos msg_data += 4;
64827bfbee1SPeter Avalos msg_tlen -= 4;
64927bfbee1SPeter Avalos
65027bfbee1SPeter Avalos for (i = 0; i < name_entries; i++) {
65127bfbee1SPeter Avalos int name_entry_len_valid = 0;
65227bfbee1SPeter Avalos
65327bfbee1SPeter Avalos if (msg_tlen < 4)
65427bfbee1SPeter Avalos break;
65527bfbee1SPeter Avalos
656*ed775ee7SAntonio Huete Jimenez name_entry_type = GET_BE_U_2(msg_data);
657*ed775ee7SAntonio Huete Jimenez name_entry_len = GET_BE_U_2(msg_data + 2);
65827bfbee1SPeter Avalos
65927bfbee1SPeter Avalos msg_data += 4;
66027bfbee1SPeter Avalos msg_tlen -= 4;
66127bfbee1SPeter Avalos
66227bfbee1SPeter Avalos if ((name_entry_len > 0) && ((addr_size + name_entry_len) <= msg_tlen))
66327bfbee1SPeter Avalos name_entry_len_valid = 1;
66427bfbee1SPeter Avalos
665*ed775ee7SAntonio Huete Jimenez ND_PRINT("\n\t #%u: type %#06x, length %u%s",
66627bfbee1SPeter Avalos (unsigned int) i, name_entry_type,
667*ed775ee7SAntonio Huete Jimenez name_entry_len, (name_entry_len_valid == 0) ? " (invalid)" : "");
66827bfbee1SPeter Avalos
66927bfbee1SPeter Avalos if (name_entry_len_valid == 0)
67027bfbee1SPeter Avalos break;
67127bfbee1SPeter Avalos
67227bfbee1SPeter Avalos /* 32-bit alignment */
67327bfbee1SPeter Avalos name_entry_padding = 0;
67427bfbee1SPeter Avalos if (name_entry_len%4 != 0)
67527bfbee1SPeter Avalos name_entry_padding = 4-(name_entry_len%4);
67627bfbee1SPeter Avalos
67727bfbee1SPeter Avalos if (msg_tlen < addr_size + name_entry_len + name_entry_padding)
67827bfbee1SPeter Avalos goto trunc;
67927bfbee1SPeter Avalos
680*ed775ee7SAntonio Huete Jimenez ND_TCHECK_LEN(msg_data,
681*ed775ee7SAntonio Huete Jimenez addr_size + name_entry_len + name_entry_padding);
68227bfbee1SPeter Avalos
68327bfbee1SPeter Avalos if (is_ipv6)
684*ed775ee7SAntonio Huete Jimenez ND_PRINT(", address %s, name \"",
685*ed775ee7SAntonio Huete Jimenez GET_IP6ADDR_STRING(msg_data));
68627bfbee1SPeter Avalos else
687*ed775ee7SAntonio Huete Jimenez ND_PRINT(", address %s, name \"",
688*ed775ee7SAntonio Huete Jimenez GET_IPADDR_STRING(msg_data));
689*ed775ee7SAntonio Huete Jimenez (void)nd_printn(ndo, msg_data + addr_size, name_entry_len, NULL);
690*ed775ee7SAntonio Huete Jimenez ND_PRINT("\"");
69127bfbee1SPeter Avalos
69227bfbee1SPeter Avalos msg_data += addr_size + name_entry_len + name_entry_padding;
69327bfbee1SPeter Avalos msg_tlen -= addr_size + name_entry_len + name_entry_padding;
69427bfbee1SPeter Avalos } /* for (i = 0; i < name_entries; i++) */
69527bfbee1SPeter Avalos break;
69627bfbee1SPeter Avalos } /* case OLSR_NAMESERVICE_MSG */
69727bfbee1SPeter Avalos
69841c99275SPeter Avalos /*
69941c99275SPeter Avalos * FIXME those are the defined messages that lack a decoder
70041c99275SPeter Avalos * you are welcome to contribute code ;-)
70141c99275SPeter Avalos */
70241c99275SPeter Avalos case OLSR_POWERINFO_MSG:
70341c99275SPeter Avalos default:
704411677aeSAaron LI print_unknown_data(ndo, msg_data, "\n\t ", msg_tlen);
70541c99275SPeter Avalos break;
70627bfbee1SPeter Avalos } /* switch (msg_type) */
70741c99275SPeter Avalos tptr += msg_len;
70827bfbee1SPeter Avalos } /* while (tptr < (pptr+length)) */
70941c99275SPeter Avalos
71041c99275SPeter Avalos return;
71141c99275SPeter Avalos
71241c99275SPeter Avalos trunc:
713*ed775ee7SAntonio Huete Jimenez nd_print_trunc(ndo);
71441c99275SPeter Avalos }
715