VirtualBox

Changeset 31271 in vbox


Ignore:
Timestamp:
Aug 2, 2010 8:31:54 AM (15 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
64297
Message:

vboxnetflt: host-only checksum fix (xtracker 5020)

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/pdmnetinline.h

    r28800 r31271  
    4040
    4141
     42/**
     43 * Checksum type.
     44 */
     45typedef enum RTNETCSUMTYPE
     46{
     47    /** No checksum. */
     48    RTNETCSUMTYPE_NONE = 0,
     49    /** Normal TCP checksum. */
     50    RTNETCSUMTYPE_COMPLETE,
     51    /** Checksum on pseudo header (used with GSO). */
     52    RTNETCSUMTYPE_PSEUDO,
     53    /** The usual 32-bit hack. */
     54    RTNETCSUMTYPE_32_BIT_HACK = 0x7fffffff
     55} RTNETCSUMTYPE;
     56
    4257
    4358/**
     
    163178 * @param   cbPayload           The amount of payload.
    164179 * @param   cbHdrs              The size of all the headers.
    165  * @param   fPayloadChecksum    Whether to checksum the payload or not.
     180 * @param   enmCsumType         Whether to checksum the payload, the pseudo
     181 *                              header or nothing.
    166182 * @internal
    167183 */
    168184DECLINLINE(void) pdmNetGsoUpdateUdpHdr(uint32_t u32PseudoSum, uint8_t *pbSegHdrs, uint8_t offUdpHdr,
    169                                        uint8_t const *pbPayload, uint32_t cbPayload, uint8_t cbHdrs, bool fPayloadChecksum)
     185                                       uint8_t const *pbPayload, uint32_t cbPayload, uint8_t cbHdrs,
     186                                       RTNETCSUMTYPE enmCsumType)
    170187{
    171188    PRTNETUDP pUdpHdr = (PRTNETUDP)&pbSegHdrs[offUdpHdr];
    172189    pUdpHdr->uh_ulen = cbPayload + cbHdrs - offUdpHdr;
    173     pUdpHdr->uh_sum  = fPayloadChecksum ? RTNetUDPChecksum(u32PseudoSum, pUdpHdr) : 0;
     190    switch (enmCsumType)
     191    {
     192        case RTNETCSUMTYPE_NONE:
     193            pUdpHdr->uh_sum = 0;
     194            break;
     195        case RTNETCSUMTYPE_COMPLETE:
     196            pUdpHdr->uh_sum = RTNetUDPChecksum(u32PseudoSum, pUdpHdr);
     197            break;
     198        /* @todo: Implement:
     199        case RTNETCSUMTYPE_PSEUDO:
     200            pUdpHdr->uh_sum = RTNetUDPChecksum(u32PseudoSum, pUdpHdr);
     201            break; */
     202        default:
     203            Log(("pdmNetGsoUpdateUdpHdr: Invalid checksum type: %d\n", enmCsumType));
     204            break;
     205    }
    174206}
    175207
     
    188220 * @param   cbHdrs              The size of all the headers.
    189221 * @param   fLastSeg            Set if this is the last segment.
    190  * @param   fPayloadChecksum    Whether to checksum the payload or not.
     222 * @param   enmCsumType         Whether to checksum the payload, the pseudo
     223 *                              header or nothing.
    191224 * @internal
    192225 */
    193226DECLINLINE(void) pdmNetGsoUpdateTcpHdr(uint32_t u32PseudoSum, uint8_t *pbSegHdrs, uint8_t offTcpHdr,
    194227                                       uint8_t const *pbPayload, uint32_t cbPayload, uint32_t offPayload, uint8_t cbHdrs,
    195                                        bool fLastSeg, bool fPayloadChecksum)
     228                                       bool fLastSeg, RTNETCSUMTYPE enmCsumType)
    196229{
    197230    PRTNETTCP pTcpHdr = (PRTNETTCP)&pbSegHdrs[offTcpHdr];
     
    199232    if (!fLastSeg)
    200233        pTcpHdr->th_flags &= ~(RTNETTCP_F_FIN | RTNETTCP_F_PSH);
    201     pTcpHdr->th_sum = fPayloadChecksum ? RTNetTCPChecksum(u32PseudoSum, pTcpHdr, pbPayload, cbPayload) : 0;
     234    switch (enmCsumType)
     235    {
     236        case RTNETCSUMTYPE_NONE:
     237            pTcpHdr->th_sum = 0;
     238            break;
     239        case RTNETCSUMTYPE_COMPLETE:
     240            pTcpHdr->th_sum = RTNetTCPChecksum(u32PseudoSum, pTcpHdr, pbPayload, cbPayload);
     241            break;
     242        case RTNETCSUMTYPE_PSEUDO:
     243            pTcpHdr->th_sum = ~RTNetIPv4FinalizeChecksum(u32PseudoSum);
     244            break;
     245        default:
     246            Log(("pdmNetGsoUpdateTcpHdr: Invalid checksum type: %d\n", enmCsumType));
     247            break;
     248    }
    202249}
    203250
     
    306353            pdmNetGsoUpdateTcpHdr(pdmNetGsoUpdateIPv4Hdr(pbSegHdrs, pGso->offHdr1, cbSegPayload, iSeg, pGso->cbHdrs),
    307354                                  pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, iSeg * pGso->cbMaxSeg,
    308                                   pGso->cbHdrs, iSeg + 1 == cSegs, true);
     355                                  pGso->cbHdrs, iSeg + 1 == cSegs, RTNETCSUMTYPE_COMPLETE);
    309356            break;
    310357        case PDMNETWORKGSOTYPE_IPV4_UDP:
    311358            pdmNetGsoUpdateUdpHdr(pdmNetGsoUpdateIPv4Hdr(pbSegHdrs, pGso->offHdr1, cbSegPayload, iSeg, pGso->cbHdrs),
    312                                   pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, pGso->cbHdrs, true);
     359                                  pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, pGso->cbHdrs, RTNETCSUMTYPE_COMPLETE);
    313360            break;
    314361        case PDMNETWORKGSOTYPE_IPV6_TCP:
     
    316363                                                         pGso->offHdr2, RTNETIPV4_PROT_TCP),
    317364                                  pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, iSeg * pGso->cbMaxSeg,
    318                                   pGso->cbHdrs, iSeg + 1 == cSegs, true);
     365                                  pGso->cbHdrs, iSeg + 1 == cSegs, RTNETCSUMTYPE_COMPLETE);
    319366            break;
    320367        case PDMNETWORKGSOTYPE_IPV6_UDP:
    321368            pdmNetGsoUpdateUdpHdr(pdmNetGsoUpdateIPv6Hdr(pbSegHdrs, pGso->offHdr1, cbSegPayload, pGso->cbHdrs,
    322369                                                         pGso->offHdr2, RTNETIPV4_PROT_UDP),
    323                                   pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, pGso->cbHdrs, true);
     370                                  pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, pGso->cbHdrs, RTNETCSUMTYPE_COMPLETE);
    324371            break;
    325372        case PDMNETWORKGSOTYPE_IPV4_IPV6_TCP:
     
    328375                                                         cbSegPayload, pGso->cbHdrs, pGso->offHdr2, RTNETIPV4_PROT_TCP),
    329376                                  pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, iSeg * pGso->cbMaxSeg,
    330                                   pGso->cbHdrs, iSeg + 1 == cSegs, true);
     377                                  pGso->cbHdrs, iSeg + 1 == cSegs, RTNETCSUMTYPE_COMPLETE);
    331378            break;
    332379        case PDMNETWORKGSOTYPE_IPV4_IPV6_UDP:
     
    334381            pdmNetGsoUpdateUdpHdr(pdmNetGsoUpdateIPv6Hdr(pbSegHdrs, pgmNetGsoCalcIpv6Offset(pbSegHdrs, pGso->offHdr1),
    335382                                                         cbSegPayload, pGso->cbHdrs, pGso->offHdr2, RTNETIPV4_PROT_UDP),
    336                                   pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, pGso->cbHdrs, true);
     383                                  pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, pGso->cbHdrs, RTNETCSUMTYPE_COMPLETE);
    337384            break;
    338385        case PDMNETWORKGSOTYPE_INVALID:
     
    399446            pdmNetGsoUpdateTcpHdr(pdmNetGsoUpdateIPv4Hdr(pbSegHdrs, pGso->offHdr1, cbSegPayload, iSeg, pGso->cbHdrs),
    400447                                  pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, iSeg * pGso->cbMaxSeg,
    401                                   pGso->cbHdrs, iSeg + 1 == cSegs, true);
     448                                  pGso->cbHdrs, iSeg + 1 == cSegs, RTNETCSUMTYPE_COMPLETE);
    402449            break;
    403450        case PDMNETWORKGSOTYPE_IPV4_UDP:
    404451            pdmNetGsoUpdateUdpHdr(pdmNetGsoUpdateIPv4Hdr(pbSegHdrs, pGso->offHdr1, cbSegPayload, iSeg, pGso->cbHdrs),
    405                                   pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, pGso->cbHdrs, true);
     452                                  pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, pGso->cbHdrs, RTNETCSUMTYPE_COMPLETE);
    406453            break;
    407454        case PDMNETWORKGSOTYPE_IPV6_TCP:
     
    409456                                                         pGso->offHdr2, RTNETIPV4_PROT_TCP),
    410457                                  pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, iSeg * pGso->cbMaxSeg,
    411                                   pGso->cbHdrs, iSeg + 1 == cSegs, true);
     458                                  pGso->cbHdrs, iSeg + 1 == cSegs, RTNETCSUMTYPE_COMPLETE);
    412459            break;
    413460        case PDMNETWORKGSOTYPE_IPV6_UDP:
    414461            pdmNetGsoUpdateUdpHdr(pdmNetGsoUpdateIPv6Hdr(pbSegHdrs, pGso->offHdr1, cbSegPayload, pGso->cbHdrs,
    415462                                                         pGso->offHdr2, RTNETIPV4_PROT_UDP),
    416                                   pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, pGso->cbHdrs, true);
     463                                  pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, pGso->cbHdrs, RTNETCSUMTYPE_COMPLETE);
    417464            break;
    418465        case PDMNETWORKGSOTYPE_IPV4_IPV6_TCP:
     
    421468                                                         cbSegPayload, pGso->cbHdrs, pGso->offHdr2, RTNETIPV4_PROT_TCP),
    422469                                  pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, iSeg * pGso->cbMaxSeg,
    423                                   pGso->cbHdrs, iSeg + 1 == cSegs, true);
     470                                  pGso->cbHdrs, iSeg + 1 == cSegs, RTNETCSUMTYPE_COMPLETE);
    424471            break;
    425472        case PDMNETWORKGSOTYPE_IPV4_IPV6_UDP:
     
    427474            pdmNetGsoUpdateUdpHdr(pdmNetGsoUpdateIPv6Hdr(pbSegHdrs, pgmNetGsoCalcIpv6Offset(pbSegHdrs, pGso->offHdr1),
    428475                                                         cbSegPayload, pGso->cbHdrs, pGso->offHdr2, RTNETIPV4_PROT_UDP),
    429                                   pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, pGso->cbHdrs, true);
     476                                  pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, pGso->cbHdrs, RTNETCSUMTYPE_COMPLETE);
    430477            break;
    431478        case PDMNETWORKGSOTYPE_INVALID:
     
    446493 * @param   pvFrame             The frame to prepare.
    447494 * @param   cbFrame             The frame size.
    448  * @param   fPayloadChecksum    Whether to checksum payload.
    449  */
    450 DECLINLINE(void) PDMNetGsoPrepForDirectUse(PCPDMNETWORKGSO pGso, void *pvFrame, size_t cbFrame, bool fPayloadChecksum)
     495 * @param   enmCsumType         Whether to checksum the payload, the pseudo
     496 *                              header or nothing.
     497 */
     498DECLINLINE(void) PDMNetGsoPrepForDirectUse(PCPDMNETWORKGSO pGso, void *pvFrame, size_t cbFrame, RTNETCSUMTYPE enmCsumType)
    451499{
    452500    /*
     
    471519        case PDMNETWORKGSOTYPE_IPV4_TCP:
    472520            pdmNetGsoUpdateTcpHdr(pdmNetGsoUpdateIPv4Hdr(pbHdrs, pGso->offHdr1, cbFrame32 - pGso->cbHdrs, 0, pGso->cbHdrs),
    473                                   pbHdrs, pGso->offHdr2, pbPayload, cbPayload, 0, pGso->cbHdrs, true, fPayloadChecksum);
     521                                  pbHdrs, pGso->offHdr2, pbPayload, cbPayload, 0, pGso->cbHdrs, true, enmCsumType);
    474522            break;
    475523        case PDMNETWORKGSOTYPE_IPV4_UDP:
    476524            pdmNetGsoUpdateUdpHdr(pdmNetGsoUpdateIPv4Hdr(pbHdrs, pGso->offHdr1, cbFrame32 - pGso->cbHdrs, 0, pGso->cbHdrs),
    477                                   pbHdrs, pGso->offHdr2, pbPayload, cbPayload, pGso->cbHdrs, fPayloadChecksum);
     525                                  pbHdrs, pGso->offHdr2, pbPayload, cbPayload, pGso->cbHdrs, enmCsumType);
    478526            break;
    479527        case PDMNETWORKGSOTYPE_IPV6_TCP:
    480528            pdmNetGsoUpdateTcpHdr(pdmNetGsoUpdateIPv6Hdr(pbHdrs, pGso->offHdr1, cbPayload, pGso->cbHdrs,
    481529                                                         pGso->offHdr2, RTNETIPV4_PROT_TCP),
    482                                   pbHdrs, pGso->offHdr2, pbPayload, cbPayload, 0, pGso->cbHdrs, true, fPayloadChecksum);
     530                                  pbHdrs, pGso->offHdr2, pbPayload, cbPayload, 0, pGso->cbHdrs, true, enmCsumType);
    483531            break;
    484532        case PDMNETWORKGSOTYPE_IPV6_UDP:
    485533            pdmNetGsoUpdateUdpHdr(pdmNetGsoUpdateIPv6Hdr(pbHdrs, pGso->offHdr1, cbPayload, pGso->cbHdrs,
    486534                                                         pGso->offHdr2, RTNETIPV4_PROT_UDP),
    487                                   pbHdrs, pGso->offHdr2, pbPayload, cbPayload, pGso->cbHdrs, fPayloadChecksum);
     535                                  pbHdrs, pGso->offHdr2, pbPayload, cbPayload, pGso->cbHdrs, enmCsumType);
    488536            break;
    489537        case PDMNETWORKGSOTYPE_IPV4_IPV6_TCP:
     
    491539            pdmNetGsoUpdateTcpHdr(pdmNetGsoUpdateIPv6Hdr(pbHdrs, pgmNetGsoCalcIpv6Offset(pbHdrs, pGso->offHdr1),
    492540                                                         cbPayload, pGso->cbHdrs, pGso->offHdr2, RTNETIPV4_PROT_TCP),
    493                                   pbHdrs, pGso->offHdr2, pbPayload, cbPayload, 0, pGso->cbHdrs, true, fPayloadChecksum);
     541                                  pbHdrs, pGso->offHdr2, pbPayload, cbPayload, 0, pGso->cbHdrs, true, enmCsumType);
    494542            break;
    495543        case PDMNETWORKGSOTYPE_IPV4_IPV6_UDP:
     
    497545            pdmNetGsoUpdateUdpHdr(pdmNetGsoUpdateIPv6Hdr(pbHdrs, pgmNetGsoCalcIpv6Offset(pbHdrs, pGso->offHdr1),
    498546                                                         cbPayload, pGso->cbHdrs, pGso->offHdr2, RTNETIPV4_PROT_UDP),
    499                                   pbHdrs, pGso->offHdr2, pbPayload, cbPayload, pGso->cbHdrs, fPayloadChecksum);
     547                                  pbHdrs, pGso->offHdr2, pbPayload, cbPayload, pGso->cbHdrs, enmCsumType);
    500548            break;
    501549        case PDMNETWORKGSOTYPE_INVALID:
  • trunk/src/VBox/HostDrivers/VBoxNetFlt/linux/VBoxNetFlt-linux.c

    r30924 r31271  
    11201120# endif
    11211121        if (!fDstWire)
    1122             PDMNetGsoPrepForDirectUse(&pSG->GsoCtx, pPkt->data, pSG->cbTotal, false /*fPayloadChecksum*/);
     1122            PDMNetGsoPrepForDirectUse(&pSG->GsoCtx, pPkt->data, pSG->cbTotal, RTNETCSUMTYPE_PSEUDO);
    11231123    }
    11241124#endif /* VBOXNETFLT_WITH_GSO_XMIT_WIRE || VBOXNETFLT_WITH_GSO_XMIT_HOST */
  • trunk/src/VBox/NetworkServices/NetLib/VBoxNetUDP.cpp

    r28800 r31271  
    123123     */
    124124    if (pGso)
    125         PDMNetGsoPrepForDirectUse(pGso, (void *)pvFrame, cbFrame, false /*fPayloadChecksum*/);
     125        PDMNetGsoPrepForDirectUse(pGso, (void *)pvFrame, cbFrame, RTNETCSUMTYPE_NONE);
    126126
    127127    /*
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