load_hashnode.c revision 256281
1178825Sdfr/* $FreeBSD: stable/10/contrib/ipfilter/lib/load_hashnode.c 255332 2013-09-06 23:11:19Z cy $ */ 2178825Sdfr 3233294Sstas/* 4178825Sdfr * Copyright (C) 2012 by Darren Reed. 5178825Sdfr * 6178825Sdfr * See the IPFILTER.LICENCE file for details on licencing. 7178825Sdfr * 8178825Sdfr * $Id$ 9178825Sdfr */ 10178825Sdfr 11178825Sdfr#include <fcntl.h> 12178825Sdfr#include <sys/ioctl.h> 13178825Sdfr#include "ipf.h" 14178825Sdfr#include "netinet/ip_lookup.h" 15178825Sdfr#include "netinet/ip_htable.h" 16178825Sdfr 17178825Sdfr 18178825Sdfrint 19178825Sdfrload_hashnode(unit, name, node, ttl, iocfunc) 20178825Sdfr int unit; 21178825Sdfr char *name; 22178825Sdfr iphtent_t *node; 23178825Sdfr int ttl; 24178825Sdfr ioctlfunc_t iocfunc; 25178825Sdfr{ 26178825Sdfr iplookupop_t op; 27178825Sdfr iphtent_t ipe; 28178825Sdfr char *what; 29178825Sdfr int err; 30178825Sdfr 31178825Sdfr if (pool_open() == -1) 32178825Sdfr return -1; 33178825Sdfr 34233294Sstas op.iplo_type = IPLT_HASH; 35178825Sdfr op.iplo_unit = unit; 36178825Sdfr op.iplo_arg = 0; 37178825Sdfr op.iplo_size = sizeof(ipe); 38178825Sdfr op.iplo_struct = &ipe; 39178825Sdfr strncpy(op.iplo_name, name, sizeof(op.iplo_name)); 40178825Sdfr 41178825Sdfr bzero((char *)&ipe, sizeof(ipe)); 42178825Sdfr ipe.ipe_family = node->ipe_family; 43178825Sdfr ipe.ipe_die = ttl; 44178825Sdfr bcopy((char *)&node->ipe_addr, (char *)&ipe.ipe_addr, 45178825Sdfr sizeof(ipe.ipe_addr)); 46178825Sdfr bcopy((char *)&node->ipe_mask, (char *)&ipe.ipe_mask, 47178825Sdfr sizeof(ipe.ipe_mask)); 48178825Sdfr bcopy((char *)&node->ipe_group, (char *)&ipe.ipe_group, 49178825Sdfr sizeof(ipe.ipe_group)); 50178825Sdfr 51178825Sdfr if ((opts & OPT_REMOVE) == 0) { 52178825Sdfr what = "add"; 53178825Sdfr err = pool_ioctl(iocfunc, SIOCLOOKUPADDNODE, &op); 54178825Sdfr } else { 55178825Sdfr what = "delete"; 56178825Sdfr err = pool_ioctl(iocfunc, SIOCLOOKUPDELNODE, &op); 57178825Sdfr } 58178825Sdfr 59178825Sdfr if (err != 0) 60178825Sdfr if (!(opts & OPT_DONOTHING)) { 61178825Sdfr char msg[80]; 62178825Sdfr 63178825Sdfr sprintf(msg, "%s node from lookup hash table", what); 64178825Sdfr return ipf_perror_fd(pool_fd(), iocfunc, msg); 65178825Sdfr } 66178825Sdfr return 0; 67178825Sdfr} 68178825Sdfr