12949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 22949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Copyright (c) 1998-2004 Hannes Gredler <hannes@tcpdump.org> 32949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * The TCPDUMP project 42949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 52949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Redistribution and use in source and binary forms, with or without 62949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * modification, are permitted provided that: (1) source code 72949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * distributions retain the above copyright notice and this paragraph 82949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * in its entirety, and (2) distributions including binary code include 92949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * the above copyright notice and this paragraph in its entirety in 102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * the documentation or other materials provided with the distribution. 112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * THIS SOFTWARE IS PROVIDED ``AS IS'' AND 122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT 132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * FOR A PARTICULAR PURPOSE. 152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 17892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define NETDISSECT_REWORKED 182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_CONFIG_H 192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "config.h" 202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <tcpdump-stdinc.h> 232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <string.h> 252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "interface.h" 272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "extract.h" 282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "addrtoname.h" 292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * packet format documented at 322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * http://www.rhyshaden.com/eigrp.htm 332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct eigrp_common_header { 36892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t version; 37892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t opcode; 38892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t checksum[2]; 39892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t flags[4]; 40892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t seq[4]; 41892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t ack[4]; 42892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t asn[4]; 432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define EIGRP_VERSION 2 462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define EIGRP_OPCODE_UPDATE 1 482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define EIGRP_OPCODE_QUERY 3 492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define EIGRP_OPCODE_REPLY 4 502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define EIGRP_OPCODE_HELLO 5 512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define EIGRP_OPCODE_IPXSAP 6 522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define EIGRP_OPCODE_PROBE 7 532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const struct tok eigrp_opcode_values[] = { 552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { EIGRP_OPCODE_UPDATE, "Update" }, 562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { EIGRP_OPCODE_QUERY, "Query" }, 572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { EIGRP_OPCODE_REPLY, "Reply" }, 582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { EIGRP_OPCODE_HELLO, "Hello" }, 592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { EIGRP_OPCODE_IPXSAP, "IPX SAP" }, 602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { EIGRP_OPCODE_PROBE, "Probe" }, 612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0, NULL} 622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const struct tok eigrp_common_header_flag_values[] = { 652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x01, "Init" }, 662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x02, "Conditionally Received" }, 672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0, NULL} 682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct eigrp_tlv_header { 71892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t type[2]; 72892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t length[2]; 732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define EIGRP_TLV_GENERAL_PARM 0x0001 762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define EIGRP_TLV_AUTH 0x0002 772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define EIGRP_TLV_SEQ 0x0003 782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define EIGRP_TLV_SW_VERSION 0x0004 792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define EIGRP_TLV_MCAST_SEQ 0x0005 802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define EIGRP_TLV_IP_INT 0x0102 812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define EIGRP_TLV_IP_EXT 0x0103 822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define EIGRP_TLV_AT_INT 0x0202 832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define EIGRP_TLV_AT_EXT 0x0203 842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define EIGRP_TLV_AT_CABLE_SETUP 0x0204 852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define EIGRP_TLV_IPX_INT 0x0302 862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define EIGRP_TLV_IPX_EXT 0x0303 872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const struct tok eigrp_tlv_values[] = { 892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { EIGRP_TLV_GENERAL_PARM, "General Parameters"}, 902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { EIGRP_TLV_AUTH, "Authentication"}, 912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { EIGRP_TLV_SEQ, "Sequence"}, 922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { EIGRP_TLV_SW_VERSION, "Software Version"}, 932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { EIGRP_TLV_MCAST_SEQ, "Next Multicast Sequence"}, 942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { EIGRP_TLV_IP_INT, "IP Internal routes"}, 952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { EIGRP_TLV_IP_EXT, "IP External routes"}, 962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { EIGRP_TLV_AT_INT, "AppleTalk Internal routes"}, 972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { EIGRP_TLV_AT_EXT, "AppleTalk External routes"}, 982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { EIGRP_TLV_AT_CABLE_SETUP, "AppleTalk Cable setup"}, 992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { EIGRP_TLV_IPX_INT, "IPX Internal routes"}, 1002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { EIGRP_TLV_IPX_EXT, "IPX External routes"}, 1012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0, NULL} 1022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 1032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct eigrp_tlv_general_parm_t { 105892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t k1; 106892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t k2; 107892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t k3; 108892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t k4; 109892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t k5; 110892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t res; 111892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t holdtime[2]; 112892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes}; 1132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct eigrp_tlv_sw_version_t { 115892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t ios_major; 116892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t ios_minor; 117892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t eigrp_major; 118892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t eigrp_minor; 119892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes}; 1202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct eigrp_tlv_ip_int_t { 122892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t nexthop[4]; 123892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t delay[4]; 124892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t bandwidth[4]; 125892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t mtu[3]; 126892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t hopcount; 127892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t reliability; 128892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t load; 129892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t reserved[2]; 130892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t plen; 131892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t destination; /* variable length [1-4] bytes encoding */ 132892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes}; 1332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct eigrp_tlv_ip_ext_t { 135892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t nexthop[4]; 136892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t origin_router[4]; 137892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t origin_as[4]; 138892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t tag[4]; 139892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t metric[4]; 140892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t reserved[2]; 141892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t proto_id; 142892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t flags; 143892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t delay[4]; 144892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t bandwidth[4]; 145892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t mtu[3]; 146892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t hopcount; 147892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t reliability; 148892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t load; 149892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t reserved2[2]; 150892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t plen; 151892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t destination; /* variable length [1-4] bytes encoding */ 152892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes}; 1532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct eigrp_tlv_at_cable_setup_t { 155892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t cable_start[2]; 156892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t cable_end[2]; 157892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t router_id[4]; 1582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 1592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct eigrp_tlv_at_int_t { 161892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t nexthop[4]; 162892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t delay[4]; 163892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t bandwidth[4]; 164892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t mtu[3]; 165892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t hopcount; 166892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t reliability; 167892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t load; 168892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t reserved[2]; 169892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t cable_start[2]; 170892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t cable_end[2]; 171892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes}; 1722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct eigrp_tlv_at_ext_t { 174892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t nexthop[4]; 175892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t origin_router[4]; 176892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t origin_as[4]; 177892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t tag[4]; 178892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t proto_id; 179892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t flags; 180892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t metric[2]; 181892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t delay[4]; 182892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t bandwidth[4]; 183892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t mtu[3]; 184892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t hopcount; 185892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t reliability; 186892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t load; 187892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t reserved2[2]; 188892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t cable_start[2]; 189892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t cable_end[2]; 1902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 1912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const struct tok eigrp_ext_proto_id_values[] = { 1932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x01, "IGRP" }, 1942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x02, "EIGRP" }, 1952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x03, "Static" }, 1962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x04, "RIP" }, 1972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x05, "Hello" }, 1982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x06, "OSPF" }, 1992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x07, "IS-IS" }, 2002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x08, "EGP" }, 2012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x09, "BGP" }, 2022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0a, "IDRP" }, 2032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0x0b, "Connected" }, 2042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0, NULL} 2052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 2062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid 208892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hugheseigrp_print(netdissect_options *ndo, register const u_char *pptr, register u_int len) 209892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes{ 2102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const struct eigrp_common_header *eigrp_com_header; 2112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const struct eigrp_tlv_header *eigrp_tlv_header; 2122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const u_char *tptr,*tlv_tptr; 2132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int tlen,eigrp_tlv_len,eigrp_tlv_type,tlv_tlen, byte_length, bit_length; 214892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t prefix[4]; 2152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project union { 2172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const struct eigrp_tlv_general_parm_t *eigrp_tlv_general_parm; 2182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const struct eigrp_tlv_sw_version_t *eigrp_tlv_sw_version; 2192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const struct eigrp_tlv_ip_int_t *eigrp_tlv_ip_int; 2202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const struct eigrp_tlv_ip_ext_t *eigrp_tlv_ip_ext; 2212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const struct eigrp_tlv_at_cable_setup_t *eigrp_tlv_at_cable_setup; 2222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const struct eigrp_tlv_at_int_t *eigrp_tlv_at_int; 2232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const struct eigrp_tlv_at_ext_t *eigrp_tlv_at_ext; 2242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } tlv_ptr; 2252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tptr=pptr; 2272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project eigrp_com_header = (const struct eigrp_common_header *)pptr; 228892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_TCHECK(*eigrp_com_header); 2292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* 2312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Sanity checking of the header. 2322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 2332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (eigrp_com_header->version != EIGRP_VERSION) { 234892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "EIGRP version %u packet not supported",eigrp_com_header->version)); 2352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 2362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* in non-verbose mode just lets print the basic Message Type*/ 239892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes if (ndo->ndo_vflag < 1) { 240892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "EIGRP %s, length: %u", 2412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tok2str(eigrp_opcode_values, "unknown (%u)",eigrp_com_header->opcode), 242892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes len)); 2432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 2442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* ok they seem to want to know everything - lets fully decode it */ 2472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlen=len-sizeof(struct eigrp_common_header); 2492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* FIXME print other header info */ 251892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "\n\tEIGRP v%u, opcode: %s (%u), chksum: 0x%04x, Flags: [%s]\n\tseq: 0x%08x, ack: 0x%08x, AS: %u, length: %u", 2522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project eigrp_com_header->version, 2532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tok2str(eigrp_opcode_values, "unknown, type: %u",eigrp_com_header->opcode), 2542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project eigrp_com_header->opcode, 2552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_16BITS(&eigrp_com_header->checksum), 2562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tok2str(eigrp_common_header_flag_values, 2572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "none", 2582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_32BITS(&eigrp_com_header->flags)), 2592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_32BITS(&eigrp_com_header->seq), 2602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_32BITS(&eigrp_com_header->ack), 2612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_32BITS(&eigrp_com_header->asn), 262892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes tlen)); 2632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tptr+=sizeof(const struct eigrp_common_header); 2652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while(tlen>0) { 2672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* did we capture enough for fully decoding the object header ? */ 268892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_TCHECK2(*tptr, sizeof(struct eigrp_tlv_header)); 2692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project eigrp_tlv_header = (const struct eigrp_tlv_header *)tptr; 2712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project eigrp_tlv_len=EXTRACT_16BITS(&eigrp_tlv_header->length); 2722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project eigrp_tlv_type=EXTRACT_16BITS(&eigrp_tlv_header->type); 2732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (eigrp_tlv_len < sizeof(struct eigrp_tlv_header) || 2762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project eigrp_tlv_len > tlen) { 277892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes print_unknown_data(ndo,tptr+sizeof(struct eigrp_tlv_header),"\n\t ",tlen); 2782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 2792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 281892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "\n\t %s TLV (0x%04x), length: %u", 2822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tok2str(eigrp_tlv_values, 2832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "Unknown", 2842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project eigrp_tlv_type), 2852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project eigrp_tlv_type, 286892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes eigrp_tlv_len)); 2872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlv_tptr=tptr+sizeof(struct eigrp_tlv_header); 2892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlv_tlen=eigrp_tlv_len-sizeof(struct eigrp_tlv_header); 2902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* did we capture enough for fully decoding the object ? */ 292892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_TCHECK2(*tptr, eigrp_tlv_len); 2932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch(eigrp_tlv_type) { 2952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case EIGRP_TLV_GENERAL_PARM: 2972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlv_ptr.eigrp_tlv_general_parm = (const struct eigrp_tlv_general_parm_t *)tlv_tptr; 2982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 299892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "\n\t holdtime: %us, k1 %u, k2 %u, k3 %u, k4 %u, k5 %u", 3002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_16BITS(tlv_ptr.eigrp_tlv_general_parm->holdtime), 3012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlv_ptr.eigrp_tlv_general_parm->k1, 3022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlv_ptr.eigrp_tlv_general_parm->k2, 3032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlv_ptr.eigrp_tlv_general_parm->k3, 3042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlv_ptr.eigrp_tlv_general_parm->k4, 305892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes tlv_ptr.eigrp_tlv_general_parm->k5)); 3062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 3072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case EIGRP_TLV_SW_VERSION: 3092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlv_ptr.eigrp_tlv_sw_version = (const struct eigrp_tlv_sw_version_t *)tlv_tptr; 3102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 311892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "\n\t IOS version: %u.%u, EIGRP version %u.%u", 3122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlv_ptr.eigrp_tlv_sw_version->ios_major, 3132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlv_ptr.eigrp_tlv_sw_version->ios_minor, 3142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlv_ptr.eigrp_tlv_sw_version->eigrp_major, 315892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes tlv_ptr.eigrp_tlv_sw_version->eigrp_minor)); 3162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 3172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case EIGRP_TLV_IP_INT: 3192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlv_ptr.eigrp_tlv_ip_int = (const struct eigrp_tlv_ip_int_t *)tlv_tptr; 3202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bit_length = tlv_ptr.eigrp_tlv_ip_int->plen; 3222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (bit_length > 32) { 323892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "\n\t illegal prefix length %u",bit_length)); 3242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 3252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 3262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project byte_length = (bit_length + 7) / 8; /* variable length encoding */ 3272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memset(prefix, 0, 4); 3282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy(prefix,&tlv_ptr.eigrp_tlv_ip_int->destination,byte_length); 3292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 330892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "\n\t IPv4 prefix: %15s/%u, nexthop: ", 331892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ipaddr_string(ndo, prefix), 332892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes bit_length)); 3332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (EXTRACT_32BITS(&tlv_ptr.eigrp_tlv_ip_int->nexthop) == 0) 334892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "self")); 3352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 336892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "%s",ipaddr_string(ndo, &tlv_ptr.eigrp_tlv_ip_int->nexthop))); 3372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 338892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "\n\t delay %u ms, bandwidth %u Kbps, mtu %u, hop %u, reliability %u, load %u", 3392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (EXTRACT_32BITS(&tlv_ptr.eigrp_tlv_ip_int->delay)/100), 3402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_32BITS(&tlv_ptr.eigrp_tlv_ip_int->bandwidth), 3412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_24BITS(&tlv_ptr.eigrp_tlv_ip_int->mtu), 3422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlv_ptr.eigrp_tlv_ip_int->hopcount, 3432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlv_ptr.eigrp_tlv_ip_int->reliability, 344892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes tlv_ptr.eigrp_tlv_ip_int->load)); 3452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 3462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case EIGRP_TLV_IP_EXT: 3482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlv_ptr.eigrp_tlv_ip_ext = (const struct eigrp_tlv_ip_ext_t *)tlv_tptr; 3492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bit_length = tlv_ptr.eigrp_tlv_ip_ext->plen; 3512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (bit_length > 32) { 352892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "\n\t illegal prefix length %u",bit_length)); 3532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 3542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 3552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project byte_length = (bit_length + 7) / 8; /* variable length encoding */ 3562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memset(prefix, 0, 4); 3572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project memcpy(prefix,&tlv_ptr.eigrp_tlv_ip_ext->destination,byte_length); 3582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 359892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "\n\t IPv4 prefix: %15s/%u, nexthop: ", 360892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ipaddr_string(ndo, prefix), 361892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes bit_length)); 3622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (EXTRACT_32BITS(&tlv_ptr.eigrp_tlv_ip_ext->nexthop) == 0) 363892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "self")); 3642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 365892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "%s",ipaddr_string(ndo, &tlv_ptr.eigrp_tlv_ip_ext->nexthop))); 3662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 367892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "\n\t origin-router %s, origin-as %u, origin-proto %s, flags [0x%02x], tag 0x%08x, metric %u", 368892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ipaddr_string(ndo, tlv_ptr.eigrp_tlv_ip_ext->origin_router), 3692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_32BITS(tlv_ptr.eigrp_tlv_ip_ext->origin_as), 3702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tok2str(eigrp_ext_proto_id_values,"unknown",tlv_ptr.eigrp_tlv_ip_ext->proto_id), 3712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlv_ptr.eigrp_tlv_ip_ext->flags, 3722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_32BITS(tlv_ptr.eigrp_tlv_ip_ext->tag), 373892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes EXTRACT_32BITS(tlv_ptr.eigrp_tlv_ip_ext->metric))); 3742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 375892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "\n\t delay %u ms, bandwidth %u Kbps, mtu %u, hop %u, reliability %u, load %u", 3762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (EXTRACT_32BITS(&tlv_ptr.eigrp_tlv_ip_ext->delay)/100), 3772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_32BITS(&tlv_ptr.eigrp_tlv_ip_ext->bandwidth), 3782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_24BITS(&tlv_ptr.eigrp_tlv_ip_ext->mtu), 3792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlv_ptr.eigrp_tlv_ip_ext->hopcount, 3802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlv_ptr.eigrp_tlv_ip_ext->reliability, 381892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes tlv_ptr.eigrp_tlv_ip_ext->load)); 3822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 3832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case EIGRP_TLV_AT_CABLE_SETUP: 3852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlv_ptr.eigrp_tlv_at_cable_setup = (const struct eigrp_tlv_at_cable_setup_t *)tlv_tptr; 3862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 387892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "\n\t Cable-range: %u-%u, Router-ID %u", 3882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_16BITS(&tlv_ptr.eigrp_tlv_at_cable_setup->cable_start), 3892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_16BITS(&tlv_ptr.eigrp_tlv_at_cable_setup->cable_end), 390892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes EXTRACT_32BITS(&tlv_ptr.eigrp_tlv_at_cable_setup->router_id))); 3912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 3922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case EIGRP_TLV_AT_INT: 3942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlv_ptr.eigrp_tlv_at_int = (const struct eigrp_tlv_at_int_t *)tlv_tptr; 3952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 396892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "\n\t Cable-Range: %u-%u, nexthop: ", 3972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_16BITS(&tlv_ptr.eigrp_tlv_at_int->cable_start), 398892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes EXTRACT_16BITS(&tlv_ptr.eigrp_tlv_at_int->cable_end))); 3992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (EXTRACT_32BITS(&tlv_ptr.eigrp_tlv_at_int->nexthop) == 0) 401892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "self")); 4022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 403892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "%u.%u", 4042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_16BITS(&tlv_ptr.eigrp_tlv_at_int->nexthop), 405892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes EXTRACT_16BITS(&tlv_ptr.eigrp_tlv_at_int->nexthop[2]))); 4062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 407892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "\n\t delay %u ms, bandwidth %u Kbps, mtu %u, hop %u, reliability %u, load %u", 4082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (EXTRACT_32BITS(&tlv_ptr.eigrp_tlv_at_int->delay)/100), 4092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_32BITS(&tlv_ptr.eigrp_tlv_at_int->bandwidth), 4102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_24BITS(&tlv_ptr.eigrp_tlv_at_int->mtu), 4112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlv_ptr.eigrp_tlv_at_int->hopcount, 4122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlv_ptr.eigrp_tlv_at_int->reliability, 413892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes tlv_ptr.eigrp_tlv_at_int->load)); 4142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 4152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case EIGRP_TLV_AT_EXT: 4172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlv_ptr.eigrp_tlv_at_ext = (const struct eigrp_tlv_at_ext_t *)tlv_tptr; 4182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 419892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "\n\t Cable-Range: %u-%u, nexthop: ", 4202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_16BITS(&tlv_ptr.eigrp_tlv_at_ext->cable_start), 421892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes EXTRACT_16BITS(&tlv_ptr.eigrp_tlv_at_ext->cable_end))); 4222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (EXTRACT_32BITS(&tlv_ptr.eigrp_tlv_at_ext->nexthop) == 0) 424892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "self")); 4252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 426892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "%u.%u", 4272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_16BITS(&tlv_ptr.eigrp_tlv_at_ext->nexthop), 428892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes EXTRACT_16BITS(&tlv_ptr.eigrp_tlv_at_ext->nexthop[2]))); 4292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 430892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "\n\t origin-router %u, origin-as %u, origin-proto %s, flags [0x%02x], tag 0x%08x, metric %u", 4312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_32BITS(tlv_ptr.eigrp_tlv_at_ext->origin_router), 4322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_32BITS(tlv_ptr.eigrp_tlv_at_ext->origin_as), 4332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tok2str(eigrp_ext_proto_id_values,"unknown",tlv_ptr.eigrp_tlv_at_ext->proto_id), 4342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlv_ptr.eigrp_tlv_at_ext->flags, 4352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_32BITS(tlv_ptr.eigrp_tlv_at_ext->tag), 436892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes EXTRACT_16BITS(tlv_ptr.eigrp_tlv_at_ext->metric))); 4372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 438892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "\n\t delay %u ms, bandwidth %u Kbps, mtu %u, hop %u, reliability %u, load %u", 4392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (EXTRACT_32BITS(&tlv_ptr.eigrp_tlv_at_ext->delay)/100), 4402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_32BITS(&tlv_ptr.eigrp_tlv_at_ext->bandwidth), 4412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_24BITS(&tlv_ptr.eigrp_tlv_at_ext->mtu), 4422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlv_ptr.eigrp_tlv_at_ext->hopcount, 4432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlv_ptr.eigrp_tlv_at_ext->reliability, 444892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes tlv_ptr.eigrp_tlv_at_ext->load)); 4452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 4462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* 4482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * FIXME those are the defined TLVs that lack a decoder 4492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * you are welcome to contribute code ;-) 4502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 4512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case EIGRP_TLV_AUTH: 4532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case EIGRP_TLV_SEQ: 4542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case EIGRP_TLV_MCAST_SEQ: 4552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case EIGRP_TLV_IPX_INT: 4562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case EIGRP_TLV_IPX_EXT: 4572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 459892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes if (ndo->ndo_vflag <= 1) 460892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes print_unknown_data(ndo,tlv_tptr,"\n\t ",tlv_tlen); 4612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 4622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 4632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* do we want to see an additionally hexdump ? */ 464892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes if (ndo->ndo_vflag > 1) 465892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes print_unknown_data(ndo,tptr+sizeof(struct eigrp_tlv_header),"\n\t ", 4662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project eigrp_tlv_len-sizeof(struct eigrp_tlv_header)); 4672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tptr+=eigrp_tlv_len; 4692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tlen-=eigrp_tlv_len; 4702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 4712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 4722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc: 473892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "\n\t\t packet exceeded snapshot")); 4742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 475