Date: Fri, 5 Dec 2008 07:43:51 +0000 (UTC) From: Kip Macy <kmacy@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r185630 - in user/kmacy/HEAD_fast_multi_xmit/sys: net xen xen/xenbus Message-ID: <200812050743.mB57hpZ0047100@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
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", - ¤t_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 ***
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200812050743.mB57hpZ0047100>