Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F142702806
D7000.id.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
26 KB
Referenced Files
None
Subscribers
None
D7000.id.diff
View Options
Index: head/sys/contrib/ipfilter/netinet/ip_fil_freebsd.c
===================================================================
--- head/sys/contrib/ipfilter/netinet/ip_fil_freebsd.c
+++ head/sys/contrib/ipfilter/netinet/ip_fil_freebsd.c
@@ -62,6 +62,9 @@
#else
#define CURVNET_SET(arg)
#define CURVNET_RESTORE()
+#define VNET_DEFINE(_t, _v) _t _v
+#define VNET_DECLARE(_t, _v) extern _t _v
+#define VNET(arg) arg
#endif
#if defined(__osf__)
# include <netinet/tcp_timer.h>
@@ -102,22 +105,40 @@
static int ipf_send_ip __P((fr_info_t *, mb_t *));
static void ipf_timer_func __P((void *arg));
-ipf_main_softc_t ipfmain;
+VNET_DEFINE(ipf_main_softc_t, ipfmain) = {
+ .ipf_running = -2,
+};
+#define V_ipfmain VNET(ipfmain)
# include <sys/conf.h>
# if defined(NETBSD_PF)
# include <net/pfil.h>
# endif /* NETBSD_PF */
+static eventhandler_tag ipf_arrivetag, ipf_departtag;
+#if 0
+/*
+ * Disable the "cloner" event handler; we are getting interface
+ * events before the firewall is fully initiallized and also no vnet
+ * information thus leading to uninitialised memory accesses.
+ * In addition it is unclear why we need it in first place.
+ * If it turns out to be needed, well need a dedicated event handler
+ * for it to deal with the ifc and the correct vnet.
+ */
+static eventhandler_tag ipf_clonetag;
+#endif
-static eventhandler_tag ipf_arrivetag, ipf_departtag, ipf_clonetag;
-
-static void ipf_ifevent(void *arg);
+static void ipf_ifevent(void *arg, struct ifnet *ifp);
-static void ipf_ifevent(arg)
+static void ipf_ifevent(arg, ifp)
void *arg;
+ struct ifnet *ifp;
{
- ipf_sync(arg, NULL);
+
+ CURVNET_SET(ifp->if_vnet);
+ if (V_ipfmain.ipf_running > 0)
+ ipf_sync(&V_ipfmain, NULL);
+ CURVNET_RESTORE();
}
@@ -135,8 +156,10 @@
ip->ip_len = htons(ip->ip_len);
ip->ip_off = htons(ip->ip_off);
#endif
- rv = ipf_check(&ipfmain, ip, ip->ip_hl << 2, ifp, (dir == PFIL_OUT),
+ CURVNET_SET(ifp->if_vnet);
+ rv = ipf_check(&V_ipfmain, ip, ip->ip_hl << 2, ifp, (dir == PFIL_OUT),
mp);
+ CURVNET_RESTORE();
#if (__FreeBSD_version < 1000019)
if ((rv == 0) && (*mp != NULL)) {
ip = mtod(*mp, struct ip *);
@@ -153,8 +176,13 @@
static int
ipf_check_wrapper6(void *arg, struct mbuf **mp, struct ifnet *ifp, int dir)
{
- return (ipf_check(&ipfmain, mtod(*mp, struct ip *),
- sizeof(struct ip6_hdr), ifp, (dir == PFIL_OUT), mp));
+ int error;
+
+ CURVNET_SET(ifp->if_vnet);
+ error = ipf_check(&V_ipfmain, mtod(*mp, struct ip *),
+ sizeof(struct ip6_hdr), ifp, (dir == PFIL_OUT), mp);
+ CURVNET_RESTORE();
+ return (error);
}
# endif
#if defined(IPFILTER_LKM)
@@ -215,7 +243,7 @@
}
- bzero((char *)ipfmain.ipf_selwait, sizeof(ipfmain.ipf_selwait));
+ bzero((char *)V_ipfmain.ipf_selwait, sizeof(V_ipfmain.ipf_selwait));
softc->ipf_running = 1;
if (softc->ipf_control_forwarding & 1)
@@ -284,38 +312,42 @@
int error = 0, unit = 0;
SPL_INT(s);
+ CURVNET_SET(TD_TO_VNET(p));
#if (BSD >= 199306)
if (securelevel_ge(p->p_cred, 3) && (mode & FWRITE))
{
- ipfmain.ipf_interror = 130001;
+ V_ipfmain.ipf_interror = 130001;
+ CURVNET_RESTORE();
return EPERM;
}
#endif
unit = GET_MINOR(dev);
if ((IPL_LOGMAX < unit) || (unit < 0)) {
- ipfmain.ipf_interror = 130002;
+ V_ipfmain.ipf_interror = 130002;
+ CURVNET_RESTORE();
return ENXIO;
}
- if (ipfmain.ipf_running <= 0) {
+ if (V_ipfmain.ipf_running <= 0) {
if (unit != IPL_LOGIPF && cmd != SIOCIPFINTERROR) {
- ipfmain.ipf_interror = 130003;
+ V_ipfmain.ipf_interror = 130003;
+ CURVNET_RESTORE();
return EIO;
}
if (cmd != SIOCIPFGETNEXT && cmd != SIOCIPFGET &&
cmd != SIOCIPFSET && cmd != SIOCFRENB &&
cmd != SIOCGETFS && cmd != SIOCGETFF &&
cmd != SIOCIPFINTERROR) {
- ipfmain.ipf_interror = 130004;
+ V_ipfmain.ipf_interror = 130004;
+ CURVNET_RESTORE();
return EIO;
}
}
SPL_NET(s);
- CURVNET_SET(TD_TO_VNET(p));
- error = ipf_ioctlswitch(&ipfmain, unit, data, cmd, mode, p->p_uid, p);
+ error = ipf_ioctlswitch(&V_ipfmain, unit, data, cmd, mode, p->p_uid, p);
CURVNET_RESTORE();
if (error != -1) {
SPL_X(s);
@@ -563,7 +595,7 @@
}
if (dst == 0) {
- if (ipf_ifpaddr(&ipfmain, 4, FRI_NORMAL, ifp,
+ if (ipf_ifpaddr(&V_ipfmain, 4, FRI_NORMAL, ifp,
&dst6, NULL) == -1) {
FREE_MB_T(m);
return -1;
@@ -600,7 +632,7 @@
xtra = MIN(fin->fin_plen, avail - iclen - max_linkhdr);
xtra = MIN(xtra, IPV6_MMTU - iclen);
if (dst == 0) {
- if (ipf_ifpaddr(&ipfmain, 6, FRI_NORMAL, ifp,
+ if (ipf_ifpaddr(&V_ipfmain, 6, FRI_NORMAL, ifp,
&dst6, NULL) == -1) {
FREE_MB_T(m);
return -1;
@@ -924,9 +956,9 @@
}
done:
if (!error)
- ipfmain.ipf_frouteok[0]++;
+ V_ipfmain.ipf_frouteok[0]++;
else
- ipfmain.ipf_frouteok[1]++;
+ V_ipfmain.ipf_frouteok[1]++;
if (has_nhop)
fib4_free_nh_ext(fibnum, &nh4);
@@ -1388,13 +1420,15 @@
ipf_event_reg(void)
{
ipf_arrivetag = EVENTHANDLER_REGISTER(ifnet_arrival_event, \
- ipf_ifevent, &ipfmain, \
+ ipf_ifevent, NULL, \
EVENTHANDLER_PRI_ANY);
ipf_departtag = EVENTHANDLER_REGISTER(ifnet_departure_event, \
- ipf_ifevent, &ipfmain, \
+ ipf_ifevent, NULL, \
EVENTHANDLER_PRI_ANY);
+#if 0
ipf_clonetag = EVENTHANDLER_REGISTER(if_clone_event, ipf_ifevent, \
- &ipfmain, EVENTHANDLER_PRI_ANY);
+ NULL, EVENTHANDLER_PRI_ANY);
+#endif
}
void
@@ -1406,9 +1440,11 @@
if (ipf_departtag != NULL) {
EVENTHANDLER_DEREGISTER(ifnet_departure_event, ipf_departtag);
}
+#if 0
if (ipf_clonetag != NULL) {
EVENTHANDLER_DEREGISTER(if_clone_event, ipf_clonetag);
}
+#endif
}
Index: head/sys/contrib/ipfilter/netinet/ip_proxy.c
===================================================================
--- head/sys/contrib/ipfilter/netinet/ip_proxy.c
+++ head/sys/contrib/ipfilter/netinet/ip_proxy.c
@@ -64,6 +64,15 @@
# include <sys/queue.h>
#endif
#include <net/if.h>
+#if defined(__FreeBSD_version) && (__FreeBSD_version >= 800000) && defined(_KERNEL)
+#include <net/vnet.h>
+#else
+#define CURVNET_SET(arg)
+#define CURVNET_RESTORE()
+#define VNET_DEFINE(_t, _v) _t _v
+#define VNET_DECLARE(_t, _v) extern _t _v
+#define VNET(arg) arg
+#endif
#ifdef sun
# include <net/af.h>
#endif
Index: head/sys/contrib/ipfilter/netinet/ip_rpcb_pxy.c
===================================================================
--- head/sys/contrib/ipfilter/netinet/ip_rpcb_pxy.c
+++ head/sys/contrib/ipfilter/netinet/ip_rpcb_pxy.c
@@ -80,7 +80,9 @@
*/
static frentry_t rpcbfr; /* Skeleton rule for reference by entities
this proxy creates. */
-static int rpcbcnt; /* Upper bound of allocated RPCB sessions. */
+static VNET_DEFINE(int, rpcbcnt);
+#define V_rpcbcnt VNET(rpcbcnt)
+ /* Upper bound of allocated RPCB sessions. */
/* XXX rpcbcnt still requires locking. */
static int rpcb_proxy_init = 0;
@@ -107,7 +109,7 @@
void
ipf_p_rpcb_main_load()
{
- rpcbcnt = 0;
+ V_rpcbcnt = 0;
bzero((char *)&rpcbfr, sizeof(rpcbfr));
rpcbfr.fr_ref = 1;
@@ -581,7 +583,7 @@
return(0);
}
- if (rpcbcnt == RPCB_MAXREQS)
+ if (V_rpcbcnt == RPCB_MAXREQS)
return(-1);
KMALLOC(rxp, rpcb_xact_t *);
@@ -599,7 +601,7 @@
rxp->rx_ref = 1;
- ++rpcbcnt;
+ ++V_rpcbcnt;
return(0);
}
@@ -1084,7 +1086,7 @@
KFREE(rx);
- --rpcbcnt;
+ --V_rpcbcnt;
}
/* -------------------------------------------------------------------- */
Index: head/sys/contrib/ipfilter/netinet/ip_rules.c
===================================================================
--- head/sys/contrib/ipfilter/netinet/ip_rules.c
+++ head/sys/contrib/ipfilter/netinet/ip_rules.c
@@ -32,6 +32,15 @@
#endif
#if defined(__FreeBSD__) && (__FreeBSD_version > 220000)
# include <sys/sockio.h>
+#if defined(__FreeBSD_version) && (__FreeBSD_version >= 800000) && defined(_KERNEL)
+#include <net/vnet.h>
+#else
+#define CURVNET_SET(arg)
+#define CURVNET_RESTORE()
+#define VNET_DEFINE(_t, _v) _t _v
+#define VNET_DECLARE(_t, _v) extern _t _v
+#define VNET(arg) arg
+#endif
#else
# include <sys/ioctl.h>
#endif /* FreeBSD */
@@ -51,7 +60,8 @@
#ifdef IPFILTER_COMPILED
-extern ipf_main_softc_t ipfmain;
+VNET_DECLARE(ipf_main_softc_t, ipfmain);
+#define V_ipfmain VNET(ipfmain)
static u_long in_rule__0[] = {
@@ -129,8 +139,8 @@
fp->fr_dsize = sizeof(ipf_rules_out_[0]);
fp->fr_family = AF_INET;
fp->fr_func = (ipfunc_t)ipfrule_match_out_;
- err = frrequest(&ipfmain, IPL_LOGIPF, SIOCADDFR, (caddr_t)fp,
- ipfmain.ipf_active, 0);
+ err = frrequest(&V_ipfmain, IPL_LOGIPF, SIOCADDFR, (caddr_t)fp,
+ V_ipfmain.ipf_active, 0);
return err;
}
@@ -156,9 +166,9 @@
}
}
if (err == 0)
- err = frrequest(&ipfmain, IPL_LOGIPF, SIOCDELFR,
+ err = frrequest(&V_ipfmain, IPL_LOGIPF, SIOCDELFR,
(caddr_t)&ipfrule_out_,
- ipfmain.ipf_active, 0);
+ V_ipfmain.ipf_active, 0);
if (err)
return err;
@@ -198,8 +208,8 @@
fp->fr_dsize = sizeof(ipf_rules_in_[0]);
fp->fr_family = AF_INET;
fp->fr_func = (ipfunc_t)ipfrule_match_in_;
- err = frrequest(&ipfmain, IPL_LOGIPF, SIOCADDFR, (caddr_t)fp,
- ipfmain.ipf_active, 0);
+ err = frrequest(&V_ipfmain, IPL_LOGIPF, SIOCADDFR, (caddr_t)fp,
+ V_ipfmain.ipf_active, 0);
return err;
}
@@ -225,9 +235,9 @@
}
}
if (err == 0)
- err = frrequest(&ipfmain, IPL_LOGIPF, SIOCDELFR,
+ err = frrequest(&V_ipfmain, IPL_LOGIPF, SIOCDELFR,
(caddr_t)&ipfrule_in_,
- ipfmain.ipf_active, 0);
+ V_ipfmain.ipf_active, 0);
if (err)
return err;
Index: head/sys/contrib/ipfilter/netinet/mlfk_ipl.c
===================================================================
--- head/sys/contrib/ipfilter/netinet/mlfk_ipl.c
+++ head/sys/contrib/ipfilter/netinet/mlfk_ipl.c
@@ -7,6 +7,12 @@
* See the IPFILTER.LICENCE file for details on licencing.
*/
+#if defined(KERNEL) || defined(_KERNEL)
+# undef KERNEL
+# undef _KERNEL
+# define KERNEL 1
+# define _KERNEL 1
+#endif
#include <sys/param.h>
#include <sys/systm.h>
@@ -18,6 +24,16 @@
#include <sys/select.h>
#if __FreeBSD_version >= 500000
# include <sys/selinfo.h>
+# include <sys/jail.h>
+#endif
+#if defined(__FreeBSD_version) && (__FreeBSD_version >= 800000) && defined(_KERNEL)
+#include <net/vnet.h>
+#else
+#define CURVNET_SET(arg)
+#define CURVNET_RESTORE()
+#define VNET_DEFINE(_t, _v) _t _v
+#define VNET_DECLARE(_t, _v) extern _t _v
+#define VNET(arg) arg
#endif
#include <net/if.h>
#include <netinet/in_systm.h>
@@ -33,7 +49,8 @@
#include "netinet/ip_frag.h"
#include "netinet/ip_sync.h"
-extern ipf_main_softc_t ipfmain;
+VNET_DECLARE(ipf_main_softc_t, ipfmain);
+#define V_ipfmain VNET(ipfmain)
#if __FreeBSD_version >= 502116
static struct cdev *ipf_devs[IPL_LOGSIZE];
@@ -42,10 +59,14 @@
#endif
static int sysctl_ipf_int ( SYSCTL_HANDLER_ARGS );
+static int sysctl_ipf_int_nat ( SYSCTL_HANDLER_ARGS );
+static int sysctl_ipf_int_state ( SYSCTL_HANDLER_ARGS );
+static int sysctl_ipf_int_auth ( SYSCTL_HANDLER_ARGS );
+static int sysctl_ipf_int_frag ( SYSCTL_HANDLER_ARGS );
static int ipf_modload(void);
static int ipf_modunload(void);
-static int ipf_fbsd_sysctl_create(ipf_main_softc_t*);
-static int ipf_fbsd_sysctl_destroy(ipf_main_softc_t*);
+static int ipf_fbsd_sysctl_create(void);
+static int ipf_fbsd_sysctl_destroy(void);
#if (__FreeBSD_version >= 500024)
# if (__FreeBSD_version >= 502116)
@@ -70,40 +91,49 @@
SYSCTL_DECL(_net_inet);
#define SYSCTL_IPF(parent, nbr, name, access, ptr, val, descr) \
- SYSCTL_OID(parent, nbr, name, CTLTYPE_INT|access, \
- ptr, val, sysctl_ipf_int, "I", descr);
-#define SYSCTL_DYN_IPF(parent, nbr, name, access,ptr, val, descr) \
+ SYSCTL_OID(parent, nbr, name, CTLTYPE_INT|CTLFLAG_VNET|access, \
+ ptr, val, sysctl_ipf_int, "I", descr)
+#define SYSCTL_DYN_IPF_NAT(parent, nbr, name, access,ptr, val, descr) \
+ SYSCTL_ADD_OID(&ipf_clist, SYSCTL_STATIC_CHILDREN(parent), nbr, name, \
+ CTLFLAG_DYN|CTLTYPE_INT|CTLFLAG_VNET|access, ptr, val, sysctl_ipf_int_nat, "I", descr)
+#define SYSCTL_DYN_IPF_STATE(parent, nbr, name, access,ptr, val, descr) \
SYSCTL_ADD_OID(&ipf_clist, SYSCTL_STATIC_CHILDREN(parent), nbr, name, \
- CTLFLAG_DYN|CTLTYPE_INT|access, ptr, val, sysctl_ipf_int, "I", descr)
+ CTLFLAG_DYN|CTLTYPE_INT|CTLFLAG_VNET|access, ptr, val, sysctl_ipf_int_state, "I", descr)
+#define SYSCTL_DYN_IPF_FRAG(parent, nbr, name, access,ptr, val, descr) \
+ SYSCTL_ADD_OID(&ipf_clist, SYSCTL_STATIC_CHILDREN(parent), nbr, name, \
+ CTLFLAG_DYN|CTLTYPE_INT|CTLFLAG_VNET|access, ptr, val, sysctl_ipf_int_frag, "I", descr)
+#define SYSCTL_DYN_IPF_AUTH(parent, nbr, name, access,ptr, val, descr) \
+ SYSCTL_ADD_OID(&ipf_clist, SYSCTL_STATIC_CHILDREN(parent), nbr, name, \
+ CTLFLAG_DYN|CTLTYPE_INT|CTLFLAG_VNET|access, ptr, val, sysctl_ipf_int_auth, "I", descr)
static struct sysctl_ctx_list ipf_clist;
#define CTLFLAG_OFF 0x00800000 /* IPFilter must be disabled */
#define CTLFLAG_RWO (CTLFLAG_RW|CTLFLAG_OFF)
SYSCTL_NODE(_net_inet, OID_AUTO, ipf, CTLFLAG_RW, 0, "IPF");
-SYSCTL_IPF(_net_inet_ipf, OID_AUTO, fr_flags, CTLFLAG_RW, &ipfmain.ipf_flags, 0, "IPF flags");
-SYSCTL_IPF(_net_inet_ipf, OID_AUTO, ipf_pass, CTLFLAG_RW, &ipfmain.ipf_pass, 0, "default pass/block");
-SYSCTL_IPF(_net_inet_ipf, OID_AUTO, fr_active, CTLFLAG_RD, &ipfmain.ipf_active, 0, "IPF is active");
+SYSCTL_IPF(_net_inet_ipf, OID_AUTO, fr_flags, CTLFLAG_RW, &VNET_NAME(ipfmain.ipf_flags), 0, "IPF flags");
+SYSCTL_IPF(_net_inet_ipf, OID_AUTO, ipf_pass, CTLFLAG_RW, &VNET_NAME(ipfmain.ipf_pass), 0, "default pass/block");
+SYSCTL_IPF(_net_inet_ipf, OID_AUTO, fr_active, CTLFLAG_RD, &VNET_NAME(ipfmain.ipf_active), 0, "IPF is active");
SYSCTL_IPF(_net_inet_ipf, OID_AUTO, fr_tcpidletimeout, CTLFLAG_RWO,
- &ipfmain.ipf_tcpidletimeout, 0, "TCP idle timeout in seconds");
+ &VNET_NAME(ipfmain.ipf_tcpidletimeout), 0, "TCP idle timeout in seconds");
SYSCTL_IPF(_net_inet_ipf, OID_AUTO, fr_tcphalfclosed, CTLFLAG_RWO,
- &ipfmain.ipf_tcphalfclosed, 0, "timeout for half closed TCP sessions");
+ &VNET_NAME(ipfmain.ipf_tcphalfclosed), 0, "timeout for half closed TCP sessions");
SYSCTL_IPF(_net_inet_ipf, OID_AUTO, fr_tcpclosewait, CTLFLAG_RWO,
- &ipfmain.ipf_tcpclosewait, 0, "timeout for TCP sessions in closewait status");
+ &VNET_NAME(ipfmain.ipf_tcpclosewait), 0, "timeout for TCP sessions in closewait status");
SYSCTL_IPF(_net_inet_ipf, OID_AUTO, fr_tcplastack, CTLFLAG_RWO,
- &ipfmain.ipf_tcplastack, 0, "timeout for TCP sessions in last ack status");
+ &VNET_NAME(ipfmain.ipf_tcplastack), 0, "timeout for TCP sessions in last ack status");
SYSCTL_IPF(_net_inet_ipf, OID_AUTO, fr_tcptimeout, CTLFLAG_RWO,
- &ipfmain.ipf_tcptimeout, 0, "");
+ &VNET_NAME(ipfmain.ipf_tcptimeout), 0, "");
SYSCTL_IPF(_net_inet_ipf, OID_AUTO, fr_tcpclosed, CTLFLAG_RWO,
- &ipfmain.ipf_tcpclosed, 0, "");
+ &VNET_NAME(ipfmain.ipf_tcpclosed), 0, "");
SYSCTL_IPF(_net_inet_ipf, OID_AUTO, fr_udptimeout, CTLFLAG_RWO,
- &ipfmain.ipf_udptimeout, 0, "UDP timeout");
+ &VNET_NAME(ipfmain.ipf_udptimeout), 0, "UDP timeout");
SYSCTL_IPF(_net_inet_ipf, OID_AUTO, fr_udpacktimeout, CTLFLAG_RWO,
- &ipfmain.ipf_udpacktimeout, 0, "");
+ &VNET_NAME(ipfmain.ipf_udpacktimeout), 0, "");
SYSCTL_IPF(_net_inet_ipf, OID_AUTO, fr_icmptimeout, CTLFLAG_RWO,
- &ipfmain.ipf_icmptimeout, 0, "ICMP timeout");
+ &VNET_NAME(ipfmain.ipf_icmptimeout), 0, "ICMP timeout");
SYSCTL_IPF(_net_inet_ipf, OID_AUTO, fr_running, CTLFLAG_RD,
- &ipfmain.ipf_running, 0, "IPF is running");
-SYSCTL_IPF(_net_inet_ipf, OID_AUTO, fr_chksrc, CTLFLAG_RW, &ipfmain.ipf_chksrc, 0, "");
-SYSCTL_IPF(_net_inet_ipf, OID_AUTO, fr_minttl, CTLFLAG_RW, &ipfmain.ipf_minttl, 0, "");
+ &VNET_NAME(ipfmain.ipf_running), 0, "IPF is running");
+SYSCTL_IPF(_net_inet_ipf, OID_AUTO, fr_chksrc, CTLFLAG_RW, &VNET_NAME(ipfmain.ipf_chksrc), 0, "");
+SYSCTL_IPF(_net_inet_ipf, OID_AUTO, fr_minttl, CTLFLAG_RW, &VNET_NAME(ipfmain.ipf_minttl), 0, "");
#define CDEV_MAJOR 79
#include <sys/poll.h>
@@ -178,28 +208,61 @@
}
+static void
+vnet_ipf_init(void)
+{
+ char *defpass;
+ int error;
+
+ if (ipf_create_all(&V_ipfmain) == NULL)
+ return;
+
+ error = ipfattach(&V_ipfmain);
+ if (error) {
+ ipf_destroy_all(&V_ipfmain);
+ return;
+ }
+
+ if (FR_ISPASS(V_ipfmain.ipf_pass))
+ defpass = "pass";
+ else if (FR_ISBLOCK(V_ipfmain.ipf_pass))
+ defpass = "block";
+ else
+ defpass = "no-match -> block";
+
+ if (IS_DEFAULT_VNET(curvnet))
+ printf("%s initialized. Default = %s all, Logging = %s%s\n",
+ ipfilter_version, defpass,
+#ifdef IPFILTER_LOG
+ "enabled",
+#else
+ "disabled",
+#endif
+#ifdef IPFILTER_COMPILED
+ " (COMPILED)"
+#else
+ ""
+#endif
+ );
+}
+VNET_SYSINIT(vnet_ipf_init, SI_SUB_PROTO_FIREWALL, SI_ORDER_THIRD,
+ vnet_ipf_init, NULL);
+
static int
ipf_modload()
{
- char *defpass, *c, *str;
+ char *c, *str;
int i, j, error;
if (ipf_load_all() != 0)
return EIO;
- if (ipf_create_all(&ipfmain) == NULL)
- return EIO;
-
- if (ipf_fbsd_sysctl_create(&ipfmain) != 0)
+ if (ipf_fbsd_sysctl_create() != 0) {
return EIO;
-
- error = ipfattach(&ipfmain);
- if (error)
- return error;
+ }
for (i = 0; i < IPL_LOGSIZE; i++)
ipf_devs[i] = NULL;
-
for (i = 0; (str = ipf_devfiles[i]); i++) {
c = NULL;
for(j = strlen(str); j > 0; j--)
@@ -217,63 +280,48 @@
return error;
ipf_event_reg();
- if (FR_ISPASS(ipfmain.ipf_pass))
- defpass = "pass";
- else if (FR_ISBLOCK(ipfmain.ipf_pass))
- defpass = "block";
- else
- defpass = "no-match -> block";
-
- printf("%s initialized. Default = %s all, Logging = %s%s\n",
- ipfilter_version, defpass,
-#ifdef IPFILTER_LOG
- "enabled",
-#else
- "disabled",
-#endif
-#ifdef IPFILTER_COMPILED
- " (COMPILED)"
-#else
- ""
-#endif
- );
return 0;
}
+static void
+vnet_ipf_uninit(void)
+{
+
+ if (V_ipfmain.ipf_refcnt)
+ return;
+
+ if (V_ipfmain.ipf_running >= 0) {
+ if (ipfdetach(&V_ipfmain) != 0)
+ return;
+
+ ipf_destroy_all(&V_ipfmain);
+ }
+
+ V_ipfmain.ipf_running = -2;
+}
+VNET_SYSUNINIT(vnet_ipf_uninit, SI_SUB_PROTO_FIREWALL, SI_ORDER_THIRD,
+ vnet_ipf_uninit, NULL);
static int
ipf_modunload()
{
int error, i;
- if (ipfmain.ipf_refcnt)
- return EBUSY;
+ ipf_event_dereg();
- if (ipf_fbsd_sysctl_destroy(&ipfmain) != 0)
- return EIO;
+ ipf_fbsd_sysctl_destroy();
error = ipf_pfil_unhook();
if (error != 0)
return error;
- if (ipfmain.ipf_running >= 0) {
- error = ipfdetach(&ipfmain);
- if (error != 0)
- return error;
-
- ipf_fbsd_sysctl_destroy(&ipfmain);
- ipf_destroy_all(&ipfmain);
- ipf_unload_all();
- } else
- error = 0;
-
- ipfmain.ipf_running = -2;
-
for (i = 0; ipf_devfiles[i]; i++) {
if (ipf_devs[i] != NULL)
destroy_dev(ipf_devs[i]);
}
+ ipf_unload_all();
+
printf("%s unloaded\n", ipfilter_version);
return error;
@@ -287,7 +335,7 @@
};
-DECLARE_MODULE(ipfilter, ipfiltermod, SI_SUB_PROTO_FIREWALL, SI_ORDER_ANY);
+DECLARE_MODULE(ipfilter, ipfiltermod, SI_SUB_PROTO_FIREWALL, SI_ORDER_SECOND);
#ifdef MODULE_VERSION
MODULE_VERSION(ipfilter, 1);
#endif
@@ -310,13 +358,87 @@
if (!arg1)
error = EPERM;
else {
- if ((oidp->oid_kind & CTLFLAG_OFF) && (ipfmain.ipf_running > 0))
+ if ((oidp->oid_kind & CTLFLAG_OFF) && (V_ipfmain.ipf_running > 0))
error = EBUSY;
else
error = SYSCTL_IN(req, arg1, sizeof(int));
}
return (error);
}
+
+/*
+ * In the VIMAGE case kern_sysctl.c already adds the vnet base address given
+ * we set CTLFLAG_VNET to get proper access checks. Have to undo this.
+ * Then we add the given offset to the specific malloced struct hanging off
+ * virtualized ipmain struct.
+ */
+static int
+sysctl_ipf_int_nat ( SYSCTL_HANDLER_ARGS )
+{
+
+ if (arg1) {
+ ipf_nat_softc_t *nat_softc;
+
+ nat_softc = V_ipfmain.ipf_nat_soft;
+#ifdef VIMAGE
+ arg1 = (void *)((uintptr_t)arg1 - curvnet->vnet_data_base);
+#endif
+ arg1 = (void *)((uintptr_t)nat_softc + (uintptr_t)arg1);
+ }
+
+ return (sysctl_ipf_int(oidp, arg1, arg2, req));
+}
+
+static int
+sysctl_ipf_int_state ( SYSCTL_HANDLER_ARGS )
+{
+
+ if (arg1) {
+ ipf_state_softc_t *state_softc;
+
+ state_softc = V_ipfmain.ipf_state_soft;
+#ifdef VIMAGE
+ arg1 = (void *)((uintptr_t)arg1 - curvnet->vnet_data_base);
+#endif
+ arg1 = (void *)((uintptr_t)state_softc + (uintptr_t)arg1);
+ }
+
+ return (sysctl_ipf_int(oidp, arg1, arg2, req));
+}
+
+static int
+sysctl_ipf_int_auth ( SYSCTL_HANDLER_ARGS )
+{
+
+ if (arg1) {
+ ipf_auth_softc_t *auth_softc;
+
+ auth_softc = V_ipfmain.ipf_auth_soft;
+#ifdef VIMAGE
+ arg1 = (void *)((uintptr_t)arg1 - curvnet->vnet_data_base);
+#endif
+ arg1 = (void *)((uintptr_t)auth_softc + (uintptr_t)arg1);
+ }
+
+ return (sysctl_ipf_int(oidp, arg1, arg2, req));
+}
+
+static int
+sysctl_ipf_int_frag ( SYSCTL_HANDLER_ARGS )
+{
+
+ if (arg1) {
+ ipf_frag_softc_t *frag_softc;
+
+ frag_softc = V_ipfmain.ipf_frag_soft;
+#ifdef VIMAGE
+ arg1 = (void *)((uintptr_t)arg1 - curvnet->vnet_data_base);
+#endif
+ arg1 = (void *)((uintptr_t)frag_softc + (uintptr_t)arg1);
+ }
+
+ return (sysctl_ipf_int(oidp, arg1, arg2, req));
+}
#endif
@@ -335,24 +457,25 @@
revents = 0;
+ CURVNET_SET(TD_TO_VNET(td));
switch (unit)
{
case IPL_LOGIPF :
case IPL_LOGNAT :
case IPL_LOGSTATE :
#ifdef IPFILTER_LOG
- if ((events & (POLLIN | POLLRDNORM)) && ipf_log_canread(&ipfmain, unit))
+ if ((events & (POLLIN | POLLRDNORM)) && ipf_log_canread(&V_ipfmain, unit))
revents |= events & (POLLIN | POLLRDNORM);
#endif
break;
case IPL_LOGAUTH :
- if ((events & (POLLIN | POLLRDNORM)) && ipf_auth_waiting(&ipfmain))
+ if ((events & (POLLIN | POLLRDNORM)) && ipf_auth_waiting(&V_ipfmain))
revents |= events & (POLLIN | POLLRDNORM);
break;
case IPL_LOGSYNC :
- if ((events & (POLLIN | POLLRDNORM)) && ipf_sync_canread(&ipfmain))
+ if ((events & (POLLIN | POLLRDNORM)) && ipf_sync_canread(&V_ipfmain))
revents |= events & (POLLIN | POLLRDNORM);
- if ((events & (POLLOUT | POLLWRNORM)) && ipf_sync_canwrite(&ipfmain))
+ if ((events & (POLLOUT | POLLWRNORM)) && ipf_sync_canwrite(&V_ipfmain))
revents |= events & (POLLOUT | POLLWRNORM);
break;
case IPL_LOGSCAN :
@@ -362,7 +485,8 @@
}
if ((revents == 0) && ((events & (POLLIN|POLLRDNORM)) != 0))
- selrecord(td, &ipfmain.ipf_selwait[unit]);
+ selrecord(td, &V_ipfmain.ipf_selwait[unit]);
+ CURVNET_RESTORE();
return revents;
}
@@ -465,22 +589,31 @@
#endif
struct uio *uio;
{
+ int error;
int unit = GET_MINOR(dev);
if (unit < 0)
return ENXIO;
- if (ipfmain.ipf_running < 1)
+ CURVNET_SET(TD_TO_VNET(curthread));
+ if (V_ipfmain.ipf_running < 1) {
+ CURVNET_RESTORE();
return EIO;
+ }
- if (unit == IPL_LOGSYNC)
- return ipf_sync_read(&ipfmain, uio);
+ if (unit == IPL_LOGSYNC) {
+ error = ipf_sync_read(&V_ipfmain, uio);
+ CURVNET_RESTORE();
+ return error;
+ }
#ifdef IPFILTER_LOG
- return ipf_log_read(&ipfmain, unit, uio);
+ error = ipf_log_read(&V_ipfmain, unit, uio);
#else
- return ENXIO;
+ error = ENXIO;
#endif
+ CURVNET_RESTORE();
+ return error;
}
@@ -503,61 +636,57 @@
#endif
struct uio *uio;
{
+ int error;
- if (ipfmain.ipf_running < 1)
+ CURVNET_SET(TD_TO_VNET(curthread));
+ if (V_ipfmain.ipf_running < 1) {
+ CURVNET_RESTORE();
return EIO;
+ }
- if (GET_MINOR(dev) == IPL_LOGSYNC)
- return ipf_sync_write(&ipfmain, uio);
+ if (GET_MINOR(dev) == IPL_LOGSYNC) {
+ error = ipf_sync_write(&V_ipfmain, uio);
+ CURVNET_RESTORE();
+ return error;
+ }
return ENXIO;
}
static int
-ipf_fbsd_sysctl_create(main_softc)
- ipf_main_softc_t *main_softc;
+ipf_fbsd_sysctl_create(void)
{
- ipf_nat_softc_t *nat_softc;
- ipf_state_softc_t *state_softc;
- ipf_auth_softc_t *auth_softc;
- ipf_frag_softc_t *frag_softc;
-
- nat_softc = main_softc->ipf_nat_soft;
- state_softc = main_softc->ipf_state_soft;
- auth_softc = main_softc->ipf_auth_soft;
- frag_softc = main_softc->ipf_frag_soft;
sysctl_ctx_init(&ipf_clist);
- SYSCTL_DYN_IPF(_net_inet_ipf, OID_AUTO, "fr_defnatage", CTLFLAG_RWO,
- &nat_softc->ipf_nat_defage, 0, "");
- SYSCTL_DYN_IPF(_net_inet_ipf, OID_AUTO, "fr_statesize", CTLFLAG_RWO,
- &state_softc->ipf_state_size, 0, "");
- SYSCTL_DYN_IPF(_net_inet_ipf, OID_AUTO, "fr_statemax", CTLFLAG_RWO,
- &state_softc->ipf_state_max, 0, "");
- SYSCTL_DYN_IPF(_net_inet_ipf, OID_AUTO, "ipf_nattable_max", CTLFLAG_RWO,
- &nat_softc->ipf_nat_table_max, 0, "");
- SYSCTL_DYN_IPF(_net_inet_ipf, OID_AUTO, "ipf_nattable_sz", CTLFLAG_RWO,
- &nat_softc->ipf_nat_table_sz, 0, "");
- SYSCTL_DYN_IPF(_net_inet_ipf, OID_AUTO, "ipf_natrules_sz", CTLFLAG_RWO,
- &nat_softc->ipf_nat_maprules_sz, 0, "");
- SYSCTL_DYN_IPF(_net_inet_ipf, OID_AUTO, "ipf_rdrrules_sz", CTLFLAG_RWO,
- &nat_softc->ipf_nat_rdrrules_sz, 0, "");
- SYSCTL_DYN_IPF(_net_inet_ipf, OID_AUTO, "ipf_hostmap_sz", CTLFLAG_RWO,
- &nat_softc->ipf_nat_hostmap_sz, 0, "");
- SYSCTL_DYN_IPF(_net_inet_ipf, OID_AUTO, "fr_authsize", CTLFLAG_RWO,
- &auth_softc->ipf_auth_size, 0, "");
- SYSCTL_DYN_IPF(_net_inet_ipf, OID_AUTO, "fr_authused", CTLFLAG_RD,
- &auth_softc->ipf_auth_used, 0, "");
- SYSCTL_DYN_IPF(_net_inet_ipf, OID_AUTO, "fr_defaultauthage", CTLFLAG_RW,
- &auth_softc->ipf_auth_defaultage, 0, "");
- SYSCTL_DYN_IPF(_net_inet_ipf, OID_AUTO, "fr_ipfrttl", CTLFLAG_RW,
- &frag_softc->ipfr_ttl, 0, "");
+ SYSCTL_DYN_IPF_NAT(_net_inet_ipf, OID_AUTO, "fr_defnatage", CTLFLAG_RWO,
+ (void *)offsetof(ipf_nat_softc_t, ipf_nat_defage), 0, "");
+ SYSCTL_DYN_IPF_STATE(_net_inet_ipf, OID_AUTO, "fr_statesize", CTLFLAG_RWO,
+ (void *)offsetof(ipf_state_softc_t, ipf_state_size), 0, "");
+ SYSCTL_DYN_IPF_STATE(_net_inet_ipf, OID_AUTO, "fr_statemax", CTLFLAG_RWO,
+ (void *)offsetof(ipf_state_softc_t, ipf_state_max), 0, "");
+ SYSCTL_DYN_IPF_NAT(_net_inet_ipf, OID_AUTO, "ipf_nattable_max", CTLFLAG_RWO,
+ (void *)offsetof(ipf_nat_softc_t, ipf_nat_table_max), 0, "");
+ SYSCTL_DYN_IPF_NAT(_net_inet_ipf, OID_AUTO, "ipf_nattable_sz", CTLFLAG_RWO,
+ (void *)offsetof(ipf_nat_softc_t, ipf_nat_table_sz), 0, "");
+ SYSCTL_DYN_IPF_NAT(_net_inet_ipf, OID_AUTO, "ipf_natrules_sz", CTLFLAG_RWO,
+ (void *)offsetof(ipf_nat_softc_t, ipf_nat_maprules_sz), 0, "");
+ SYSCTL_DYN_IPF_NAT(_net_inet_ipf, OID_AUTO, "ipf_rdrrules_sz", CTLFLAG_RWO,
+ (void *)offsetof(ipf_nat_softc_t, ipf_nat_rdrrules_sz), 0, "");
+ SYSCTL_DYN_IPF_NAT(_net_inet_ipf, OID_AUTO, "ipf_hostmap_sz", CTLFLAG_RWO,
+ (void *)offsetof(ipf_nat_softc_t, ipf_nat_hostmap_sz), 0, "");
+ SYSCTL_DYN_IPF_AUTH(_net_inet_ipf, OID_AUTO, "fr_authsize", CTLFLAG_RWO,
+ (void *)offsetof(ipf_auth_softc_t, ipf_auth_size), 0, "");
+ SYSCTL_DYN_IPF_AUTH(_net_inet_ipf, OID_AUTO, "fr_authused", CTLFLAG_RD,
+ (void *)offsetof(ipf_auth_softc_t, ipf_auth_used), 0, "");
+ SYSCTL_DYN_IPF_AUTH(_net_inet_ipf, OID_AUTO, "fr_defaultauthage", CTLFLAG_RW,
+ (void *)offsetof(ipf_auth_softc_t, ipf_auth_defaultage), 0, "");
+ SYSCTL_DYN_IPF_FRAG(_net_inet_ipf, OID_AUTO, "fr_ipfrttl", CTLFLAG_RW,
+ (void *)offsetof(ipf_frag_softc_t, ipfr_ttl), 0, "");
return 0;
}
static int
-ipf_fbsd_sysctl_destroy(main_softc)
- ipf_main_softc_t *main_softc;
+ipf_fbsd_sysctl_destroy(void)
{
if (sysctl_ctx_free(&ipf_clist)) {
printf("sysctl_ctx_free failed");
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Fri, Jan 23, 10:57 AM (10 h, 10 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
27882408
Default Alt Text
D7000.id.diff (26 KB)
Attached To
Mode
D7000: V_irtualise ipfilter
Attached
Detach File
Event Timeline
Log In to Comment