1145519Sdarrenr/* $FreeBSD$ */ 2145510Sdarrenr 3145510Sdarrenr/* 4255332Scy * Copyright (C) 2012 by Darren Reed. 5145510Sdarrenr * 6145510Sdarrenr * See the IPFILTER.LICENCE file for details on licencing. 7145510Sdarrenr */ 8145510Sdarrenr/* 9145510Sdarrenr * 29/12/94 Added code from Marc Huber <huber@fzi.de> to allow it to allocate 10145510Sdarrenr * its own major char number! Way cool patch! 11145510Sdarrenr */ 12145510Sdarrenr 13145510Sdarrenr 14145510Sdarrenr#include <sys/param.h> 15145510Sdarrenr 16145510Sdarrenr#if defined(__FreeBSD__) && (__FreeBSD__ > 1) 17145510Sdarrenr# ifdef IPFILTER_LKM 18145510Sdarrenr# include <osreldate.h> 19145510Sdarrenr# define ACTUALLY_LKM_NOT_KERNEL 20145510Sdarrenr# else 21145510Sdarrenr# include <sys/osreldate.h> 22145510Sdarrenr# endif 23145510Sdarrenr#endif 24145510Sdarrenr#include <sys/systm.h> 25145510Sdarrenr#if defined(__FreeBSD_version) && (__FreeBSD_version >= 220000) 26145510Sdarrenr# include <sys/conf.h> 27145510Sdarrenr# include <sys/kernel.h> 28145510Sdarrenr# ifdef DEVFS 29145510Sdarrenr# include <sys/devfsext.h> 30145510Sdarrenr# endif /*DEVFS*/ 31145510Sdarrenr#endif 32145510Sdarrenr#include <sys/conf.h> 33145510Sdarrenr#include <sys/file.h> 34145510Sdarrenr#if defined(__FreeBSD_version) && (__FreeBSD_version >= 300000) 35145510Sdarrenr# include <sys/lock.h> 36145510Sdarrenr#endif 37145510Sdarrenr#include <sys/stat.h> 38145510Sdarrenr#include <sys/proc.h> 39145510Sdarrenr#include <sys/kernel.h> 40145510Sdarrenr#include <sys/vnode.h> 41145510Sdarrenr#include <sys/namei.h> 42145510Sdarrenr#include <sys/malloc.h> 43145510Sdarrenr#include <sys/mount.h> 44145510Sdarrenr#include <sys/exec.h> 45145510Sdarrenr#include <sys/mbuf.h> 46145510Sdarrenr#if BSD >= 199506 47145510Sdarrenr# include <sys/sysctl.h> 48145510Sdarrenr#endif 49145510Sdarrenr#if (__FreeBSD_version >= 300000) 50145510Sdarrenr# include <sys/socket.h> 51145510Sdarrenr#endif 52145510Sdarrenr#if (__FreeBSD_version >= 199511) 53145510Sdarrenr#include <net/if.h> 54145510Sdarrenr#include <netinet/in_systm.h> 55145510Sdarrenr#include <netinet/in.h> 56145510Sdarrenr#include <netinet/ip.h> 57145510Sdarrenr#include <net/route.h> 58145510Sdarrenr#include <netinet/ip_var.h> 59145510Sdarrenr#include <netinet/tcp.h> 60145510Sdarrenr#include <netinet/tcpip.h> 61145510Sdarrenr#endif 62145510Sdarrenr#if (__FreeBSD__ > 1) 63145510Sdarrenr# include <sys/sysent.h> 64145510Sdarrenr#endif 65145510Sdarrenr#include <sys/lkm.h> 66145510Sdarrenr#include "netinet/ip_compat.h" 67145510Sdarrenr#include "netinet/ip_fil.h" 68145510Sdarrenr#include "netinet/ip_rules.h" 69145510Sdarrenr 70145510Sdarrenr 71145510Sdarrenrint xxxinit __P((struct lkm_table *, int, int)); 72145510Sdarrenr 73145510Sdarrenr#if !defined(__FreeBSD_version) || (__FreeBSD_version < 220000) 74145510SdarrenrMOD_DEV(IPL_VERSION, LM_DT_CHAR, -1, &ipldevsw); 75145510Sdarrenr#endif 76145510Sdarrenr 77145510Sdarrenrstatic int ipfrule_ioctl __P((struct lkm_table *, int)); 78145510Sdarrenr 79145510Sdarrenr#if defined(__FreeBSD_version) && (__FreeBSD_version < 220000) 80145510Sdarrenr 81145510Sdarrenrint xxxinit(lkmtp, cmd, ver) 82255332Scy struct lkm_table *lkmtp; 83255332Scy int cmd, ver; 84145510Sdarrenr{ 85145510Sdarrenr DISPATCH(lkmtp, cmd, ver, ipfrule_ioctl, ipfrule_ioctl, ipfrule_ioctl); 86145510Sdarrenr} 87145510Sdarrenr#else /* __FREEBSD_version >= 220000 */ 88145510Sdarrenr# ifdef IPFILTER_LKM 89145510Sdarrenr# include <sys/exec.h> 90145510Sdarrenr 91145510Sdarrenr# if (__FreeBSD_version >= 300000) 92145510SdarrenrMOD_MISC(ipfrule); 93145510Sdarrenr# else 94145510SdarrenrMOD_DECL(ipfrule); 95145510Sdarrenr 96145510Sdarrenr 97145510Sdarrenrstatic struct lkm_misc _module = { 98145510Sdarrenr LM_MISC, 99145510Sdarrenr LKM_VERSION, 100145510Sdarrenr "IP Filter rules", 101145510Sdarrenr 0, 102145510Sdarrenr}; 103145510Sdarrenr# endif 104145510Sdarrenr 105145510Sdarrenr 106145510Sdarrenrint ipfrule __P((struct lkm_table *, int, int)); 107145510Sdarrenr 108145510Sdarrenr 109145510Sdarrenrint ipfrule(lkmtp, cmd, ver) 110255332Scy struct lkm_table *lkmtp; 111255332Scy int cmd, ver; 112145510Sdarrenr{ 113145510Sdarrenr# if (__FreeBSD_version >= 300000) 114145510Sdarrenr MOD_DISPATCH(ipfrule, lkmtp, cmd, ver, ipfrule_ioctl, ipfrule_ioctl, 115145510Sdarrenr ipfrule_ioctl); 116145510Sdarrenr# else 117145510Sdarrenr DISPATCH(lkmtp, cmd, ver, ipfrule_ioctl, ipfrule_ioctl, ipfrule_ioctl); 118145510Sdarrenr# endif 119145510Sdarrenr} 120145510Sdarrenr# endif /* IPFILTER_LKM */ 121145510Sdarrenr 122145510Sdarrenr 123145510Sdarrenrint ipfrule_load(lkmtp, cmd) 124255332Scy struct lkm_table *lkmtp; 125255332Scy int cmd; 126145510Sdarrenr{ 127145510Sdarrenr return ipfrule_add(); 128145510Sdarrenr} 129145510Sdarrenr 130145510Sdarrenr 131145510Sdarrenrint ipfrule_unload(lkmtp, cmd) 132255332Scy struct lkm_table *lkmtp; 133255332Scy int cmd; 134145510Sdarrenr{ 135145510Sdarrenr return ipfrule_remove(); 136145510Sdarrenr} 137145510Sdarrenr 138145510Sdarrenr 139145510Sdarrenrstatic int ipfrule_ioctl(lkmtp, cmd) 140255332Scy struct lkm_table *lkmtp; 141255332Scy int cmd; 142145510Sdarrenr{ 143145510Sdarrenr int err = 0; 144145510Sdarrenr 145145510Sdarrenr switch (cmd) 146145510Sdarrenr { 147145510Sdarrenr case LKM_E_LOAD : 148145510Sdarrenr if (lkmexists(lkmtp)) 149145510Sdarrenr return EEXIST; 150145510Sdarrenr 151145510Sdarrenr err = ipfrule_load(lkmtp, cmd); 152145510Sdarrenr if (!err) 153255332Scy ipf_refcnt++; 154145510Sdarrenr break; 155145510Sdarrenr case LKM_E_UNLOAD : 156145510Sdarrenr err = ipfrule_unload(lkmtp, cmd); 157145510Sdarrenr if (!err) 158255332Scy ipf_refcnt--; 159145510Sdarrenr break; 160145510Sdarrenr case LKM_E_STAT : 161145510Sdarrenr break; 162145510Sdarrenr default: 163145510Sdarrenr err = EIO; 164145510Sdarrenr break; 165145510Sdarrenr } 166145510Sdarrenr return err; 167145510Sdarrenr} 168145510Sdarrenr#endif /* _FreeBSD_version */ 169