ippool.c revision 353074
1145519Sdarrenr/*	$FreeBSD: stable/11/contrib/ipfilter/tools/ippool.c 353074 2019-10-04 01:38:56Z cy $	*/
2145510Sdarrenr
3145510Sdarrenr/*
4255332Scy * Copyright (C) 2012 by Darren Reed.
5145510Sdarrenr *
6145510Sdarrenr * See the IPFILTER.LICENCE file for details on licencing.
7145510Sdarrenr */
8145510Sdarrenr#include <sys/types.h>
9145510Sdarrenr#include <sys/time.h>
10145510Sdarrenr#include <sys/param.h>
11145510Sdarrenr#include <sys/socket.h>
12145510Sdarrenr# include <sys/cdefs.h>
13145510Sdarrenr#include <sys/ioctl.h>
14145510Sdarrenr
15145510Sdarrenr#include <net/if.h>
16145510Sdarrenr#include <netinet/in.h>
17145510Sdarrenr
18145510Sdarrenr#include <arpa/inet.h>
19145510Sdarrenr
20145510Sdarrenr#include <stdio.h>
21145510Sdarrenr#include <fcntl.h>
22145510Sdarrenr#include <stdlib.h>
23145510Sdarrenr#include <string.h>
24145510Sdarrenr#include <netdb.h>
25145510Sdarrenr#include <ctype.h>
26145510Sdarrenr#include <unistd.h>
27170268Sdarrenr# include <nlist.h>
28145510Sdarrenr
29145510Sdarrenr#include "ipf.h"
30170268Sdarrenr#include "netinet/ipl.h"
31145510Sdarrenr#include "netinet/ip_lookup.h"
32145510Sdarrenr#include "netinet/ip_pool.h"
33145510Sdarrenr#include "netinet/ip_htable.h"
34145510Sdarrenr#include "kmem.h"
35145510Sdarrenr
36145510Sdarrenr
37145510Sdarrenrextern	int	ippool_yyparse __P((void));
38145510Sdarrenrextern	int	ippool_yydebug;
39145510Sdarrenrextern	FILE	*ippool_yyin;
40145510Sdarrenrextern	char	*optarg;
41145510Sdarrenrextern	int	lineNum;
42145510Sdarrenr
43145510Sdarrenrvoid	usage __P((char *));
44145510Sdarrenrint	main __P((int, char **));
45145510Sdarrenrint	poolcommand __P((int, int, char *[]));
46145510Sdarrenrint	poolnodecommand __P((int, int, char *[]));
47145510Sdarrenrint	loadpoolfile __P((int, char *[], char *));
48145510Sdarrenrint	poollist __P((int, char *[]));
49170268Sdarrenrvoid	poollist_dead __P((int, char *, int, char *, char *));
50170268Sdarrenrvoid	poollist_live __P((int, char *, int, int));
51145510Sdarrenrint	poolflush __P((int, char *[]));
52145510Sdarrenrint	poolstats __P((int, char *[]));
53145510Sdarrenrint	gettype __P((char *, u_int *));
54145510Sdarrenrint	getrole __P((char *));
55255332Scyint	setnodeaddr __P((int, int, void *ptr, char *arg));
56255332Scyvoid	showpools_live __P((int, int, ipf_pool_stat_t *, char *));
57170268Sdarrenrvoid	showhashs_live __P((int, int, iphtstat_t *, char *));
58255332Scyvoid	showdstls_live __P((int, int, ipf_dstl_stat_t *, char *));
59145510Sdarrenr
60145510Sdarrenrint	opts = 0;
61145510Sdarrenrint	fd = -1;
62145510Sdarrenrint	use_inet6 = 0;
63255332Scywordtab_t *pool_fields = NULL;
64255332Scyint	nohdrfields = 0;
65145510Sdarrenr
66145510Sdarrenr
67255332Scyvoid
68255332Scyusage(prog)
69255332Scy	char *prog;
70145510Sdarrenr{
71145510Sdarrenr	fprintf(stderr, "Usage:\t%s\n", prog);
72255332Scy	fprintf(stderr, "\t-a [-dnv] [-m <name>] [-o <role>] [-t type] [-T ttl] -i <ipaddr>[/netmask]\n");
73255332Scy	fprintf(stderr, "\t-A [-dnv] [-m <name>] [-o <role>] [-S <seed>] [-t <type>]\n");
74255332Scy	fprintf(stderr, "\t-f <file> [-dnuv]\n");
75255332Scy	fprintf(stderr, "\t-F [-dv] [-o <role>] [-t <type>]\n");
76255332Scy	fprintf(stderr, "\t-l [-dv] [-m <name>] [-t <type>] [-O <fields>]\n");
77255332Scy	fprintf(stderr, "\t-r [-dnv] [-m <name>] [-o <role>] [-t type] -i <ipaddr>[/netmask]\n");
78255332Scy	fprintf(stderr, "\t-R [-dnv] [-m <name>] [-o <role>] [-t <type>]\n");
79255332Scy	fprintf(stderr, "\t-s [-dtv] [-M <core>] [-N <namelist>]\n");
80145510Sdarrenr	exit(1);
81145510Sdarrenr}
82145510Sdarrenr
83145510Sdarrenr
84255332Scyint
85255332Scymain(argc, argv)
86255332Scy	int argc;
87255332Scy	char *argv[];
88145510Sdarrenr{
89255332Scy	int err = 1;
90145510Sdarrenr
91145510Sdarrenr	if (argc < 2)
92145510Sdarrenr		usage(argv[0]);
93145510Sdarrenr
94255332Scy	assigndefined(getenv("IPPOOL_PREDEFINED"));
95255332Scy
96255332Scy	switch (getopt(argc, argv, "aAf:FlnrRsv"))
97145510Sdarrenr	{
98145510Sdarrenr	case 'a' :
99145510Sdarrenr		err = poolnodecommand(0, argc, argv);
100145510Sdarrenr		break;
101145510Sdarrenr	case 'A' :
102145510Sdarrenr		err = poolcommand(0, argc, argv);
103145510Sdarrenr		break;
104145510Sdarrenr	case 'f' :
105145510Sdarrenr		err = loadpoolfile(argc, argv, optarg);
106145510Sdarrenr		break;
107145510Sdarrenr	case 'F' :
108145510Sdarrenr		err = poolflush(argc, argv);
109145510Sdarrenr		break;
110145510Sdarrenr	case 'l' :
111145510Sdarrenr		err = poollist(argc, argv);
112145510Sdarrenr		break;
113255332Scy	case 'n' :
114255332Scy		opts |= OPT_DONOTHING|OPT_DONTOPEN;
115255332Scy		break;
116145510Sdarrenr	case 'r' :
117145510Sdarrenr		err = poolnodecommand(1, argc, argv);
118145510Sdarrenr		break;
119145510Sdarrenr	case 'R' :
120145510Sdarrenr		err = poolcommand(1, argc, argv);
121145510Sdarrenr		break;
122145510Sdarrenr	case 's' :
123145510Sdarrenr		err = poolstats(argc, argv);
124145510Sdarrenr		break;
125255332Scy	case 'v' :
126255332Scy		opts |= OPT_VERBOSE;
127255332Scy		break;
128145510Sdarrenr	default :
129145510Sdarrenr		exit(1);
130145510Sdarrenr	}
131145510Sdarrenr
132170268Sdarrenr	if (err != 0)
133170268Sdarrenr		exit(1);
134170268Sdarrenr	return 0;
135145510Sdarrenr}
136145510Sdarrenr
137145510Sdarrenr
138255332Scyint
139255332Scypoolnodecommand(remove, argc, argv)
140255332Scy	int remove, argc;
141255332Scy	char *argv[];
142145510Sdarrenr{
143255332Scy	int err = 0, c, ipset, role, type = IPLT_POOL, ttl = 0;
144170268Sdarrenr	char *poolname = NULL;
145255332Scy	ip_pool_node_t pnode;
146255332Scy	iphtent_t hnode;
147255332Scy	void *ptr = &pnode;
148145510Sdarrenr
149145510Sdarrenr	ipset = 0;
150145510Sdarrenr	role = IPL_LOGIPF;
151255332Scy	bzero((char *)&pnode, sizeof(pnode));
152255332Scy	bzero((char *)&hnode, sizeof(hnode));
153145510Sdarrenr
154255332Scy	while ((c = getopt(argc, argv, "di:m:no:Rt:T:v")) != -1)
155145510Sdarrenr		switch (c)
156145510Sdarrenr		{
157145510Sdarrenr		case 'd' :
158145510Sdarrenr			opts |= OPT_DEBUG;
159145510Sdarrenr			ippool_yydebug++;
160145510Sdarrenr			break;
161145510Sdarrenr		case 'i' :
162255332Scy			if (setnodeaddr(type, role, ptr, optarg) == 0)
163170268Sdarrenr				ipset = 1;
164145510Sdarrenr			break;
165145510Sdarrenr		case 'm' :
166145510Sdarrenr			poolname = optarg;
167145510Sdarrenr			break;
168145510Sdarrenr		case 'n' :
169255332Scy			opts |= OPT_DONOTHING|OPT_DONTOPEN;
170145510Sdarrenr			break;
171145510Sdarrenr		case 'o' :
172255332Scy			if (ipset == 1) {
173255332Scy				fprintf(stderr,
174255332Scy					"cannot set role after ip address\n");
175255332Scy				return -1;
176255332Scy			}
177145510Sdarrenr			role = getrole(optarg);
178145510Sdarrenr			if (role == IPL_LOGNONE)
179145510Sdarrenr				return -1;
180145510Sdarrenr			break;
181145510Sdarrenr		case 'R' :
182145510Sdarrenr			opts |= OPT_NORESOLVE;
183145510Sdarrenr			break;
184255332Scy		case 't' :
185255332Scy			if (ipset == 1) {
186255332Scy				fprintf(stderr,
187255332Scy					"cannot set type after ip address\n");
188255332Scy				return -1;
189255332Scy			}
190255332Scy			type = gettype(optarg, NULL);
191255332Scy			switch (type) {
192255332Scy			case IPLT_NONE :
193255332Scy				fprintf(stderr, "unknown type '%s'\n", optarg);
194255332Scy				return -1;
195255332Scy			case IPLT_HASH :
196255332Scy				ptr = &hnode;
197255332Scy				break;
198255332Scy			case IPLT_POOL :
199255332Scy			default :
200255332Scy				break;
201255332Scy			}
202255332Scy			break;
203255332Scy		case 'T' :
204255332Scy			ttl = atoi(optarg);
205255332Scy			if (ttl < 0) {
206255332Scy				fprintf(stderr, "cannot set negative ttl\n");
207255332Scy				return -1;
208255332Scy			}
209255332Scy			break;
210145510Sdarrenr		case 'v' :
211145510Sdarrenr			opts |= OPT_VERBOSE;
212145510Sdarrenr			break;
213145510Sdarrenr		}
214145510Sdarrenr
215170268Sdarrenr	if (argv[optind] != NULL && ipset == 0) {
216255332Scy		if (setnodeaddr(type, role, ptr, argv[optind]) == 0)
217170268Sdarrenr			ipset = 1;
218170268Sdarrenr	}
219170268Sdarrenr
220145510Sdarrenr	if (opts & OPT_DEBUG)
221145510Sdarrenr		fprintf(stderr, "poolnodecommand: opts = %#x\n", opts);
222145510Sdarrenr
223170268Sdarrenr	if (ipset == 0) {
224170268Sdarrenr		fprintf(stderr, "no IP address given with -i\n");
225145510Sdarrenr		return -1;
226170268Sdarrenr	}
227170268Sdarrenr
228145510Sdarrenr	if (poolname == NULL) {
229145510Sdarrenr		fprintf(stderr, "poolname not given with add/remove node\n");
230145510Sdarrenr		return -1;
231145510Sdarrenr	}
232145510Sdarrenr
233255332Scy	switch (type) {
234255332Scy	case IPLT_POOL :
235255332Scy		if (remove == 0)
236255332Scy			err = load_poolnode(role, poolname, &pnode, ttl, ioctl);
237255332Scy		else
238255332Scy			err = remove_poolnode(role, poolname, &pnode, ioctl);
239255332Scy		break;
240255332Scy	case IPLT_HASH :
241255332Scy		if (remove == 0)
242255332Scy			err = load_hashnode(role, poolname, &hnode, ttl, ioctl);
243255332Scy		else
244255332Scy			err = remove_hashnode(role, poolname, &hnode, ioctl);
245255332Scy		break;
246255332Scy	default :
247255332Scy		break;
248255332Scy	}
249145510Sdarrenr	return err;
250145510Sdarrenr}
251145510Sdarrenr
252145510Sdarrenr
253255332Scyint
254255332Scypoolcommand(remove, argc, argv)
255255332Scy	int remove, argc;
256255332Scy	char *argv[];
257145510Sdarrenr{
258145510Sdarrenr	int type, role, c, err;
259145510Sdarrenr	char *poolname;
260145510Sdarrenr	iphtable_t iph;
261145510Sdarrenr	ip_pool_t pool;
262145510Sdarrenr
263145510Sdarrenr	err = 1;
264145510Sdarrenr	role = 0;
265145510Sdarrenr	type = 0;
266145510Sdarrenr	poolname = NULL;
267145510Sdarrenr	role = IPL_LOGIPF;
268145510Sdarrenr	bzero((char *)&iph, sizeof(iph));
269145510Sdarrenr	bzero((char *)&pool, sizeof(pool));
270145510Sdarrenr
271255332Scy	while ((c = getopt(argc, argv, "dm:no:RSv")) != -1)
272145510Sdarrenr		switch (c)
273145510Sdarrenr		{
274145510Sdarrenr		case 'd' :
275145510Sdarrenr			opts |= OPT_DEBUG;
276145510Sdarrenr			ippool_yydebug++;
277145510Sdarrenr			break;
278145510Sdarrenr		case 'm' :
279145510Sdarrenr			poolname = optarg;
280145510Sdarrenr			break;
281145510Sdarrenr		case 'n' :
282255332Scy			opts |= OPT_DONOTHING|OPT_DONTOPEN;
283145510Sdarrenr			break;
284145510Sdarrenr		case 'o' :
285145510Sdarrenr			role = getrole(optarg);
286145510Sdarrenr			if (role == IPL_LOGNONE) {
287145510Sdarrenr				fprintf(stderr, "unknown role '%s'\n", optarg);
288145510Sdarrenr				return -1;
289145510Sdarrenr			}
290145510Sdarrenr			break;
291145510Sdarrenr		case 'R' :
292145510Sdarrenr			opts |= OPT_NORESOLVE;
293145510Sdarrenr			break;
294145510Sdarrenr		case 'S' :
295145510Sdarrenr			iph.iph_seed = atoi(optarg);
296145510Sdarrenr			break;
297145510Sdarrenr		case 'v' :
298145510Sdarrenr			opts |= OPT_VERBOSE;
299145510Sdarrenr			break;
300145510Sdarrenr		}
301145510Sdarrenr
302145510Sdarrenr	if (opts & OPT_DEBUG)
303145510Sdarrenr		fprintf(stderr, "poolcommand: opts = %#x\n", opts);
304145510Sdarrenr
305145510Sdarrenr	if (poolname == NULL) {
306145510Sdarrenr		fprintf(stderr, "poolname not given with add/remove pool\n");
307145510Sdarrenr		return -1;
308145510Sdarrenr	}
309145510Sdarrenr
310255332Scy	type = gettype(argv[optind], &iph.iph_type);
311255332Scy	if (type == IPLT_NONE) {
312255332Scy		fprintf(stderr, "unknown type '%s'\n", argv[optind]);
313255332Scy		return -1;
314255332Scy	}
315255332Scy
316145510Sdarrenr	if (type == IPLT_HASH) {
317145510Sdarrenr		strncpy(iph.iph_name, poolname, sizeof(iph.iph_name));
318145510Sdarrenr		iph.iph_name[sizeof(iph.iph_name) - 1] = '\0';
319145510Sdarrenr		iph.iph_unit = role;
320145510Sdarrenr	} else if (type == IPLT_POOL) {
321145510Sdarrenr		strncpy(pool.ipo_name, poolname, sizeof(pool.ipo_name));
322145510Sdarrenr		pool.ipo_name[sizeof(pool.ipo_name) - 1] = '\0';
323145510Sdarrenr		pool.ipo_unit = role;
324145510Sdarrenr	}
325145510Sdarrenr
326145510Sdarrenr	if (remove == 0) {
327145510Sdarrenr		switch (type)
328145510Sdarrenr		{
329145510Sdarrenr		case IPLT_HASH :
330145510Sdarrenr			err = load_hash(&iph, NULL, ioctl);
331145510Sdarrenr			break;
332145510Sdarrenr		case IPLT_POOL :
333145510Sdarrenr			err = load_pool(&pool, ioctl);
334145510Sdarrenr			break;
335145510Sdarrenr		}
336145510Sdarrenr	} else {
337145510Sdarrenr		switch (type)
338145510Sdarrenr		{
339145510Sdarrenr		case IPLT_HASH :
340145510Sdarrenr			err = remove_hash(&iph, ioctl);
341145510Sdarrenr			break;
342145510Sdarrenr		case IPLT_POOL :
343145510Sdarrenr			err = remove_pool(&pool, ioctl);
344145510Sdarrenr			break;
345145510Sdarrenr		}
346145510Sdarrenr	}
347145510Sdarrenr	return err;
348145510Sdarrenr}
349145510Sdarrenr
350145510Sdarrenr
351255332Scyint
352255332Scyloadpoolfile(argc, argv, infile)
353255332Scy	int argc;
354255332Scy	char *argv[], *infile;
355145510Sdarrenr{
356145510Sdarrenr	int c;
357145510Sdarrenr
358145510Sdarrenr	infile = optarg;
359145510Sdarrenr
360145510Sdarrenr	while ((c = getopt(argc, argv, "dnRuv")) != -1)
361145510Sdarrenr		switch (c)
362145510Sdarrenr		{
363145510Sdarrenr		case 'd' :
364145510Sdarrenr			opts |= OPT_DEBUG;
365145510Sdarrenr			ippool_yydebug++;
366145510Sdarrenr			break;
367145510Sdarrenr		case 'n' :
368255332Scy			opts |= OPT_DONOTHING|OPT_DONTOPEN;
369145510Sdarrenr			break;
370145510Sdarrenr		case 'R' :
371145510Sdarrenr			opts |= OPT_NORESOLVE;
372145510Sdarrenr			break;
373145510Sdarrenr		case 'u' :
374145510Sdarrenr			opts |= OPT_REMOVE;
375145510Sdarrenr			break;
376145510Sdarrenr		case 'v' :
377145510Sdarrenr			opts |= OPT_VERBOSE;
378145510Sdarrenr			break;
379145510Sdarrenr		}
380145510Sdarrenr
381145510Sdarrenr	if (opts & OPT_DEBUG)
382145510Sdarrenr		fprintf(stderr, "loadpoolfile: opts = %#x\n", opts);
383145510Sdarrenr
384255332Scy	if (!(opts & (OPT_DONOTHING|OPT_DONTOPEN)) && (fd == -1)) {
385145510Sdarrenr		fd = open(IPLOOKUP_NAME, O_RDWR);
386145510Sdarrenr		if (fd == -1) {
387145510Sdarrenr			perror("open(IPLOOKUP_NAME)");
388145510Sdarrenr			exit(1);
389145510Sdarrenr		}
390145510Sdarrenr	}
391145510Sdarrenr
392145510Sdarrenr	if (ippool_parsefile(fd, infile, ioctl) != 0)
393145510Sdarrenr		return -1;
394145510Sdarrenr	return 0;
395145510Sdarrenr}
396145510Sdarrenr
397145510Sdarrenr
398255332Scyint
399255332Scypoolstats(argc, argv)
400255332Scy	int argc;
401255332Scy	char *argv[];
402145510Sdarrenr{
403145510Sdarrenr	int c, type, role, live_kernel;
404255332Scy	ipf_pool_stat_t plstat;
405255332Scy	ipf_dstl_stat_t dlstat;
406145510Sdarrenr	char *kernel, *core;
407145510Sdarrenr	iphtstat_t htstat;
408145510Sdarrenr	iplookupop_t op;
409145510Sdarrenr
410145510Sdarrenr	core = NULL;
411145510Sdarrenr	kernel = NULL;
412145510Sdarrenr	live_kernel = 1;
413145510Sdarrenr	type = IPLT_ALL;
414145510Sdarrenr	role = IPL_LOGALL;
415145510Sdarrenr
416145510Sdarrenr	bzero((char *)&op, sizeof(op));
417145510Sdarrenr
418145510Sdarrenr	while ((c = getopt(argc, argv, "dM:N:o:t:v")) != -1)
419145510Sdarrenr		switch (c)
420145510Sdarrenr		{
421145510Sdarrenr		case 'd' :
422145510Sdarrenr			opts |= OPT_DEBUG;
423145510Sdarrenr			break;
424145510Sdarrenr		case 'M' :
425145510Sdarrenr			live_kernel = 0;
426145510Sdarrenr			core = optarg;
427145510Sdarrenr			break;
428145510Sdarrenr		case 'N' :
429145510Sdarrenr			live_kernel = 0;
430145510Sdarrenr			kernel = optarg;
431145510Sdarrenr			break;
432145510Sdarrenr		case 'o' :
433145510Sdarrenr			role = getrole(optarg);
434145510Sdarrenr			if (role == IPL_LOGNONE) {
435145510Sdarrenr				fprintf(stderr, "unknown role '%s'\n", optarg);
436145510Sdarrenr				return -1;
437145510Sdarrenr			}
438145510Sdarrenr			break;
439145510Sdarrenr		case 't' :
440145510Sdarrenr			type = gettype(optarg, NULL);
441145510Sdarrenr			if (type != IPLT_POOL) {
442145510Sdarrenr				fprintf(stderr,
443145510Sdarrenr					"-s not supported for this type yet\n");
444145510Sdarrenr				return -1;
445145510Sdarrenr			}
446145510Sdarrenr			break;
447145510Sdarrenr		case 'v' :
448145510Sdarrenr			opts |= OPT_VERBOSE;
449145510Sdarrenr			break;
450145510Sdarrenr		}
451145510Sdarrenr
452145510Sdarrenr	if (opts & OPT_DEBUG)
453145510Sdarrenr		fprintf(stderr, "poolstats: opts = %#x\n", opts);
454145510Sdarrenr
455255332Scy	if (!(opts & (OPT_DONOTHING|OPT_DONTOPEN)) && (fd == -1)) {
456145510Sdarrenr		fd = open(IPLOOKUP_NAME, O_RDWR);
457145510Sdarrenr		if (fd == -1) {
458145510Sdarrenr			perror("open(IPLOOKUP_NAME)");
459145510Sdarrenr			exit(1);
460145510Sdarrenr		}
461145510Sdarrenr	}
462145510Sdarrenr
463145510Sdarrenr	if (type == IPLT_ALL || type == IPLT_POOL) {
464145510Sdarrenr		op.iplo_type = IPLT_POOL;
465145510Sdarrenr		op.iplo_struct = &plstat;
466145510Sdarrenr		op.iplo_size = sizeof(plstat);
467255332Scy		if (!(opts & (OPT_DONOTHING|OPT_DONTOPEN))) {
468145510Sdarrenr			c = ioctl(fd, SIOCLOOKUPSTAT, &op);
469145510Sdarrenr			if (c == -1) {
470255332Scy				ipferror(fd, "ioctl(S0IOCLOOKUPSTAT)");
471145510Sdarrenr				return -1;
472145510Sdarrenr			}
473255332Scy			printf("%lu\taddress pools\n", plstat.ipls_pools);
474255332Scy			printf("%lu\taddress pool nodes\n", plstat.ipls_nodes);
475145510Sdarrenr		}
476145510Sdarrenr	}
477145510Sdarrenr
478145510Sdarrenr	if (type == IPLT_ALL || type == IPLT_HASH) {
479145510Sdarrenr		op.iplo_type = IPLT_HASH;
480145510Sdarrenr		op.iplo_struct = &htstat;
481145510Sdarrenr		op.iplo_size = sizeof(htstat);
482255332Scy		if (!(opts & (OPT_DONOTHING|OPT_DONTOPEN))) {
483145510Sdarrenr			c = ioctl(fd, SIOCLOOKUPSTAT, &op);
484145510Sdarrenr			if (c == -1) {
485255332Scy				ipferror(fd, "ioctl(SIOCLOOKUPSTAT)");
486145510Sdarrenr				return -1;
487145510Sdarrenr			}
488255332Scy			printf("%lu\thash tables\n", htstat.iphs_numtables);
489255332Scy			printf("%lu\thash table nodes\n", htstat.iphs_numnodes);
490255332Scy			printf("%lu\thash table no memory \n",
491255332Scy				htstat.iphs_nomem);
492145510Sdarrenr		}
493145510Sdarrenr	}
494255332Scy
495255332Scy	if (type == IPLT_ALL || type == IPLT_DSTLIST) {
496255332Scy		op.iplo_type = IPLT_DSTLIST;
497255332Scy		op.iplo_struct = &dlstat;
498255332Scy		op.iplo_size = sizeof(dlstat);
499255332Scy		if (!(opts & (OPT_DONOTHING|OPT_DONTOPEN))) {
500255332Scy			c = ioctl(fd, SIOCLOOKUPSTAT, &op);
501255332Scy			if (c == -1) {
502255332Scy				ipferror(fd, "ioctl(SIOCLOOKUPSTAT)");
503255332Scy				return -1;
504255332Scy			}
505255332Scy			printf("%u\tdestination lists\n",
506255332Scy			       dlstat.ipls_numlists);
507255332Scy			printf("%u\tdestination list nodes\n",
508255332Scy			       dlstat.ipls_numnodes);
509255332Scy			printf("%lu\tdestination list no memory\n",
510255332Scy			       dlstat.ipls_nomem);
511255332Scy			printf("%u\tdestination list zombies\n",
512255332Scy			       dlstat.ipls_numdereflists);
513255332Scy			printf("%u\tdesetination list node zombies\n",
514255332Scy			       dlstat.ipls_numderefnodes);
515255332Scy		}
516255332Scy	}
517145510Sdarrenr	return 0;
518145510Sdarrenr}
519145510Sdarrenr
520145510Sdarrenr
521255332Scyint
522255332Scypoolflush(argc, argv)
523255332Scy	int argc;
524255332Scy	char *argv[];
525145510Sdarrenr{
526145510Sdarrenr	int c, role, type, arg;
527145510Sdarrenr	iplookupflush_t flush;
528145510Sdarrenr
529145510Sdarrenr	arg = IPLT_ALL;
530145510Sdarrenr	type = IPLT_ALL;
531145510Sdarrenr	role = IPL_LOGALL;
532145510Sdarrenr
533145510Sdarrenr	while ((c = getopt(argc, argv, "do:t:v")) != -1)
534145510Sdarrenr		switch (c)
535145510Sdarrenr		{
536145510Sdarrenr		case 'd' :
537145510Sdarrenr			opts |= OPT_DEBUG;
538145510Sdarrenr			break;
539145510Sdarrenr		case 'o' :
540145510Sdarrenr			role = getrole(optarg);
541145510Sdarrenr			if (role == IPL_LOGNONE) {
542145510Sdarrenr				fprintf(stderr, "unknown role '%s'\n", optarg);
543145510Sdarrenr				return -1;
544145510Sdarrenr			}
545145510Sdarrenr			break;
546145510Sdarrenr		case 't' :
547145510Sdarrenr			type = gettype(optarg, NULL);
548145510Sdarrenr			if (type == IPLT_NONE) {
549145510Sdarrenr				fprintf(stderr, "unknown type '%s'\n", optarg);
550145510Sdarrenr				return -1;
551145510Sdarrenr			}
552145510Sdarrenr			break;
553145510Sdarrenr		case 'v' :
554145510Sdarrenr			opts |= OPT_VERBOSE;
555145510Sdarrenr			break;
556145510Sdarrenr		}
557145510Sdarrenr
558145510Sdarrenr	if (opts & OPT_DEBUG)
559145510Sdarrenr		fprintf(stderr, "poolflush: opts = %#x\n", opts);
560145510Sdarrenr
561255332Scy	if (!(opts & (OPT_DONOTHING|OPT_DONTOPEN)) && (fd == -1)) {
562145510Sdarrenr		fd = open(IPLOOKUP_NAME, O_RDWR);
563145510Sdarrenr		if (fd == -1) {
564145510Sdarrenr			perror("open(IPLOOKUP_NAME)");
565145510Sdarrenr			exit(1);
566145510Sdarrenr		}
567145510Sdarrenr	}
568145510Sdarrenr
569145510Sdarrenr	bzero((char *)&flush, sizeof(flush));
570145510Sdarrenr	flush.iplf_type = type;
571145510Sdarrenr	flush.iplf_unit = role;
572145510Sdarrenr	flush.iplf_arg = arg;
573145510Sdarrenr
574255332Scy	if (!(opts & (OPT_DONOTHING|OPT_DONTOPEN))) {
575145510Sdarrenr		if (ioctl(fd, SIOCLOOKUPFLUSH, &flush) == -1) {
576255332Scy			ipferror(fd, "ioctl(SIOCLOOKUPFLUSH)");
577145510Sdarrenr			exit(1);
578145510Sdarrenr		}
579145510Sdarrenr
580145510Sdarrenr	}
581255332Scy	printf("%u object%s flushed\n", flush.iplf_count,
582145510Sdarrenr	       (flush.iplf_count == 1) ? "" : "s");
583145510Sdarrenr
584145510Sdarrenr	return 0;
585145510Sdarrenr}
586145510Sdarrenr
587145510Sdarrenr
588255332Scyint
589255332Scygetrole(rolename)
590255332Scy	char *rolename;
591145510Sdarrenr{
592145510Sdarrenr	int role;
593145510Sdarrenr
594145510Sdarrenr	if (!strcasecmp(rolename, "ipf")) {
595145510Sdarrenr		role = IPL_LOGIPF;
596145510Sdarrenr#if 0
597145510Sdarrenr	} else if (!strcasecmp(rolename, "nat")) {
598145510Sdarrenr		role = IPL_LOGNAT;
599145510Sdarrenr	} else if (!strcasecmp(rolename, "state")) {
600145510Sdarrenr		role = IPL_LOGSTATE;
601145510Sdarrenr	} else if (!strcasecmp(rolename, "auth")) {
602145510Sdarrenr		role = IPL_LOGAUTH;
603145510Sdarrenr	} else if (!strcasecmp(rolename, "sync")) {
604145510Sdarrenr		role = IPL_LOGSYNC;
605145510Sdarrenr	} else if (!strcasecmp(rolename, "scan")) {
606145510Sdarrenr		role = IPL_LOGSCAN;
607145510Sdarrenr	} else if (!strcasecmp(rolename, "pool")) {
608145510Sdarrenr		role = IPL_LOGLOOKUP;
609145510Sdarrenr	} else if (!strcasecmp(rolename, "count")) {
610145510Sdarrenr		role = IPL_LOGCOUNT;
611145510Sdarrenr#endif
612145510Sdarrenr	} else {
613145510Sdarrenr		role = IPL_LOGNONE;
614145510Sdarrenr	}
615145510Sdarrenr
616145510Sdarrenr	return role;
617145510Sdarrenr}
618145510Sdarrenr
619145510Sdarrenr
620255332Scyint
621255332Scygettype(typename, minor)
622255332Scy	char *typename;
623255332Scy	u_int *minor;
624145510Sdarrenr{
625145510Sdarrenr	int type;
626145510Sdarrenr
627255332Scy	if (!strcasecmp(typename, "tree") || !strcasecmp(typename, "pool")) {
628145510Sdarrenr		type = IPLT_POOL;
629255332Scy	} else if (!strcasecmp(typename, "hash")) {
630145510Sdarrenr		type = IPLT_HASH;
631145510Sdarrenr		if (minor != NULL)
632145510Sdarrenr			*minor = IPHASH_LOOKUP;
633255332Scy	} else if (!strcasecmp(typename, "group-map")) {
634145510Sdarrenr		type = IPLT_HASH;
635145510Sdarrenr		if (minor != NULL)
636145510Sdarrenr			*minor = IPHASH_GROUPMAP;
637145510Sdarrenr	} else {
638145510Sdarrenr		type = IPLT_NONE;
639145510Sdarrenr	}
640145510Sdarrenr	return type;
641145510Sdarrenr}
642170268Sdarrenr
643170268Sdarrenr
644255332Scyint
645255332Scypoollist(argc, argv)
646255332Scy	int argc;
647255332Scy	char *argv[];
648170268Sdarrenr{
649170268Sdarrenr	char *kernel, *core, *poolname;
650170268Sdarrenr	int c, role, type, live_kernel;
651170268Sdarrenr	iplookupop_t op;
652170268Sdarrenr
653170268Sdarrenr	core = NULL;
654170268Sdarrenr	kernel = NULL;
655170268Sdarrenr	live_kernel = 1;
656170268Sdarrenr	type = IPLT_ALL;
657170268Sdarrenr	poolname = NULL;
658170268Sdarrenr	role = IPL_LOGALL;
659170268Sdarrenr
660353074Scy	while ((c = getopt(argc, argv, "dm:M:N:o:t:v")) != -1)
661170268Sdarrenr		switch (c)
662170268Sdarrenr		{
663170268Sdarrenr		case 'd' :
664170268Sdarrenr			opts |= OPT_DEBUG;
665170268Sdarrenr			break;
666170268Sdarrenr		case 'm' :
667170268Sdarrenr			poolname = optarg;
668170268Sdarrenr			break;
669170268Sdarrenr		case 'M' :
670170268Sdarrenr			live_kernel = 0;
671170268Sdarrenr			core = optarg;
672170268Sdarrenr			break;
673170268Sdarrenr		case 'N' :
674170268Sdarrenr			live_kernel = 0;
675170268Sdarrenr			kernel = optarg;
676170268Sdarrenr			break;
677170268Sdarrenr		case 'o' :
678170268Sdarrenr			role = getrole(optarg);
679170268Sdarrenr			if (role == IPL_LOGNONE) {
680170268Sdarrenr				fprintf(stderr, "unknown role '%s'\n", optarg);
681170268Sdarrenr				return -1;
682170268Sdarrenr			}
683170268Sdarrenr			break;
684255332Scy		case 'O' :
685255332Scy			pool_fields = parsefields(poolfields, optarg);
686255332Scy			break;
687170268Sdarrenr		case 't' :
688170268Sdarrenr			type = gettype(optarg, NULL);
689170268Sdarrenr			if (type == IPLT_NONE) {
690170268Sdarrenr				fprintf(stderr, "unknown type '%s'\n", optarg);
691170268Sdarrenr				return -1;
692170268Sdarrenr			}
693170268Sdarrenr			break;
694170268Sdarrenr		case 'v' :
695170268Sdarrenr			opts |= OPT_VERBOSE;
696170268Sdarrenr			break;
697170268Sdarrenr		}
698170268Sdarrenr
699170268Sdarrenr	if (opts & OPT_DEBUG)
700170268Sdarrenr		fprintf(stderr, "poollist: opts = %#x\n", opts);
701170268Sdarrenr
702255332Scy	if (!(opts & (OPT_DONOTHING|OPT_DONTOPEN)) && (fd == -1)) {
703170268Sdarrenr		fd = open(IPLOOKUP_NAME, O_RDWR);
704170268Sdarrenr		if (fd == -1) {
705170268Sdarrenr			perror("open(IPLOOKUP_NAME)");
706170268Sdarrenr			exit(1);
707170268Sdarrenr		}
708170268Sdarrenr	}
709170268Sdarrenr
710170268Sdarrenr	bzero((char *)&op, sizeof(op));
711170268Sdarrenr	if (poolname != NULL) {
712170268Sdarrenr		strncpy(op.iplo_name, poolname, sizeof(op.iplo_name));
713170268Sdarrenr		op.iplo_name[sizeof(op.iplo_name) - 1] = '\0';
714170268Sdarrenr	}
715170268Sdarrenr	op.iplo_unit = role;
716170268Sdarrenr
717170268Sdarrenr	if (live_kernel)
718170268Sdarrenr		poollist_live(role, poolname, type, fd);
719170268Sdarrenr	else
720170268Sdarrenr		poollist_dead(role, poolname, type, kernel, core);
721170268Sdarrenr	return 0;
722170268Sdarrenr}
723170268Sdarrenr
724170268Sdarrenr
725255332Scyvoid
726255332Scypoollist_dead(role, poolname, type, kernel, core)
727255332Scy	int role, type;
728255332Scy	char *poolname, *kernel, *core;
729170268Sdarrenr{
730170268Sdarrenr	iphtable_t *hptr;
731170268Sdarrenr	ip_pool_t *ptr;
732170268Sdarrenr
733170268Sdarrenr	if (openkmem(kernel, core) == -1)
734170268Sdarrenr		exit(-1);
735170268Sdarrenr
736170268Sdarrenr	if (type == IPLT_ALL || type == IPLT_POOL) {
737170268Sdarrenr		ip_pool_t *pools[IPL_LOGSIZE];
738170268Sdarrenr		struct nlist names[2] = { { "ip_pool_list" } , { "" } };
739170268Sdarrenr
740170268Sdarrenr		if (nlist(kernel, names) != 1)
741170268Sdarrenr			return;
742170268Sdarrenr
743170268Sdarrenr		bzero(&pools, sizeof(pools));
744170268Sdarrenr		if (kmemcpy((char *)&pools, names[0].n_value, sizeof(pools)))
745170268Sdarrenr			return;
746170268Sdarrenr
747170268Sdarrenr		if (role != IPL_LOGALL) {
748170268Sdarrenr			ptr = pools[role];
749170268Sdarrenr			while (ptr != NULL) {
750170268Sdarrenr				ptr = printpool(ptr, kmemcpywrap, poolname,
751255332Scy						opts, pool_fields);
752170268Sdarrenr			}
753170268Sdarrenr		} else {
754170268Sdarrenr			for (role = 0; role <= IPL_LOGMAX; role++) {
755170268Sdarrenr				ptr = pools[role];
756170268Sdarrenr				while (ptr != NULL) {
757170268Sdarrenr					ptr = printpool(ptr, kmemcpywrap,
758255332Scy							poolname, opts,
759255332Scy							pool_fields);
760170268Sdarrenr				}
761170268Sdarrenr			}
762170268Sdarrenr			role = IPL_LOGALL;
763170268Sdarrenr		}
764170268Sdarrenr	}
765170268Sdarrenr	if (type == IPLT_ALL || type == IPLT_HASH) {
766170268Sdarrenr		iphtable_t *tables[IPL_LOGSIZE];
767170268Sdarrenr		struct nlist names[2] = { { "ipf_htables" } , { "" } };
768170268Sdarrenr
769170268Sdarrenr		if (nlist(kernel, names) != 1)
770170268Sdarrenr			return;
771170268Sdarrenr
772170268Sdarrenr		bzero(&tables, sizeof(tables));
773170268Sdarrenr		if (kmemcpy((char *)&tables, names[0].n_value, sizeof(tables)))
774170268Sdarrenr			return;
775170268Sdarrenr
776170268Sdarrenr		if (role != IPL_LOGALL) {
777170268Sdarrenr			hptr = tables[role];
778170268Sdarrenr			while (hptr != NULL) {
779170268Sdarrenr				hptr = printhash(hptr, kmemcpywrap,
780255332Scy						 poolname, opts, pool_fields);
781170268Sdarrenr			}
782170268Sdarrenr		} else {
783170268Sdarrenr			for (role = 0; role <= IPL_LOGMAX; role++) {
784170268Sdarrenr				hptr = tables[role];
785170268Sdarrenr				while (hptr != NULL) {
786170268Sdarrenr					hptr = printhash(hptr, kmemcpywrap,
787255332Scy							 poolname, opts,
788255332Scy							 pool_fields);
789170268Sdarrenr				}
790170268Sdarrenr			}
791170268Sdarrenr		}
792170268Sdarrenr	}
793170268Sdarrenr}
794170268Sdarrenr
795170268Sdarrenr
796255332Scyvoid
797255332Scypoollist_live(role, poolname, type, fd)
798255332Scy	int role, type, fd;
799255332Scy	char *poolname;
800170268Sdarrenr{
801255332Scy	ipf_pool_stat_t plstat;
802170268Sdarrenr	iplookupop_t op;
803170268Sdarrenr	int c;
804170268Sdarrenr
805170268Sdarrenr	if (type == IPLT_ALL || type == IPLT_POOL) {
806170268Sdarrenr		op.iplo_type = IPLT_POOL;
807170268Sdarrenr		op.iplo_size = sizeof(plstat);
808170268Sdarrenr		op.iplo_struct = &plstat;
809170268Sdarrenr		op.iplo_name[0] = '\0';
810170268Sdarrenr		op.iplo_arg = 0;
811170268Sdarrenr
812170268Sdarrenr		if (role != IPL_LOGALL) {
813170268Sdarrenr			op.iplo_unit = role;
814170268Sdarrenr
815170268Sdarrenr			c = ioctl(fd, SIOCLOOKUPSTAT, &op);
816170268Sdarrenr			if (c == -1) {
817255332Scy				ipferror(fd, "ioctl(SIOCLOOKUPSTAT)");
818170268Sdarrenr				return;
819170268Sdarrenr			}
820170268Sdarrenr
821170268Sdarrenr			showpools_live(fd, role, &plstat, poolname);
822170268Sdarrenr		} else {
823255332Scy			for (role = -1; role <= IPL_LOGMAX; role++) {
824170268Sdarrenr				op.iplo_unit = role;
825170268Sdarrenr
826170268Sdarrenr				c = ioctl(fd, SIOCLOOKUPSTAT, &op);
827170268Sdarrenr				if (c == -1) {
828255332Scy					ipferror(fd, "ioctl(SIOCLOOKUPSTAT)");
829170268Sdarrenr					return;
830170268Sdarrenr				}
831170268Sdarrenr
832170268Sdarrenr				showpools_live(fd, role, &plstat, poolname);
833170268Sdarrenr			}
834170268Sdarrenr
835170268Sdarrenr			role = IPL_LOGALL;
836170268Sdarrenr		}
837170268Sdarrenr	}
838170268Sdarrenr
839170268Sdarrenr	if (type == IPLT_ALL || type == IPLT_HASH) {
840255332Scy		iphtstat_t htstat;
841255332Scy
842170268Sdarrenr		op.iplo_type = IPLT_HASH;
843170268Sdarrenr		op.iplo_size = sizeof(htstat);
844170268Sdarrenr		op.iplo_struct = &htstat;
845170268Sdarrenr		op.iplo_name[0] = '\0';
846170268Sdarrenr		op.iplo_arg = 0;
847170268Sdarrenr
848170268Sdarrenr		if (role != IPL_LOGALL) {
849170268Sdarrenr			op.iplo_unit = role;
850170268Sdarrenr
851170268Sdarrenr			c = ioctl(fd, SIOCLOOKUPSTAT, &op);
852170268Sdarrenr			if (c == -1) {
853255332Scy				ipferror(fd, "ioctl(SIOCLOOKUPSTAT)");
854170268Sdarrenr				return;
855170268Sdarrenr			}
856170268Sdarrenr			showhashs_live(fd, role, &htstat, poolname);
857170268Sdarrenr		} else {
858170268Sdarrenr			for (role = 0; role <= IPL_LOGMAX; role++) {
859170268Sdarrenr
860170268Sdarrenr				op.iplo_unit = role;
861170268Sdarrenr				c = ioctl(fd, SIOCLOOKUPSTAT, &op);
862170268Sdarrenr				if (c == -1) {
863255332Scy					ipferror(fd, "ioctl(SIOCLOOKUPSTAT)");
864170268Sdarrenr					return;
865170268Sdarrenr				}
866170268Sdarrenr
867170268Sdarrenr				showhashs_live(fd, role, &htstat, poolname);
868170268Sdarrenr			}
869255332Scy			role = IPL_LOGALL;
870170268Sdarrenr		}
871170268Sdarrenr	}
872255332Scy
873255332Scy	if (type == IPLT_ALL || type == IPLT_DSTLIST) {
874255332Scy		ipf_dstl_stat_t dlstat;
875255332Scy
876255332Scy		op.iplo_type = IPLT_DSTLIST;
877255332Scy		op.iplo_size = sizeof(dlstat);
878255332Scy		op.iplo_struct = &dlstat;
879255332Scy		op.iplo_name[0] = '\0';
880255332Scy		op.iplo_arg = 0;
881255332Scy
882255332Scy		if (role != IPL_LOGALL) {
883255332Scy			op.iplo_unit = role;
884255332Scy
885255332Scy			c = ioctl(fd, SIOCLOOKUPSTAT, &op);
886255332Scy			if (c == -1) {
887255332Scy				ipferror(fd, "ioctl(SIOCLOOKUPSTAT)");
888255332Scy				return;
889255332Scy			}
890255332Scy			showdstls_live(fd, role, &dlstat, poolname);
891255332Scy		} else {
892255332Scy			for (role = 0; role <= IPL_LOGMAX; role++) {
893255332Scy
894255332Scy				op.iplo_unit = role;
895255332Scy				c = ioctl(fd, SIOCLOOKUPSTAT, &op);
896255332Scy				if (c == -1) {
897255332Scy					ipferror(fd, "ioctl(SIOCLOOKUPSTAT)");
898255332Scy					return;
899255332Scy				}
900255332Scy
901255332Scy				showdstls_live(fd, role, &dlstat, poolname);
902255332Scy			}
903255332Scy			role = IPL_LOGALL;
904255332Scy		}
905255332Scy	}
906170268Sdarrenr}
907170268Sdarrenr
908170268Sdarrenr
909255332Scyvoid
910255332Scyshowpools_live(fd, role, plstp, poolname)
911255332Scy	int fd, role;
912255332Scy	ipf_pool_stat_t *plstp;
913255332Scy	char *poolname;
914170268Sdarrenr{
915170268Sdarrenr	ipflookupiter_t iter;
916170268Sdarrenr	ip_pool_t pool;
917170268Sdarrenr	ipfobj_t obj;
918170268Sdarrenr
919170268Sdarrenr	obj.ipfo_rev = IPFILTER_VERSION;
920170268Sdarrenr	obj.ipfo_type = IPFOBJ_LOOKUPITER;
921170268Sdarrenr	obj.ipfo_size = sizeof(iter);
922170268Sdarrenr	obj.ipfo_ptr = &iter;
923170268Sdarrenr
924170268Sdarrenr	iter.ili_type = IPLT_POOL;
925170268Sdarrenr	iter.ili_otype = IPFLOOKUPITER_LIST;
926170268Sdarrenr	iter.ili_ival = IPFGENITER_LOOKUP;
927170268Sdarrenr	iter.ili_nitems = 1;
928170268Sdarrenr	iter.ili_data = &pool;
929170268Sdarrenr	iter.ili_unit = role;
930170268Sdarrenr	*iter.ili_name = '\0';
931170268Sdarrenr
932255332Scy	bzero((char *)&pool, sizeof(pool));
933255332Scy
934255332Scy	while (plstp->ipls_list[role + 1] != NULL) {
935170268Sdarrenr		if (ioctl(fd, SIOCLOOKUPITER, &obj)) {
936255332Scy			ipferror(fd, "ioctl(SIOCLOOKUPITER)");
937170268Sdarrenr			break;
938170268Sdarrenr		}
939255332Scy		if (((pool.ipo_flags & IPOOL_DELETE) == 0) ||
940255332Scy		    ((opts & OPT_DEBUG) != 0))
941255332Scy			printpool_live(&pool, fd, poolname, opts, pool_fields);
942170268Sdarrenr
943255332Scy		plstp->ipls_list[role + 1] = pool.ipo_next;
944170268Sdarrenr	}
945170268Sdarrenr}
946170268Sdarrenr
947170268Sdarrenr
948255332Scyvoid
949255332Scyshowhashs_live(fd, role, htstp, poolname)
950255332Scy	int fd, role;
951255332Scy	iphtstat_t *htstp;
952255332Scy	char *poolname;
953170268Sdarrenr{
954170268Sdarrenr	ipflookupiter_t iter;
955170268Sdarrenr	iphtable_t table;
956170268Sdarrenr	ipfobj_t obj;
957170268Sdarrenr
958170268Sdarrenr	obj.ipfo_rev = IPFILTER_VERSION;
959170268Sdarrenr	obj.ipfo_type = IPFOBJ_LOOKUPITER;
960170268Sdarrenr	obj.ipfo_size = sizeof(iter);
961170268Sdarrenr	obj.ipfo_ptr = &iter;
962170268Sdarrenr
963170268Sdarrenr	iter.ili_type = IPLT_HASH;
964170268Sdarrenr	iter.ili_otype = IPFLOOKUPITER_LIST;
965170268Sdarrenr	iter.ili_ival = IPFGENITER_LOOKUP;
966170268Sdarrenr	iter.ili_nitems = 1;
967170268Sdarrenr	iter.ili_data = &table;
968170268Sdarrenr	iter.ili_unit = role;
969170268Sdarrenr	*iter.ili_name = '\0';
970170268Sdarrenr
971170268Sdarrenr	while (htstp->iphs_tables != NULL) {
972170268Sdarrenr		if (ioctl(fd, SIOCLOOKUPITER, &obj)) {
973255332Scy			ipferror(fd, "ioctl(SIOCLOOKUPITER)");
974170268Sdarrenr			break;
975170268Sdarrenr		}
976170268Sdarrenr
977255332Scy		printhash_live(&table, fd, poolname, opts, pool_fields);
978170268Sdarrenr
979170268Sdarrenr		htstp->iphs_tables = table.iph_next;
980170268Sdarrenr	}
981170268Sdarrenr}
982170268Sdarrenr
983170268Sdarrenr
984255332Scyvoid
985255332Scyshowdstls_live(fd, role, dlstp, poolname)
986255332Scy	int fd, role;
987255332Scy	ipf_dstl_stat_t *dlstp;
988255332Scy	char *poolname;
989170268Sdarrenr{
990255332Scy	ipflookupiter_t iter;
991255332Scy	ippool_dst_t table;
992255332Scy	ipfobj_t obj;
993255332Scy
994255332Scy	obj.ipfo_rev = IPFILTER_VERSION;
995255332Scy	obj.ipfo_type = IPFOBJ_LOOKUPITER;
996255332Scy	obj.ipfo_size = sizeof(iter);
997255332Scy	obj.ipfo_ptr = &iter;
998255332Scy
999255332Scy	iter.ili_type = IPLT_DSTLIST;
1000255332Scy	iter.ili_otype = IPFLOOKUPITER_LIST;
1001255332Scy	iter.ili_ival = IPFGENITER_LOOKUP;
1002255332Scy	iter.ili_nitems = 1;
1003255332Scy	iter.ili_data = &table;
1004255332Scy	iter.ili_unit = role;
1005255332Scy	*iter.ili_name = '\0';
1006255332Scy
1007255332Scy	while (dlstp->ipls_list[role] != NULL) {
1008255332Scy		if (ioctl(fd, SIOCLOOKUPITER, &obj)) {
1009255332Scy			ipferror(fd, "ioctl(SIOCLOOKUPITER)");
1010255332Scy			break;
1011255332Scy		}
1012255332Scy
1013255332Scy		printdstl_live(&table, fd, poolname, opts, pool_fields);
1014255332Scy
1015255332Scy		dlstp->ipls_list[role] = table.ipld_next;
1016255332Scy	}
1017255332Scy}
1018255332Scy
1019255332Scy
1020255332Scyint
1021255332Scysetnodeaddr(int type, int role, void *ptr, char *arg)
1022255332Scy{
1023170268Sdarrenr	struct in_addr mask;
1024170268Sdarrenr	char *s;
1025170268Sdarrenr
1026170268Sdarrenr	s = strchr(arg, '/');
1027170268Sdarrenr	if (s == NULL)
1028170268Sdarrenr		mask.s_addr = 0xffffffff;
1029170268Sdarrenr	else if (strchr(s, '.') == NULL) {
1030255332Scy		if (ntomask(AF_INET, atoi(s + 1), &mask.s_addr) != 0)
1031170268Sdarrenr			return -1;
1032170268Sdarrenr	} else {
1033170268Sdarrenr		mask.s_addr = inet_addr(s + 1);
1034170268Sdarrenr	}
1035170268Sdarrenr	if (s != NULL)
1036170268Sdarrenr		*s = '\0';
1037170268Sdarrenr
1038255332Scy	if (type == IPLT_POOL) {
1039255332Scy		ip_pool_node_t *node = ptr;
1040255332Scy
1041318206Scy#ifdef USE_INET6
1042255332Scy		if (node->ipn_addr.adf_family == AF_INET)
1043318206Scy#endif
1044255332Scy			node->ipn_addr.adf_len = offsetof(addrfamily_t,
1045255332Scy							  adf_addr) +
1046255332Scy						 sizeof(struct in_addr);
1047255332Scy#ifdef USE_INET6
1048255332Scy		else
1049255332Scy			node->ipn_addr.adf_len = offsetof(addrfamily_t,
1050255332Scy							  adf_addr) +
1051255332Scy						 sizeof(struct in6_addr);
1052255332Scy#endif
1053255332Scy		node->ipn_addr.adf_addr.in4.s_addr = inet_addr(arg);
1054255332Scy		node->ipn_mask.adf_len = node->ipn_addr.adf_len;
1055255332Scy		node->ipn_mask.adf_addr.in4.s_addr = mask.s_addr;
1056255332Scy	} else if (type == IPLT_HASH) {
1057255332Scy		iphtent_t *node = ptr;
1058255332Scy
1059255332Scy		node->ipe_addr.in4.s_addr = inet_addr(arg);
1060255332Scy		node->ipe_mask.in4.s_addr = mask.s_addr;
1061255332Scy        	node->ipe_family = AF_INET;
1062255332Scy        	node->ipe_unit = role;
1063255332Scy	}
1064255332Scy
1065170268Sdarrenr	return 0;
1066170268Sdarrenr}
1067