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