ipnat.c revision 170268
1145519Sdarrenr/* $FreeBSD: head/contrib/ipfilter/tools/ipnat.c 170268 2007-06-04 02:54:36Z darrenr $ */ 2145510Sdarrenr 3145510Sdarrenr/* 4170268Sdarrenr * Copyright (C) 2001-2006 by Darren Reed. 5145510Sdarrenr * 6145510Sdarrenr * See the IPFILTER.LICENCE file for details on licencing. 7145510Sdarrenr * 8145510Sdarrenr * Added redirect stuff and a variety of bug fixes. (mcn@EnGarde.com) 9145510Sdarrenr */ 10145510Sdarrenr#include <stdio.h> 11145510Sdarrenr#include <string.h> 12145510Sdarrenr#include <fcntl.h> 13145510Sdarrenr#include <errno.h> 14145510Sdarrenr#include <sys/types.h> 15145510Sdarrenr#if !defined(__SVR4) && !defined(__svr4__) 16145510Sdarrenr#include <strings.h> 17145510Sdarrenr#else 18145510Sdarrenr#include <sys/byteorder.h> 19145510Sdarrenr#endif 20145510Sdarrenr#include <sys/time.h> 21145510Sdarrenr#include <sys/param.h> 22145510Sdarrenr#include <stdlib.h> 23145510Sdarrenr#include <unistd.h> 24145510Sdarrenr#include <stddef.h> 25145510Sdarrenr#include <sys/file.h> 26145510Sdarrenr#define _KERNEL 27145510Sdarrenr#include <sys/uio.h> 28145510Sdarrenr#undef _KERNEL 29145510Sdarrenr#include <sys/socket.h> 30145510Sdarrenr#include <sys/ioctl.h> 31145510Sdarrenr#if defined(sun) && (defined(__svr4__) || defined(__SVR4)) 32145510Sdarrenr# include <sys/ioccom.h> 33145510Sdarrenr# include <sys/sysmacros.h> 34145510Sdarrenr#endif 35145510Sdarrenr#include <netinet/in.h> 36145510Sdarrenr#include <netinet/in_systm.h> 37145510Sdarrenr#include <netinet/ip.h> 38145510Sdarrenr#include <netinet/tcp.h> 39145510Sdarrenr#include <net/if.h> 40145510Sdarrenr#if __FreeBSD_version >= 300000 41145510Sdarrenr# include <net/if_var.h> 42145510Sdarrenr#endif 43145510Sdarrenr#include <netdb.h> 44145510Sdarrenr#include <arpa/nameser.h> 45145510Sdarrenr#include <arpa/inet.h> 46145510Sdarrenr#include <resolv.h> 47145510Sdarrenr#include <ctype.h> 48145510Sdarrenr#if defined(linux) 49145510Sdarrenr# include <linux/a.out.h> 50145510Sdarrenr#else 51145510Sdarrenr# include <nlist.h> 52145510Sdarrenr#endif 53145510Sdarrenr#include "ipf.h" 54145554Sdarrenr#include "netinet/ipl.h" 55145510Sdarrenr#include "kmem.h" 56145510Sdarrenr 57145510Sdarrenr#ifdef __hpux 58145510Sdarrenr# define nlist nlist64 59145510Sdarrenr#endif 60145510Sdarrenr 61145510Sdarrenr#if defined(sun) && !SOLARIS2 62145510Sdarrenr# define STRERROR(x) sys_errlist[x] 63145510Sdarrenrextern char *sys_errlist[]; 64145510Sdarrenr#else 65145510Sdarrenr# define STRERROR(x) strerror(x) 66145510Sdarrenr#endif 67145510Sdarrenr 68145510Sdarrenr#if !defined(lint) 69145510Sdarrenrstatic const char sccsid[] ="@(#)ipnat.c 1.9 6/5/96 (C) 1993 Darren Reed"; 70170268Sdarrenrstatic const char rcsid[] = "@(#)$Id: ipnat.c,v 1.24.2.6 2007/05/11 11:16:55 darrenr Exp $"; 71145510Sdarrenr#endif 72145510Sdarrenr 73145510Sdarrenr 74145510Sdarrenr#if SOLARIS 75145510Sdarrenr#define bzero(a,b) memset(a,0,b) 76145510Sdarrenr#endif 77145510Sdarrenrint use_inet6 = 0; 78145510Sdarrenrchar thishost[MAXHOSTNAMELEN]; 79145510Sdarrenr 80145510Sdarrenrextern char *optarg; 81145510Sdarrenr 82170268Sdarrenrvoid dostats __P((int, natstat_t *, int, int)); 83170268Sdarrenrvoid flushtable __P((int, int)); 84145510Sdarrenrvoid usage __P((char *)); 85145510Sdarrenrint main __P((int, char*[])); 86145510Sdarrenrvoid showhostmap __P((natstat_t *nsp)); 87145510Sdarrenrvoid natstat_dead __P((natstat_t *, char *)); 88170268Sdarrenrvoid dostats_live __P((int, natstat_t *, int)); 89170268Sdarrenrvoid showhostmap_dead __P((natstat_t *)); 90170268Sdarrenrvoid showhostmap_live __P((int, natstat_t *)); 91170268Sdarrenrvoid dostats_dead __P((natstat_t *, int)); 92170268Sdarrenrvoid showtqtable_live __P((int)); 93145510Sdarrenr 94145510Sdarrenrint opts; 95145510Sdarrenr 96145510Sdarrenrvoid usage(name) 97145510Sdarrenrchar *name; 98145510Sdarrenr{ 99145510Sdarrenr fprintf(stderr, "Usage: %s [-CFhlnrRsv] [-f filename]\n", name); 100145510Sdarrenr exit(1); 101145510Sdarrenr} 102145510Sdarrenr 103145510Sdarrenr 104145510Sdarrenrint main(argc, argv) 105145510Sdarrenrint argc; 106145510Sdarrenrchar *argv[]; 107145510Sdarrenr{ 108145510Sdarrenr char *file, *core, *kernel; 109145510Sdarrenr natstat_t ns, *nsp; 110145510Sdarrenr int fd, c, mode; 111145510Sdarrenr ipfobj_t obj; 112145510Sdarrenr 113145510Sdarrenr fd = -1; 114145510Sdarrenr opts = 0; 115145510Sdarrenr nsp = &ns; 116145510Sdarrenr file = NULL; 117145510Sdarrenr core = NULL; 118145510Sdarrenr kernel = NULL; 119145510Sdarrenr mode = O_RDWR; 120145510Sdarrenr 121145510Sdarrenr while ((c = getopt(argc, argv, "CdFf:hlM:N:nrRsv")) != -1) 122145510Sdarrenr switch (c) 123145510Sdarrenr { 124145510Sdarrenr case 'C' : 125145510Sdarrenr opts |= OPT_CLEAR; 126145510Sdarrenr break; 127145510Sdarrenr case 'd' : 128145510Sdarrenr opts |= OPT_DEBUG; 129145510Sdarrenr break; 130145510Sdarrenr case 'f' : 131145510Sdarrenr file = optarg; 132145510Sdarrenr break; 133145510Sdarrenr case 'F' : 134145510Sdarrenr opts |= OPT_FLUSH; 135145510Sdarrenr break; 136145510Sdarrenr case 'h' : 137145510Sdarrenr opts |=OPT_HITS; 138145510Sdarrenr break; 139145510Sdarrenr case 'l' : 140145510Sdarrenr opts |= OPT_LIST; 141145510Sdarrenr mode = O_RDONLY; 142145510Sdarrenr break; 143145510Sdarrenr case 'M' : 144145510Sdarrenr core = optarg; 145145510Sdarrenr break; 146145510Sdarrenr case 'N' : 147145510Sdarrenr kernel = optarg; 148145510Sdarrenr break; 149145510Sdarrenr case 'n' : 150145510Sdarrenr opts |= OPT_DONOTHING; 151145510Sdarrenr mode = O_RDONLY; 152145510Sdarrenr break; 153145510Sdarrenr case 'R' : 154145510Sdarrenr opts |= OPT_NORESOLVE; 155145510Sdarrenr break; 156145510Sdarrenr case 'r' : 157145510Sdarrenr opts |= OPT_REMOVE; 158145510Sdarrenr break; 159145510Sdarrenr case 's' : 160145510Sdarrenr opts |= OPT_STAT; 161145510Sdarrenr mode = O_RDONLY; 162145510Sdarrenr break; 163145510Sdarrenr case 'v' : 164145510Sdarrenr opts |= OPT_VERBOSE; 165145510Sdarrenr break; 166145510Sdarrenr default : 167145510Sdarrenr usage(argv[0]); 168145510Sdarrenr } 169145510Sdarrenr 170145510Sdarrenr initparse(); 171145510Sdarrenr 172145510Sdarrenr if ((kernel != NULL) || (core != NULL)) { 173145510Sdarrenr (void) setgid(getgid()); 174145510Sdarrenr (void) setuid(getuid()); 175145510Sdarrenr } 176145510Sdarrenr 177170268Sdarrenr if (!(opts & OPT_DONOTHING)) { 178170268Sdarrenr if (((fd = open(IPNAT_NAME, mode)) == -1) && 179170268Sdarrenr ((fd = open(IPNAT_NAME, O_RDONLY)) == -1)) { 180170268Sdarrenr (void) fprintf(stderr, "%s: open: %s\n", IPNAT_NAME, 181170268Sdarrenr STRERROR(errno)); 182170268Sdarrenr exit(1); 183170268Sdarrenr } 184170268Sdarrenr } 185170268Sdarrenr 186145510Sdarrenr bzero((char *)&ns, sizeof(ns)); 187145510Sdarrenr 188145510Sdarrenr if ((opts & OPT_DONOTHING) == 0) { 189145510Sdarrenr if (checkrev(IPL_NAME) == -1) { 190145510Sdarrenr fprintf(stderr, "User/kernel version check failed\n"); 191145510Sdarrenr exit(1); 192145510Sdarrenr } 193145510Sdarrenr } 194145510Sdarrenr 195145510Sdarrenr if (!(opts & OPT_DONOTHING) && (kernel == NULL) && (core == NULL)) { 196145510Sdarrenr bzero((char *)&obj, sizeof(obj)); 197145510Sdarrenr obj.ipfo_rev = IPFILTER_VERSION; 198170268Sdarrenr obj.ipfo_type = IPFOBJ_NATSTAT; 199145510Sdarrenr obj.ipfo_size = sizeof(*nsp); 200145510Sdarrenr obj.ipfo_ptr = (void *)nsp; 201145510Sdarrenr if (ioctl(fd, SIOCGNATS, &obj) == -1) { 202145510Sdarrenr perror("ioctl(SIOCGNATS)"); 203145510Sdarrenr exit(1); 204145510Sdarrenr } 205145510Sdarrenr (void) setgid(getgid()); 206145510Sdarrenr (void) setuid(getuid()); 207145510Sdarrenr } else if ((kernel != NULL) || (core != NULL)) { 208145510Sdarrenr if (openkmem(kernel, core) == -1) 209145510Sdarrenr exit(1); 210145510Sdarrenr 211145510Sdarrenr natstat_dead(nsp, kernel); 212145510Sdarrenr if (opts & (OPT_LIST|OPT_STAT)) 213170268Sdarrenr dostats(fd, nsp, opts, 0); 214145510Sdarrenr exit(0); 215145510Sdarrenr } 216145510Sdarrenr 217145510Sdarrenr if (opts & (OPT_FLUSH|OPT_CLEAR)) 218145510Sdarrenr flushtable(fd, opts); 219145510Sdarrenr if (file) { 220145510Sdarrenr ipnat_parsefile(fd, ipnat_addrule, ioctl, file); 221145510Sdarrenr } 222145510Sdarrenr if (opts & (OPT_LIST|OPT_STAT)) 223170268Sdarrenr dostats(fd, nsp, opts, 1); 224145510Sdarrenr return 0; 225145510Sdarrenr} 226145510Sdarrenr 227145510Sdarrenr 228145510Sdarrenr/* 229145510Sdarrenr * Read NAT statistic information in using a symbol table and memory file 230145510Sdarrenr * rather than doing ioctl's. 231145510Sdarrenr */ 232145510Sdarrenrvoid natstat_dead(nsp, kernel) 233145510Sdarrenrnatstat_t *nsp; 234145510Sdarrenrchar *kernel; 235145510Sdarrenr{ 236145510Sdarrenr struct nlist nat_nlist[10] = { 237145510Sdarrenr { "nat_table" }, /* 0 */ 238145510Sdarrenr { "nat_list" }, 239145510Sdarrenr { "maptable" }, 240145510Sdarrenr { "ipf_nattable_sz" }, 241145510Sdarrenr { "ipf_natrules_sz" }, 242145510Sdarrenr { "ipf_rdrrules_sz" }, /* 5 */ 243145510Sdarrenr { "ipf_hostmap_sz" }, 244145510Sdarrenr { "nat_instances" }, 245145510Sdarrenr { "ap_sess_list" }, 246145510Sdarrenr { NULL } 247145510Sdarrenr }; 248145510Sdarrenr void *tables[2]; 249145510Sdarrenr 250145510Sdarrenr if (nlist(kernel, nat_nlist) == -1) { 251145510Sdarrenr fprintf(stderr, "nlist error\n"); 252145510Sdarrenr return; 253145510Sdarrenr } 254145510Sdarrenr 255145510Sdarrenr /* 256145510Sdarrenr * Normally the ioctl copies all of these values into the structure 257145510Sdarrenr * for us, before returning it to userland, so here we must copy each 258145510Sdarrenr * one in individually. 259145510Sdarrenr */ 260145510Sdarrenr kmemcpy((char *)&tables, nat_nlist[0].n_value, sizeof(tables)); 261145510Sdarrenr nsp->ns_table[0] = tables[0]; 262145510Sdarrenr nsp->ns_table[1] = tables[1]; 263145510Sdarrenr 264145510Sdarrenr kmemcpy((char *)&nsp->ns_list, nat_nlist[1].n_value, 265145510Sdarrenr sizeof(nsp->ns_list)); 266145510Sdarrenr kmemcpy((char *)&nsp->ns_maptable, nat_nlist[2].n_value, 267145510Sdarrenr sizeof(nsp->ns_maptable)); 268145510Sdarrenr kmemcpy((char *)&nsp->ns_nattab_sz, nat_nlist[3].n_value, 269145510Sdarrenr sizeof(nsp->ns_nattab_sz)); 270145510Sdarrenr kmemcpy((char *)&nsp->ns_rultab_sz, nat_nlist[4].n_value, 271145510Sdarrenr sizeof(nsp->ns_rultab_sz)); 272145510Sdarrenr kmemcpy((char *)&nsp->ns_rdrtab_sz, nat_nlist[5].n_value, 273145510Sdarrenr sizeof(nsp->ns_rdrtab_sz)); 274145510Sdarrenr kmemcpy((char *)&nsp->ns_hostmap_sz, nat_nlist[6].n_value, 275145510Sdarrenr sizeof(nsp->ns_hostmap_sz)); 276145510Sdarrenr kmemcpy((char *)&nsp->ns_instances, nat_nlist[7].n_value, 277145510Sdarrenr sizeof(nsp->ns_instances)); 278145510Sdarrenr kmemcpy((char *)&nsp->ns_apslist, nat_nlist[8].n_value, 279145510Sdarrenr sizeof(nsp->ns_apslist)); 280145510Sdarrenr} 281145510Sdarrenr 282145510Sdarrenr 283145510Sdarrenr/* 284170268Sdarrenr * Issue an ioctl to flush either the NAT rules table or the active mapping 285170268Sdarrenr * table or both. 286170268Sdarrenr */ 287170268Sdarrenrvoid flushtable(fd, opts) 288170268Sdarrenrint fd, opts; 289170268Sdarrenr{ 290170268Sdarrenr int n = 0; 291170268Sdarrenr 292170268Sdarrenr if (opts & OPT_FLUSH) { 293170268Sdarrenr n = 0; 294170268Sdarrenr if (!(opts & OPT_DONOTHING) && ioctl(fd, SIOCIPFFL, &n) == -1) 295170268Sdarrenr perror("ioctl(SIOCFLNAT)"); 296170268Sdarrenr else 297170268Sdarrenr printf("%d entries flushed from NAT table\n", n); 298170268Sdarrenr } 299170268Sdarrenr 300170268Sdarrenr if (opts & OPT_CLEAR) { 301170268Sdarrenr n = 1; 302170268Sdarrenr if (!(opts & OPT_DONOTHING) && ioctl(fd, SIOCIPFFL, &n) == -1) 303170268Sdarrenr perror("ioctl(SIOCCNATL)"); 304170268Sdarrenr else 305170268Sdarrenr printf("%d entries flushed from NAT list\n", n); 306170268Sdarrenr } 307170268Sdarrenr} 308170268Sdarrenr 309170268Sdarrenr 310170268Sdarrenr/* 311145510Sdarrenr * Display NAT statistics. 312145510Sdarrenr */ 313170268Sdarrenrvoid dostats_dead(nsp, opts) 314145510Sdarrenrnatstat_t *nsp; 315145510Sdarrenrint opts; 316145510Sdarrenr{ 317145510Sdarrenr nat_t *np, nat; 318145510Sdarrenr ipnat_t ipn; 319145510Sdarrenr 320170268Sdarrenr printf("List of active MAP/Redirect filters:\n"); 321170268Sdarrenr while (nsp->ns_list) { 322170268Sdarrenr if (kmemcpy((char *)&ipn, (long)nsp->ns_list, 323170268Sdarrenr sizeof(ipn))) { 324170268Sdarrenr perror("kmemcpy"); 325170268Sdarrenr break; 326170268Sdarrenr } 327170268Sdarrenr if (opts & OPT_HITS) 328170268Sdarrenr printf("%lu ", ipn.in_hits); 329170268Sdarrenr printnat(&ipn, opts & (OPT_DEBUG|OPT_VERBOSE)); 330170268Sdarrenr nsp->ns_list = ipn.in_next; 331170268Sdarrenr } 332170268Sdarrenr 333170268Sdarrenr printf("\nList of active sessions:\n"); 334170268Sdarrenr 335170268Sdarrenr for (np = nsp->ns_instances; np; np = nat.nat_next) { 336170268Sdarrenr if (kmemcpy((char *)&nat, (long)np, sizeof(nat))) 337170268Sdarrenr break; 338170268Sdarrenr printactivenat(&nat, opts, 0, nsp->ns_ticks); 339170268Sdarrenr if (nat.nat_aps) 340170268Sdarrenr printaps(nat.nat_aps, opts); 341170268Sdarrenr } 342170268Sdarrenr 343170268Sdarrenr if (opts & OPT_VERBOSE) 344170268Sdarrenr showhostmap_dead(nsp); 345170268Sdarrenr} 346170268Sdarrenr 347170268Sdarrenr 348170268Sdarrenrvoid dostats(fd, nsp, opts, alive) 349170268Sdarrenrnatstat_t *nsp; 350170268Sdarrenrint fd, opts, alive; 351170268Sdarrenr{ 352145510Sdarrenr /* 353145510Sdarrenr * Show statistics ? 354145510Sdarrenr */ 355145510Sdarrenr if (opts & OPT_STAT) { 356145510Sdarrenr printf("mapped\tin\t%lu\tout\t%lu\n", 357145510Sdarrenr nsp->ns_mapped[0], nsp->ns_mapped[1]); 358145510Sdarrenr printf("added\t%lu\texpired\t%lu\n", 359145510Sdarrenr nsp->ns_added, nsp->ns_expire); 360145510Sdarrenr printf("no memory\t%lu\tbad nat\t%lu\n", 361145510Sdarrenr nsp->ns_memfail, nsp->ns_badnat); 362145510Sdarrenr printf("inuse\t%lu\nrules\t%lu\n", 363145510Sdarrenr nsp->ns_inuse, nsp->ns_rules); 364145510Sdarrenr printf("wilds\t%u\n", nsp->ns_wilds); 365145510Sdarrenr if (opts & OPT_VERBOSE) 366145510Sdarrenr printf("table %p list %p\n", 367145510Sdarrenr nsp->ns_table, nsp->ns_list); 368170268Sdarrenr if (alive) 369170268Sdarrenr showtqtable_live(fd); 370145510Sdarrenr } 371145510Sdarrenr 372170268Sdarrenr if (opts & OPT_LIST) { 373170268Sdarrenr if (alive) 374170268Sdarrenr dostats_live(fd, nsp, opts); 375170268Sdarrenr else 376170268Sdarrenr dostats_dead(nsp, opts); 377170268Sdarrenr } 378170268Sdarrenr} 379170268Sdarrenr 380170268Sdarrenr 381170268Sdarrenr/* 382170268Sdarrenr * Display NAT statistics. 383170268Sdarrenr */ 384170268Sdarrenrvoid dostats_live(fd, nsp, opts) 385170268Sdarrenrnatstat_t *nsp; 386170268Sdarrenrint fd, opts; 387170268Sdarrenr{ 388170268Sdarrenr ipfgeniter_t iter; 389170268Sdarrenr ipfobj_t obj; 390170268Sdarrenr ipnat_t ipn; 391170268Sdarrenr nat_t nat; 392170268Sdarrenr 393170268Sdarrenr bzero((char *)&obj, sizeof(obj)); 394170268Sdarrenr obj.ipfo_rev = IPFILTER_VERSION; 395170268Sdarrenr obj.ipfo_type = IPFOBJ_GENITER; 396170268Sdarrenr obj.ipfo_size = sizeof(iter); 397170268Sdarrenr obj.ipfo_ptr = &iter; 398170268Sdarrenr 399170268Sdarrenr iter.igi_type = IPFGENITER_IPNAT; 400170268Sdarrenr iter.igi_nitems = 1; 401170268Sdarrenr iter.igi_data = &ipn; 402170268Sdarrenr 403145510Sdarrenr /* 404145510Sdarrenr * Show list of NAT rules and NAT sessions ? 405145510Sdarrenr */ 406170268Sdarrenr printf("List of active MAP/Redirect filters:\n"); 407170268Sdarrenr while (nsp->ns_list) { 408170268Sdarrenr if (ioctl(fd, SIOCGENITER, &obj) == -1) 409170268Sdarrenr break; 410170268Sdarrenr if (opts & OPT_HITS) 411170268Sdarrenr printf("%lu ", ipn.in_hits); 412170268Sdarrenr printnat(&ipn, opts & (OPT_DEBUG|OPT_VERBOSE)); 413170268Sdarrenr nsp->ns_list = ipn.in_next; 414170268Sdarrenr } 415145510Sdarrenr 416170268Sdarrenr printf("\nList of active sessions:\n"); 417145510Sdarrenr 418170268Sdarrenr iter.igi_type = IPFGENITER_NAT; 419170268Sdarrenr iter.igi_nitems = 1; 420170268Sdarrenr iter.igi_data = &nat; 421145510Sdarrenr 422170268Sdarrenr while (nsp->ns_instances != NULL) { 423170268Sdarrenr if (ioctl(fd, SIOCGENITER, &obj) == -1) 424170268Sdarrenr break; 425170268Sdarrenr printactivenat(&nat, opts, 1, nsp->ns_ticks); 426170268Sdarrenr if (nat.nat_aps) 427170268Sdarrenr printaps(nat.nat_aps, opts); 428170268Sdarrenr nsp->ns_instances = nat.nat_next; 429145510Sdarrenr } 430170268Sdarrenr 431170268Sdarrenr if (opts & OPT_VERBOSE) 432170268Sdarrenr showhostmap_live(fd, nsp); 433145510Sdarrenr} 434145510Sdarrenr 435145510Sdarrenr 436145510Sdarrenr/* 437145510Sdarrenr * Display the active host mapping table. 438145510Sdarrenr */ 439170268Sdarrenrvoid showhostmap_dead(nsp) 440145510Sdarrenrnatstat_t *nsp; 441145510Sdarrenr{ 442145510Sdarrenr hostmap_t hm, *hmp, **maptable; 443145510Sdarrenr u_int hv; 444145510Sdarrenr 445145510Sdarrenr printf("\nList of active host mappings:\n"); 446145510Sdarrenr 447145510Sdarrenr maptable = (hostmap_t **)malloc(sizeof(hostmap_t *) * 448145510Sdarrenr nsp->ns_hostmap_sz); 449145510Sdarrenr if (kmemcpy((char *)maptable, (u_long)nsp->ns_maptable, 450145510Sdarrenr sizeof(hostmap_t *) * nsp->ns_hostmap_sz)) { 451145510Sdarrenr perror("kmemcpy (maptable)"); 452145510Sdarrenr return; 453145510Sdarrenr } 454145510Sdarrenr 455145510Sdarrenr for (hv = 0; hv < nsp->ns_hostmap_sz; hv++) { 456145510Sdarrenr hmp = maptable[hv]; 457145510Sdarrenr 458145510Sdarrenr while (hmp) { 459145510Sdarrenr if (kmemcpy((char *)&hm, (u_long)hmp, sizeof(hm))) { 460145510Sdarrenr perror("kmemcpy (hostmap)"); 461145510Sdarrenr return; 462145510Sdarrenr } 463145510Sdarrenr 464145510Sdarrenr printhostmap(&hm, hv); 465145510Sdarrenr hmp = hm.hm_next; 466145510Sdarrenr } 467145510Sdarrenr } 468145510Sdarrenr free(maptable); 469145510Sdarrenr} 470145510Sdarrenr 471145510Sdarrenr 472145510Sdarrenr/* 473170268Sdarrenr * Display the active host mapping table. 474145510Sdarrenr */ 475170268Sdarrenrvoid showhostmap_live(fd, nsp) 476170268Sdarrenrint fd; 477170268Sdarrenrnatstat_t *nsp; 478145510Sdarrenr{ 479170268Sdarrenr ipfgeniter_t iter; 480170268Sdarrenr hostmap_t hm; 481170268Sdarrenr ipfobj_t obj; 482145510Sdarrenr 483170268Sdarrenr bzero((char *)&obj, sizeof(obj)); 484170268Sdarrenr obj.ipfo_rev = IPFILTER_VERSION; 485170268Sdarrenr obj.ipfo_type = IPFOBJ_GENITER; 486170268Sdarrenr obj.ipfo_size = sizeof(iter); 487170268Sdarrenr obj.ipfo_ptr = &iter; 488170268Sdarrenr 489170268Sdarrenr iter.igi_type = IPFGENITER_HOSTMAP; 490170268Sdarrenr iter.igi_nitems = 1; 491170268Sdarrenr iter.igi_data = &hm; 492170268Sdarrenr 493170268Sdarrenr printf("\nList of active host mappings:\n"); 494170268Sdarrenr 495170268Sdarrenr while (nsp->ns_maplist != NULL) { 496170268Sdarrenr if (ioctl(fd, SIOCGENITER, &obj) == -1) 497170268Sdarrenr break; 498170268Sdarrenr printhostmap(&hm, 0); 499170268Sdarrenr nsp->ns_maplist = hm.hm_next; 500145510Sdarrenr } 501170268Sdarrenr} 502145510Sdarrenr 503170268Sdarrenr 504170268Sdarrenrvoid showtqtable_live(fd) 505170268Sdarrenrint fd; 506170268Sdarrenr{ 507170268Sdarrenr ipftq_t table[IPF_TCP_NSTATES]; 508170268Sdarrenr ipfobj_t obj; 509170268Sdarrenr 510170268Sdarrenr bzero((char *)&obj, sizeof(obj)); 511170268Sdarrenr obj.ipfo_rev = IPFILTER_VERSION; 512170268Sdarrenr obj.ipfo_size = sizeof(table); 513170268Sdarrenr obj.ipfo_ptr = (void *)table; 514170268Sdarrenr obj.ipfo_type = IPFOBJ_STATETQTAB; 515170268Sdarrenr 516170268Sdarrenr if (ioctl(fd, SIOCGTQTAB, &obj) == 0) { 517170268Sdarrenr printtqtable(table); 518145510Sdarrenr } 519145510Sdarrenr} 520