xref: /minix3/usr.bin/netstat/vtw.c (revision 66dfcc8533c70ea68511edc95c03189c8eb0a7a2)
1*66dfcc85SDavid van Moolenbroek /*	$NetBSD: vtw.c,v 1.8 2015/06/16 22:54:10 christos Exp $	*/
2*66dfcc85SDavid van Moolenbroek 
3*66dfcc85SDavid van Moolenbroek /*
4*66dfcc85SDavid van Moolenbroek  * Copyright (c) 2011 The NetBSD Foundation, Inc.
5*66dfcc85SDavid van Moolenbroek  * All rights reserved.
6*66dfcc85SDavid van Moolenbroek  *
7*66dfcc85SDavid van Moolenbroek  * This code is derived from software contributed to The NetBSD Foundation
8*66dfcc85SDavid van Moolenbroek  * by Coyote Point Systems, Inc.
9*66dfcc85SDavid van Moolenbroek  *
10*66dfcc85SDavid van Moolenbroek  * Redistribution and use in source and binary forms, with or without
11*66dfcc85SDavid van Moolenbroek  * modification, are permitted provided that the following conditions
12*66dfcc85SDavid van Moolenbroek  * are met:
13*66dfcc85SDavid van Moolenbroek  * 1. Redistributions of source code must retain the above copyright
14*66dfcc85SDavid van Moolenbroek  *    notice, this list of conditions and the following disclaimer.
15*66dfcc85SDavid van Moolenbroek  * 2. Redistributions in binary form must reproduce the above copyright
16*66dfcc85SDavid van Moolenbroek  *    notice, this list of conditions and the following disclaimer in the
17*66dfcc85SDavid van Moolenbroek  *    documentation and/or other materials provided with the distribution.
18*66dfcc85SDavid van Moolenbroek  *
19*66dfcc85SDavid van Moolenbroek  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20*66dfcc85SDavid van Moolenbroek  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21*66dfcc85SDavid van Moolenbroek  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22*66dfcc85SDavid van Moolenbroek  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23*66dfcc85SDavid van Moolenbroek  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24*66dfcc85SDavid van Moolenbroek  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25*66dfcc85SDavid van Moolenbroek  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26*66dfcc85SDavid van Moolenbroek  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27*66dfcc85SDavid van Moolenbroek  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28*66dfcc85SDavid van Moolenbroek  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29*66dfcc85SDavid van Moolenbroek  * POSSIBILITY OF SUCH DAMAGE.
30*66dfcc85SDavid van Moolenbroek  */
31*66dfcc85SDavid van Moolenbroek /*
32*66dfcc85SDavid van Moolenbroek  * Copyright (c) 1983, 1988, 1993
33*66dfcc85SDavid van Moolenbroek  *	The Regents of the University of California.  All rights reserved.
34*66dfcc85SDavid van Moolenbroek  *
35*66dfcc85SDavid van Moolenbroek  * Redistribution and use in source and binary forms, with or without
36*66dfcc85SDavid van Moolenbroek  * modification, are permitted provided that the following conditions
37*66dfcc85SDavid van Moolenbroek  * are met:
38*66dfcc85SDavid van Moolenbroek  * 1. Redistributions of source code must retain the above copyright
39*66dfcc85SDavid van Moolenbroek  *    notice, this list of conditions and the following disclaimer.
40*66dfcc85SDavid van Moolenbroek  * 2. Redistributions in binary form must reproduce the above copyright
41*66dfcc85SDavid van Moolenbroek  *    notice, this list of conditions and the following disclaimer in the
42*66dfcc85SDavid van Moolenbroek  *    documentation and/or other materials provided with the distribution.
43*66dfcc85SDavid van Moolenbroek  * 3. Neither the name of the University nor the names of its contributors
44*66dfcc85SDavid van Moolenbroek  *    may be used to endorse or promote products derived from this software
45*66dfcc85SDavid van Moolenbroek  *    without specific prior written permission.
46*66dfcc85SDavid van Moolenbroek  *
47*66dfcc85SDavid van Moolenbroek  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
48*66dfcc85SDavid van Moolenbroek  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
49*66dfcc85SDavid van Moolenbroek  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
50*66dfcc85SDavid van Moolenbroek  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
51*66dfcc85SDavid van Moolenbroek  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
52*66dfcc85SDavid van Moolenbroek  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
53*66dfcc85SDavid van Moolenbroek  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
54*66dfcc85SDavid van Moolenbroek  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
55*66dfcc85SDavid van Moolenbroek  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
56*66dfcc85SDavid van Moolenbroek  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
57*66dfcc85SDavid van Moolenbroek  * SUCH DAMAGE.
58*66dfcc85SDavid van Moolenbroek  */
59*66dfcc85SDavid van Moolenbroek 
60*66dfcc85SDavid van Moolenbroek #include <sys/cdefs.h>
61*66dfcc85SDavid van Moolenbroek #ifndef lint
62*66dfcc85SDavid van Moolenbroek #if 0
63*66dfcc85SDavid van Moolenbroek static char sccsid[] = "from: @(#)inet.c	8.4 (Berkeley) 4/20/94";
64*66dfcc85SDavid van Moolenbroek #else
65*66dfcc85SDavid van Moolenbroek __RCSID("$NetBSD: vtw.c,v 1.8 2015/06/16 22:54:10 christos Exp $");
66*66dfcc85SDavid van Moolenbroek #endif
67*66dfcc85SDavid van Moolenbroek #endif /* not lint */
68*66dfcc85SDavid van Moolenbroek 
69*66dfcc85SDavid van Moolenbroek #define	_CALLOUT_PRIVATE	/* for defs in sys/callout.h */
70*66dfcc85SDavid van Moolenbroek 
71*66dfcc85SDavid van Moolenbroek #include <sys/param.h>
72*66dfcc85SDavid van Moolenbroek #include <sys/queue.h>
73*66dfcc85SDavid van Moolenbroek #include <sys/socket.h>
74*66dfcc85SDavid van Moolenbroek #include <sys/socketvar.h>
75*66dfcc85SDavid van Moolenbroek #include <sys/mbuf.h>
76*66dfcc85SDavid van Moolenbroek #include <sys/protosw.h>
77*66dfcc85SDavid van Moolenbroek #include <sys/sysctl.h>
78*66dfcc85SDavid van Moolenbroek 
79*66dfcc85SDavid van Moolenbroek #include <net/if_arp.h>
80*66dfcc85SDavid van Moolenbroek #include <net/route.h>
81*66dfcc85SDavid van Moolenbroek #include <netinet/in.h>
82*66dfcc85SDavid van Moolenbroek #include <netinet/in_systm.h>
83*66dfcc85SDavid van Moolenbroek #include <netinet/ip.h>
84*66dfcc85SDavid van Moolenbroek #include <netinet/in_pcb.h>
85*66dfcc85SDavid van Moolenbroek #include <netinet/ip_icmp.h>
86*66dfcc85SDavid van Moolenbroek 
87*66dfcc85SDavid van Moolenbroek #ifdef INET6
88*66dfcc85SDavid van Moolenbroek #include <netinet/ip6.h>
89*66dfcc85SDavid van Moolenbroek #endif
90*66dfcc85SDavid van Moolenbroek 
91*66dfcc85SDavid van Moolenbroek #include <netinet/icmp_var.h>
92*66dfcc85SDavid van Moolenbroek #include <netinet/igmp_var.h>
93*66dfcc85SDavid van Moolenbroek #include <netinet/ip_var.h>
94*66dfcc85SDavid van Moolenbroek #include <netinet/pim_var.h>
95*66dfcc85SDavid van Moolenbroek #include <netinet/tcp.h>
96*66dfcc85SDavid van Moolenbroek #include <netinet/tcpip.h>
97*66dfcc85SDavid van Moolenbroek #include <netinet/tcp_seq.h>
98*66dfcc85SDavid van Moolenbroek #include <netinet/tcp_fsm.h>
99*66dfcc85SDavid van Moolenbroek #include <netinet/tcp_timer.h>
100*66dfcc85SDavid van Moolenbroek #include <netinet/tcp_var.h>
101*66dfcc85SDavid van Moolenbroek #include <netinet/tcp_debug.h>
102*66dfcc85SDavid van Moolenbroek #include <netinet/udp.h>
103*66dfcc85SDavid van Moolenbroek #include <netinet/ip_carp.h>
104*66dfcc85SDavid van Moolenbroek #include <netinet/udp_var.h>
105*66dfcc85SDavid van Moolenbroek #include <netinet/tcp_vtw.h>
106*66dfcc85SDavid van Moolenbroek 
107*66dfcc85SDavid van Moolenbroek #include <arpa/inet.h>
108*66dfcc85SDavid van Moolenbroek #include <kvm.h>
109*66dfcc85SDavid van Moolenbroek #include <netdb.h>
110*66dfcc85SDavid van Moolenbroek #include <stdio.h>
111*66dfcc85SDavid van Moolenbroek #include <string.h>
112*66dfcc85SDavid van Moolenbroek #include <unistd.h>
113*66dfcc85SDavid van Moolenbroek #include <stdlib.h>
114*66dfcc85SDavid van Moolenbroek #include <err.h>
115*66dfcc85SDavid van Moolenbroek #include "netstat.h"
116*66dfcc85SDavid van Moolenbroek #include "vtw.h"
117*66dfcc85SDavid van Moolenbroek #include "prog_ops.h"
118*66dfcc85SDavid van Moolenbroek 
119*66dfcc85SDavid van Moolenbroek static void	snarf(const void *, void *, size_t);
120*66dfcc85SDavid van Moolenbroek static void	*lookup(const char *);
121*66dfcc85SDavid van Moolenbroek static void	process_vtw(const vtw_ctl_t *, void (*)(const vtw_t *));
122*66dfcc85SDavid van Moolenbroek 
123*66dfcc85SDavid van Moolenbroek static void
snarf(const void * addr,void * buf,size_t len)124*66dfcc85SDavid van Moolenbroek snarf(const void *addr, void *buf, size_t len)
125*66dfcc85SDavid van Moolenbroek {
126*66dfcc85SDavid van Moolenbroek 	size_t cc;
127*66dfcc85SDavid van Moolenbroek 
128*66dfcc85SDavid van Moolenbroek 	memset(buf, 0, len);
129*66dfcc85SDavid van Moolenbroek 
130*66dfcc85SDavid van Moolenbroek 	cc = kvm_read(get_kvmd(), (unsigned long) addr, buf, len);
131*66dfcc85SDavid van Moolenbroek 
132*66dfcc85SDavid van Moolenbroek 	if (cc != len) {
133*66dfcc85SDavid van Moolenbroek 		warnx("%s: short read at %p, len %zx cc %zx", __func__, addr,
134*66dfcc85SDavid van Moolenbroek 		    len, cc);
135*66dfcc85SDavid van Moolenbroek 	}
136*66dfcc85SDavid van Moolenbroek }
137*66dfcc85SDavid van Moolenbroek 
138*66dfcc85SDavid van Moolenbroek static void *
lookup(const char * name)139*66dfcc85SDavid van Moolenbroek lookup(const char *name)
140*66dfcc85SDavid van Moolenbroek {
141*66dfcc85SDavid van Moolenbroek 	kvm_t *k;
142*66dfcc85SDavid van Moolenbroek 	struct nlist nl[2];
143*66dfcc85SDavid van Moolenbroek 
144*66dfcc85SDavid van Moolenbroek 	nl[0].n_name = name;
145*66dfcc85SDavid van Moolenbroek 	nl[0].n_value = 0;
146*66dfcc85SDavid van Moolenbroek 	nl[1].n_name = NULL;
147*66dfcc85SDavid van Moolenbroek 
148*66dfcc85SDavid van Moolenbroek 	if ((k = get_kvmd()) == NULL) {
149*66dfcc85SDavid van Moolenbroek 		if (Vflag)
150*66dfcc85SDavid van Moolenbroek 			errx(EXIT_FAILURE, "kvm not available");
151*66dfcc85SDavid van Moolenbroek 		return NULL;
152*66dfcc85SDavid van Moolenbroek 	}
153*66dfcc85SDavid van Moolenbroek 	switch (kvm_nlist(k, &nl[0])) {
154*66dfcc85SDavid van Moolenbroek 	case -1:
155*66dfcc85SDavid van Moolenbroek 		err(EXIT_FAILURE, "kvm_nlist");
156*66dfcc85SDavid van Moolenbroek 		break;
157*66dfcc85SDavid van Moolenbroek 
158*66dfcc85SDavid van Moolenbroek 	case 0:
159*66dfcc85SDavid van Moolenbroek 		return (void *)nl[0].n_value;
160*66dfcc85SDavid van Moolenbroek 
161*66dfcc85SDavid van Moolenbroek 	default:
162*66dfcc85SDavid van Moolenbroek 		if (Vflag)
163*66dfcc85SDavid van Moolenbroek 			errx(EXIT_FAILURE, "%s missing in symbol table", name);
164*66dfcc85SDavid van Moolenbroek 		break;
165*66dfcc85SDavid van Moolenbroek 	}
166*66dfcc85SDavid van Moolenbroek 
167*66dfcc85SDavid van Moolenbroek 	return NULL;
168*66dfcc85SDavid van Moolenbroek }
169*66dfcc85SDavid van Moolenbroek 
170*66dfcc85SDavid van Moolenbroek void
timebase(struct timeval * tv)171*66dfcc85SDavid van Moolenbroek timebase(struct timeval *tv)
172*66dfcc85SDavid van Moolenbroek {
173*66dfcc85SDavid van Moolenbroek 	void *p;
174*66dfcc85SDavid van Moolenbroek 	struct bintime timebasebin;
175*66dfcc85SDavid van Moolenbroek 
176*66dfcc85SDavid van Moolenbroek 	p = lookup("timebasebin");
177*66dfcc85SDavid van Moolenbroek 	if (!p)
178*66dfcc85SDavid van Moolenbroek 		return;
179*66dfcc85SDavid van Moolenbroek 	snarf(p, &timebasebin, sizeof(timebasebin));
180*66dfcc85SDavid van Moolenbroek 	bintime2timeval(&timebasebin, tv);
181*66dfcc85SDavid van Moolenbroek }
182*66dfcc85SDavid van Moolenbroek 
183*66dfcc85SDavid van Moolenbroek static void
process_vtw(const vtw_ctl_t * ctl,void (* print)(const vtw_t *))184*66dfcc85SDavid van Moolenbroek process_vtw(const vtw_ctl_t * ctl, void (*print)(const vtw_t *))
185*66dfcc85SDavid van Moolenbroek {
186*66dfcc85SDavid van Moolenbroek 	vtw_t *vp;
187*66dfcc85SDavid van Moolenbroek 
188*66dfcc85SDavid van Moolenbroek 	for (vp = ctl->base.v; vp && vp <= ctl->lim.v;) {
189*66dfcc85SDavid van Moolenbroek 
190*66dfcc85SDavid van Moolenbroek 		(*print)(vp);
191*66dfcc85SDavid van Moolenbroek 
192*66dfcc85SDavid van Moolenbroek 		if (ctl->is_v4) {
193*66dfcc85SDavid van Moolenbroek 			vtw_v4_t *v4 = (vtw_v4_t *)vp;
194*66dfcc85SDavid van Moolenbroek 
195*66dfcc85SDavid van Moolenbroek 			vp = &(++v4)->common;
196*66dfcc85SDavid van Moolenbroek 		} else if (ctl->is_v6) {
197*66dfcc85SDavid van Moolenbroek 			vtw_v6_t *v6 = (vtw_v6_t *)vp;
198*66dfcc85SDavid van Moolenbroek 
199*66dfcc85SDavid van Moolenbroek 			vp = &(++v6)->common;
200*66dfcc85SDavid van Moolenbroek 		}
201*66dfcc85SDavid van Moolenbroek 	}
202*66dfcc85SDavid van Moolenbroek }
203*66dfcc85SDavid van Moolenbroek 
204*66dfcc85SDavid van Moolenbroek void
show_vtw_stats(void)205*66dfcc85SDavid van Moolenbroek show_vtw_stats(void)
206*66dfcc85SDavid van Moolenbroek {
207*66dfcc85SDavid van Moolenbroek 	vtw_stats_t stats;
208*66dfcc85SDavid van Moolenbroek 	void *p;
209*66dfcc85SDavid van Moolenbroek 
210*66dfcc85SDavid van Moolenbroek 	if (!Vflag)
211*66dfcc85SDavid van Moolenbroek 		return;
212*66dfcc85SDavid van Moolenbroek 
213*66dfcc85SDavid van Moolenbroek 	if ((p = lookup("vtw_stats")) == NULL)
214*66dfcc85SDavid van Moolenbroek 		return;
215*66dfcc85SDavid van Moolenbroek 	snarf(p, &stats, sizeof(stats));
216*66dfcc85SDavid van Moolenbroek 
217*66dfcc85SDavid van Moolenbroek 	printf("\t\t%" PRIu64 " inserts\n", stats.ins);
218*66dfcc85SDavid van Moolenbroek 	printf("\t\t%" PRIu64 " deletes\n", stats.del);
219*66dfcc85SDavid van Moolenbroek 	printf("\t\t%" PRIu64 " assassinations\n", stats.kill);
220*66dfcc85SDavid van Moolenbroek 	printf("\tvestigial time-wait lookup_connect\n");
221*66dfcc85SDavid van Moolenbroek 	printf("\t\t%" PRIu64 " look\n", stats.look[0]);
222*66dfcc85SDavid van Moolenbroek 	printf("\t\t%" PRIu64 " hit\n", stats.hit[0]);
223*66dfcc85SDavid van Moolenbroek 	printf("\t\t%" PRIu64 " miss\n", stats.miss[0]);
224*66dfcc85SDavid van Moolenbroek 	printf("\t\t%" PRIu64 " probe\n", stats.probe[0]);
225*66dfcc85SDavid van Moolenbroek 	printf("\t\t%" PRIu64 " losing\n", stats.losing[0]);
226*66dfcc85SDavid van Moolenbroek 	printf("\t\t%" PRIu64 " max_chain\n", stats.max_chain[0]);
227*66dfcc85SDavid van Moolenbroek 	printf("\t\t%" PRIu64 " max_probe\n", stats.max_probe[0]);
228*66dfcc85SDavid van Moolenbroek 	printf("\t\t%" PRIu64 " max_loss\n", stats.max_loss[0]);
229*66dfcc85SDavid van Moolenbroek 	printf("\tvestigial time-wait lookup_port\n");
230*66dfcc85SDavid van Moolenbroek 	printf("\t\t%" PRIu64 " look\n", stats.look[1]);
231*66dfcc85SDavid van Moolenbroek 	printf("\t\t%" PRIu64 " hit\n", stats.hit[1]);
232*66dfcc85SDavid van Moolenbroek 	printf("\t\t%" PRIu64 " miss\n", stats.miss[1]);
233*66dfcc85SDavid van Moolenbroek 	printf("\t\t%" PRIu64 " probe\n", stats.probe[1]);
234*66dfcc85SDavid van Moolenbroek 	printf("\t\t%" PRIu64 " losing\n", stats.losing[1]);
235*66dfcc85SDavid van Moolenbroek 	printf("\t\t%" PRIu64 " max_chain\n", stats.max_chain[1]);
236*66dfcc85SDavid van Moolenbroek 	printf("\t\t%" PRIu64 " max_probe\n", stats.max_probe[1]);
237*66dfcc85SDavid van Moolenbroek 	printf("\t\t%" PRIu64 " max_loss\n", stats.max_loss[1]);
238*66dfcc85SDavid van Moolenbroek }
239*66dfcc85SDavid van Moolenbroek 
240*66dfcc85SDavid van Moolenbroek void
show_vtw_v4(void (* print)(const vtw_t *))241*66dfcc85SDavid van Moolenbroek show_vtw_v4(void (*print)(const vtw_t *))
242*66dfcc85SDavid van Moolenbroek {
243*66dfcc85SDavid van Moolenbroek 	fatp_t *base, *lim;
244*66dfcc85SDavid van Moolenbroek 	fatp_t **hash, **port;
245*66dfcc85SDavid van Moolenbroek 	size_t n;
246*66dfcc85SDavid van Moolenbroek 	fatp_ctl_t fat_tcpv4;
247*66dfcc85SDavid van Moolenbroek 	vtw_ctl_t  vtw_tcpv4[VTW_NCLASS];
248*66dfcc85SDavid van Moolenbroek 	int i;
249*66dfcc85SDavid van Moolenbroek 	int mem = 0;
250*66dfcc85SDavid van Moolenbroek 	void *p;
251*66dfcc85SDavid van Moolenbroek 
252*66dfcc85SDavid van Moolenbroek 	if ((p = lookup("fat_tcpv4")) == NULL)
253*66dfcc85SDavid van Moolenbroek 		return;
254*66dfcc85SDavid van Moolenbroek 	snarf(p, &fat_tcpv4, sizeof(fat_tcpv4));
255*66dfcc85SDavid van Moolenbroek 
256*66dfcc85SDavid van Moolenbroek 	if ((p = lookup("vtw_tcpv4")) == NULL)
257*66dfcc85SDavid van Moolenbroek 		return;
258*66dfcc85SDavid van Moolenbroek 	snarf(p, &vtw_tcpv4[0], sizeof(vtw_tcpv4));
259*66dfcc85SDavid van Moolenbroek 
260*66dfcc85SDavid van Moolenbroek 	mem += sizeof(fat_tcpv4);
261*66dfcc85SDavid van Moolenbroek 	mem += sizeof(vtw_tcpv4);
262*66dfcc85SDavid van Moolenbroek 
263*66dfcc85SDavid van Moolenbroek 	/* snarf/adjust vtw_ctl */
264*66dfcc85SDavid van Moolenbroek 	for (i = 0; i < VTW_NCLASS; ++i) {
265*66dfcc85SDavid van Moolenbroek 		vtw_v4_t *kbase, *klim;
266*66dfcc85SDavid van Moolenbroek 		vtw_v4_t *ubase;
267*66dfcc85SDavid van Moolenbroek 		ptrdiff_t delta;
268*66dfcc85SDavid van Moolenbroek 
269*66dfcc85SDavid van Moolenbroek 		kbase = vtw_tcpv4[i].base.v4;
270*66dfcc85SDavid van Moolenbroek 		klim = vtw_tcpv4[i].lim.v4;
271*66dfcc85SDavid van Moolenbroek 
272*66dfcc85SDavid van Moolenbroek 		if (!kbase | !klim)
273*66dfcc85SDavid van Moolenbroek 			continue;
274*66dfcc85SDavid van Moolenbroek 
275*66dfcc85SDavid van Moolenbroek 		n = (klim - kbase + 1);
276*66dfcc85SDavid van Moolenbroek 
277*66dfcc85SDavid van Moolenbroek 		if (!i) {
278*66dfcc85SDavid van Moolenbroek 			if ((ubase = malloc(n * sizeof(*kbase))) == NULL)
279*66dfcc85SDavid van Moolenbroek 				err(EXIT_FAILURE, NULL);
280*66dfcc85SDavid van Moolenbroek 			snarf(kbase, ubase, n * sizeof(*ubase));
281*66dfcc85SDavid van Moolenbroek 
282*66dfcc85SDavid van Moolenbroek 			mem += n * sizeof(*ubase);
283*66dfcc85SDavid van Moolenbroek 		} else {
284*66dfcc85SDavid van Moolenbroek 			ubase = vtw_tcpv4[0].base.v4;
285*66dfcc85SDavid van Moolenbroek 		}
286*66dfcc85SDavid van Moolenbroek 
287*66dfcc85SDavid van Moolenbroek 		delta = ubase - kbase;
288*66dfcc85SDavid van Moolenbroek 
289*66dfcc85SDavid van Moolenbroek 		vtw_tcpv4[i].base.v4 += delta;
290*66dfcc85SDavid van Moolenbroek 		vtw_tcpv4[i].lim.v4 += delta;
291*66dfcc85SDavid van Moolenbroek 		vtw_tcpv4[i].alloc.v4 += delta;
292*66dfcc85SDavid van Moolenbroek 		vtw_tcpv4[i].fat = &fat_tcpv4;
293*66dfcc85SDavid van Moolenbroek 
294*66dfcc85SDavid van Moolenbroek 		if (vtw_tcpv4[i].oldest.v4)
295*66dfcc85SDavid van Moolenbroek 			vtw_tcpv4[i].oldest.v4 += delta;
296*66dfcc85SDavid van Moolenbroek 	}
297*66dfcc85SDavid van Moolenbroek 
298*66dfcc85SDavid van Moolenbroek 	/* snarf/adjust fat_ctl */
299*66dfcc85SDavid van Moolenbroek 
300*66dfcc85SDavid van Moolenbroek 	base = fat_tcpv4.base;
301*66dfcc85SDavid van Moolenbroek 	lim = fat_tcpv4.lim;
302*66dfcc85SDavid van Moolenbroek 
303*66dfcc85SDavid van Moolenbroek 	if (!base | !lim)
304*66dfcc85SDavid van Moolenbroek 		goto end;
305*66dfcc85SDavid van Moolenbroek 
306*66dfcc85SDavid van Moolenbroek 	mem += (lim - base + 1) * sizeof(*base);
307*66dfcc85SDavid van Moolenbroek 
308*66dfcc85SDavid van Moolenbroek 	fat_tcpv4.base = malloc((lim - base + 1) * sizeof(*base));
309*66dfcc85SDavid van Moolenbroek 	if (fat_tcpv4.base == NULL)
310*66dfcc85SDavid van Moolenbroek 		err(EXIT_FAILURE, NULL);
311*66dfcc85SDavid van Moolenbroek 	fat_tcpv4.lim = fat_tcpv4.base + (lim - base);
312*66dfcc85SDavid van Moolenbroek 
313*66dfcc85SDavid van Moolenbroek 	snarf(base, fat_tcpv4.base, sizeof(*base) * (lim - base + 1));
314*66dfcc85SDavid van Moolenbroek 
315*66dfcc85SDavid van Moolenbroek 	fat_tcpv4.vtw = &vtw_tcpv4[0];
316*66dfcc85SDavid van Moolenbroek 	fat_tcpv4.free = fat_tcpv4.base + (fat_tcpv4.free - base);
317*66dfcc85SDavid van Moolenbroek 
318*66dfcc85SDavid van Moolenbroek 	n = fat_tcpv4.mask + 1;
319*66dfcc85SDavid van Moolenbroek 	hash = fat_tcpv4.hash;
320*66dfcc85SDavid van Moolenbroek 	port = fat_tcpv4.port;
321*66dfcc85SDavid van Moolenbroek 
322*66dfcc85SDavid van Moolenbroek 	fat_tcpv4.hash = malloc(n * sizeof(*hash));
323*66dfcc85SDavid van Moolenbroek 	fat_tcpv4.port = malloc(n * sizeof(*port));
324*66dfcc85SDavid van Moolenbroek 	if (fat_tcpv4.hash == NULL || fat_tcpv4.port == NULL)
325*66dfcc85SDavid van Moolenbroek 		err(EXIT_FAILURE, NULL);
326*66dfcc85SDavid van Moolenbroek 
327*66dfcc85SDavid van Moolenbroek 	snarf(hash, fat_tcpv4.hash, n * sizeof(*hash));
328*66dfcc85SDavid van Moolenbroek 	snarf(port, fat_tcpv4.port, n * sizeof(*port));
329*66dfcc85SDavid van Moolenbroek 
330*66dfcc85SDavid van Moolenbroek end:
331*66dfcc85SDavid van Moolenbroek 	process_vtw(&vtw_tcpv4[0], print);
332*66dfcc85SDavid van Moolenbroek 
333*66dfcc85SDavid van Moolenbroek #if 0
334*66dfcc85SDavid van Moolenbroek 	if (Vflag && vflag) {
335*66dfcc85SDavid van Moolenbroek 		printf("total memory for VTW in current config: %d bytes %f MB\n"
336*66dfcc85SDavid van Moolenbroek 		    ,mem
337*66dfcc85SDavid van Moolenbroek 		    ,mem / (1024.0 * 1024));
338*66dfcc85SDavid van Moolenbroek 	}
339*66dfcc85SDavid van Moolenbroek #endif
340*66dfcc85SDavid van Moolenbroek }
341*66dfcc85SDavid van Moolenbroek 
342*66dfcc85SDavid van Moolenbroek void
show_vtw_v6(void (* print)(const vtw_t *))343*66dfcc85SDavid van Moolenbroek show_vtw_v6(void (*print)(const vtw_t *))
344*66dfcc85SDavid van Moolenbroek {
345*66dfcc85SDavid van Moolenbroek 	fatp_t *base, *lim;
346*66dfcc85SDavid van Moolenbroek 	fatp_t **hash, **port;
347*66dfcc85SDavid van Moolenbroek 	size_t n;
348*66dfcc85SDavid van Moolenbroek 	fatp_ctl_t fat_tcpv6;
349*66dfcc85SDavid van Moolenbroek 	vtw_ctl_t  vtw_tcpv6[VTW_NCLASS];
350*66dfcc85SDavid van Moolenbroek 	int i;
351*66dfcc85SDavid van Moolenbroek 	int mem = 0;
352*66dfcc85SDavid van Moolenbroek 	void *p;
353*66dfcc85SDavid van Moolenbroek 
354*66dfcc85SDavid van Moolenbroek 	if ((p = lookup("fat_tcpv6")) == NULL)
355*66dfcc85SDavid van Moolenbroek 		return;
356*66dfcc85SDavid van Moolenbroek 	snarf(p, &fat_tcpv6, sizeof(fat_tcpv6));
357*66dfcc85SDavid van Moolenbroek 	if ((p = lookup("vtw_tcpv6")) == NULL)
358*66dfcc85SDavid van Moolenbroek 		return;
359*66dfcc85SDavid van Moolenbroek 	snarf(p, &vtw_tcpv6[0], sizeof(vtw_tcpv6));
360*66dfcc85SDavid van Moolenbroek 
361*66dfcc85SDavid van Moolenbroek 	mem += sizeof(fat_tcpv6);
362*66dfcc85SDavid van Moolenbroek 	mem += sizeof(vtw_tcpv6);
363*66dfcc85SDavid van Moolenbroek 
364*66dfcc85SDavid van Moolenbroek 	for (i = 0; i < VTW_NCLASS; ++i) {
365*66dfcc85SDavid van Moolenbroek 		vtw_v6_t *kbase, *klim;
366*66dfcc85SDavid van Moolenbroek 		vtw_v6_t *ubase;
367*66dfcc85SDavid van Moolenbroek 		ptrdiff_t delta;
368*66dfcc85SDavid van Moolenbroek 
369*66dfcc85SDavid van Moolenbroek 		kbase = vtw_tcpv6[i].base.v6;
370*66dfcc85SDavid van Moolenbroek 		klim = vtw_tcpv6[i].lim.v6;
371*66dfcc85SDavid van Moolenbroek 
372*66dfcc85SDavid van Moolenbroek 		if (!kbase | !klim)
373*66dfcc85SDavid van Moolenbroek 			continue;
374*66dfcc85SDavid van Moolenbroek 
375*66dfcc85SDavid van Moolenbroek 		n = (klim - kbase + 1);
376*66dfcc85SDavid van Moolenbroek 
377*66dfcc85SDavid van Moolenbroek 		if (!i) {
378*66dfcc85SDavid van Moolenbroek 			if ((ubase = malloc(n * sizeof(*kbase))) == NULL)
379*66dfcc85SDavid van Moolenbroek 				err(EXIT_FAILURE, NULL);
380*66dfcc85SDavid van Moolenbroek 
381*66dfcc85SDavid van Moolenbroek 			snarf(kbase, ubase, n * sizeof(*ubase));
382*66dfcc85SDavid van Moolenbroek 
383*66dfcc85SDavid van Moolenbroek 			mem += n * sizeof(*ubase);
384*66dfcc85SDavid van Moolenbroek 		} else {
385*66dfcc85SDavid van Moolenbroek 			ubase = vtw_tcpv6[0].base.v6;
386*66dfcc85SDavid van Moolenbroek 		}
387*66dfcc85SDavid van Moolenbroek 
388*66dfcc85SDavid van Moolenbroek 		delta = ubase - kbase;
389*66dfcc85SDavid van Moolenbroek 
390*66dfcc85SDavid van Moolenbroek 		vtw_tcpv6[i].base.v6 += delta;
391*66dfcc85SDavid van Moolenbroek 		vtw_tcpv6[i].lim.v6 += delta;
392*66dfcc85SDavid van Moolenbroek 		vtw_tcpv6[i].alloc.v6 += delta;
393*66dfcc85SDavid van Moolenbroek 		vtw_tcpv6[i].fat = &fat_tcpv6;
394*66dfcc85SDavid van Moolenbroek 
395*66dfcc85SDavid van Moolenbroek 		if (vtw_tcpv6[i].oldest.v6)
396*66dfcc85SDavid van Moolenbroek 			vtw_tcpv6[i].oldest.v6 += delta;
397*66dfcc85SDavid van Moolenbroek 	}
398*66dfcc85SDavid van Moolenbroek 
399*66dfcc85SDavid van Moolenbroek 	base = fat_tcpv6.base;
400*66dfcc85SDavid van Moolenbroek 	lim = fat_tcpv6.lim;
401*66dfcc85SDavid van Moolenbroek 
402*66dfcc85SDavid van Moolenbroek 	if (!base | !lim)
403*66dfcc85SDavid van Moolenbroek 		goto end;
404*66dfcc85SDavid van Moolenbroek 
405*66dfcc85SDavid van Moolenbroek 	mem += (lim - base + 1) * sizeof(*base);
406*66dfcc85SDavid van Moolenbroek 
407*66dfcc85SDavid van Moolenbroek 	fat_tcpv6.base = malloc((lim - base + 1) * sizeof(*base));
408*66dfcc85SDavid van Moolenbroek 	if (fat_tcpv6.base == NULL)
409*66dfcc85SDavid van Moolenbroek 		err(EXIT_FAILURE, NULL);
410*66dfcc85SDavid van Moolenbroek 	fat_tcpv6.lim = fat_tcpv6.base + (lim - base);
411*66dfcc85SDavid van Moolenbroek 
412*66dfcc85SDavid van Moolenbroek 	snarf(base, fat_tcpv6.base, sizeof(*base) * (lim - base + 1));
413*66dfcc85SDavid van Moolenbroek 
414*66dfcc85SDavid van Moolenbroek 	fat_tcpv6.vtw = &vtw_tcpv6[0];
415*66dfcc85SDavid van Moolenbroek 	fat_tcpv6.free = fat_tcpv6.base + (fat_tcpv6.free - base);
416*66dfcc85SDavid van Moolenbroek 
417*66dfcc85SDavid van Moolenbroek 	n = fat_tcpv6.mask + 1;
418*66dfcc85SDavid van Moolenbroek 	hash = fat_tcpv6.hash;
419*66dfcc85SDavid van Moolenbroek 	port = fat_tcpv6.port;
420*66dfcc85SDavid van Moolenbroek 
421*66dfcc85SDavid van Moolenbroek 	fat_tcpv6.hash = malloc(n * sizeof(*hash));
422*66dfcc85SDavid van Moolenbroek 	fat_tcpv6.port = malloc(n * sizeof(*port));
423*66dfcc85SDavid van Moolenbroek 	if (fat_tcpv6.hash == NULL || fat_tcpv6.port == NULL)
424*66dfcc85SDavid van Moolenbroek 		err(EXIT_FAILURE, NULL);
425*66dfcc85SDavid van Moolenbroek 
426*66dfcc85SDavid van Moolenbroek 	snarf(hash, fat_tcpv6.hash, n * sizeof(*hash));
427*66dfcc85SDavid van Moolenbroek 	snarf(port, fat_tcpv6.port, n * sizeof(*port));
428*66dfcc85SDavid van Moolenbroek 
429*66dfcc85SDavid van Moolenbroek end:
430*66dfcc85SDavid van Moolenbroek 
431*66dfcc85SDavid van Moolenbroek 	process_vtw(&vtw_tcpv6[0], print);
432*66dfcc85SDavid van Moolenbroek #if 0
433*66dfcc85SDavid van Moolenbroek 	if (Vflag && vflag) {
434*66dfcc85SDavid van Moolenbroek 		printf("total memory for VTW in current config: %d bytes %f MB\n"
435*66dfcc85SDavid van Moolenbroek 		    ,mem
436*66dfcc85SDavid van Moolenbroek 		    ,mem / (1024.0 * 1024));
437*66dfcc85SDavid van Moolenbroek 	}
438*66dfcc85SDavid van Moolenbroek #endif
439*66dfcc85SDavid van Moolenbroek }
440