mlf_rule.c revision 145510
167754Smsmith/*	$NetBSD$	*/
267754Smsmith
3193267Sjkim/*
467754Smsmith * Copyright (C) 1993-2001 by Darren Reed.
567754Smsmith *
667754Smsmith * See the IPFILTER.LICENCE file for details on licencing.
767754Smsmith */
8316303Sjkim/*
9316303Sjkim * 29/12/94 Added code from Marc Huber <huber@fzi.de> to allow it to allocate
10316303Sjkim * its own major char number! Way cool patch!
11316303Sjkim */
12316303Sjkim
1370243Smsmith
1467754Smsmith#include <sys/param.h>
15316303Sjkim
16316303Sjkim#if defined(__FreeBSD__) && (__FreeBSD__ > 1)
17316303Sjkim# ifdef	IPFILTER_LKM
18316303Sjkim#  include <osreldate.h>
19316303Sjkim#  define	ACTUALLY_LKM_NOT_KERNEL
20316303Sjkim# else
21316303Sjkim#  include <sys/osreldate.h>
22316303Sjkim# endif
23316303Sjkim#endif
24316303Sjkim#include <sys/systm.h>
25316303Sjkim#if defined(__FreeBSD_version) && (__FreeBSD_version >= 220000)
26316303Sjkim# include <sys/conf.h>
27316303Sjkim# include <sys/kernel.h>
28316303Sjkim# ifdef DEVFS
29316303Sjkim#  include <sys/devfsext.h>
30316303Sjkim# endif /*DEVFS*/
31316303Sjkim#endif
32316303Sjkim#include <sys/conf.h>
33316303Sjkim#include <sys/file.h>
34316303Sjkim#if defined(__FreeBSD_version) && (__FreeBSD_version >= 300000)
35316303Sjkim# include <sys/lock.h>
36316303Sjkim#endif
37316303Sjkim#include <sys/stat.h>
38316303Sjkim#include <sys/proc.h>
39316303Sjkim#include <sys/kernel.h>
40316303Sjkim#include <sys/vnode.h>
41316303Sjkim#include <sys/namei.h>
42316303Sjkim#include <sys/malloc.h>
43316303Sjkim#include <sys/mount.h>
44316303Sjkim#include <sys/exec.h>
45316303Sjkim#include <sys/mbuf.h>
46316303Sjkim#if	BSD >= 199506
47316303Sjkim# include <sys/sysctl.h>
48316303Sjkim#endif
49316303Sjkim#if (__FreeBSD_version >= 300000)
50316303Sjkim# include <sys/socket.h>
51316303Sjkim#endif
52316303Sjkim#if (__FreeBSD_version >= 199511)
53316303Sjkim#include <net/if.h>
54316303Sjkim#include <netinet/in_systm.h>
55316303Sjkim#include <netinet/in.h>
56316303Sjkim#include <netinet/ip.h>
57316303Sjkim#include <net/route.h>
58316303Sjkim#include <netinet/ip_var.h>
59316303Sjkim#include <netinet/tcp.h>
60316303Sjkim#include <netinet/tcpip.h>
61316303Sjkim#endif
62316303Sjkim#if (__FreeBSD__ > 1)
63316303Sjkim# include <sys/sysent.h>
64316303Sjkim#endif
65316303Sjkim#include <sys/lkm.h>
66316303Sjkim#include "netinet/ip_compat.h"
67316303Sjkim#include "netinet/ip_fil.h"
68316303Sjkim#include "netinet/ip_rules.h"
69316303Sjkim
70316303Sjkim
71316303Sjkimint	xxxinit __P((struct lkm_table *, int, int));
72316303Sjkim
73316303Sjkim#if !defined(__FreeBSD_version) || (__FreeBSD_version < 220000)
74316303SjkimMOD_DEV(IPL_VERSION, LM_DT_CHAR, -1, &ipldevsw);
75316303Sjkim#endif
76316303Sjkim
77316303Sjkimstatic int ipfrule_ioctl __P((struct lkm_table *, int));
78316303Sjkim
79316303Sjkim#if defined(__FreeBSD_version) && (__FreeBSD_version < 220000)
80316303Sjkim
81316303Sjkimint xxxinit(lkmtp, cmd, ver)
82316303Sjkimstruct lkm_table *lkmtp;
83316303Sjkimint cmd, ver;
84316303Sjkim{
85316303Sjkim	DISPATCH(lkmtp, cmd, ver, ipfrule_ioctl, ipfrule_ioctl, ipfrule_ioctl);
86316303Sjkim}
87316303Sjkim#else	/* __FREEBSD_version >= 220000 */
88316303Sjkim# ifdef	IPFILTER_LKM
89316303Sjkim#  include <sys/exec.h>
90316303Sjkim
91316303Sjkim#  if (__FreeBSD_version >= 300000)
92316303SjkimMOD_MISC(ipfrule);
93316303Sjkim#  else
94316303SjkimMOD_DECL(ipfrule);
95316303Sjkim
96316303Sjkim
97316303Sjkimstatic struct lkm_misc _module = {
98316303Sjkim	LM_MISC,
99316303Sjkim	LKM_VERSION,
100316303Sjkim	"IP Filter rules",
101316303Sjkim	0,
102316303Sjkim};
103316303Sjkim#  endif
104316303Sjkim
105316303Sjkim
106316303Sjkimint ipfrule __P((struct lkm_table *, int, int));
107316303Sjkim
108316303Sjkim
109316303Sjkimint ipfrule(lkmtp, cmd, ver)
110316303Sjkimstruct lkm_table *lkmtp;
111316303Sjkimint cmd, ver;
112316303Sjkim{
113316303Sjkim#  if (__FreeBSD_version >= 300000)
114316303Sjkim	MOD_DISPATCH(ipfrule, lkmtp, cmd, ver, ipfrule_ioctl, ipfrule_ioctl,
115316303Sjkim		     ipfrule_ioctl);
116316303Sjkim#  else
117316303Sjkim	DISPATCH(lkmtp, cmd, ver, ipfrule_ioctl, ipfrule_ioctl, ipfrule_ioctl);
118316303Sjkim#  endif
119316303Sjkim}
120217365Sjkim# endif /* IPFILTER_LKM */
121217365Sjkim
122217365Sjkim
123217365Sjkimint ipfrule_load(lkmtp, cmd)
124217365Sjkimstruct lkm_table *lkmtp;
125217365Sjkimint cmd;
126217365Sjkim{
127217365Sjkim	return ipfrule_add();
128217365Sjkim}
129217365Sjkim
130217365Sjkim
131217365Sjkimint ipfrule_unload(lkmtp, cmd)
132217365Sjkimstruct lkm_table *lkmtp;
133217365Sjkimint cmd;
13467754Smsmith{
135316303Sjkim	return ipfrule_remove();
136316303Sjkim}
137316303Sjkim
138316303Sjkim
139316303Sjkimstatic int ipfrule_ioctl(lkmtp, cmd)
140316303Sjkimstruct lkm_table *lkmtp;
141316303Sjkimint cmd;
142316303Sjkim{
143316303Sjkim	int err = 0;
144316303Sjkim
145316303Sjkim	switch (cmd)
146316303Sjkim	{
147316303Sjkim	case LKM_E_LOAD :
148217365Sjkim		if (lkmexists(lkmtp))
149217365Sjkim			return EEXIST;
15067754Smsmith
151316303Sjkim		err = ipfrule_load(lkmtp, cmd);
15267754Smsmith		if (!err)
153193341Sjkim			fr_refcnt++;
154193341Sjkim		break;
155193341Sjkim	case LKM_E_UNLOAD :
156193341Sjkim		err = ipfrule_unload(lkmtp, cmd);
15767754Smsmith		if (!err)
158102550Siwasaki			fr_refcnt--;
15991116Smsmith		break;
16067754Smsmith	case LKM_E_STAT :
161287168Sjkim		break;
162316303Sjkim	default:
163316303Sjkim		err = EIO;
164316303Sjkim		break;
165316303Sjkim	}
166102550Siwasaki	return err;
16767754Smsmith}
16867754Smsmith#endif /* _FreeBSD_version */
16967754Smsmith