xref: /minix3/external/bsd/tcpdump/dist/print-egp.c (revision b636d99d91c3d54204248f643c14627405d4afd1)
1*b636d99dSDavid van Moolenbroek /*
2*b636d99dSDavid van Moolenbroek  * Copyright (c) 1991, 1992, 1993, 1994, 1995, 1996
3*b636d99dSDavid van Moolenbroek  *	The Regents of the University of California.  All rights reserved.
4*b636d99dSDavid van Moolenbroek  *
5*b636d99dSDavid van Moolenbroek  * Redistribution and use in source and binary forms are permitted
6*b636d99dSDavid van Moolenbroek  * provided that the above copyright notice and this paragraph are
7*b636d99dSDavid van Moolenbroek  * duplicated in all such forms and that any documentation,
8*b636d99dSDavid van Moolenbroek  * advertising materials, and other materials related to such
9*b636d99dSDavid van Moolenbroek  * distribution and use acknowledge that the software was developed
10*b636d99dSDavid van Moolenbroek  * by the University of California, Lawrence Berkeley Laboratory,
11*b636d99dSDavid van Moolenbroek  * Berkeley, CA.  The name of the University may not be used to
12*b636d99dSDavid van Moolenbroek  * endorse or promote products derived from this software without
13*b636d99dSDavid van Moolenbroek  * specific prior written permission.
14*b636d99dSDavid van Moolenbroek  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
15*b636d99dSDavid van Moolenbroek  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
16*b636d99dSDavid van Moolenbroek  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
17*b636d99dSDavid van Moolenbroek  *
18*b636d99dSDavid van Moolenbroek  * Initial contribution from Jeff Honig (jch@MITCHELL.CIT.CORNELL.EDU).
19*b636d99dSDavid van Moolenbroek  */
20*b636d99dSDavid van Moolenbroek 
21*b636d99dSDavid van Moolenbroek #include <sys/cdefs.h>
22*b636d99dSDavid van Moolenbroek #ifndef lint
23*b636d99dSDavid van Moolenbroek __RCSID("$NetBSD: print-egp.c,v 1.4 2014/11/20 03:05:03 christos Exp $");
24*b636d99dSDavid van Moolenbroek #endif
25*b636d99dSDavid van Moolenbroek 
26*b636d99dSDavid van Moolenbroek #define NETDISSECT_REWORKED
27*b636d99dSDavid van Moolenbroek #ifdef HAVE_CONFIG_H
28*b636d99dSDavid van Moolenbroek #include "config.h"
29*b636d99dSDavid van Moolenbroek #endif
30*b636d99dSDavid van Moolenbroek 
31*b636d99dSDavid van Moolenbroek #include <tcpdump-stdinc.h>
32*b636d99dSDavid van Moolenbroek 
33*b636d99dSDavid van Moolenbroek #include "interface.h"
34*b636d99dSDavid van Moolenbroek #include "addrtoname.h"
35*b636d99dSDavid van Moolenbroek #include "extract.h"
36*b636d99dSDavid van Moolenbroek 
37*b636d99dSDavid van Moolenbroek struct egp_packet {
38*b636d99dSDavid van Moolenbroek 	uint8_t  egp_version;
39*b636d99dSDavid van Moolenbroek #define	EGP_VERSION	2
40*b636d99dSDavid van Moolenbroek 	uint8_t  egp_type;
41*b636d99dSDavid van Moolenbroek #define  EGPT_ACQUIRE	3
42*b636d99dSDavid van Moolenbroek #define  EGPT_REACH	5
43*b636d99dSDavid van Moolenbroek #define  EGPT_POLL	2
44*b636d99dSDavid van Moolenbroek #define  EGPT_UPDATE	1
45*b636d99dSDavid van Moolenbroek #define  EGPT_ERROR	8
46*b636d99dSDavid van Moolenbroek 	uint8_t  egp_code;
47*b636d99dSDavid van Moolenbroek #define  EGPC_REQUEST	0
48*b636d99dSDavid van Moolenbroek #define  EGPC_CONFIRM	1
49*b636d99dSDavid van Moolenbroek #define  EGPC_REFUSE	2
50*b636d99dSDavid van Moolenbroek #define  EGPC_CEASE	3
51*b636d99dSDavid van Moolenbroek #define  EGPC_CEASEACK	4
52*b636d99dSDavid van Moolenbroek #define  EGPC_HELLO	0
53*b636d99dSDavid van Moolenbroek #define  EGPC_HEARDU	1
54*b636d99dSDavid van Moolenbroek 	uint8_t  egp_status;
55*b636d99dSDavid van Moolenbroek #define  EGPS_UNSPEC	0
56*b636d99dSDavid van Moolenbroek #define  EGPS_ACTIVE	1
57*b636d99dSDavid van Moolenbroek #define  EGPS_PASSIVE	2
58*b636d99dSDavid van Moolenbroek #define  EGPS_NORES	3
59*b636d99dSDavid van Moolenbroek #define  EGPS_ADMIN	4
60*b636d99dSDavid van Moolenbroek #define  EGPS_GODOWN	5
61*b636d99dSDavid van Moolenbroek #define  EGPS_PARAM	6
62*b636d99dSDavid van Moolenbroek #define  EGPS_PROTO	7
63*b636d99dSDavid van Moolenbroek #define  EGPS_INDET	0
64*b636d99dSDavid van Moolenbroek #define  EGPS_UP	1
65*b636d99dSDavid van Moolenbroek #define  EGPS_DOWN	2
66*b636d99dSDavid van Moolenbroek #define  EGPS_UNSOL	0x80
67*b636d99dSDavid van Moolenbroek 	uint16_t  egp_checksum;
68*b636d99dSDavid van Moolenbroek 	uint16_t  egp_as;
69*b636d99dSDavid van Moolenbroek 	uint16_t  egp_sequence;
70*b636d99dSDavid van Moolenbroek 	union {
71*b636d99dSDavid van Moolenbroek 		uint16_t  egpu_hello;
72*b636d99dSDavid van Moolenbroek 		uint8_t egpu_gws[2];
73*b636d99dSDavid van Moolenbroek 		uint16_t  egpu_reason;
74*b636d99dSDavid van Moolenbroek #define  EGPR_UNSPEC	0
75*b636d99dSDavid van Moolenbroek #define  EGPR_BADHEAD	1
76*b636d99dSDavid van Moolenbroek #define  EGPR_BADDATA	2
77*b636d99dSDavid van Moolenbroek #define  EGPR_NOREACH	3
78*b636d99dSDavid van Moolenbroek #define  EGPR_XSPOLL	4
79*b636d99dSDavid van Moolenbroek #define  EGPR_NORESP	5
80*b636d99dSDavid van Moolenbroek #define  EGPR_UVERSION	6
81*b636d99dSDavid van Moolenbroek 	} egp_handg;
82*b636d99dSDavid van Moolenbroek #define  egp_hello  egp_handg.egpu_hello
83*b636d99dSDavid van Moolenbroek #define  egp_intgw  egp_handg.egpu_gws[0]
84*b636d99dSDavid van Moolenbroek #define  egp_extgw  egp_handg.egpu_gws[1]
85*b636d99dSDavid van Moolenbroek #define  egp_reason  egp_handg.egpu_reason
86*b636d99dSDavid van Moolenbroek 	union {
87*b636d99dSDavid van Moolenbroek 		uint16_t  egpu_poll;
88*b636d99dSDavid van Moolenbroek 		uint32_t egpu_sourcenet;
89*b636d99dSDavid van Moolenbroek 	} egp_pands;
90*b636d99dSDavid van Moolenbroek #define  egp_poll  egp_pands.egpu_poll
91*b636d99dSDavid van Moolenbroek #define  egp_sourcenet  egp_pands.egpu_sourcenet
92*b636d99dSDavid van Moolenbroek };
93*b636d99dSDavid van Moolenbroek 
94*b636d99dSDavid van Moolenbroek static const char *egp_acquire_codes[] = {
95*b636d99dSDavid van Moolenbroek 	"request",
96*b636d99dSDavid van Moolenbroek 	"confirm",
97*b636d99dSDavid van Moolenbroek 	"refuse",
98*b636d99dSDavid van Moolenbroek 	"cease",
99*b636d99dSDavid van Moolenbroek 	"cease_ack"
100*b636d99dSDavid van Moolenbroek };
101*b636d99dSDavid van Moolenbroek 
102*b636d99dSDavid van Moolenbroek static const char *egp_acquire_status[] = {
103*b636d99dSDavid van Moolenbroek 	"unspecified",
104*b636d99dSDavid van Moolenbroek 	"active_mode",
105*b636d99dSDavid van Moolenbroek 	"passive_mode",
106*b636d99dSDavid van Moolenbroek 	"insufficient_resources",
107*b636d99dSDavid van Moolenbroek 	"administratively_prohibited",
108*b636d99dSDavid van Moolenbroek 	"going_down",
109*b636d99dSDavid van Moolenbroek 	"parameter_violation",
110*b636d99dSDavid van Moolenbroek 	"protocol_violation"
111*b636d99dSDavid van Moolenbroek };
112*b636d99dSDavid van Moolenbroek 
113*b636d99dSDavid van Moolenbroek static const char *egp_reach_codes[] = {
114*b636d99dSDavid van Moolenbroek 	"hello",
115*b636d99dSDavid van Moolenbroek 	"i-h-u"
116*b636d99dSDavid van Moolenbroek };
117*b636d99dSDavid van Moolenbroek 
118*b636d99dSDavid van Moolenbroek static const char *egp_status_updown[] = {
119*b636d99dSDavid van Moolenbroek 	"indeterminate",
120*b636d99dSDavid van Moolenbroek 	"up",
121*b636d99dSDavid van Moolenbroek 	"down"
122*b636d99dSDavid van Moolenbroek };
123*b636d99dSDavid van Moolenbroek 
124*b636d99dSDavid van Moolenbroek static const char *egp_reasons[] = {
125*b636d99dSDavid van Moolenbroek 	"unspecified",
126*b636d99dSDavid van Moolenbroek 	"bad_EGP_header_format",
127*b636d99dSDavid van Moolenbroek 	"bad_EGP_data_field_format",
128*b636d99dSDavid van Moolenbroek 	"reachability_info_unavailable",
129*b636d99dSDavid van Moolenbroek 	"excessive_polling_rate",
130*b636d99dSDavid van Moolenbroek 	"no_response",
131*b636d99dSDavid van Moolenbroek 	"unsupported_version"
132*b636d99dSDavid van Moolenbroek };
133*b636d99dSDavid van Moolenbroek 
134*b636d99dSDavid van Moolenbroek static void
egpnrprint(netdissect_options * ndo,register const struct egp_packet * egp)135*b636d99dSDavid van Moolenbroek egpnrprint(netdissect_options *ndo,
136*b636d99dSDavid van Moolenbroek            register const struct egp_packet *egp)
137*b636d99dSDavid van Moolenbroek {
138*b636d99dSDavid van Moolenbroek 	register const uint8_t *cp;
139*b636d99dSDavid van Moolenbroek 	uint32_t addr;
140*b636d99dSDavid van Moolenbroek 	register uint32_t net;
141*b636d99dSDavid van Moolenbroek 	register u_int netlen;
142*b636d99dSDavid van Moolenbroek 	int gateways, distances, networks;
143*b636d99dSDavid van Moolenbroek 	int t_gateways;
144*b636d99dSDavid van Moolenbroek 	const char *comma;
145*b636d99dSDavid van Moolenbroek 
146*b636d99dSDavid van Moolenbroek 	addr = egp->egp_sourcenet;
147*b636d99dSDavid van Moolenbroek 	if (IN_CLASSA(addr)) {
148*b636d99dSDavid van Moolenbroek 		net = addr & IN_CLASSA_NET;
149*b636d99dSDavid van Moolenbroek 		netlen = 1;
150*b636d99dSDavid van Moolenbroek 	} else if (IN_CLASSB(addr)) {
151*b636d99dSDavid van Moolenbroek 		net = addr & IN_CLASSB_NET;
152*b636d99dSDavid van Moolenbroek 		netlen = 2;
153*b636d99dSDavid van Moolenbroek 	} else if (IN_CLASSC(addr)) {
154*b636d99dSDavid van Moolenbroek 		net = addr & IN_CLASSC_NET;
155*b636d99dSDavid van Moolenbroek 		netlen = 3;
156*b636d99dSDavid van Moolenbroek 	} else {
157*b636d99dSDavid van Moolenbroek 		net = 0;
158*b636d99dSDavid van Moolenbroek 		netlen = 0;
159*b636d99dSDavid van Moolenbroek 	}
160*b636d99dSDavid van Moolenbroek 	cp = (uint8_t *)(egp + 1);
161*b636d99dSDavid van Moolenbroek 
162*b636d99dSDavid van Moolenbroek 	t_gateways = egp->egp_intgw + egp->egp_extgw;
163*b636d99dSDavid van Moolenbroek 	for (gateways = 0; gateways < t_gateways; ++gateways) {
164*b636d99dSDavid van Moolenbroek 		/* Pickup host part of gateway address */
165*b636d99dSDavid van Moolenbroek 		addr = 0;
166*b636d99dSDavid van Moolenbroek 		ND_TCHECK2(cp[0], 4 - netlen);
167*b636d99dSDavid van Moolenbroek 		switch (netlen) {
168*b636d99dSDavid van Moolenbroek 
169*b636d99dSDavid van Moolenbroek 		case 1:
170*b636d99dSDavid van Moolenbroek 			addr = *cp++;
171*b636d99dSDavid van Moolenbroek 			/* fall through */
172*b636d99dSDavid van Moolenbroek 		case 2:
173*b636d99dSDavid van Moolenbroek 			addr = (addr << 8) | *cp++;
174*b636d99dSDavid van Moolenbroek 			/* fall through */
175*b636d99dSDavid van Moolenbroek 		case 3:
176*b636d99dSDavid van Moolenbroek 			addr = (addr << 8) | *cp++;
177*b636d99dSDavid van Moolenbroek 		}
178*b636d99dSDavid van Moolenbroek 		addr |= net;
179*b636d99dSDavid van Moolenbroek 		ND_TCHECK2(cp[0], 1);
180*b636d99dSDavid van Moolenbroek 		distances = *cp++;
181*b636d99dSDavid van Moolenbroek 		ND_PRINT((ndo, " %s %s ",
182*b636d99dSDavid van Moolenbroek 		       gateways < (int)egp->egp_intgw ? "int" : "ext",
183*b636d99dSDavid van Moolenbroek 		       ipaddr_string(ndo, &addr)));
184*b636d99dSDavid van Moolenbroek 
185*b636d99dSDavid van Moolenbroek 		comma = "";
186*b636d99dSDavid van Moolenbroek 		ND_PRINT((ndo, "("));
187*b636d99dSDavid van Moolenbroek 		while (--distances >= 0) {
188*b636d99dSDavid van Moolenbroek 			ND_TCHECK2(cp[0], 2);
189*b636d99dSDavid van Moolenbroek 			ND_PRINT((ndo, "%sd%d:", comma, (int)*cp++));
190*b636d99dSDavid van Moolenbroek 			comma = ", ";
191*b636d99dSDavid van Moolenbroek 			networks = *cp++;
192*b636d99dSDavid van Moolenbroek 			while (--networks >= 0) {
193*b636d99dSDavid van Moolenbroek 				/* Pickup network number */
194*b636d99dSDavid van Moolenbroek 				ND_TCHECK2(cp[0], 1);
195*b636d99dSDavid van Moolenbroek 				addr = (uint32_t)*cp++ << 24;
196*b636d99dSDavid van Moolenbroek 				if (IN_CLASSB(addr)) {
197*b636d99dSDavid van Moolenbroek 					ND_TCHECK2(cp[0], 1);
198*b636d99dSDavid van Moolenbroek 					addr |= (uint32_t)*cp++ << 16;
199*b636d99dSDavid van Moolenbroek 				} else if (!IN_CLASSA(addr)) {
200*b636d99dSDavid van Moolenbroek 					ND_TCHECK2(cp[0], 2);
201*b636d99dSDavid van Moolenbroek 					addr |= (uint32_t)*cp++ << 16;
202*b636d99dSDavid van Moolenbroek 					addr |= (uint32_t)*cp++ << 8;
203*b636d99dSDavid van Moolenbroek 				}
204*b636d99dSDavid van Moolenbroek 				ND_PRINT((ndo, " %s", ipaddr_string(ndo, &addr)));
205*b636d99dSDavid van Moolenbroek 			}
206*b636d99dSDavid van Moolenbroek 		}
207*b636d99dSDavid van Moolenbroek 		ND_PRINT((ndo, ")"));
208*b636d99dSDavid van Moolenbroek 	}
209*b636d99dSDavid van Moolenbroek 	return;
210*b636d99dSDavid van Moolenbroek trunc:
211*b636d99dSDavid van Moolenbroek 	ND_PRINT((ndo, "[|]"));
212*b636d99dSDavid van Moolenbroek }
213*b636d99dSDavid van Moolenbroek 
214*b636d99dSDavid van Moolenbroek void
egp_print(netdissect_options * ndo,register const uint8_t * bp,register u_int length)215*b636d99dSDavid van Moolenbroek egp_print(netdissect_options *ndo,
216*b636d99dSDavid van Moolenbroek           register const uint8_t *bp, register u_int length)
217*b636d99dSDavid van Moolenbroek {
218*b636d99dSDavid van Moolenbroek 	register const struct egp_packet *egp;
219*b636d99dSDavid van Moolenbroek 	register int status;
220*b636d99dSDavid van Moolenbroek 	register int code;
221*b636d99dSDavid van Moolenbroek 	register int type;
222*b636d99dSDavid van Moolenbroek 
223*b636d99dSDavid van Moolenbroek 	egp = (struct egp_packet *)bp;
224*b636d99dSDavid van Moolenbroek         if (!ND_TTEST2(*egp, length)) {
225*b636d99dSDavid van Moolenbroek 		ND_PRINT((ndo, "[|egp]"));
226*b636d99dSDavid van Moolenbroek 		return;
227*b636d99dSDavid van Moolenbroek 	}
228*b636d99dSDavid van Moolenbroek 
229*b636d99dSDavid van Moolenbroek         if (!ndo->ndo_vflag) {
230*b636d99dSDavid van Moolenbroek             ND_PRINT((ndo, "EGPv%u, AS %u, seq %u, length %u",
231*b636d99dSDavid van Moolenbroek                    egp->egp_version,
232*b636d99dSDavid van Moolenbroek                    EXTRACT_16BITS(&egp->egp_as),
233*b636d99dSDavid van Moolenbroek                    EXTRACT_16BITS(&egp->egp_sequence),
234*b636d99dSDavid van Moolenbroek                    length));
235*b636d99dSDavid van Moolenbroek             return;
236*b636d99dSDavid van Moolenbroek         } else
237*b636d99dSDavid van Moolenbroek             ND_PRINT((ndo, "EGPv%u, length %u",
238*b636d99dSDavid van Moolenbroek                    egp->egp_version,
239*b636d99dSDavid van Moolenbroek                    length));
240*b636d99dSDavid van Moolenbroek 
241*b636d99dSDavid van Moolenbroek 	if (egp->egp_version != EGP_VERSION) {
242*b636d99dSDavid van Moolenbroek 		ND_PRINT((ndo, "[version %d]", egp->egp_version));
243*b636d99dSDavid van Moolenbroek 		return;
244*b636d99dSDavid van Moolenbroek 	}
245*b636d99dSDavid van Moolenbroek 
246*b636d99dSDavid van Moolenbroek 	type = egp->egp_type;
247*b636d99dSDavid van Moolenbroek 	code = egp->egp_code;
248*b636d99dSDavid van Moolenbroek 	status = egp->egp_status;
249*b636d99dSDavid van Moolenbroek 
250*b636d99dSDavid van Moolenbroek 	switch (type) {
251*b636d99dSDavid van Moolenbroek 	case EGPT_ACQUIRE:
252*b636d99dSDavid van Moolenbroek 		ND_PRINT((ndo, " acquire"));
253*b636d99dSDavid van Moolenbroek 		switch (code) {
254*b636d99dSDavid van Moolenbroek 		case EGPC_REQUEST:
255*b636d99dSDavid van Moolenbroek 		case EGPC_CONFIRM:
256*b636d99dSDavid van Moolenbroek 			ND_PRINT((ndo, " %s", egp_acquire_codes[code]));
257*b636d99dSDavid van Moolenbroek 			switch (status) {
258*b636d99dSDavid van Moolenbroek 			case EGPS_UNSPEC:
259*b636d99dSDavid van Moolenbroek 			case EGPS_ACTIVE:
260*b636d99dSDavid van Moolenbroek 			case EGPS_PASSIVE:
261*b636d99dSDavid van Moolenbroek 				ND_PRINT((ndo, " %s", egp_acquire_status[status]));
262*b636d99dSDavid van Moolenbroek 				break;
263*b636d99dSDavid van Moolenbroek 
264*b636d99dSDavid van Moolenbroek 			default:
265*b636d99dSDavid van Moolenbroek 				ND_PRINT((ndo, " [status %d]", status));
266*b636d99dSDavid van Moolenbroek 				break;
267*b636d99dSDavid van Moolenbroek 			}
268*b636d99dSDavid van Moolenbroek 			ND_PRINT((ndo, " hello:%d poll:%d",
269*b636d99dSDavid van Moolenbroek 			       EXTRACT_16BITS(&egp->egp_hello),
270*b636d99dSDavid van Moolenbroek 			       EXTRACT_16BITS(&egp->egp_poll)));
271*b636d99dSDavid van Moolenbroek 			break;
272*b636d99dSDavid van Moolenbroek 
273*b636d99dSDavid van Moolenbroek 		case EGPC_REFUSE:
274*b636d99dSDavid van Moolenbroek 		case EGPC_CEASE:
275*b636d99dSDavid van Moolenbroek 		case EGPC_CEASEACK:
276*b636d99dSDavid van Moolenbroek 			ND_PRINT((ndo, " %s", egp_acquire_codes[code]));
277*b636d99dSDavid van Moolenbroek 			switch (status ) {
278*b636d99dSDavid van Moolenbroek 			case EGPS_UNSPEC:
279*b636d99dSDavid van Moolenbroek 			case EGPS_NORES:
280*b636d99dSDavid van Moolenbroek 			case EGPS_ADMIN:
281*b636d99dSDavid van Moolenbroek 			case EGPS_GODOWN:
282*b636d99dSDavid van Moolenbroek 			case EGPS_PARAM:
283*b636d99dSDavid van Moolenbroek 			case EGPS_PROTO:
284*b636d99dSDavid van Moolenbroek 				ND_PRINT((ndo, " %s", egp_acquire_status[status]));
285*b636d99dSDavid van Moolenbroek 				break;
286*b636d99dSDavid van Moolenbroek 
287*b636d99dSDavid van Moolenbroek 			default:
288*b636d99dSDavid van Moolenbroek 				ND_PRINT((ndo, "[status %d]", status));
289*b636d99dSDavid van Moolenbroek 				break;
290*b636d99dSDavid van Moolenbroek 			}
291*b636d99dSDavid van Moolenbroek 			break;
292*b636d99dSDavid van Moolenbroek 
293*b636d99dSDavid van Moolenbroek 		default:
294*b636d99dSDavid van Moolenbroek 			ND_PRINT((ndo, "[code %d]", code));
295*b636d99dSDavid van Moolenbroek 			break;
296*b636d99dSDavid van Moolenbroek 		}
297*b636d99dSDavid van Moolenbroek 		break;
298*b636d99dSDavid van Moolenbroek 
299*b636d99dSDavid van Moolenbroek 	case EGPT_REACH:
300*b636d99dSDavid van Moolenbroek 		switch (code) {
301*b636d99dSDavid van Moolenbroek 
302*b636d99dSDavid van Moolenbroek 		case EGPC_HELLO:
303*b636d99dSDavid van Moolenbroek 		case EGPC_HEARDU:
304*b636d99dSDavid van Moolenbroek 			ND_PRINT((ndo, " %s", egp_reach_codes[code]));
305*b636d99dSDavid van Moolenbroek 			if (status <= EGPS_DOWN)
306*b636d99dSDavid van Moolenbroek 				ND_PRINT((ndo, " state:%s", egp_status_updown[status]));
307*b636d99dSDavid van Moolenbroek 			else
308*b636d99dSDavid van Moolenbroek 				ND_PRINT((ndo, " [status %d]", status));
309*b636d99dSDavid van Moolenbroek 			break;
310*b636d99dSDavid van Moolenbroek 
311*b636d99dSDavid van Moolenbroek 		default:
312*b636d99dSDavid van Moolenbroek 			ND_PRINT((ndo, "[reach code %d]", code));
313*b636d99dSDavid van Moolenbroek 			break;
314*b636d99dSDavid van Moolenbroek 		}
315*b636d99dSDavid van Moolenbroek 		break;
316*b636d99dSDavid van Moolenbroek 
317*b636d99dSDavid van Moolenbroek 	case EGPT_POLL:
318*b636d99dSDavid van Moolenbroek 		ND_PRINT((ndo, " poll"));
319*b636d99dSDavid van Moolenbroek 		if (egp->egp_status <= EGPS_DOWN)
320*b636d99dSDavid van Moolenbroek 			ND_PRINT((ndo, " state:%s", egp_status_updown[status]));
321*b636d99dSDavid van Moolenbroek 		else
322*b636d99dSDavid van Moolenbroek 			ND_PRINT((ndo, " [status %d]", status));
323*b636d99dSDavid van Moolenbroek 		ND_PRINT((ndo, " net:%s", ipaddr_string(ndo, &egp->egp_sourcenet)));
324*b636d99dSDavid van Moolenbroek 		break;
325*b636d99dSDavid van Moolenbroek 
326*b636d99dSDavid van Moolenbroek 	case EGPT_UPDATE:
327*b636d99dSDavid van Moolenbroek 		ND_PRINT((ndo, " update"));
328*b636d99dSDavid van Moolenbroek 		if (status & EGPS_UNSOL) {
329*b636d99dSDavid van Moolenbroek 			status &= ~EGPS_UNSOL;
330*b636d99dSDavid van Moolenbroek 			ND_PRINT((ndo, " unsolicited"));
331*b636d99dSDavid van Moolenbroek 		}
332*b636d99dSDavid van Moolenbroek 		if (status <= EGPS_DOWN)
333*b636d99dSDavid van Moolenbroek 			ND_PRINT((ndo, " state:%s", egp_status_updown[status]));
334*b636d99dSDavid van Moolenbroek 		else
335*b636d99dSDavid van Moolenbroek 			ND_PRINT((ndo, " [status %d]", status));
336*b636d99dSDavid van Moolenbroek 		ND_PRINT((ndo, " %s int %d ext %d",
337*b636d99dSDavid van Moolenbroek 		       ipaddr_string(ndo, &egp->egp_sourcenet),
338*b636d99dSDavid van Moolenbroek 		       egp->egp_intgw,
339*b636d99dSDavid van Moolenbroek 		       egp->egp_extgw));
340*b636d99dSDavid van Moolenbroek 		if (ndo->ndo_vflag)
341*b636d99dSDavid van Moolenbroek 			egpnrprint(ndo, egp);
342*b636d99dSDavid van Moolenbroek 		break;
343*b636d99dSDavid van Moolenbroek 
344*b636d99dSDavid van Moolenbroek 	case EGPT_ERROR:
345*b636d99dSDavid van Moolenbroek 		ND_PRINT((ndo, " error"));
346*b636d99dSDavid van Moolenbroek 		if (status <= EGPS_DOWN)
347*b636d99dSDavid van Moolenbroek 			ND_PRINT((ndo, " state:%s", egp_status_updown[status]));
348*b636d99dSDavid van Moolenbroek 		else
349*b636d99dSDavid van Moolenbroek 			ND_PRINT((ndo, " [status %d]", status));
350*b636d99dSDavid van Moolenbroek 
351*b636d99dSDavid van Moolenbroek 		if (EXTRACT_16BITS(&egp->egp_reason) <= EGPR_UVERSION)
352*b636d99dSDavid van Moolenbroek 			ND_PRINT((ndo, " %s", egp_reasons[EXTRACT_16BITS(&egp->egp_reason)]));
353*b636d99dSDavid van Moolenbroek 		else
354*b636d99dSDavid van Moolenbroek 			ND_PRINT((ndo, " [reason %d]", EXTRACT_16BITS(&egp->egp_reason)));
355*b636d99dSDavid van Moolenbroek 		break;
356*b636d99dSDavid van Moolenbroek 
357*b636d99dSDavid van Moolenbroek 	default:
358*b636d99dSDavid van Moolenbroek 		ND_PRINT((ndo, "[type %d]", type));
359*b636d99dSDavid van Moolenbroek 		break;
360*b636d99dSDavid van Moolenbroek 	}
361*b636d99dSDavid van Moolenbroek }
362