Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 26 Jan 2011 16:04:16 +0200
From:      Mikolaj Golub <to.my.trociny@gmail.com>
To:        "Bjoern A. Zeeb" <bzeeb-lists@lists.zabbadoz.net>
Cc:        freebsd-emulation@freebsd.org, FreeBSD virtualization mailing list <freebsd-virtualization@freebsd.org>
Subject:   Re: VirtualBox + VIMAGE
Message-ID:  <86aainkbhb.fsf@zhuzha.ua1>
In-Reply-To: <20110126091038.C3489@maildrop.int.zabbadoz.net> (Bjoern A. Zeeb's message of "Wed, 26 Jan 2011 09:15:46 %2B0000 (UTC)")
References:  <86oc77heqk.fsf@kopusha.home.net> <4D3D2DE9.2060004@freebsd.org> <86tygwy9p0.fsf@kopusha.home.net> <20110126091038.C3489@maildrop.int.zabbadoz.net>

next in thread | previous in thread | raw e-mail | index | archive | help
--=-=-=


On Wed, 26 Jan 2011 09:15:46 +0000 (UTC) Bjoern A. Zeeb wrote:

 BAZ> I think you should wrap the CURVNET changes in __FreeBSD_version
 BAZ> checks so that the port, should it run elsewhere or on older FreeBSDs
 BAZ> (if it runs there) not trouble people having to patch it away.

 BAZ> #if defined(__FreeBSD_version) && __FreeBSD_version >= 800500
 BAZ> #endif

 BAZ> might be a save bet.

Thanks. Something like in the patch below?

Note, I have not run this version yet. Will test it tonight or tomorrow.

-- 
Mikolaj Golub


--=-=-=
Content-Type: text/x-patch
Content-Disposition: attachment; filename=VirtualBox-3.2.12.VIMAGE.2.patch

diff -rpu VirtualBox-3.2.12_OSE.orig/src/VBox/HostDrivers/VBoxNetFlt/freebsd/Makefile VirtualBox-3.2.12_OSE/src/VBox/HostDrivers/VBoxNetFlt/freebsd/Makefile
--- VirtualBox-3.2.12_OSE.orig/src/VBox/HostDrivers/VBoxNetFlt/freebsd/Makefile	2010-12-01 19:09:33.000000000 +0200
+++ VirtualBox-3.2.12_OSE/src/VBox/HostDrivers/VBoxNetFlt/freebsd/Makefile	2011-01-26 15:47:27.000000000 +0200
@@ -26,6 +26,10 @@ CFLAGS += -DRT_OS_FREEBSD -DIN_RING0 -DI
  CFLAGS += -DRT_ARCH_AMD64
 .endif
 
+.if defined(VIMAGE)
+ CFLAGS += -DVIMAGE
+.endif
+
 SRCS = \
 	VBoxNetFlt-freebsd.c \
 	VBoxNetFlt.c \
diff -rpu VirtualBox-3.2.12_OSE.orig/src/VBox/HostDrivers/VBoxNetFlt/freebsd/VBoxNetFlt-freebsd.c VirtualBox-3.2.12_OSE/src/VBox/HostDrivers/VBoxNetFlt/freebsd/VBoxNetFlt-freebsd.c
--- VirtualBox-3.2.12_OSE.orig/src/VBox/HostDrivers/VBoxNetFlt/freebsd/VBoxNetFlt-freebsd.c	2010-12-01 19:09:33.000000000 +0200
+++ VirtualBox-3.2.12_OSE/src/VBox/HostDrivers/VBoxNetFlt/freebsd/VBoxNetFlt-freebsd.c	2011-01-26 15:56:41.000000000 +0200
@@ -97,6 +97,21 @@ static int        ng_vboxnetflt_mod_even
 /** mbuf packet tag */
 #define PACKET_TAG_VBOX        128
 
+#if defined(__FreeBSD_version) && __FreeBSD_version >= 800500
+#include <sys/jail.h>
+#include <net/vnet.h>
+
+#define VBOXCURVNET_SET(arg)		CURVNET_SET_QUIET(arg)
+#define VBOXCURVNET_SET_FROM_UCRED()	VBOXCURVNET_SET(CRED_TO_VNET(curthread->td_ucred))
+#define VBOXCURVNET_RESTORE()		CURVNET_RESTORE()
+
+#else
+
+#define VBOXCURVNET_SET(arg)
+#define VBOXCURVNET_SET_FROM_UCRED()
+#define VBOXCURVNET_RESTORE()
+#endif
+
 /*
  * Netgraph command list, we don't support any
  * additional commands.
@@ -322,6 +337,7 @@ static int ng_vboxnetflt_rcvdata(hook_p 
     struct m_tag *mtag;
     bool fActive;
 
+    VBOXCURVNET_SET(ifp->if_vnet);
     fActive = vboxNetFltTryRetainBusyActive(pThis);
 
     NGI_GET_M(item, m);
@@ -346,6 +362,7 @@ static int ng_vboxnetflt_rcvdata(hook_p 
             ether_demux(ifp, m);
             if (fActive)
                 vboxNetFltRelease(pThis, true /*fBusy*/);
+            VBOXCURVNET_RESTORE();
             return (0);
         }
         mtx_lock_spin(&pThis->u.s.inq.ifq_mtx);
@@ -363,6 +380,7 @@ static int ng_vboxnetflt_rcvdata(hook_p 
             int rc = ether_output_frame(ifp, m);
             if (fActive)
                 vboxNetFltRelease(pThis, true /*fBusy*/);
+            VBOXCURVNET_RESTORE();
             return rc;
         }
         mtx_lock_spin(&pThis->u.s.outq.ifq_mtx);
@@ -377,6 +395,7 @@ static int ng_vboxnetflt_rcvdata(hook_p 
 
     if (fActive)
         vboxNetFltRelease(pThis, true /*fBusy*/);
+    VBOXCURVNET_RESTORE();
     return (0);
 }
 
@@ -409,6 +428,7 @@ static void vboxNetFltFreeBSDinput(void 
     bool fDropIt = false, fActive;
     PINTNETSG pSG;
 
+    VBOXCURVNET_SET(ifp->if_vnet);
     vboxNetFltRetain(pThis, true /* fBusy */);
     for (;;)
     {
@@ -438,6 +458,7 @@ static void vboxNetFltFreeBSDinput(void 
             ether_demux(ifp, m);
     }
     vboxNetFltRelease(pThis, true /* fBusy */);
+    VBOXCURVNET_RESTORE();
 }
 
 /**
@@ -452,6 +473,7 @@ static void vboxNetFltFreeBSDoutput(void
     bool fDropIt = false, fActive;
     PINTNETSG pSG;
 
+    VBOXCURVNET_SET(ifp->if_vnet);
     vboxNetFltRetain(pThis, true /* fBusy */);
     for (;;)
     {
@@ -481,6 +503,7 @@ static void vboxNetFltFreeBSDoutput(void
             ether_output_frame(ifp, m);
     }
     vboxNetFltRelease(pThis, true /* fBusy */);
+    VBOXCURVNET_RESTORE();
 }
 
 /**
@@ -498,6 +521,7 @@ int vboxNetFltPortOsXmit(PVBOXNETFLTINS 
     int error;
 
     ifp = (void *)ASMAtomicUoReadPtr((void * volatile *)&pThis->u.s.ifp);
+    VBOXCURVNET_SET(ifp->if_vnet);
 
     if (fDst & INTNETTRUNKDIR_WIRE)
     {
@@ -539,6 +563,7 @@ int vboxNetFltPortOsXmit(PVBOXNETFLTINS 
         m->m_pkthdr.rcvif = ifp;
         ifp->if_input(ifp, m);
     }
+    VBOXCURVNET_RESTORE();
     return VINF_SUCCESS;
 }
 
@@ -556,6 +581,7 @@ int vboxNetFltOsInitInstance(PVBOXNETFLT
     node_p node;
     RTSPINLOCKTMP Tmp = RTSPINLOCKTMP_INITIALIZER;
 
+    VBOXCURVNET_SET_FROM_UCRED();
     NOREF(pvContext);
     ifp = ifunit(pThis->szName);
     if (ifp == NULL)
@@ -602,6 +628,7 @@ int vboxNetFltOsInitInstance(PVBOXNETFLT
         pThis->pSwitchPort->pfnReportNoPreemptDsts(pThis->pSwitchPort, 0 /* none */);
         vboxNetFltRelease(pThis, true /*fBusy*/);
     }
+    VBOXCURVNET_RESTORE();
 
     return VINF_SUCCESS;
 }
@@ -611,6 +638,7 @@ bool vboxNetFltOsMaybeRediscovered(PVBOX
     struct ifnet *ifp, *ifp0;
 
     ifp = (struct ifnet *)ASMAtomicUoReadPtr((void * volatile *)&pThis->u.s.ifp);
+    VBOXCURVNET_SET(ifp->if_vnet);
     /*
      * Attempt to check if the interface is still there and re-initialize if
      * something has changed.
@@ -628,6 +656,7 @@ bool vboxNetFltOsMaybeRediscovered(PVBOX
         vboxNetFltOsDeleteInstance(pThis);
         vboxNetFltOsInitInstance(pThis, NULL);
     }
+    VBOXCURVNET_RESTORE()
 
     return !ASMAtomicUoReadBool(&pThis->fDisconnectedFromHost);
 }
@@ -669,6 +698,7 @@ void vboxNetFltPortOsSetActive(PVBOXNETF
     Log(("%s: fActive:%d\n", __func__, fActive));
 
     ifp = (struct ifnet *)ASMAtomicUoReadPtr((void * volatile *)&pThis->u.s.ifp);
+    VBOXCURVNET_SET(ifp->if_vnet);
     node = (node_p)ASMAtomicUoReadPtr((void * volatile *)&pThis->u.s.node);
 
     memset(&ifreq, 0, sizeof(struct ifreq));
@@ -742,6 +772,7 @@ void vboxNetFltPortOsSetActive(PVBOXNETF
         strlcpy(rm->ourhook, "output", NG_HOOKSIZ);
         NG_SEND_MSG_PATH(error, node, msg, path, 0);
     }
+    VBOXCURVNET_RESTORE();
 }
 
 int vboxNetFltOsDisconnectIt(PVBOXNETFLTINS pThis)

--=-=-=--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?86aainkbhb.fsf>