Gentoo Websites Logo
Go to: Gentoo Home Documentation Forums Lists Bugs Planet Store Wiki Get Gentoo!
View | Details | Raw Unified | Return to bug 847097 | Differences between
and this patch

Collapse All | Expand All

(-)a/vboxnetflt/linux/VBoxNetFlt-linux.c (-17 / +21 lines)
Lines 1-10 Link Here
1
/* $Id: VBoxNetFlt-linux.c 150609 2022-03-21 21:07:44Z vgalitsy $ */
1
/* $Id$ */
2
/** @file
2
/** @file
3
 * VBoxNetFlt - Network Filter Driver (Host), Linux Specific Code.
3
 * VBoxNetFlt - Network Filter Driver (Host), Linux Specific Code.
4
 */
4
 */
5
/*
5
/*
6
 * Copyright (C) 2006-2020 Oracle Corporation
6
 * Copyright (C) 2006-2022 Oracle Corporation
7
 *
7
 *
8
 * This file is part of VirtualBox Open Source Edition (OSE), as
8
 * This file is part of VirtualBox Open Source Edition (OSE), as
9
 * available from http://www.virtualbox.org. This file is free software;
9
 * available from http://www.virtualbox.org. This file is free software;
Lines 402-412 static int vboxNetFltLinuxStartXmitFilte Link Here
402
     *       to be production quality code, we would have to be much more
402
     *       to be production quality code, we would have to be much more
403
     *       careful here and avoid the race.
403
     *       careful here and avoid the race.
404
     */
404
     */
405
    if (   !VALID_PTR(pOverride)
405
    if (   !RT_VALID_PTR(pOverride)
406
        || pOverride->u32Magic != VBOXNETDEVICEOPSOVERRIDE_MAGIC
406
        || pOverride->u32Magic != VBOXNETDEVICEOPSOVERRIDE_MAGIC
407
# if RTLNX_VER_MIN(2,6,29)
407
# if RTLNX_VER_MIN(2,6,29)
408
        || !VALID_PTR(pOverride->pOrgOps)
408
        || !RT_VALID_PTR(pOverride->pOrgOps)
409
# endif /* RTLNX_VER_MIN(2,6,29) */
409
# endif
410
        )
410
        )
411
    {
411
    {
412
        printk("vboxNetFltLinuxStartXmitFilter: bad override %p\n", pOverride);
412
        printk("vboxNetFltLinuxStartXmitFilter: bad override %p\n", pOverride);
Lines 426-434 static int vboxNetFltLinuxStartXmitFilte Link Here
426
    cbHdrs = RT_MIN(cbHdrs, sizeof(abHdrBuf));
426
    cbHdrs = RT_MIN(cbHdrs, sizeof(abHdrBuf));
427
    pEtherHdr = (PCRTNETETHERHDR)skb_header_pointer(pSkb, 0, cbHdrs, &abHdrBuf[0]);
427
    pEtherHdr = (PCRTNETETHERHDR)skb_header_pointer(pSkb, 0, cbHdrs, &abHdrBuf[0]);
428
    if (   pEtherHdr
428
    if (   pEtherHdr
429
        && VALID_PTR(pOverride->pVBoxNetFlt)
429
        && RT_VALID_PTR(pOverride->pVBoxNetFlt)
430
        && (pSwitchPort = pOverride->pVBoxNetFlt->pSwitchPort) != NULL
430
        && (pSwitchPort = pOverride->pVBoxNetFlt->pSwitchPort) != NULL
431
        && VALID_PTR(pSwitchPort)
431
        && RT_VALID_PTR(pSwitchPort)
432
        && cbHdrs >= 6)
432
        && cbHdrs >= 6)
433
    {
433
    {
434
        INTNETSWDECISION enmDecision;
434
        INTNETSWDECISION enmDecision;
Lines 457-463 static int vboxNetFltLinuxStartXmitFilte Link Here
457
    PVBOXNETDEVICEOPSOVERRIDE   pOverride;
457
    PVBOXNETDEVICEOPSOVERRIDE   pOverride;
458
458
459
    /* Cancel override if ethtool_ops is missing (host-only case, @bugref{5712}) */
459
    /* Cancel override if ethtool_ops is missing (host-only case, @bugref{5712}) */
460
    if (!VALID_PTR(pDev->OVR_OPS))
460
    if (!RT_VALID_PTR(pDev->OVR_OPS))
461
        return;
461
        return;
462
    pOverride = RTMemAlloc(sizeof(*pOverride));
462
    pOverride = RTMemAlloc(sizeof(*pOverride));
463
    if (!pOverride)
463
    if (!pOverride)
Lines 497-507 static void vboxNetFltLinuxHookDev(PVBOX Link Here
497
    if (!pDev)
497
    if (!pDev)
498
        pDev = ASMAtomicUoReadPtrT(&pThis->u.s.pDev, struct net_device *);
498
        pDev = ASMAtomicUoReadPtrT(&pThis->u.s.pDev, struct net_device *);
499
    if (VALID_PTR(pDev))
499
    if (RT_VALID_PTR(pDev))
500
    {
500
    {
501
        pOverride = (PVBOXNETDEVICEOPSOVERRIDE)pDev->OVR_OPS;
501
        pOverride = (PVBOXNETDEVICEOPSOVERRIDE)pDev->OVR_OPS;
502
        if (    VALID_PTR(pOverride)
502
        if (    RT_VALID_PTR(pOverride)
503
            &&  pOverride->u32Magic == VBOXNETDEVICEOPSOVERRIDE_MAGIC
503
            &&  pOverride->u32Magic == VBOXNETDEVICEOPSOVERRIDE_MAGIC
504
            &&  VALID_PTR(pOverride->pOrgOps)
504
            &&  RT_VALID_PTR(pOverride->pOrgOps)
505
           )
505
           )
506
        {
506
        {
507
# if RTLNX_VER_MAX(2,6,29)
507
# if RTLNX_VER_MAX(2,6,29)
Lines 1531-1537 static void vboxNetFltLinuxForwardToIntN Link Here
1531
              skb_shinfo(pBuf)->nr_frags, skb_shinfo(pBuf)->gso_size,
1531
              skb_shinfo(pBuf)->nr_frags, skb_shinfo(pBuf)->gso_size,
1532
              skb_shinfo(pBuf)->gso_segs, skb_shinfo(pBuf)->gso_type,
1532
              skb_shinfo(pBuf)->gso_segs, skb_shinfo(pBuf)->gso_type,
1533
              skb_shinfo(pBuf)->frag_list, pBuf->pkt_type, pBuf->ip_summed));
1533
              skb_shinfo(pBuf)->frag_list, pBuf->pkt_type, pBuf->ip_summed));
1534
#ifndef VBOXNETFLT_SG_SUPPORT
1535
        if (RT_LIKELY(fSrc & INTNETTRUNKDIR_HOST))
1534
        if (RT_LIKELY(fSrc & INTNETTRUNKDIR_HOST))
1536
        {
1535
        {
1537
            /*
1536
            /*
Lines 1545-1551 static void vboxNetFltLinuxForwardToIntN Link Here
1545
            pBuf->mac_len = pBuf->nh.raw - pBuf->data;
1544
            pBuf->mac_len = pBuf->nh.raw - pBuf->data;
1546
# endif
1545
# endif
1547
        }
1546
        }
1548
#endif /* !VBOXNETFLT_SG_SUPPORT */
1549
# ifdef VBOXNETFLT_WITH_GSO_RECV
1547
# ifdef VBOXNETFLT_WITH_GSO_RECV
1550
        if (   (skb_shinfo(pBuf)->gso_type & (SKB_GSO_TCPV6 | SKB_GSO_TCPV4))
1548
        if (   (skb_shinfo(pBuf)->gso_type & (SKB_GSO_TCPV6 | SKB_GSO_TCPV4))
1551
            && vboxNetFltLinuxCanForwardAsGso(pThis, pBuf, fSrc, &GsoCtx) )
1549
            && vboxNetFltLinuxCanForwardAsGso(pThis, pBuf, fSrc, &GsoCtx) )
Lines 1698-1704 static void vboxNetFltLinuxXmitTask(void Link Here
1698
 */
1696
 */
1699
static void vboxNetFltLinuxReportNicGsoCapabilities(PVBOXNETFLTINS pThis)
1697
static void vboxNetFltLinuxReportNicGsoCapabilities(PVBOXNETFLTINS pThis)
1700
{
1698
{
1701
#ifdef VBOXNETFLT_WITH_GSO_XMIT_WIRE
1699
#if defined(VBOXNETFLT_WITH_GSO_XMIT_WIRE) || defined(VBOXNETFLT_WITH_GSO_XMIT_HOST)
1702
    if (vboxNetFltTryRetainBusyNotDisconnected(pThis))
1700
    if (vboxNetFltTryRetainBusyNotDisconnected(pThis))
1703
    {
1701
    {
1704
        struct net_device  *pDev;
1702
        struct net_device  *pDev;
Lines 1724-1730 static void vboxNetFltLinuxReportNicGsoC Link Here
1724
                fGsoCapabilites |= RT_BIT_32(PDMNETWORKGSOTYPE_IPV4_TCP);
1722
                fGsoCapabilites |= RT_BIT_32(PDMNETWORKGSOTYPE_IPV4_TCP);
1725
            if (fFeatures & NETIF_F_TSO6)
1723
            if (fFeatures & NETIF_F_TSO6)
1726
                fGsoCapabilites |= RT_BIT_32(PDMNETWORKGSOTYPE_IPV6_TCP);
1724
                fGsoCapabilites |= RT_BIT_32(PDMNETWORKGSOTYPE_IPV6_TCP);
1727
            Log3(("vboxNetFltLinuxReportNicGsoCapabilities: reporting wire %s%s%s%s\n",
1725
            Log3(("vboxNetFltLinuxReportNicGsoCapabilities: reporting wire %s%s\n",
1728
                  (fGsoCapabilites & RT_BIT_32(PDMNETWORKGSOTYPE_IPV4_TCP)) ? "tso " : "",
1726
                  (fGsoCapabilites & RT_BIT_32(PDMNETWORKGSOTYPE_IPV4_TCP)) ? "tso " : "",
1729
                  (fGsoCapabilites & RT_BIT_32(PDMNETWORKGSOTYPE_IPV6_TCP)) ? "tso6 " : ""));
1727
                  (fGsoCapabilites & RT_BIT_32(PDMNETWORKGSOTYPE_IPV6_TCP)) ? "tso6 " : ""));
1730
            pThis->pSwitchPort->pfnReportGsoCapabilities(pThis->pSwitchPort, fGsoCapabilites, INTNETTRUNKDIR_WIRE);
1728
            pThis->pSwitchPort->pfnReportGsoCapabilities(pThis->pSwitchPort, fGsoCapabilites, INTNETTRUNKDIR_WIRE);
Lines 1732-1738 static void vboxNetFltLinuxReportNicGsoC Link Here
1732
1730
1733
        vboxNetFltRelease(pThis, true /*fBusy*/);
1731
        vboxNetFltRelease(pThis, true /*fBusy*/);
1734
    }
1732
    }
1735
#endif /* VBOXNETFLT_WITH_GSO_XMIT_WIRE */
1733
#endif /* VBOXNETFLT_WITH_GSO_XMIT_WIRE || VBOXNETFLT_WITH_GSO_XMIT_HOST */
1736
}
1734
}
1737
/**
1735
/**
Lines 2311-2317 int vboxNetFltPortOsXmit(PVBOXNETFLTINS Link Here
2311
                vboxNetFltDumpPacket(pSG, true, "host", (fDst & INTNETTRUNKDIR_WIRE) ? 0 : 1);
2309
                vboxNetFltDumpPacket(pSG, true, "host", (fDst & INTNETTRUNKDIR_WIRE) ? 0 : 1);
2312
                Log6(("vboxNetFltPortOsXmit: pBuf->cb dump:\n%.*Rhxd\n", sizeof(pBuf->cb), pBuf->cb));
2310
                Log6(("vboxNetFltPortOsXmit: pBuf->cb dump:\n%.*Rhxd\n", sizeof(pBuf->cb), pBuf->cb));
2313
                Log6(("vboxNetFltPortOsXmit: netif_rx_ni(%p)\n", pBuf));
2311
                Log6(("vboxNetFltPortOsXmit: netif_rx_ni(%p)\n", pBuf));
2312
#if RTLNX_VER_MIN(5,18,0)
2313
                local_bh_disable();
2314
                err = netif_rx(pBuf);
2315
                local_bh_enable();
2316
#else
2314
                err = netif_rx_ni(pBuf);
2317
                err = netif_rx_ni(pBuf);
2318
#endif
2315
                if (err)
2319
                if (err)
2316
                    rc = RTErrConvertFromErrno(err);
2320
                    rc = RTErrConvertFromErrno(err);
2317
            }
2321
            }

Return to bug 847097