mlf_rule.c revision 145510
167754Smsmith/* $NetBSD$ */ 267754Smsmith 3193267Sjkim/* 467754Smsmith * Copyright (C) 1993-2001 by Darren Reed. 567754Smsmith * 667754Smsmith * See the IPFILTER.LICENCE file for details on licencing. 767754Smsmith */ 8316303Sjkim/* 9316303Sjkim * 29/12/94 Added code from Marc Huber <huber@fzi.de> to allow it to allocate 10316303Sjkim * its own major char number! Way cool patch! 11316303Sjkim */ 12316303Sjkim 1370243Smsmith 1467754Smsmith#include <sys/param.h> 15316303Sjkim 16316303Sjkim#if defined(__FreeBSD__) && (__FreeBSD__ > 1) 17316303Sjkim# ifdef IPFILTER_LKM 18316303Sjkim# include <osreldate.h> 19316303Sjkim# define ACTUALLY_LKM_NOT_KERNEL 20316303Sjkim# else 21316303Sjkim# include <sys/osreldate.h> 22316303Sjkim# endif 23316303Sjkim#endif 24316303Sjkim#include <sys/systm.h> 25316303Sjkim#if defined(__FreeBSD_version) && (__FreeBSD_version >= 220000) 26316303Sjkim# include <sys/conf.h> 27316303Sjkim# include <sys/kernel.h> 28316303Sjkim# ifdef DEVFS 29316303Sjkim# include <sys/devfsext.h> 30316303Sjkim# endif /*DEVFS*/ 31316303Sjkim#endif 32316303Sjkim#include <sys/conf.h> 33316303Sjkim#include <sys/file.h> 34316303Sjkim#if defined(__FreeBSD_version) && (__FreeBSD_version >= 300000) 35316303Sjkim# include <sys/lock.h> 36316303Sjkim#endif 37316303Sjkim#include <sys/stat.h> 38316303Sjkim#include <sys/proc.h> 39316303Sjkim#include <sys/kernel.h> 40316303Sjkim#include <sys/vnode.h> 41316303Sjkim#include <sys/namei.h> 42316303Sjkim#include <sys/malloc.h> 43316303Sjkim#include <sys/mount.h> 44316303Sjkim#include <sys/exec.h> 45316303Sjkim#include <sys/mbuf.h> 46316303Sjkim#if BSD >= 199506 47316303Sjkim# include <sys/sysctl.h> 48316303Sjkim#endif 49316303Sjkim#if (__FreeBSD_version >= 300000) 50316303Sjkim# include <sys/socket.h> 51316303Sjkim#endif 52316303Sjkim#if (__FreeBSD_version >= 199511) 53316303Sjkim#include <net/if.h> 54316303Sjkim#include <netinet/in_systm.h> 55316303Sjkim#include <netinet/in.h> 56316303Sjkim#include <netinet/ip.h> 57316303Sjkim#include <net/route.h> 58316303Sjkim#include <netinet/ip_var.h> 59316303Sjkim#include <netinet/tcp.h> 60316303Sjkim#include <netinet/tcpip.h> 61316303Sjkim#endif 62316303Sjkim#if (__FreeBSD__ > 1) 63316303Sjkim# include <sys/sysent.h> 64316303Sjkim#endif 65316303Sjkim#include <sys/lkm.h> 66316303Sjkim#include "netinet/ip_compat.h" 67316303Sjkim#include "netinet/ip_fil.h" 68316303Sjkim#include "netinet/ip_rules.h" 69316303Sjkim 70316303Sjkim 71316303Sjkimint xxxinit __P((struct lkm_table *, int, int)); 72316303Sjkim 73316303Sjkim#if !defined(__FreeBSD_version) || (__FreeBSD_version < 220000) 74316303SjkimMOD_DEV(IPL_VERSION, LM_DT_CHAR, -1, &ipldevsw); 75316303Sjkim#endif 76316303Sjkim 77316303Sjkimstatic int ipfrule_ioctl __P((struct lkm_table *, int)); 78316303Sjkim 79316303Sjkim#if defined(__FreeBSD_version) && (__FreeBSD_version < 220000) 80316303Sjkim 81316303Sjkimint xxxinit(lkmtp, cmd, ver) 82316303Sjkimstruct lkm_table *lkmtp; 83316303Sjkimint cmd, ver; 84316303Sjkim{ 85316303Sjkim DISPATCH(lkmtp, cmd, ver, ipfrule_ioctl, ipfrule_ioctl, ipfrule_ioctl); 86316303Sjkim} 87316303Sjkim#else /* __FREEBSD_version >= 220000 */ 88316303Sjkim# ifdef IPFILTER_LKM 89316303Sjkim# include <sys/exec.h> 90316303Sjkim 91316303Sjkim# if (__FreeBSD_version >= 300000) 92316303SjkimMOD_MISC(ipfrule); 93316303Sjkim# else 94316303SjkimMOD_DECL(ipfrule); 95316303Sjkim 96316303Sjkim 97316303Sjkimstatic struct lkm_misc _module = { 98316303Sjkim LM_MISC, 99316303Sjkim LKM_VERSION, 100316303Sjkim "IP Filter rules", 101316303Sjkim 0, 102316303Sjkim}; 103316303Sjkim# endif 104316303Sjkim 105316303Sjkim 106316303Sjkimint ipfrule __P((struct lkm_table *, int, int)); 107316303Sjkim 108316303Sjkim 109316303Sjkimint ipfrule(lkmtp, cmd, ver) 110316303Sjkimstruct lkm_table *lkmtp; 111316303Sjkimint cmd, ver; 112316303Sjkim{ 113316303Sjkim# if (__FreeBSD_version >= 300000) 114316303Sjkim MOD_DISPATCH(ipfrule, lkmtp, cmd, ver, ipfrule_ioctl, ipfrule_ioctl, 115316303Sjkim ipfrule_ioctl); 116316303Sjkim# else 117316303Sjkim DISPATCH(lkmtp, cmd, ver, ipfrule_ioctl, ipfrule_ioctl, ipfrule_ioctl); 118316303Sjkim# endif 119316303Sjkim} 120217365Sjkim# endif /* IPFILTER_LKM */ 121217365Sjkim 122217365Sjkim 123217365Sjkimint ipfrule_load(lkmtp, cmd) 124217365Sjkimstruct lkm_table *lkmtp; 125217365Sjkimint cmd; 126217365Sjkim{ 127217365Sjkim return ipfrule_add(); 128217365Sjkim} 129217365Sjkim 130217365Sjkim 131217365Sjkimint ipfrule_unload(lkmtp, cmd) 132217365Sjkimstruct lkm_table *lkmtp; 133217365Sjkimint cmd; 13467754Smsmith{ 135316303Sjkim return ipfrule_remove(); 136316303Sjkim} 137316303Sjkim 138316303Sjkim 139316303Sjkimstatic int ipfrule_ioctl(lkmtp, cmd) 140316303Sjkimstruct lkm_table *lkmtp; 141316303Sjkimint cmd; 142316303Sjkim{ 143316303Sjkim int err = 0; 144316303Sjkim 145316303Sjkim switch (cmd) 146316303Sjkim { 147316303Sjkim case LKM_E_LOAD : 148217365Sjkim if (lkmexists(lkmtp)) 149217365Sjkim return EEXIST; 15067754Smsmith 151316303Sjkim err = ipfrule_load(lkmtp, cmd); 15267754Smsmith if (!err) 153193341Sjkim fr_refcnt++; 154193341Sjkim break; 155193341Sjkim case LKM_E_UNLOAD : 156193341Sjkim err = ipfrule_unload(lkmtp, cmd); 15767754Smsmith if (!err) 158102550Siwasaki fr_refcnt--; 15991116Smsmith break; 16067754Smsmith case LKM_E_STAT : 161287168Sjkim break; 162316303Sjkim default: 163316303Sjkim err = EIO; 164316303Sjkim break; 165316303Sjkim } 166102550Siwasaki return err; 16767754Smsmith} 16867754Smsmith#endif /* _FreeBSD_version */ 16967754Smsmith