svn commit: r185630 - in user/kmacy/HEAD_fast_multi_xmit/sys: net xen xen/xenbus

Kip Macy kmacy at FreeBSD.org
Thu Dec 4 23:43:53 PST 2008


Author: kmacy
Date: Fri Dec  5 07:43:51 2008
New Revision: 185630
URL: http://svn.freebsd.org/changeset/base/185630

Log:
  IFC 184756:185625 part 5

Added:
  user/kmacy/HEAD_fast_multi_xmit/sys/xen/xenbus/xenbus_if.m
  user/kmacy/HEAD_fast_multi_xmit/sys/xen/xenbus/xenbusvar.h
Modified:
  user/kmacy/HEAD_fast_multi_xmit/sys/net/bpf.c
  user/kmacy/HEAD_fast_multi_xmit/sys/net/bridgestp.c
  user/kmacy/HEAD_fast_multi_xmit/sys/net/if.c
  user/kmacy/HEAD_fast_multi_xmit/sys/net/if_bridge.c
  user/kmacy/HEAD_fast_multi_xmit/sys/net/if_ef.c
  user/kmacy/HEAD_fast_multi_xmit/sys/net/if_ethersubr.c
  user/kmacy/HEAD_fast_multi_xmit/sys/net/if_faith.c
  user/kmacy/HEAD_fast_multi_xmit/sys/net/if_fddisubr.c
  user/kmacy/HEAD_fast_multi_xmit/sys/net/if_fwsubr.c
  user/kmacy/HEAD_fast_multi_xmit/sys/net/if_gif.c
  user/kmacy/HEAD_fast_multi_xmit/sys/net/if_gre.c
  user/kmacy/HEAD_fast_multi_xmit/sys/net/if_lagg.c
  user/kmacy/HEAD_fast_multi_xmit/sys/net/if_loop.c
  user/kmacy/HEAD_fast_multi_xmit/sys/net/if_mib.c
  user/kmacy/HEAD_fast_multi_xmit/sys/net/if_spppsubr.c
  user/kmacy/HEAD_fast_multi_xmit/sys/net/if_stf.c
  user/kmacy/HEAD_fast_multi_xmit/sys/net/if_tun.c
  user/kmacy/HEAD_fast_multi_xmit/sys/net/if_var.h
  user/kmacy/HEAD_fast_multi_xmit/sys/net/if_vlan.c
  user/kmacy/HEAD_fast_multi_xmit/sys/net/raw_cb.c
  user/kmacy/HEAD_fast_multi_xmit/sys/net/raw_usrreq.c
  user/kmacy/HEAD_fast_multi_xmit/sys/net/route.c
  user/kmacy/HEAD_fast_multi_xmit/sys/net/rtsock.c
  user/kmacy/HEAD_fast_multi_xmit/sys/net/vnet.h
  user/kmacy/HEAD_fast_multi_xmit/sys/xen/gnttab.c
  user/kmacy/HEAD_fast_multi_xmit/sys/xen/gnttab.h
  user/kmacy/HEAD_fast_multi_xmit/sys/xen/xenbus/xenbus_client.c
  user/kmacy/HEAD_fast_multi_xmit/sys/xen/xenbus/xenbus_comms.c
  user/kmacy/HEAD_fast_multi_xmit/sys/xen/xenbus/xenbus_comms.h
  user/kmacy/HEAD_fast_multi_xmit/sys/xen/xenbus/xenbus_dev.c
  user/kmacy/HEAD_fast_multi_xmit/sys/xen/xenbus/xenbus_probe.c
  user/kmacy/HEAD_fast_multi_xmit/sys/xen/xenbus/xenbus_probe_backend.c
  user/kmacy/HEAD_fast_multi_xmit/sys/xen/xenbus/xenbus_xs.c

Modified: user/kmacy/HEAD_fast_multi_xmit/sys/net/bpf.c
==============================================================================
--- user/kmacy/HEAD_fast_multi_xmit/sys/net/bpf.c	Fri Dec  5 07:42:54 2008	(r185629)
+++ user/kmacy/HEAD_fast_multi_xmit/sys/net/bpf.c	Fri Dec  5 07:43:51 2008	(r185630)
@@ -56,6 +56,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/sockio.h>
 #include <sys/ttycom.h>
 #include <sys/uio.h>
+#include <sys/vimage.h>
 
 #include <sys/event.h>
 #include <sys/file.h>
@@ -566,7 +567,9 @@ bpf_detachd(struct bpf_d *d)
 	 */
 	if (d->bd_promisc) {
 		d->bd_promisc = 0;
+		CURVNET_SET(ifp->if_vnet);
 		error = ifpromisc(ifp, 0);
+		CURVNET_RESTORE();
 		if (error != 0 && error != ENXIO) {
 			/*
 			 * ENXIO can happen if a pccard is unplugged
@@ -872,7 +875,9 @@ bpfwrite(struct cdev *dev, struct uio *u
 
 #ifdef MAC
 	BPFD_LOCK(d);
+	CURVNET_SET(ifp->if_vnet);
 	mac_bpfdesc_create_mbuf(d, m);
+	CURVNET_RESTORE();
 	if (mc != NULL)
 		mac_bpfdesc_create_mbuf(d, mc);
 	BPFD_UNLOCK(d);
@@ -993,6 +998,7 @@ bpfioctl(struct cdev *dev, u_long cmd, c
 			return (EPERM);
 		}
 	}
+	CURVNET_SET(TD_TO_VNET(td));
 	switch (cmd) {
 
 	default:
@@ -1322,6 +1328,7 @@ bpfioctl(struct cdev *dev, u_long cmd, c
 	case BIOCROTZBUF:
 		return (bpf_ioctl_rotzbuf(td, d, (struct bpf_zbuf *)addr));
 	}
+	CURVNET_RESTORE();
 	return (error);
 }
 

Modified: user/kmacy/HEAD_fast_multi_xmit/sys/net/bridgestp.c
==============================================================================
--- user/kmacy/HEAD_fast_multi_xmit/sys/net/bridgestp.c	Fri Dec  5 07:42:54 2008	(r185629)
+++ user/kmacy/HEAD_fast_multi_xmit/sys/net/bridgestp.c	Fri Dec  5 07:43:51 2008	(r185630)
@@ -56,6 +56,7 @@ __FBSDID("$FreeBSD$");
 #include <net/if_types.h>
 #include <net/if_llc.h>
 #include <net/if_media.h>
+#include <net/vnet.h>
 
 #include <netinet/in.h>
 #include <netinet/in_systm.h>

Modified: user/kmacy/HEAD_fast_multi_xmit/sys/net/if.c
==============================================================================
--- user/kmacy/HEAD_fast_multi_xmit/sys/net/if.c	Fri Dec  5 07:42:54 2008	(r185629)
+++ user/kmacy/HEAD_fast_multi_xmit/sys/net/if.c	Fri Dec  5 07:43:51 2008	(r185630)
@@ -67,6 +67,7 @@
 #include <net/if_var.h>
 #include <net/radix.h>
 #include <net/route.h>
+#include <net/vnet.h>
 
 #if defined(INET) || defined(INET6)
 /*XXX*/
@@ -79,6 +80,7 @@
 #endif
 #ifdef INET
 #include <netinet/if_ether.h>
+#include <netinet/vinet.h>
 #endif
 #ifdef DEV_CARP
 #include <netinet/ip_carp.h>
@@ -117,6 +119,7 @@ static void	if_qflush(struct ifnet *);
 static void	if_route(struct ifnet *, int flag, int fam);
 static int	if_setflag(struct ifnet *, int, int, int *, int);
 static void	if_slowtimo(void *);
+static int	if_transmit(struct ifnet *ifp, struct mbuf *m);
 static void	if_unroute(struct ifnet *, int flag, int fam);
 static void	link_rtrequest(int, struct rtentry *, struct rt_addrinfo *);
 static int	if_rtdel(struct radix_node *, void *);
@@ -126,7 +129,6 @@ static void	if_start_deferred(void *cont
 static void	do_link_state_change(void *, int);
 static int	if_getgroup(struct ifgroupreq *, struct ifnet *);
 static int	if_getgroupmembers(struct ifgroupreq *);
-static int	if_transmit(struct ifnet *ifp, struct mbuf *m);
 
 #ifdef INET6
 /*
@@ -136,22 +138,21 @@ static int	if_transmit(struct ifnet *ifp
 extern void	nd6_setmtu(struct ifnet *);
 #endif
 
-int	if_index = 0;
-int	ifqmaxlen = IFQ_MAXLEN;
+#ifdef VIMAGE_GLOBALS
 struct	ifnethead ifnet;	/* depend on static init XXX */
 struct	ifgrouphead ifg_head;
+int	if_index;
+static	int if_indexlim;
+/* Table of ifnet/cdev by index.  Locked with ifnet_lock. */
+static struct ifindex_entry *ifindex_table;
+static struct	knlist ifklist;
+#endif
+
+int	ifqmaxlen = IFQ_MAXLEN;
 struct	mtx ifnet_lock;
 static	if_com_alloc_t *if_com_alloc[256];
 static	if_com_free_t *if_com_free[256];
 
-static int	if_indexlim = 8;
-static struct	knlist ifklist;
-
-/*
- * Table of ifnet/cdev by index.  Locked with ifnet_lock.
- */
-static struct ifindex_entry *ifindex_table = NULL;
-
 static void	filt_netdetach(struct knote *kn);
 static int	filt_netdev(struct knote *kn, long hint);
 
@@ -193,7 +194,6 @@ ifnet_setbyindex(u_short idx, struct ifn
 struct ifaddr *
 ifaddr_byindex(u_short idx)
 {
-	INIT_VNET_NET(curvnet);
 	struct ifaddr *ifa;
 
 	IFNET_RLOCK();
@@ -359,6 +359,10 @@ if_init(void *dummy __unused)
 {
 	INIT_VNET_NET(curvnet);
 
+	V_if_index = 0;
+	V_ifindex_table = NULL;
+	V_if_indexlim = 8;
+
 	IFNET_LOCK_INIT();
 	TAILQ_INIT(&V_ifnet);
 	TAILQ_INIT(&V_ifg_head);
@@ -733,8 +737,7 @@ if_detach(struct ifnet *ifp)
 	INIT_VNET_NET(ifp->if_vnet);
 	struct ifaddr *ifa;
 	struct radix_node_head	*rnh;
-	int s;
-	int i;
+	int s, i, j;
 	struct domain *dp;
  	struct ifnet *iter;
  	int found = 0;
@@ -806,14 +809,13 @@ if_detach(struct ifnet *ifp)
 	 * to this interface...oh well...
 	 */
 	for (i = 1; i <= AF_MAX; i++) {
-	    int j;
-	    for (j = 0; j < rt_numfibs; j++) {
-		if ((rnh = V_rt_tables[j][i]) == NULL)
-			continue;
-		RADIX_NODE_HEAD_LOCK(rnh);
-		(void) rnh->rnh_walktree(rnh, if_rtdel, ifp);
-		RADIX_NODE_HEAD_UNLOCK(rnh);
-	    }
+		for (j = 0; j < rt_numfibs; j++) {
+			if ((rnh = V_rt_tables[j][i]) == NULL)
+				continue;
+			RADIX_NODE_HEAD_LOCK(rnh);
+			(void) rnh->rnh_walktree(rnh, if_rtdel, ifp);
+			RADIX_NODE_HEAD_UNLOCK(rnh);
+		}
 	}
 
 	/* Announce that the interface is gone. */
@@ -2211,7 +2213,7 @@ again:
 			struct sockaddr *sa = ifa->ifa_addr;
 
 			if (jailed(curthread->td_ucred) &&
-			    prison_if(curthread->td_ucred, sa))
+			    !prison_if(curthread->td_ucred, sa))
 				continue;
 			addrs++;
 #ifdef COMPAT_43

Modified: user/kmacy/HEAD_fast_multi_xmit/sys/net/if_bridge.c
==============================================================================
--- user/kmacy/HEAD_fast_multi_xmit/sys/net/if_bridge.c	Fri Dec  5 07:42:54 2008	(r185629)
+++ user/kmacy/HEAD_fast_multi_xmit/sys/net/if_bridge.c	Fri Dec  5 07:43:51 2008	(r185630)
@@ -115,9 +115,11 @@ __FBSDID("$FreeBSD$");
 #include <netinet/in_var.h>
 #include <netinet/ip.h>
 #include <netinet/ip_var.h>
+#include <netinet/vinet.h>
 #ifdef INET6
 #include <netinet/ip6.h>
 #include <netinet6/ip6_var.h>
+#include <netinet6/vinet6.h>
 #endif
 #ifdef DEV_CARP
 #include <netinet/ip_carp.h>

Modified: user/kmacy/HEAD_fast_multi_xmit/sys/net/if_ef.c
==============================================================================
--- user/kmacy/HEAD_fast_multi_xmit/sys/net/if_ef.c	Fri Dec  5 07:42:54 2008	(r185629)
+++ user/kmacy/HEAD_fast_multi_xmit/sys/net/if_ef.c	Fri Dec  5 07:43:51 2008	(r185630)
@@ -50,6 +50,7 @@
 #include <net/netisr.h>
 #include <net/route.h>
 #include <net/bpf.h>
+#include <net/vnet.h>
 
 #ifdef INET
 #include <netinet/in.h>

Modified: user/kmacy/HEAD_fast_multi_xmit/sys/net/if_ethersubr.c
==============================================================================
--- user/kmacy/HEAD_fast_multi_xmit/sys/net/if_ethersubr.c	Fri Dec  5 07:42:54 2008	(r185629)
+++ user/kmacy/HEAD_fast_multi_xmit/sys/net/if_ethersubr.c	Fri Dec  5 07:43:51 2008	(r185630)
@@ -64,6 +64,7 @@
 #include <net/if_bridgevar.h>
 #include <net/if_vlan_var.h>
 #include <net/pf_mtag.h>
+#include <net/vnet.h>
 
 #if defined(INET) || defined(INET6)
 #include <netinet/in.h>
@@ -143,8 +144,10 @@ MALLOC_DEFINE(M_ARPCOM, "arpcom", "802.*
 int
 ether_ipfw_chk(struct mbuf **m0, struct ifnet *dst,
 	struct ip_fw **rule, int shared);
+#ifdef VIMAGE_GLOBALS
 static int ether_ipfw;
 #endif
+#endif
 
 /*
  * Ethernet output routine.

Modified: user/kmacy/HEAD_fast_multi_xmit/sys/net/if_faith.c
==============================================================================
--- user/kmacy/HEAD_fast_multi_xmit/sys/net/if_faith.c	Fri Dec  5 07:42:54 2008	(r185629)
+++ user/kmacy/HEAD_fast_multi_xmit/sys/net/if_faith.c	Fri Dec  5 07:43:51 2008	(r185630)
@@ -77,6 +77,7 @@
 #include <netinet6/in6_var.h>
 #include <netinet/ip6.h>
 #include <netinet6/ip6_var.h>
+#include <netinet6/vinet6.h>
 #endif
 
 #define FAITHNAME	"faith"

Modified: user/kmacy/HEAD_fast_multi_xmit/sys/net/if_fddisubr.c
==============================================================================
--- user/kmacy/HEAD_fast_multi_xmit/sys/net/if_fddisubr.c	Fri Dec  5 07:42:54 2008	(r185629)
+++ user/kmacy/HEAD_fast_multi_xmit/sys/net/if_fddisubr.c	Fri Dec  5 07:43:51 2008	(r185630)
@@ -335,7 +335,7 @@ fddi_output(ifp, m, dst, rt0)
 		}
 	}
 
-	IFQ_HANDOFF(ifp, m, error);
+	error = (ifp->if_transmit)(ifp, m);
 	if (error)
 		ifp->if_oerrors++;
 

Modified: user/kmacy/HEAD_fast_multi_xmit/sys/net/if_fwsubr.c
==============================================================================
--- user/kmacy/HEAD_fast_multi_xmit/sys/net/if_fwsubr.c	Fri Dec  5 07:42:54 2008	(r185629)
+++ user/kmacy/HEAD_fast_multi_xmit/sys/net/if_fwsubr.c	Fri Dec  5 07:43:51 2008	(r185630)
@@ -249,7 +249,7 @@ firewire_output(struct ifnet *ifp, struc
 		 */
 		enc->ul[0] = htonl(enc->ul[0]);
 
-		IFQ_HANDOFF(ifp, m, error);
+		error = (ifp->if_transmit)(ifp, m);
 		return (error);
 	} else {
 		/*
@@ -309,7 +309,7 @@ firewire_output(struct ifnet *ifp, struc
 			enc->ul[0] = htonl(enc->ul[0]);
 			enc->ul[1] = htonl(enc->ul[1]);
 
-			IFQ_HANDOFF(ifp, m, error);
+			error = (ifp->if_transmit)(ifp, m);
 			if (error) {
 				if (mtail)
 					m_freem(mtail);

Modified: user/kmacy/HEAD_fast_multi_xmit/sys/net/if_gif.c
==============================================================================
--- user/kmacy/HEAD_fast_multi_xmit/sys/net/if_gif.c	Fri Dec  5 07:42:54 2008	(r185629)
+++ user/kmacy/HEAD_fast_multi_xmit/sys/net/if_gif.c	Fri Dec  5 07:43:51 2008	(r185630)
@@ -94,7 +94,18 @@
  */
 static struct mtx gif_mtx;
 static MALLOC_DEFINE(M_GIF, "gif", "Generic Tunnel Interface");
+
+#ifdef VIMAGE_GLOBALS
 static LIST_HEAD(, gif_softc) gif_softc_list;
+static int max_gif_nesting;
+static int parallel_tunnels;
+#ifdef INET
+int ip_gif_ttl;
+#endif
+#ifdef INET6
+int ip6_gif_hlim;
+#endif
+#endif
 
 void	(*ng_gif_input_p)(struct ifnet *ifp, struct mbuf **mp, int af);
 void	(*ng_gif_input_orphan_p)(struct ifnet *ifp, struct mbuf *m, int af);
@@ -123,9 +134,6 @@ SYSCTL_NODE(_net_link, IFT_GIF, gif, CTL
  */
 #define MAX_GIF_NEST 1
 #endif
-#ifndef VIMAGE
-static int max_gif_nesting = MAX_GIF_NEST;
-#endif
 SYSCTL_V_INT(V_NET, vnet_gif, _net_link_gif, OID_AUTO, max_nesting,
     CTLFLAG_RW, max_gif_nesting, 0, "Max nested tunnels");
 
@@ -140,11 +148,6 @@ SYSCTL_V_INT(V_NET, vnet_gif, _net_inet6
  * pair of addresses.  Some applications require this functionality so
  * we allow control over this check here.
  */
-#ifdef XBONEHACK
-static int parallel_tunnels = 1;
-#else
-static int parallel_tunnels = 0;
-#endif
 SYSCTL_V_INT(V_NET, vnet_gif, _net_link_gif, OID_AUTO, parallel_tunnels,
     CTLFLAG_RW, parallel_tunnels, 0, "Allow parallel tunnels?");
 
@@ -251,12 +254,21 @@ gifmodevent(mod, type, data)
 	switch (type) {
 	case MOD_LOAD:
 		mtx_init(&gif_mtx, "gif_mtx", NULL, MTX_DEF);
-		LIST_INIT(&V_gif_softc_list);
-		if_clone_attach(&gif_cloner);
 
+		LIST_INIT(&V_gif_softc_list);
+		V_max_gif_nesting = MAX_GIF_NEST;
+#ifdef XBONEHACK
+		V_parallel_tunnels = 1;
+#else
+		V_parallel_tunnels = 0;
+#endif
+#ifdef INET
+		V_ip_gif_ttl = GIF_TTL;
+#endif
 #ifdef INET6
 		V_ip6_gif_hlim = GIF_HLIM;
 #endif
+		if_clone_attach(&gif_cloner);
 
 		break;
 	case MOD_UNLOAD:

Modified: user/kmacy/HEAD_fast_multi_xmit/sys/net/if_gre.c
==============================================================================
--- user/kmacy/HEAD_fast_multi_xmit/sys/net/if_gre.c	Fri Dec  5 07:42:54 2008	(r185629)
+++ user/kmacy/HEAD_fast_multi_xmit/sys/net/if_gre.c	Fri Dec  5 07:43:51 2008	(r185630)
@@ -79,6 +79,7 @@
 #include <netinet/ip_gre.h>
 #include <netinet/ip_var.h>
 #include <netinet/ip_encap.h>
+#include <netinet/vinet.h>
 #else
 #error "Huh? if_gre without inet?"
 #endif

Modified: user/kmacy/HEAD_fast_multi_xmit/sys/net/if_lagg.c
==============================================================================
--- user/kmacy/HEAD_fast_multi_xmit/sys/net/if_lagg.c	Fri Dec  5 07:42:54 2008	(r185629)
+++ user/kmacy/HEAD_fast_multi_xmit/sys/net/if_lagg.c	Fri Dec  5 07:43:51 2008	(r185630)
@@ -1371,7 +1371,7 @@ int
 lagg_enqueue(struct ifnet *ifp, struct mbuf *m)
 {
 
-	return ((ifp->if_transmit)(ifp, m));
+	return (ifp->if_transmit)(ifp, m);
 }
 
 /*

Modified: user/kmacy/HEAD_fast_multi_xmit/sys/net/if_loop.c
==============================================================================
--- user/kmacy/HEAD_fast_multi_xmit/sys/net/if_loop.c	Fri Dec  5 07:42:54 2008	(r185629)
+++ user/kmacy/HEAD_fast_multi_xmit/sys/net/if_loop.c	Fri Dec  5 07:43:51 2008	(r185630)
@@ -57,6 +57,7 @@
 #include <net/netisr.h>
 #include <net/route.h>
 #include <net/bpf.h>
+#include <net/vnet.h>
 
 #ifdef	INET
 #include <netinet/in.h>
@@ -96,13 +97,18 @@ int		looutput(struct ifnet *ifp, struct 
 static int	lo_clone_create(struct if_clone *, int, caddr_t);
 static void	lo_clone_destroy(struct ifnet *);
 
-struct ifnet *loif = NULL;			/* Used externally */
+#ifdef VIMAGE_GLOBALS
+struct ifnet *loif;			/* Used externally */
+#endif
 
 IFC_SIMPLE_DECLARE(lo, 1);
 
 static void
 lo_clone_destroy(struct ifnet *ifp)
 {
+#ifdef INVARIANTS
+	INIT_VNET_NET(ifp->if_vnet);
+#endif
 
 	/* XXX: destroying lo0 will lead to panics. */
 	KASSERT(V_loif != ifp, ("%s: destroying lo0", __func__));
@@ -139,9 +145,11 @@ lo_clone_create(struct if_clone *ifc, in
 static int
 loop_modevent(module_t mod, int type, void *data)
 {
+	INIT_VNET_NET(curvnet);
 
 	switch (type) {
 	case MOD_LOAD:
+		V_loif = NULL;
 		if_clone_attach(&lo_cloner);
 		break;
 

Modified: user/kmacy/HEAD_fast_multi_xmit/sys/net/if_mib.c
==============================================================================
--- user/kmacy/HEAD_fast_multi_xmit/sys/net/if_mib.c	Fri Dec  5 07:42:54 2008	(r185629)
+++ user/kmacy/HEAD_fast_multi_xmit/sys/net/if_mib.c	Fri Dec  5 07:43:51 2008	(r185630)
@@ -38,6 +38,7 @@
 
 #include <net/if.h>
 #include <net/if_mib.h>
+#include <net/vnet.h>
 
 /*
  * A sysctl(3) MIB for generic interface information.  This information

Modified: user/kmacy/HEAD_fast_multi_xmit/sys/net/if_spppsubr.c
==============================================================================
--- user/kmacy/HEAD_fast_multi_xmit/sys/net/if_spppsubr.c	Fri Dec  5 07:42:54 2008	(r185629)
+++ user/kmacy/HEAD_fast_multi_xmit/sys/net/if_spppsubr.c	Fri Dec  5 07:43:51 2008	(r185630)
@@ -56,6 +56,7 @@
 #ifdef INET
 #include <netinet/ip.h>
 #include <netinet/tcp.h>
+#include <netinet/vinet.h>
 #endif
 
 #ifdef INET6

Modified: user/kmacy/HEAD_fast_multi_xmit/sys/net/if_stf.c
==============================================================================
--- user/kmacy/HEAD_fast_multi_xmit/sys/net/if_stf.c	Fri Dec  5 07:42:54 2008	(r185629)
+++ user/kmacy/HEAD_fast_multi_xmit/sys/net/if_stf.c	Fri Dec  5 07:43:51 2008	(r185630)
@@ -107,6 +107,7 @@
 #include <netinet/ip.h>
 #include <netinet/ip_var.h>
 #include <netinet/in_var.h>
+#include <netinet/vinet.h>
 
 #include <netinet/ip6.h>
 #include <netinet6/ip6_var.h>

Modified: user/kmacy/HEAD_fast_multi_xmit/sys/net/if_tun.c
==============================================================================
--- user/kmacy/HEAD_fast_multi_xmit/sys/net/if_tun.c	Fri Dec  5 07:42:54 2008	(r185629)
+++ user/kmacy/HEAD_fast_multi_xmit/sys/net/if_tun.c	Fri Dec  5 07:43:51 2008	(r185630)
@@ -657,7 +657,7 @@ tunoutput(
 		}
 	}
 
-	IFQ_HANDOFF(ifp, m0, error);
+	error = (ifp->if_transmit)(ifp, m0);
 	if (error) {
 		ifp->if_collisions++;
 		return (ENOBUFS);

Modified: user/kmacy/HEAD_fast_multi_xmit/sys/net/if_var.h
==============================================================================
--- user/kmacy/HEAD_fast_multi_xmit/sys/net/if_var.h	Fri Dec  5 07:42:54 2008	(r185629)
+++ user/kmacy/HEAD_fast_multi_xmit/sys/net/if_var.h	Fri Dec  5 07:43:51 2008	(r185630)
@@ -720,8 +720,6 @@ int    ether_poll_register(poll_handler_
 int    ether_poll_deregister(struct ifnet *ifp);
 #endif /* DEVICE_POLLING */
 
-#include <net/vnet.h>
-
 #endif /* _KERNEL */
 
 #endif /* !_NET_IF_VAR_H_ */

Modified: user/kmacy/HEAD_fast_multi_xmit/sys/net/if_vlan.c
==============================================================================
--- user/kmacy/HEAD_fast_multi_xmit/sys/net/if_vlan.c	Fri Dec  5 07:42:54 2008	(r185629)
+++ user/kmacy/HEAD_fast_multi_xmit/sys/net/if_vlan.c	Fri Dec  5 07:43:51 2008	(r185630)
@@ -64,6 +64,7 @@
 #include <net/if_dl.h>
 #include <net/if_types.h>
 #include <net/if_vlan_var.h>
+#include <net/vnet.h>
 
 #define VLANNAME	"vlan"
 #define	VLAN_DEF_HWIDTH	4
@@ -868,7 +869,7 @@ vlan_start(struct ifnet *ifp)
 		 * Send it, precisely as ether_output() would have.
 		 * We are already running at splimp.
 		 */
-		error = (ifp->if_transmit)(p, m);
+		error = (p->if_transmit)(p, m);
 		if (!error)
 			ifp->if_opackets++;
 		else

Modified: user/kmacy/HEAD_fast_multi_xmit/sys/net/raw_cb.c
==============================================================================
--- user/kmacy/HEAD_fast_multi_xmit/sys/net/raw_cb.c	Fri Dec  5 07:42:54 2008	(r185629)
+++ user/kmacy/HEAD_fast_multi_xmit/sys/net/raw_cb.c	Fri Dec  5 07:43:51 2008	(r185630)
@@ -46,6 +46,7 @@
 
 #include <net/if.h>
 #include <net/raw_cb.h>
+#include <net/vnet.h>
 
 /*
  * Routines to manage the raw protocol control blocks.
@@ -57,7 +58,9 @@
  */
 
 struct mtx rawcb_mtx;
+#ifdef VIMAGE_GLOBALS
 struct rawcb_list_head rawcb_list;
+#endif
 
 SYSCTL_NODE(_net, OID_AUTO, raw, CTLFLAG_RW, 0, "Raw socket infrastructure");
 

Modified: user/kmacy/HEAD_fast_multi_xmit/sys/net/raw_usrreq.c
==============================================================================
--- user/kmacy/HEAD_fast_multi_xmit/sys/net/raw_usrreq.c	Fri Dec  5 07:42:54 2008	(r185629)
+++ user/kmacy/HEAD_fast_multi_xmit/sys/net/raw_usrreq.c	Fri Dec  5 07:43:51 2008	(r185630)
@@ -48,6 +48,7 @@
 
 #include <net/if.h>
 #include <net/raw_cb.h>
+#include <net/vnet.h>
 
 MTX_SYSINIT(rawcb_mtx, &rawcb_mtx, "rawcb", MTX_DEF);
 

Modified: user/kmacy/HEAD_fast_multi_xmit/sys/net/route.c
==============================================================================
--- user/kmacy/HEAD_fast_multi_xmit/sys/net/route.c	Fri Dec  5 07:42:54 2008	(r185629)
+++ user/kmacy/HEAD_fast_multi_xmit/sys/net/route.c	Fri Dec  5 07:43:51 2008	(r185630)
@@ -57,9 +57,11 @@
 #ifdef RADIX_MPATH
 #include <net/radix_mpath.h>
 #endif
+#include <net/vnet.h>
 
 #include <netinet/in.h>
 #include <netinet/ip_mroute.h>
+#include <netinet/vinet.h>
 
 #include <vm/uma.h>
 
@@ -84,6 +86,7 @@ SYSCTL_INT(_net, OID_AUTO, add_addr_allf
     &rt_add_addr_allfibs, 0, "");
 TUNABLE_INT("net.add_addr_allfibs", &rt_add_addr_allfibs);
 
+#ifdef VIMAGE_GLOBALS
 static struct rtstat rtstat;
 
 /* by default only the first 'row' of tables will be accessed. */
@@ -96,6 +99,7 @@ static struct rtstat rtstat;
 struct radix_node_head *rt_tables[RT_MAXFIBS][AF_MAX+1];
 
 static int	rttrash;		/* routes not in table but not freed */
+#endif
 
 static void rt_maskedcopy(struct sockaddr *,
 	    struct sockaddr *, struct sockaddr *);
@@ -143,6 +147,7 @@ SYSCTL_PROC(_net, OID_AUTO, my_fibnum, C
 static void
 route_init(void)
 {
+	INIT_VNET_INET(curvnet);
 	int table;
 	struct domain *dom;
 	int fam;

Modified: user/kmacy/HEAD_fast_multi_xmit/sys/net/rtsock.c
==============================================================================
--- user/kmacy/HEAD_fast_multi_xmit/sys/net/rtsock.c	Fri Dec  5 07:42:54 2008	(r185629)
+++ user/kmacy/HEAD_fast_multi_xmit/sys/net/rtsock.c	Fri Dec  5 07:43:51 2008	(r185630)
@@ -31,11 +31,13 @@
  */
 #include "opt_sctp.h"
 #include "opt_mpath.h"
+#include "opt_inet.h"
+#include "opt_inet6.h"
 
 #include <sys/param.h>
 #include <sys/domain.h>
-#include <sys/kernel.h>
 #include <sys/jail.h>
+#include <sys/kernel.h>
 #include <sys/malloc.h>
 #include <sys/mbuf.h>
 #include <sys/priv.h>
@@ -52,8 +54,12 @@
 #include <net/netisr.h>
 #include <net/raw_cb.h>
 #include <net/route.h>
+#include <net/vnet.h>
 
 #include <netinet/in.h>
+#ifdef INET6
+#include <netinet6/scope6_var.h>
+#endif
 
 #ifdef SCTP
 extern void sctp_addr_change(struct ifaddr *ifa, int cmd);
@@ -309,6 +315,136 @@ static struct pr_usrreqs route_usrreqs =
 	.pru_close =		rts_close,
 };
 
+#ifndef _SOCKADDR_UNION_DEFINED
+#define	_SOCKADDR_UNION_DEFINED
+/*
+ * The union of all possible address formats we handle.
+ */
+union sockaddr_union {
+	struct sockaddr		sa;
+	struct sockaddr_in	sin;
+	struct sockaddr_in6	sin6;
+};
+#endif /* _SOCKADDR_UNION_DEFINED */
+
+static int
+rtm_get_jailed(struct rt_addrinfo *info, struct ifnet *ifp,
+    struct rtentry *rt, union sockaddr_union *saun, struct ucred *cred)
+{
+
+	switch (info->rti_info[RTAX_DST]->sa_family) {
+#ifdef INET
+	case AF_INET:
+	{
+		struct in_addr ia;
+
+		/*
+		 * 1. Check if the returned address is part of the jail.
+		 */
+		ia = ((struct sockaddr_in *)rt->rt_ifa->ifa_addr)->sin_addr;
+		if (prison_check_ip4(cred, &ia) != 0) {
+			info->rti_info[RTAX_IFA] = rt->rt_ifa->ifa_addr;
+
+		} else {
+			struct ifaddr *ifa;
+			int found;
+
+			found = 0;
+
+			/*
+			 * 2. Try to find an address on the given outgoing
+			 *    interface that belongs to the jail.
+			 */
+			TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
+				struct sockaddr *sa;
+				sa = ifa->ifa_addr;
+				if (sa->sa_family != AF_INET)
+					continue;
+				ia = ((struct sockaddr_in *)sa)->sin_addr;
+				if (prison_check_ip4(cred, &ia) != 0) {
+					found = 1;
+					break;
+				}
+			}
+			if (!found) {
+				/*
+				 * 3. As a last resort return the 'default'
+				 * jail address.
+				 */
+				if (prison_getip4(cred, &ia) != 0)
+					return (ESRCH);
+			}
+			bzero(&saun->sin, sizeof(struct sockaddr_in));
+			saun->sin.sin_len = sizeof(struct sockaddr_in);
+			saun->sin.sin_family = AF_INET;
+			saun->sin.sin_addr.s_addr = ia.s_addr;
+			info->rti_info[RTAX_IFA] =
+			    (struct sockaddr *)&saun->sin;
+		}
+		break;
+	}
+#endif
+#ifdef INET6
+	case AF_INET6:
+	{
+		struct in6_addr ia6;
+
+		/*
+		 * 1. Check if the returned address is part of the jail.
+		 */
+		bcopy(&((struct sockaddr_in6 *)rt->rt_ifa->ifa_addr)->sin6_addr,
+		    &ia6, sizeof(struct in6_addr));
+		if (prison_check_ip6(cred, &ia6) != 0) {
+			info->rti_info[RTAX_IFA] = rt->rt_ifa->ifa_addr;
+		} else {
+			struct ifaddr *ifa;
+			int found;
+
+			found = 0;
+
+			/*
+			 * 2. Try to find an address on the given outgoing
+			 *    interface that belongs to the jail.
+			 */
+			TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
+				struct sockaddr *sa;
+				sa = ifa->ifa_addr;
+				if (sa->sa_family != AF_INET6)
+					continue;
+				bcopy(&((struct sockaddr_in6 *)sa)->sin6_addr,
+				    &ia6, sizeof(struct in6_addr));
+				if (prison_check_ip6(cred, &ia6) != 0) {
+					found = 1;
+					break;
+				}
+			}
+			if (!found) {
+				/*
+				 * 3. As a last resort return the 'default'
+				 * jail address.
+				 */
+				if (prison_getip6(cred, &ia6) != 0)
+					return (ESRCH);
+			}
+			bzero(&saun->sin6, sizeof(struct sockaddr_in6));
+			saun->sin6.sin6_len = sizeof(struct sockaddr_in6);
+			saun->sin6.sin6_family = AF_INET6;
+			bcopy(&ia6, &saun->sin6.sin6_addr,
+			    sizeof(struct in6_addr));
+			if (sa6_recoverscope(&saun->sin6) != 0)
+				return (ESRCH);
+			info->rti_info[RTAX_IFA] =
+			    (struct sockaddr *)&saun->sin6;
+		}
+		break;
+	}
+#endif
+	default:
+		return (ESRCH);
+	}
+	return (0);
+}
+
 /*ARGSUSED*/
 static int
 route_output(struct mbuf *m, struct socket *so)
@@ -321,7 +457,7 @@ route_output(struct mbuf *m, struct sock
 	struct rt_addrinfo info;
 	int len, error = 0;
 	struct ifnet *ifp = NULL;
-	struct sockaddr_in jail;
+	union sockaddr_union saun;
 
 #define senderr(e) { error = e; goto flush;}
 	if (m == NULL || ((m->m_len < sizeof(long)) &&
@@ -481,16 +617,17 @@ route_output(struct mbuf *m, struct sock
 					info.rti_info[RTAX_IFP] =
 					    ifp->if_addr->ifa_addr;
 					if (jailed(so->so_cred)) {
-						bzero(&jail, sizeof(jail));
-						jail.sin_family = PF_INET;
-						jail.sin_len = sizeof(jail);
-						jail.sin_addr.s_addr =
-						htonl(prison_getip(so->so_cred));
-						info.rti_info[RTAX_IFA] =
-						    (struct sockaddr *)&jail;
-					} else
+						error = rtm_get_jailed(
+						    &info, ifp, rt, &saun,
+						    so->so_cred);
+						if (error != 0) {
+							RT_UNLOCK(rt);
+							senderr(ESRCH);
+						}
+					} else {
 						info.rti_info[RTAX_IFA] =
 						    rt->rt_ifa->ifa_addr;
+					}
 					if (ifp->if_flags & IFF_POINTOPOINT)
 						info.rti_info[RTAX_BRD] =
 						    rt->rt_ifa->ifa_dstaddr;
@@ -1171,7 +1308,7 @@ sysctl_iflist(int af, struct walkarg *w)
 			if (af && af != ifa->ifa_addr->sa_family)
 				continue;
 			if (jailed(curthread->td_ucred) &&
-			    prison_if(curthread->td_ucred, ifa->ifa_addr))
+			    !prison_if(curthread->td_ucred, ifa->ifa_addr))
 				continue;
 			info.rti_info[RTAX_IFA] = ifa->ifa_addr;
 			info.rti_info[RTAX_NETMASK] = ifa->ifa_netmask;
@@ -1220,7 +1357,7 @@ sysctl_ifmalist(int af, struct walkarg *
 			if (af && af != ifma->ifma_addr->sa_family)
 				continue;
 			if (jailed(curproc->p_ucred) &&
-			    prison_if(curproc->p_ucred, ifma->ifma_addr))
+			    !prison_if(curproc->p_ucred, ifma->ifma_addr))
 				continue;
 			info.rti_info[RTAX_IFA] = ifma->ifma_addr;
 			info.rti_info[RTAX_GATEWAY] =

Modified: user/kmacy/HEAD_fast_multi_xmit/sys/net/vnet.h
==============================================================================
--- user/kmacy/HEAD_fast_multi_xmit/sys/net/vnet.h	Fri Dec  5 07:42:54 2008	(r185629)
+++ user/kmacy/HEAD_fast_multi_xmit/sys/net/vnet.h	Fri Dec  5 07:43:51 2008	(r185630)
@@ -33,9 +33,10 @@
 #ifndef _NET_VNET_H_
 #define _NET_VNET_H_
 
-#ifdef VIMAGE
 #include "opt_route.h"
 
+#include <sys/param.h>
+#include <sys/systm.h>
 #include <sys/proc.h>
 #include <sys/protosw.h>
 #include <sys/socket.h>
@@ -66,8 +67,6 @@ struct vnet_net {
 	int	_ether_ipfw;
 };
 
-#endif
-
 /*
  * Symbol translation macros
  */

Modified: user/kmacy/HEAD_fast_multi_xmit/sys/xen/gnttab.c
==============================================================================
--- user/kmacy/HEAD_fast_multi_xmit/sys/xen/gnttab.c	Fri Dec  5 07:42:54 2008	(r185629)
+++ user/kmacy/HEAD_fast_multi_xmit/sys/xen/gnttab.c	Fri Dec  5 07:43:51 2008	(r185630)
@@ -537,8 +537,8 @@ gnttab_expand(unsigned int req_entries)
 	return rc;
 }
 
-static int 
-gnttab_init(void *unused)
+int 
+gnttab_init()
 {
 	int i;
 	unsigned int max_nr_glist_frames;
@@ -593,4 +593,4 @@ ini_nomem:
 }
 
 MTX_SYSINIT(gnttab, &gnttab_list_lock, "GNTTAB LOCK", MTX_DEF); 
-SYSINIT(gnttab, SI_SUB_PSEUDO, SI_ORDER_FIRST, gnttab_init, NULL);
+//SYSINIT(gnttab, SI_SUB_PSEUDO, SI_ORDER_FIRST, gnttab_init, NULL);

Modified: user/kmacy/HEAD_fast_multi_xmit/sys/xen/gnttab.h
==============================================================================
--- user/kmacy/HEAD_fast_multi_xmit/sys/xen/gnttab.h	Fri Dec  5 07:42:54 2008	(r185629)
+++ user/kmacy/HEAD_fast_multi_xmit/sys/xen/gnttab.h	Fri Dec  5 07:43:51 2008	(r185630)
@@ -49,6 +49,8 @@ struct gnttab_free_callback {
 	uint16_t count;
 };
 
+int gnttab_init(void);
+
 int gnttab_grant_foreign_access(domid_t domid, unsigned long frame,
 				int flags);
 

Modified: user/kmacy/HEAD_fast_multi_xmit/sys/xen/xenbus/xenbus_client.c
==============================================================================
--- user/kmacy/HEAD_fast_multi_xmit/sys/xen/xenbus/xenbus_client.c	Fri Dec  5 07:42:54 2008	(r185629)
+++ user/kmacy/HEAD_fast_multi_xmit/sys/xen/xenbus/xenbus_client.c	Fri Dec  5 07:43:51 2008	(r185630)
@@ -46,7 +46,7 @@ __FBSDID("$FreeBSD$");
 #include <machine/xen/xen-os.h>
 #include <machine/xen/evtchn.h>
 #include <xen/gnttab.h>
-#include <machine/xen/xenbus.h>
+#include <xen/xenbus/xenbusvar.h>
 #include <machine/stdarg.h>
 
 
@@ -71,7 +71,7 @@ const char *xenbus_strstate(XenbusState 
 }
 
 int 
-xenbus_watch_path(struct xenbus_device *dev, char *path,
+xenbus_watch_path(device_t dev, char *path,
 		  struct xenbus_watch *watch, 
 		  void (*callback)(struct xenbus_watch *,
 				   const char **, unsigned int))
@@ -94,7 +94,7 @@ xenbus_watch_path(struct xenbus_device *
 EXPORT_SYMBOL(xenbus_watch_path);
 
 
-int xenbus_watch_path2(struct xenbus_device *dev, const char *path,
+int xenbus_watch_path2(device_t dev, const char *path,
 		       const char *path2, struct xenbus_watch *watch, 
 		       void (*callback)(struct xenbus_watch *,
 					const char **, unsigned int))
@@ -119,70 +119,27 @@ int xenbus_watch_path2(struct xenbus_dev
 }
 EXPORT_SYMBOL(xenbus_watch_path2);
 
-
-int xenbus_switch_state(struct xenbus_device *dev,
-			XenbusState state)
-{
-	/* We check whether the state is currently set to the given value, and
-	   if not, then the state is set.  We don't want to unconditionally
-	   write the given state, because we don't want to fire watches
-	   unnecessarily.  Furthermore, if the node has gone, we don't write
-	   to it, as the device will be tearing down, and we don't want to
-	   resurrect that directory.
-	*/
-
-	int current_state;
-	int err;
-	
-	if (state == dev->state)
-		return (0);
-
-	err = xenbus_scanf(XBT_NIL, dev->nodename, "state", "%d",
-			       &current_state);
-	if (err != 1)
-		return 0;
-
-	err = xenbus_printf(XBT_NIL, dev->nodename, "state", "%d", state);
-	if (err) {
-		if (state != XenbusStateClosing) /* Avoid looping */
-			xenbus_dev_fatal(dev, err, "writing new state");
-		return err;
-	}
-
-	dev->state = state;
-	return 0;
-
-}
-
-int xenbus_frontend_closed(struct xenbus_device *dev)
-{
-	xenbus_switch_state(dev, XenbusStateClosed);
-#if 0
-	complete(&dev->down);
-#endif	
-	return 0;
-}
-
 /**
  * Return the path to the error node for the given device, or NULL on failure.
  * If the value returned is non-NULL, then it is the caller's to kfree.
  */
-static char *error_path(struct xenbus_device *dev)
+static char *error_path(device_t dev)
 {
-	char *path_buffer = kmalloc(strlen("error/") + strlen(dev->nodename) +
+	char *path_buffer = kmalloc(strlen("error/")
+				    + strlen(xenbus_get_node(dev)) +
 				    1, GFP_KERNEL);
 	if (path_buffer == NULL) {
 		return NULL;
 	}
 
 	strcpy(path_buffer, "error/");
-	strcpy(path_buffer + strlen("error/"), dev->nodename);
+	strcpy(path_buffer + strlen("error/"), xenbus_get_node(dev));
 
 	return path_buffer;
 }
 
 
-static void _dev_error(struct xenbus_device *dev, int err, const char *fmt,
+static void _dev_error(device_t dev, int err, const char *fmt,
 		       va_list ap)
 {
 	int ret;
@@ -205,13 +162,13 @@ static void _dev_error(struct xenbus_dev
 
 	if (path_buffer == NULL) {
 		printk("xenbus: failed to write error node for %s (%s)\n",
-		       dev->nodename, printf_buffer);
+		       xenbus_get_node(dev), printf_buffer);
 		goto fail;
 	}
 
 	if (xenbus_write(XBT_NIL, path_buffer, "error", printf_buffer) != 0) {
 		printk("xenbus: failed to write error node for %s (%s)\n",
-		       dev->nodename, printf_buffer);
+		       xenbus_get_node(dev), printf_buffer);
 		goto fail;
 	}
 
@@ -223,7 +180,7 @@ static void _dev_error(struct xenbus_dev
 }
 
 
-void xenbus_dev_error(struct xenbus_device *dev, int err, const char *fmt,
+void xenbus_dev_error(device_t dev, int err, const char *fmt,
 		      ...)
 {
 	va_list ap;
@@ -235,7 +192,7 @@ void xenbus_dev_error(struct xenbus_devi
 EXPORT_SYMBOL(xenbus_dev_error);
 
 
-void xenbus_dev_fatal(struct xenbus_device *dev, int err, const char *fmt,
+void xenbus_dev_fatal(device_t dev, int err, const char *fmt,
 		      ...)
 {
 	va_list ap;
@@ -244,14 +201,15 @@ void xenbus_dev_fatal(struct xenbus_devi
 	_dev_error(dev, err, fmt, ap);
 	va_end(ap);
 	
-	xenbus_switch_state(dev, XenbusStateClosing);
+	xenbus_set_state(dev, XenbusStateClosing);
 }
 EXPORT_SYMBOL(xenbus_dev_fatal);
 
 
-int xenbus_grant_ring(struct xenbus_device *dev, unsigned long ring_mfn)
+int xenbus_grant_ring(device_t dev, unsigned long ring_mfn)
 {
-	int err = gnttab_grant_foreign_access(dev->otherend_id, ring_mfn, 0);
+	int err = gnttab_grant_foreign_access(
+		xenbus_get_otherend_id(dev), ring_mfn, 0);
 	if (err < 0)
 		xenbus_dev_fatal(dev, err, "granting access to ring page");
 	return err;
@@ -259,13 +217,13 @@ int xenbus_grant_ring(struct xenbus_devi
 EXPORT_SYMBOL(xenbus_grant_ring);
 
 
-int xenbus_alloc_evtchn(struct xenbus_device *dev, int *port)
+int xenbus_alloc_evtchn(device_t dev, int *port)
 {
 	struct evtchn_alloc_unbound alloc_unbound;
 	int err;
 
 	alloc_unbound.dom        = DOMID_SELF;
-	alloc_unbound.remote_dom = dev->otherend_id;
+	alloc_unbound.remote_dom = xenbus_get_otherend_id(dev);
 
 	err = HYPERVISOR_event_channel_op(EVTCHNOP_alloc_unbound,
 					  &alloc_unbound);
@@ -279,7 +237,7 @@ int xenbus_alloc_evtchn(struct xenbus_de
 EXPORT_SYMBOL(xenbus_alloc_evtchn);
 
 
-int xenbus_free_evtchn(struct xenbus_device *dev, int port)
+int xenbus_free_evtchn(device_t dev, int port)
 {
 	struct evtchn_close close;
 	int err;

Modified: user/kmacy/HEAD_fast_multi_xmit/sys/xen/xenbus/xenbus_comms.c
==============================================================================
--- user/kmacy/HEAD_fast_multi_xmit/sys/xen/xenbus/xenbus_comms.c	Fri Dec  5 07:42:54 2008	(r185629)
+++ user/kmacy/HEAD_fast_multi_xmit/sys/xen/xenbus/xenbus_comms.c	Fri Dec  5 07:43:51 2008	(r185630)
@@ -31,8 +31,8 @@
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD$");
 
-#include <sys/types.h>

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***


More information about the svn-src-user mailing list