1b5bfcb5dSMax Laier /* 2b5bfcb5dSMax Laier * Copyright (c) 1998-2007 The TCPDUMP project 327df3f5dSRui Paulo * Copyright (c) 2009 Florian Forster 4b5bfcb5dSMax Laier * 5b5bfcb5dSMax Laier * Redistribution and use in source and binary forms, with or without 6b5bfcb5dSMax Laier * modification, are permitted provided that: (1) source code 7b5bfcb5dSMax Laier * distributions retain the above copyright notice and this paragraph 8b5bfcb5dSMax Laier * in its entirety, and (2) distributions including binary code include 9b5bfcb5dSMax Laier * the above copyright notice and this paragraph in its entirety in 10b5bfcb5dSMax Laier * the documentation or other materials provided with the distribution. 11b5bfcb5dSMax Laier * THIS SOFTWARE IS PROVIDED ``AS IS'' AND 12b5bfcb5dSMax Laier * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT 13b5bfcb5dSMax Laier * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 14b5bfcb5dSMax Laier * FOR A PARTICULAR PURPOSE. 15b5bfcb5dSMax Laier * 160bff6a5aSEd Maste * Original code by Hannes Gredler <hannes@gredler.at> 1727df3f5dSRui Paulo * IPv6 additions by Florian Forster <octo at verplant.org> 18b5bfcb5dSMax Laier */ 19b5bfcb5dSMax Laier 203340d773SGleb Smirnoff /* \summary: Optimized Link State Routing Protocol (OLSR) printer */ 213340d773SGleb Smirnoff 223340d773SGleb Smirnoff /* specification: RFC 3626 */ 233340d773SGleb Smirnoff 24b5bfcb5dSMax Laier #ifdef HAVE_CONFIG_H 25*ee67461eSJoseph Mingrone #include <config.h> 26b5bfcb5dSMax Laier #endif 27b5bfcb5dSMax Laier 28*ee67461eSJoseph Mingrone #include "netdissect-stdinc.h" 29b5bfcb5dSMax Laier 303340d773SGleb Smirnoff #include "netdissect.h" 31b5bfcb5dSMax Laier #include "addrtoname.h" 32b5bfcb5dSMax Laier #include "extract.h" 33b5bfcb5dSMax Laier 34b5bfcb5dSMax Laier /* 35b5bfcb5dSMax Laier * RFC 3626 common header 36b5bfcb5dSMax Laier * 37b5bfcb5dSMax Laier * 0 1 2 3 38b5bfcb5dSMax Laier * 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 39b5bfcb5dSMax Laier * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 40b5bfcb5dSMax Laier * | Packet Length | Packet Sequence Number | 41b5bfcb5dSMax Laier * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 42b5bfcb5dSMax Laier * | Message Type | Vtime | Message Size | 43b5bfcb5dSMax Laier * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 44b5bfcb5dSMax Laier * | Originator Address | 45b5bfcb5dSMax Laier * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 46b5bfcb5dSMax Laier * | Time To Live | Hop Count | Message Sequence Number | 47b5bfcb5dSMax Laier * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 48b5bfcb5dSMax Laier * | | 49b5bfcb5dSMax Laier * : MESSAGE : 50b5bfcb5dSMax Laier * | | 51b5bfcb5dSMax Laier * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 52b5bfcb5dSMax Laier * | Message Type | Vtime | Message Size | 53b5bfcb5dSMax Laier * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 54b5bfcb5dSMax Laier * | Originator Address | 55b5bfcb5dSMax Laier * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 56b5bfcb5dSMax Laier * | Time To Live | Hop Count | Message Sequence Number | 57b5bfcb5dSMax Laier * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 58b5bfcb5dSMax Laier * | | 59b5bfcb5dSMax Laier * : MESSAGE : 60b5bfcb5dSMax Laier * | | 61b5bfcb5dSMax Laier * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 62b5bfcb5dSMax Laier * : : 63b5bfcb5dSMax Laier */ 64b5bfcb5dSMax Laier 65b5bfcb5dSMax Laier struct olsr_common { 66*ee67461eSJoseph Mingrone nd_uint16_t packet_len; 67*ee67461eSJoseph Mingrone nd_uint16_t packet_seq; 68b5bfcb5dSMax Laier }; 69b5bfcb5dSMax Laier 70b5bfcb5dSMax Laier #define OLSR_HELLO_MSG 1 /* rfc3626 */ 71b5bfcb5dSMax Laier #define OLSR_TC_MSG 2 /* rfc3626 */ 72b5bfcb5dSMax Laier #define OLSR_MID_MSG 3 /* rfc3626 */ 73b5bfcb5dSMax Laier #define OLSR_HNA_MSG 4 /* rfc3626 */ 74b5bfcb5dSMax Laier #define OLSR_POWERINFO_MSG 128 75b5bfcb5dSMax Laier #define OLSR_NAMESERVICE_MSG 130 76b5bfcb5dSMax Laier #define OLSR_HELLO_LQ_MSG 201 /* LQ extensions olsr.org */ 77b5bfcb5dSMax Laier #define OLSR_TC_LQ_MSG 202 /* LQ extensions olsr.org */ 78b5bfcb5dSMax Laier 793c602fabSXin LI static const struct tok olsr_msg_values[] = { 80b5bfcb5dSMax Laier { OLSR_HELLO_MSG, "Hello" }, 81b5bfcb5dSMax Laier { OLSR_TC_MSG, "TC" }, 82b5bfcb5dSMax Laier { OLSR_MID_MSG, "MID" }, 83b5bfcb5dSMax Laier { OLSR_HNA_MSG, "HNA" }, 84b5bfcb5dSMax Laier { OLSR_POWERINFO_MSG, "Powerinfo" }, 85b5bfcb5dSMax Laier { OLSR_NAMESERVICE_MSG, "Nameservice" }, 86b5bfcb5dSMax Laier { OLSR_HELLO_LQ_MSG, "Hello-LQ" }, 87b5bfcb5dSMax Laier { OLSR_TC_LQ_MSG, "TC-LQ" }, 88b5bfcb5dSMax Laier { 0, NULL} 89b5bfcb5dSMax Laier }; 90b5bfcb5dSMax Laier 9127df3f5dSRui Paulo struct olsr_msg4 { 92*ee67461eSJoseph Mingrone nd_uint8_t msg_type; 93*ee67461eSJoseph Mingrone nd_uint8_t vtime; 94*ee67461eSJoseph Mingrone nd_uint16_t msg_len; 95*ee67461eSJoseph Mingrone nd_ipv4 originator; 96*ee67461eSJoseph Mingrone nd_uint8_t ttl; 97*ee67461eSJoseph Mingrone nd_uint8_t hopcount; 98*ee67461eSJoseph Mingrone nd_uint16_t msg_seq; 99b5bfcb5dSMax Laier }; 100b5bfcb5dSMax Laier 10127df3f5dSRui Paulo struct olsr_msg6 { 102*ee67461eSJoseph Mingrone nd_uint8_t msg_type; 103*ee67461eSJoseph Mingrone nd_uint8_t vtime; 104*ee67461eSJoseph Mingrone nd_uint16_t msg_len; 105*ee67461eSJoseph Mingrone nd_ipv6 originator; 106*ee67461eSJoseph Mingrone nd_uint8_t ttl; 107*ee67461eSJoseph Mingrone nd_uint8_t hopcount; 108*ee67461eSJoseph Mingrone nd_uint16_t msg_seq; 10927df3f5dSRui Paulo }; 11027df3f5dSRui Paulo 111b5bfcb5dSMax Laier struct olsr_hello { 112*ee67461eSJoseph Mingrone nd_byte res[2]; 113*ee67461eSJoseph Mingrone nd_uint8_t htime; 114*ee67461eSJoseph Mingrone nd_uint8_t will; 115b5bfcb5dSMax Laier }; 116b5bfcb5dSMax Laier 117b5bfcb5dSMax Laier struct olsr_hello_link { 118*ee67461eSJoseph Mingrone nd_uint8_t link_code; 119*ee67461eSJoseph Mingrone nd_byte res; 120*ee67461eSJoseph Mingrone nd_uint16_t len; 121b5bfcb5dSMax Laier }; 122b5bfcb5dSMax Laier 123b5bfcb5dSMax Laier struct olsr_tc { 124*ee67461eSJoseph Mingrone nd_uint16_t ans_seq; 125*ee67461eSJoseph Mingrone nd_byte res[2]; 126b5bfcb5dSMax Laier }; 127b5bfcb5dSMax Laier 12827df3f5dSRui Paulo struct olsr_hna4 { 129*ee67461eSJoseph Mingrone nd_ipv4 network; 130*ee67461eSJoseph Mingrone nd_ipv4 mask; 131b5bfcb5dSMax Laier }; 132b5bfcb5dSMax Laier 13327df3f5dSRui Paulo struct olsr_hna6 { 134*ee67461eSJoseph Mingrone nd_ipv6 network; 135*ee67461eSJoseph Mingrone nd_ipv6 mask; 13627df3f5dSRui Paulo }; 13727df3f5dSRui Paulo 138b5bfcb5dSMax Laier 1393340d773SGleb Smirnoff /** gateway HNA flags */ 1403340d773SGleb Smirnoff enum gateway_hna_flags { 1413340d773SGleb Smirnoff GW_HNA_FLAG_LINKSPEED = 1 << 0, 1423340d773SGleb Smirnoff GW_HNA_FLAG_IPV4 = 1 << 1, 1433340d773SGleb Smirnoff GW_HNA_FLAG_IPV4_NAT = 1 << 2, 1443340d773SGleb Smirnoff GW_HNA_FLAG_IPV6 = 1 << 3, 1453340d773SGleb Smirnoff GW_HNA_FLAG_IPV6PREFIX = 1 << 4 1463340d773SGleb Smirnoff }; 1473340d773SGleb Smirnoff 1483340d773SGleb Smirnoff /** gateway HNA field byte offsets in the netmask field of the HNA */ 1493340d773SGleb Smirnoff enum gateway_hna_fields { 1503340d773SGleb Smirnoff GW_HNA_PAD = 0, 1513340d773SGleb Smirnoff GW_HNA_FLAGS = 1, 1523340d773SGleb Smirnoff GW_HNA_UPLINK = 2, 1533340d773SGleb Smirnoff GW_HNA_DOWNLINK = 3, 1543340d773SGleb Smirnoff GW_HNA_V6PREFIXLEN = 4, 1553340d773SGleb Smirnoff GW_HNA_V6PREFIX = 5 1563340d773SGleb Smirnoff }; 1573340d773SGleb Smirnoff 1583340d773SGleb Smirnoff 159b5bfcb5dSMax Laier #define OLSR_EXTRACT_LINK_TYPE(link_code) (link_code & 0x3) 160b5bfcb5dSMax Laier #define OLSR_EXTRACT_NEIGHBOR_TYPE(link_code) (link_code >> 2) 161b5bfcb5dSMax Laier 1623c602fabSXin LI static const struct tok olsr_link_type_values[] = { 163b5bfcb5dSMax Laier { 0, "Unspecified" }, 164b5bfcb5dSMax Laier { 1, "Asymmetric" }, 165b5bfcb5dSMax Laier { 2, "Symmetric" }, 166b5bfcb5dSMax Laier { 3, "Lost" }, 167b5bfcb5dSMax Laier { 0, NULL} 168b5bfcb5dSMax Laier }; 169b5bfcb5dSMax Laier 1703c602fabSXin LI static const struct tok olsr_neighbor_type_values[] = { 171b5bfcb5dSMax Laier { 0, "Not-Neighbor" }, 172b5bfcb5dSMax Laier { 1, "Symmetric" }, 173b5bfcb5dSMax Laier { 2, "Symmetric-MPR" }, 174b5bfcb5dSMax Laier { 0, NULL} 175b5bfcb5dSMax Laier }; 176b5bfcb5dSMax Laier 17727df3f5dSRui Paulo struct olsr_lq_neighbor4 { 178*ee67461eSJoseph Mingrone nd_ipv4 neighbor; 179*ee67461eSJoseph Mingrone nd_uint8_t link_quality; 180*ee67461eSJoseph Mingrone nd_uint8_t neighbor_link_quality; 181*ee67461eSJoseph Mingrone nd_byte res[2]; 182b5bfcb5dSMax Laier }; 183b5bfcb5dSMax Laier 18427df3f5dSRui Paulo struct olsr_lq_neighbor6 { 185*ee67461eSJoseph Mingrone nd_ipv6 neighbor; 186*ee67461eSJoseph Mingrone nd_uint8_t link_quality; 187*ee67461eSJoseph Mingrone nd_uint8_t neighbor_link_quality; 188*ee67461eSJoseph Mingrone nd_byte res[2]; 18927df3f5dSRui Paulo }; 19027df3f5dSRui Paulo 1913340d773SGleb Smirnoff #define MAX_SMARTGW_SPEED 320000000 1923340d773SGleb Smirnoff 1933340d773SGleb Smirnoff /** 1943340d773SGleb Smirnoff * Convert an encoded 1 byte transport value (5 bits mantissa, 3 bits exponent) 1953340d773SGleb Smirnoff * to an uplink/downlink speed value 1963340d773SGleb Smirnoff * 1973340d773SGleb Smirnoff * @param value the encoded 1 byte transport value 1983340d773SGleb Smirnoff * @return the uplink/downlink speed value (in kbit/s) 1993340d773SGleb Smirnoff */ 2003340d773SGleb Smirnoff static uint32_t deserialize_gw_speed(uint8_t value) { 2013340d773SGleb Smirnoff uint32_t speed; 2023340d773SGleb Smirnoff uint32_t exp; 2033340d773SGleb Smirnoff 2043340d773SGleb Smirnoff if (!value) { 2053340d773SGleb Smirnoff return 0; 2063340d773SGleb Smirnoff } 2073340d773SGleb Smirnoff 2083340d773SGleb Smirnoff if (value == UINT8_MAX) { 2093340d773SGleb Smirnoff /* maximum value: also return maximum value */ 2103340d773SGleb Smirnoff return MAX_SMARTGW_SPEED; 2113340d773SGleb Smirnoff } 2123340d773SGleb Smirnoff 2133340d773SGleb Smirnoff speed = (value >> 3) + 1; 2143340d773SGleb Smirnoff exp = value & 7; 2153340d773SGleb Smirnoff 216*ee67461eSJoseph Mingrone while (exp != 0) { 2173340d773SGleb Smirnoff speed *= 10; 218*ee67461eSJoseph Mingrone exp--; 2193340d773SGleb Smirnoff } 2203340d773SGleb Smirnoff return speed; 2213340d773SGleb Smirnoff } 2223340d773SGleb Smirnoff 223b5bfcb5dSMax Laier /* 224b5bfcb5dSMax Laier * macro to convert the 8-bit mantissa/exponent to a double float 225b5bfcb5dSMax Laier * taken from olsr.org. 226b5bfcb5dSMax Laier */ 227b5bfcb5dSMax Laier #define VTIME_SCALE_FACTOR 0.0625 228b5bfcb5dSMax Laier #define ME_TO_DOUBLE(me) \ 229b5bfcb5dSMax Laier (double)(VTIME_SCALE_FACTOR*(1+(double)(me>>4)/16)*(double)(1<<(me&0x0F))) 230b5bfcb5dSMax Laier 231b5bfcb5dSMax Laier /* 232b5bfcb5dSMax Laier * print a neighbor list with LQ extensions. 233b5bfcb5dSMax Laier */ 2348bdc5a62SPatrick Kelsey static int 2353c602fabSXin LI olsr_print_lq_neighbor4(netdissect_options *ndo, 2363c602fabSXin LI const u_char *msg_data, u_int hello_len) 237b5bfcb5dSMax Laier { 2383340d773SGleb Smirnoff const struct olsr_lq_neighbor4 *lq_neighbor; 239b5bfcb5dSMax Laier 24027df3f5dSRui Paulo while (hello_len >= sizeof(struct olsr_lq_neighbor4)) { 241b5bfcb5dSMax Laier 2423340d773SGleb Smirnoff lq_neighbor = (const struct olsr_lq_neighbor4 *)msg_data; 243*ee67461eSJoseph Mingrone ND_TCHECK_SIZE(lq_neighbor); 244b5bfcb5dSMax Laier 245*ee67461eSJoseph Mingrone ND_PRINT("\n\t neighbor %s, link-quality %.2f%%" 2463340d773SGleb Smirnoff ", neighbor-link-quality %.2f%%", 247*ee67461eSJoseph Mingrone GET_IPADDR_STRING(lq_neighbor->neighbor), 248*ee67461eSJoseph Mingrone ((double) GET_U_1(lq_neighbor->link_quality)/2.55), 249*ee67461eSJoseph Mingrone ((double) GET_U_1(lq_neighbor->neighbor_link_quality)/2.55)); 250b5bfcb5dSMax Laier 25127df3f5dSRui Paulo msg_data += sizeof(struct olsr_lq_neighbor4); 25227df3f5dSRui Paulo hello_len -= sizeof(struct olsr_lq_neighbor4); 253b5bfcb5dSMax Laier } 2548bdc5a62SPatrick Kelsey return (0); 255*ee67461eSJoseph Mingrone trunc: 256*ee67461eSJoseph Mingrone return -1; 257b5bfcb5dSMax Laier } 258b5bfcb5dSMax Laier 2598bdc5a62SPatrick Kelsey static int 2603c602fabSXin LI olsr_print_lq_neighbor6(netdissect_options *ndo, 2613c602fabSXin LI const u_char *msg_data, u_int hello_len) 26227df3f5dSRui Paulo { 2633340d773SGleb Smirnoff const struct olsr_lq_neighbor6 *lq_neighbor; 26427df3f5dSRui Paulo 26527df3f5dSRui Paulo while (hello_len >= sizeof(struct olsr_lq_neighbor6)) { 26627df3f5dSRui Paulo 2673340d773SGleb Smirnoff lq_neighbor = (const struct olsr_lq_neighbor6 *)msg_data; 268*ee67461eSJoseph Mingrone ND_TCHECK_SIZE(lq_neighbor); 26927df3f5dSRui Paulo 270*ee67461eSJoseph Mingrone ND_PRINT("\n\t neighbor %s, link-quality %.2f%%" 2713340d773SGleb Smirnoff ", neighbor-link-quality %.2f%%", 272*ee67461eSJoseph Mingrone GET_IP6ADDR_STRING(lq_neighbor->neighbor), 273*ee67461eSJoseph Mingrone ((double) GET_U_1(lq_neighbor->link_quality)/2.55), 274*ee67461eSJoseph Mingrone ((double) GET_U_1(lq_neighbor->neighbor_link_quality)/2.55)); 27527df3f5dSRui Paulo 27627df3f5dSRui Paulo msg_data += sizeof(struct olsr_lq_neighbor6); 27727df3f5dSRui Paulo hello_len -= sizeof(struct olsr_lq_neighbor6); 27827df3f5dSRui Paulo } 2798bdc5a62SPatrick Kelsey return (0); 280*ee67461eSJoseph Mingrone trunc: 281*ee67461eSJoseph Mingrone return -1; 28227df3f5dSRui Paulo } 28327df3f5dSRui Paulo 284b5bfcb5dSMax Laier /* 285b5bfcb5dSMax Laier * print a neighbor list. 286b5bfcb5dSMax Laier */ 2878bdc5a62SPatrick Kelsey static int 2883c602fabSXin LI olsr_print_neighbor(netdissect_options *ndo, 2893c602fabSXin LI const u_char *msg_data, u_int hello_len) 290b5bfcb5dSMax Laier { 291b5bfcb5dSMax Laier int neighbor; 292b5bfcb5dSMax Laier 293*ee67461eSJoseph Mingrone ND_PRINT("\n\t neighbor\n\t\t"); 294b5bfcb5dSMax Laier neighbor = 1; 295b5bfcb5dSMax Laier 296*ee67461eSJoseph Mingrone while (hello_len >= sizeof(nd_ipv4)) { 297b5bfcb5dSMax Laier /* print 4 neighbors per line */ 298*ee67461eSJoseph Mingrone ND_PRINT("%s%s", GET_IPADDR_STRING(msg_data), 299*ee67461eSJoseph Mingrone neighbor % 4 == 0 ? "\n\t\t" : " "); 300b5bfcb5dSMax Laier 301*ee67461eSJoseph Mingrone msg_data += sizeof(nd_ipv4); 302*ee67461eSJoseph Mingrone hello_len -= sizeof(nd_ipv4); 303b5bfcb5dSMax Laier } 3048bdc5a62SPatrick Kelsey return (0); 305b5bfcb5dSMax Laier } 306b5bfcb5dSMax Laier 307b5bfcb5dSMax Laier 308b5bfcb5dSMax Laier void 3093c602fabSXin LI olsr_print(netdissect_options *ndo, 3103c602fabSXin LI const u_char *pptr, u_int length, int is_ipv6) 311b5bfcb5dSMax Laier { 312b5bfcb5dSMax Laier union { 313b5bfcb5dSMax Laier const struct olsr_common *common; 31427df3f5dSRui Paulo const struct olsr_msg4 *msg4; 31527df3f5dSRui Paulo const struct olsr_msg6 *msg6; 316b5bfcb5dSMax Laier const struct olsr_hello *hello; 317b5bfcb5dSMax Laier const struct olsr_hello_link *hello_link; 318b5bfcb5dSMax Laier const struct olsr_tc *tc; 31927df3f5dSRui Paulo const struct olsr_hna4 *hna; 320b5bfcb5dSMax Laier } ptr; 321b5bfcb5dSMax Laier 32227df3f5dSRui Paulo u_int msg_type, msg_len, msg_tlen, hello_len; 3233c602fabSXin LI uint16_t name_entry_type, name_entry_len; 32427df3f5dSRui Paulo u_int name_entry_padding; 3253c602fabSXin LI uint8_t link_type, neighbor_type; 326b5bfcb5dSMax Laier const u_char *tptr, *msg_data; 327b5bfcb5dSMax Laier 328*ee67461eSJoseph Mingrone ndo->ndo_protocol = "olsr"; 329b5bfcb5dSMax Laier tptr = pptr; 330b5bfcb5dSMax Laier 331*ee67461eSJoseph Mingrone nd_print_protocol_caps(ndo); 332*ee67461eSJoseph Mingrone ND_PRINT("v%u", (is_ipv6) ? 6 : 4); 333*ee67461eSJoseph Mingrone 334b5bfcb5dSMax Laier if (length < sizeof(struct olsr_common)) { 335b5bfcb5dSMax Laier goto trunc; 336b5bfcb5dSMax Laier } 337b5bfcb5dSMax Laier 338*ee67461eSJoseph Mingrone ND_TCHECK_LEN(tptr, sizeof(struct olsr_common)); 339b5bfcb5dSMax Laier 3403340d773SGleb Smirnoff ptr.common = (const struct olsr_common *)tptr; 341*ee67461eSJoseph Mingrone length = ND_MIN(length, GET_BE_U_2(ptr.common->packet_len)); 342b5bfcb5dSMax Laier 343*ee67461eSJoseph Mingrone ND_PRINT(", seq 0x%04x, length %u", 344*ee67461eSJoseph Mingrone GET_BE_U_2(ptr.common->packet_seq), 345*ee67461eSJoseph Mingrone length); 346b5bfcb5dSMax Laier 347b5bfcb5dSMax Laier tptr += sizeof(struct olsr_common); 348b5bfcb5dSMax Laier 349b5bfcb5dSMax Laier /* 350b5bfcb5dSMax Laier * In non-verbose mode, just print version. 351b5bfcb5dSMax Laier */ 3523c602fabSXin LI if (ndo->ndo_vflag < 1) { 353b5bfcb5dSMax Laier return; 354b5bfcb5dSMax Laier } 355b5bfcb5dSMax Laier 356b5bfcb5dSMax Laier while (tptr < (pptr+length)) { 35727df3f5dSRui Paulo union 35827df3f5dSRui Paulo { 3593340d773SGleb Smirnoff const struct olsr_msg4 *v4; 3603340d773SGleb Smirnoff const struct olsr_msg6 *v6; 36127df3f5dSRui Paulo } msgptr; 36227df3f5dSRui Paulo int msg_len_valid = 0; 363b5bfcb5dSMax Laier 36427df3f5dSRui Paulo if (is_ipv6) 36527df3f5dSRui Paulo { 366*ee67461eSJoseph Mingrone ND_TCHECK_LEN(tptr, sizeof(struct olsr_msg6)); 3673340d773SGleb Smirnoff msgptr.v6 = (const struct olsr_msg6 *) tptr; 368*ee67461eSJoseph Mingrone msg_type = GET_U_1(msgptr.v6->msg_type); 369*ee67461eSJoseph Mingrone msg_len = GET_BE_U_2(msgptr.v6->msg_len); 37027df3f5dSRui Paulo if ((msg_len >= sizeof (struct olsr_msg6)) 37127df3f5dSRui Paulo && (msg_len <= length)) 37227df3f5dSRui Paulo msg_len_valid = 1; 373b5bfcb5dSMax Laier 374b5bfcb5dSMax Laier /* infinite loop check */ 375b5bfcb5dSMax Laier if (msg_type == 0 || msg_len == 0) { 376b5bfcb5dSMax Laier return; 377b5bfcb5dSMax Laier } 378b5bfcb5dSMax Laier 379*ee67461eSJoseph Mingrone ND_PRINT("\n\t%s Message (%#04x), originator %s, ttl %u, hop %u" 3803340d773SGleb Smirnoff "\n\t vtime %.3fs, msg-seq 0x%04x, length %u%s", 381b5bfcb5dSMax Laier tok2str(olsr_msg_values, "Unknown", msg_type), 382*ee67461eSJoseph Mingrone msg_type, GET_IP6ADDR_STRING(msgptr.v6->originator), 383*ee67461eSJoseph Mingrone GET_U_1(msgptr.v6->ttl), 384*ee67461eSJoseph Mingrone GET_U_1(msgptr.v6->hopcount), 385*ee67461eSJoseph Mingrone ME_TO_DOUBLE(GET_U_1(msgptr.v6->vtime)), 386*ee67461eSJoseph Mingrone GET_BE_U_2(msgptr.v6->msg_seq), 387*ee67461eSJoseph Mingrone msg_len, (msg_len_valid == 0) ? " (invalid)" : ""); 3888bdc5a62SPatrick Kelsey if (!msg_len_valid) { 3898bdc5a62SPatrick Kelsey return; 3908bdc5a62SPatrick Kelsey } 391b5bfcb5dSMax Laier 39227df3f5dSRui Paulo msg_tlen = msg_len - sizeof(struct olsr_msg6); 39327df3f5dSRui Paulo msg_data = tptr + sizeof(struct olsr_msg6); 39427df3f5dSRui Paulo } 39527df3f5dSRui Paulo else /* (!is_ipv6) */ 39627df3f5dSRui Paulo { 397*ee67461eSJoseph Mingrone ND_TCHECK_LEN(tptr, sizeof(struct olsr_msg4)); 3983340d773SGleb Smirnoff msgptr.v4 = (const struct olsr_msg4 *) tptr; 399*ee67461eSJoseph Mingrone msg_type = GET_U_1(msgptr.v4->msg_type); 400*ee67461eSJoseph Mingrone msg_len = GET_BE_U_2(msgptr.v4->msg_len); 40127df3f5dSRui Paulo if ((msg_len >= sizeof (struct olsr_msg4)) 40227df3f5dSRui Paulo && (msg_len <= length)) 40327df3f5dSRui Paulo msg_len_valid = 1; 40427df3f5dSRui Paulo 40527df3f5dSRui Paulo /* infinite loop check */ 40627df3f5dSRui Paulo if (msg_type == 0 || msg_len == 0) { 40727df3f5dSRui Paulo return; 40827df3f5dSRui Paulo } 40927df3f5dSRui Paulo 410*ee67461eSJoseph Mingrone ND_PRINT("\n\t%s Message (%#04x), originator %s, ttl %u, hop %u" 4113340d773SGleb Smirnoff "\n\t vtime %.3fs, msg-seq 0x%04x, length %u%s", 41227df3f5dSRui Paulo tok2str(olsr_msg_values, "Unknown", msg_type), 413*ee67461eSJoseph Mingrone msg_type, GET_IPADDR_STRING(msgptr.v4->originator), 414*ee67461eSJoseph Mingrone GET_U_1(msgptr.v4->ttl), 415*ee67461eSJoseph Mingrone GET_U_1(msgptr.v4->hopcount), 416*ee67461eSJoseph Mingrone ME_TO_DOUBLE(GET_U_1(msgptr.v4->vtime)), 417*ee67461eSJoseph Mingrone GET_BE_U_2(msgptr.v4->msg_seq), 418*ee67461eSJoseph Mingrone msg_len, (msg_len_valid == 0) ? " (invalid)" : ""); 4198bdc5a62SPatrick Kelsey if (!msg_len_valid) { 4208bdc5a62SPatrick Kelsey return; 4218bdc5a62SPatrick Kelsey } 42227df3f5dSRui Paulo 42327df3f5dSRui Paulo msg_tlen = msg_len - sizeof(struct olsr_msg4); 42427df3f5dSRui Paulo msg_data = tptr + sizeof(struct olsr_msg4); 42527df3f5dSRui Paulo } 426b5bfcb5dSMax Laier 427b5bfcb5dSMax Laier switch (msg_type) { 428b5bfcb5dSMax Laier case OLSR_HELLO_MSG: 429b5bfcb5dSMax Laier case OLSR_HELLO_LQ_MSG: 4308bdc5a62SPatrick Kelsey if (msg_tlen < sizeof(struct olsr_hello)) 4318bdc5a62SPatrick Kelsey goto trunc; 432*ee67461eSJoseph Mingrone ND_TCHECK_LEN(msg_data, sizeof(struct olsr_hello)); 433b5bfcb5dSMax Laier 4343340d773SGleb Smirnoff ptr.hello = (const struct olsr_hello *)msg_data; 435*ee67461eSJoseph Mingrone ND_PRINT("\n\t hello-time %.3fs, MPR willingness %u", 436*ee67461eSJoseph Mingrone ME_TO_DOUBLE(GET_U_1(ptr.hello->htime)), 437*ee67461eSJoseph Mingrone GET_U_1(ptr.hello->will)); 438b5bfcb5dSMax Laier msg_data += sizeof(struct olsr_hello); 439b5bfcb5dSMax Laier msg_tlen -= sizeof(struct olsr_hello); 440b5bfcb5dSMax Laier 441b5bfcb5dSMax Laier while (msg_tlen >= sizeof(struct olsr_hello_link)) { 44227df3f5dSRui Paulo int hello_len_valid = 0; 443b5bfcb5dSMax Laier 444b5bfcb5dSMax Laier /* 445b5bfcb5dSMax Laier * link-type. 446b5bfcb5dSMax Laier */ 447*ee67461eSJoseph Mingrone ND_TCHECK_LEN(msg_data, sizeof(struct olsr_hello_link)); 448b5bfcb5dSMax Laier 4493340d773SGleb Smirnoff ptr.hello_link = (const struct olsr_hello_link *)msg_data; 450b5bfcb5dSMax Laier 451*ee67461eSJoseph Mingrone hello_len = GET_BE_U_2(ptr.hello_link->len); 452*ee67461eSJoseph Mingrone link_type = OLSR_EXTRACT_LINK_TYPE(GET_U_1(ptr.hello_link->link_code)); 453*ee67461eSJoseph Mingrone neighbor_type = OLSR_EXTRACT_NEIGHBOR_TYPE(GET_U_1(ptr.hello_link->link_code)); 454b5bfcb5dSMax Laier 45527df3f5dSRui Paulo if ((hello_len <= msg_tlen) 45627df3f5dSRui Paulo && (hello_len >= sizeof(struct olsr_hello_link))) 45727df3f5dSRui Paulo hello_len_valid = 1; 45827df3f5dSRui Paulo 459*ee67461eSJoseph Mingrone ND_PRINT("\n\t link-type %s, neighbor-type %s, len %u%s", 460b5bfcb5dSMax Laier tok2str(olsr_link_type_values, "Unknown", link_type), 461b5bfcb5dSMax Laier tok2str(olsr_neighbor_type_values, "Unknown", neighbor_type), 46227df3f5dSRui Paulo hello_len, 463*ee67461eSJoseph Mingrone (hello_len_valid == 0) ? " (invalid)" : ""); 46427df3f5dSRui Paulo 46527df3f5dSRui Paulo if (hello_len_valid == 0) 46627df3f5dSRui Paulo break; 467b5bfcb5dSMax Laier 468b5bfcb5dSMax Laier msg_data += sizeof(struct olsr_hello_link); 469b5bfcb5dSMax Laier msg_tlen -= sizeof(struct olsr_hello_link); 470b5bfcb5dSMax Laier hello_len -= sizeof(struct olsr_hello_link); 471b5bfcb5dSMax Laier 472*ee67461eSJoseph Mingrone ND_TCHECK_LEN(msg_data, hello_len); 473b5bfcb5dSMax Laier if (msg_type == OLSR_HELLO_MSG) { 4748bdc5a62SPatrick Kelsey if (olsr_print_neighbor(ndo, msg_data, hello_len) == -1) 4758bdc5a62SPatrick Kelsey goto trunc; 476b5bfcb5dSMax Laier } else { 4778bdc5a62SPatrick Kelsey if (is_ipv6) { 4788bdc5a62SPatrick Kelsey if (olsr_print_lq_neighbor6(ndo, msg_data, hello_len) == -1) 4798bdc5a62SPatrick Kelsey goto trunc; 4803340d773SGleb Smirnoff } else { 4818bdc5a62SPatrick Kelsey if (olsr_print_lq_neighbor4(ndo, msg_data, hello_len) == -1) 4828bdc5a62SPatrick Kelsey goto trunc; 4838bdc5a62SPatrick Kelsey } 484b5bfcb5dSMax Laier } 485b5bfcb5dSMax Laier 486b5bfcb5dSMax Laier msg_data += hello_len; 487b5bfcb5dSMax Laier msg_tlen -= hello_len; 488b5bfcb5dSMax Laier } 489b5bfcb5dSMax Laier break; 490b5bfcb5dSMax Laier 491b5bfcb5dSMax Laier case OLSR_TC_MSG: 492b5bfcb5dSMax Laier case OLSR_TC_LQ_MSG: 4938bdc5a62SPatrick Kelsey if (msg_tlen < sizeof(struct olsr_tc)) 4948bdc5a62SPatrick Kelsey goto trunc; 495*ee67461eSJoseph Mingrone ND_TCHECK_LEN(msg_data, sizeof(struct olsr_tc)); 496b5bfcb5dSMax Laier 4973340d773SGleb Smirnoff ptr.tc = (const struct olsr_tc *)msg_data; 498*ee67461eSJoseph Mingrone ND_PRINT("\n\t advertised neighbor seq 0x%04x", 499*ee67461eSJoseph Mingrone GET_BE_U_2(ptr.tc->ans_seq)); 500b5bfcb5dSMax Laier msg_data += sizeof(struct olsr_tc); 501b5bfcb5dSMax Laier msg_tlen -= sizeof(struct olsr_tc); 502b5bfcb5dSMax Laier 503b5bfcb5dSMax Laier if (msg_type == OLSR_TC_MSG) { 5048bdc5a62SPatrick Kelsey if (olsr_print_neighbor(ndo, msg_data, msg_tlen) == -1) 5058bdc5a62SPatrick Kelsey goto trunc; 506b5bfcb5dSMax Laier } else { 5078bdc5a62SPatrick Kelsey if (is_ipv6) { 5088bdc5a62SPatrick Kelsey if (olsr_print_lq_neighbor6(ndo, msg_data, msg_tlen) == -1) 5098bdc5a62SPatrick Kelsey goto trunc; 5103340d773SGleb Smirnoff } else { 5118bdc5a62SPatrick Kelsey if (olsr_print_lq_neighbor4(ndo, msg_data, msg_tlen) == -1) 5128bdc5a62SPatrick Kelsey goto trunc; 5138bdc5a62SPatrick Kelsey } 514b5bfcb5dSMax Laier } 515b5bfcb5dSMax Laier break; 516b5bfcb5dSMax Laier 517b5bfcb5dSMax Laier case OLSR_MID_MSG: 51827df3f5dSRui Paulo { 519*ee67461eSJoseph Mingrone u_int addr_size = (u_int)sizeof(nd_ipv4); 52027df3f5dSRui Paulo 52127df3f5dSRui Paulo if (is_ipv6) 522*ee67461eSJoseph Mingrone addr_size = (u_int)sizeof(nd_ipv6); 52327df3f5dSRui Paulo 52427df3f5dSRui Paulo while (msg_tlen >= addr_size) { 525*ee67461eSJoseph Mingrone ND_TCHECK_LEN(msg_data, addr_size); 526*ee67461eSJoseph Mingrone ND_PRINT("\n\t interface address %s", 527*ee67461eSJoseph Mingrone is_ipv6 ? GET_IP6ADDR_STRING(msg_data) : 528*ee67461eSJoseph Mingrone GET_IPADDR_STRING(msg_data)); 5293c602fabSXin LI 53027df3f5dSRui Paulo msg_data += addr_size; 53127df3f5dSRui Paulo msg_tlen -= addr_size; 532b5bfcb5dSMax Laier } 533b5bfcb5dSMax Laier break; 53427df3f5dSRui Paulo } 535b5bfcb5dSMax Laier 536b5bfcb5dSMax Laier case OLSR_HNA_MSG: 53727df3f5dSRui Paulo if (is_ipv6) 53827df3f5dSRui Paulo { 53927df3f5dSRui Paulo int i = 0; 5403340d773SGleb Smirnoff 541*ee67461eSJoseph Mingrone ND_PRINT("\n\t Advertised networks (total %u)", 542*ee67461eSJoseph Mingrone (unsigned int) (msg_tlen / sizeof(struct olsr_hna6))); 5433340d773SGleb Smirnoff 54427df3f5dSRui Paulo while (msg_tlen >= sizeof(struct olsr_hna6)) { 5453340d773SGleb Smirnoff const struct olsr_hna6 *hna6; 54627df3f5dSRui Paulo 547*ee67461eSJoseph Mingrone ND_TCHECK_LEN(msg_data, sizeof(struct olsr_hna6)); 548b5bfcb5dSMax Laier 5493340d773SGleb Smirnoff hna6 = (const struct olsr_hna6 *)msg_data; 55027df3f5dSRui Paulo 551*ee67461eSJoseph Mingrone ND_PRINT("\n\t #%i: %s/%u", 552*ee67461eSJoseph Mingrone i, GET_IP6ADDR_STRING(hna6->network), 553*ee67461eSJoseph Mingrone mask62plen (hna6->mask)); 55427df3f5dSRui Paulo 55527df3f5dSRui Paulo msg_data += sizeof(struct olsr_hna6); 55627df3f5dSRui Paulo msg_tlen -= sizeof(struct olsr_hna6); 55727df3f5dSRui Paulo } 55827df3f5dSRui Paulo } 55927df3f5dSRui Paulo else 56027df3f5dSRui Paulo { 56127df3f5dSRui Paulo int col = 0; 5623340d773SGleb Smirnoff 563*ee67461eSJoseph Mingrone ND_PRINT("\n\t Advertised networks (total %u)", 564*ee67461eSJoseph Mingrone (unsigned int) (msg_tlen / sizeof(struct olsr_hna4))); 5653340d773SGleb Smirnoff 56627df3f5dSRui Paulo while (msg_tlen >= sizeof(struct olsr_hna4)) { 567*ee67461eSJoseph Mingrone ND_TCHECK_LEN(msg_data, sizeof(struct olsr_hna4)); 56827df3f5dSRui Paulo 5693340d773SGleb Smirnoff ptr.hna = (const struct olsr_hna4 *)msg_data; 570b5bfcb5dSMax Laier 571b5bfcb5dSMax Laier /* print 4 prefixes per line */ 5723340d773SGleb Smirnoff if (!ptr.hna->network[0] && !ptr.hna->network[1] && 5733340d773SGleb Smirnoff !ptr.hna->network[2] && !ptr.hna->network[3] && 5743340d773SGleb Smirnoff !ptr.hna->mask[GW_HNA_PAD] && 5753340d773SGleb Smirnoff ptr.hna->mask[GW_HNA_FLAGS]) { 5763340d773SGleb Smirnoff /* smart gateway */ 577*ee67461eSJoseph Mingrone ND_PRINT("%sSmart-Gateway:%s%s%s%s%s %u/%u", 5783340d773SGleb Smirnoff col == 0 ? "\n\t " : ", ", /* indent */ 5793340d773SGleb Smirnoff /* sgw */ 5803340d773SGleb Smirnoff /* LINKSPEED */ 5813340d773SGleb Smirnoff (ptr.hna->mask[GW_HNA_FLAGS] & 5823340d773SGleb Smirnoff GW_HNA_FLAG_LINKSPEED) ? " LINKSPEED" : "", 5833340d773SGleb Smirnoff /* IPV4 */ 5843340d773SGleb Smirnoff (ptr.hna->mask[GW_HNA_FLAGS] & 5853340d773SGleb Smirnoff GW_HNA_FLAG_IPV4) ? " IPV4" : "", 5863340d773SGleb Smirnoff /* IPV4-NAT */ 5873340d773SGleb Smirnoff (ptr.hna->mask[GW_HNA_FLAGS] & 5883340d773SGleb Smirnoff GW_HNA_FLAG_IPV4_NAT) ? " IPV4-NAT" : "", 5893340d773SGleb Smirnoff /* IPV6 */ 5903340d773SGleb Smirnoff (ptr.hna->mask[GW_HNA_FLAGS] & 5913340d773SGleb Smirnoff GW_HNA_FLAG_IPV6) ? " IPV6" : "", 5923340d773SGleb Smirnoff /* IPv6PREFIX */ 5933340d773SGleb Smirnoff (ptr.hna->mask[GW_HNA_FLAGS] & 5943340d773SGleb Smirnoff GW_HNA_FLAG_IPV6PREFIX) ? " IPv6-PREFIX" : "", 5953340d773SGleb Smirnoff /* uplink */ 5963340d773SGleb Smirnoff (ptr.hna->mask[GW_HNA_FLAGS] & 5973340d773SGleb Smirnoff GW_HNA_FLAG_LINKSPEED) ? 5983340d773SGleb Smirnoff deserialize_gw_speed(ptr.hna->mask[GW_HNA_UPLINK]) : 0, 5993340d773SGleb Smirnoff /* downlink */ 6003340d773SGleb Smirnoff (ptr.hna->mask[GW_HNA_FLAGS] & 6013340d773SGleb Smirnoff GW_HNA_FLAG_LINKSPEED) ? 6023340d773SGleb Smirnoff deserialize_gw_speed(ptr.hna->mask[GW_HNA_DOWNLINK]) : 0 603*ee67461eSJoseph Mingrone ); 6043340d773SGleb Smirnoff } else { 6053340d773SGleb Smirnoff /* normal route */ 606*ee67461eSJoseph Mingrone ND_PRINT("%s%s/%u", 6073c602fabSXin LI col == 0 ? "\n\t " : ", ", 608*ee67461eSJoseph Mingrone GET_IPADDR_STRING(ptr.hna->network), 609*ee67461eSJoseph Mingrone mask2plen(GET_BE_U_4(ptr.hna->mask))); 6103340d773SGleb Smirnoff } 611b5bfcb5dSMax Laier 61227df3f5dSRui Paulo msg_data += sizeof(struct olsr_hna4); 61327df3f5dSRui Paulo msg_tlen -= sizeof(struct olsr_hna4); 61427df3f5dSRui Paulo 61527df3f5dSRui Paulo col = (col + 1) % 4; 61627df3f5dSRui Paulo } 617b5bfcb5dSMax Laier } 618b5bfcb5dSMax Laier break; 619b5bfcb5dSMax Laier 62027df3f5dSRui Paulo case OLSR_NAMESERVICE_MSG: 62127df3f5dSRui Paulo { 6220bff6a5aSEd Maste u_int name_entries; 6230bff6a5aSEd Maste u_int addr_size; 6240bff6a5aSEd Maste int name_entries_valid; 62527df3f5dSRui Paulo u_int i; 62627df3f5dSRui Paulo 62727df3f5dSRui Paulo if (msg_tlen < 4) 62827df3f5dSRui Paulo goto trunc; 62927df3f5dSRui Paulo 630*ee67461eSJoseph Mingrone name_entries = GET_BE_U_2(msg_data + 2); 6310bff6a5aSEd Maste addr_size = 4; 6320bff6a5aSEd Maste if (is_ipv6) 6330bff6a5aSEd Maste addr_size = 16; 6340bff6a5aSEd Maste 6350bff6a5aSEd Maste name_entries_valid = 0; 6360bff6a5aSEd Maste if ((name_entries > 0) 6370bff6a5aSEd Maste && ((name_entries * (4 + addr_size)) <= msg_tlen)) 6380bff6a5aSEd Maste name_entries_valid = 1; 6390bff6a5aSEd Maste 640*ee67461eSJoseph Mingrone ND_PRINT("\n\t Version %u, Entries %u%s", 641*ee67461eSJoseph Mingrone GET_BE_U_2(msg_data), 642*ee67461eSJoseph Mingrone name_entries, (name_entries_valid == 0) ? " (invalid)" : ""); 64327df3f5dSRui Paulo 64427df3f5dSRui Paulo if (name_entries_valid == 0) 64527df3f5dSRui Paulo break; 64627df3f5dSRui Paulo 64727df3f5dSRui Paulo msg_data += 4; 64827df3f5dSRui Paulo msg_tlen -= 4; 64927df3f5dSRui Paulo 65027df3f5dSRui Paulo for (i = 0; i < name_entries; i++) { 65127df3f5dSRui Paulo int name_entry_len_valid = 0; 65227df3f5dSRui Paulo 65327df3f5dSRui Paulo if (msg_tlen < 4) 65427df3f5dSRui Paulo break; 65527df3f5dSRui Paulo 656*ee67461eSJoseph Mingrone name_entry_type = GET_BE_U_2(msg_data); 657*ee67461eSJoseph Mingrone name_entry_len = GET_BE_U_2(msg_data + 2); 65827df3f5dSRui Paulo 65927df3f5dSRui Paulo msg_data += 4; 66027df3f5dSRui Paulo msg_tlen -= 4; 66127df3f5dSRui Paulo 66227df3f5dSRui Paulo if ((name_entry_len > 0) && ((addr_size + name_entry_len) <= msg_tlen)) 66327df3f5dSRui Paulo name_entry_len_valid = 1; 66427df3f5dSRui Paulo 665*ee67461eSJoseph Mingrone ND_PRINT("\n\t #%u: type %#06x, length %u%s", 66627df3f5dSRui Paulo (unsigned int) i, name_entry_type, 667*ee67461eSJoseph Mingrone name_entry_len, (name_entry_len_valid == 0) ? " (invalid)" : ""); 66827df3f5dSRui Paulo 66927df3f5dSRui Paulo if (name_entry_len_valid == 0) 67027df3f5dSRui Paulo break; 67127df3f5dSRui Paulo 67227df3f5dSRui Paulo /* 32-bit alignment */ 67327df3f5dSRui Paulo name_entry_padding = 0; 67427df3f5dSRui Paulo if (name_entry_len%4 != 0) 67527df3f5dSRui Paulo name_entry_padding = 4-(name_entry_len%4); 67627df3f5dSRui Paulo 67727df3f5dSRui Paulo if (msg_tlen < addr_size + name_entry_len + name_entry_padding) 67827df3f5dSRui Paulo goto trunc; 67927df3f5dSRui Paulo 680*ee67461eSJoseph Mingrone ND_TCHECK_LEN(msg_data, 681*ee67461eSJoseph Mingrone addr_size + name_entry_len + name_entry_padding); 68227df3f5dSRui Paulo 68327df3f5dSRui Paulo if (is_ipv6) 684*ee67461eSJoseph Mingrone ND_PRINT(", address %s, name \"", 685*ee67461eSJoseph Mingrone GET_IP6ADDR_STRING(msg_data)); 68627df3f5dSRui Paulo else 687*ee67461eSJoseph Mingrone ND_PRINT(", address %s, name \"", 688*ee67461eSJoseph Mingrone GET_IPADDR_STRING(msg_data)); 689*ee67461eSJoseph Mingrone (void)nd_printn(ndo, msg_data + addr_size, name_entry_len, NULL); 690*ee67461eSJoseph Mingrone ND_PRINT("\""); 69127df3f5dSRui Paulo 69227df3f5dSRui Paulo msg_data += addr_size + name_entry_len + name_entry_padding; 69327df3f5dSRui Paulo msg_tlen -= addr_size + name_entry_len + name_entry_padding; 69427df3f5dSRui Paulo } /* for (i = 0; i < name_entries; i++) */ 69527df3f5dSRui Paulo break; 69627df3f5dSRui Paulo } /* case OLSR_NAMESERVICE_MSG */ 69727df3f5dSRui Paulo 698b5bfcb5dSMax Laier /* 699b5bfcb5dSMax Laier * FIXME those are the defined messages that lack a decoder 700b5bfcb5dSMax Laier * you are welcome to contribute code ;-) 701b5bfcb5dSMax Laier */ 702b5bfcb5dSMax Laier case OLSR_POWERINFO_MSG: 703b5bfcb5dSMax Laier default: 7043c602fabSXin LI print_unknown_data(ndo, msg_data, "\n\t ", msg_tlen); 705b5bfcb5dSMax Laier break; 70627df3f5dSRui Paulo } /* switch (msg_type) */ 707b5bfcb5dSMax Laier tptr += msg_len; 70827df3f5dSRui Paulo } /* while (tptr < (pptr+length)) */ 709b5bfcb5dSMax Laier 710b5bfcb5dSMax Laier return; 711b5bfcb5dSMax Laier 712b5bfcb5dSMax Laier trunc: 713*ee67461eSJoseph Mingrone nd_print_trunc(ndo); 714b5bfcb5dSMax Laier } 715