12949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 22949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Copyright (c) 1991, 1992, 1993, 1994, 1995, 1996 32949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * The Regents of the University of California. All rights reserved. 42949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 52949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Redistribution and use in source and binary forms are permitted 62949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * provided that the above copyright notice and this paragraph are 72949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * duplicated in all such forms and that any documentation, 82949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * advertising materials, and other materials related to such 92949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * distribution and use acknowledge that the software was developed 102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * by the University of California, Lawrence Berkeley Laboratory, 112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Berkeley, CA. The name of the University may not be used to 122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * endorse or promote products derived from this software without 132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * specific prior written permission. 142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR 152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED 162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Initial contribution from Jeff Honig (jch@MITCHELL.CIT.CORNELL.EDU). 192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 21e2e3bd11bd7561bc9d6686283a668fa94e1206b7Elliott Hughes/* \summary: Exterior Gateway Protocol (EGP) printer */ 22e2e3bd11bd7561bc9d6686283a668fa94e1206b7Elliott Hughes 232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_CONFIG_H 242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "config.h" 252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 27e2e3bd11bd7561bc9d6686283a668fa94e1206b7Elliott Hughes#include <netdissect-stdinc.h> 282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 29e2e3bd11bd7561bc9d6686283a668fa94e1206b7Elliott Hughes#include "netdissect.h" 302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "addrtoname.h" 312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "extract.h" 322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct egp_packet { 34892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t egp_version; 352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define EGP_VERSION 2 36892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t egp_type; 372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define EGPT_ACQUIRE 3 382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define EGPT_REACH 5 392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define EGPT_POLL 2 402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define EGPT_UPDATE 1 412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define EGPT_ERROR 8 42892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t egp_code; 432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define EGPC_REQUEST 0 442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define EGPC_CONFIRM 1 452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define EGPC_REFUSE 2 462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define EGPC_CEASE 3 472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define EGPC_CEASEACK 4 482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define EGPC_HELLO 0 492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define EGPC_HEARDU 1 50892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t egp_status; 512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define EGPS_UNSPEC 0 522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define EGPS_ACTIVE 1 532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define EGPS_PASSIVE 2 542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define EGPS_NORES 3 552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define EGPS_ADMIN 4 562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define EGPS_GODOWN 5 572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define EGPS_PARAM 6 582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define EGPS_PROTO 7 592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define EGPS_INDET 0 602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define EGPS_UP 1 612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define EGPS_DOWN 2 622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define EGPS_UNSOL 0x80 63892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint16_t egp_checksum; 64892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint16_t egp_as; 65892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint16_t egp_sequence; 662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project union { 67892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint16_t egpu_hello; 68892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint8_t egpu_gws[2]; 69892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint16_t egpu_reason; 702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define EGPR_UNSPEC 0 712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define EGPR_BADHEAD 1 722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define EGPR_BADDATA 2 732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define EGPR_NOREACH 3 742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define EGPR_XSPOLL 4 752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define EGPR_NORESP 5 762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define EGPR_UVERSION 6 772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } egp_handg; 782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define egp_hello egp_handg.egpu_hello 792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define egp_intgw egp_handg.egpu_gws[0] 802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define egp_extgw egp_handg.egpu_gws[1] 812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define egp_reason egp_handg.egpu_reason 822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project union { 83892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint16_t egpu_poll; 84892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint32_t egpu_sourcenet; 852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } egp_pands; 862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define egp_poll egp_pands.egpu_poll 872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define egp_sourcenet egp_pands.egpu_sourcenet 882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 90892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesstatic const char *egp_acquire_codes[] = { 912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "request", 922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "confirm", 932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "refuse", 942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "cease", 952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "cease_ack" 962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 98892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesstatic const char *egp_acquire_status[] = { 992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "unspecified", 1002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "active_mode", 1012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "passive_mode", 1022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "insufficient_resources", 1032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "administratively_prohibited", 1042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "going_down", 1052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "parameter_violation", 1062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "protocol_violation" 1072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 1082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 109892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesstatic const char *egp_reach_codes[] = { 1102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "hello", 1112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "i-h-u" 1122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 1132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 114892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesstatic const char *egp_status_updown[] = { 1152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "indeterminate", 1162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "up", 1172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "down" 1182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 1192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 120892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesstatic const char *egp_reasons[] = { 1212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "unspecified", 1222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "bad_EGP_header_format", 1232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "bad_EGP_data_field_format", 1242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "reachability_info_unavailable", 1252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "excessive_polling_rate", 1262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "no_response", 1272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "unsupported_version" 1282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 1292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void 131892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesegpnrprint(netdissect_options *ndo, 132e2e3bd11bd7561bc9d6686283a668fa94e1206b7Elliott Hughes register const struct egp_packet *egp, u_int length) 1332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 134892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes register const uint8_t *cp; 135892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes uint32_t addr; 136892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes register uint32_t net; 1372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register u_int netlen; 1382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int gateways, distances, networks; 1392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int t_gateways; 1402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const char *comma; 1412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project addr = egp->egp_sourcenet; 1432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (IN_CLASSA(addr)) { 1442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project net = addr & IN_CLASSA_NET; 1452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project netlen = 1; 1462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else if (IN_CLASSB(addr)) { 1472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project net = addr & IN_CLASSB_NET; 1482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project netlen = 2; 1492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else if (IN_CLASSC(addr)) { 1502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project net = addr & IN_CLASSC_NET; 1512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project netlen = 3; 1522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else { 1532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project net = 0; 1542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project netlen = 0; 1552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 156e2e3bd11bd7561bc9d6686283a668fa94e1206b7Elliott Hughes cp = (const uint8_t *)(egp + 1); 157e2e3bd11bd7561bc9d6686283a668fa94e1206b7Elliott Hughes length -= sizeof(*egp); 1582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project t_gateways = egp->egp_intgw + egp->egp_extgw; 1602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project for (gateways = 0; gateways < t_gateways; ++gateways) { 1612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* Pickup host part of gateway address */ 1622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project addr = 0; 163e2e3bd11bd7561bc9d6686283a668fa94e1206b7Elliott Hughes if (length < 4 - netlen) 164e2e3bd11bd7561bc9d6686283a668fa94e1206b7Elliott Hughes goto trunc; 165892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_TCHECK2(cp[0], 4 - netlen); 1662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (netlen) { 1672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 1: 1692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project addr = *cp++; 1702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* fall through */ 1712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 2: 1722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project addr = (addr << 8) | *cp++; 1732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* fall through */ 1742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case 3: 1752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project addr = (addr << 8) | *cp++; 1762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project addr |= net; 178e2e3bd11bd7561bc9d6686283a668fa94e1206b7Elliott Hughes length -= 4 - netlen; 179e2e3bd11bd7561bc9d6686283a668fa94e1206b7Elliott Hughes if (length < 1) 180e2e3bd11bd7561bc9d6686283a668fa94e1206b7Elliott Hughes goto trunc; 181892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_TCHECK2(cp[0], 1); 1822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project distances = *cp++; 183e2e3bd11bd7561bc9d6686283a668fa94e1206b7Elliott Hughes length--; 184892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, " %s %s ", 1852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project gateways < (int)egp->egp_intgw ? "int" : "ext", 186892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ipaddr_string(ndo, &addr))); 1872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project comma = ""; 189892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "(")); 1902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (--distances >= 0) { 191e2e3bd11bd7561bc9d6686283a668fa94e1206b7Elliott Hughes if (length < 2) 192e2e3bd11bd7561bc9d6686283a668fa94e1206b7Elliott Hughes goto trunc; 193892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_TCHECK2(cp[0], 2); 194892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "%sd%d:", comma, (int)*cp++)); 1952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project comma = ", "; 1962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project networks = *cp++; 197e2e3bd11bd7561bc9d6686283a668fa94e1206b7Elliott Hughes length -= 2; 1982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project while (--networks >= 0) { 1992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* Pickup network number */ 200e2e3bd11bd7561bc9d6686283a668fa94e1206b7Elliott Hughes if (length < 1) 201e2e3bd11bd7561bc9d6686283a668fa94e1206b7Elliott Hughes goto trunc; 202892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_TCHECK2(cp[0], 1); 203892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes addr = (uint32_t)*cp++ << 24; 204e2e3bd11bd7561bc9d6686283a668fa94e1206b7Elliott Hughes length--; 2052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (IN_CLASSB(addr)) { 206e2e3bd11bd7561bc9d6686283a668fa94e1206b7Elliott Hughes if (length < 1) 207e2e3bd11bd7561bc9d6686283a668fa94e1206b7Elliott Hughes goto trunc; 208892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_TCHECK2(cp[0], 1); 209892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes addr |= (uint32_t)*cp++ << 16; 210e2e3bd11bd7561bc9d6686283a668fa94e1206b7Elliott Hughes length--; 2112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else if (!IN_CLASSA(addr)) { 212e2e3bd11bd7561bc9d6686283a668fa94e1206b7Elliott Hughes if (length < 2) 213e2e3bd11bd7561bc9d6686283a668fa94e1206b7Elliott Hughes goto trunc; 214892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_TCHECK2(cp[0], 2); 215892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes addr |= (uint32_t)*cp++ << 16; 216892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes addr |= (uint32_t)*cp++ << 8; 217e2e3bd11bd7561bc9d6686283a668fa94e1206b7Elliott Hughes length -= 2; 2182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 219892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, " %s", ipaddr_string(ndo, &addr))); 2202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 222892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, ")")); 2232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 2252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc: 226892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "[|]")); 2272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 2282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid 230892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesegp_print(netdissect_options *ndo, 231892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes register const uint8_t *bp, register u_int length) 2322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 2332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register const struct egp_packet *egp; 2342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register int status; 2352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register int code; 2362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register int type; 2372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 238e2e3bd11bd7561bc9d6686283a668fa94e1206b7Elliott Hughes egp = (const struct egp_packet *)bp; 239e2e3bd11bd7561bc9d6686283a668fa94e1206b7Elliott Hughes if (length < sizeof(*egp) || !ND_TTEST(*egp)) { 240892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "[|egp]")); 2412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 2422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 24353f17a9db278d33517d9888dd77848f554522a38JP Abgrall 244892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes if (!ndo->ndo_vflag) { 245892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "EGPv%u, AS %u, seq %u, length %u", 24653f17a9db278d33517d9888dd77848f554522a38JP Abgrall egp->egp_version, 24753f17a9db278d33517d9888dd77848f554522a38JP Abgrall EXTRACT_16BITS(&egp->egp_as), 24853f17a9db278d33517d9888dd77848f554522a38JP Abgrall EXTRACT_16BITS(&egp->egp_sequence), 249892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes length)); 25053f17a9db278d33517d9888dd77848f554522a38JP Abgrall return; 25153f17a9db278d33517d9888dd77848f554522a38JP Abgrall } else 252892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "EGPv%u, length %u", 25353f17a9db278d33517d9888dd77848f554522a38JP Abgrall egp->egp_version, 254892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes length)); 2552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (egp->egp_version != EGP_VERSION) { 257892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "[version %d]", egp->egp_version)); 2582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 2592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project type = egp->egp_type; 2622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project code = egp->egp_code; 2632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project status = egp->egp_status; 2642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (type) { 2662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case EGPT_ACQUIRE: 267892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, " acquire")); 2682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (code) { 2692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case EGPC_REQUEST: 2702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case EGPC_CONFIRM: 271892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, " %s", egp_acquire_codes[code])); 2722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (status) { 2732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case EGPS_UNSPEC: 2742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case EGPS_ACTIVE: 2752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case EGPS_PASSIVE: 276892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, " %s", egp_acquire_status[status])); 2772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 2782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 280892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, " [status %d]", status)); 2812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 2822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 283892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, " hello:%d poll:%d", 2842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_16BITS(&egp->egp_hello), 285892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes EXTRACT_16BITS(&egp->egp_poll))); 2862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 2872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case EGPC_REFUSE: 2892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case EGPC_CEASE: 2902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case EGPC_CEASEACK: 291892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, " %s", egp_acquire_codes[code])); 2922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (status ) { 2932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case EGPS_UNSPEC: 2942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case EGPS_NORES: 2952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case EGPS_ADMIN: 2962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case EGPS_GODOWN: 2972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case EGPS_PARAM: 2982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case EGPS_PROTO: 299892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, " %s", egp_acquire_status[status])); 3002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 3012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 303892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "[status %d]", status)); 3042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 3052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 3062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 3072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 309892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "[code %d]", code)); 3102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 3112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 3122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 3132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case EGPT_REACH: 3152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (code) { 3162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case EGPC_HELLO: 3182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case EGPC_HEARDU: 319892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, " %s", egp_reach_codes[code])); 3202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (status <= EGPS_DOWN) 321892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, " state:%s", egp_status_updown[status])); 3222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 323892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, " [status %d]", status)); 3242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 3252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 327892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "[reach code %d]", code)); 3282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 3292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 3302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 3312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case EGPT_POLL: 333892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, " poll")); 3342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (egp->egp_status <= EGPS_DOWN) 335892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, " state:%s", egp_status_updown[status])); 3362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 337892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, " [status %d]", status)); 338892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, " net:%s", ipaddr_string(ndo, &egp->egp_sourcenet))); 3392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 3402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case EGPT_UPDATE: 342892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, " update")); 3432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (status & EGPS_UNSOL) { 3442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project status &= ~EGPS_UNSOL; 345892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, " unsolicited")); 3462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 3472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (status <= EGPS_DOWN) 348892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, " state:%s", egp_status_updown[status])); 3492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 350892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, " [status %d]", status)); 351892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, " %s int %d ext %d", 352892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ipaddr_string(ndo, &egp->egp_sourcenet), 3532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project egp->egp_intgw, 354892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes egp->egp_extgw)); 355892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes if (ndo->ndo_vflag) 356e2e3bd11bd7561bc9d6686283a668fa94e1206b7Elliott Hughes egpnrprint(ndo, egp, length); 3572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 3582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case EGPT_ERROR: 360892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, " error")); 3612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (status <= EGPS_DOWN) 362892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, " state:%s", egp_status_updown[status])); 3632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 364892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, " [status %d]", status)); 3652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (EXTRACT_16BITS(&egp->egp_reason) <= EGPR_UVERSION) 367892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, " %s", egp_reasons[EXTRACT_16BITS(&egp->egp_reason)])); 3682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 369892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, " [reason %d]", EXTRACT_16BITS(&egp->egp_reason))); 3702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 3712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 373892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes ND_PRINT((ndo, "[type %d]", type)); 3742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 3752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 3762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 377