mlf_rule.c revision 288683
1219019Sgabor/* $FreeBSD: head/contrib/ipfilter/mlf_rule.c 255332 2013-09-06 23:11:19Z cy $ */ 2219019Sgabor 3219019Sgabor/* 4219019Sgabor * Copyright (C) 2012 by Darren Reed. 5219019Sgabor * 6219019Sgabor * See the IPFILTER.LICENCE file for details on licencing. 7219019Sgabor */ 8219019Sgabor/* 9219019Sgabor * 29/12/94 Added code from Marc Huber <huber@fzi.de> to allow it to allocate 10219019Sgabor * its own major char number! Way cool patch! 11219019Sgabor */ 12219019Sgabor 13219019Sgabor 14219019Sgabor#include <sys/param.h> 15219019Sgabor 16219019Sgabor#if defined(__FreeBSD__) && (__FreeBSD__ > 1) 17219019Sgabor# ifdef IPFILTER_LKM 18219019Sgabor# include <osreldate.h> 19219019Sgabor# define ACTUALLY_LKM_NOT_KERNEL 20219019Sgabor# else 21219019Sgabor# include <sys/osreldate.h> 22219019Sgabor# endif 23219019Sgabor#endif 24219019Sgabor#include <sys/systm.h> 25219019Sgabor#if defined(__FreeBSD_version) && (__FreeBSD_version >= 220000) 26219019Sgabor# include <sys/conf.h> 27219019Sgabor# include <sys/kernel.h> 28219019Sgabor# ifdef DEVFS 29219019Sgabor# include <sys/devfsext.h> 30219019Sgabor# endif /*DEVFS*/ 31219019Sgabor#endif 32219019Sgabor#include <sys/conf.h> 33219019Sgabor#include <sys/file.h> 34219019Sgabor#if defined(__FreeBSD_version) && (__FreeBSD_version >= 300000) 35219019Sgabor# include <sys/lock.h> 36219019Sgabor#endif 37219019Sgabor#include <sys/stat.h> 38219019Sgabor#include <sys/proc.h> 39219019Sgabor#include <sys/kernel.h> 40219019Sgabor#include <sys/vnode.h> 41219019Sgabor#include <sys/namei.h> 42219019Sgabor#include <sys/malloc.h> 43219019Sgabor#include <sys/mount.h> 44219019Sgabor#include <sys/exec.h> 45219019Sgabor#include <sys/mbuf.h> 46219019Sgabor#if BSD >= 199506 47219019Sgabor# include <sys/sysctl.h> 48219019Sgabor#endif 49219019Sgabor#if (__FreeBSD_version >= 300000) 50219019Sgabor# include <sys/socket.h> 51219019Sgabor#endif 52219019Sgabor#if (__FreeBSD_version >= 199511) 53219019Sgabor#include <net/if.h> 54219019Sgabor#include <netinet/in_systm.h> 55219019Sgabor#include <netinet/in.h> 56219019Sgabor#include <netinet/ip.h> 57219019Sgabor#include <net/route.h> 58#include <netinet/ip_var.h> 59#include <netinet/tcp.h> 60#include <netinet/tcpip.h> 61#endif 62#if (__FreeBSD__ > 1) 63# include <sys/sysent.h> 64#endif 65#include <sys/lkm.h> 66#include "netinet/ip_compat.h" 67#include "netinet/ip_fil.h" 68#include "netinet/ip_rules.h" 69 70 71int xxxinit __P((struct lkm_table *, int, int)); 72 73#if !defined(__FreeBSD_version) || (__FreeBSD_version < 220000) 74MOD_DEV(IPL_VERSION, LM_DT_CHAR, -1, &ipldevsw); 75#endif 76 77static int ipfrule_ioctl __P((struct lkm_table *, int)); 78 79#if defined(__FreeBSD_version) && (__FreeBSD_version < 220000) 80 81int xxxinit(lkmtp, cmd, ver) 82 struct lkm_table *lkmtp; 83 int cmd, ver; 84{ 85 DISPATCH(lkmtp, cmd, ver, ipfrule_ioctl, ipfrule_ioctl, ipfrule_ioctl); 86} 87#else /* __FREEBSD_version >= 220000 */ 88# ifdef IPFILTER_LKM 89# include <sys/exec.h> 90 91# if (__FreeBSD_version >= 300000) 92MOD_MISC(ipfrule); 93# else 94MOD_DECL(ipfrule); 95 96 97static struct lkm_misc _module = { 98 LM_MISC, 99 LKM_VERSION, 100 "IP Filter rules", 101 0, 102}; 103# endif 104 105 106int ipfrule __P((struct lkm_table *, int, int)); 107 108 109int ipfrule(lkmtp, cmd, ver) 110 struct lkm_table *lkmtp; 111 int cmd, ver; 112{ 113# if (__FreeBSD_version >= 300000) 114 MOD_DISPATCH(ipfrule, lkmtp, cmd, ver, ipfrule_ioctl, ipfrule_ioctl, 115 ipfrule_ioctl); 116# else 117 DISPATCH(lkmtp, cmd, ver, ipfrule_ioctl, ipfrule_ioctl, ipfrule_ioctl); 118# endif 119} 120# endif /* IPFILTER_LKM */ 121 122 123int ipfrule_load(lkmtp, cmd) 124 struct lkm_table *lkmtp; 125 int cmd; 126{ 127 return ipfrule_add(); 128} 129 130 131int ipfrule_unload(lkmtp, cmd) 132 struct lkm_table *lkmtp; 133 int cmd; 134{ 135 return ipfrule_remove(); 136} 137 138 139static int ipfrule_ioctl(lkmtp, cmd) 140 struct lkm_table *lkmtp; 141 int 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 ipf_refcnt++; 154 break; 155 case LKM_E_UNLOAD : 156 err = ipfrule_unload(lkmtp, cmd); 157 if (!err) 158 ipf_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