xref: /illumos-gate/usr/src/cmd/ipf/tools/ippool.c (revision 94bdecd9e84ae1042607002db3e64a6849da5874)
17c478bd9Sstevel@tonic-gate /*
27c478bd9Sstevel@tonic-gate  * Copyright (C) 2003 by Darren Reed.
37c478bd9Sstevel@tonic-gate  *
47c478bd9Sstevel@tonic-gate  * See the IPFILTER.LICENCE file for details on licencing.
57c478bd9Sstevel@tonic-gate  *
6f4b3ec61Sdh155122  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
77c478bd9Sstevel@tonic-gate  * Use is subject to license terms.
8*94bdecd9SRob Gulewich  *
9*94bdecd9SRob Gulewich  * Copyright (c) 2014, Joyent, Inc.  All rights reserved.
107c478bd9Sstevel@tonic-gate  */
117c478bd9Sstevel@tonic-gate 
127c478bd9Sstevel@tonic-gate #include <sys/types.h>
137c478bd9Sstevel@tonic-gate #include <sys/time.h>
147c478bd9Sstevel@tonic-gate #include <sys/param.h>
157c478bd9Sstevel@tonic-gate #include <sys/socket.h>
167c478bd9Sstevel@tonic-gate #if defined(BSD) && (BSD >= 199306)
177c478bd9Sstevel@tonic-gate # include <sys/cdefs.h>
187c478bd9Sstevel@tonic-gate #endif
197c478bd9Sstevel@tonic-gate #include <sys/ioctl.h>
207c478bd9Sstevel@tonic-gate 
217c478bd9Sstevel@tonic-gate #include <net/if.h>
227c478bd9Sstevel@tonic-gate #if __FreeBSD_version >= 300000
237c478bd9Sstevel@tonic-gate # include <net/if_var.h>
247c478bd9Sstevel@tonic-gate #endif
257c478bd9Sstevel@tonic-gate #include <netinet/in.h>
267c478bd9Sstevel@tonic-gate 
277c478bd9Sstevel@tonic-gate #include <arpa/inet.h>
287c478bd9Sstevel@tonic-gate 
297c478bd9Sstevel@tonic-gate #include <stdio.h>
307c478bd9Sstevel@tonic-gate #include <fcntl.h>
317c478bd9Sstevel@tonic-gate #include <stdlib.h>
327c478bd9Sstevel@tonic-gate #include <string.h>
337c478bd9Sstevel@tonic-gate #include <netdb.h>
347c478bd9Sstevel@tonic-gate #include <ctype.h>
357c478bd9Sstevel@tonic-gate #include <unistd.h>
36f4b3ec61Sdh155122 #include <nlist.h>
377c478bd9Sstevel@tonic-gate 
387c478bd9Sstevel@tonic-gate #include "ipf.h"
39f4b3ec61Sdh155122 #include "netinet/ipl.h"
407c478bd9Sstevel@tonic-gate #include "netinet/ip_lookup.h"
417c478bd9Sstevel@tonic-gate #include "netinet/ip_pool.h"
427c478bd9Sstevel@tonic-gate #include "netinet/ip_htable.h"
437c478bd9Sstevel@tonic-gate #include "kmem.h"
44*94bdecd9SRob Gulewich #include "ipfzone.h"
457c478bd9Sstevel@tonic-gate 
467c478bd9Sstevel@tonic-gate extern	int	ippool_yyparse __P((void));
477c478bd9Sstevel@tonic-gate extern	int	ippool_yydebug;
487c478bd9Sstevel@tonic-gate extern	FILE	*ippool_yyin;
497c478bd9Sstevel@tonic-gate extern	char	*optarg;
507c478bd9Sstevel@tonic-gate extern	int	lineNum;
517c478bd9Sstevel@tonic-gate 
527c478bd9Sstevel@tonic-gate void	showpools __P((ip_pool_stat_t *));
537c478bd9Sstevel@tonic-gate void	usage __P((char *));
547c478bd9Sstevel@tonic-gate int	main __P((int, char **));
557c478bd9Sstevel@tonic-gate int	poolcommand __P((int, int, char *[]));
567c478bd9Sstevel@tonic-gate int	poolnodecommand __P((int, int, char *[]));
577c478bd9Sstevel@tonic-gate int	loadpoolfile __P((int, char *[], char *));
587c478bd9Sstevel@tonic-gate int	poollist __P((int, char *[]));
597c478bd9Sstevel@tonic-gate int	poolflush __P((int, char *[]));
607c478bd9Sstevel@tonic-gate int	poolstats __P((int, char *[]));
617c478bd9Sstevel@tonic-gate int	gettype __P((char *, u_int *));
627c478bd9Sstevel@tonic-gate int	getrole __P((char *));
63f4b3ec61Sdh155122 void	poollist_dead __P((int, char *, int, char *, char *));
64f4b3ec61Sdh155122 void	showpools_live(int, int, ip_pool_stat_t *, char *, int);
65f4b3ec61Sdh155122 void	showhashs_live(int, int, iphtstat_t *, char *, int);
667c478bd9Sstevel@tonic-gate 
677c478bd9Sstevel@tonic-gate int	opts = 0;
687c478bd9Sstevel@tonic-gate int	fd = -1;
697c478bd9Sstevel@tonic-gate int	use_inet6 = 0;
707c478bd9Sstevel@tonic-gate 
717c478bd9Sstevel@tonic-gate 
727c478bd9Sstevel@tonic-gate void usage(prog)
737c478bd9Sstevel@tonic-gate char *prog;
747c478bd9Sstevel@tonic-gate {
75*94bdecd9SRob Gulewich 	const char *zoneopt = "[-G|-z zonename] ";
767c478bd9Sstevel@tonic-gate 	fprintf(stderr, "Usage:\t%s\n", prog);
77*94bdecd9SRob Gulewich 	fprintf(stderr, "\t\t\t-a [-dnv] %s[-m <name>] [-o <role>] -i <ipaddr>[/netmask]\n",
78*94bdecd9SRob Gulewich 	    zoneopt);
79*94bdecd9SRob Gulewich 	fprintf(stderr, "\t\t\t-A [-dnv] %s[-m <name>] [-o <role>] [-S <seed>] [-t <type>]\n",
80*94bdecd9SRob Gulewich 	    zoneopt);
81*94bdecd9SRob Gulewich 	fprintf(stderr, "\t\t\t-f <file> %s[-dnuv]\n", zoneopt);
82*94bdecd9SRob Gulewich 	fprintf(stderr, "\t\t\t-F [-dv] %s[-o <role>] [-t <type>]\n", zoneopt);
83*94bdecd9SRob Gulewich 	fprintf(stderr, "\t\t\t-l [-dv] %s[-m <name>] [-t <type>]\n", zoneopt);
84*94bdecd9SRob Gulewich 	fprintf(stderr, "\t\t\t-r [-dnv] %s[-m <name>] [-o <role>] -i <ipaddr>[/netmask]\n",
85*94bdecd9SRob Gulewich 	    zoneopt);
86*94bdecd9SRob Gulewich 	fprintf(stderr, "\t\t\t-R [-dnv] %s[-m <name>] [-o <role>] [-t <type>]\n",
87*94bdecd9SRob Gulewich 	    zoneopt);
88*94bdecd9SRob Gulewich 	fprintf(stderr, "\t\t\t-s [-dtv] %s[-M <core>] [-N <namelist>]\n",
89*94bdecd9SRob Gulewich 	    zoneopt);
907c478bd9Sstevel@tonic-gate 	exit(1);
917c478bd9Sstevel@tonic-gate }
927c478bd9Sstevel@tonic-gate 
937c478bd9Sstevel@tonic-gate 
947c478bd9Sstevel@tonic-gate int main(argc, argv)
957c478bd9Sstevel@tonic-gate int argc;
967c478bd9Sstevel@tonic-gate char *argv[];
977c478bd9Sstevel@tonic-gate {
987c478bd9Sstevel@tonic-gate 	int err;
997c478bd9Sstevel@tonic-gate 
1007c478bd9Sstevel@tonic-gate 	if (argc < 2)
1017c478bd9Sstevel@tonic-gate 		usage(argv[0]);
1027c478bd9Sstevel@tonic-gate 
1037c478bd9Sstevel@tonic-gate 	switch (getopt(argc, argv, "aAf:FlrRs"))
1047c478bd9Sstevel@tonic-gate 	{
1057c478bd9Sstevel@tonic-gate 	case 'a' :
1067c478bd9Sstevel@tonic-gate 		err = poolnodecommand(0, argc, argv);
1077c478bd9Sstevel@tonic-gate 		break;
1087c478bd9Sstevel@tonic-gate 	case 'A' :
1097c478bd9Sstevel@tonic-gate 		err = poolcommand(0, argc, argv);
1107c478bd9Sstevel@tonic-gate 		break;
1117c478bd9Sstevel@tonic-gate 	case 'f' :
1127c478bd9Sstevel@tonic-gate 		err = loadpoolfile(argc, argv, optarg);
1137c478bd9Sstevel@tonic-gate 		break;
1147c478bd9Sstevel@tonic-gate 	case 'F' :
1157c478bd9Sstevel@tonic-gate 		err = poolflush(argc, argv);
1167c478bd9Sstevel@tonic-gate 		break;
1177c478bd9Sstevel@tonic-gate 	case 'l' :
1187c478bd9Sstevel@tonic-gate 		err = poollist(argc, argv);
1197c478bd9Sstevel@tonic-gate 		break;
1207c478bd9Sstevel@tonic-gate 	case 'r' :
1217c478bd9Sstevel@tonic-gate 		err = poolnodecommand(1, argc, argv);
1227c478bd9Sstevel@tonic-gate 		break;
1237c478bd9Sstevel@tonic-gate 	case 'R' :
1247c478bd9Sstevel@tonic-gate 		err = poolcommand(1, argc, argv);
1257c478bd9Sstevel@tonic-gate 		break;
1267c478bd9Sstevel@tonic-gate 	case 's' :
1277c478bd9Sstevel@tonic-gate 		err = poolstats(argc, argv);
1287c478bd9Sstevel@tonic-gate 		break;
1297c478bd9Sstevel@tonic-gate 	default :
1307c478bd9Sstevel@tonic-gate 		exit(1);
1317c478bd9Sstevel@tonic-gate 	}
1327c478bd9Sstevel@tonic-gate 
1337c478bd9Sstevel@tonic-gate 	return err;
1347c478bd9Sstevel@tonic-gate }
1357c478bd9Sstevel@tonic-gate 
1367c478bd9Sstevel@tonic-gate 
1377c478bd9Sstevel@tonic-gate int poolnodecommand(remove, argc, argv)
1387c478bd9Sstevel@tonic-gate int remove, argc;
1397c478bd9Sstevel@tonic-gate char *argv[];
1407c478bd9Sstevel@tonic-gate {
1417c478bd9Sstevel@tonic-gate 	char *poolname = NULL, *s;
1427c478bd9Sstevel@tonic-gate 	int err, c, ipset, role;
1437c478bd9Sstevel@tonic-gate 	ip_pool_node_t node;
1447c478bd9Sstevel@tonic-gate 	struct in_addr mask;
1457c478bd9Sstevel@tonic-gate 
1467c478bd9Sstevel@tonic-gate 	ipset = 0;
1477c478bd9Sstevel@tonic-gate 	role = IPL_LOGIPF;
1487c478bd9Sstevel@tonic-gate 	bzero((char *)&node, sizeof(node));
1497c478bd9Sstevel@tonic-gate 
150*94bdecd9SRob Gulewich 	while ((c = getopt(argc, argv, "di:G:m:no:Rvz:")) != -1)
1517c478bd9Sstevel@tonic-gate 		switch (c)
1527c478bd9Sstevel@tonic-gate 		{
1537c478bd9Sstevel@tonic-gate 		case 'd' :
1547c478bd9Sstevel@tonic-gate 			opts |= OPT_DEBUG;
1557c478bd9Sstevel@tonic-gate 			ippool_yydebug++;
1567c478bd9Sstevel@tonic-gate 			break;
157*94bdecd9SRob Gulewich 		case 'G' :
158*94bdecd9SRob Gulewich 			setzonename_global(optarg);
159*94bdecd9SRob Gulewich 			break;
1607c478bd9Sstevel@tonic-gate 		case 'i' :
1617c478bd9Sstevel@tonic-gate 			s = strchr(optarg, '/');
1627c478bd9Sstevel@tonic-gate 			if (s == NULL)
1637c478bd9Sstevel@tonic-gate 				mask.s_addr = 0xffffffff;
1647c478bd9Sstevel@tonic-gate 			else if (strchr(s, '.') == NULL) {
1657c478bd9Sstevel@tonic-gate 				if (ntomask(4, atoi(s + 1), &mask.s_addr) != 0)
1667c478bd9Sstevel@tonic-gate 					return -1;
1677c478bd9Sstevel@tonic-gate 			} else {
1687c478bd9Sstevel@tonic-gate 				mask.s_addr = inet_addr(s + 1);
1697c478bd9Sstevel@tonic-gate 			}
1707c478bd9Sstevel@tonic-gate 			if (s != NULL)
1717c478bd9Sstevel@tonic-gate 				*s = '\0';
1727c478bd9Sstevel@tonic-gate 			ipset = 1;
173ab25eeb5Syz155240 			node.ipn_addr.adf_len = sizeof(node.ipn_addr);
1747c478bd9Sstevel@tonic-gate 			node.ipn_addr.adf_addr.in4.s_addr = inet_addr(optarg);
175ab25eeb5Syz155240 			node.ipn_mask.adf_len = sizeof(node.ipn_mask);
1767c478bd9Sstevel@tonic-gate 			node.ipn_mask.adf_addr.in4.s_addr = mask.s_addr;
1777c478bd9Sstevel@tonic-gate 			break;
1787c478bd9Sstevel@tonic-gate 		case 'm' :
1797c478bd9Sstevel@tonic-gate 			poolname = optarg;
1807c478bd9Sstevel@tonic-gate 			break;
1817c478bd9Sstevel@tonic-gate 		case 'n' :
1827c478bd9Sstevel@tonic-gate 			opts |= OPT_DONOTHING;
1837c478bd9Sstevel@tonic-gate 			break;
1847c478bd9Sstevel@tonic-gate 		case 'o' :
1857c478bd9Sstevel@tonic-gate 			role = getrole(optarg);
1867c478bd9Sstevel@tonic-gate 			if (role == IPL_LOGNONE)
1877c478bd9Sstevel@tonic-gate 				return -1;
1887c478bd9Sstevel@tonic-gate 			break;
189ab25eeb5Syz155240 		case 'R' :
190ab25eeb5Syz155240 			opts |= OPT_NORESOLVE;
191ab25eeb5Syz155240 			break;
1927c478bd9Sstevel@tonic-gate 		case 'v' :
1937c478bd9Sstevel@tonic-gate 			opts |= OPT_VERBOSE;
1947c478bd9Sstevel@tonic-gate 			break;
195*94bdecd9SRob Gulewich 		case 'z' :
196*94bdecd9SRob Gulewich 			setzonename(optarg);
197*94bdecd9SRob Gulewich 			break;
1987c478bd9Sstevel@tonic-gate 		}
1997c478bd9Sstevel@tonic-gate 
200ab25eeb5Syz155240 	if (opts & OPT_DEBUG)
201ab25eeb5Syz155240 		fprintf(stderr, "poolnodecommand: opts = %#x\n", opts);
202ab25eeb5Syz155240 
2037c478bd9Sstevel@tonic-gate 	if (ipset == 0)
2047c478bd9Sstevel@tonic-gate 		return -1;
2057c478bd9Sstevel@tonic-gate 	if (poolname == NULL) {
2067c478bd9Sstevel@tonic-gate 		fprintf(stderr, "poolname not given with add/remove node\n");
2077c478bd9Sstevel@tonic-gate 		return -1;
2087c478bd9Sstevel@tonic-gate 	}
2097c478bd9Sstevel@tonic-gate 
2107c478bd9Sstevel@tonic-gate 	if (remove == 0)
2117c478bd9Sstevel@tonic-gate 		err = load_poolnode(0, poolname, &node, ioctl);
2127c478bd9Sstevel@tonic-gate 	else
2137c478bd9Sstevel@tonic-gate 		err = remove_poolnode(0, poolname, &node, ioctl);
2147c478bd9Sstevel@tonic-gate 	return err;
2157c478bd9Sstevel@tonic-gate }
2167c478bd9Sstevel@tonic-gate 
2177c478bd9Sstevel@tonic-gate 
2187c478bd9Sstevel@tonic-gate int poolcommand(remove, argc, argv)
2197c478bd9Sstevel@tonic-gate int remove, argc;
2207c478bd9Sstevel@tonic-gate char *argv[];
2217c478bd9Sstevel@tonic-gate {
2227c478bd9Sstevel@tonic-gate 	int type, role, c, err;
2237c478bd9Sstevel@tonic-gate 	char *poolname;
2247c478bd9Sstevel@tonic-gate 	iphtable_t iph;
2257c478bd9Sstevel@tonic-gate 	ip_pool_t pool;
2267c478bd9Sstevel@tonic-gate 
2277c478bd9Sstevel@tonic-gate 	err = 1;
2287c478bd9Sstevel@tonic-gate 	role = 0;
2297c478bd9Sstevel@tonic-gate 	type = 0;
2307c478bd9Sstevel@tonic-gate 	poolname = NULL;
2317c478bd9Sstevel@tonic-gate 	role = IPL_LOGIPF;
2327c478bd9Sstevel@tonic-gate 	bzero((char *)&iph, sizeof(iph));
2337c478bd9Sstevel@tonic-gate 	bzero((char *)&pool, sizeof(pool));
2347c478bd9Sstevel@tonic-gate 
235*94bdecd9SRob Gulewich 	while ((c = getopt(argc, argv, "dG:m:no:RS:t:vz:")) != -1)
2367c478bd9Sstevel@tonic-gate 		switch (c)
2377c478bd9Sstevel@tonic-gate 		{
2387c478bd9Sstevel@tonic-gate 		case 'd' :
2397c478bd9Sstevel@tonic-gate 			opts |= OPT_DEBUG;
2407c478bd9Sstevel@tonic-gate 			ippool_yydebug++;
2417c478bd9Sstevel@tonic-gate 			break;
242*94bdecd9SRob Gulewich 		case 'G' :
243*94bdecd9SRob Gulewich 			setzonename_global(optarg);
244*94bdecd9SRob Gulewich 			break;
2457c478bd9Sstevel@tonic-gate 		case 'm' :
2467c478bd9Sstevel@tonic-gate 			poolname = optarg;
2477c478bd9Sstevel@tonic-gate 			break;
2487c478bd9Sstevel@tonic-gate 		case 'n' :
2497c478bd9Sstevel@tonic-gate 			opts |= OPT_DONOTHING;
2507c478bd9Sstevel@tonic-gate 			break;
2517c478bd9Sstevel@tonic-gate 		case 'o' :
2527c478bd9Sstevel@tonic-gate 			role = getrole(optarg);
2537c478bd9Sstevel@tonic-gate 			if (role == IPL_LOGNONE) {
2547c478bd9Sstevel@tonic-gate 				fprintf(stderr, "unknown role '%s'\n", optarg);
2557c478bd9Sstevel@tonic-gate 				return -1;
2567c478bd9Sstevel@tonic-gate 			}
2577c478bd9Sstevel@tonic-gate 			break;
258ab25eeb5Syz155240 		case 'R' :
259ab25eeb5Syz155240 			opts |= OPT_NORESOLVE;
260ab25eeb5Syz155240 			break;
2617c478bd9Sstevel@tonic-gate 		case 'S' :
2627c478bd9Sstevel@tonic-gate 			iph.iph_seed = atoi(optarg);
2637c478bd9Sstevel@tonic-gate 			break;
2647c478bd9Sstevel@tonic-gate 		case 't' :
2657c478bd9Sstevel@tonic-gate 			type = gettype(optarg, &iph.iph_type);
2667c478bd9Sstevel@tonic-gate 			if (type == IPLT_NONE) {
2677c478bd9Sstevel@tonic-gate 				fprintf(stderr, "unknown type '%s'\n", optarg);
2687c478bd9Sstevel@tonic-gate 				return -1;
2697c478bd9Sstevel@tonic-gate 			}
2707c478bd9Sstevel@tonic-gate 			break;
2717c478bd9Sstevel@tonic-gate 		case 'v' :
2727c478bd9Sstevel@tonic-gate 			opts |= OPT_VERBOSE;
2737c478bd9Sstevel@tonic-gate 			break;
274*94bdecd9SRob Gulewich 		case 'z' :
275*94bdecd9SRob Gulewich 			setzonename(optarg);
276*94bdecd9SRob Gulewich 			break;
2777c478bd9Sstevel@tonic-gate 		}
2787c478bd9Sstevel@tonic-gate 
279ab25eeb5Syz155240 	if (opts & OPT_DEBUG)
280ab25eeb5Syz155240 		fprintf(stderr, "poolcommand: opts = %#x\n", opts);
281ab25eeb5Syz155240 
2827c478bd9Sstevel@tonic-gate 	if (poolname == NULL) {
2837c478bd9Sstevel@tonic-gate 		fprintf(stderr, "poolname not given with add/remove pool\n");
2847c478bd9Sstevel@tonic-gate 		return -1;
2857c478bd9Sstevel@tonic-gate 	}
2867c478bd9Sstevel@tonic-gate 
2877c478bd9Sstevel@tonic-gate 	if (type == IPLT_HASH) {
2887c478bd9Sstevel@tonic-gate 		strncpy(iph.iph_name, poolname, sizeof(iph.iph_name));
2897c478bd9Sstevel@tonic-gate 		iph.iph_name[sizeof(iph.iph_name) - 1] = '\0';
2907c478bd9Sstevel@tonic-gate 		iph.iph_unit = role;
2917c478bd9Sstevel@tonic-gate 	} else if (type == IPLT_POOL) {
2927c478bd9Sstevel@tonic-gate 		strncpy(pool.ipo_name, poolname, sizeof(pool.ipo_name));
2937c478bd9Sstevel@tonic-gate 		pool.ipo_name[sizeof(pool.ipo_name) - 1] = '\0';
2947c478bd9Sstevel@tonic-gate 		pool.ipo_unit = role;
2957c478bd9Sstevel@tonic-gate 	}
2967c478bd9Sstevel@tonic-gate 
2977c478bd9Sstevel@tonic-gate 	if (remove == 0) {
2987c478bd9Sstevel@tonic-gate 		switch (type)
2997c478bd9Sstevel@tonic-gate 		{
3007c478bd9Sstevel@tonic-gate 		case IPLT_HASH :
3017c478bd9Sstevel@tonic-gate 			err = load_hash(&iph, NULL, ioctl);
3027c478bd9Sstevel@tonic-gate 			break;
3037c478bd9Sstevel@tonic-gate 		case IPLT_POOL :
3047c478bd9Sstevel@tonic-gate 			err = load_pool(&pool, ioctl);
3057c478bd9Sstevel@tonic-gate 			break;
3067c478bd9Sstevel@tonic-gate 		}
3077c478bd9Sstevel@tonic-gate 	} else {
3087c478bd9Sstevel@tonic-gate 		switch (type)
3097c478bd9Sstevel@tonic-gate 		{
3107c478bd9Sstevel@tonic-gate 		case IPLT_HASH :
3117c478bd9Sstevel@tonic-gate 			err = remove_hash(&iph, ioctl);
3127c478bd9Sstevel@tonic-gate 			break;
3137c478bd9Sstevel@tonic-gate 		case IPLT_POOL :
3147c478bd9Sstevel@tonic-gate 			err = remove_pool(&pool, ioctl);
3157c478bd9Sstevel@tonic-gate 			break;
3167c478bd9Sstevel@tonic-gate 		}
3177c478bd9Sstevel@tonic-gate 	}
3187c478bd9Sstevel@tonic-gate 	return err;
3197c478bd9Sstevel@tonic-gate }
3207c478bd9Sstevel@tonic-gate 
3217c478bd9Sstevel@tonic-gate 
3227c478bd9Sstevel@tonic-gate int loadpoolfile(argc, argv, infile)
3237c478bd9Sstevel@tonic-gate int argc;
3247c478bd9Sstevel@tonic-gate char *argv[], *infile;
3257c478bd9Sstevel@tonic-gate {
3267c478bd9Sstevel@tonic-gate 	int c;
3277c478bd9Sstevel@tonic-gate 
3287c478bd9Sstevel@tonic-gate 	infile = optarg;
3297c478bd9Sstevel@tonic-gate 
330*94bdecd9SRob Gulewich 	while ((c = getopt(argc, argv, "dG:nRuvz:")) != -1)
3317c478bd9Sstevel@tonic-gate 		switch (c)
3327c478bd9Sstevel@tonic-gate 		{
3337c478bd9Sstevel@tonic-gate 		case 'd' :
3347c478bd9Sstevel@tonic-gate 			opts |= OPT_DEBUG;
3357c478bd9Sstevel@tonic-gate 			ippool_yydebug++;
3367c478bd9Sstevel@tonic-gate 			break;
337*94bdecd9SRob Gulewich 		case 'G' :
338*94bdecd9SRob Gulewich 			setzonename_global(optarg);
339*94bdecd9SRob Gulewich 			break;
3407c478bd9Sstevel@tonic-gate 		case 'n' :
3417c478bd9Sstevel@tonic-gate 			opts |= OPT_DONOTHING;
3427c478bd9Sstevel@tonic-gate 			break;
343ab25eeb5Syz155240 		case 'R' :
344ab25eeb5Syz155240 			opts |= OPT_NORESOLVE;
345ab25eeb5Syz155240 			break;
346ab25eeb5Syz155240 		case 'u' :
3477c478bd9Sstevel@tonic-gate 			opts |= OPT_REMOVE;
3487c478bd9Sstevel@tonic-gate 			break;
3497c478bd9Sstevel@tonic-gate 		case 'v' :
3507c478bd9Sstevel@tonic-gate 			opts |= OPT_VERBOSE;
3517c478bd9Sstevel@tonic-gate 			break;
352*94bdecd9SRob Gulewich 		case 'z' :
353*94bdecd9SRob Gulewich 			setzonename(optarg);
354*94bdecd9SRob Gulewich 			break;
3557c478bd9Sstevel@tonic-gate 		}
3567c478bd9Sstevel@tonic-gate 
357ab25eeb5Syz155240 	if (opts & OPT_DEBUG)
358ab25eeb5Syz155240 		fprintf(stderr, "loadpoolfile: opts = %#x\n", opts);
359ab25eeb5Syz155240 
3607c478bd9Sstevel@tonic-gate 	if (!(opts & OPT_DONOTHING) && (fd == -1)) {
3617c478bd9Sstevel@tonic-gate 		fd = open(IPLOOKUP_NAME, O_RDWR);
3627c478bd9Sstevel@tonic-gate 		if (fd == -1) {
3637c478bd9Sstevel@tonic-gate 			perror("open(IPLOOKUP_NAME)");
3647c478bd9Sstevel@tonic-gate 			exit(1);
3657c478bd9Sstevel@tonic-gate 		}
366*94bdecd9SRob Gulewich 
367*94bdecd9SRob Gulewich 		if (setzone(fd) != 0) {
368*94bdecd9SRob Gulewich 			close(fd);
369*94bdecd9SRob Gulewich 			exit(1);
370*94bdecd9SRob Gulewich 		}
3717c478bd9Sstevel@tonic-gate 	}
3727c478bd9Sstevel@tonic-gate 
3737c478bd9Sstevel@tonic-gate 	if (ippool_parsefile(fd, infile, ioctl) != 0)
3747c478bd9Sstevel@tonic-gate 		return -1;
3757c478bd9Sstevel@tonic-gate 	return 0;
3767c478bd9Sstevel@tonic-gate }
3777c478bd9Sstevel@tonic-gate 
3787c478bd9Sstevel@tonic-gate 
3797c478bd9Sstevel@tonic-gate int poollist(argc, argv)
3807c478bd9Sstevel@tonic-gate int argc;
3817c478bd9Sstevel@tonic-gate char *argv[];
3827c478bd9Sstevel@tonic-gate {
3837c478bd9Sstevel@tonic-gate 	char *kernel, *core, *poolname;
3847c478bd9Sstevel@tonic-gate 	int c, role, type, live_kernel;
3857c478bd9Sstevel@tonic-gate 	ip_pool_stat_t *plstp, plstat;
3867663b816Sml37995 	iphtstat_t *htstp, htstat;
3877663b816Sml37995 	iphtable_t *hptr;
3887c478bd9Sstevel@tonic-gate 	iplookupop_t op;
3897c478bd9Sstevel@tonic-gate 	ip_pool_t *ptr;
3907c478bd9Sstevel@tonic-gate 
3917c478bd9Sstevel@tonic-gate 	core = NULL;
3927c478bd9Sstevel@tonic-gate 	kernel = NULL;
3937c478bd9Sstevel@tonic-gate 	live_kernel = 1;
3947c478bd9Sstevel@tonic-gate 	type = IPLT_ALL;
3957c478bd9Sstevel@tonic-gate 	poolname = NULL;
3967c478bd9Sstevel@tonic-gate 	role = IPL_LOGALL;
3977c478bd9Sstevel@tonic-gate 
398*94bdecd9SRob Gulewich 	while ((c = getopt(argc, argv, "dG:m:M:N:o:Rt:vz:")) != -1)
3997c478bd9Sstevel@tonic-gate 		switch (c)
4007c478bd9Sstevel@tonic-gate 		{
4017c478bd9Sstevel@tonic-gate 		case 'd' :
4027c478bd9Sstevel@tonic-gate 			opts |= OPT_DEBUG;
4037c478bd9Sstevel@tonic-gate 			break;
404*94bdecd9SRob Gulewich 		case 'G' :
405*94bdecd9SRob Gulewich 			setzonename_global(optarg);
406*94bdecd9SRob Gulewich 			break;
4077c478bd9Sstevel@tonic-gate 		case 'm' :
4087c478bd9Sstevel@tonic-gate 			poolname = optarg;
4097c478bd9Sstevel@tonic-gate 			break;
4107c478bd9Sstevel@tonic-gate 		case 'M' :
4117c478bd9Sstevel@tonic-gate 			live_kernel = 0;
4127c478bd9Sstevel@tonic-gate 			core = optarg;
4137c478bd9Sstevel@tonic-gate 			break;
4147c478bd9Sstevel@tonic-gate 		case 'N' :
4157c478bd9Sstevel@tonic-gate 			live_kernel = 0;
4167c478bd9Sstevel@tonic-gate 			kernel = optarg;
4177c478bd9Sstevel@tonic-gate 			break;
4187c478bd9Sstevel@tonic-gate 		case 'o' :
4197c478bd9Sstevel@tonic-gate 			role = getrole(optarg);
4207c478bd9Sstevel@tonic-gate 			if (role == IPL_LOGNONE) {
4217c478bd9Sstevel@tonic-gate 				fprintf(stderr, "unknown role '%s'\n", optarg);
4227c478bd9Sstevel@tonic-gate 				return -1;
4237c478bd9Sstevel@tonic-gate 			}
4247c478bd9Sstevel@tonic-gate 			break;
425ab25eeb5Syz155240 		case 'R' :
426ab25eeb5Syz155240 			opts |= OPT_NORESOLVE;
427ab25eeb5Syz155240 			break;
4287c478bd9Sstevel@tonic-gate 		case 't' :
4297c478bd9Sstevel@tonic-gate 			type = gettype(optarg, NULL);
4307c478bd9Sstevel@tonic-gate 			if (type == IPLT_NONE) {
4317c478bd9Sstevel@tonic-gate 				fprintf(stderr, "unknown type '%s'\n", optarg);
4327c478bd9Sstevel@tonic-gate 				return -1;
4337c478bd9Sstevel@tonic-gate 			}
4347c478bd9Sstevel@tonic-gate 			break;
4357c478bd9Sstevel@tonic-gate 		case 'v' :
4367c478bd9Sstevel@tonic-gate 			opts |= OPT_VERBOSE;
4377c478bd9Sstevel@tonic-gate 			break;
438*94bdecd9SRob Gulewich 		case 'z' :
439*94bdecd9SRob Gulewich 			setzonename(optarg);
440*94bdecd9SRob Gulewich 			break;
4417c478bd9Sstevel@tonic-gate 		}
4427c478bd9Sstevel@tonic-gate 
4437663b816Sml37995 	if (opts & OPT_DEBUG)
4447663b816Sml37995 		fprintf(stderr, "poollist: opts = %#x\n", opts);
4457663b816Sml37995 
4467c478bd9Sstevel@tonic-gate 	if (!(opts & OPT_DONOTHING) && (fd == -1)) {
4477c478bd9Sstevel@tonic-gate 		fd = open(IPLOOKUP_NAME, O_RDWR);
4487c478bd9Sstevel@tonic-gate 		if (fd == -1) {
4497c478bd9Sstevel@tonic-gate 			perror("open(IPLOOKUP_NAME)");
4507c478bd9Sstevel@tonic-gate 			exit(1);
4517c478bd9Sstevel@tonic-gate 		}
452*94bdecd9SRob Gulewich 
453*94bdecd9SRob Gulewich 		if (setzone(fd) != 0) {
454*94bdecd9SRob Gulewich 			close(fd);
455*94bdecd9SRob Gulewich 			exit(1);
456*94bdecd9SRob Gulewich 		}
4577c478bd9Sstevel@tonic-gate 	}
4587c478bd9Sstevel@tonic-gate 
4597c478bd9Sstevel@tonic-gate 	bzero((char *)&op, sizeof(op));
4607c478bd9Sstevel@tonic-gate 	if (poolname != NULL) {
4617c478bd9Sstevel@tonic-gate 		strncpy(op.iplo_name, poolname, sizeof(op.iplo_name));
4627c478bd9Sstevel@tonic-gate 		op.iplo_name[sizeof(op.iplo_name) - 1] = '\0';
4637c478bd9Sstevel@tonic-gate 	}
4647c478bd9Sstevel@tonic-gate 	op.iplo_unit = role;
4657663b816Sml37995 
466f4b3ec61Sdh155122 	if (live_kernel == 0) {
467f4b3ec61Sdh155122 		poollist_dead(role, poolname, type, kernel, core);
468f4b3ec61Sdh155122 		return (0);
469f4b3ec61Sdh155122 	}
4707663b816Sml37995 
4717663b816Sml37995 	if (type == IPLT_ALL || type == IPLT_POOL) {
4727663b816Sml37995 		plstp = &plstat;
4737663b816Sml37995 		op.iplo_type = IPLT_POOL;
4747c478bd9Sstevel@tonic-gate 		op.iplo_size = sizeof(plstat);
4757c478bd9Sstevel@tonic-gate 		op.iplo_struct = &plstat;
476f4b3ec61Sdh155122 		op.iplo_name[0] = '\0';
477f4b3ec61Sdh155122 		op.iplo_arg = 0;
478f4b3ec61Sdh155122 
479f4b3ec61Sdh155122 		if (role != IPL_LOGALL) {
480f4b3ec61Sdh155122 			op.iplo_unit = role;
481f4b3ec61Sdh155122 
4827c478bd9Sstevel@tonic-gate 			c = ioctl(fd, SIOCLOOKUPSTAT, &op);
4837c478bd9Sstevel@tonic-gate 			if (c == -1) {
4847c478bd9Sstevel@tonic-gate 				perror("ioctl(SIOCLOOKUPSTAT)");
4857c478bd9Sstevel@tonic-gate 				return -1;
4867c478bd9Sstevel@tonic-gate 			}
4877c478bd9Sstevel@tonic-gate 
488f4b3ec61Sdh155122 			showpools_live(fd, role, &plstat, poolname, opts);
489f4b3ec61Sdh155122 		} else {
490f4b3ec61Sdh155122 			for (role = 0; role <= IPL_LOGMAX; role++) {
491f4b3ec61Sdh155122 				op.iplo_unit = role;
492f4b3ec61Sdh155122 
493f4b3ec61Sdh155122 				c = ioctl(fd, SIOCLOOKUPSTAT, &op);
494f4b3ec61Sdh155122 				if (c == -1) {
495f4b3ec61Sdh155122 					perror("ioctl(SIOCLOOKUPSTAT)");
496f4b3ec61Sdh155122 					return -1;
497f4b3ec61Sdh155122 				}
498f4b3ec61Sdh155122 
499f4b3ec61Sdh155122 				showpools_live(fd, role, &plstat, poolname, opts);
500f4b3ec61Sdh155122 			}
501f4b3ec61Sdh155122 
502f4b3ec61Sdh155122 			role = IPL_LOGALL;
503f4b3ec61Sdh155122 		}
504f4b3ec61Sdh155122 	}
505f4b3ec61Sdh155122 	if (type == IPLT_ALL || type == IPLT_HASH) {
506f4b3ec61Sdh155122 		htstp = &htstat;
507f4b3ec61Sdh155122 		op.iplo_type = IPLT_HASH;
508f4b3ec61Sdh155122 		op.iplo_size = sizeof(htstat);
509f4b3ec61Sdh155122 		op.iplo_struct = &htstat;
510f4b3ec61Sdh155122 		op.iplo_name[0] = '\0';
511f4b3ec61Sdh155122 		op.iplo_arg = 0;
512f4b3ec61Sdh155122 
5137c478bd9Sstevel@tonic-gate 		if (role != IPL_LOGALL) {
514f4b3ec61Sdh155122 			op.iplo_unit = role;
515f4b3ec61Sdh155122 
516f4b3ec61Sdh155122 			c = ioctl(fd, SIOCLOOKUPSTAT, &op);
517f4b3ec61Sdh155122 			if (c == -1) {
518f4b3ec61Sdh155122 				perror("ioctl(SIOCLOOKUPSTAT)");
519f4b3ec61Sdh155122 				return -1;
520f4b3ec61Sdh155122 			}
521f4b3ec61Sdh155122 			showhashs_live(fd, role, &htstat, poolname, opts);
522f4b3ec61Sdh155122 		} else {
523f4b3ec61Sdh155122 			for (role = 0; role <= IPL_LOGMAX; role++) {
524f4b3ec61Sdh155122 
525f4b3ec61Sdh155122 				op.iplo_unit = role;
526f4b3ec61Sdh155122 				c = ioctl(fd, SIOCLOOKUPSTAT, &op);
527f4b3ec61Sdh155122 				if (c == -1) {
528f4b3ec61Sdh155122 					perror("ioctl(SIOCLOOKUPSTAT)");
529f4b3ec61Sdh155122 					return -1;
530f4b3ec61Sdh155122 				}
531f4b3ec61Sdh155122 
532f4b3ec61Sdh155122 				showhashs_live(fd, role, &htstat, poolname, opts);
533f4b3ec61Sdh155122 			}
534f4b3ec61Sdh155122 		}
535f4b3ec61Sdh155122 	}
536f4b3ec61Sdh155122 	return 0;
537f4b3ec61Sdh155122 }
538f4b3ec61Sdh155122 
539f4b3ec61Sdh155122 void poollist_dead(role, poolname, type, kernel, core)
540f4b3ec61Sdh155122 int role, type;
541f4b3ec61Sdh155122 char *poolname, *kernel, *core;
542f4b3ec61Sdh155122 {
543f4b3ec61Sdh155122 	iphtable_t *hptr;
544f4b3ec61Sdh155122 	ip_pool_t *ptr;
545f4b3ec61Sdh155122 
546f4b3ec61Sdh155122 	if (openkmem(kernel, core) == -1)
547f4b3ec61Sdh155122 		exit(-1);
548f4b3ec61Sdh155122 
549f4b3ec61Sdh155122 	if (type == IPLT_ALL || type == IPLT_POOL) {
550f4b3ec61Sdh155122 		ip_pool_t *pools[IPL_LOGSIZE];
551f4b3ec61Sdh155122 		struct nlist names[2] = { { "ip_pool_list" } , { "" } };
552f4b3ec61Sdh155122 
553f4b3ec61Sdh155122 		if (nlist(kernel, names) != 1)
554f4b3ec61Sdh155122 			return;
555f4b3ec61Sdh155122 
556f4b3ec61Sdh155122 		bzero(&pools, sizeof(pools));
557f4b3ec61Sdh155122 		if (kmemcpy((char *)&pools, names[0].n_value, sizeof(pools)))
558f4b3ec61Sdh155122 			return;
559f4b3ec61Sdh155122 
560f4b3ec61Sdh155122 		if (role != IPL_LOGALL) {
561f4b3ec61Sdh155122 			ptr = pools[role];
5627c478bd9Sstevel@tonic-gate 			while (ptr != NULL) {
563f4b3ec61Sdh155122 				ptr = printpool(ptr, kmemcpywrap,
564f4b3ec61Sdh155122 						poolname, opts);
5657c478bd9Sstevel@tonic-gate 			}
5667c478bd9Sstevel@tonic-gate 		} else {
5677c478bd9Sstevel@tonic-gate 			for (role = 0; role <= IPL_LOGMAX; role++) {
568f4b3ec61Sdh155122 				ptr = pools[role];
5697c478bd9Sstevel@tonic-gate 				while (ptr != NULL) {
5707663b816Sml37995 					ptr = printpool(ptr, kmemcpywrap,
571ab25eeb5Syz155240 							poolname, opts);
5727663b816Sml37995 				}
5737663b816Sml37995 			}
5747663b816Sml37995 			role = IPL_LOGALL;
5757663b816Sml37995 		}
5767663b816Sml37995 	}
5777663b816Sml37995 	if (type == IPLT_ALL || type == IPLT_HASH) {
578f4b3ec61Sdh155122 		iphtable_t *tables[IPL_LOGSIZE];
579f4b3ec61Sdh155122 		struct nlist names[2] = { { "ipf_htables" } , { "" } };
580f4b3ec61Sdh155122 
581f4b3ec61Sdh155122 		if (nlist(kernel, names) != 1)
582f4b3ec61Sdh155122 			return;
583f4b3ec61Sdh155122 
584f4b3ec61Sdh155122 		bzero(&tables, sizeof(tables));
585f4b3ec61Sdh155122 		if (kmemcpy((char *)&tables, names[0].n_value, sizeof(tables)))
586f4b3ec61Sdh155122 			return;
5877663b816Sml37995 
5887663b816Sml37995 		if (role != IPL_LOGALL) {
589f4b3ec61Sdh155122 			hptr = tables[role];
5907663b816Sml37995 			while (hptr != NULL) {
591ab25eeb5Syz155240 				hptr = printhash(hptr, kmemcpywrap,
592ab25eeb5Syz155240 						 poolname, opts);
5937663b816Sml37995 			}
5947663b816Sml37995 		} else {
5957663b816Sml37995 			for (role = 0; role <= IPL_LOGMAX; role++) {
596f4b3ec61Sdh155122 				hptr = tables[role];
5977663b816Sml37995 				while (hptr != NULL) {
5987663b816Sml37995 					hptr = printhash(hptr, kmemcpywrap,
599ab25eeb5Syz155240 							 poolname, opts);
6007663b816Sml37995 				}
6017663b816Sml37995 			}
6027c478bd9Sstevel@tonic-gate 		}
6037c478bd9Sstevel@tonic-gate 	}
6047c478bd9Sstevel@tonic-gate }
6057c478bd9Sstevel@tonic-gate 
6067c478bd9Sstevel@tonic-gate 
607f4b3ec61Sdh155122 void
608f4b3ec61Sdh155122 showpools_live(fd, role, plstp, poolname, opts)
609f4b3ec61Sdh155122 int fd, role;
610f4b3ec61Sdh155122 ip_pool_stat_t *plstp;
611f4b3ec61Sdh155122 char *poolname;
612f4b3ec61Sdh155122 int opts;
613f4b3ec61Sdh155122 {
614f4b3ec61Sdh155122 	ipflookupiter_t iter;
615f4b3ec61Sdh155122 	ip_pool_t pool;
616f4b3ec61Sdh155122 	ipfobj_t obj;
617f4b3ec61Sdh155122 
618f4b3ec61Sdh155122 	obj.ipfo_rev = IPFILTER_VERSION;
619f4b3ec61Sdh155122 	obj.ipfo_type = IPFOBJ_LOOKUPITER;
620f4b3ec61Sdh155122 	obj.ipfo_size = sizeof(iter);
621f4b3ec61Sdh155122 	obj.ipfo_ptr = &iter;
622f4b3ec61Sdh155122 
623f4b3ec61Sdh155122 	iter.ili_type = IPLT_POOL;
624f4b3ec61Sdh155122 	iter.ili_otype = IPFLOOKUPITER_LIST;
625f4b3ec61Sdh155122 	iter.ili_ival = IPFGENITER_LOOKUP;
626f4b3ec61Sdh155122 	iter.ili_data = &pool;
627f4b3ec61Sdh155122 	iter.ili_unit = role;
628f4b3ec61Sdh155122 	*iter.ili_name = '\0';
629f4b3ec61Sdh155122 
630f4b3ec61Sdh155122 	while (plstp->ipls_list[role] != NULL) {
631f4b3ec61Sdh155122 		if (ioctl(fd, SIOCLOOKUPITER, &obj)) {
632f4b3ec61Sdh155122 			perror("ioctl(SIOCLOOKUPITER)");
633f4b3ec61Sdh155122 			break;
634f4b3ec61Sdh155122 		}
635f4b3ec61Sdh155122 		(void) printpool_live(&pool, fd, poolname, opts);
636f4b3ec61Sdh155122 
637f4b3ec61Sdh155122 		plstp->ipls_list[role] = pool.ipo_next;
638f4b3ec61Sdh155122 	}
639f4b3ec61Sdh155122 }
640f4b3ec61Sdh155122 
6417c478bd9Sstevel@tonic-gate int poolstats(argc, argv)
6427c478bd9Sstevel@tonic-gate int argc;
6437c478bd9Sstevel@tonic-gate char *argv[];
6447c478bd9Sstevel@tonic-gate {
6457c478bd9Sstevel@tonic-gate 	int c, type, role, live_kernel;
6467c478bd9Sstevel@tonic-gate 	ip_pool_stat_t plstat;
6477c478bd9Sstevel@tonic-gate 	char *kernel, *core;
6487663b816Sml37995 	iphtstat_t htstat;
6497c478bd9Sstevel@tonic-gate 	iplookupop_t op;
6507c478bd9Sstevel@tonic-gate 
6517c478bd9Sstevel@tonic-gate 	core = NULL;
6527c478bd9Sstevel@tonic-gate 	kernel = NULL;
6537c478bd9Sstevel@tonic-gate 	live_kernel = 1;
6547c478bd9Sstevel@tonic-gate 	type = IPLT_ALL;
6557c478bd9Sstevel@tonic-gate 	role = IPL_LOGALL;
6567c478bd9Sstevel@tonic-gate 
6577c478bd9Sstevel@tonic-gate 	bzero((char *)&op, sizeof(op));
6587c478bd9Sstevel@tonic-gate 
659*94bdecd9SRob Gulewich 	while ((c = getopt(argc, argv, "dG:M:N:o:t:vz:")) != -1)
6607c478bd9Sstevel@tonic-gate 		switch (c)
6617c478bd9Sstevel@tonic-gate 		{
6627c478bd9Sstevel@tonic-gate 		case 'd' :
6637c478bd9Sstevel@tonic-gate 			opts |= OPT_DEBUG;
6647c478bd9Sstevel@tonic-gate 			break;
665*94bdecd9SRob Gulewich 		case 'G' :
666*94bdecd9SRob Gulewich 			setzonename_global(optarg);
667*94bdecd9SRob Gulewich 			break;
6687c478bd9Sstevel@tonic-gate 		case 'M' :
6697c478bd9Sstevel@tonic-gate 			live_kernel = 0;
6707c478bd9Sstevel@tonic-gate 			core = optarg;
6717c478bd9Sstevel@tonic-gate 			break;
6727c478bd9Sstevel@tonic-gate 		case 'N' :
6737c478bd9Sstevel@tonic-gate 			live_kernel = 0;
6747c478bd9Sstevel@tonic-gate 			kernel = optarg;
6757c478bd9Sstevel@tonic-gate 			break;
6767c478bd9Sstevel@tonic-gate 		case 'o' :
6777c478bd9Sstevel@tonic-gate 			role = getrole(optarg);
6787c478bd9Sstevel@tonic-gate 			if (role == IPL_LOGNONE) {
6797c478bd9Sstevel@tonic-gate 				fprintf(stderr, "unknown role '%s'\n", optarg);
6807c478bd9Sstevel@tonic-gate 				return -1;
6817c478bd9Sstevel@tonic-gate 			}
6827c478bd9Sstevel@tonic-gate 			break;
6837c478bd9Sstevel@tonic-gate 		case 't' :
6847c478bd9Sstevel@tonic-gate 			type = gettype(optarg, NULL);
6857c478bd9Sstevel@tonic-gate 			if (type != IPLT_POOL) {
6867c478bd9Sstevel@tonic-gate 				fprintf(stderr,
6877c478bd9Sstevel@tonic-gate 					"-s not supported for this type yet\n");
6887c478bd9Sstevel@tonic-gate 				return -1;
6897c478bd9Sstevel@tonic-gate 			}
6907c478bd9Sstevel@tonic-gate 			break;
6917c478bd9Sstevel@tonic-gate 		case 'v' :
6927c478bd9Sstevel@tonic-gate 			opts |= OPT_VERBOSE;
6937c478bd9Sstevel@tonic-gate 			break;
694*94bdecd9SRob Gulewich 		case 'z' :
695*94bdecd9SRob Gulewich 			setzonename(optarg);
696*94bdecd9SRob Gulewich 			break;
6977c478bd9Sstevel@tonic-gate 		}
6987c478bd9Sstevel@tonic-gate 
6997663b816Sml37995 	if (opts & OPT_DEBUG)
7007663b816Sml37995 		fprintf(stderr, "poolstats: opts = %#x\n", opts);
7017663b816Sml37995 
7027c478bd9Sstevel@tonic-gate 	if (!(opts & OPT_DONOTHING) && (fd == -1)) {
7037c478bd9Sstevel@tonic-gate 		fd = open(IPLOOKUP_NAME, O_RDWR);
7047c478bd9Sstevel@tonic-gate 		if (fd == -1) {
7057c478bd9Sstevel@tonic-gate 			perror("open(IPLOOKUP_NAME)");
7067c478bd9Sstevel@tonic-gate 			exit(1);
7077c478bd9Sstevel@tonic-gate 		}
708*94bdecd9SRob Gulewich 
709*94bdecd9SRob Gulewich 		if (setzone(fd) != 0) {
710*94bdecd9SRob Gulewich 			close(fd);
711*94bdecd9SRob Gulewich 			exit(1);
712*94bdecd9SRob Gulewich 		}
7137c478bd9Sstevel@tonic-gate 	}
7147c478bd9Sstevel@tonic-gate 
7157663b816Sml37995 	if (type == IPLT_ALL || type == IPLT_POOL) {
7167663b816Sml37995 		op.iplo_type = IPLT_POOL;
7177663b816Sml37995 		op.iplo_struct = &plstat;
7187663b816Sml37995 		op.iplo_size = sizeof(plstat);
7197c478bd9Sstevel@tonic-gate 		if (!(opts & OPT_DONOTHING)) {
7207c478bd9Sstevel@tonic-gate 			c = ioctl(fd, SIOCLOOKUPSTAT, &op);
7217c478bd9Sstevel@tonic-gate 			if (c == -1) {
7227c478bd9Sstevel@tonic-gate 				perror("ioctl(SIOCLOOKUPSTAT)");
7237c478bd9Sstevel@tonic-gate 				return -1;
7247c478bd9Sstevel@tonic-gate 			}
7257c478bd9Sstevel@tonic-gate 			printf("Pools:\t%lu\n", plstat.ipls_pools);
7267c478bd9Sstevel@tonic-gate 			printf("Nodes:\t%lu\n", plstat.ipls_nodes);
7277c478bd9Sstevel@tonic-gate 		}
7287663b816Sml37995 	}
7297663b816Sml37995 
7307663b816Sml37995 	if (type == IPLT_ALL || type == IPLT_HASH) {
7317663b816Sml37995 		op.iplo_type = IPLT_HASH;
7327663b816Sml37995 		op.iplo_struct = &htstat;
7337663b816Sml37995 		op.iplo_size = sizeof(htstat);
7347663b816Sml37995 		if (!(opts & OPT_DONOTHING)) {
7357663b816Sml37995 			c = ioctl(fd, SIOCLOOKUPSTAT, &op);
7367663b816Sml37995 			if (c == -1) {
7377663b816Sml37995 				perror("ioctl(SIOCLOOKUPSTAT)");
7387663b816Sml37995 				return -1;
7397663b816Sml37995 			}
7407663b816Sml37995 			printf("Hash Tables:\t%lu\n", htstat.iphs_numtables);
7417663b816Sml37995 			printf("Nodes:\t%lu\n", htstat.iphs_numnodes);
7427663b816Sml37995 			printf("Out of Memory:\t%lu\n", htstat.iphs_nomem);
7437663b816Sml37995 		}
7447663b816Sml37995 	}
7457c478bd9Sstevel@tonic-gate 	return 0;
7467c478bd9Sstevel@tonic-gate }
7477c478bd9Sstevel@tonic-gate 
7487c478bd9Sstevel@tonic-gate 
7497c478bd9Sstevel@tonic-gate int poolflush(argc, argv)
7507c478bd9Sstevel@tonic-gate int argc;
7517c478bd9Sstevel@tonic-gate char *argv[];
7527c478bd9Sstevel@tonic-gate {
7537c478bd9Sstevel@tonic-gate 	int c, role, type, arg;
7547c478bd9Sstevel@tonic-gate 	iplookupflush_t flush;
7557c478bd9Sstevel@tonic-gate 
7567c478bd9Sstevel@tonic-gate 	arg = IPLT_ALL;
7577c478bd9Sstevel@tonic-gate 	type = IPLT_ALL;
7587c478bd9Sstevel@tonic-gate 	role = IPL_LOGALL;
7597c478bd9Sstevel@tonic-gate 
760*94bdecd9SRob Gulewich 	while ((c = getopt(argc, argv, "do:t:vz:")) != -1)
7617c478bd9Sstevel@tonic-gate 		switch (c)
7627c478bd9Sstevel@tonic-gate 		{
7637c478bd9Sstevel@tonic-gate 		case 'd' :
7647c478bd9Sstevel@tonic-gate 			opts |= OPT_DEBUG;
7657c478bd9Sstevel@tonic-gate 			break;
7667c478bd9Sstevel@tonic-gate 		case 'o' :
7677c478bd9Sstevel@tonic-gate 			role = getrole(optarg);
7687c478bd9Sstevel@tonic-gate 			if (role == IPL_LOGNONE) {
7697c478bd9Sstevel@tonic-gate 				fprintf(stderr, "unknown role '%s'\n", optarg);
7707c478bd9Sstevel@tonic-gate 				return -1;
7717c478bd9Sstevel@tonic-gate 			}
7727c478bd9Sstevel@tonic-gate 			break;
7737c478bd9Sstevel@tonic-gate 		case 't' :
7747c478bd9Sstevel@tonic-gate 			type = gettype(optarg, NULL);
7757c478bd9Sstevel@tonic-gate 			if (type == IPLT_NONE) {
7767c478bd9Sstevel@tonic-gate 				fprintf(stderr, "unknown type '%s'\n", optarg);
7777c478bd9Sstevel@tonic-gate 				return -1;
7787c478bd9Sstevel@tonic-gate 			}
7797c478bd9Sstevel@tonic-gate 			break;
7807c478bd9Sstevel@tonic-gate 		case 'v' :
7817c478bd9Sstevel@tonic-gate 			opts |= OPT_VERBOSE;
7827c478bd9Sstevel@tonic-gate 			break;
783*94bdecd9SRob Gulewich 		case 'z' :
784*94bdecd9SRob Gulewich 			setzonename(optarg);
785*94bdecd9SRob Gulewich 			break;
7867c478bd9Sstevel@tonic-gate 		}
7877c478bd9Sstevel@tonic-gate 
788ab25eeb5Syz155240 	if (opts & OPT_DEBUG)
789ab25eeb5Syz155240 		fprintf(stderr, "poolflush: opts = %#x\n", opts);
790ab25eeb5Syz155240 
7917c478bd9Sstevel@tonic-gate 	if (!(opts & OPT_DONOTHING) && (fd == -1)) {
7927c478bd9Sstevel@tonic-gate 		fd = open(IPLOOKUP_NAME, O_RDWR);
7937c478bd9Sstevel@tonic-gate 		if (fd == -1) {
7947c478bd9Sstevel@tonic-gate 			perror("open(IPLOOKUP_NAME)");
7957c478bd9Sstevel@tonic-gate 			exit(1);
7967c478bd9Sstevel@tonic-gate 		}
797*94bdecd9SRob Gulewich 
798*94bdecd9SRob Gulewich 		if (setzone(fd) != 0) {
799*94bdecd9SRob Gulewich 			close(fd);
800*94bdecd9SRob Gulewich 			exit(1);
801*94bdecd9SRob Gulewich 		}
8027c478bd9Sstevel@tonic-gate 	}
8037c478bd9Sstevel@tonic-gate 
8047c478bd9Sstevel@tonic-gate 	bzero((char *)&flush, sizeof(flush));
8057c478bd9Sstevel@tonic-gate 	flush.iplf_type = type;
8067c478bd9Sstevel@tonic-gate 	flush.iplf_unit = role;
8077c478bd9Sstevel@tonic-gate 	flush.iplf_arg = arg;
8087c478bd9Sstevel@tonic-gate 
8097c478bd9Sstevel@tonic-gate 	if (!(opts & OPT_DONOTHING)) {
8107c478bd9Sstevel@tonic-gate 		if (ioctl(fd, SIOCLOOKUPFLUSH, &flush) == -1) {
8117c478bd9Sstevel@tonic-gate 			perror("ioctl(SIOCLOOKUPFLUSH)");
8127c478bd9Sstevel@tonic-gate 			exit(1);
8137c478bd9Sstevel@tonic-gate 		}
8147c478bd9Sstevel@tonic-gate 
8157c478bd9Sstevel@tonic-gate 	}
8167c478bd9Sstevel@tonic-gate 	printf("%u object%s flushed\n", flush.iplf_count,
8177c478bd9Sstevel@tonic-gate 	       (flush.iplf_count == 1) ? "" : "s");
8187c478bd9Sstevel@tonic-gate 
8197c478bd9Sstevel@tonic-gate 	return 0;
8207c478bd9Sstevel@tonic-gate }
8217c478bd9Sstevel@tonic-gate 
8227c478bd9Sstevel@tonic-gate 
8237c478bd9Sstevel@tonic-gate int getrole(rolename)
8247c478bd9Sstevel@tonic-gate char *rolename;
8257c478bd9Sstevel@tonic-gate {
8267c478bd9Sstevel@tonic-gate 	int role;
8277c478bd9Sstevel@tonic-gate 
8287c478bd9Sstevel@tonic-gate 	if (!strcasecmp(rolename, "ipf")) {
8297c478bd9Sstevel@tonic-gate 		role = IPL_LOGIPF;
8307c478bd9Sstevel@tonic-gate #if 0
8317c478bd9Sstevel@tonic-gate 	} else if (!strcasecmp(rolename, "nat")) {
8327c478bd9Sstevel@tonic-gate 		role = IPL_LOGNAT;
8337c478bd9Sstevel@tonic-gate 	} else if (!strcasecmp(rolename, "state")) {
8347c478bd9Sstevel@tonic-gate 		role = IPL_LOGSTATE;
8357c478bd9Sstevel@tonic-gate 	} else if (!strcasecmp(rolename, "auth")) {
8367c478bd9Sstevel@tonic-gate 		role = IPL_LOGAUTH;
8377c478bd9Sstevel@tonic-gate 	} else if (!strcasecmp(rolename, "sync")) {
8387c478bd9Sstevel@tonic-gate 		role = IPL_LOGSYNC;
8397c478bd9Sstevel@tonic-gate 	} else if (!strcasecmp(rolename, "scan")) {
8407c478bd9Sstevel@tonic-gate 		role = IPL_LOGSCAN;
8417c478bd9Sstevel@tonic-gate 	} else if (!strcasecmp(rolename, "pool")) {
8427c478bd9Sstevel@tonic-gate 		role = IPL_LOGLOOKUP;
8437c478bd9Sstevel@tonic-gate 	} else if (!strcasecmp(rolename, "count")) {
8447c478bd9Sstevel@tonic-gate 		role = IPL_LOGCOUNT;
8457c478bd9Sstevel@tonic-gate #endif
8467c478bd9Sstevel@tonic-gate 	} else {
8477c478bd9Sstevel@tonic-gate 		role = IPL_LOGNONE;
8487c478bd9Sstevel@tonic-gate 	}
8497c478bd9Sstevel@tonic-gate 
8507c478bd9Sstevel@tonic-gate 	return role;
8517c478bd9Sstevel@tonic-gate }
8527c478bd9Sstevel@tonic-gate 
8537c478bd9Sstevel@tonic-gate 
8547c478bd9Sstevel@tonic-gate int gettype(typename, minor)
8557c478bd9Sstevel@tonic-gate char *typename;
8567c478bd9Sstevel@tonic-gate u_int *minor;
8577c478bd9Sstevel@tonic-gate {
8587c478bd9Sstevel@tonic-gate 	int type;
8597c478bd9Sstevel@tonic-gate 
860ab25eeb5Syz155240 	if (!strcasecmp(optarg, "tree")) {
8617c478bd9Sstevel@tonic-gate 		type = IPLT_POOL;
8627c478bd9Sstevel@tonic-gate 	} else if (!strcasecmp(optarg, "hash")) {
8637c478bd9Sstevel@tonic-gate 		type = IPLT_HASH;
8647c478bd9Sstevel@tonic-gate 		if (minor != NULL)
8657c478bd9Sstevel@tonic-gate 			*minor = IPHASH_LOOKUP;
8667c478bd9Sstevel@tonic-gate 	} else if (!strcasecmp(optarg, "group-map")) {
8677c478bd9Sstevel@tonic-gate 		type = IPLT_HASH;
8687c478bd9Sstevel@tonic-gate 		if (minor != NULL)
8697c478bd9Sstevel@tonic-gate 			*minor = IPHASH_GROUPMAP;
8707c478bd9Sstevel@tonic-gate 	} else {
8717c478bd9Sstevel@tonic-gate 		type = IPLT_NONE;
8727c478bd9Sstevel@tonic-gate 	}
8737c478bd9Sstevel@tonic-gate 	return type;
8747c478bd9Sstevel@tonic-gate }
875f4b3ec61Sdh155122 
876f4b3ec61Sdh155122 void showhashs_live(fd, role, htstp, poolname, opts)
877f4b3ec61Sdh155122 int fd, role;
878f4b3ec61Sdh155122 iphtstat_t *htstp;
879f4b3ec61Sdh155122 char *poolname;
880f4b3ec61Sdh155122 int opts;
881f4b3ec61Sdh155122 {
882f4b3ec61Sdh155122 	ipflookupiter_t iter;
883f4b3ec61Sdh155122 	iphtable_t table;
884f4b3ec61Sdh155122 	ipfobj_t obj;
885f4b3ec61Sdh155122 
886f4b3ec61Sdh155122 	obj.ipfo_rev = IPFILTER_VERSION;
887f4b3ec61Sdh155122 	obj.ipfo_type = IPFOBJ_LOOKUPITER;
888f4b3ec61Sdh155122 	obj.ipfo_size = sizeof(iter);
889f4b3ec61Sdh155122 	obj.ipfo_ptr = &iter;
890f4b3ec61Sdh155122 
891f4b3ec61Sdh155122 	iter.ili_type = IPLT_HASH;
892f4b3ec61Sdh155122 	iter.ili_otype = IPFLOOKUPITER_LIST;
893f4b3ec61Sdh155122 	iter.ili_ival = IPFGENITER_LOOKUP;
894f4b3ec61Sdh155122 	iter.ili_data = &table;
895f4b3ec61Sdh155122 	iter.ili_unit = role;
896f4b3ec61Sdh155122 	*iter.ili_name = '\0';
897f4b3ec61Sdh155122 
898f4b3ec61Sdh155122 	while (htstp->iphs_tables != NULL) {
899f4b3ec61Sdh155122 		if (ioctl(fd, SIOCLOOKUPITER, &obj)) {
900f4b3ec61Sdh155122 			perror("ioctl(SIOCLOOKUPITER)");
901f4b3ec61Sdh155122 			break;
902f4b3ec61Sdh155122 		}
903f4b3ec61Sdh155122 
904f4b3ec61Sdh155122 		printhash_live(&table, fd, poolname, opts);
905f4b3ec61Sdh155122 
906f4b3ec61Sdh155122 		htstp->iphs_tables = table.iph_next;
907f4b3ec61Sdh155122 	}
908f4b3ec61Sdh155122 }
909