diff options
Diffstat (limited to 'emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-HostDrivers-VBoxNetFlt-freebsd-VBoxNetFlt-freebsd.c')
-rw-r--r-- | emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-HostDrivers-VBoxNetFlt-freebsd-VBoxNetFlt-freebsd.c | 95 |
1 files changed, 68 insertions, 27 deletions
diff --git a/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-HostDrivers-VBoxNetFlt-freebsd-VBoxNetFlt-freebsd.c b/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-HostDrivers-VBoxNetFlt-freebsd-VBoxNetFlt-freebsd.c index 185931e4f504..6cb5a1ebd30c 100644 --- a/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-HostDrivers-VBoxNetFlt-freebsd-VBoxNetFlt-freebsd.c +++ b/emulators/virtualbox-ose-kmod-legacy/files/patch-src-VBox-HostDrivers-VBoxNetFlt-freebsd-VBoxNetFlt-freebsd.c @@ -1,31 +1,72 @@ -The attached patch fixes a kernel crash on FreeBSD 10-CURRENT hosts -with VIMAGE enabled when a VM is powered off. +Add VLAN trunking support to vboxnetflt -Submitted by: Mikolaj Golub <trociny at freebsd.org> ---- src/VBox/HostDrivers/VBoxNetFlt/freebsd/VBoxNetFlt-freebsd.c 2012-03-13 15:15:44.000000000 +0200 -+++ src/VBox/HostDrivers/VBoxNetFlt/freebsd/VBoxNetFlt-freebsd.c 2012-04-01 13:43:02.000000000 +0300 -@@ -651,13 +651,13 @@ bool vboxNetFltOsMaybeRediscovered(PVBOX - ng_rmnode_self(pThis->u.s.node); - pThis->u.s.node = NULL; - } -+ VBOXCURVNET_RESTORE(); +See: http://lists.freebsd.org/pipermail/freebsd-emulation/2012-April/009698.html +See: http://lists.freebsd.org/pipermail/freebsd-emulation/2013-May/010605.html +Submitted by: Landon J Fuller <landonf at plausible.coop> +--- ./src/VBox/HostDrivers/VBoxNetFlt/freebsd/VBoxNetFlt-freebsd.c.orig 2013-04-12 06:38:11.000000000 -0400 ++++ ./src/VBox/HostDrivers/VBoxNetFlt/freebsd/VBoxNetFlt-freebsd.c 2013-05-25 20:14:52.152180452 -0400 +@@ -51,6 +51,7 @@ + #include <net/if_dl.h> + #include <net/if_types.h> + #include <net/ethernet.h> ++#include <net/if_vlan_var.h> - if (ifp0 != NULL) - { - vboxNetFltOsDeleteInstance(pThis); - vboxNetFltOsInitInstance(pThis, NULL); - } -- VBOXCURVNET_RESTORE(); + #include <netgraph/ng_message.h> + #include <netgraph/netgraph.h> +@@ -427,6 +428,8 @@ + 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; - return !ASMAtomicUoReadBool(&pThis->fDisconnectedFromHost); - } -@@ -671,8 +671,10 @@ void vboxNetFltOsDeleteInstance(PVBOXNET - mtx_destroy(&pThis->u.s.inq.ifq_mtx); - mtx_destroy(&pThis->u.s.outq.ifq_mtx); + VBOXCURVNET_SET(ifp->if_vnet); +@@ -439,6 +442,19 @@ + if (m == NULL) + break; -+ VBOXCURVNET_SET_FROM_UCRED(); - if (pThis->u.s.node != NULL) - ng_rmnode_self(pThis->u.s.node); -+ VBOXCURVNET_RESTORE(); - pThis->u.s.node = NULL; - } ++ /* 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++; +@@ -453,6 +469,27 @@ + 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 |