xref: /dflybsd-src/contrib/tcpdump/print-egp.c (revision 59c07fbdf8168fa08c76c515186d561b5a92690c)
141c99275SPeter Avalos /*
241c99275SPeter Avalos  * Copyright (c) 1991, 1992, 1993, 1994, 1995, 1996
341c99275SPeter Avalos  *	The Regents of the University of California.  All rights reserved.
441c99275SPeter Avalos  *
541c99275SPeter Avalos  * Redistribution and use in source and binary forms are permitted
641c99275SPeter Avalos  * provided that the above copyright notice and this paragraph are
741c99275SPeter Avalos  * duplicated in all such forms and that any documentation,
841c99275SPeter Avalos  * advertising materials, and other materials related to such
941c99275SPeter Avalos  * distribution and use acknowledge that the software was developed
1041c99275SPeter Avalos  * by the University of California, Lawrence Berkeley Laboratory,
1141c99275SPeter Avalos  * Berkeley, CA.  The name of the University may not be used to
1241c99275SPeter Avalos  * endorse or promote products derived from this software without
1341c99275SPeter Avalos  * specific prior written permission.
1441c99275SPeter Avalos  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
1541c99275SPeter Avalos  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
1641c99275SPeter Avalos  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
1741c99275SPeter Avalos  *
1841c99275SPeter Avalos  * Initial contribution from Jeff Honig (jch@MITCHELL.CIT.CORNELL.EDU).
1941c99275SPeter Avalos  */
2041c99275SPeter Avalos 
21411677aeSAaron LI /* \summary: Exterior Gateway Protocol (EGP) printer */
2241c99275SPeter Avalos 
23*ed775ee7SAntonio Huete Jimenez /* specification: RFC 827 */
24*ed775ee7SAntonio Huete Jimenez 
2541c99275SPeter Avalos #ifdef HAVE_CONFIG_H
26*ed775ee7SAntonio Huete Jimenez #include <config.h>
2741c99275SPeter Avalos #endif
2841c99275SPeter Avalos 
29*ed775ee7SAntonio Huete Jimenez #include "netdissect-stdinc.h"
3041c99275SPeter Avalos 
31411677aeSAaron LI #include "netdissect.h"
3241c99275SPeter Avalos #include "addrtoname.h"
3341c99275SPeter Avalos #include "extract.h"
3441c99275SPeter Avalos 
3541c99275SPeter Avalos struct egp_packet {
36*ed775ee7SAntonio Huete Jimenez 	nd_uint8_t  egp_version;
3741c99275SPeter Avalos #define	EGP_VERSION	2
38*ed775ee7SAntonio Huete Jimenez 	nd_uint8_t  egp_type;
3941c99275SPeter Avalos #define  EGPT_ACQUIRE	3
4041c99275SPeter Avalos #define  EGPT_REACH	5
4141c99275SPeter Avalos #define  EGPT_POLL	2
4241c99275SPeter Avalos #define  EGPT_UPDATE	1
4341c99275SPeter Avalos #define  EGPT_ERROR	8
44*ed775ee7SAntonio Huete Jimenez 	nd_uint8_t  egp_code;
4541c99275SPeter Avalos #define  EGPC_REQUEST	0
4641c99275SPeter Avalos #define  EGPC_CONFIRM	1
4741c99275SPeter Avalos #define  EGPC_REFUSE	2
4841c99275SPeter Avalos #define  EGPC_CEASE	3
4941c99275SPeter Avalos #define  EGPC_CEASEACK	4
5041c99275SPeter Avalos #define  EGPC_HELLO	0
5141c99275SPeter Avalos #define  EGPC_HEARDU	1
52*ed775ee7SAntonio Huete Jimenez 	nd_uint8_t  egp_status;
5341c99275SPeter Avalos #define  EGPS_UNSPEC	0
5441c99275SPeter Avalos #define  EGPS_ACTIVE	1
5541c99275SPeter Avalos #define  EGPS_PASSIVE	2
5641c99275SPeter Avalos #define  EGPS_NORES	3
5741c99275SPeter Avalos #define  EGPS_ADMIN	4
5841c99275SPeter Avalos #define  EGPS_GODOWN	5
5941c99275SPeter Avalos #define  EGPS_PARAM	6
6041c99275SPeter Avalos #define  EGPS_PROTO	7
6141c99275SPeter Avalos #define  EGPS_INDET	0
6241c99275SPeter Avalos #define  EGPS_UP	1
6341c99275SPeter Avalos #define  EGPS_DOWN	2
6441c99275SPeter Avalos #define  EGPS_UNSOL	0x80
65*ed775ee7SAntonio Huete Jimenez 	nd_uint16_t  egp_checksum;
66*ed775ee7SAntonio Huete Jimenez 	nd_uint16_t  egp_as;
67*ed775ee7SAntonio Huete Jimenez 	nd_uint16_t  egp_sequence;
6841c99275SPeter Avalos 	union {
69*ed775ee7SAntonio Huete Jimenez 		nd_uint16_t egpu_hello;
70*ed775ee7SAntonio Huete Jimenez 		nd_uint8_t  egpu_gws[2];
71*ed775ee7SAntonio Huete Jimenez 		nd_uint16_t egpu_reason;
7241c99275SPeter Avalos #define  EGPR_UNSPEC	0
7341c99275SPeter Avalos #define  EGPR_BADHEAD	1
7441c99275SPeter Avalos #define  EGPR_BADDATA	2
7541c99275SPeter Avalos #define  EGPR_NOREACH	3
7641c99275SPeter Avalos #define  EGPR_XSPOLL	4
7741c99275SPeter Avalos #define  EGPR_NORESP	5
7841c99275SPeter Avalos #define  EGPR_UVERSION	6
7941c99275SPeter Avalos 	} egp_handg;
8041c99275SPeter Avalos #define  egp_hello  egp_handg.egpu_hello
8141c99275SPeter Avalos #define  egp_intgw  egp_handg.egpu_gws[0]
8241c99275SPeter Avalos #define  egp_extgw  egp_handg.egpu_gws[1]
8341c99275SPeter Avalos #define  egp_reason  egp_handg.egpu_reason
8441c99275SPeter Avalos 	union {
85*ed775ee7SAntonio Huete Jimenez 		nd_uint16_t egpu_poll;
86*ed775ee7SAntonio Huete Jimenez 		nd_ipv4 egpu_sourcenet;
8741c99275SPeter Avalos 	} egp_pands;
8841c99275SPeter Avalos #define  egp_poll  egp_pands.egpu_poll
8941c99275SPeter Avalos #define  egp_sourcenet  egp_pands.egpu_sourcenet
9041c99275SPeter Avalos };
9141c99275SPeter Avalos 
92411677aeSAaron LI static const char *egp_acquire_codes[] = {
9341c99275SPeter Avalos 	"request",
9441c99275SPeter Avalos 	"confirm",
9541c99275SPeter Avalos 	"refuse",
9641c99275SPeter Avalos 	"cease",
9741c99275SPeter Avalos 	"cease_ack"
9841c99275SPeter Avalos };
9941c99275SPeter Avalos 
100411677aeSAaron LI static const char *egp_acquire_status[] = {
10141c99275SPeter Avalos 	"unspecified",
10241c99275SPeter Avalos 	"active_mode",
10341c99275SPeter Avalos 	"passive_mode",
10441c99275SPeter Avalos 	"insufficient_resources",
10541c99275SPeter Avalos 	"administratively_prohibited",
10641c99275SPeter Avalos 	"going_down",
10741c99275SPeter Avalos 	"parameter_violation",
10841c99275SPeter Avalos 	"protocol_violation"
10941c99275SPeter Avalos };
11041c99275SPeter Avalos 
111411677aeSAaron LI static const char *egp_reach_codes[] = {
11241c99275SPeter Avalos 	"hello",
11341c99275SPeter Avalos 	"i-h-u"
11441c99275SPeter Avalos };
11541c99275SPeter Avalos 
116411677aeSAaron LI static const char *egp_status_updown[] = {
11741c99275SPeter Avalos 	"indeterminate",
11841c99275SPeter Avalos 	"up",
11941c99275SPeter Avalos 	"down"
12041c99275SPeter Avalos };
12141c99275SPeter Avalos 
122411677aeSAaron LI static const char *egp_reasons[] = {
12341c99275SPeter Avalos 	"unspecified",
12441c99275SPeter Avalos 	"bad_EGP_header_format",
12541c99275SPeter Avalos 	"bad_EGP_data_field_format",
12641c99275SPeter Avalos 	"reachability_info_unavailable",
12741c99275SPeter Avalos 	"excessive_polling_rate",
12841c99275SPeter Avalos 	"no_response",
12941c99275SPeter Avalos 	"unsupported_version"
13041c99275SPeter Avalos };
13141c99275SPeter Avalos 
13241c99275SPeter Avalos static void
egpnr_print(netdissect_options * ndo,const struct egp_packet * egp,u_int length)133*ed775ee7SAntonio Huete Jimenez egpnr_print(netdissect_options *ndo,
134*ed775ee7SAntonio Huete Jimenez            const struct egp_packet *egp, u_int length)
13541c99275SPeter Avalos {
136*ed775ee7SAntonio Huete Jimenez 	const uint8_t *cp;
137411677aeSAaron LI 	uint32_t addr;
138*ed775ee7SAntonio Huete Jimenez 	uint32_t net;
139*ed775ee7SAntonio Huete Jimenez 	u_int netlen;
140*ed775ee7SAntonio Huete Jimenez 	u_int gateways, distances, networks;
141*ed775ee7SAntonio Huete Jimenez 	u_int intgw, extgw, t_gateways;
14241c99275SPeter Avalos 	const char *comma;
14341c99275SPeter Avalos 
144*ed775ee7SAntonio Huete Jimenez 	addr = GET_IPV4_TO_NETWORK_ORDER(egp->egp_sourcenet);
14541c99275SPeter Avalos 	if (IN_CLASSA(addr)) {
14641c99275SPeter Avalos 		net = addr & IN_CLASSA_NET;
14741c99275SPeter Avalos 		netlen = 1;
14841c99275SPeter Avalos 	} else if (IN_CLASSB(addr)) {
14941c99275SPeter Avalos 		net = addr & IN_CLASSB_NET;
15041c99275SPeter Avalos 		netlen = 2;
15141c99275SPeter Avalos 	} else if (IN_CLASSC(addr)) {
15241c99275SPeter Avalos 		net = addr & IN_CLASSC_NET;
15341c99275SPeter Avalos 		netlen = 3;
15441c99275SPeter Avalos 	} else {
15541c99275SPeter Avalos 		net = 0;
15641c99275SPeter Avalos 		netlen = 0;
15741c99275SPeter Avalos 	}
158411677aeSAaron LI 	cp = (const uint8_t *)(egp + 1);
159411677aeSAaron LI 	length -= sizeof(*egp);
16041c99275SPeter Avalos 
161*ed775ee7SAntonio Huete Jimenez 	intgw = GET_U_1(egp->egp_intgw);
162*ed775ee7SAntonio Huete Jimenez 	extgw = GET_U_1(egp->egp_extgw);
163*ed775ee7SAntonio Huete Jimenez 	t_gateways = intgw + extgw;
16441c99275SPeter Avalos 	for (gateways = 0; gateways < t_gateways; ++gateways) {
16541c99275SPeter Avalos 		/* Pickup host part of gateway address */
16641c99275SPeter Avalos 		addr = 0;
167411677aeSAaron LI 		if (length < 4 - netlen)
168411677aeSAaron LI 			goto trunc;
169*ed775ee7SAntonio Huete Jimenez 		ND_TCHECK_LEN(cp, 4 - netlen);
17041c99275SPeter Avalos 		switch (netlen) {
17141c99275SPeter Avalos 
17241c99275SPeter Avalos 		case 1:
173*ed775ee7SAntonio Huete Jimenez 			addr = GET_U_1(cp);
174*ed775ee7SAntonio Huete Jimenez 			cp++;
17541c99275SPeter Avalos 			/* fall through */
17641c99275SPeter Avalos 		case 2:
177*ed775ee7SAntonio Huete Jimenez 			addr = (addr << 8) | GET_U_1(cp);
178*ed775ee7SAntonio Huete Jimenez 			cp++;
17941c99275SPeter Avalos 			/* fall through */
18041c99275SPeter Avalos 		case 3:
181*ed775ee7SAntonio Huete Jimenez 			addr = (addr << 8) | GET_U_1(cp);
182*ed775ee7SAntonio Huete Jimenez 			cp++;
183*ed775ee7SAntonio Huete Jimenez 			break;
18441c99275SPeter Avalos 		}
18541c99275SPeter Avalos 		addr |= net;
186411677aeSAaron LI 		length -= 4 - netlen;
187411677aeSAaron LI 		if (length < 1)
188411677aeSAaron LI 			goto trunc;
189*ed775ee7SAntonio Huete Jimenez 		distances = GET_U_1(cp);
190*ed775ee7SAntonio Huete Jimenez 		cp++;
191411677aeSAaron LI 		length--;
192*ed775ee7SAntonio Huete Jimenez 		ND_PRINT(" %s %s ",
193*ed775ee7SAntonio Huete Jimenez 		       gateways < intgw ? "int" : "ext",
194*ed775ee7SAntonio Huete Jimenez 		       ipaddr_string(ndo, (const u_char *)&addr));
19541c99275SPeter Avalos 
19641c99275SPeter Avalos 		comma = "";
197*ed775ee7SAntonio Huete Jimenez 		ND_PRINT("(");
198*ed775ee7SAntonio Huete Jimenez 		while (distances != 0) {
199411677aeSAaron LI 			if (length < 2)
200411677aeSAaron LI 				goto trunc;
201*ed775ee7SAntonio Huete Jimenez 			ND_PRINT("%sd%u:", comma, GET_U_1(cp));
202*ed775ee7SAntonio Huete Jimenez 			cp++;
20341c99275SPeter Avalos 			comma = ", ";
204*ed775ee7SAntonio Huete Jimenez 			networks = GET_U_1(cp);
205*ed775ee7SAntonio Huete Jimenez 			cp++;
206411677aeSAaron LI 			length -= 2;
207*ed775ee7SAntonio Huete Jimenez 			while (networks != 0) {
20841c99275SPeter Avalos 				/* Pickup network number */
209411677aeSAaron LI 				if (length < 1)
210411677aeSAaron LI 					goto trunc;
211*ed775ee7SAntonio Huete Jimenez 				addr = ((uint32_t) GET_U_1(cp)) << 24;
212*ed775ee7SAntonio Huete Jimenez 				cp++;
213411677aeSAaron LI 				length--;
21441c99275SPeter Avalos 				if (IN_CLASSB(addr)) {
215411677aeSAaron LI 					if (length < 1)
216411677aeSAaron LI 						goto trunc;
217*ed775ee7SAntonio Huete Jimenez 					addr |= ((uint32_t) GET_U_1(cp)) << 16;
218*ed775ee7SAntonio Huete Jimenez 					cp++;
219411677aeSAaron LI 					length--;
22041c99275SPeter Avalos 				} else if (!IN_CLASSA(addr)) {
221411677aeSAaron LI 					if (length < 2)
222411677aeSAaron LI 						goto trunc;
223*ed775ee7SAntonio Huete Jimenez 					addr |= ((uint32_t) GET_U_1(cp)) << 16;
224*ed775ee7SAntonio Huete Jimenez 					cp++;
225*ed775ee7SAntonio Huete Jimenez 					addr |= ((uint32_t) GET_U_1(cp)) << 8;
226*ed775ee7SAntonio Huete Jimenez 					cp++;
227411677aeSAaron LI 					length -= 2;
22841c99275SPeter Avalos 				}
229*ed775ee7SAntonio Huete Jimenez 				ND_PRINT(" %s", ipaddr_string(ndo, (const u_char *)&addr));
230*ed775ee7SAntonio Huete Jimenez 				networks--;
23141c99275SPeter Avalos 			}
232*ed775ee7SAntonio Huete Jimenez 			distances--;
23341c99275SPeter Avalos 		}
234*ed775ee7SAntonio Huete Jimenez 		ND_PRINT(")");
23541c99275SPeter Avalos 	}
23641c99275SPeter Avalos 	return;
23741c99275SPeter Avalos trunc:
238*ed775ee7SAntonio Huete Jimenez 	nd_print_trunc(ndo);
23941c99275SPeter Avalos }
24041c99275SPeter Avalos 
24141c99275SPeter Avalos void
egp_print(netdissect_options * ndo,const uint8_t * bp,u_int length)242411677aeSAaron LI egp_print(netdissect_options *ndo,
243*ed775ee7SAntonio Huete Jimenez           const uint8_t *bp, u_int length)
24441c99275SPeter Avalos {
245*ed775ee7SAntonio Huete Jimenez 	const struct egp_packet *egp;
246*ed775ee7SAntonio Huete Jimenez 	u_int version;
247*ed775ee7SAntonio Huete Jimenez 	u_int type;
248*ed775ee7SAntonio Huete Jimenez 	u_int code;
249*ed775ee7SAntonio Huete Jimenez 	u_int status;
25041c99275SPeter Avalos 
251*ed775ee7SAntonio Huete Jimenez 	ndo->ndo_protocol = "egp";
252411677aeSAaron LI 	egp = (const struct egp_packet *)bp;
253*ed775ee7SAntonio Huete Jimenez 	if (length < sizeof(*egp) || !ND_TTEST_SIZE(egp)) {
254*ed775ee7SAntonio Huete Jimenez 		nd_print_trunc(ndo);
25541c99275SPeter Avalos 		return;
25641c99275SPeter Avalos 	}
257ea7b4bf5SPeter Avalos 
258*ed775ee7SAntonio Huete Jimenez 	version = GET_U_1(egp->egp_version);
259411677aeSAaron LI         if (!ndo->ndo_vflag) {
260*ed775ee7SAntonio Huete Jimenez             ND_PRINT("EGPv%u, AS %u, seq %u, length %u",
261*ed775ee7SAntonio Huete Jimenez                    version,
262*ed775ee7SAntonio Huete Jimenez                    GET_BE_U_2(egp->egp_as),
263*ed775ee7SAntonio Huete Jimenez                    GET_BE_U_2(egp->egp_sequence),
264*ed775ee7SAntonio Huete Jimenez                    length);
265ea7b4bf5SPeter Avalos             return;
266ea7b4bf5SPeter Avalos         } else
267*ed775ee7SAntonio Huete Jimenez             ND_PRINT("EGPv%u, length %u",
268*ed775ee7SAntonio Huete Jimenez                    version,
269*ed775ee7SAntonio Huete Jimenez                    length);
27041c99275SPeter Avalos 
271*ed775ee7SAntonio Huete Jimenez 	if (version != EGP_VERSION) {
272*ed775ee7SAntonio Huete Jimenez 		ND_PRINT("[version %u]", version);
27341c99275SPeter Avalos 		return;
27441c99275SPeter Avalos 	}
27541c99275SPeter Avalos 
276*ed775ee7SAntonio Huete Jimenez 	type = GET_U_1(egp->egp_type);
277*ed775ee7SAntonio Huete Jimenez 	code = GET_U_1(egp->egp_code);
278*ed775ee7SAntonio Huete Jimenez 	status = GET_U_1(egp->egp_status);
27941c99275SPeter Avalos 
28041c99275SPeter Avalos 	switch (type) {
28141c99275SPeter Avalos 	case EGPT_ACQUIRE:
282*ed775ee7SAntonio Huete Jimenez 		ND_PRINT(" acquire");
28341c99275SPeter Avalos 		switch (code) {
28441c99275SPeter Avalos 		case EGPC_REQUEST:
28541c99275SPeter Avalos 		case EGPC_CONFIRM:
286*ed775ee7SAntonio Huete Jimenez 			ND_PRINT(" %s", egp_acquire_codes[code]);
28741c99275SPeter Avalos 			switch (status) {
28841c99275SPeter Avalos 			case EGPS_UNSPEC:
28941c99275SPeter Avalos 			case EGPS_ACTIVE:
29041c99275SPeter Avalos 			case EGPS_PASSIVE:
291*ed775ee7SAntonio Huete Jimenez 				ND_PRINT(" %s", egp_acquire_status[status]);
29241c99275SPeter Avalos 				break;
29341c99275SPeter Avalos 
29441c99275SPeter Avalos 			default:
295*ed775ee7SAntonio Huete Jimenez 				ND_PRINT(" [status %u]", status);
29641c99275SPeter Avalos 				break;
29741c99275SPeter Avalos 			}
298*ed775ee7SAntonio Huete Jimenez 			ND_PRINT(" hello:%u poll:%u",
299*ed775ee7SAntonio Huete Jimenez 			       GET_BE_U_2(egp->egp_hello),
300*ed775ee7SAntonio Huete Jimenez 			       GET_BE_U_2(egp->egp_poll));
30141c99275SPeter Avalos 			break;
30241c99275SPeter Avalos 
30341c99275SPeter Avalos 		case EGPC_REFUSE:
30441c99275SPeter Avalos 		case EGPC_CEASE:
30541c99275SPeter Avalos 		case EGPC_CEASEACK:
306*ed775ee7SAntonio Huete Jimenez 			ND_PRINT(" %s", egp_acquire_codes[code]);
30741c99275SPeter Avalos 			switch (status ) {
30841c99275SPeter Avalos 			case EGPS_UNSPEC:
30941c99275SPeter Avalos 			case EGPS_NORES:
31041c99275SPeter Avalos 			case EGPS_ADMIN:
31141c99275SPeter Avalos 			case EGPS_GODOWN:
31241c99275SPeter Avalos 			case EGPS_PARAM:
31341c99275SPeter Avalos 			case EGPS_PROTO:
314*ed775ee7SAntonio Huete Jimenez 				ND_PRINT(" %s", egp_acquire_status[status]);
31541c99275SPeter Avalos 				break;
31641c99275SPeter Avalos 
31741c99275SPeter Avalos 			default:
318*ed775ee7SAntonio Huete Jimenez 				ND_PRINT("[status %u]", status);
31941c99275SPeter Avalos 				break;
32041c99275SPeter Avalos 			}
32141c99275SPeter Avalos 			break;
32241c99275SPeter Avalos 
32341c99275SPeter Avalos 		default:
324*ed775ee7SAntonio Huete Jimenez 			ND_PRINT("[code %u]", code);
32541c99275SPeter Avalos 			break;
32641c99275SPeter Avalos 		}
32741c99275SPeter Avalos 		break;
32841c99275SPeter Avalos 
32941c99275SPeter Avalos 	case EGPT_REACH:
33041c99275SPeter Avalos 		switch (code) {
33141c99275SPeter Avalos 
33241c99275SPeter Avalos 		case EGPC_HELLO:
33341c99275SPeter Avalos 		case EGPC_HEARDU:
334*ed775ee7SAntonio Huete Jimenez 			ND_PRINT(" %s", egp_reach_codes[code]);
33541c99275SPeter Avalos 			if (status <= EGPS_DOWN)
336*ed775ee7SAntonio Huete Jimenez 				ND_PRINT(" state:%s", egp_status_updown[status]);
33741c99275SPeter Avalos 			else
338*ed775ee7SAntonio Huete Jimenez 				ND_PRINT(" [status %u]", status);
33941c99275SPeter Avalos 			break;
34041c99275SPeter Avalos 
34141c99275SPeter Avalos 		default:
342*ed775ee7SAntonio Huete Jimenez 			ND_PRINT("[reach code %u]", code);
34341c99275SPeter Avalos 			break;
34441c99275SPeter Avalos 		}
34541c99275SPeter Avalos 		break;
34641c99275SPeter Avalos 
34741c99275SPeter Avalos 	case EGPT_POLL:
348*ed775ee7SAntonio Huete Jimenez 		ND_PRINT(" poll");
349*ed775ee7SAntonio Huete Jimenez 		if (status <= EGPS_DOWN)
350*ed775ee7SAntonio Huete Jimenez 			ND_PRINT(" state:%s", egp_status_updown[status]);
35141c99275SPeter Avalos 		else
352*ed775ee7SAntonio Huete Jimenez 			ND_PRINT(" [status %u]", status);
353*ed775ee7SAntonio Huete Jimenez 		ND_PRINT(" net:%s", GET_IPADDR_STRING(egp->egp_sourcenet));
35441c99275SPeter Avalos 		break;
35541c99275SPeter Avalos 
35641c99275SPeter Avalos 	case EGPT_UPDATE:
357*ed775ee7SAntonio Huete Jimenez 		ND_PRINT(" update");
35841c99275SPeter Avalos 		if (status & EGPS_UNSOL) {
35941c99275SPeter Avalos 			status &= ~EGPS_UNSOL;
360*ed775ee7SAntonio Huete Jimenez 			ND_PRINT(" unsolicited");
36141c99275SPeter Avalos 		}
36241c99275SPeter Avalos 		if (status <= EGPS_DOWN)
363*ed775ee7SAntonio Huete Jimenez 			ND_PRINT(" state:%s", egp_status_updown[status]);
36441c99275SPeter Avalos 		else
365*ed775ee7SAntonio Huete Jimenez 			ND_PRINT(" [status %u]", status);
366*ed775ee7SAntonio Huete Jimenez 		ND_PRINT(" %s int %u ext %u",
367*ed775ee7SAntonio Huete Jimenez 		       GET_IPADDR_STRING(egp->egp_sourcenet),
368*ed775ee7SAntonio Huete Jimenez 		       GET_U_1(egp->egp_intgw),
369*ed775ee7SAntonio Huete Jimenez 		       GET_U_1(egp->egp_extgw));
370411677aeSAaron LI 		if (ndo->ndo_vflag)
371*ed775ee7SAntonio Huete Jimenez 			egpnr_print(ndo, egp, length);
37241c99275SPeter Avalos 		break;
37341c99275SPeter Avalos 
37441c99275SPeter Avalos 	case EGPT_ERROR:
375*ed775ee7SAntonio Huete Jimenez 		ND_PRINT(" error");
37641c99275SPeter Avalos 		if (status <= EGPS_DOWN)
377*ed775ee7SAntonio Huete Jimenez 			ND_PRINT(" state:%s", egp_status_updown[status]);
37841c99275SPeter Avalos 		else
379*ed775ee7SAntonio Huete Jimenez 			ND_PRINT(" [status %u]", status);
38041c99275SPeter Avalos 
381*ed775ee7SAntonio Huete Jimenez 		if (GET_BE_U_2(egp->egp_reason) <= EGPR_UVERSION)
382*ed775ee7SAntonio Huete Jimenez 			ND_PRINT(" %s",
383*ed775ee7SAntonio Huete Jimenez 				 egp_reasons[GET_BE_U_2(egp->egp_reason)]);
38441c99275SPeter Avalos 		else
385*ed775ee7SAntonio Huete Jimenez 			ND_PRINT(" [reason %u]", GET_BE_U_2(egp->egp_reason));
38641c99275SPeter Avalos 		break;
38741c99275SPeter Avalos 
38841c99275SPeter Avalos 	default:
389*ed775ee7SAntonio Huete Jimenez 		ND_PRINT("[type %u]", type);
39041c99275SPeter Avalos 		break;
39141c99275SPeter Avalos 	}
39241c99275SPeter Avalos }
393