VirtualBox

Changeset 38549 in vbox for trunk/src/VBox/Devices


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)

Location:
trunk/src/VBox/Devices/Network
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Network/DevE1000.cpp

    r37644 r38549  
    29432943    {
    29442944        if (pCtx->dw2.fTCP)
     2945        {
    29452946            pGso->u8Type = PDMNETWORKGSOTYPE_IPV4_TCP;
     2947            pGso->cbHdrsSeg = pCtx->dw3.u8HDRLEN;
     2948        }
    29462949        else
     2950        {
    29472951            pGso->u8Type = PDMNETWORKGSOTYPE_IPV4_UDP;
     2952            pGso->cbHdrsSeg = pCtx->tu.u8CSS; /* IP header only */
     2953        }
    29482954        /** @todo Detect IPv4-IPv6 tunneling (need test setup since linux doesn't do
    29492955         *        this yet it seems)... */
     
    29512957    else
    29522958    {
     2959        pGso->cbHdrsSeg = pCtx->dw3.u8HDRLEN; /* @todo IPv6 UFO */
    29532960        if (pCtx->dw2.fTCP)
    29542961            pGso->u8Type = PDMNETWORKGSOTYPE_IPV6_TCP;
     
    29582965    pGso->offHdr1  = pCtx->ip.u8CSS;
    29592966    pGso->offHdr2  = pCtx->tu.u8CSS;
    2960     pGso->cbHdrs  = pCtx->dw3.u8HDRLEN;
     2967    pGso->cbHdrsTotal = pCtx->dw3.u8HDRLEN;
    29612968    pGso->cbMaxSeg = pCtx->dw3.u16MSS;
    29622969    Assert(PDMNetGsoIsValid(pGso, sizeof(*pGso), pGso->cbMaxSeg * 5));
    2963     E1kLog2(("e1kSetupGsoCtx: mss=%#x hdr=%#x hdr1=%#x hdr2=%#x %s\n",
    2964              pGso->cbMaxSeg, pGso->cbHdrs, pGso->offHdr1, pGso->offHdr2, PDMNetGsoTypeName((PDMNETWORKGSOTYPE)pGso->u8Type) ));
     2970    E1kLog2(("e1kSetupGsoCtx: mss=%#x hdr=%#x hdrseg=%#x hdr1=%#x hdr2=%#x %s\n",
     2971             pGso->cbMaxSeg, pGso->cbHdrsTotal, pGso->cbHdrsSeg, pGso->offHdr1, pGso->offHdr2, PDMNetGsoTypeName((PDMNETWORKGSOTYPE)pGso->u8Type) ));
    29652972}
    29662973
  • trunk/src/VBox/Devices/Network/DevVirtioNet.cpp

    r37324 r38549  
    725725    if (pGso)
    726726    {
    727         Log2(("%s vnetHandleRxPacket: gso type=%x cbHdr=%u mss=%u"
     727        Log2(("%s vnetHandleRxPacket: gso type=%x cbHdrsTotal=%u cbHdrsSeg=%u mss=%u"
    728728              " off1=0x%x off2=0x%x\n", INSTANCE(pState), pGso->u8Type,
    729               pGso->cbHdrs, pGso->cbMaxSeg, pGso->offHdr1, pGso->offHdr2));
     729              pGso->cbHdrsTotal, pGso->cbHdrsSeg, pGso->cbMaxSeg, pGso->offHdr1, pGso->offHdr2));
    730730        Hdr.Hdr.u8Flags = VNETHDR_F_NEEDS_CSUM;
    731731        switch (pGso->u8Type)
     
    746746                return VERR_INVALID_PARAMETER;
    747747        }
    748         Hdr.Hdr.u16HdrLen = pGso->cbHdrs;
     748        Hdr.Hdr.u16HdrLen = pGso->cbHdrsTotal;
    749749        Hdr.Hdr.u16GSOSize = pGso->cbMaxSeg;
    750750        Hdr.Hdr.u16CSumStart = pGso->offHdr2;
     
    981981        case VNETHDR_GSO_TCPV4:
    982982            pGso->u8Type = PDMNETWORKGSOTYPE_IPV4_TCP;
     983            pGso->cbHdrsSeg = pHdr->u16HdrLen;
    983984            break;
    984985        case VNETHDR_GSO_TCPV6:
    985986            pGso->u8Type = PDMNETWORKGSOTYPE_IPV6_TCP;
     987            pGso->cbHdrsSeg = pHdr->u16HdrLen;
    986988            break;
    987989        case VNETHDR_GSO_UDP:
    988990            pGso->u8Type = PDMNETWORKGSOTYPE_IPV4_UDP;
     991            pGso->cbHdrsSeg = pHdr->u16CSumStart;
    989992            break;
    990993        default:
     
    9981001        return NULL;
    9991002    }
    1000     pGso->offHdr1  = sizeof(RTNETETHERHDR);
    1001     pGso->cbHdrs  = pHdr->u16HdrLen;
    1002     pGso->cbMaxSeg = pHdr->u16GSOSize;
     1003    pGso->offHdr1     = sizeof(RTNETETHERHDR);
     1004    pGso->cbHdrsTotal = pHdr->u16HdrLen;
     1005    pGso->cbMaxSeg    = pHdr->u16GSOSize;
    10031006    return pGso;
    10041007}
     
    11231126                        {
    11241127                            Log4(("%s vnetTransmitPendingPackets: HdrLen before adjustment %d.\n",
    1125                                   INSTANCE(pState), pGso->cbHdrs));
     1128                                  INSTANCE(pState), pGso->cbHdrsTotal));
    11261129                            switch (pGso->u8Type)
    11271130                            {
    11281131                                case PDMNETWORKGSOTYPE_IPV4_TCP:
    11291132                                case PDMNETWORKGSOTYPE_IPV6_TCP:
    1130                                     pGso->cbHdrs = Hdr.u16CSumStart +
     1133                                    pGso->cbHdrsTotal = Hdr.u16CSumStart +
    11311134                                        ((PRTNETTCP)(((uint8_t*)pSgBuf->aSegs[0].pvSeg) + Hdr.u16CSumStart))->th_off * 4;
    11321135                                    break;
    11331136                                case PDMNETWORKGSOTYPE_IPV4_UDP:
    1134                                     pGso->cbHdrs = Hdr.u16CSumStart + sizeof(RTNETUDP);
     1137                                    pGso->cbHdrsTotal = Hdr.u16CSumStart + sizeof(RTNETUDP);
    11351138                                    break;
    11361139                            }
    11371140                            /* Update GSO structure embedded into the frame */
    1138                             ((PPDMNETWORKGSO)pSgBuf->pvUser)->cbHdrs = pGso->cbHdrs;
     1141                            ((PPDMNETWORKGSO)pSgBuf->pvUser)->cbHdrsTotal = pGso->cbHdrsTotal;
    11391142                            Log4(("%s vnetTransmitPendingPackets: adjusted HdrLen to %d.\n",
    1140                                   INSTANCE(pState), pGso->cbHdrs));
     1143                                  INSTANCE(pState), pGso->cbHdrsTotal));
    11411144                        }
    1142                         Log2(("%s vnetTransmitPendingPackets: gso type=%x cbHdr=%u mss=%u"
     1145                        Log2(("%s vnetTransmitPendingPackets: gso type=%x cbHdrsTotal=%u cbHdrsSeg=%u mss=%u"
    11431146                              " off1=0x%x off2=0x%x\n", INSTANCE(pState), pGso->u8Type,
    1144                               pGso->cbHdrs, pGso->cbMaxSeg, pGso->offHdr1, pGso->offHdr2));
     1147                              pGso->cbHdrsTotal, pGso->cbHdrsSeg, pGso->cbMaxSeg, pGso->offHdr1, pGso->offHdr2));
    11451148                        STAM_REL_COUNTER_INC(&pState->StatTransmitGSO);
    11461149                    }
  • trunk/src/VBox/Devices/Network/DrvIntNet.cpp

    r37979 r38549  
    769769                                             cbFrame, u64Now, u64Now - pThis->u64LastReceiveTS, u64Now - pThis->u64LastTransferTS, cSegs));
    770770                                    pThis->u64LastReceiveTS = u64Now;
    771                                     Log2(("drvR3IntNetRecvRun: cbFrame=%#x type=%d cbHdrs=%#x Hdr1=%#x Hdr2=%#x MMS=%#x\n"
     771                                    Log2(("drvR3IntNetRecvRun: cbFrame=%#x type=%d cbHdrsTotal=%#x cbHdrsSeg=%#x Hdr1=%#x Hdr2=%#x MMS=%#x\n"
    772772                                          "%.*Rhxd\n",
    773                                           cbFrame, pGso->u8Type, pGso->cbHdrs, pGso->offHdr1, pGso->offHdr2, pGso->cbMaxSeg,
     773                                          cbFrame, pGso->u8Type, pGso->cbHdrsTotal, pGso->cbHdrsSeg, pGso->offHdr1, pGso->offHdr2, pGso->cbMaxSeg,
    774774                                          cbFrame - sizeof(*pGso), pGso + 1));
    775775                                }
     
    793793                        else
    794794                        {
    795                             AssertMsgFailed(("cbFrame=%#x type=%d cbHdrs=%#x Hdr1=%#x Hdr2=%#x MMS=%#x\n",
    796                                              cbFrame, pGso->u8Type, pGso->cbHdrs, pGso->offHdr1, pGso->offHdr2, pGso->cbMaxSeg));
     795                            AssertMsgFailed(("cbFrame=%#x type=%d cbHdrsTotal=%#x cbHdrsSeg=%#x Hdr1=%#x Hdr2=%#x MMS=%#x\n",
     796                                             cbFrame, pGso->u8Type, pGso->cbHdrsTotal, pGso->cbHdrsSeg, pGso->offHdr1, pGso->offHdr2, pGso->cbMaxSeg));
    797797                            STAM_REL_COUNTER_INC(&pBuf->cStatBadFrames);
    798798                        }
  • trunk/src/VBox/Devices/Network/DrvNAT.cpp

    r38111 r38549  
    401401                size_t cbSeg;
    402402                void  *pvSeg;
    403                 m = slirp_ext_m_get(pThis->pNATState, pGso->cbHdrs + pGso->cbMaxSeg, &pvSeg, &cbSeg);
     403                m = slirp_ext_m_get(pThis->pNATState, pGso->cbHdrsTotal + pGso->cbMaxSeg, &pvSeg, &cbSeg);
    404404                if (!m)
    405405                    break;
    406406
    407407#if 1
    408                 uint32_t cbPayload;
     408                uint32_t cbPayload, cbHdrs;
    409409                uint32_t offPayload = PDMNetGsoCarveSegment(pGso, pbFrame, pSgBuf->cbUsed,
    410                                                             iSeg, cSegs, (uint8_t *)pvSeg, &cbPayload);
    411                 memcpy((uint8_t *)pvSeg + pGso->cbHdrs, pbFrame + offPayload, cbPayload);
    412 
    413                 slirp_input(pThis->pNATState, m, cbPayload + pGso->cbHdrs);
     410                                                            iSeg, cSegs, (uint8_t *)pvSeg, &cbHdrs, &cbPayload);
     411                memcpy((uint8_t *)pvSeg + cbHdrs, pbFrame + offPayload, cbPayload);
     412
     413                slirp_input(pThis->pNATState, m, cbPayload + cbHdrs);
    414414#else
    415415                uint32_t cbSegFrame;
  • trunk/src/VBox/Devices/Network/Pcap.cpp

    r37369 r38549  
    157157    for (uint32_t iSeg = 0; iSeg < cSegs; iSeg++)
    158158    {
    159         uint32_t cbSegPayload;
    160         uint32_t offSegPayload = PDMNetGsoCarveSegment(pGso, pbFrame, cbFrame, iSeg, cSegs, abHdrs, &cbSegPayload);
    161 
    162         pcapUpdateHeader(&Hdr, pGso->cbHdrs + cbSegPayload, cbSegMax);
     159        uint32_t cbSegPayload, cbHdrs;
     160        uint32_t offSegPayload = PDMNetGsoCarveSegment(pGso, pbFrame, cbFrame, iSeg, cSegs, abHdrs, &cbHdrs, &cbSegPayload);
     161
     162        pcapUpdateHeader(&Hdr, cbHdrs + cbSegPayload, cbSegMax);
    163163        int rc = RTStrmWrite(pStream, &Hdr, sizeof(Hdr));
    164164        if (RT_FAILURE(rc))
    165165            return rc;
    166166
    167         rc = RTStrmWrite(pStream, abHdrs, RT_MIN(Hdr.incl_len, pGso->cbHdrs));
    168         if (RT_SUCCESS(rc) && Hdr.incl_len > pGso->cbHdrs)
    169             rc = RTStrmWrite(pStream, pbFrame + offSegPayload, Hdr.incl_len - pGso->cbHdrs);
     167        rc = RTStrmWrite(pStream, abHdrs, RT_MIN(Hdr.incl_len, cbHdrs));
     168        if (RT_SUCCESS(rc) && Hdr.incl_len > cbHdrs)
     169            rc = RTStrmWrite(pStream, pbFrame + offSegPayload, Hdr.incl_len - cbHdrs);
    170170        if (RT_FAILURE(rc))
    171171            return rc;
     
    237237    for (uint32_t iSeg = 0; iSeg < cSegs; iSeg++)
    238238    {
    239         uint32_t cbSegPayload;
    240         uint32_t offSegPayload = PDMNetGsoCarveSegment(pGso, pbFrame, cbFrame, iSeg, cSegs, abHdrs, &cbSegPayload);
    241 
    242         pcapUpdateHeader(&Hdr, pGso->cbHdrs + cbSegPayload, cbSegMax);
     239        uint32_t cbSegPayload, cbHdrs;
     240        uint32_t offSegPayload = PDMNetGsoCarveSegment(pGso, pbFrame, cbFrame, iSeg, cSegs, abHdrs, &cbHdrs, &cbSegPayload);
     241
     242        pcapUpdateHeader(&Hdr, cbHdrs + cbSegPayload, cbSegMax);
    243243        int rc = RTFileWrite(File, &Hdr, sizeof(Hdr), NULL);
    244244        if (RT_FAILURE(rc))
    245245            return rc;
    246246
    247         rc = RTFileWrite(File, abHdrs, RT_MIN(Hdr.incl_len, pGso->cbHdrs), NULL);
    248         if (RT_SUCCESS(rc) && Hdr.incl_len > pGso->cbHdrs)
    249             rc = RTFileWrite(File, pbFrame + offSegPayload, Hdr.incl_len - pGso->cbHdrs, NULL);
     247        rc = RTFileWrite(File, abHdrs, RT_MIN(Hdr.incl_len, cbHdrs), NULL);
     248        if (RT_SUCCESS(rc) && Hdr.incl_len > cbHdrs)
     249            rc = RTFileWrite(File, pbFrame + offSegPayload, Hdr.incl_len - cbHdrs, NULL);
    250250        if (RT_FAILURE(rc))
    251251            return rc;
  • trunk/src/VBox/Devices/Network/SrvIntNetR0.cpp

    r37979 r38549  
    26632663    for (uint32_t iSeg = 0; iSeg < cSegs; iSeg++)
    26642664    {
    2665         uint32_t cbSegPayload;
     2665        uint32_t cbSegPayload, cbSegHdrs;
    26662666        uint32_t offSegPayload = PDMNetGsoCarveSegment(&pSG->GsoCtx, (uint8_t *)pSG->aSegs[0].pv, pSG->cbTotal, iSeg, cSegs,
    2667                                                        pIfSender->abGsoHdrs, &cbSegPayload);
    2668 
    2669         IntNetSgInitTempSegs(&u.SG, pSG->GsoCtx.cbHdrs + cbSegPayload, 2, 2);
     2667                                                       pIfSender->abGsoHdrs, &cbSegHdrs, &cbSegPayload);
     2668
     2669        IntNetSgInitTempSegs(&u.SG, cbSegHdrs + cbSegPayload, 2, 2);
    26702670        u.SG.aSegs[0].Phys = NIL_RTHCPHYS;
    26712671        u.SG.aSegs[0].pv   = pIfSender->abGsoHdrs;
    2672         u.SG.aSegs[0].cb   = pSG->GsoCtx.cbHdrs;
     2672        u.SG.aSegs[0].cb   = cbSegHdrs;
    26732673        u.SG.aSegs[1].Phys = NIL_RTHCPHYS;
    26742674        u.SG.aSegs[1].pv   = (uint8_t *)pSG->aSegs[0].pv + offSegPayload;
Note: See TracChangeset for help on using the changeset viewer.

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