mlf_rule.c revision 145511
1231921Smp/* $NetBSD$ */ 2231921Smp 3231921Smp/* 4231921Smp * Copyright (C) 1993-2001 by Darren Reed. 5231921Smp * 6231921Smp * See the IPFILTER.LICENCE file for details on licencing. 7231921Smp */ 8231921Smp/* 9231921Smp * 29/12/94 Added code from Marc Huber <huber@fzi.de> to allow it to allocate 10231921Smp * its own major char number! Way cool patch! 11231921Smp */ 12231921Smp 13231921Smp 14231921Smp#include <sys/param.h> 15231921Smp 16231921Smp#if defined(__FreeBSD__) && (__FreeBSD__ > 1) 17231921Smp# ifdef IPFILTER_LKM 18231921Smp# include <osreldate.h> 19231921Smp# define ACTUALLY_LKM_NOT_KERNEL 20231921Smp# else 21231921Smp# include <sys/osreldate.h> 22231921Smp# endif 23231921Smp#endif 24231921Smp#include <sys/systm.h> 25231921Smp#if defined(__FreeBSD_version) && (__FreeBSD_version >= 220000) 26231921Smp# include <sys/conf.h> 27231921Smp# include <sys/kernel.h> 28231921Smp# ifdef DEVFS 29231921Smp# include <sys/devfsext.h> 30231921Smp# endif /*DEVFS*/ 31231921Smp#endif 32231921Smp#include <sys/conf.h> 33231921Smp#include <sys/file.h> 34231921Smp#if defined(__FreeBSD_version) && (__FreeBSD_version >= 300000) 35231921Smp# include <sys/lock.h> 36231921Smp#endif 37231921Smp#include <sys/stat.h> 38231921Smp#include <sys/proc.h> 39231921Smp#include <sys/kernel.h> 40231921Smp#include <sys/vnode.h> 41231921Smp#include <sys/namei.h> 42231921Smp#include <sys/malloc.h> 43231921Smp#include <sys/mount.h> 44231921Smp#include <sys/exec.h> 45231921Smp#include <sys/mbuf.h> 46231921Smp#if BSD >= 199506 47231921Smp# include <sys/sysctl.h> 48231921Smp#endif 49231921Smp#if (__FreeBSD_version >= 300000) 50231921Smp# include <sys/socket.h> 51231921Smp#endif 52231921Smp#if (__FreeBSD_version >= 199511) 53231921Smp#include <net/if.h> 54231921Smp#include <netinet/in_systm.h> 55231921Smp#include <netinet/in.h> 56231921Smp#include <netinet/ip.h> 57231921Smp#include <net/route.h> 58231921Smp#include <netinet/ip_var.h> 59231921Smp#include <netinet/tcp.h> 60231921Smp#include <netinet/tcpip.h> 61231921Smp#endif 62231921Smp#if (__FreeBSD__ > 1) 63231921Smp# include <sys/sysent.h> 64231921Smp#endif 65231921Smp#include <sys/lkm.h> 66231921Smp#include "netinet/ip_compat.h" 67231921Smp#include "netinet/ip_fil.h" 68231921Smp#include "netinet/ip_rules.h" 69231921Smp 70231921Smp 71231921Smpint xxxinit __P((struct lkm_table *, int, int)); 72231921Smp 73231921Smp#if !defined(__FreeBSD_version) || (__FreeBSD_version < 220000) 74231921SmpMOD_DEV(IPL_VERSION, LM_DT_CHAR, -1, &ipldevsw); 75231921Smp#endif 76231921Smp 77231921Smpstatic int ipfrule_ioctl __P((struct lkm_table *, int)); 78231921Smp 79231921Smp#if defined(__FreeBSD_version) && (__FreeBSD_version < 220000) 80231921Smp 81231921Smpint xxxinit(lkmtp, cmd, ver) 82231921Smpstruct lkm_table *lkmtp; 83231921Smpint cmd, ver; 84231921Smp{ 85231921Smp DISPATCH(lkmtp, cmd, ver, ipfrule_ioctl, ipfrule_ioctl, ipfrule_ioctl); 86231921Smp} 87231921Smp#else /* __FREEBSD_version >= 220000 */ 88231921Smp# ifdef IPFILTER_LKM 89231921Smp# include <sys/exec.h> 90231921Smp 91231921Smp# if (__FreeBSD_version >= 300000) 92231921SmpMOD_MISC(ipfrule); 93231921Smp# else 94231921SmpMOD_DECL(ipfrule); 95231921Smp 96231921Smp 97231921Smpstatic struct lkm_misc _module = { 98231921Smp LM_MISC, 99231921Smp LKM_VERSION, 100231921Smp "IP Filter rules", 101231921Smp 0, 102231921Smp}; 103231921Smp# endif 104231921Smp 105231921Smp 106231921Smpint ipfrule __P((struct lkm_table *, int, int)); 107231921Smp 108231921Smp 109231921Smpint ipfrule(lkmtp, cmd, ver) 110231921Smpstruct lkm_table *lkmtp; 111231921Smpint cmd, ver; 112231921Smp{ 113231921Smp# if (__FreeBSD_version >= 300000) 114231921Smp MOD_DISPATCH(ipfrule, lkmtp, cmd, ver, ipfrule_ioctl, ipfrule_ioctl, 115231921Smp ipfrule_ioctl); 116231921Smp# else 117231921Smp DISPATCH(lkmtp, cmd, ver, ipfrule_ioctl, ipfrule_ioctl, ipfrule_ioctl); 118231921Smp# endif 119231921Smp} 120# endif /* IPFILTER_LKM */ 121 122 123int ipfrule_load(lkmtp, cmd) 124struct lkm_table *lkmtp; 125int cmd; 126{ 127 return ipfrule_add(); 128} 129 130 131int ipfrule_unload(lkmtp, cmd) 132struct lkm_table *lkmtp; 133int cmd; 134{ 135 return ipfrule_remove(); 136} 137 138 139static int ipfrule_ioctl(lkmtp, cmd) 140struct lkm_table *lkmtp; 141int cmd; 142{ 143 int err = 0; 144 145 switch (cmd) 146 { 147 case LKM_E_LOAD : 148 if (lkmexists(lkmtp)) 149 return EEXIST; 150 151 err = ipfrule_load(lkmtp, cmd); 152 if (!err) 153 fr_refcnt++; 154 break; 155 case LKM_E_UNLOAD : 156 err = ipfrule_unload(lkmtp, cmd); 157 if (!err) 158 fr_refcnt--; 159 break; 160 case LKM_E_STAT : 161 break; 162 default: 163 err = EIO; 164 break; 165 } 166 return err; 167} 168#endif /* _FreeBSD_version */ 169