1/* $NetBSD: mlf_rule.c,v 1.3 2012/02/15 17:55:04 riz Exp $ */ 2 3/* 4 * Copyright (C) 1993-2001 by Darren Reed. 5 * 6 * See the IPFILTER.LICENCE file for details on licencing. 7 */ 8/* 9 * 29/12/94 Added code from Marc Huber <huber@fzi.de> to allow it to allocate 10 * its own major char number! Way cool patch! 11 */ 12 13 14#include <sys/param.h> 15 16#if defined(__FreeBSD__) && (__FreeBSD__ > 1) 17# ifdef IPFILTER_LKM 18# include <osreldate.h> 19# define ACTUALLY_LKM_NOT_KERNEL 20# else 21# include <sys/osreldate.h> 22# endif 23#endif 24#include <sys/systm.h> 25#if defined(__FreeBSD_version) && (__FreeBSD_version >= 220000) 26# include <sys/conf.h> 27# include <sys/kernel.h> 28# ifdef DEVFS 29# include <sys/devfsext.h> 30# endif /*DEVFS*/ 31#endif 32#include <sys/conf.h> 33#include <sys/file.h> 34#if defined(__FreeBSD_version) && (__FreeBSD_version >= 300000) 35# include <sys/lock.h> 36#endif 37#include <sys/stat.h> 38#include <sys/proc.h> 39#include <sys/kernel.h> 40#include <sys/vnode.h> 41#include <sys/namei.h> 42#include <sys/malloc.h> 43#include <sys/mount.h> 44#include <sys/exec.h> 45#include <sys/mbuf.h> 46#if BSD >= 199506 47# include <sys/sysctl.h> 48#endif 49#if (__FreeBSD_version >= 300000) 50# include <sys/socket.h> 51#endif 52#if (__FreeBSD_version >= 199511) 53#include <net/if.h> 54#include <netinet/in_systm.h> 55#include <netinet/in.h> 56#include <netinet/ip.h> 57#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(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(struct lkm_table *, int); 78 79#if defined(__FreeBSD_version) && (__FreeBSD_version < 220000) 80 81int 82xxxinit(struct lkm_table *lkmtp, int cmd, int ver) 83{ 84 DISPATCH(lkmtp, cmd, ver, ipfrule_ioctl, ipfrule_ioctl, ipfrule_ioctl); 85} 86#else /* __FREEBSD_version >= 220000 */ 87# ifdef IPFILTER_LKM 88# include <sys/exec.h> 89 90# if (__FreeBSD_version >= 300000) 91MOD_MISC(ipfrule); 92# else 93MOD_DECL(ipfrule); 94 95 96static struct lkm_misc _module = { 97 LM_MISC, 98 LKM_VERSION, 99 "IP Filter rules", 100 0, 101}; 102# endif 103 104 105int ipfrule(struct lkm_table *, int, int); 106 107 108int 109ipfrule(struct lkm_table *lkmtp, int cmd, int ver) 110{ 111# if (__FreeBSD_version >= 300000) 112 MOD_DISPATCH(ipfrule, lkmtp, cmd, ver, ipfrule_ioctl, ipfrule_ioctl, 113 ipfrule_ioctl); 114# else 115 DISPATCH(lkmtp, cmd, ver, ipfrule_ioctl, ipfrule_ioctl, ipfrule_ioctl); 116# endif 117} 118# endif /* IPFILTER_LKM */ 119 120 121int 122ipfrule_load(struct lkm_table *lkmtp, int cmd) 123{ 124 return ipfrule_add(); 125} 126 127 128int 129ipfrule_unload(struct lkm_table *lkmtp, int cmd) 130{ 131 return ipfrule_remove(); 132} 133 134 135static int 136ipfrule_ioctl(struct lkm_table *lkmtp, int cmd) 137{ 138 int err = 0; 139 140 switch (cmd) 141 { 142 case LKM_E_LOAD : 143 if (lkmexists(lkmtp)) 144 return EEXIST; 145 146 err = ipfrule_load(lkmtp, cmd); 147 if (!err) 148 fr_refcnt++; 149 break; 150 case LKM_E_UNLOAD : 151 err = ipfrule_unload(lkmtp, cmd); 152 if (!err) 153 fr_refcnt--; 154 break; 155 case LKM_E_STAT : 156 break; 157 default: 158 err = EIO; 159 break; 160 } 161 return err; 162} 163#endif /* _FreeBSD_version */ 164