1*66dfcc85SDavid van Moolenbroek /* $NetBSD: atalk.c,v 1.16 2015/06/06 13:08:31 joerg Exp $ */
2*66dfcc85SDavid van Moolenbroek
3*66dfcc85SDavid van Moolenbroek /*
4*66dfcc85SDavid van Moolenbroek * Copyright (c) 1983, 1988, 1993
5*66dfcc85SDavid van Moolenbroek * The Regents of the University of California. All rights reserved.
6*66dfcc85SDavid van Moolenbroek *
7*66dfcc85SDavid van Moolenbroek * Redistribution and use in source and binary forms, with or without
8*66dfcc85SDavid van Moolenbroek * modification, are permitted provided that the following conditions
9*66dfcc85SDavid van Moolenbroek * are met:
10*66dfcc85SDavid van Moolenbroek * 1. Redistributions of source code must retain the above copyright
11*66dfcc85SDavid van Moolenbroek * notice, this list of conditions and the following disclaimer.
12*66dfcc85SDavid van Moolenbroek * 2. Redistributions in binary form must reproduce the above copyright
13*66dfcc85SDavid van Moolenbroek * notice, this list of conditions and the following disclaimer in the
14*66dfcc85SDavid van Moolenbroek * documentation and/or other materials provided with the distribution.
15*66dfcc85SDavid van Moolenbroek * 3. Neither the name of the University nor the names of its contributors
16*66dfcc85SDavid van Moolenbroek * may be used to endorse or promote products derived from this software
17*66dfcc85SDavid van Moolenbroek * without specific prior written permission.
18*66dfcc85SDavid van Moolenbroek *
19*66dfcc85SDavid van Moolenbroek * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20*66dfcc85SDavid van Moolenbroek * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21*66dfcc85SDavid van Moolenbroek * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22*66dfcc85SDavid van Moolenbroek * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23*66dfcc85SDavid van Moolenbroek * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24*66dfcc85SDavid van Moolenbroek * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25*66dfcc85SDavid van Moolenbroek * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26*66dfcc85SDavid van Moolenbroek * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27*66dfcc85SDavid van Moolenbroek * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28*66dfcc85SDavid van Moolenbroek * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29*66dfcc85SDavid van Moolenbroek * SUCH DAMAGE.
30*66dfcc85SDavid van Moolenbroek */
31*66dfcc85SDavid van Moolenbroek
32*66dfcc85SDavid van Moolenbroek #include <sys/cdefs.h>
33*66dfcc85SDavid van Moolenbroek #ifndef lint
34*66dfcc85SDavid van Moolenbroek #if 0
35*66dfcc85SDavid van Moolenbroek static char sccsid[] = "from @(#)atalk.c 1.1 (Whistle) 6/6/96";
36*66dfcc85SDavid van Moolenbroek #else
37*66dfcc85SDavid van Moolenbroek __RCSID("$NetBSD: atalk.c,v 1.16 2015/06/06 13:08:31 joerg Exp $");
38*66dfcc85SDavid van Moolenbroek #endif
39*66dfcc85SDavid van Moolenbroek #endif /* not lint */
40*66dfcc85SDavid van Moolenbroek
41*66dfcc85SDavid van Moolenbroek #include <sys/param.h>
42*66dfcc85SDavid van Moolenbroek #include <sys/queue.h>
43*66dfcc85SDavid van Moolenbroek #include <sys/socket.h>
44*66dfcc85SDavid van Moolenbroek #include <sys/socketvar.h>
45*66dfcc85SDavid van Moolenbroek #include <sys/mbuf.h>
46*66dfcc85SDavid van Moolenbroek #include <sys/protosw.h>
47*66dfcc85SDavid van Moolenbroek #include <sys/sysctl.h>
48*66dfcc85SDavid van Moolenbroek
49*66dfcc85SDavid van Moolenbroek #include <net/route.h>
50*66dfcc85SDavid van Moolenbroek #include <net/if.h>
51*66dfcc85SDavid van Moolenbroek
52*66dfcc85SDavid van Moolenbroek #include <netinet/tcp_fsm.h>
53*66dfcc85SDavid van Moolenbroek
54*66dfcc85SDavid van Moolenbroek #include <netatalk/at.h>
55*66dfcc85SDavid van Moolenbroek #include <netatalk/ddp_var.h>
56*66dfcc85SDavid van Moolenbroek
57*66dfcc85SDavid van Moolenbroek #include <err.h>
58*66dfcc85SDavid van Moolenbroek #include <nlist.h>
59*66dfcc85SDavid van Moolenbroek #include <kvm.h>
60*66dfcc85SDavid van Moolenbroek #include <errno.h>
61*66dfcc85SDavid van Moolenbroek #include <stdio.h>
62*66dfcc85SDavid van Moolenbroek #include <string.h>
63*66dfcc85SDavid van Moolenbroek #include "netstat.h"
64*66dfcc85SDavid van Moolenbroek
65*66dfcc85SDavid van Moolenbroek struct ddpcb ddpcb;
66*66dfcc85SDavid van Moolenbroek struct socket sockb;
67*66dfcc85SDavid van Moolenbroek
68*66dfcc85SDavid van Moolenbroek static int first = 1;
69*66dfcc85SDavid van Moolenbroek
70*66dfcc85SDavid van Moolenbroek /*
71*66dfcc85SDavid van Moolenbroek * Print a summary of connections related to a Network Systems
72*66dfcc85SDavid van Moolenbroek * protocol. For XXX, also give state of connection.
73*66dfcc85SDavid van Moolenbroek * Listening processes (aflag) are suppressed unless the
74*66dfcc85SDavid van Moolenbroek * -a (all) flag is specified.
75*66dfcc85SDavid van Moolenbroek */
76*66dfcc85SDavid van Moolenbroek
77*66dfcc85SDavid van Moolenbroek static const char *
at_pr_net(const struct sockaddr_at * sat,int numeric)78*66dfcc85SDavid van Moolenbroek at_pr_net(const struct sockaddr_at *sat, int numeric)
79*66dfcc85SDavid van Moolenbroek {
80*66dfcc85SDavid van Moolenbroek static char mybuf[50];
81*66dfcc85SDavid van Moolenbroek
82*66dfcc85SDavid van Moolenbroek if (!numeric) {
83*66dfcc85SDavid van Moolenbroek switch (sat->sat_addr.s_net) {
84*66dfcc85SDavid van Moolenbroek case 0xffff:
85*66dfcc85SDavid van Moolenbroek return "????";
86*66dfcc85SDavid van Moolenbroek case ATADDR_ANYNET:
87*66dfcc85SDavid van Moolenbroek return ("*");
88*66dfcc85SDavid van Moolenbroek }
89*66dfcc85SDavid van Moolenbroek }
90*66dfcc85SDavid van Moolenbroek (void)snprintf(mybuf, sizeof(mybuf), "%hu", ntohs(sat->sat_addr.s_net));
91*66dfcc85SDavid van Moolenbroek return (mybuf);
92*66dfcc85SDavid van Moolenbroek }
93*66dfcc85SDavid van Moolenbroek
94*66dfcc85SDavid van Moolenbroek static const char *
at_pr_host(const struct sockaddr_at * sat,int numeric)95*66dfcc85SDavid van Moolenbroek at_pr_host(const struct sockaddr_at *sat, int numeric)
96*66dfcc85SDavid van Moolenbroek {
97*66dfcc85SDavid van Moolenbroek static char mybuf[50];
98*66dfcc85SDavid van Moolenbroek
99*66dfcc85SDavid van Moolenbroek if (!numeric) {
100*66dfcc85SDavid van Moolenbroek switch (sat->sat_addr.s_node) {
101*66dfcc85SDavid van Moolenbroek case ATADDR_BCAST:
102*66dfcc85SDavid van Moolenbroek return "bcast";
103*66dfcc85SDavid van Moolenbroek case ATADDR_ANYNODE:
104*66dfcc85SDavid van Moolenbroek return ("*");
105*66dfcc85SDavid van Moolenbroek }
106*66dfcc85SDavid van Moolenbroek }
107*66dfcc85SDavid van Moolenbroek (void)snprintf(mybuf, sizeof(mybuf), "%d",
108*66dfcc85SDavid van Moolenbroek (unsigned int)sat->sat_addr.s_node);
109*66dfcc85SDavid van Moolenbroek return (mybuf);
110*66dfcc85SDavid van Moolenbroek }
111*66dfcc85SDavid van Moolenbroek
112*66dfcc85SDavid van Moolenbroek static const char *
at_pr_port(const struct sockaddr_at * sat)113*66dfcc85SDavid van Moolenbroek at_pr_port(const struct sockaddr_at *sat)
114*66dfcc85SDavid van Moolenbroek {
115*66dfcc85SDavid van Moolenbroek static char mybuf[50];
116*66dfcc85SDavid van Moolenbroek
117*66dfcc85SDavid van Moolenbroek switch (sat->sat_port) {
118*66dfcc85SDavid van Moolenbroek case ATADDR_ANYPORT:
119*66dfcc85SDavid van Moolenbroek return ("*");
120*66dfcc85SDavid van Moolenbroek case 0xff:
121*66dfcc85SDavid van Moolenbroek return "????";
122*66dfcc85SDavid van Moolenbroek default:
123*66dfcc85SDavid van Moolenbroek (void)snprintf(mybuf, sizeof(mybuf), "%d",
124*66dfcc85SDavid van Moolenbroek (unsigned int)sat->sat_port);
125*66dfcc85SDavid van Moolenbroek return (mybuf);
126*66dfcc85SDavid van Moolenbroek }
127*66dfcc85SDavid van Moolenbroek }
128*66dfcc85SDavid van Moolenbroek
129*66dfcc85SDavid van Moolenbroek static const char *
at_pr_range(const struct sockaddr_at * sat)130*66dfcc85SDavid van Moolenbroek at_pr_range(const struct sockaddr_at *sat)
131*66dfcc85SDavid van Moolenbroek {
132*66dfcc85SDavid van Moolenbroek static char mybuf[50];
133*66dfcc85SDavid van Moolenbroek
134*66dfcc85SDavid van Moolenbroek if (sat->sat_range.r_netrange.nr_firstnet
135*66dfcc85SDavid van Moolenbroek != sat->sat_range.r_netrange.nr_lastnet) {
136*66dfcc85SDavid van Moolenbroek (void)snprintf(mybuf, sizeof(mybuf), "%d-%d",
137*66dfcc85SDavid van Moolenbroek ntohs(sat->sat_range.r_netrange.nr_firstnet),
138*66dfcc85SDavid van Moolenbroek ntohs(sat->sat_range.r_netrange.nr_lastnet));
139*66dfcc85SDavid van Moolenbroek } else {
140*66dfcc85SDavid van Moolenbroek (void)snprintf(mybuf, sizeof(mybuf), "%d",
141*66dfcc85SDavid van Moolenbroek ntohs(sat->sat_range.r_netrange.nr_firstnet));
142*66dfcc85SDavid van Moolenbroek }
143*66dfcc85SDavid van Moolenbroek return (mybuf);
144*66dfcc85SDavid van Moolenbroek }
145*66dfcc85SDavid van Moolenbroek
146*66dfcc85SDavid van Moolenbroek
147*66dfcc85SDavid van Moolenbroek /* what == 0 for addr only == 3
148*66dfcc85SDavid van Moolenbroek * 1 for net
149*66dfcc85SDavid van Moolenbroek * 2 for host
150*66dfcc85SDavid van Moolenbroek * 4 for port
151*66dfcc85SDavid van Moolenbroek * 8 for numeric only
152*66dfcc85SDavid van Moolenbroek */
153*66dfcc85SDavid van Moolenbroek const char *
atalk_print(const struct sockaddr * sa,int what)154*66dfcc85SDavid van Moolenbroek atalk_print(const struct sockaddr *sa, int what)
155*66dfcc85SDavid van Moolenbroek {
156*66dfcc85SDavid van Moolenbroek const struct sockaddr_at *sat = (const struct sockaddr_at *) sa;
157*66dfcc85SDavid van Moolenbroek static char mybuf[50];
158*66dfcc85SDavid van Moolenbroek int numeric = (what & 0x08);
159*66dfcc85SDavid van Moolenbroek
160*66dfcc85SDavid van Moolenbroek mybuf[0] = 0;
161*66dfcc85SDavid van Moolenbroek switch (what & 0x13) {
162*66dfcc85SDavid van Moolenbroek case 0:
163*66dfcc85SDavid van Moolenbroek mybuf[0] = 0;
164*66dfcc85SDavid van Moolenbroek break;
165*66dfcc85SDavid van Moolenbroek case 1:
166*66dfcc85SDavid van Moolenbroek (void)snprintf(mybuf, sizeof(mybuf), "%s",
167*66dfcc85SDavid van Moolenbroek at_pr_net(sat, numeric));
168*66dfcc85SDavid van Moolenbroek break;
169*66dfcc85SDavid van Moolenbroek case 2:
170*66dfcc85SDavid van Moolenbroek (void)snprintf(mybuf, sizeof(mybuf), "%s",
171*66dfcc85SDavid van Moolenbroek at_pr_host(sat, numeric));
172*66dfcc85SDavid van Moolenbroek break;
173*66dfcc85SDavid van Moolenbroek case 3:
174*66dfcc85SDavid van Moolenbroek (void)snprintf(mybuf, sizeof(mybuf), "%s.%s",
175*66dfcc85SDavid van Moolenbroek at_pr_net(sat, numeric),
176*66dfcc85SDavid van Moolenbroek at_pr_host(sat, numeric));
177*66dfcc85SDavid van Moolenbroek break;
178*66dfcc85SDavid van Moolenbroek case 0x10:
179*66dfcc85SDavid van Moolenbroek (void)snprintf(mybuf, sizeof(mybuf), "%s", at_pr_range(sat));
180*66dfcc85SDavid van Moolenbroek }
181*66dfcc85SDavid van Moolenbroek if (what & 4) {
182*66dfcc85SDavid van Moolenbroek (void)snprintf(mybuf + strlen(mybuf),
183*66dfcc85SDavid van Moolenbroek sizeof(mybuf) - strlen(mybuf), ".%s", at_pr_port(sat));
184*66dfcc85SDavid van Moolenbroek }
185*66dfcc85SDavid van Moolenbroek return (mybuf);
186*66dfcc85SDavid van Moolenbroek }
187*66dfcc85SDavid van Moolenbroek
188*66dfcc85SDavid van Moolenbroek const char *
atalk_print2(const struct sockaddr * sa,const struct sockaddr * mask,int what)189*66dfcc85SDavid van Moolenbroek atalk_print2(const struct sockaddr *sa, const struct sockaddr *mask, int what)
190*66dfcc85SDavid van Moolenbroek {
191*66dfcc85SDavid van Moolenbroek int n, l;
192*66dfcc85SDavid van Moolenbroek static char buf[100];
193*66dfcc85SDavid van Moolenbroek const struct sockaddr_at *sat1, *sat2;
194*66dfcc85SDavid van Moolenbroek struct sockaddr_at thesockaddr;
195*66dfcc85SDavid van Moolenbroek struct sockaddr *sa2;
196*66dfcc85SDavid van Moolenbroek
197*66dfcc85SDavid van Moolenbroek sat1 = (const struct sockaddr_at *) sa;
198*66dfcc85SDavid van Moolenbroek sat2 = (const struct sockaddr_at *) mask;
199*66dfcc85SDavid van Moolenbroek sa2 = (struct sockaddr *) & thesockaddr;
200*66dfcc85SDavid van Moolenbroek
201*66dfcc85SDavid van Moolenbroek thesockaddr.sat_addr.s_net = sat1->sat_addr.s_net &
202*66dfcc85SDavid van Moolenbroek sat2->sat_addr.s_net;
203*66dfcc85SDavid van Moolenbroek n = snprintf(buf, sizeof(buf), "%s", atalk_print(sa2, 1 | (what & 8)));
204*66dfcc85SDavid van Moolenbroek if (n >= (int)sizeof(buf))
205*66dfcc85SDavid van Moolenbroek n = sizeof(buf) - 1;
206*66dfcc85SDavid van Moolenbroek else if (n == -1)
207*66dfcc85SDavid van Moolenbroek n = 0; /* What else can be done ? */
208*66dfcc85SDavid van Moolenbroek if (sat2->sat_addr.s_net != 0xFFFF) {
209*66dfcc85SDavid van Moolenbroek thesockaddr.sat_addr.s_net = sat1->sat_addr.s_net |
210*66dfcc85SDavid van Moolenbroek ~sat2->sat_addr.s_net;
211*66dfcc85SDavid van Moolenbroek l = snprintf(buf + n, sizeof(buf) - n,
212*66dfcc85SDavid van Moolenbroek "-%s", atalk_print(sa2, 1 | (what & 8)));
213*66dfcc85SDavid van Moolenbroek if (l >= (int)(sizeof(buf) - n))
214*66dfcc85SDavid van Moolenbroek l = sizeof(buf) - n - 1;
215*66dfcc85SDavid van Moolenbroek if (l > 0)
216*66dfcc85SDavid van Moolenbroek n += l;
217*66dfcc85SDavid van Moolenbroek }
218*66dfcc85SDavid van Moolenbroek if (what & 2) {
219*66dfcc85SDavid van Moolenbroek l = snprintf(buf + n, sizeof(buf) - n, ".%s",
220*66dfcc85SDavid van Moolenbroek atalk_print(sa, what & (~1)));
221*66dfcc85SDavid van Moolenbroek if (l >= (int)(sizeof(buf) - n))
222*66dfcc85SDavid van Moolenbroek l = sizeof(buf) - n - 1;
223*66dfcc85SDavid van Moolenbroek if (l > 0)
224*66dfcc85SDavid van Moolenbroek n += l;
225*66dfcc85SDavid van Moolenbroek }
226*66dfcc85SDavid van Moolenbroek return (buf);
227*66dfcc85SDavid van Moolenbroek }
228*66dfcc85SDavid van Moolenbroek
229*66dfcc85SDavid van Moolenbroek void
atalkprotopr(u_long off,const char * name)230*66dfcc85SDavid van Moolenbroek atalkprotopr(u_long off, const char *name)
231*66dfcc85SDavid van Moolenbroek {
232*66dfcc85SDavid van Moolenbroek struct ddpcb *next;
233*66dfcc85SDavid van Moolenbroek struct ddpcb *initial;
234*66dfcc85SDavid van Moolenbroek int width = 22;
235*66dfcc85SDavid van Moolenbroek if (off == 0)
236*66dfcc85SDavid van Moolenbroek return;
237*66dfcc85SDavid van Moolenbroek if (kread(off, (char *)&initial, sizeof(struct ddpcb *)) < 0)
238*66dfcc85SDavid van Moolenbroek return;
239*66dfcc85SDavid van Moolenbroek for (next = initial; next != NULL;) {
240*66dfcc85SDavid van Moolenbroek u_long ppcb = (u_long)next;
241*66dfcc85SDavid van Moolenbroek
242*66dfcc85SDavid van Moolenbroek if (kread((u_long)next, (char *)&ddpcb, sizeof(ddpcb)) < 0)
243*66dfcc85SDavid van Moolenbroek return;
244*66dfcc85SDavid van Moolenbroek next = ddpcb.ddp_next;
245*66dfcc85SDavid van Moolenbroek #if 0
246*66dfcc85SDavid van Moolenbroek if (!aflag && atalk_nullhost(ddpcb.ddp_lsat)) {
247*66dfcc85SDavid van Moolenbroek continue;
248*66dfcc85SDavid van Moolenbroek }
249*66dfcc85SDavid van Moolenbroek #endif
250*66dfcc85SDavid van Moolenbroek if (kread((u_long)ddpcb.ddp_socket,
251*66dfcc85SDavid van Moolenbroek (char *)&sockb, sizeof(sockb)) < 0)
252*66dfcc85SDavid van Moolenbroek return;
253*66dfcc85SDavid van Moolenbroek if (first) {
254*66dfcc85SDavid van Moolenbroek printf("Active ATALK connections");
255*66dfcc85SDavid van Moolenbroek if (aflag)
256*66dfcc85SDavid van Moolenbroek printf(" (including servers)");
257*66dfcc85SDavid van Moolenbroek putchar('\n');
258*66dfcc85SDavid van Moolenbroek if (Aflag) {
259*66dfcc85SDavid van Moolenbroek width = 18;
260*66dfcc85SDavid van Moolenbroek printf("%-8.8s ", "PCB");
261*66dfcc85SDavid van Moolenbroek }
262*66dfcc85SDavid van Moolenbroek printf("%-5.5s %-6.6s %-6.6s %*.*s %*.*s %s\n",
263*66dfcc85SDavid van Moolenbroek "Proto", "Recv-Q", "Send-Q",
264*66dfcc85SDavid van Moolenbroek -width, width, "Local Address",
265*66dfcc85SDavid van Moolenbroek -width, width, "Foreign Address", "(state)");
266*66dfcc85SDavid van Moolenbroek first = 0;
267*66dfcc85SDavid van Moolenbroek }
268*66dfcc85SDavid van Moolenbroek if (Aflag)
269*66dfcc85SDavid van Moolenbroek printf("%8lx ", ppcb);
270*66dfcc85SDavid van Moolenbroek printf("%-5.5s %6ld %6ld ", name, sockb.so_rcv.sb_cc,
271*66dfcc85SDavid van Moolenbroek sockb.so_snd.sb_cc);
272*66dfcc85SDavid van Moolenbroek printf(" %*.*s", -width, width,
273*66dfcc85SDavid van Moolenbroek atalk_print((struct sockaddr *)&ddpcb.ddp_lsat, 7));
274*66dfcc85SDavid van Moolenbroek printf(" %*.*s", -width, width,
275*66dfcc85SDavid van Moolenbroek atalk_print((struct sockaddr *)&ddpcb.ddp_fsat, 7));
276*66dfcc85SDavid van Moolenbroek putchar('\n');
277*66dfcc85SDavid van Moolenbroek }
278*66dfcc85SDavid van Moolenbroek }
279*66dfcc85SDavid van Moolenbroek #define ANY(x,y,z) \
280*66dfcc85SDavid van Moolenbroek ((sflag==1 || (x)) ? printf("\t%llu %s%s%s\n",(unsigned long long)x,y,plural(x),z) : 0)
281*66dfcc85SDavid van Moolenbroek
282*66dfcc85SDavid van Moolenbroek /*
283*66dfcc85SDavid van Moolenbroek * Dump DDP statistics structure.
284*66dfcc85SDavid van Moolenbroek */
285*66dfcc85SDavid van Moolenbroek void
ddp_stats(u_long off,const char * name)286*66dfcc85SDavid van Moolenbroek ddp_stats(u_long off, const char *name)
287*66dfcc85SDavid van Moolenbroek {
288*66dfcc85SDavid van Moolenbroek uint64_t ddpstat[DDP_NSTATS];
289*66dfcc85SDavid van Moolenbroek
290*66dfcc85SDavid van Moolenbroek if (use_sysctl) {
291*66dfcc85SDavid van Moolenbroek size_t size = sizeof(ddpstat);
292*66dfcc85SDavid van Moolenbroek
293*66dfcc85SDavid van Moolenbroek if (sysctlbyname("net.atalk.ddp.stats", ddpstat, &size,
294*66dfcc85SDavid van Moolenbroek NULL, 0) == -1)
295*66dfcc85SDavid van Moolenbroek return;
296*66dfcc85SDavid van Moolenbroek } else {
297*66dfcc85SDavid van Moolenbroek warnx("%s stats not available via KVM.", name);
298*66dfcc85SDavid van Moolenbroek return;
299*66dfcc85SDavid van Moolenbroek }
300*66dfcc85SDavid van Moolenbroek
301*66dfcc85SDavid van Moolenbroek printf("%s:\n", name);
302*66dfcc85SDavid van Moolenbroek
303*66dfcc85SDavid van Moolenbroek ANY(ddpstat[DDP_STAT_SHORT], "packet", " with short headers ");
304*66dfcc85SDavid van Moolenbroek ANY(ddpstat[DDP_STAT_LONG], "packet", " with long headers ");
305*66dfcc85SDavid van Moolenbroek ANY(ddpstat[DDP_STAT_NOSUM], "packet", " with no checksum ");
306*66dfcc85SDavid van Moolenbroek ANY(ddpstat[DDP_STAT_TOOSHORT], "packet", " too short ");
307*66dfcc85SDavid van Moolenbroek ANY(ddpstat[DDP_STAT_BADSUM], "packet", " with bad checksum ");
308*66dfcc85SDavid van Moolenbroek ANY(ddpstat[DDP_STAT_TOOSMALL], "packet", " with not enough data ");
309*66dfcc85SDavid van Moolenbroek ANY(ddpstat[DDP_STAT_FORWARD], "packet", " forwarded ");
310*66dfcc85SDavid van Moolenbroek ANY(ddpstat[DDP_STAT_ENCAP], "packet", " encapsulated ");
311*66dfcc85SDavid van Moolenbroek ANY(ddpstat[DDP_STAT_CANTFORWARD], "packet", " rcvd for unreachable dest ");
312*66dfcc85SDavid van Moolenbroek ANY(ddpstat[DDP_STAT_NOSOCKSPACE], "packet", " dropped due to no socket space ");
313*66dfcc85SDavid van Moolenbroek }
314*66dfcc85SDavid van Moolenbroek #undef ANY
315