mlf_rule.c revision 145519
1117632Sharti/* $FreeBSD: head/contrib/ipfilter/mlf_rule.c 145519 2005-04-25 18:20:15Z darrenr $ */ 2117632Sharti 3117632Sharti/* 4117632Sharti * Copyright (C) 1993-2001 by Darren Reed. 5117632Sharti * 6117632Sharti * See the IPFILTER.LICENCE file for details on licencing. 7117632Sharti */ 8117632Sharti/* 9117632Sharti * 29/12/94 Added code from Marc Huber <huber@fzi.de> to allow it to allocate 10117632Sharti * its own major char number! Way cool patch! 11117632Sharti */ 12117632Sharti 13117632Sharti 14117632Sharti#include <sys/param.h> 15117632Sharti 16117632Sharti#if defined(__FreeBSD__) && (__FreeBSD__ > 1) 17117632Sharti# ifdef IPFILTER_LKM 18117632Sharti# include <osreldate.h> 19117632Sharti# define ACTUALLY_LKM_NOT_KERNEL 20117632Sharti# else 21117632Sharti# include <sys/osreldate.h> 22117632Sharti# endif 23117632Sharti#endif 24117632Sharti#include <sys/systm.h> 25117632Sharti#if defined(__FreeBSD_version) && (__FreeBSD_version >= 220000) 26117632Sharti# include <sys/conf.h> 27117632Sharti# include <sys/kernel.h> 28117632Sharti# ifdef DEVFS 29117632Sharti# include <sys/devfsext.h> 30117632Sharti# endif /*DEVFS*/ 31117632Sharti#endif 32117632Sharti#include <sys/conf.h> 33117632Sharti#include <sys/file.h> 34117632Sharti#if defined(__FreeBSD_version) && (__FreeBSD_version >= 300000) 35117632Sharti# include <sys/lock.h> 36117632Sharti#endif 37117632Sharti#include <sys/stat.h> 38117632Sharti#include <sys/proc.h> 39117632Sharti#include <sys/kernel.h> 40117632Sharti#include <sys/vnode.h> 41117632Sharti#include <sys/namei.h> 42117632Sharti#include <sys/malloc.h> 43117632Sharti#include <sys/mount.h> 44117632Sharti#include <sys/exec.h> 45117632Sharti#include <sys/mbuf.h> 46117632Sharti#if BSD >= 199506 47117632Sharti# include <sys/sysctl.h> 48117632Sharti#endif 49117632Sharti#if (__FreeBSD_version >= 300000) 50117632Sharti# include <sys/socket.h> 51117632Sharti#endif 52117632Sharti#if (__FreeBSD_version >= 199511) 53117632Sharti#include <net/if.h> 54117632Sharti#include <netinet/in_systm.h> 55117632Sharti#include <netinet/in.h> 56117632Sharti#include <netinet/ip.h> 57117632Sharti#include <net/route.h> 58117632Sharti#include <netinet/ip_var.h> 59117632Sharti#include <netinet/tcp.h> 60117632Sharti#include <netinet/tcpip.h> 61117632Sharti#endif 62117632Sharti#if (__FreeBSD__ > 1) 63117632Sharti# include <sys/sysent.h> 64117632Sharti#endif 65117632Sharti#include <sys/lkm.h> 66117632Sharti#include "netinet/ip_compat.h" 67117632Sharti#include "netinet/ip_fil.h" 68117632Sharti#include "netinet/ip_rules.h" 69117632Sharti 70117632Sharti 71117632Shartiint xxxinit __P((struct lkm_table *, int, int)); 72117632Sharti 73117632Sharti#if !defined(__FreeBSD_version) || (__FreeBSD_version < 220000) 74117632ShartiMOD_DEV(IPL_VERSION, LM_DT_CHAR, -1, &ipldevsw); 75117632Sharti#endif 76117632Sharti 77117632Shartistatic int ipfrule_ioctl __P((struct lkm_table *, int)); 78117632Sharti 79117632Sharti#if defined(__FreeBSD_version) && (__FreeBSD_version < 220000) 80117632Sharti 81117632Shartiint xxxinit(lkmtp, cmd, ver) 82117632Shartistruct lkm_table *lkmtp; 83117632Shartiint cmd, ver; 84117632Sharti{ 85117632Sharti DISPATCH(lkmtp, cmd, ver, ipfrule_ioctl, ipfrule_ioctl, ipfrule_ioctl); 86117632Sharti} 87117632Sharti#else /* __FREEBSD_version >= 220000 */ 88117632Sharti# ifdef IPFILTER_LKM 89117632Sharti# include <sys/exec.h> 90117632Sharti 91117632Sharti# if (__FreeBSD_version >= 300000) 92117632ShartiMOD_MISC(ipfrule); 93117632Sharti# else 94117632ShartiMOD_DECL(ipfrule); 95117632Sharti 96117632Sharti 97117632Shartistatic struct lkm_misc _module = { 98117632Sharti LM_MISC, 99117632Sharti LKM_VERSION, 100117632Sharti "IP Filter rules", 101117632Sharti 0, 102117632Sharti}; 103117632Sharti# endif 104117632Sharti 105117632Sharti 106117632Shartiint ipfrule __P((struct lkm_table *, int, int)); 107117632Sharti 108117632Sharti 109117632Shartiint ipfrule(lkmtp, cmd, ver) 110117632Shartistruct lkm_table *lkmtp; 111117632Shartiint cmd, ver; 112117632Sharti{ 113117632Sharti# if (__FreeBSD_version >= 300000) 114117632Sharti MOD_DISPATCH(ipfrule, lkmtp, cmd, ver, ipfrule_ioctl, ipfrule_ioctl, 115117632Sharti ipfrule_ioctl); 116117632Sharti# else 117117632Sharti DISPATCH(lkmtp, cmd, ver, ipfrule_ioctl, ipfrule_ioctl, ipfrule_ioctl); 118117632Sharti# endif 119117632Sharti} 120117632Sharti# endif /* IPFILTER_LKM */ 121117632Sharti 122117632Sharti 123117632Shartiint ipfrule_load(lkmtp, cmd) 124117632Shartistruct lkm_table *lkmtp; 125117632Shartiint cmd; 126117632Sharti{ 127117632Sharti return ipfrule_add(); 128117632Sharti} 129117632Sharti 130117632Sharti 131117632Shartiint ipfrule_unload(lkmtp, cmd) 132117632Shartistruct lkm_table *lkmtp; 133117632Shartiint cmd; 134117632Sharti{ 135117632Sharti return ipfrule_remove(); 136117632Sharti} 137117632Sharti 138117632Sharti 139117632Shartistatic int ipfrule_ioctl(lkmtp, cmd) 140117632Shartistruct lkm_table *lkmtp; 141117632Shartiint cmd; 142117632Sharti{ 143117632Sharti int err = 0; 144117632Sharti 145117632Sharti switch (cmd) 146117632Sharti { 147117632Sharti case LKM_E_LOAD : 148117632Sharti if (lkmexists(lkmtp)) 149117632Sharti return EEXIST; 150117632Sharti 151117632Sharti err = ipfrule_load(lkmtp, cmd); 152117632Sharti if (!err) 153117632Sharti fr_refcnt++; 154117632Sharti break; 155117632Sharti case LKM_E_UNLOAD : 156117632Sharti err = ipfrule_unload(lkmtp, cmd); 157117632Sharti if (!err) 158117632Sharti fr_refcnt--; 159117632Sharti break; 160117632Sharti case LKM_E_STAT : 161117632Sharti break; 162117632Sharti default: 163117632Sharti err = EIO; 164117632Sharti break; 165117632Sharti } 166117632Sharti return err; 167117632Sharti} 168117632Sharti#endif /* _FreeBSD_version */ 169117632Sharti