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