Index: emulators/virtualbox-ose/Makefile =================================================================== --- emulators/virtualbox-ose/Makefile +++ emulators/virtualbox-ose/Makefile @@ -3,6 +3,7 @@ PORTNAME= virtualbox-ose PORTVERSION= 6.1.18 +PORTREVERSION= 1 CATEGORIES= emulators MASTER_SITES= https://download.virtualbox.org/virtualbox/${PORTVERSION}/ DISTFILES= VirtualBox-${PORTVERSION}${EXTRACT_SUFX} ${GUESTADDITIONS} Index: emulators/virtualbox-ose/files/patch-src-VBox-HostDrivers-VBoxNetFlt-freebsd-VBoxNetFlt-freebsd.c =================================================================== --- emulators/virtualbox-ose/files/patch-src-VBox-HostDrivers-VBoxNetFlt-freebsd-VBoxNetFlt-freebsd.c +++ emulators/virtualbox-ose/files/patch-src-VBox-HostDrivers-VBoxNetFlt-freebsd-VBoxNetFlt-freebsd.c @@ -1,249 +1,32 @@ ---- src/VBox/HostDrivers/VBoxNetFlt/freebsd/VBoxNetFlt-freebsd.c.orig 2019-04-16 10:16:39 UTC +--- src/VBox/HostDrivers/VBoxNetFlt/freebsd/VBoxNetFlt-freebsd.c.orig 2021-03-18 03:47:00 UTC +++ src/VBox/HostDrivers/VBoxNetFlt/freebsd/VBoxNetFlt-freebsd.c -@@ -52,6 +52,7 @@ - #include - #include - #include -+#include - - #include - #include -@@ -73,6 +74,7 @@ - - #define VBOXNETFLT_OS_SPECFIC 1 - #include "../VBoxNetFltInternal.h" -+#include "freebsd/the-freebsd-kernel.h" - - static int vboxnetflt_modevent(struct module *, int, void *); - static ng_constructor_t ng_vboxnetflt_constructor; -@@ -436,6 +438,8 @@ static void vboxNetFltFreeBSDinput(void *arg, int pend - struct ifnet *ifp = pThis->u.s.ifp; - unsigned int cSegs = 0; - bool fDropIt = false, fActive; -+ bool is_vl_tagged = false; -+ uint16_t vl_tag; - PINTNETSG pSG; - - VBOXCURVNET_SET(ifp->if_vnet); -@@ -448,6 +452,19 @@ static void vboxNetFltFreeBSDinput(void *arg, int pend - if (m == NULL) - break; - -+ /* Prepend a VLAN header for consumption by the virtual switch */ -+ if (m->m_flags & M_VLANTAG) { -+ vl_tag = m->m_pkthdr.ether_vtag; -+ is_vl_tagged = true; -+ -+ m = ether_vlanencap(m, m->m_pkthdr.ether_vtag); -+ if (m == NULL) { -+ printf("vboxflt: unable to prepend VLAN header\n"); -+ break; -+ } -+ m->m_flags &= ~M_VLANTAG; -+ } -+ - for (m0 = m; m0 != NULL; m0 = m0->m_next) - if (m0->m_len > 0) - cSegs++; -@@ -462,6 +479,27 @@ static void vboxNetFltFreeBSDinput(void *arg, int pend - vboxNetFltFreeBSDMBufToSG(pThis, m, pSG, cSegs, 0); - fDropIt = pThis->pSwitchPort->pfnRecv(pThis->pSwitchPort, NULL /* pvIf */, pSG, INTNETTRUNKDIR_WIRE); - RTMemTmpFree(pSG); -+ -+ /* Restore the VLAN flags before re-injecting the packet */ -+ if (is_vl_tagged && !fDropIt) { -+ struct ether_vlan_header *vl_hdr; -+ -+ /* This shouldn't fail, as the header was just prepended */ -+ if (m->m_len < sizeof(*vl_hdr) && (m = m_pullup(m, sizeof(*vl_hdr))) == NULL) { -+ printf("vboxflt: unable to pullup VLAN header\n"); -+ m_freem(m); -+ break; -+ } -+ -+ /* Copy the MAC dhost/shost over the 802.1q field */ -+ vl_hdr = mtod(m, struct ether_vlan_header *); -+ bcopy((char *)vl_hdr, (char *)vl_hdr + ETHER_VLAN_ENCAP_LEN, ETHER_HDR_LEN - ETHER_TYPE_LEN); -+ m_adj(m, ETHER_VLAN_ENCAP_LEN); -+ -+ m->m_pkthdr.ether_vtag = vl_tag; -+ m->m_flags |= M_VLANTAG; -+ } -+ - if (fDropIt) - m_freem(m); - else -@@ -521,6 +559,7 @@ static void vboxNetFltFreeBSDoutput(void *arg, int pen - */ - int vboxNetFltPortOsXmit(PVBOXNETFLTINS pThis, void *pvIfData, PINTNETSG pSG, uint32_t fDst) - { -+ IPRT_FREEBSD_SAVE_EFL_AC(); - NOREF(pvIfData); - - void (*input_f)(struct ifnet *, struct mbuf *); -@@ -537,10 +576,16 @@ int vboxNetFltPortOsXmit(PVBOXNETFLTINS pThis, void *p +@@ -361,7 +361,14 @@ static int ng_vboxnetflt_rcvdata(hook_p hook, item_p i { - m = vboxNetFltFreeBSDSGMBufFromSG(pThis, pSG); - if (m == NULL) -+ { -+ IPRT_FREEBSD_RESTORE_EFL_AC(); - return VERR_NO_MEMORY; -+ } - m = m_pullup(m, ETHER_HDR_LEN); - if (m == NULL) -+ { -+ IPRT_FREEBSD_RESTORE_EFL_AC(); - return VERR_NO_MEMORY; -+ } - - m->m_flags |= M_PKTHDR; - ether_output_frame(ifp, m); -@@ -550,10 +595,16 @@ int vboxNetFltPortOsXmit(PVBOXNETFLTINS pThis, void *p - { - m = vboxNetFltFreeBSDSGMBufFromSG(pThis, pSG); - if (m == NULL) -+ { -+ IPRT_FREEBSD_RESTORE_EFL_AC(); - return VERR_NO_MEMORY; -+ } - m = m_pullup(m, ETHER_HDR_LEN); - if (m == NULL) -+ { -+ IPRT_FREEBSD_RESTORE_EFL_AC(); - return VERR_NO_MEMORY; -+ } - /* - * Delivering packets to the host will be captured by the - * input hook. Tag the packet with a mbuf tag so that we -@@ -564,6 +615,7 @@ int vboxNetFltPortOsXmit(PVBOXNETFLTINS pThis, void *p - if (mtag == NULL) + if (mtag != NULL || !fActive) { ++#if __FreeBSD_version >= 1300049 ++ struct epoch_tracker et; ++ NET_EPOCH_ENTER(et); ++#endif + ether_demux(ifp, m); ++#if __FreeBSD_version >= 1300049 ++ NET_EPOCH_EXIT(et); ++#endif + if (fActive) + vboxNetFltRelease(pThis, true /*fBusy*/); + VBOXCURVNET_RESTORE(); +@@ -465,7 +472,14 @@ static void vboxNetFltFreeBSDinput(void *arg, int pend + if (fDropIt) m_freem(m); -+ IPRT_FREEBSD_RESTORE_EFL_AC(); - return VERR_NO_MEMORY; - } - -@@ -574,6 +626,7 @@ int vboxNetFltPortOsXmit(PVBOXNETFLTINS pThis, void *p - ifp->if_input(ifp, m); + else ++#if __FreeBSD_version >= 1300049 ++ struct epoch_tracker et; ++ NET_EPOCH_ENTER(et); ++#endif + ether_demux(ifp, m); ++#if __FreeBSD_version >= 1300049 ++ NET_EPOCH_EXIT(et); ++#endif } + vboxNetFltRelease(pThis, true /* fBusy */); VBOXCURVNET_RESTORE(); -+ IPRT_FREEBSD_RESTORE_EFL_AC(); - return VINF_SUCCESS; - } - -@@ -586,6 +639,7 @@ static bool vboxNetFltFreeBsdIsPromiscuous(PVBOXNETFLT - - int vboxNetFltOsInitInstance(PVBOXNETFLTINS pThis, void *pvContext) - { -+ IPRT_FREEBSD_SAVE_EFL_AC(); - char nam[NG_NODESIZ]; - struct ifnet *ifp; - node_p node; -@@ -594,7 +648,10 @@ int vboxNetFltOsInitInstance(PVBOXNETFLTINS pThis, voi - NOREF(pvContext); - ifp = ifunit(pThis->szName); - if (ifp == NULL) -+ { -+ IPRT_FREEBSD_RESTORE_EFL_AC(); - return VERR_INTNET_FLT_IF_NOT_FOUND; -+ } - - /* Create a new netgraph node for this instance */ - if (ng_make_node_common(&ng_vboxnetflt_typestruct, &node) != 0) -@@ -638,12 +695,14 @@ int vboxNetFltOsInitInstance(PVBOXNETFLTINS pThis, voi - vboxNetFltRelease(pThis, true /*fBusy*/); - } - VBOXCURVNET_RESTORE(); -+ IPRT_FREEBSD_RESTORE_EFL_AC(); - - return VINF_SUCCESS; - } - - bool vboxNetFltOsMaybeRediscovered(PVBOXNETFLTINS pThis) - { -+ IPRT_FREEBSD_SAVE_EFL_AC(); - struct ifnet *ifp, *ifp0; - - ifp = ASMAtomicUoReadPtrT(&pThis->u.s.ifp, struct ifnet *); -@@ -660,6 +719,7 @@ bool vboxNetFltOsMaybeRediscovered(PVBOXNETFLTINS pThi - pThis->u.s.node = NULL; - } - VBOXCURVNET_RESTORE(); -+ IPRT_FREEBSD_RESTORE_EFL_AC(); - - if (ifp0 != NULL) - { -@@ -672,6 +732,7 @@ bool vboxNetFltOsMaybeRediscovered(PVBOXNETFLTINS pThi - - void vboxNetFltOsDeleteInstance(PVBOXNETFLTINS pThis) - { -+ IPRT_FREEBSD_SAVE_EFL_AC(); - - taskqueue_drain(taskqueue_fast, &pThis->u.s.tskin); - taskqueue_drain(taskqueue_fast, &pThis->u.s.tskout); -@@ -684,6 +745,7 @@ void vboxNetFltOsDeleteInstance(PVBOXNETFLTINS pThis) - ng_rmnode_self(pThis->u.s.node); - VBOXCURVNET_RESTORE(); - pThis->u.s.node = NULL; -+ IPRT_FREEBSD_RESTORE_EFL_AC(); - } - - int vboxNetFltOsPreInitInstance(PVBOXNETFLTINS pThis) -@@ -697,6 +759,7 @@ int vboxNetFltOsPreInitInstance(PVBOXNETFLTINS pThis) - - void vboxNetFltPortOsSetActive(PVBOXNETFLTINS pThis, bool fActive) - { -+ IPRT_FREEBSD_SAVE_EFL_AC(); - struct ifnet *ifp; - struct ifreq ifreq; - int error; -@@ -730,7 +793,10 @@ void vboxNetFltPortOsSetActive(PVBOXNETFLTINS pThis, b - NG_MKMESSAGE(msg, NGM_GENERIC_COOKIE, NGM_CONNECT, - sizeof(struct ngm_connect), M_NOWAIT); - if (msg == NULL) -+ { -+ IPRT_FREEBSD_RESTORE_EFL_AC(); - return; -+ } - con = (struct ngm_connect *)msg->data; - snprintf(con->path, NG_PATHSIZ, "vboxnetflt_%s:", ifp->if_xname); - strlcpy(con->ourhook, "lower", NG_HOOKSIZ); -@@ -744,7 +810,10 @@ void vboxNetFltPortOsSetActive(PVBOXNETFLTINS pThis, b - NG_MKMESSAGE(msg, NGM_GENERIC_COOKIE, NGM_CONNECT, - sizeof(struct ngm_connect), M_NOWAIT); - if (msg == NULL) -+ { -+ IPRT_FREEBSD_RESTORE_EFL_AC(); - return; -+ } - con = (struct ngm_connect *)msg->data; - snprintf(con->path, NG_PATHSIZ, "vboxnetflt_%s:", - ifp->if_xname); -@@ -767,7 +836,10 @@ void vboxNetFltPortOsSetActive(PVBOXNETFLTINS pThis, b - NG_MKMESSAGE(msg, NGM_GENERIC_COOKIE, NGM_RMHOOK, - sizeof(struct ngm_rmhook), M_NOWAIT); - if (msg == NULL) -+ { -+ IPRT_FREEBSD_RESTORE_EFL_AC(); - return; -+ } - rm = (struct ngm_rmhook *)msg->data; - strlcpy(rm->ourhook, "input", NG_HOOKSIZ); - NG_SEND_MSG_PATH(error, node, msg, path, 0); -@@ -778,12 +850,16 @@ void vboxNetFltPortOsSetActive(PVBOXNETFLTINS pThis, b - NG_MKMESSAGE(msg, NGM_GENERIC_COOKIE, NGM_RMHOOK, - sizeof(struct ngm_rmhook), M_NOWAIT); - if (msg == NULL) -+ { -+ IPRT_FREEBSD_RESTORE_EFL_AC(); - return; -+ } - rm = (struct ngm_rmhook *)msg->data; - strlcpy(rm->ourhook, "output", NG_HOOKSIZ); - NG_SEND_MSG_PATH(error, node, msg, path, 0); - } - VBOXCURVNET_RESTORE(); -+ IPRT_FREEBSD_RESTORE_EFL_AC(); - } - - int vboxNetFltOsDisconnectIt(PVBOXNETFLTINS pThis)