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