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