1*c9d5dc6cSdarrenr /* $NetBSD: mln_rule.c,v 1.1.1.2 2012/07/22 13:44:25 darrenr Exp $ */
2bc4097aaSchristos
3bc4097aaSchristos /*
4*c9d5dc6cSdarrenr * Copyright (C) 2012 by Darren Reed.
5bc4097aaSchristos *
6bc4097aaSchristos * See the IPFILTER.LICENCE file for details on licencing.
7bc4097aaSchristos *
8bc4097aaSchristos */
9bc4097aaSchristos
10bc4097aaSchristos #include <sys/param.h>
11bc4097aaSchristos #include <sys/systm.h>
12bc4097aaSchristos #include <sys/conf.h>
13bc4097aaSchristos #include <sys/proc.h>
14bc4097aaSchristos #include <sys/ioctl.h>
15bc4097aaSchristos #include <sys/kernel.h>
16bc4097aaSchristos #include <sys/mbuf.h>
17bc4097aaSchristos #include <sys/exec.h>
18bc4097aaSchristos #include <sys/socket.h>
19bc4097aaSchristos #include <net/if.h>
20bc4097aaSchristos #include <netinet/in_systm.h>
21bc4097aaSchristos #include <netinet/in.h>
22bc4097aaSchristos #include <netinet/ip.h>
23bc4097aaSchristos #include <net/route.h>
24bc4097aaSchristos #include <netinet/ip_var.h>
25bc4097aaSchristos #include <netinet/tcp.h>
26bc4097aaSchristos #include <netinet/tcpip.h>
27bc4097aaSchristos #include <sys/lkm.h>
28bc4097aaSchristos #include "ip_compat.h"
29bc4097aaSchristos #include "ip_fil.h"
30bc4097aaSchristos #include "ip_rules.h"
31bc4097aaSchristos
32bc4097aaSchristos
33bc4097aaSchristos static int ipfruleaction __P((struct lkm_table *, int));
34bc4097aaSchristos
35bc4097aaSchristos #ifdef IPFILTER_LKM
36bc4097aaSchristos # if NetBSD >= 199706
37bc4097aaSchristos int ipfrule_lkmentry __P((struct lkm_table *, int, int));
38bc4097aaSchristos # else
39bc4097aaSchristos int xxxinit __P((struct lkm_table *, int, int));
40bc4097aaSchristos # endif
41bc4097aaSchristos
42bc4097aaSchristos
43bc4097aaSchristos MOD_MISC("IPFilter Rules");
44bc4097aaSchristos
45bc4097aaSchristos # if NetBSD >= 199706
ipfrule_lkmentry(lkmtp,cmd,ver)46bc4097aaSchristos int ipfrule_lkmentry(lkmtp, cmd, ver)
47bc4097aaSchristos # else
48bc4097aaSchristos int xxxinit(lkmtp, cmd, ver)
49bc4097aaSchristos # endif
50bc4097aaSchristos struct lkm_table *lkmtp;
51bc4097aaSchristos int cmd, ver;
52bc4097aaSchristos {
53bc4097aaSchristos DISPATCH(lkmtp, cmd, ver, ipfruleaction, ipfruleaction, ipfruleaction);
54bc4097aaSchristos }
55bc4097aaSchristos
ipfruleaction(lkmtp,cmd)56bc4097aaSchristos static int ipfruleaction(lkmtp, cmd)
57bc4097aaSchristos struct lkm_table *lkmtp;
58bc4097aaSchristos int cmd;
59bc4097aaSchristos {
60bc4097aaSchristos int err = 0;
61bc4097aaSchristos
62bc4097aaSchristos switch (cmd)
63bc4097aaSchristos {
64bc4097aaSchristos case LKM_E_LOAD :
65bc4097aaSchristos if (lkmexists(lkmtp))
66bc4097aaSchristos return EEXIST;
67bc4097aaSchristos
68bc4097aaSchristos err = ipfrule_add();
69bc4097aaSchristos if (!err)
70bc4097aaSchristos ipf_refcnt++;
71bc4097aaSchristos break;
72bc4097aaSchristos case LKM_E_UNLOAD :
73bc4097aaSchristos err = ipfrule_remove();
74bc4097aaSchristos if (!err)
75bc4097aaSchristos ipf_refcnt--;
76bc4097aaSchristos break;
77bc4097aaSchristos case LKM_E_STAT :
78bc4097aaSchristos break;
79bc4097aaSchristos default:
80bc4097aaSchristos err = EIO;
81bc4097aaSchristos break;
82bc4097aaSchristos }
83bc4097aaSchristos return err;
84bc4097aaSchristos }
85bc4097aaSchristos #endif /* IPFILTER_LKM */
86