Go to:
Gentoo Home
Documentation
Forums
Lists
Bugs
Planet
Store
Wiki
Get Gentoo!
Gentoo's Bugzilla – Attachment 780755 Details for
Bug 847097
app-emulation/virtualbox-guest-additions-6.1.34 fails to build with 5.18.0 'struct address_space_operations' has no member named 'set_page_dirty'
Home
|
New
–
[Ex]
|
Browse
|
Search
|
Privacy Policy
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
backported virtualbox patch for vbox modules 6.1.34 and linux 5.18
virtualbox-modules-6.1.34-linux-5.18.patch (text/plain), 54.03 KB, created by
Mike Pagano
on 2022-05-25 14:37:32 UTC
(
hide
)
Description:
backported virtualbox patch for vbox modules 6.1.34 and linux 5.18
Filename:
MIME Type:
Creator:
Mike Pagano
Created:
2022-05-25 14:37:32 UTC
Size:
54.03 KB
patch
obsolete
>--- a/vboxnetflt/linux/VBoxNetFlt-linux.c 2022-05-25 10:22:28.186525589 -0400 >+++ b/vboxnetflt/linux/VBoxNetFlt-linux.c 2022-05-25 10:26:44.640963985 -0400 >@@ -1,10 +1,9 @@ >-/* $Id: VBoxNetFlt-linux.c 150609 2022-03-21 21:07:44Z vgalitsy $ */ >+/* $Id$ */ > /** @file > * VBoxNetFlt - Network Filter Driver (Host), Linux Specific Code. > */ >- > /* >- * Copyright (C) 2006-2020 Oracle Corporation >+ * Copyright (C) 2006-2022 Oracle Corporation > * > * This file is part of VirtualBox Open Source Edition (OSE), as > * available from http://www.virtualbox.org. This file is free software; >@@ -23,8 +22,6 @@ > * You may elect to license modified versions of this file under the > * terms and conditions of either the GPL or the CDDL or both. > */ >- >- > /********************************************************************************************************************************* > * Header Files * > *********************************************************************************************************************************/ >@@ -54,7 +51,6 @@ > #include <net/ipv6.h> > #include <net/if_inet6.h> > #include <net/addrconf.h> >- > #include <VBox/log.h> > #include <VBox/err.h> > #include <VBox/intnetinline.h> >@@ -72,17 +68,13 @@ > #include <iprt/mp.h> > #include <iprt/mem.h> > #include <iprt/time.h> >- > #define VBOXNETFLT_OS_SPECFIC 1 > #include "../VBoxNetFltInternal.h" >- > typedef struct VBOXNETFLTNOTIFIER { > struct notifier_block Notifier; > PVBOXNETFLTINS pThis; > } VBOXNETFLTNOTIFIER; > typedef struct VBOXNETFLTNOTIFIER *PVBOXNETFLTNOTIFIER; >- >- > /********************************************************************************************************************************* > * Defined Constants And Macros * > *********************************************************************************************************************************/ >@@ -91,13 +83,11 @@ typedef struct VBOXNETFLTNOTIFIER *PVBOX > #ifndef VBOXNETFLT_LINUX_NO_XMIT_QUEUE > # define VBOX_FLT_XT_TO_INST(pXT) RT_FROM_MEMBER(pXT, VBOXNETFLTINS, u.s.XmitTask) > #endif >- > #if RTLNX_VER_MIN(3,11,0) > # define VBOX_NETDEV_NOTIFIER_INFO_TO_DEV(ptr) netdev_notifier_info_to_dev(ptr) > #else > # define VBOX_NETDEV_NOTIFIER_INFO_TO_DEV(ptr) ((struct net_device *)ptr) > #endif >- > #if RTLNX_VER_MIN(3,5,0) > # define VBOX_SKB_KMAP_FRAG(frag) kmap_atomic(skb_frag_page(frag)) > # define VBOX_SKB_KUNMAP_FRAG(vaddr) kunmap_atomic(vaddr) >@@ -110,13 +100,11 @@ typedef struct VBOXNETFLTNOTIFIER *PVBOX > # define VBOX_SKB_KUNMAP_FRAG(vaddr) kunmap_atomic(vaddr, KM_SKB_DATA_SOFTIRQ) > # endif > #endif >- > #if RTLNX_VER_MIN(2,6,34) > # define VBOX_NETDEV_NAME(dev) netdev_name(dev) > #else > # define VBOX_NETDEV_NAME(dev) ((dev)->reg_state != NETREG_REGISTERED ? "(unregistered net_device)" : (dev)->name) > #endif >- > #if RTLNX_VER_MIN(2,6,25) > # define VBOX_IPV4_IS_LOOPBACK(addr) ipv4_is_loopback(addr) > # define VBOX_IPV4_IS_LINKLOCAL_169(addr) ipv4_is_linklocal_169(addr) >@@ -124,7 +112,6 @@ typedef struct VBOXNETFLTNOTIFIER *PVBOX > # define VBOX_IPV4_IS_LOOPBACK(addr) ((addr & htonl(IN_CLASSA_NET)) == htonl(0x7f000000)) > # define VBOX_IPV4_IS_LINKLOCAL_169(addr) ((addr & htonl(IN_CLASSB_NET)) == htonl(0xa9fe0000)) > #endif >- > #if RTLNX_VER_MIN(2,6,22) > # define VBOX_SKB_RESET_NETWORK_HDR(skb) skb_reset_network_header(skb) > # define VBOX_SKB_RESET_MAC_HDR(skb) skb_reset_mac_header(skb) >@@ -134,7 +121,6 @@ typedef struct VBOXNETFLTNOTIFIER *PVBOX > # define VBOX_SKB_RESET_MAC_HDR(skb) skb->mac.raw = skb->data > # define VBOX_SKB_CSUM_OFFSET(skb) skb->csum > #endif >- > #if RTLNX_VER_MIN(2,6,19) > # define VBOX_SKB_CHECKSUM_HELP(skb) skb_checksum_help(skb) > #else >@@ -152,68 +138,52 @@ typedef struct VBOXNETFLTNOTIFIER *PVBOX > # define qstats stats > # endif > #endif >- > #if RTLNX_VER_MIN(3,20,0) || RTLNX_RHEL_RANGE(7,2, 8,0) || RTLNX_RHEL_RANGE(6,8, 7,0) > # define VBOX_HAVE_SKB_VLAN > #endif >- > #ifdef VBOX_HAVE_SKB_VLAN > # define vlan_tx_tag_get(skb) skb_vlan_tag_get(skb) > # define vlan_tx_tag_present(skb) skb_vlan_tag_present(skb) > #endif >- > #ifndef NET_IP_ALIGN > # define NET_IP_ALIGN 2 > #endif >- > #if 1 > /** Create scatter / gather segments for fragments. When not used, we will > * linearize the socket buffer before creating the internal networking SG. */ > # define VBOXNETFLT_SG_SUPPORT 1 > #endif >- > #if RTLNX_VER_MIN(2,6,18) >- > /** Indicates that the linux kernel may send us GSO frames. */ > # define VBOXNETFLT_WITH_GSO 1 >- > /** This enables or disables the transmitting of GSO frame from the internal > * network and to the host. */ > # define VBOXNETFLT_WITH_GSO_XMIT_HOST 1 >- > # if 0 /** @todo This is currently disable because it causes performance loss of 5-10%. */ > /** This enables or disables the transmitting of GSO frame from the internal > * network and to the wire. */ > # define VBOXNETFLT_WITH_GSO_XMIT_WIRE 1 > # endif >- > /** This enables or disables the forwarding/flooding of GSO frame from the host > * to the internal network. */ > # define VBOXNETFLT_WITH_GSO_RECV 1 >- > #endif /* RTLNX_VER_MIN(2,6,18) */ >- > #if RTLNX_VER_MIN(2,6,29) > /** This enables or disables handling of GSO frames coming from the wire (GRO). */ > # define VBOXNETFLT_WITH_GRO 1 > #endif >- > /* > * GRO support was backported to RHEL 5.4 > */ > #if RTLNX_RHEL_MAJ_PREREQ(5, 4) > # define VBOXNETFLT_WITH_GRO 1 > #endif >- >- > /********************************************************************************************************************************* > * Internal Functions * > *********************************************************************************************************************************/ > static int __init VBoxNetFltLinuxInit(void); > static void __exit VBoxNetFltLinuxUnload(void); > static void vboxNetFltLinuxForwardToIntNet(PVBOXNETFLTINS pThis, struct sk_buff *pBuf); >- >- > /********************************************************************************************************************************* > * Global Variables * > *********************************************************************************************************************************/ >@@ -221,37 +191,28 @@ static void vboxNetFltLinuxForwardTo > * The (common) global data. > */ > static VBOXNETFLTGLOBALS g_VBoxNetFltGlobals; >- > module_init(VBoxNetFltLinuxInit); > module_exit(VBoxNetFltLinuxUnload); >- > MODULE_AUTHOR(VBOX_VENDOR); > MODULE_DESCRIPTION(VBOX_PRODUCT " Network Filter Driver"); > MODULE_LICENSE("GPL"); > #ifdef MODULE_VERSION > MODULE_VERSION(VBOX_VERSION_STRING " r" RT_XSTR(VBOX_SVN_REV) " (" RT_XSTR(INTNETTRUNKIFPORT_VERSION) ")"); > #endif >- >- > #if RTLNX_VER_MAX(2,6,12) && defined(LOG_ENABLED) > unsigned dev_get_flags(const struct net_device *dev) > { > unsigned flags; >- > flags = (dev->flags & ~(IFF_PROMISC | > IFF_ALLMULTI | > IFF_RUNNING)) | > (dev->gflags & (IFF_PROMISC | > IFF_ALLMULTI)); >- > if (netif_running(dev) && netif_carrier_ok(dev)) > flags |= IFF_RUNNING; >- > return flags; > } > #endif /* RTLNX_VER_MAX(2,6,12) */ >- >- > /** > * Initialize module. > * >@@ -267,7 +228,6 @@ static int __init VBoxNetFltLinuxInit(vo > if (RT_SUCCESS(rc)) > { > Log(("VBoxNetFltLinuxInit\n")); >- > /* > * Initialize the globals and connect to the support driver. > * >@@ -281,18 +241,14 @@ static int __init VBoxNetFltLinuxInit(vo > LogRel(("VBoxNetFlt: Successfully started.\n")); > return 0; > } >- > LogRel(("VBoxNetFlt: failed to initialize device extension (rc=%d)\n", rc)); > RTR0Term(); > } > else > LogRel(("VBoxNetFlt: failed to initialize IPRT (rc=%d)\n", rc)); >- > memset(&g_VBoxNetFltGlobals, 0, sizeof(g_VBoxNetFltGlobals)); > return -RTErrConvertToErrno(rc); > } >- >- > /** > * Unload the module. > * >@@ -303,21 +259,15 @@ static void __exit VBoxNetFltLinuxUnload > int rc; > Log(("VBoxNetFltLinuxUnload\n")); > Assert(vboxNetFltCanUnload(&g_VBoxNetFltGlobals)); >- > /* > * Undo the work done during start (in reverse order). > */ > rc = vboxNetFltTryDeleteIdcAndGlobals(&g_VBoxNetFltGlobals); > AssertRC(rc); NOREF(rc); >- > RTR0Term(); >- > memset(&g_VBoxNetFltGlobals, 0, sizeof(g_VBoxNetFltGlobals)); >- > Log(("VBoxNetFltLinuxUnload - done\n")); > } >- >- > /** > * We filter traffic from the host to the internal network > * before it reaches the NIC driver. >@@ -328,23 +278,16 @@ static void __exit VBoxNetFltLinuxUnload > * less hacky way of getting this job done. > */ > #define VBOXNETFLT_WITH_HOST2WIRE_FILTER >- > #ifdef VBOXNETFLT_WITH_HOST2WIRE_FILTER >- > # if RTLNX_VER_MAX(2,6,29) >- > typedef struct ethtool_ops OVR_OPSTYPE; > # define OVR_OPS ethtool_ops > # define OVR_XMIT pfnStartXmit >- > # else /* RTLNX_VER_MIN(2,6,29) */ >- > typedef struct net_device_ops OVR_OPSTYPE; > # define OVR_OPS netdev_ops > # define OVR_XMIT pOrgOps->ndo_start_xmit >- > # endif /* RTLNX_VER_MIN(2,6,29) */ >- > /** > * The overridden net_device_ops of the device we're attached to. > * >@@ -377,7 +320,6 @@ typedef struct VBoxNetDeviceOpsOverride > } VBOXNETDEVICEOPSOVERRIDE, *PVBOXNETDEVICEOPSOVERRIDE; > /** VBOXNETDEVICEOPSOVERRIDE::u32Magic value. */ > #define VBOXNETDEVICEOPSOVERRIDE_MAGIC UINT32_C(0x00c0ffee) >- > /** > * ndo_start_xmit wrapper that drops packets that shouldn't go to the wire > * because they belong on the internal network. >@@ -393,8 +335,6 @@ static int vboxNetFltLinuxStartXmitFilte > PCRTNETETHERHDR pEtherHdr; > PINTNETTRUNKSWPORT pSwitchPort; > uint32_t cbHdrs; >- >- > /* > * Validate the override structure. > * >@@ -402,11 +342,11 @@ static int vboxNetFltLinuxStartXmitFilte > * to be production quality code, we would have to be much more > * careful here and avoid the race. > */ >- if ( !VALID_PTR(pOverride) >+ if ( !RT_VALID_PTR(pOverride) > || pOverride->u32Magic != VBOXNETDEVICEOPSOVERRIDE_MAGIC > # if RTLNX_VER_MIN(2,6,29) >- || !VALID_PTR(pOverride->pOrgOps) >-# endif /* RTLNX_VER_MIN(2,6,29) */ >+ || !RT_VALID_PTR(pOverride->pOrgOps) >+# endif > ) > { > printk("vboxNetFltLinuxStartXmitFilter: bad override %p\n", pOverride); >@@ -414,7 +354,6 @@ static int vboxNetFltLinuxStartXmitFilte > return NETDEV_TX_OK; > } > pOverride->cTotal++; >- > /* > * Do the filtering base on the default OUI of our virtual NICs > * >@@ -426,13 +365,12 @@ static int vboxNetFltLinuxStartXmitFilte > cbHdrs = RT_MIN(cbHdrs, sizeof(abHdrBuf)); > pEtherHdr = (PCRTNETETHERHDR)skb_header_pointer(pSkb, 0, cbHdrs, &abHdrBuf[0]); > if ( pEtherHdr >- && VALID_PTR(pOverride->pVBoxNetFlt) >+ && RT_VALID_PTR(pOverride->pVBoxNetFlt) > && (pSwitchPort = pOverride->pVBoxNetFlt->pSwitchPort) != NULL >- && VALID_PTR(pSwitchPort) >+ && RT_VALID_PTR(pSwitchPort) > && cbHdrs >= 6) > { > INTNETSWDECISION enmDecision; >- > /** @todo consider reference counting, etc. */ > enmDecision = pSwitchPort->pfnPreRecv(pSwitchPort, pEtherHdr, cbHdrs, INTNETTRUNKDIR_HOST); > if (enmDecision == INTNETSWDECISION_INTNET) >@@ -442,10 +380,8 @@ static int vboxNetFltLinuxStartXmitFilte > return NETDEV_TX_OK; > } > } >- > return pOverride->OVR_XMIT(pSkb, pDev); > } >- > /** > * Hooks the device ndo_start_xmit operation of the device. > * >@@ -455,9 +391,8 @@ static int vboxNetFltLinuxStartXmitFilte > static void vboxNetFltLinuxHookDev(PVBOXNETFLTINS pThis, struct net_device *pDev) > { > PVBOXNETDEVICEOPSOVERRIDE pOverride; >- > /* Cancel override if ethtool_ops is missing (host-only case, @bugref{5712}) */ >- if (!VALID_PTR(pDev->OVR_OPS)) >+ if (!RT_VALID_PTR(pDev->OVR_OPS)) > return; > pOverride = RTMemAlloc(sizeof(*pOverride)); > if (!pOverride) >@@ -473,7 +408,6 @@ static void vboxNetFltLinuxHookDev(PVBOX > pOverride->cTotal = 0; > pOverride->cFiltered = 0; > pOverride->pVBoxNetFlt = pThis; >- > RTSpinlockAcquire(pThis->hSpinlock); /* (this isn't necessary, but so what) */ > ASMAtomicWritePtr((void * volatile *)&pDev->OVR_OPS, pOverride); > # if RTLNX_VER_MAX(2,6,29) >@@ -481,7 +415,6 @@ static void vboxNetFltLinuxHookDev(PVBOX > # endif /* RTLNX_VER_MAX(2,6,29) */ > RTSpinlockRelease(pThis->hSpinlock); > } >- > /** > * Undos what vboxNetFltLinuxHookDev did. > * >@@ -492,16 +425,15 @@ static void vboxNetFltLinuxHookDev(PVBOX > static void vboxNetFltLinuxUnhookDev(PVBOXNETFLTINS pThis, struct net_device *pDev) > { > PVBOXNETDEVICEOPSOVERRIDE pOverride; >- > RTSpinlockAcquire(pThis->hSpinlock); > if (!pDev) > pDev = ASMAtomicUoReadPtrT(&pThis->u.s.pDev, struct net_device *); >- if (VALID_PTR(pDev)) >+ if (RT_VALID_PTR(pDev)) > { > pOverride = (PVBOXNETDEVICEOPSOVERRIDE)pDev->OVR_OPS; >- if ( VALID_PTR(pOverride) >- && pOverride->u32Magic == VBOXNETDEVICEOPSOVERRIDE_MAGIC >- && VALID_PTR(pOverride->pOrgOps) >+ if ( RT_VALID_PTR(pOverride) >+ && pOverride->u32Magic == VBOXNETDEVICEOPSOVERRIDE_MAGIC >+ && RT_VALID_PTR(pOverride->pOrgOps) > ) > { > # if RTLNX_VER_MAX(2,6,29) >@@ -516,17 +448,13 @@ static void vboxNetFltLinuxUnhookDev(PVB > else > pOverride = NULL; > RTSpinlockRelease(pThis->hSpinlock); >- > if (pOverride) > { > printk("vboxnetflt: %llu out of %llu packets were not sent (directed to host)\n", pOverride->cFiltered, pOverride->cTotal); > RTMemFree(pOverride); > } > } >- > #endif /* VBOXNETFLT_WITH_HOST2WIRE_FILTER */ >- >- > /** > * Reads and retains the host interface handle. > * >@@ -537,7 +465,6 @@ DECLINLINE(struct net_device *) vboxNetF > { > #if 0 > struct net_device *pDev = NULL; >- > Log(("vboxNetFltLinuxRetainNetDev\n")); > /* > * Be careful here to avoid problems racing the detached callback. >@@ -560,15 +487,12 @@ DECLINLINE(struct net_device *) vboxNetF > } > } > RTSpinlockRelease(pThis->hSpinlock); >- > Log(("vboxNetFltLinuxRetainNetDev - done\n")); > return pDev; > #else > return ASMAtomicUoReadPtrT(&pThis->u.s.pDev, struct net_device *); > #endif > } >- >- > /** > * Release the host interface handle previously retained > * by vboxNetFltLinuxRetainNetDev. >@@ -597,10 +521,8 @@ DECLINLINE(void) vboxNetFltLinuxReleaseN > Log(("vboxNetFltLinuxReleaseNetDev - done\n")); > #endif > } >- > #define VBOXNETFLT_CB_TAG(skb) (0xA1C90000 | (skb->dev->ifindex & 0xFFFF)) > #define VBOXNETFLT_SKB_TAG(skb) (*(uint32_t*)&((skb)->cb[sizeof((skb)->cb)-sizeof(uint32_t)])) >- > /** > * Checks whether this is an mbuf created by vboxNetFltLinuxMBufFromSG, > * i.e. a buffer which we're pushing and should be ignored by the filter callbacks. >@@ -612,8 +534,6 @@ DECLINLINE(bool) vboxNetFltLinuxSkBufIsO > { > return VBOXNETFLT_SKB_TAG(pBuf) == VBOXNETFLT_CB_TAG(pBuf); > } >- >- > /** > * Checks whether this SG list contains a GSO packet. > * >@@ -628,8 +548,6 @@ DECLINLINE(bool) vboxNetFltLinuxIsGso(PI > return false; > #endif /* !VBOXNETFLT_WITH_GSO_XMIT_WIRE && !VBOXNETFLT_WITH_GSO_XMIT_HOST */ > } >- >- > /** > * Find out the frame size (of a single segment in case of GSO frames). > * >@@ -665,8 +583,6 @@ DECLINLINE(uint32_t) vboxNetFltLinuxFram > cbVlanTag = 4; > return (vboxNetFltLinuxIsGso(pSG) ? (uint32_t)pSG->GsoCtx.cbMaxSeg + pSG->GsoCtx.cbHdrsTotal : pSG->cbTotal) - cbVlanTag; > } >- >- > /** > * Internal worker that create a linux sk_buff for a > * (scatter/)gather list. >@@ -683,7 +599,6 @@ static struct sk_buff *vboxNetFltLinuxSk > #if defined(VBOXNETFLT_WITH_GSO_XMIT_WIRE) || defined(VBOXNETFLT_WITH_GSO_XMIT_HOST) > unsigned fGsoType = 0; > #endif >- > if (pSG->cbTotal == 0) > { > LogRel(("VBoxNetFlt: Dropped empty packet coming from internal network.\n")); >@@ -700,7 +615,6 @@ static struct sk_buff *vboxNetFltLinuxSk > } > return NULL; > } >- > /** @todo We should use fragments mapping the SG buffers with large packets. > * 256 bytes seems to be the a threshold used a lot for this. It > * requires some nasty work on the intnet side though... */ >@@ -717,14 +631,11 @@ static struct sk_buff *vboxNetFltLinuxSk > } > pPkt->dev = pDev; > pPkt->ip_summed = CHECKSUM_NONE; >- > /* Align IP header on 16-byte boundary: 2 + 14 (ethernet hdr size). */ > skb_reserve(pPkt, NET_IP_ALIGN); >- > /* Copy the segments. */ > skb_put(pPkt, pSG->cbTotal); > IntNetSgRead(pSG, pPkt->data); >- > #if defined(VBOXNETFLT_WITH_GSO_XMIT_WIRE) || defined(VBOXNETFLT_WITH_GSO_XMIT_HOST) > /* > * Setup GSO if used by this packet. >@@ -747,11 +658,9 @@ static struct sk_buff *vboxNetFltLinuxSk > if (fGsoType) > { > struct skb_shared_info *pShInfo = skb_shinfo(pPkt); >- > pShInfo->gso_type = fGsoType | SKB_GSO_DODGY; > pShInfo->gso_size = pSG->GsoCtx.cbMaxSeg; > pShInfo->gso_segs = PDMNetGsoCalcSegmentCount(&pSG->GsoCtx, pSG->cbTotal); >- > /* > * We need to set checksum fields even if the packet goes to the host > * directly as it may be immediately forwarded by IP layer @bugref{5020}. >@@ -775,7 +684,6 @@ static struct sk_buff *vboxNetFltLinuxSk > PDMNetGsoPrepForDirectUse(&pSG->GsoCtx, pPkt->data, pSG->cbTotal, PDMNETCSUMTYPE_PSEUDO); > } > #endif /* VBOXNETFLT_WITH_GSO_XMIT_WIRE || VBOXNETFLT_WITH_GSO_XMIT_HOST */ >- > /* > * Finish up the socket buffer. > */ >@@ -783,17 +691,13 @@ static struct sk_buff *vboxNetFltLinuxSk > if (fDstWire) > { > VBOX_SKB_RESET_NETWORK_HDR(pPkt); >- > /* Restore ethernet header back. */ > skb_push(pPkt, ETH_HLEN); /** @todo VLAN: +4 if VLAN? */ > VBOX_SKB_RESET_MAC_HDR(pPkt); > } > VBOXNETFLT_SKB_TAG(pPkt) = VBOXNETFLT_CB_TAG(pPkt); >- > return pPkt; > } >- >- > /** > * Return the offset where to start checksum computation from. > * >@@ -821,8 +725,6 @@ DECLINLINE(unsigned) vboxNetFltLinuxGetC > return pTransportHdr - pBuf->data; > #endif > } >- >- > /** > * Initializes a SG list from an sk_buff. > * >@@ -842,14 +744,12 @@ static void vboxNetFltLinuxSkBufToSG(PVB > { > int i; > NOREF(pThis); >- > #ifndef VBOXNETFLT_SG_SUPPORT > Assert(!skb_shinfo(pBuf)->frag_list); > #else /* VBOXNETFLT_SG_SUPPORT */ > uint8_t *pExtra = (uint8_t *)&pSG->aSegs[cSegs]; > unsigned cbConsumed = 0; > unsigned cbProduced = 0; >- > # if RTLNX_VER_MIN(2,6,27) > /* Restore VLAN tag stripped by host hardware */ > if (vlan_tx_tag_present(pBuf)) >@@ -866,7 +766,6 @@ static void vboxNetFltLinuxSkBufToSG(PVB > cbProduced += VLAN_ETH_HLEN; > } > # endif /* RTLNX_VER_MIN(2,6,27) */ >- > if (pBuf->ip_summed == CHECKSUM_PARTIAL && pBuf->pkt_type == PACKET_OUTGOING) > { > unsigned uCsumStartOffset = vboxNetFltLinuxGetChecksumStartOffset(pBuf); >@@ -888,12 +787,10 @@ static void vboxNetFltLinuxSkBufToSG(PVB > cbConsumed += uCsumStoreOffset + sizeof(uint16_t); > } > #endif /* VBOXNETFLT_SG_SUPPORT */ >- > if (!pGsoCtx) > IntNetSgInitTempSegs(pSG, pBuf->len + cbProduced - cbConsumed, cSegs, 0 /*cSegsUsed*/); > else > IntNetSgInitTempSegsGso(pSG, pBuf->len + cbProduced - cbConsumed, cSegs, 0 /*cSegsUsed*/, pGsoCtx); >- > int iSeg = 0; > #ifdef VBOXNETFLT_SG_SUPPORT > if (cbProduced) >@@ -906,7 +803,6 @@ static void vboxNetFltLinuxSkBufToSG(PVB > pSG->aSegs[iSeg].pv = pBuf->data + cbConsumed; > pSG->aSegs[iSeg++].Phys = NIL_RTHCPHYS; > Assert(iSeg <= pSG->cSegsAlloc); >- > # ifdef LOG_ENABLED > if (pBuf->data_len) > Log6((" kmap_atomic:")); >@@ -956,9 +852,7 @@ static void vboxNetFltLinuxSkBufToSG(PVB > pSG->aSegs[iSeg].pv = pBuf->data; > pSG->aSegs[iSeg++].Phys = NIL_RTHCPHYS; > #endif >- > pSG->cSegsUsed = iSeg; >- > #if 0 > if (cbProduced) > { >@@ -973,7 +867,6 @@ static void vboxNetFltLinuxSkBufToSG(PVB > } > } > #endif >- > #ifdef PADD_RUNT_FRAMES_FROM_HOST > /* > * Add a trailer if the frame is too small. >@@ -986,9 +879,7 @@ static void vboxNetFltLinuxSkBufToSG(PVB > { > Assert(pBuf->data_len == 0); /* Packets with fragments are never small! */ > static uint8_t const s_abZero[128] = {0}; >- > AssertReturnVoid(iSeg < cSegs); >- > pSG->aSegs[iSeg].Phys = NIL_RTHCPHYS; > pSG->aSegs[iSeg].pv = (void *)&s_abZero[0]; > pSG->aSegs[iSeg++].cb = 60 - pSG->cbTotal; >@@ -997,14 +888,12 @@ static void vboxNetFltLinuxSkBufToSG(PVB > Assert(iSeg <= pSG->cSegsAlloc) > } > #endif >- > Log6(("vboxNetFltLinuxSkBufToSG: allocated=%d, segments=%d frags=%d next=%p frag_list=%p pkt_type=%x fSrc=%x\n", > pSG->cSegsAlloc, pSG->cSegsUsed, skb_shinfo(pBuf)->nr_frags, pBuf->next, skb_shinfo(pBuf)->frag_list, pBuf->pkt_type, fSrc)); > for (i = 0; i < pSG->cSegsUsed; i++) > Log6(("vboxNetFltLinuxSkBufToSG: #%d: cb=%d pv=%p\n", > i, pSG->aSegs[i].cb, pSG->aSegs[i].pv)); > } >- > /** > * Packet handler; not really documented - figure it out yourself. > * >@@ -1040,7 +929,6 @@ static int vboxNetFltLinuxPacketHandler( > */ > if (!pBuf) > return 0; >- > if (pBuf->pkt_type == PACKET_LOOPBACK) > { > /* >@@ -1051,7 +939,6 @@ static int vboxNetFltLinuxPacketHandler( > dev_kfree_skb(pBuf); /* We must 'consume' all packets we get (@bugref{6539})! */ > return 0; > } >- > pThis = VBOX_FLT_PT_TO_INST(pPacketType); > pDev = ASMAtomicUoReadPtrT(&pThis->u.s.pDev, struct net_device *); > if (pDev != pSkbDev) >@@ -1060,7 +947,6 @@ static int vboxNetFltLinuxPacketHandler( > kfree_skb(pBuf); /* This is a failure, so we use kfree_skb instead of dev_kfree_skb. */ > return 0; > } >- > Log6(("vboxNetFltLinuxPacketHandler: pBuf->cb dump:\n%.*Rhxd\n", sizeof(pBuf->cb), pBuf->cb)); > if (vboxNetFltLinuxSkBufIsOur(pBuf)) > { >@@ -1068,7 +954,6 @@ static int vboxNetFltLinuxPacketHandler( > dev_kfree_skb(pBuf); > return 0; > } >- > #ifndef VBOXNETFLT_SG_SUPPORT > { > /* >@@ -1098,7 +983,6 @@ static int vboxNetFltLinuxPacketHandler( > pBuf->mac_len += VLAN_HLEN; > } > # endif /* RTLNX_VER_MIN(2,6,27) */ >- > # if RTLNX_VER_MIN(2,6,18) > Log3(("vboxNetFltLinuxPacketHandler: skb copy len=%u data_len=%u truesize=%u next=%p nr_frags=%u gso_size=%u gso_seqs=%u gso_type=%x frag_list=%p pkt_type=%x\n", > pBuf->len, pBuf->data_len, pBuf->truesize, pBuf->next, skb_shinfo(pBuf)->nr_frags, skb_shinfo(pBuf)->gso_size, skb_shinfo(pBuf)->gso_segs, skb_shinfo(pBuf)->gso_type, skb_shinfo(pBuf)->frag_list, pBuf->pkt_type)); >@@ -1111,7 +995,6 @@ static int vboxNetFltLinuxPacketHandler( > # endif /* RTLNX_VER_MAX(2,6,18) */ > } > #endif /* !VBOXNETFLT_SG_SUPPORT */ >- > #ifdef VBOXNETFLT_LINUX_NO_XMIT_QUEUE > /* Forward it to the internal network. */ > vboxNetFltLinuxForwardToIntNet(pThis, pBuf); >@@ -1122,11 +1005,9 @@ static int vboxNetFltLinuxPacketHandler( > Log6(("vboxNetFltLinuxPacketHandler: scheduled work %p for sk_buff %p\n", > &pThis->u.s.XmitTask, pBuf)); > #endif /* !VBOXNETFLT_LINUX_NO_XMIT_QUEUE */ >- > /* It does not really matter what we return, it is ignored by the kernel. */ > return 0; > } >- > /** > * Calculate the number of INTNETSEG segments the socket buffer will need. > * >@@ -1173,8 +1054,6 @@ DECLINLINE(unsigned) vboxNetFltLinuxCalc > #endif > return cSegs; > } >- >- > /** > * Destroy the intnet scatter / gather buffer created by > * vboxNetFltLinuxSkBufToSG. >@@ -1217,7 +1096,6 @@ static void vboxNetFltLinuxDestroySG(PIN > #endif > NOREF(pSG); > } >- > #ifdef LOG_ENABLED > /** > * Logging helper. >@@ -1261,9 +1139,7 @@ static void vboxNetFltDumpPacket(PINTNET > #else > # define vboxNetFltDumpPacket(a, b, c, d) do {} while (0) > #endif >- > #ifdef VBOXNETFLT_WITH_GSO_RECV >- > /** > * Worker for vboxNetFltLinuxForwardToIntNet that checks if we can forwards a > * GSO socket buffer without having to segment it. >@@ -1292,7 +1168,6 @@ static bool vboxNetFltLinuxCanForwardAsG > uint16_t au16[40/2]; > uint32_t au32[40/4]; > } Buf; >- > /* > * Check the GSO properties of the socket buffer and make sure it fits. > */ >@@ -1308,7 +1183,6 @@ static bool vboxNetFltLinuxCanForwardAsG > Log5(("vboxNetFltLinuxCanForwardAsGso: gso_size=%#x skb_len=%#x (max=%#x)\n", skb_shinfo(pSkb)->gso_size, pSkb->len, VBOX_MAX_GSO_SIZE)); > return false; > } >- > /* > * Switch on the ethertype. > */ >@@ -1331,7 +1205,6 @@ static bool vboxNetFltLinuxCanForwardAsG > Log5(("vboxNetFltLinuxCanForwardAsGso: failed to access IPv4 hdr\n")); > return false; > } >- > cbHdr = pIPv4->ip_hl * 4; > cbTransport = RT_N2H_U16(pIPv4->ip_len); > if (RT_UNLIKELY( cbHdr < RTNETIPV4_MIN_LEN >@@ -1351,7 +1224,6 @@ static bool vboxNetFltLinuxCanForwardAsG > enmGsoType = PDMNETWORKGSOTYPE_INVALID; > break; > } >- > case RT_H2N_U16_C(RTNET_ETHERTYPE_IPV6): > { > PCRTNETIPV6 pIPv6 = (PCRTNETIPV6)skb_header_pointer(pSkb, pSkb->mac_len, sizeof(Buf.IPv6), &Buf); >@@ -1360,7 +1232,6 @@ static bool vboxNetFltLinuxCanForwardAsG > Log5(("vboxNetFltLinuxCanForwardAsGso: failed to access IPv6 hdr\n")); > return false; > } >- > cbTransport = RT_N2H_U16(pIPv6->ip6_plen); > offTransport = pSkb->mac_len + sizeof(RTNETIPV6); > uProtocol = pIPv6->ip6_nxt; >@@ -1373,18 +1244,15 @@ static bool vboxNetFltLinuxCanForwardAsG > enmGsoType = PDMNETWORKGSOTYPE_INVALID; > break; > } >- > default: > Log5(("vboxNetFltLinuxCanForwardAsGso: uEtherType=%#x\n", RT_H2N_U16(uEtherType))); > return false; > } >- > if (enmGsoType == PDMNETWORKGSOTYPE_INVALID) > { > Log5(("vboxNetFltLinuxCanForwardAsGso: Unsupported protocol %d\n", uProtocol)); > return false; > } >- > if (RT_UNLIKELY( offTransport + cbTransport <= offTransport > || offTransport + cbTransport > pSkb->len > || cbTransport < (uProtocol == RTNETIPV4_PROT_TCP ? RTNETTCP_MIN_LEN : RTNETUDP_MIN_LEN)) ) >@@ -1393,7 +1261,6 @@ static bool vboxNetFltLinuxCanForwardAsG > offTransport, cbTransport, offTransport + cbTransport, pSkb->len, PDMNetGsoTypeName(enmGsoType) )); > return false; > } >- > /* > * Check the TCP/UDP bits. > */ >@@ -1405,7 +1272,6 @@ static bool vboxNetFltLinuxCanForwardAsG > Log5(("vboxNetFltLinuxCanForwardAsGso: failed to access TCP hdr\n")); > return false; > } >- > cbTransportHdr = pTcp->th_off * 4; > pGsoCtx->cbHdrsSeg = offTransport + cbTransportHdr; > if (RT_UNLIKELY( cbTransportHdr < RTNETTCP_MIN_LEN >@@ -1416,7 +1282,6 @@ static bool vboxNetFltLinuxCanForwardAsG > Log5(("vboxNetFltLinuxCanForwardAsGso: No space for TCP header; off=%#x cb=%#x skb_len=%#x\n", offTransport, cbTransportHdr, pSkb->len)); > return false; > } >- > } > else > { >@@ -1430,7 +1295,6 @@ static bool vboxNetFltLinuxCanForwardAsG > return false; > } > } >- > /* > * We're good, init the GSO context. > */ >@@ -1440,10 +1304,8 @@ static bool vboxNetFltLinuxCanForwardAsG > pGsoCtx->offHdr1 = pSkb->mac_len; > pGsoCtx->offHdr2 = offTransport; > pGsoCtx->u8Unused = 0; >- > return true; > } >- > /** > * Forward the socket buffer as a GSO internal network frame. > * >@@ -1462,10 +1324,8 @@ static int vboxNetFltLinuxForwardAsGso(P > if (RT_LIKELY(pSG)) > { > vboxNetFltLinuxSkBufToSG(pThis, pSkb, pSG, cbExtra, cSegs, fSrc, pGsoCtx); >- > vboxNetFltDumpPacket(pSG, false, (fSrc & INTNETTRUNKDIR_HOST) ? "host" : "wire", 1); > pThis->pSwitchPort->pfnRecv(pThis->pSwitchPort, NULL /* pvIf */, pSG, fSrc); >- > vboxNetFltLinuxDestroySG(pSG, pSkb); > rc = VINF_SUCCESS; > } >@@ -1476,9 +1336,7 @@ static int vboxNetFltLinuxForwardAsGso(P > } > return rc; > } >- > #endif /* VBOXNETFLT_WITH_GSO_RECV */ >- > /** > * Worker for vboxNetFltLinuxForwardToIntNet. > * >@@ -1496,10 +1354,8 @@ static int vboxNetFltLinuxForwardSegment > if (RT_LIKELY(pSG)) > { > vboxNetFltLinuxSkBufToSG(pThis, pBuf, pSG, cbExtra, cSegs, fSrc, NULL /*pGsoCtx*/); >- > vboxNetFltDumpPacket(pSG, false, (fSrc & INTNETTRUNKDIR_HOST) ? "host" : "wire", 1); > pThis->pSwitchPort->pfnRecv(pThis->pSwitchPort, NULL /* pvIf */, pSG, fSrc); >- > vboxNetFltLinuxDestroySG(pSG, pBuf); > rc = VINF_SUCCESS; > } >@@ -1510,8 +1366,6 @@ static int vboxNetFltLinuxForwardSegment > } > return rc; > } >- >- > /** > * I won't disclose what I do, figure it out yourself, including pThis referencing. > * >@@ -1531,7 +1385,6 @@ static void vboxNetFltLinuxForwardToIntN > skb_shinfo(pBuf)->nr_frags, skb_shinfo(pBuf)->gso_size, > skb_shinfo(pBuf)->gso_segs, skb_shinfo(pBuf)->gso_type, > skb_shinfo(pBuf)->frag_list, pBuf->pkt_type, pBuf->ip_summed)); >-#ifndef VBOXNETFLT_SG_SUPPORT > if (RT_LIKELY(fSrc & INTNETTRUNKDIR_HOST)) > { > /* >@@ -1545,7 +1398,6 @@ static void vboxNetFltLinuxForwardToIntN > pBuf->mac_len = pBuf->nh.raw - pBuf->data; > # endif > } >-#endif /* !VBOXNETFLT_SG_SUPPORT */ > # ifdef VBOXNETFLT_WITH_GSO_RECV > if ( (skb_shinfo(pBuf)->gso_type & (SKB_GSO_TCPV6 | SKB_GSO_TCPV4)) > && vboxNetFltLinuxCanForwardAsGso(pThis, pBuf, fSrc, &GsoCtx) ) >@@ -1561,7 +1413,6 @@ static void vboxNetFltLinuxForwardToIntN > LogRel(("VBoxNetFlt: Failed to segment a packet (%d).\n", PTR_ERR(pSegment))); > return; > } >- > for (; pSegment; pSegment = pNext) > { > Log6(("vboxNetFltLinuxForwardToIntNetInner: segment len=%u data_len=%u truesize=%u next=%p" >@@ -1613,8 +1464,6 @@ static void vboxNetFltLinuxForwardToIntN > vboxNetFltLinuxForwardSegment(pThis, pBuf, fSrc); > } > } >- >- > /** > * Temporarily adjust pBuf->data so it always points to the Ethernet header, > * then forward it to the internal network. >@@ -1625,7 +1474,6 @@ static void vboxNetFltLinuxForwardToIntN > static void vboxNetFltLinuxForwardToIntNet(PVBOXNETFLTINS pThis, struct sk_buff *pBuf) > { > uint32_t fSrc = pBuf->pkt_type == PACKET_OUTGOING ? INTNETTRUNKDIR_HOST : INTNETTRUNKDIR_WIRE; >- > if (RT_UNLIKELY(fSrc & INTNETTRUNKDIR_WIRE)) > { > /* >@@ -1637,20 +1485,15 @@ static void vboxNetFltLinuxForwardToIntN > Log5(("vboxNetFltLinuxForwardToIntNet: mac_len=%d data=%p mac_header=%p network_header=%p\n", > pBuf->mac_len, pBuf->data, skb_mac_header(pBuf), skb_network_header(pBuf))); > } >- > vboxNetFltLinuxForwardToIntNetInner(pThis, pBuf, fSrc); >- > /* > * Restore the original state of skb as there are other handlers this skb > * will be provided to. > */ > if (RT_UNLIKELY(fSrc & INTNETTRUNKDIR_WIRE)) > skb_pull(pBuf, pBuf->mac_len); >- > dev_kfree_skb(pBuf); > } >- >- > #ifndef VBOXNETFLT_LINUX_NO_XMIT_QUEUE > /** > * Work queue handler that forwards the socket buffers queued by >@@ -1666,9 +1509,7 @@ static void vboxNetFltLinuxXmitTask(void > { > PVBOXNETFLTINS pThis = VBOX_FLT_XT_TO_INST(pWork); > struct sk_buff *pBuf; >- > Log6(("vboxNetFltLinuxXmitTask: Got work %p.\n", pWork)); >- > /* > * Active? Retain the instance and increment the busy counter. > */ >@@ -1676,7 +1517,6 @@ static void vboxNetFltLinuxXmitTask(void > { > while ((pBuf = skb_dequeue(&pThis->u.s.XmitQueue)) != NULL) > vboxNetFltLinuxForwardToIntNet(pThis, pBuf); >- > vboxNetFltRelease(pThis, true /* fBusy */); > } > else >@@ -1689,7 +1529,6 @@ static void vboxNetFltLinuxXmitTask(void > } > } > #endif /* !VBOXNETFLT_LINUX_NO_XMIT_QUEUE */ >- > /** > * Reports the GSO capabilities of the hardware NIC. > * >@@ -1698,24 +1537,20 @@ static void vboxNetFltLinuxXmitTask(void > */ > static void vboxNetFltLinuxReportNicGsoCapabilities(PVBOXNETFLTINS pThis) > { >-#ifdef VBOXNETFLT_WITH_GSO_XMIT_WIRE >+#if defined(VBOXNETFLT_WITH_GSO_XMIT_WIRE) || defined(VBOXNETFLT_WITH_GSO_XMIT_HOST) > if (vboxNetFltTryRetainBusyNotDisconnected(pThis)) > { > struct net_device *pDev; > PINTNETTRUNKSWPORT pSwitchPort; > unsigned int fFeatures; >- > RTSpinlockAcquire(pThis->hSpinlock); >- > pSwitchPort = pThis->pSwitchPort; /* this doesn't need to be here, but it doesn't harm. */ > pDev = ASMAtomicUoReadPtrT(&pThis->u.s.pDev, struct net_device *); > if (pDev) > fFeatures = pDev->features; > else > fFeatures = 0; >- > RTSpinlockRelease(pThis->hSpinlock); >- > if (pThis->pSwitchPort) > { > /* Set/update the GSO capabilities of the NIC. */ >@@ -1724,17 +1559,15 @@ static void vboxNetFltLinuxReportNicGsoC > fGsoCapabilites |= RT_BIT_32(PDMNETWORKGSOTYPE_IPV4_TCP); > if (fFeatures & NETIF_F_TSO6) > fGsoCapabilites |= RT_BIT_32(PDMNETWORKGSOTYPE_IPV6_TCP); >- Log3(("vboxNetFltLinuxReportNicGsoCapabilities: reporting wire %s%s%s%s\n", >+ Log3(("vboxNetFltLinuxReportNicGsoCapabilities: reporting wire %s%s\n", > (fGsoCapabilites & RT_BIT_32(PDMNETWORKGSOTYPE_IPV4_TCP)) ? "tso " : "", > (fGsoCapabilites & RT_BIT_32(PDMNETWORKGSOTYPE_IPV6_TCP)) ? "tso6 " : "")); > pThis->pSwitchPort->pfnReportGsoCapabilities(pThis->pSwitchPort, fGsoCapabilites, INTNETTRUNKDIR_WIRE); > } >- > vboxNetFltRelease(pThis, true /*fBusy*/); > } >-#endif /* VBOXNETFLT_WITH_GSO_XMIT_WIRE */ >+#endif /* VBOXNETFLT_WITH_GSO_XMIT_WIRE || VBOXNETFLT_WITH_GSO_XMIT_HOST */ > } >- > /** > * Helper that determines whether the host (ignoreing us) is operating the > * interface in promiscuous mode or not. >@@ -1752,7 +1585,6 @@ static bool vboxNetFltLinuxPromiscuous(P > } > return fRc; > } >- > /** > * Does this device needs link state change signaled? > * Currently we need it for our own VBoxNetAdp and TAP. >@@ -1762,7 +1594,6 @@ static bool vboxNetFltNeedsLinkState(PVB > if (pDev->ethtool_ops && pDev->ethtool_ops->get_drvinfo) > { > struct ethtool_drvinfo Info; >- > memset(&Info, 0, sizeof(Info)); > Info.cmd = ETHTOOL_GDRVINFO; > pDev->ethtool_ops->get_drvinfo(pDev, &Info); >@@ -1771,31 +1602,25 @@ static bool vboxNetFltNeedsLinkState(PVB > sizeof(Info.driver), Info.driver, > sizeof(Info.version), Info.version, > sizeof(Info.bus_info), Info.bus_info)); >- > if (!strncmp(Info.driver, "vboxnet", sizeof(Info.driver))) > return true; >- > #if RTLNX_VER_MIN(2,6,36) /* TAP started doing carrier */ > return !strncmp(Info.driver, "tun", 4) > && !strncmp(Info.bus_info, "tap", 4); > #endif > } >- > return false; > } >- > #if RTLNX_VER_MAX(2,6,18) > DECLINLINE(void) netif_tx_lock_bh(struct net_device *pDev) > { > spin_lock_bh(&pDev->xmit_lock); > } >- > DECLINLINE(void) netif_tx_unlock_bh(struct net_device *pDev) > { > spin_unlock_bh(&pDev->xmit_lock); > } > #endif >- > /** > * Some devices need link state change when filter attaches/detaches > * since the filter is their link in a sense. >@@ -1814,7 +1639,6 @@ static void vboxNetFltSetLinkState(PVBOX > netif_tx_unlock_bh(pDev); > } > } >- > /** > * Internal worker for vboxNetFltLinuxNotifierCallback. > * >@@ -1825,16 +1649,13 @@ static void vboxNetFltSetLinkState(PVBOX > static int vboxNetFltLinuxAttachToInterface(PVBOXNETFLTINS pThis, struct net_device *pDev) > { > LogFlow(("vboxNetFltLinuxAttachToInterface: pThis=%p (%s)\n", pThis, pThis->szName)); >- > /* > * Retain and store the device. > */ > dev_hold(pDev); >- > RTSpinlockAcquire(pThis->hSpinlock); > ASMAtomicUoWritePtr(&pThis->u.s.pDev, pDev); > RTSpinlockRelease(pThis->hSpinlock); >- > Log(("vboxNetFltLinuxAttachToInterface: Device %p(%s) retained. ref=%d\n", > pDev, pDev->name, > #if RTLNX_VER_MIN(2,6,37) >@@ -1845,12 +1666,10 @@ static int vboxNetFltLinuxAttachToInterf > )); > Log(("vboxNetFltLinuxAttachToInterface: Got pDev=%p pThis=%p pThis->u.s.pDev=%p\n", > pDev, pThis, ASMAtomicUoReadPtrT(&pThis->u.s.pDev, struct net_device *))); >- > /* Get the mac address while we still have a valid net_device reference. */ > memcpy(&pThis->u.s.MacAddr, pDev->dev_addr, sizeof(pThis->u.s.MacAddr)); > /* Initialize MTU */ > pThis->u.s.cbMtu = pDev->mtu; >- > /* > * Install a packet filter for this device with a protocol wildcard (ETH_P_ALL). > */ >@@ -1860,16 +1679,13 @@ static int vboxNetFltLinuxAttachToInterf > dev_add_pack(&pThis->u.s.PacketType); > ASMAtomicUoWriteBool(&pThis->u.s.fPacketHandler, true); > Log(("vboxNetFltLinuxAttachToInterface: this=%p: Packet handler installed.\n", pThis)); >- > #ifdef VBOXNETFLT_WITH_HOST2WIRE_FILTER > vboxNetFltLinuxHookDev(pThis, pDev); > #endif >- > /* > * Are we the "carrier" for this device (e.g. vboxnet or tap)? > */ > vboxNetFltSetLinkState(pThis, pDev, true); >- > /* > * Set indicators that require the spinlock. Be abit paranoid about racing > * the device notification handle. >@@ -1883,7 +1699,6 @@ static int vboxNetFltLinuxAttachToInterf > pDev = NULL; /* don't dereference it */ > } > RTSpinlockRelease(pThis->hSpinlock); >- > /* > * Report GSO capabilities > */ >@@ -1896,27 +1711,21 @@ static int vboxNetFltLinuxAttachToInterf > pThis->pSwitchPort->pfnReportNoPreemptDsts(pThis->pSwitchPort, INTNETTRUNKDIR_WIRE | INTNETTRUNKDIR_HOST); > vboxNetFltRelease(pThis, true /*fBusy*/); > } >- > LogRel(("VBoxNetFlt: attached to '%s' / %RTmac\n", pThis->szName, &pThis->u.s.MacAddr)); > return VINF_SUCCESS; > } >- >- > static int vboxNetFltLinuxUnregisterDevice(PVBOXNETFLTINS pThis, struct net_device *pDev) > { > bool fRegistered; > Assert(!pThis->fDisconnectedFromHost); >- > #ifdef VBOXNETFLT_WITH_HOST2WIRE_FILTER > vboxNetFltLinuxUnhookDev(pThis, pDev); > #endif >- > if (ASMAtomicCmpXchgBool(&pThis->u.s.fPacketHandler, false, true)) > { > dev_remove_pack(&pThis->u.s.PacketType); > Log(("vboxNetFltLinuxUnregisterDevice: this=%p: packet handler removed.\n", pThis)); > } >- > RTSpinlockAcquire(pThis->hSpinlock); > fRegistered = ASMAtomicXchgBool(&pThis->u.s.fRegistered, false); > if (fRegistered) >@@ -1925,7 +1734,6 @@ static int vboxNetFltLinuxUnregisterDevi > ASMAtomicUoWriteNullPtr(&pThis->u.s.pDev); > } > RTSpinlockRelease(pThis->hSpinlock); >- > if (fRegistered) > { > #ifndef VBOXNETFLT_LINUX_NO_XMIT_QUEUE >@@ -1942,10 +1750,8 @@ static int vboxNetFltLinuxUnregisterDevi > )); > dev_put(pDev); > } >- > return NOTIFY_OK; > } >- > static int vboxNetFltLinuxDeviceIsUp(PVBOXNETFLTINS pThis, struct net_device *pDev) > { > /* Check if we are not suspended and promiscuous mode has not been set. */ >@@ -1961,7 +1767,6 @@ static int vboxNetFltLinuxDeviceIsUp(PVB > Log(("vboxNetFltLinuxDeviceIsUp: no need to enable promiscuous mode on %s (%d)\n", pThis->szName, pDev->promiscuity)); > return NOTIFY_OK; > } >- > static int vboxNetFltLinuxDeviceGoingDown(PVBOXNETFLTINS pThis, struct net_device *pDev) > { > /* Undo promiscuous mode if we has set it. */ >@@ -1976,7 +1781,6 @@ static int vboxNetFltLinuxDeviceGoingDow > Log(("vboxNetFltLinuxDeviceGoingDown: no need to disable promiscuous mode on %s (%d)\n", pThis->szName, pDev->promiscuity)); > return NOTIFY_OK; > } >- > /** > * Callback for listening to MTU change event. > * >@@ -1994,7 +1798,6 @@ static int vboxNetFltLinuxDeviceMtuChang > Log(("vboxNetFltLinuxDeviceMtuChange: set MTU for %s to %d\n", pThis->szName, pDev->mtu)); > return NOTIFY_OK; > } >- > #ifdef LOG_ENABLED > /** Stringify the NETDEV_XXX constants. */ > static const char *vboxNetFltLinuxGetNetDevEventName(unsigned long ulEventType) >@@ -2019,7 +1822,6 @@ static const char *vboxNetFltLinuxGetNet > return pszEvent; > } > #endif /* LOG_ENABLED */ >- > /** > * Callback for listening to netdevice events. > * >@@ -2033,16 +1835,13 @@ static const char *vboxNetFltLinuxGetNet > * relates to. > */ > static int vboxNetFltLinuxNotifierCallback(struct notifier_block *self, unsigned long ulEventType, void *ptr) >- > { > PVBOXNETFLTINS pThis = VBOX_FLT_NB_TO_INST(self); > struct net_device *pMyDev = ASMAtomicUoReadPtrT(&pThis->u.s.pDev, struct net_device *); > struct net_device *pDev = VBOX_NETDEV_NOTIFIER_INFO_TO_DEV(ptr); > int rc = NOTIFY_OK; >- > Log(("VBoxNetFlt: got event %s(0x%lx) on %s, pDev=%p pThis=%p pThis->u.s.pDev=%p\n", > vboxNetFltLinuxGetNetDevEventName(ulEventType), ulEventType, pDev->name, pDev, pThis, pMyDev)); >- > if (ulEventType == NETDEV_REGISTER) > { > #if RTLNX_VER_MIN(2,6,24) /* cgroups/namespaces introduced */ >@@ -2055,7 +1854,6 @@ static int vboxNetFltLinuxNotifierCallba > # endif > struct net *pMyNet = current->nsproxy->net_ns; > struct net *pDevNet = VBOX_DEV_NET(pDev); >- > if (VBOX_NET_EQ(pDevNet, pMyNet)) > #endif /* namespaces */ > { >@@ -2093,10 +1891,8 @@ static int vboxNetFltLinuxNotifierCallba > } > } > } >- > return rc; > } >- > /* > * Initial enumeration of netdevs. Called with NETDEV_REGISTER by > * register_netdevice_notifier() under rtnl lock. >@@ -2107,13 +1903,10 @@ static int vboxNetFltLinuxEnumeratorCall > struct net_device *dev = VBOX_NETDEV_NOTIFIER_INFO_TO_DEV(ptr); > struct in_device *in_dev; > struct inet6_dev *in6_dev; >- > if (ulEventType != NETDEV_REGISTER) > return NOTIFY_OK; >- > if (RT_UNLIKELY(pThis->pSwitchPort->pfnNotifyHostAddress == NULL)) > return NOTIFY_OK; >- > /* > * IPv4 > */ >@@ -2125,24 +1918,19 @@ static int vboxNetFltLinuxEnumeratorCall > if (in_dev != NULL) > { > struct in_ifaddr *ifa; >- > for (ifa = in_dev->ifa_list; ifa; ifa = ifa->ifa_next) { > if (VBOX_IPV4_IS_LOOPBACK(ifa->ifa_address)) > return NOTIFY_OK; >- > if ( dev != pThis->u.s.pDev > && VBOX_IPV4_IS_LINKLOCAL_169(ifa->ifa_address)) > continue; >- > Log(("%s: %s: IPv4 addr %RTnaipv4 mask %RTnaipv4\n", > __FUNCTION__, VBOX_NETDEV_NAME(dev), > ifa->ifa_address, ifa->ifa_mask)); >- > pThis->pSwitchPort->pfnNotifyHostAddress(pThis->pSwitchPort, > /* :fAdded */ true, kIntNetAddrType_IPv4, &ifa->ifa_address); > } > } >- > /* > * IPv6 > */ >@@ -2150,7 +1938,6 @@ static int vboxNetFltLinuxEnumeratorCall > if (in6_dev != NULL) > { > struct inet6_ifaddr *ifa; >- > read_lock_bh(&in6_dev->lock); > #if RTLNX_VER_MIN(2,6,35) > list_for_each_entry(ifa, &in6_dev->addr_list, if_list) >@@ -2161,21 +1948,16 @@ static int vboxNetFltLinuxEnumeratorCall > if ( dev != pThis->u.s.pDev > && ipv6_addr_type(&ifa->addr) & (IPV6_ADDR_LINKLOCAL | IPV6_ADDR_LOOPBACK)) > continue; >- > Log(("%s: %s: IPv6 addr %RTnaipv6/%u\n", > __FUNCTION__, VBOX_NETDEV_NAME(dev), > &ifa->addr, (unsigned)ifa->prefix_len)); >- > pThis->pSwitchPort->pfnNotifyHostAddress(pThis->pSwitchPort, > /* :fAdded */ true, kIntNetAddrType_IPv6, &ifa->addr); > } > read_unlock_bh(&in6_dev->lock); > } >- > return NOTIFY_OK; > } >- >- > static int vboxNetFltLinuxNotifierIPv4Callback(struct notifier_block *self, unsigned long ulEventType, void *ptr) > { > PVBOXNETFLTINS pThis = RT_FROM_MEMBER(self, VBOXNETFLTINS, u.s.NotifierIPv4); >@@ -2183,7 +1965,6 @@ static int vboxNetFltLinuxNotifierIPv4Ca > struct in_ifaddr *ifa = (struct in_ifaddr *)ptr; > bool fMyDev; > int rc = NOTIFY_OK; >- > pDev = vboxNetFltLinuxRetainNetDev(pThis); > pEventDev = ifa->ifa_dev->dev; > fMyDev = (pDev == pEventDev); >@@ -2192,17 +1973,13 @@ static int vboxNetFltLinuxNotifierIPv4Ca > vboxNetFltLinuxGetNetDevEventName(ulEventType), ulEventType, > pEventDev ? VBOX_NETDEV_NAME(pEventDev) : "<unknown>", > ifa->ifa_address, ifa->ifa_mask)); >- > if (pDev != NULL) > vboxNetFltLinuxReleaseNetDev(pThis, pDev); >- > if (VBOX_IPV4_IS_LOOPBACK(ifa->ifa_address)) > return NOTIFY_OK; >- > if ( !fMyDev > && VBOX_IPV4_IS_LINKLOCAL_169(ifa->ifa_address)) > return NOTIFY_OK; >- > if (pThis->pSwitchPort->pfnNotifyHostAddress) > { > bool fAdded; >@@ -2212,15 +1989,11 @@ static int vboxNetFltLinuxNotifierIPv4Ca > fAdded = false; > else > return NOTIFY_OK; >- > pThis->pSwitchPort->pfnNotifyHostAddress(pThis->pSwitchPort, fAdded, > kIntNetAddrType_IPv4, &ifa->ifa_local); > } >- > return rc; > } >- >- > static int vboxNetFltLinuxNotifierIPv6Callback(struct notifier_block *self, unsigned long ulEventType, void *ptr) > { > PVBOXNETFLTINS pThis = RT_FROM_MEMBER(self, VBOXNETFLTINS, u.s.NotifierIPv6); >@@ -2228,7 +2001,6 @@ static int vboxNetFltLinuxNotifierIPv6Ca > struct inet6_ifaddr *ifa = (struct inet6_ifaddr *)ptr; > bool fMyDev; > int rc = NOTIFY_OK; >- > pDev = vboxNetFltLinuxRetainNetDev(pThis); > pEventDev = ifa->idev->dev; > fMyDev = (pDev == pEventDev); >@@ -2237,14 +2009,11 @@ static int vboxNetFltLinuxNotifierIPv6Ca > vboxNetFltLinuxGetNetDevEventName(ulEventType), ulEventType, > pEventDev ? VBOX_NETDEV_NAME(pEventDev) : "<unknown>", > &ifa->addr)); >- > if (pDev != NULL) > vboxNetFltLinuxReleaseNetDev(pThis, pDev); >- > if ( !fMyDev > && ipv6_addr_type(&ifa->addr) & (IPV6_ADDR_LINKLOCAL | IPV6_ADDR_LOOPBACK)) > return NOTIFY_OK; >- > if (pThis->pSwitchPort->pfnNotifyHostAddress) > { > bool fAdded; >@@ -2254,20 +2023,15 @@ static int vboxNetFltLinuxNotifierIPv6Ca > fAdded = false; > else > return NOTIFY_OK; >- > pThis->pSwitchPort->pfnNotifyHostAddress(pThis->pSwitchPort, fAdded, > kIntNetAddrType_IPv6, &ifa->addr); > } >- > return rc; > } >- >- > bool vboxNetFltOsMaybeRediscovered(PVBOXNETFLTINS pThis) > { > return !ASMAtomicUoReadBool(&pThis->fDisconnectedFromHost); > } >- > int vboxNetFltPortOsXmit(PVBOXNETFLTINS pThis, void *pvIfData, PINTNETSG pSG, uint32_t fDst) > { > struct net_device * pDev; >@@ -2275,9 +2039,7 @@ int vboxNetFltPortOsXmit(PVBOXNETFLTINS > int rc = VINF_SUCCESS; > IPRT_LINUX_SAVE_EFL_AC(); > NOREF(pvIfData); >- > LogFlow(("vboxNetFltPortOsXmit: pThis=%p (%s)\n", pThis, pThis->szName)); >- > pDev = vboxNetFltLinuxRetainNetDev(pThis); > if (pDev) > { >@@ -2299,7 +2061,6 @@ int vboxNetFltPortOsXmit(PVBOXNETFLTINS > else > rc = VERR_NO_MEMORY; > } >- > /* > * Create a sk_buff for the gather list and push it onto the host stack. > */ >@@ -2311,33 +2072,32 @@ int vboxNetFltPortOsXmit(PVBOXNETFLTINS > vboxNetFltDumpPacket(pSG, true, "host", (fDst & INTNETTRUNKDIR_WIRE) ? 0 : 1); > Log6(("vboxNetFltPortOsXmit: pBuf->cb dump:\n%.*Rhxd\n", sizeof(pBuf->cb), pBuf->cb)); > Log6(("vboxNetFltPortOsXmit: netif_rx_ni(%p)\n", pBuf)); >+#if RTLNX_VER_MIN(5,18,0) >+ local_bh_disable(); >+ err = netif_rx(pBuf); >+ local_bh_enable(); >+#else > err = netif_rx_ni(pBuf); >+#endif > if (err) > rc = RTErrConvertFromErrno(err); > } > else > rc = VERR_NO_MEMORY; > } >- > vboxNetFltLinuxReleaseNetDev(pThis, pDev); > } >- > IPRT_LINUX_RESTORE_EFL_AC(); > return rc; > } >- >- > void vboxNetFltPortOsSetActive(PVBOXNETFLTINS pThis, bool fActive) > { > struct net_device *pDev; > IPRT_LINUX_SAVE_EFL_AC(); >- > LogFlow(("vboxNetFltPortOsSetActive: pThis=%p (%s), fActive=%RTbool, fDisablePromiscuous=%RTbool\n", > pThis, pThis->szName, fActive, pThis->fDisablePromiscuous)); >- > if (pThis->fDisablePromiscuous) > return; >- > pDev = vboxNetFltLinuxRetainNetDev(pThis); > if (pDev) > { >@@ -2354,7 +2114,6 @@ void vboxNetFltPortOsSetActive(PVBOXNETF > if (fActive) > { > Assert(!pThis->u.s.fPromiscuousSet); >- > rtnl_lock(); > dev_set_promiscuity(pDev, 1); > rtnl_unlock(); >@@ -2371,19 +2130,15 @@ void vboxNetFltPortOsSetActive(PVBOXNETF > Log(("vboxNetFltPortOsSetActive: disabled promiscuous mode on %s (%d)\n", pThis->szName, pDev->promiscuity)); > } > pThis->u.s.fPromiscuousSet = false; >- > #ifdef LOG_ENABLED > fIf = dev_get_flags(pDev); > Log(("VBoxNetFlt: fIf=%#x; %d->%d\n", fIf, cPromiscBefore, pDev->promiscuity)); > #endif > } >- > vboxNetFltLinuxReleaseNetDev(pThis, pDev); > } > IPRT_LINUX_RESTORE_EFL_AC(); > } >- >- > int vboxNetFltOsDisconnectIt(PVBOXNETFLTINS pThis) > { > /* >@@ -2399,12 +2154,9 @@ int vboxNetFltOsDisconnectIt(PVBOXNETFLT > } > return VINF_SUCCESS; > } >- >- > int vboxNetFltOsConnectIt(PVBOXNETFLTINS pThis) > { > IPRT_LINUX_SAVE_EFL_AC(); >- > /* > * Report the GSO capabilities of the host and device (if connected). > * Note! No need to mark ourselves busy here. >@@ -2417,39 +2169,30 @@ int vboxNetFltOsConnectIt(PVBOXNETFLTIN > | RT_BIT_32(PDMNETWORKGSOTYPE_IPV4_TCP) > | RT_BIT_32(PDMNETWORKGSOTYPE_IPV6_TCP) > , INTNETTRUNKDIR_HOST); >- > #endif > vboxNetFltLinuxReportNicGsoCapabilities(pThis); >- > IPRT_LINUX_RESTORE_EFL_AC(); > return VINF_SUCCESS; > } >- >- > void vboxNetFltOsDeleteInstance(PVBOXNETFLTINS pThis) > { > struct net_device *pDev; > bool fRegistered; > IPRT_LINUX_SAVE_EFL_AC(); >- > #ifdef VBOXNETFLT_WITH_HOST2WIRE_FILTER > vboxNetFltLinuxUnhookDev(pThis, NULL); > #endif >- > /** @todo This code may race vboxNetFltLinuxUnregisterDevice (very very > * unlikely, but none the less). Since it doesn't actually update the > * state (just reads it), it is likely to panic in some interesting > * ways. */ >- > RTSpinlockAcquire(pThis->hSpinlock); > pDev = ASMAtomicUoReadPtrT(&pThis->u.s.pDev, struct net_device *); > fRegistered = ASMAtomicXchgBool(&pThis->u.s.fRegistered, false); > RTSpinlockRelease(pThis->hSpinlock); >- > if (fRegistered) > { > vboxNetFltSetLinkState(pThis, pDev, false); >- > #ifndef VBOXNETFLT_LINUX_NO_XMIT_QUEUE > skb_queue_purge(&pThis->u.s.XmitQueue); > #endif >@@ -2464,24 +2207,18 @@ void vboxNetFltOsDeleteInstance(PVBOXNET > )); > dev_put(pDev); > } >- > unregister_inet6addr_notifier(&pThis->u.s.NotifierIPv6); > unregister_inetaddr_notifier(&pThis->u.s.NotifierIPv4); >- > Log(("vboxNetFltOsDeleteInstance: this=%p: Notifier removed.\n", pThis)); > unregister_netdevice_notifier(&pThis->u.s.Notifier); > module_put(THIS_MODULE); >- > IPRT_LINUX_RESTORE_EFL_AC(); > } >- >- > int vboxNetFltOsInitInstance(PVBOXNETFLTINS pThis, void *pvContext) > { > int err; > IPRT_LINUX_SAVE_EFL_AC(); > NOREF(pvContext); >- > pThis->u.s.Notifier.notifier_call = vboxNetFltLinuxNotifierCallback; > err = register_netdevice_notifier(&pThis->u.s.Notifier); > if (err) >@@ -2496,7 +2233,6 @@ int vboxNetFltOsInitInstance(PVBOXNETFL > IPRT_LINUX_RESTORE_EFL_AC(); > return VERR_INTNET_FLT_IF_NOT_FOUND; > } >- > Log(("vboxNetFltOsInitInstance: this=%p: Notifier installed.\n", pThis)); > if ( pThis->fDisconnectedFromHost > || !try_module_get(THIS_MODULE)) >@@ -2504,11 +2240,9 @@ int vboxNetFltOsInitInstance(PVBOXNETFL > IPRT_LINUX_RESTORE_EFL_AC(); > return VERR_INTNET_FLT_IF_FAILED; > } >- > if (pThis->pSwitchPort->pfnNotifyHostAddress) > { > VBOXNETFLTNOTIFIER Enumerator; >- > /* > * register_inetaddr_notifier() and register_inet6addr_notifier() > * do not call the callback for existing devices. Enumerating >@@ -2518,7 +2252,6 @@ int vboxNetFltOsInitInstance(PVBOXNETFL > RT_ZERO(Enumerator); > Enumerator.Notifier.notifier_call = vboxNetFltLinuxEnumeratorCallback; > Enumerator.pThis = pThis; >- > err = register_netdevice_notifier(&Enumerator.Notifier); > if (err) > { >@@ -2526,28 +2259,22 @@ int vboxNetFltOsInitInstance(PVBOXNETFL > IPRT_LINUX_RESTORE_EFL_AC(); > return VINF_SUCCESS; > } >- > unregister_netdevice_notifier(&Enumerator.Notifier); >- > pThis->u.s.NotifierIPv4.notifier_call = vboxNetFltLinuxNotifierIPv4Callback; > err = register_inetaddr_notifier(&pThis->u.s.NotifierIPv4); > if (err) > LogRel(("%s: failed to register IPv4 notifier: error %d\n", __FUNCTION__, err)); >- > pThis->u.s.NotifierIPv6.notifier_call = vboxNetFltLinuxNotifierIPv6Callback; > err = register_inet6addr_notifier(&pThis->u.s.NotifierIPv6); > if (err) > LogRel(("%s: failed to register IPv6 notifier: error %d\n", __FUNCTION__, err)); > } >- > IPRT_LINUX_RESTORE_EFL_AC(); > return VINF_SUCCESS; > } >- > int vboxNetFltOsPreInitInstance(PVBOXNETFLTINS pThis) > { > IPRT_LINUX_SAVE_EFL_AC(); >- > /* > * Init the linux specific members. > */ >@@ -2564,30 +2291,22 @@ int vboxNetFltOsPreInitInstance(PVBOXNE > INIT_WORK(&pThis->u.s.XmitTask, vboxNetFltLinuxXmitTask, &pThis->u.s.XmitTask); > # endif > #endif >- > IPRT_LINUX_RESTORE_EFL_AC(); > return VINF_SUCCESS; > } >- >- > void vboxNetFltPortOsNotifyMacAddress(PVBOXNETFLTINS pThis, void *pvIfData, PCRTMAC pMac) > { > NOREF(pThis); NOREF(pvIfData); NOREF(pMac); > } >- >- > int vboxNetFltPortOsConnectInterface(PVBOXNETFLTINS pThis, void *pvIf, void **pvIfData) > { > /* Nothing to do */ > NOREF(pThis); NOREF(pvIf); NOREF(pvIfData); > return VINF_SUCCESS; > } >- >- > int vboxNetFltPortOsDisconnectInterface(PVBOXNETFLTINS pThis, void *pvIfData) > { > /* Nothing to do */ > NOREF(pThis); NOREF(pvIfData); > return VINF_SUCCESS; > } >-
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 847097
:
780752
| 780755 |
780785
|
780788