| /* |
| * Copyright (C) 2012 by Darren Reed. |
| * |
| * See the IPFILTER.LICENCE file for details on licencing. |
| */ |
| /* |
| * 29/12/94 Added code from Marc Huber <huber@fzi.de> to allow it to allocate |
| * its own major char number! Way cool patch! |
| */ |
| |
| |
| #include <sys/param.h> |
| |
| #if defined(__FreeBSD__) && (__FreeBSD__ > 1) |
| # ifdef IPFILTER_LKM |
| # include <osreldate.h> |
| # define ACTUALLY_LKM_NOT_KERNEL |
| # else |
| # include <sys/osreldate.h> |
| # endif |
| #endif |
| #include <sys/systm.h> |
| #if defined(__FreeBSD_version) && (__FreeBSD_version >= 220000) |
| # include <sys/conf.h> |
| # include <sys/kernel.h> |
| # ifdef DEVFS |
| # include <sys/devfsext.h> |
| # endif /*DEVFS*/ |
| #endif |
| #include <sys/conf.h> |
| #include <sys/file.h> |
| #if defined(__FreeBSD_version) && (__FreeBSD_version >= 300000) |
| # include <sys/lock.h> |
| #endif |
| #include <sys/stat.h> |
| #include <sys/proc.h> |
| #include <sys/kernel.h> |
| #include <sys/vnode.h> |
| #include <sys/namei.h> |
| #include <sys/malloc.h> |
| #include <sys/mount.h> |
| #include <sys/exec.h> |
| #include <sys/mbuf.h> |
| #if BSD >= 199506 |
| # include <sys/sysctl.h> |
| #endif |
| #if (__FreeBSD_version >= 300000) |
| # include <sys/socket.h> |
| #endif |
| #if (__FreeBSD_version >= 199511) |
| #include <net/if.h> |
| #include <netinet/in_systm.h> |
| #include <netinet/in.h> |
| #include <netinet/ip.h> |
| #include <net/route.h> |
| #include <netinet/ip_var.h> |
| #include <netinet/tcp.h> |
| #include <netinet/tcpip.h> |
| #endif |
| #if (__FreeBSD__ > 1) |
| # include <sys/sysent.h> |
| #endif |
| #include <sys/lkm.h> |
| #include "netinet/ip_compat.h" |
| #include "netinet/ip_fil.h" |
| #include "netinet/ip_rules.h" |
| |
| |
| int xxxinit __P((struct lkm_table *, int, int)); |
| |
| #if !defined(__FreeBSD_version) || (__FreeBSD_version < 220000) |
| MOD_DEV(IPL_VERSION, LM_DT_CHAR, -1, &ipldevsw); |
| #endif |
| |
| static int ipfrule_ioctl __P((struct lkm_table *, int)); |
| |
| #if defined(__FreeBSD_version) && (__FreeBSD_version < 220000) |
| |
| int xxxinit(lkmtp, cmd, ver) |
| struct lkm_table *lkmtp; |
| int cmd, ver; |
| { |
| DISPATCH(lkmtp, cmd, ver, ipfrule_ioctl, ipfrule_ioctl, ipfrule_ioctl); |
| } |
| #else /* __FREEBSD_version >= 220000 */ |
| # ifdef IPFILTER_LKM |
| # include <sys/exec.h> |
| |
| # if (__FreeBSD_version >= 300000) |
| MOD_MISC(ipfrule); |
| # else |
| MOD_DECL(ipfrule); |
| |
| |
| static struct lkm_misc _module = { |
| LM_MISC, |
| LKM_VERSION, |
| "IP Filter rules", |
| 0, |
| }; |
| # endif |
| |
| |
| int ipfrule __P((struct lkm_table *, int, int)); |
| |
| |
| int ipfrule(lkmtp, cmd, ver) |
| struct lkm_table *lkmtp; |
| int cmd, ver; |
| { |
| # if (__FreeBSD_version >= 300000) |
| MOD_DISPATCH(ipfrule, lkmtp, cmd, ver, ipfrule_ioctl, ipfrule_ioctl, |
| ipfrule_ioctl); |
| # else |
| DISPATCH(lkmtp, cmd, ver, ipfrule_ioctl, ipfrule_ioctl, ipfrule_ioctl); |
| # endif |
| } |
| # endif /* IPFILTER_LKM */ |
| |
| |
| int ipfrule_load(lkmtp, cmd) |
| struct lkm_table *lkmtp; |
| int cmd; |
| { |
| return ipfrule_add(); |
| } |
| |
| |
| int ipfrule_unload(lkmtp, cmd) |
| struct lkm_table *lkmtp; |
| int cmd; |
| { |
| return ipfrule_remove(); |
| } |
| |
| |
| static int ipfrule_ioctl(lkmtp, cmd) |
| struct lkm_table *lkmtp; |
| int cmd; |
| { |
| int err = 0; |
| |
| switch (cmd) |
| { |
| case LKM_E_LOAD : |
| if (lkmexists(lkmtp)) |
| return EEXIST; |
| |
| err = ipfrule_load(lkmtp, cmd); |
| if (!err) |
| ipf_refcnt++; |
| break; |
| case LKM_E_UNLOAD : |
| err = ipfrule_unload(lkmtp, cmd); |
| if (!err) |
| ipf_refcnt--; |
| break; |
| case LKM_E_STAT : |
| break; |
| default: |
| err = EIO; |
| break; |
| } |
| return err; |
| } |
| #endif /* _FreeBSD_version */ |