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