VirtualBox

Ignore:
Timestamp:
Aug 26, 2011 1:26:07 PM (14 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
73704
Message:

GSO: UDP fragmentation offloading (#5846)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/HostDrivers/VBoxNetFlt/linux/VBoxNetFlt-linux.c

    r38063 r38549  
    11981198         * directly as it may be immediately forwarded by IP layer @bugref{5020}.
    11991199         */
    1200         Assert(skb_headlen(pPkt) >= pSG->GsoCtx.cbHdrs);
     1200        Assert(skb_headlen(pPkt) >= pSG->GsoCtx.cbHdrsTotal);
    12011201        pPkt->ip_summed  = CHECKSUM_PARTIAL;
    12021202# if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 22)
     
    14601460static void vboxNetFltDumpPacket(PINTNETSG pSG, bool fEgress, const char *pszWhere, int iIncrement)
    14611461{
     1462    int i, offSeg;
    14621463    uint8_t *pInt, *pExt;
    14631464    static int iPacketNo = 1;
     
    14791480         pExt[0], pExt[1], pExt[2], pExt[3], pExt[4], pExt[5],
    14801481         pSG->cbTotal, iPacketNo));
    1481     Log3(("%.*Rhxd\n", pSG->aSegs[0].cb, pSG->aSegs[0].pv));
     1482    if (pSG->cSegsUsed == 1)
     1483    {
     1484        Log3(("%.*Rhxd\n", pSG->aSegs[0].cb, pSG->aSegs[0].pv));
     1485    }
     1486    else
     1487    {
     1488        for (i = 0, offSeg = 0; i < pSG->cSegsUsed; i++)
     1489        {
     1490            Log3(("-- segment %d at 0x%x (%d bytes) --\n%.*Rhxd\n",
     1491                  i, offSeg, pSG->aSegs[i].cb, pSG->aSegs[i].cb, pSG->aSegs[i].pv));
     1492            offSeg += pSG->aSegs[i].cb;
     1493        }
     1494    }
     1495
    14821496}
    14831497#else
     
    16631677
    16641678        cbTransportHdr = pTcp->th_off * 4;
     1679        pGsoCtx->cbHdrsSeg = offTransport + cbTransportHdr;
    16651680        if (RT_UNLIKELY(   cbTransportHdr < RTNETTCP_MIN_LEN
    16661681                        || cbTransportHdr > cbTransport
     
    16771692        Assert(uProtocol == RTNETIPV4_PROT_UDP);
    16781693        cbTransportHdr = sizeof(RTNETUDP);
     1694        pGsoCtx->cbHdrsSeg = offTransport; /* Exclude UDP header */
    16791695        if (RT_UNLIKELY(   offTransport + cbTransportHdr >= UINT8_MAX
    16801696                        || offTransport + cbTransportHdr >= pSkb->len ))
     
    16891705     */
    16901706    pGsoCtx->u8Type       = enmGsoType;
    1691     pGsoCtx->cbHdrs       = offTransport + cbTransportHdr;
     1707    pGsoCtx->cbHdrsTotal  = offTransport + cbTransportHdr;
    16921708    pGsoCtx->cbMaxSeg     = skb_shinfo(pSkb)->gso_size;
    16931709    pGsoCtx->offHdr1      = pSkb->mac_len;
    16941710    pGsoCtx->offHdr2      = offTransport;
    1695     pGsoCtx->au8Unused[0] = 0;
    1696     pGsoCtx->au8Unused[1] = 0;
     1711    pGsoCtx->u8Unused     = 0;
    16971712
    16981713    return true;
     
    19481963                fGsoCapabilites |= RT_BIT_32(PDMNETWORKGSOTYPE_IPV6_UDP);
    19491964# endif
     1965            Log3(("vboxNetFltLinuxReportNicGsoCapabilities: reporting wire %s%s%s%s\n",
     1966                  (fGsoCapabilites & RT_BIT_32(PDMNETWORKGSOTYPE_IPV4_TCP)) ? "tso " : "",
     1967                  (fGsoCapabilites & RT_BIT_32(PDMNETWORKGSOTYPE_IPV6_TCP)) ? "tso6 " : "",
     1968                  (fGsoCapabilites & RT_BIT_32(PDMNETWORKGSOTYPE_IPV4_UDP)) ? "ufo " : "",
     1969                  (fGsoCapabilites & RT_BIT_32(PDMNETWORKGSOTYPE_IPV6_UDP)) ? "ufo6 " : ""));
    19501970            pThis->pSwitchPort->pfnReportGsoCapabilities(pThis->pSwitchPort, fGsoCapabilites, INTNETTRUNKDIR_WIRE);
    19511971        }
     
    24262446    /** @todo duplicate work here now? Attach */
    24272447#if defined(VBOXNETFLT_WITH_GSO_XMIT_HOST)
     2448    Log3(("vboxNetFltOsConnectIt: reporting host tso tso6 ufo\n"));
    24282449    pThis->pSwitchPort->pfnReportGsoCapabilities(pThis->pSwitchPort,
    24292450                                                 0
    24302451                                                 | RT_BIT_32(PDMNETWORKGSOTYPE_IPV4_TCP)
    24312452                                                 | RT_BIT_32(PDMNETWORKGSOTYPE_IPV6_TCP)
     2453                                                 | RT_BIT_32(PDMNETWORKGSOTYPE_IPV4_UDP)
    24322454# if 0 /** @todo GSO: Test UDP offloading (UFO) on linux. */
    2433                                                  | RT_BIT_32(PDMNETWORKGSOTYPE_IPV4_UDP)
    24342455                                                 | RT_BIT_32(PDMNETWORKGSOTYPE_IPV6_UDP)
    24352456# endif
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette