print-olsr.c revision 2949f58a438f6fd85f66a8b7ed4708042cde4b37
12949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 22949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Copyright (c) 1998-2007 The TCPDUMP project 32949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 42949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Redistribution and use in source and binary forms, with or without 52949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * modification, are permitted provided that: (1) source code 62949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * distributions retain the above copyright notice and this paragraph 72949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * in its entirety, and (2) distributions including binary code include 82949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * the above copyright notice and this paragraph in its entirety in 92949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * the documentation or other materials provided with the distribution. 102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * THIS SOFTWARE IS PROVIDED ``AS IS'' AND 112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT 122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * FOR A PARTICULAR PURPOSE. 142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Optimized Link State Protocl (OLSR) as per rfc3626 162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Original code by Hannes Gredler <hannes@juniper.net> 182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_CONFIG_H 212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "config.h" 222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <tcpdump-stdinc.h> 252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdio.h> 272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <string.h> 282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "interface.h" 302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "addrtoname.h" 312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "extract.h" 322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "ip.h" 332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * RFC 3626 common header 362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 0 1 2 3 382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 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 392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * | Packet Length | Packet Sequence Number | 412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * | Message Type | Vtime | Message Size | 432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * | Originator Address | 452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * | Time To Live | Hop Count | Message Sequence Number | 472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * | | 492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * : MESSAGE : 502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * | | 512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * | Message Type | Vtime | Message Size | 532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * | Originator Address | 552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * | Time To Live | Hop Count | Message Sequence Number | 572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * | | 592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * : MESSAGE : 602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * | | 612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * : : 632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct olsr_common { 662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t packet_len[2]; 672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t packet_seq[2]; 682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define OLSR_HELLO_MSG 1 /* rfc3626 */ 712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define OLSR_TC_MSG 2 /* rfc3626 */ 722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define OLSR_MID_MSG 3 /* rfc3626 */ 732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define OLSR_HNA_MSG 4 /* rfc3626 */ 742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define OLSR_POWERINFO_MSG 128 752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define OLSR_NAMESERVICE_MSG 130 762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define OLSR_HELLO_LQ_MSG 201 /* LQ extensions olsr.org */ 772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define OLSR_TC_LQ_MSG 202 /* LQ extensions olsr.org */ 782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct tok olsr_msg_values[] = { 802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { OLSR_HELLO_MSG, "Hello" }, 812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { OLSR_TC_MSG, "TC" }, 822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { OLSR_MID_MSG, "MID" }, 832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { OLSR_HNA_MSG, "HNA" }, 842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { OLSR_POWERINFO_MSG, "Powerinfo" }, 852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { OLSR_NAMESERVICE_MSG, "Nameservice" }, 862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { OLSR_HELLO_LQ_MSG, "Hello-LQ" }, 872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { OLSR_TC_LQ_MSG, "TC-LQ" }, 882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0, NULL} 892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct olsr_msg { 922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t msg_type; 932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t vtime; 942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t msg_len[2]; 952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t originator[4]; 962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t ttl; 972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t hopcount; 982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t msg_seq[2]; 992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 1002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct olsr_hello { 1022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t res[2]; 1032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t htime; 1042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t will; 1052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 1062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct olsr_hello_link { 1082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t link_code; 1092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t res; 1102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t len[2]; 1112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 1122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct olsr_tc { 1142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t ans_seq[2]; 1152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t res[2]; 1162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 1172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct olsr_hna { 1192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t network[4]; 1202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t mask[4]; 1212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 1222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define OLSR_EXTRACT_LINK_TYPE(link_code) (link_code & 0x3) 1252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define OLSR_EXTRACT_NEIGHBOR_TYPE(link_code) (link_code >> 2) 1262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct tok olsr_link_type_values[] = { 1282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0, "Unspecified" }, 1292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 1, "Asymmetric" }, 1302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 2, "Symmetric" }, 1312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 3, "Lost" }, 1322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0, NULL} 1332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 1342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic struct tok olsr_neighbor_type_values[] = { 1362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0, "Not-Neighbor" }, 1372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 1, "Symmetric" }, 1382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 2, "Symmetric-MPR" }, 1392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0, NULL} 1402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 1412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct olsr_lq_neighbor { 1432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t neighbor[4]; 1442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t link_quality; 1452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t neighbor_link_quality; 1462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t res[2]; 1472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 1482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 1502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * macro to convert the 8-bit mantissa/exponent to a double float 1512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * taken from olsr.org. 1522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 1532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define VTIME_SCALE_FACTOR 0.0625 1542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ME_TO_DOUBLE(me) \ 1552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (double)(VTIME_SCALE_FACTOR*(1+(double)(me>>4)/16)*(double)(1<<(me&0x0F))) 1562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 1582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * print a neighbor list with LQ extensions. 1592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 1602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void 1612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectolsr_print_lq_neighbor (const u_char *msg_data, u_int hello_len) 1622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 1632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct olsr_lq_neighbor *lq_neighbor; 1642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (hello_len >= sizeof(struct olsr_lq_neighbor)) { 1662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project lq_neighbor = (struct olsr_lq_neighbor *)msg_data; 1682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t neighbor %s, link-quality %.2lf%%" 1702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ", neighbor-link-quality %.2lf%%", 1712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ipaddr_string(lq_neighbor->neighbor), 1722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ((double)lq_neighbor->link_quality/2.55), 1732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ((double)lq_neighbor->neighbor_link_quality/2.55)); 1742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project msg_data += sizeof(struct olsr_lq_neighbor); 1762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project hello_len -= sizeof(struct olsr_lq_neighbor); 1772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 1792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 1812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * print a neighbor list. 1822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 1832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void 1842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectolsr_print_neighbor (const u_char *msg_data, u_int hello_len) 1852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 1862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int neighbor; 1872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t neighbor\n\t\t"); 1892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project neighbor = 1; 1902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (hello_len >= sizeof(struct in_addr)) { 1922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* print 4 neighbors per line */ 1942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%s%s", ipaddr_string(msg_data), 1962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project neighbor % 4 == 0 ? "\n\t\t" : " "); 1972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project msg_data += sizeof(struct in_addr); 1992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project hello_len -= sizeof(struct in_addr); 2002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 2022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid 2052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectolsr_print (const u_char *pptr, u_int length) 2062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 2072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project union { 2082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const struct olsr_common *common; 2092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const struct olsr_msg *msg; 2102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const struct olsr_hello *hello; 2112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const struct olsr_hello_link *hello_link; 2122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const struct olsr_lq_neighbor *lq_neighbor; 2132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const struct olsr_tc *tc; 2142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const struct olsr_hna *hna; 2152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } ptr; 2162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int msg_type, msg_len, msg_tlen, hello_len, prefix; 2182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int8_t link_type, neighbor_type; 2192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_char *tptr, *msg_data; 2202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tptr = pptr; 2222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (length < sizeof(struct olsr_common)) { 2242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 2252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*tptr, sizeof(struct olsr_common))) { 2282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 2292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ptr.common = (struct olsr_common *)tptr; 2322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project length = MIN(length, EXTRACT_16BITS(ptr.common->packet_len)); 2332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("OLSR, seq 0x%04x, length %u", 2352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_16BITS(ptr.common->packet_seq), 2362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project length); 2372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tptr += sizeof(struct olsr_common); 2392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* 2412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * In non-verbose mode, just print version. 2422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 2432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (vflag < 1) { 2442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 2452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (tptr < (pptr+length)) { 2482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*tptr, sizeof(struct olsr_msg))) 2502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 2512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ptr.msg = (struct olsr_msg *)tptr; 2532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project msg_type = ptr.msg->msg_type; 2552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project msg_len = EXTRACT_16BITS(ptr.msg->msg_len); 2562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* infinite loop check */ 2582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (msg_type == 0 || msg_len == 0) { 2592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 2602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t%s Message (%u), originator %s, ttl %u, hop %u" 2632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "\n\t vtime %.3lfs, msg-seq 0x%04x, length %u", 2642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tok2str(olsr_msg_values, "Unknown", msg_type), 2652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project msg_type, ipaddr_string(ptr.msg->originator), 2662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ptr.msg->ttl, 2672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ptr.msg->hopcount, 2682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ME_TO_DOUBLE(ptr.msg->vtime), 2692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_16BITS(ptr.msg->msg_seq), 2702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project msg_len); 2712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project msg_tlen = msg_len - sizeof(struct olsr_msg); 2732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project msg_data = tptr + sizeof(struct olsr_msg); 2742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (msg_type) { 2762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case OLSR_HELLO_MSG: 2772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case OLSR_HELLO_LQ_MSG: 2782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*msg_data, sizeof(struct olsr_hello))) 2792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 2802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ptr.hello = (struct olsr_hello *)msg_data; 2822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t hello-time %.3lfs, MPR willingness %u", 2832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ME_TO_DOUBLE(ptr.hello->htime), ptr.hello->will); 2842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project msg_data += sizeof(struct olsr_hello); 2852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project msg_tlen -= sizeof(struct olsr_hello); 2862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (msg_tlen >= sizeof(struct olsr_hello_link)) { 2882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* 2902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * link-type. 2912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 2922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*msg_data, sizeof(struct olsr_hello_link))) 2932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 2942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ptr.hello_link = (struct olsr_hello_link *)msg_data; 2962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project hello_len = EXTRACT_16BITS(ptr.hello_link->len); 2982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project link_type = OLSR_EXTRACT_LINK_TYPE(ptr.hello_link->link_code); 2992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project neighbor_type = OLSR_EXTRACT_NEIGHBOR_TYPE(ptr.hello_link->link_code); 3002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t link-type %s, neighbor-type %s, len %u", 3022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tok2str(olsr_link_type_values, "Unknown", link_type), 3032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tok2str(olsr_neighbor_type_values, "Unknown", neighbor_type), 3042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project hello_len); 3052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project msg_data += sizeof(struct olsr_hello_link); 3072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project msg_tlen -= sizeof(struct olsr_hello_link); 3082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project hello_len -= sizeof(struct olsr_hello_link); 3092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (msg_type == OLSR_HELLO_MSG) { 3112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project olsr_print_neighbor(msg_data, hello_len); 3122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else { 3132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project olsr_print_lq_neighbor(msg_data, hello_len); 3142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 3152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project msg_data += hello_len; 3172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project msg_tlen -= hello_len; 3182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 3192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 3202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case OLSR_TC_MSG: 3222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case OLSR_TC_LQ_MSG: 3232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*msg_data, sizeof(struct olsr_tc))) 3242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 3252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ptr.tc = (struct olsr_tc *)msg_data; 3272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t advertised neighbor seq 0x%04x", 3282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_16BITS(ptr.tc->ans_seq)); 3292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project msg_data += sizeof(struct olsr_tc); 3302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project msg_tlen -= sizeof(struct olsr_tc); 3312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (msg_type == OLSR_TC_MSG) { 3332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project olsr_print_neighbor(msg_data, msg_tlen); 3342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else { 3352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project olsr_print_lq_neighbor(msg_data, msg_tlen); 3362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 3372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 3382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case OLSR_MID_MSG: 3402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*msg_data, sizeof(struct in_addr))) 3412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 3422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (msg_tlen >= sizeof(struct in_addr)) { 3442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t interface address %s", ipaddr_string(msg_data)); 3452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project msg_data += sizeof(struct in_addr); 3462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project msg_tlen -= sizeof(struct in_addr); 3472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 3482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 3492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case OLSR_HNA_MSG: 3512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project prefix = 1; 3522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n\t advertised networks\n\t "); 3532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (msg_tlen >= sizeof(struct olsr_hna)) { 3542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!TTEST2(*msg_data, sizeof(struct olsr_hna))) 3552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 3562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ptr.hna = (struct olsr_hna *)msg_data; 3582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* print 4 prefixes per line */ 3602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%s/%u%s", 3622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ipaddr_string(ptr.hna->network), 3632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project mask2plen(EXTRACT_32BITS(ptr.hna->mask)), 3642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project prefix % 4 == 0 ? "\n\t " : " "); 3652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project msg_data += sizeof(struct olsr_hna); 3672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project msg_tlen -= sizeof(struct olsr_hna); 3682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project prefix ++; 3692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 3702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 3712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* 3732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * FIXME those are the defined messages that lack a decoder 3742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * you are welcome to contribute code ;-) 3752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 3762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case OLSR_POWERINFO_MSG: 3782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case OLSR_NAMESERVICE_MSG: 3792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 3802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project print_unknown_data(msg_data, "\n\t ", msg_tlen); 3812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 3822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 3832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tptr += msg_len; 3842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 3852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 3872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project trunc: 3892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("[|olsr]"); 3902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 3912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 3932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Local Variables: 3942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * c-style: whitesmith 3952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * c-basic-offset: 4 3962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * End: 3972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 398