mlf_rule.c revision 145511
1231921Smp/*	$NetBSD$	*/
2231921Smp
3231921Smp/*
4231921Smp * Copyright (C) 1993-2001 by Darren Reed.
5231921Smp *
6231921Smp * See the IPFILTER.LICENCE file for details on licencing.
7231921Smp */
8231921Smp/*
9231921Smp * 29/12/94 Added code from Marc Huber <huber@fzi.de> to allow it to allocate
10231921Smp * its own major char number! Way cool patch!
11231921Smp */
12231921Smp
13231921Smp
14231921Smp#include <sys/param.h>
15231921Smp
16231921Smp#if defined(__FreeBSD__) && (__FreeBSD__ > 1)
17231921Smp# ifdef	IPFILTER_LKM
18231921Smp#  include <osreldate.h>
19231921Smp#  define	ACTUALLY_LKM_NOT_KERNEL
20231921Smp# else
21231921Smp#  include <sys/osreldate.h>
22231921Smp# endif
23231921Smp#endif
24231921Smp#include <sys/systm.h>
25231921Smp#if defined(__FreeBSD_version) && (__FreeBSD_version >= 220000)
26231921Smp# include <sys/conf.h>
27231921Smp# include <sys/kernel.h>
28231921Smp# ifdef DEVFS
29231921Smp#  include <sys/devfsext.h>
30231921Smp# endif /*DEVFS*/
31231921Smp#endif
32231921Smp#include <sys/conf.h>
33231921Smp#include <sys/file.h>
34231921Smp#if defined(__FreeBSD_version) && (__FreeBSD_version >= 300000)
35231921Smp# include <sys/lock.h>
36231921Smp#endif
37231921Smp#include <sys/stat.h>
38231921Smp#include <sys/proc.h>
39231921Smp#include <sys/kernel.h>
40231921Smp#include <sys/vnode.h>
41231921Smp#include <sys/namei.h>
42231921Smp#include <sys/malloc.h>
43231921Smp#include <sys/mount.h>
44231921Smp#include <sys/exec.h>
45231921Smp#include <sys/mbuf.h>
46231921Smp#if	BSD >= 199506
47231921Smp# include <sys/sysctl.h>
48231921Smp#endif
49231921Smp#if (__FreeBSD_version >= 300000)
50231921Smp# include <sys/socket.h>
51231921Smp#endif
52231921Smp#if (__FreeBSD_version >= 199511)
53231921Smp#include <net/if.h>
54231921Smp#include <netinet/in_systm.h>
55231921Smp#include <netinet/in.h>
56231921Smp#include <netinet/ip.h>
57231921Smp#include <net/route.h>
58231921Smp#include <netinet/ip_var.h>
59231921Smp#include <netinet/tcp.h>
60231921Smp#include <netinet/tcpip.h>
61231921Smp#endif
62231921Smp#if (__FreeBSD__ > 1)
63231921Smp# include <sys/sysent.h>
64231921Smp#endif
65231921Smp#include <sys/lkm.h>
66231921Smp#include "netinet/ip_compat.h"
67231921Smp#include "netinet/ip_fil.h"
68231921Smp#include "netinet/ip_rules.h"
69231921Smp
70231921Smp
71231921Smpint	xxxinit __P((struct lkm_table *, int, int));
72231921Smp
73231921Smp#if !defined(__FreeBSD_version) || (__FreeBSD_version < 220000)
74231921SmpMOD_DEV(IPL_VERSION, LM_DT_CHAR, -1, &ipldevsw);
75231921Smp#endif
76231921Smp
77231921Smpstatic int ipfrule_ioctl __P((struct lkm_table *, int));
78231921Smp
79231921Smp#if defined(__FreeBSD_version) && (__FreeBSD_version < 220000)
80231921Smp
81231921Smpint xxxinit(lkmtp, cmd, ver)
82231921Smpstruct lkm_table *lkmtp;
83231921Smpint cmd, ver;
84231921Smp{
85231921Smp	DISPATCH(lkmtp, cmd, ver, ipfrule_ioctl, ipfrule_ioctl, ipfrule_ioctl);
86231921Smp}
87231921Smp#else	/* __FREEBSD_version >= 220000 */
88231921Smp# ifdef	IPFILTER_LKM
89231921Smp#  include <sys/exec.h>
90231921Smp
91231921Smp#  if (__FreeBSD_version >= 300000)
92231921SmpMOD_MISC(ipfrule);
93231921Smp#  else
94231921SmpMOD_DECL(ipfrule);
95231921Smp
96231921Smp
97231921Smpstatic struct lkm_misc _module = {
98231921Smp	LM_MISC,
99231921Smp	LKM_VERSION,
100231921Smp	"IP Filter rules",
101231921Smp	0,
102231921Smp};
103231921Smp#  endif
104231921Smp
105231921Smp
106231921Smpint ipfrule __P((struct lkm_table *, int, int));
107231921Smp
108231921Smp
109231921Smpint ipfrule(lkmtp, cmd, ver)
110231921Smpstruct lkm_table *lkmtp;
111231921Smpint cmd, ver;
112231921Smp{
113231921Smp#  if (__FreeBSD_version >= 300000)
114231921Smp	MOD_DISPATCH(ipfrule, lkmtp, cmd, ver, ipfrule_ioctl, ipfrule_ioctl,
115231921Smp		     ipfrule_ioctl);
116231921Smp#  else
117231921Smp	DISPATCH(lkmtp, cmd, ver, ipfrule_ioctl, ipfrule_ioctl, ipfrule_ioctl);
118231921Smp#  endif
119231921Smp}
120# endif /* IPFILTER_LKM */
121
122
123int ipfrule_load(lkmtp, cmd)
124struct lkm_table *lkmtp;
125int cmd;
126{
127	return ipfrule_add();
128}
129
130
131int ipfrule_unload(lkmtp, cmd)
132struct lkm_table *lkmtp;
133int cmd;
134{
135	return ipfrule_remove();
136}
137
138
139static int ipfrule_ioctl(lkmtp, cmd)
140struct lkm_table *lkmtp;
141int cmd;
142{
143	int err = 0;
144
145	switch (cmd)
146	{
147	case LKM_E_LOAD :
148		if (lkmexists(lkmtp))
149			return EEXIST;
150
151		err = ipfrule_load(lkmtp, cmd);
152		if (!err)
153			fr_refcnt++;
154		break;
155	case LKM_E_UNLOAD :
156		err = ipfrule_unload(lkmtp, cmd);
157		if (!err)
158			fr_refcnt--;
159		break;
160	case LKM_E_STAT :
161		break;
162	default:
163		err = EIO;
164		break;
165	}
166	return err;
167}
168#endif /* _FreeBSD_version */
169