1255332Scy/* $FreeBSD$ */
2255332Scy
3254219Scy/*
4254219Scy * Copyright (C) 2012 by Darren Reed.
5254219Scy *
6254219Scy * See the IPFILTER.LICENCE file for details on licencing.
7254219Scy */
8254219Scy#pragma ident "@(#)$Id$"
9254219Scy
10254219Scy#include <sys/systm.h>
11254219Scy#include <sys/types.h>
12254219Scy#include <sys/param.h>
13254219Scy#include <sys/errno.h>
14254219Scy#include <sys/uio.h>
15254219Scy#include <sys/buf.h>
16254219Scy#include <sys/modctl.h>
17254219Scy#include <sys/open.h>
18254219Scy#include <sys/kmem.h>
19254219Scy#include <sys/conf.h>
20254219Scy#include <sys/cmn_err.h>
21254219Scy#include <sys/stat.h>
22254219Scy#include <sys/cred.h>
23254219Scy#include <sys/dditypes.h>
24254219Scy#include <sys/stream.h>
25254219Scy#include <sys/poll.h>
26254219Scy#include <sys/autoconf.h>
27254219Scy#include <sys/byteorder.h>
28254219Scy#include <sys/socket.h>
29254219Scy#include <sys/dlpi.h>
30254219Scy#include <sys/stropts.h>
31254219Scy#include <sys/sockio.h>
32254219Scy#include <net/if.h>
33254219Scy#if SOLARIS2 >= 6
34254219Scy# include <net/if_types.h>
35254219Scy#endif
36254219Scy#include <net/af.h>
37254219Scy#include <net/route.h>
38254219Scy#include <netinet/in.h>
39254219Scy#include <netinet/in_systm.h>
40254219Scy#include <netinet/if_ether.h>
41254219Scy#include <netinet/ip.h>
42254219Scy#include <netinet/ip_var.h>
43254219Scy#include <netinet/tcp.h>
44254219Scy#include <netinet/udp.h>
45254219Scy#include <netinet/tcpip.h>
46254219Scy#include <netinet/ip_icmp.h>
47254219Scy#include <sys/ddi.h>
48254219Scy#include <sys/sunddi.h>
49254219Scy#include "ip_compat.h"
50254219Scy#include "ip_fil.h"
51254219Scy#include "ip_rules.h"
52254219Scy
53254219Scychar	_depends_on[] = "drv/ipf";
54254219Scy
55254219Scy
56254219Scyextern	ipf_main_softc_t	ipfmain;
57254219Scyextern	struct mod_ops		mod_miscops;
58254219Scystatic	struct modlmisc		ipfrulemod = {
59254219Scy		&mod_miscops,
60254219Scy		"IP Filter rules"
61254219Scy};
62254219Scy
63254219Scystatic	struct modlinkage	modlink1 = {
64254219Scy		MODREV_1,
65254219Scy		&ipfrulemod,
66254219Scy		NULL
67254219Scy};
68254219Scy
69254219Scy
70254219Scyint _init()
71254219Scy{
72254219Scy	int ipfruleinst;
73254219Scy
74254219Scy	ipfruleinst = mod_install(&modlink1);
75254219Scy#ifdef	IPFRULEDEBUG
76254219Scy	cmn_err(CE_NOTE, "IP Filter Rules: _init() = %d", ipfruleinst);
77254219Scy#endif
78254219Scy
79254219Scy	if (ipfruleinst == 0) {
80254219Scy		if (ipfmain.ipf_running >= 0) {
81254219Scy			ipfruleinst = ipfrule_add();
82254219Scy			if (!ipfruleinst)
83254219Scy				ipfmain.ipf_refcnt++;
84254219Scy			else {
85254219Scy				cmn_err(CE_NOTE,
86254219Scy					"IP Filter Rules: ipfrule_add failed");
87254219Scy				ipfruleinst = -1;
88254219Scy			}
89254219Scy		} else
90254219Scy			ipfruleinst = -1;
91254219Scy	}
92254219Scy	if (ipfruleinst == 0)
93254219Scy		cmn_err(CE_CONT, "IP Filter Rules: loaded\n");
94254219Scy	return ipfruleinst;
95254219Scy}
96254219Scy
97254219Scy
98254219Scyint _fini(void)
99254219Scy{
100254219Scy	int ipfruleinst;
101254219Scy
102254219Scy	ipfruleinst = mod_remove(&modlink1);
103254219Scy#ifdef	IPFRULEDEBUG
104254219Scy	cmn_err(CE_NOTE, "IP Filter Rules: _fini() = %d", ipfruleinst);
105254219Scy#endif
106254219Scy	if (ipfruleinst == 0) {
107254219Scy		ipfruleinst = ipfrule_remove();
108254219Scy		if (!ipfruleinst)
109254219Scy			ipfmain.ipf_refcnt--;
110254219Scy		else
111254219Scy			ipfruleinst = -1;
112254219Scy	}
113254219Scy	if (ipfruleinst == 0)
114254219Scy		cmn_err(CE_CONT, "IP Filter Rules: unloaded\n");
115254219Scy	return ipfruleinst;
116254219Scy}
117254219Scy
118254219Scy
119254219Scyint _info(modinfop)
120254219Scy	struct modinfo *modinfop;
121254219Scy{
122254219Scy	int ipfruleinst;
123254219Scy
124254219Scy	ipfruleinst = mod_info(&modlink1, modinfop);
125254219Scy#ifdef	IPFRULEDEBUG
126254219Scy	cmn_err(CE_NOTE, "IP Filter Rules: _info(%x) = %x",
127254219Scy		modinfop, ipfruleinst);
128254219Scy#endif
129254219Scy	return ipfruleinst;
130254219Scy}
131