1/* $FreeBSD$ */
2
3/*
4 * Copyright (C) 2012 by Darren Reed.
5 *
6 * See the IPFILTER.LICENCE file for details on licencing.
7 */
8#pragma ident "@(#)$Id$"
9
10#include <sys/systm.h>
11#include <sys/types.h>
12#include <sys/param.h>
13#include <sys/errno.h>
14#include <sys/uio.h>
15#include <sys/buf.h>
16#include <sys/modctl.h>
17#include <sys/open.h>
18#include <sys/kmem.h>
19#include <sys/conf.h>
20#include <sys/cmn_err.h>
21#include <sys/stat.h>
22#include <sys/cred.h>
23#include <sys/dditypes.h>
24#include <sys/stream.h>
25#include <sys/poll.h>
26#include <sys/autoconf.h>
27#include <sys/byteorder.h>
28#include <sys/socket.h>
29#include <sys/dlpi.h>
30#include <sys/stropts.h>
31#include <sys/sockio.h>
32#include <net/if.h>
33#if SOLARIS2 >= 6
34# include <net/if_types.h>
35#endif
36#include <net/af.h>
37#include <net/route.h>
38#include <netinet/in.h>
39#include <netinet/in_systm.h>
40#include <netinet/if_ether.h>
41#include <netinet/ip.h>
42#include <netinet/ip_var.h>
43#include <netinet/tcp.h>
44#include <netinet/udp.h>
45#include <netinet/tcpip.h>
46#include <netinet/ip_icmp.h>
47#include <sys/ddi.h>
48#include <sys/sunddi.h>
49#include "ip_compat.h"
50#include "ip_fil.h"
51#include "ip_rules.h"
52
53char	_depends_on[] = "drv/ipf";
54
55
56extern	ipf_main_softc_t	ipfmain;
57extern	struct mod_ops		mod_miscops;
58static	struct modlmisc		ipfrulemod = {
59		&mod_miscops,
60		"IP Filter rules"
61};
62
63static	struct modlinkage	modlink1 = {
64		MODREV_1,
65		&ipfrulemod,
66		NULL
67};
68
69
70int _init()
71{
72	int ipfruleinst;
73
74	ipfruleinst = mod_install(&modlink1);
75#ifdef	IPFRULEDEBUG
76	cmn_err(CE_NOTE, "IP Filter Rules: _init() = %d", ipfruleinst);
77#endif
78
79	if (ipfruleinst == 0) {
80		if (ipfmain.ipf_running >= 0) {
81			ipfruleinst = ipfrule_add();
82			if (!ipfruleinst)
83				ipfmain.ipf_refcnt++;
84			else {
85				cmn_err(CE_NOTE,
86					"IP Filter Rules: ipfrule_add failed");
87				ipfruleinst = -1;
88			}
89		} else
90			ipfruleinst = -1;
91	}
92	if (ipfruleinst == 0)
93		cmn_err(CE_CONT, "IP Filter Rules: loaded\n");
94	return ipfruleinst;
95}
96
97
98int _fini(void)
99{
100	int ipfruleinst;
101
102	ipfruleinst = mod_remove(&modlink1);
103#ifdef	IPFRULEDEBUG
104	cmn_err(CE_NOTE, "IP Filter Rules: _fini() = %d", ipfruleinst);
105#endif
106	if (ipfruleinst == 0) {
107		ipfruleinst = ipfrule_remove();
108		if (!ipfruleinst)
109			ipfmain.ipf_refcnt--;
110		else
111			ipfruleinst = -1;
112	}
113	if (ipfruleinst == 0)
114		cmn_err(CE_CONT, "IP Filter Rules: unloaded\n");
115	return ipfruleinst;
116}
117
118
119int _info(modinfop)
120	struct modinfo *modinfop;
121{
122	int ipfruleinst;
123
124	ipfruleinst = mod_info(&modlink1, modinfop);
125#ifdef	IPFRULEDEBUG
126	cmn_err(CE_NOTE, "IP Filter Rules: _info(%x) = %x",
127		modinfop, ipfruleinst);
128#endif
129	return ipfruleinst;
130}
131