VirtualBox

Ticket #7081: corrected_checksum.patch

File corrected_checksum.patch, 14.8 KB (added by Aleksey Ilyushin, 14 years ago)
  • vboxnetflt/include/VBox/pdmnetinline.h

    old new  
    3939#include <iprt/string.h>
    4040
    4141
     42/**
     43 * Checksum type.
     44 */
     45typedef enum PDMNETCSUMTYPE
     46{
     47    /** No checksum. */
     48    PDMNETCSUMTYPE_NONE = 0,
     49    /** Normal TCP checksum. */
     50    PDMNETCSUMTYPE_COMPLETE,
     51    /** Checksum on pseudo header (used with GSO). */
     52    PDMNETCSUMTYPE_PSEUDO,
     53    /** The usual 32-bit hack. */
     54    PDMNETCSUMTYPE_32_BIT_HACK = 0x7fffffff
     55} PDMNETCSUMTYPE;
     56
    4257
    4358/**
    4459 * Validates the GSO context.
     
    162177 * @param   pbPayload           Pointer to the payload bytes.
    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                                       PDMNETCSUMTYPE 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 PDMNETCSUMTYPE_NONE:
     193            pUdpHdr->uh_sum = 0;
     194            break;
     195        case PDMNETCSUMTYPE_COMPLETE:
     196            pUdpHdr->uh_sum = RTNetUDPChecksum(u32PseudoSum, pUdpHdr);
     197            break;
     198        case PDMNETCSUMTYPE_PSEUDO:
     199            pUdpHdr->uh_sum = ~RTNetIPv4FinalizeChecksum(u32PseudoSum);
     200            break;
     201        default:
     202            AssertFailed();
     203            break;
     204    }
    174205}
    175206
    176207
     
    187218 *                              immediately after the TCP header w/ options.
    188219 * @param   cbHdrs              The size of all the headers.
    189220 * @param   fLastSeg            Set if this is the last segment.
    190  * @param   fPayloadChecksum    Whether to checksum the payload or not.
     221 * @param   enmCsumType         Whether to checksum the payload, the pseudo
     222 *                              header or nothing.
    191223 * @internal
    192224 */
    193225DECLINLINE(void) pdmNetGsoUpdateTcpHdr(uint32_t u32PseudoSum, uint8_t *pbSegHdrs, uint8_t offTcpHdr,
    194226                                       uint8_t const *pbPayload, uint32_t cbPayload, uint32_t offPayload, uint8_t cbHdrs,
    195                                        bool fLastSeg, bool fPayloadChecksum)
     227                                       bool fLastSeg, PDMNETCSUMTYPE enmCsumType)
    196228{
    197229    PRTNETTCP pTcpHdr = (PRTNETTCP)&pbSegHdrs[offTcpHdr];
    198230    pTcpHdr->th_seq = RT_H2N_U32(RT_N2H_U32(pTcpHdr->th_seq) + offPayload);
    199231    if (!fLastSeg)
    200232        pTcpHdr->th_flags &= ~(RTNETTCP_F_FIN | RTNETTCP_F_PSH);
    201     pTcpHdr->th_sum = fPayloadChecksum ? RTNetTCPChecksum(u32PseudoSum, pTcpHdr, pbPayload, cbPayload) : 0;
     233    switch (enmCsumType)
     234    {
     235        case PDMNETCSUMTYPE_NONE:
     236            pTcpHdr->th_sum = 0;
     237            break;
     238        case PDMNETCSUMTYPE_COMPLETE:
     239            pTcpHdr->th_sum = RTNetTCPChecksum(u32PseudoSum, pTcpHdr, pbPayload, cbPayload);
     240            break;
     241        case PDMNETCSUMTYPE_PSEUDO:
     242            pTcpHdr->th_sum = ~RTNetIPv4FinalizeChecksum(u32PseudoSum);
     243            break;
     244        default:
     245            AssertFailed();
     246            break;
     247    }
    202248}
    203249
    204250
     
    305351        case PDMNETWORKGSOTYPE_IPV4_TCP:
    306352            pdmNetGsoUpdateTcpHdr(pdmNetGsoUpdateIPv4Hdr(pbSegHdrs, pGso->offHdr1, cbSegPayload, iSeg, pGso->cbHdrs),
    307353                                  pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, iSeg * pGso->cbMaxSeg,
    308                                   pGso->cbHdrs, iSeg + 1 == cSegs, true);
     354                                  pGso->cbHdrs, iSeg + 1 == cSegs, PDMNETCSUMTYPE_COMPLETE);
    309355            break;
    310356        case PDMNETWORKGSOTYPE_IPV4_UDP:
    311357            pdmNetGsoUpdateUdpHdr(pdmNetGsoUpdateIPv4Hdr(pbSegHdrs, pGso->offHdr1, cbSegPayload, iSeg, pGso->cbHdrs),
    312                                   pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, pGso->cbHdrs, true);
     358                                  pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, pGso->cbHdrs, PDMNETCSUMTYPE_COMPLETE);
    313359            break;
    314360        case PDMNETWORKGSOTYPE_IPV6_TCP:
    315361            pdmNetGsoUpdateTcpHdr(pdmNetGsoUpdateIPv6Hdr(pbSegHdrs, pGso->offHdr1, cbSegPayload, pGso->cbHdrs,
    316362                                                         pGso->offHdr2, RTNETIPV4_PROT_TCP),
    317363                                  pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, iSeg * pGso->cbMaxSeg,
    318                                   pGso->cbHdrs, iSeg + 1 == cSegs, true);
     364                                  pGso->cbHdrs, iSeg + 1 == cSegs, PDMNETCSUMTYPE_COMPLETE);
    319365            break;
    320366        case PDMNETWORKGSOTYPE_IPV6_UDP:
    321367            pdmNetGsoUpdateUdpHdr(pdmNetGsoUpdateIPv6Hdr(pbSegHdrs, pGso->offHdr1, cbSegPayload, pGso->cbHdrs,
    322368                                                         pGso->offHdr2, RTNETIPV4_PROT_UDP),
    323                                   pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, pGso->cbHdrs, true);
     369                                  pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, pGso->cbHdrs, PDMNETCSUMTYPE_COMPLETE);
    324370            break;
    325371        case PDMNETWORKGSOTYPE_IPV4_IPV6_TCP:
    326372            pdmNetGsoUpdateIPv4Hdr(pbSegHdrs, pGso->offHdr1, cbSegPayload, iSeg, pGso->cbHdrs);
    327373            pdmNetGsoUpdateTcpHdr(pdmNetGsoUpdateIPv6Hdr(pbSegHdrs, pgmNetGsoCalcIpv6Offset(pbSegHdrs, pGso->offHdr1),
    328374                                                         cbSegPayload, pGso->cbHdrs, pGso->offHdr2, RTNETIPV4_PROT_TCP),
    329375                                  pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, iSeg * pGso->cbMaxSeg,
    330                                   pGso->cbHdrs, iSeg + 1 == cSegs, true);
     376                                  pGso->cbHdrs, iSeg + 1 == cSegs, PDMNETCSUMTYPE_COMPLETE);
    331377            break;
    332378        case PDMNETWORKGSOTYPE_IPV4_IPV6_UDP:
    333379            pdmNetGsoUpdateIPv4Hdr(pbSegHdrs, pGso->offHdr1, cbSegPayload, iSeg, pGso->cbHdrs);
    334380            pdmNetGsoUpdateUdpHdr(pdmNetGsoUpdateIPv6Hdr(pbSegHdrs, pgmNetGsoCalcIpv6Offset(pbSegHdrs, pGso->offHdr1),
    335381                                                         cbSegPayload, pGso->cbHdrs, pGso->offHdr2, RTNETIPV4_PROT_UDP),
    336                                   pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, pGso->cbHdrs, true);
     382                                  pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, pGso->cbHdrs, PDMNETCSUMTYPE_COMPLETE);
    337383            break;
    338384        case PDMNETWORKGSOTYPE_INVALID:
    339385        case PDMNETWORKGSOTYPE_END:
     
    398444        case PDMNETWORKGSOTYPE_IPV4_TCP:
    399445            pdmNetGsoUpdateTcpHdr(pdmNetGsoUpdateIPv4Hdr(pbSegHdrs, pGso->offHdr1, cbSegPayload, iSeg, pGso->cbHdrs),
    400446                                  pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, iSeg * pGso->cbMaxSeg,
    401                                   pGso->cbHdrs, iSeg + 1 == cSegs, true);
     447                                  pGso->cbHdrs, iSeg + 1 == cSegs, PDMNETCSUMTYPE_COMPLETE);
    402448            break;
    403449        case PDMNETWORKGSOTYPE_IPV4_UDP:
    404450            pdmNetGsoUpdateUdpHdr(pdmNetGsoUpdateIPv4Hdr(pbSegHdrs, pGso->offHdr1, cbSegPayload, iSeg, pGso->cbHdrs),
    405                                   pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, pGso->cbHdrs, true);
     451                                  pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, pGso->cbHdrs, PDMNETCSUMTYPE_COMPLETE);
    406452            break;
    407453        case PDMNETWORKGSOTYPE_IPV6_TCP:
    408454            pdmNetGsoUpdateTcpHdr(pdmNetGsoUpdateIPv6Hdr(pbSegHdrs, pGso->offHdr1, cbSegPayload, pGso->cbHdrs,
    409455                                                         pGso->offHdr2, RTNETIPV4_PROT_TCP),
    410456                                  pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, iSeg * pGso->cbMaxSeg,
    411                                   pGso->cbHdrs, iSeg + 1 == cSegs, true);
     457                                  pGso->cbHdrs, iSeg + 1 == cSegs, PDMNETCSUMTYPE_COMPLETE);
    412458            break;
    413459        case PDMNETWORKGSOTYPE_IPV6_UDP:
    414460            pdmNetGsoUpdateUdpHdr(pdmNetGsoUpdateIPv6Hdr(pbSegHdrs, pGso->offHdr1, cbSegPayload, pGso->cbHdrs,
    415461                                                         pGso->offHdr2, RTNETIPV4_PROT_UDP),
    416                                   pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, pGso->cbHdrs, true);
     462                                  pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, pGso->cbHdrs, PDMNETCSUMTYPE_COMPLETE);
    417463            break;
    418464        case PDMNETWORKGSOTYPE_IPV4_IPV6_TCP:
    419465            pdmNetGsoUpdateIPv4Hdr(pbSegHdrs, pGso->offHdr1, cbSegPayload, iSeg, pGso->cbHdrs);
    420466            pdmNetGsoUpdateTcpHdr(pdmNetGsoUpdateIPv6Hdr(pbSegHdrs, pgmNetGsoCalcIpv6Offset(pbSegHdrs, pGso->offHdr1),
    421467                                                         cbSegPayload, pGso->cbHdrs, pGso->offHdr2, RTNETIPV4_PROT_TCP),
    422468                                  pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, iSeg * pGso->cbMaxSeg,
    423                                   pGso->cbHdrs, iSeg + 1 == cSegs, true);
     469                                  pGso->cbHdrs, iSeg + 1 == cSegs, PDMNETCSUMTYPE_COMPLETE);
    424470            break;
    425471        case PDMNETWORKGSOTYPE_IPV4_IPV6_UDP:
    426472            pdmNetGsoUpdateIPv4Hdr(pbSegHdrs, pGso->offHdr1, cbSegPayload, iSeg, pGso->cbHdrs);
    427473            pdmNetGsoUpdateUdpHdr(pdmNetGsoUpdateIPv6Hdr(pbSegHdrs, pgmNetGsoCalcIpv6Offset(pbSegHdrs, pGso->offHdr1),
    428474                                                         cbSegPayload, pGso->cbHdrs, pGso->offHdr2, RTNETIPV4_PROT_UDP),
    429                                   pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, pGso->cbHdrs, true);
     475                                  pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, pGso->cbHdrs, PDMNETCSUMTYPE_COMPLETE);
    430476            break;
    431477        case PDMNETWORKGSOTYPE_INVALID:
    432478        case PDMNETWORKGSOTYPE_END:
     
    445491 * @param   pGso                The GSO context.
    446492 * @param   pvFrame             The frame to prepare.
    447493 * @param   cbFrame             The frame size.
    448  * @param   fPayloadChecksum    Whether to checksum payload.
     494 * @param   enmCsumType         Whether to checksum the payload, the pseudo
     495 *                              header or nothing.
    449496 */
    450 DECLINLINE(void) PDMNetGsoPrepForDirectUse(PCPDMNETWORKGSO pGso, void *pvFrame, size_t cbFrame, bool fPayloadChecksum)
     497DECLINLINE(void) PDMNetGsoPrepForDirectUse(PCPDMNETWORKGSO pGso, void *pvFrame, size_t cbFrame, PDMNETCSUMTYPE enmCsumType)
    451498{
    452499    /*
    453500     * Figure out where the payload is and where the header starts before we
     
    470517    {
    471518        case PDMNETWORKGSOTYPE_IPV4_TCP:
    472519            pdmNetGsoUpdateTcpHdr(pdmNetGsoUpdateIPv4Hdr(pbHdrs, pGso->offHdr1, cbFrame32 - pGso->cbHdrs, 0, pGso->cbHdrs),
    473                                   pbHdrs, pGso->offHdr2, pbPayload, cbPayload, 0, pGso->cbHdrs, true, fPayloadChecksum);
     520                                  pbHdrs, pGso->offHdr2, pbPayload, cbPayload, 0, pGso->cbHdrs, true, enmCsumType);
    474521            break;
    475522        case PDMNETWORKGSOTYPE_IPV4_UDP:
    476523            pdmNetGsoUpdateUdpHdr(pdmNetGsoUpdateIPv4Hdr(pbHdrs, pGso->offHdr1, cbFrame32 - pGso->cbHdrs, 0, pGso->cbHdrs),
    477                                   pbHdrs, pGso->offHdr2, pbPayload, cbPayload, pGso->cbHdrs, fPayloadChecksum);
     524                                  pbHdrs, pGso->offHdr2, pbPayload, cbPayload, pGso->cbHdrs, enmCsumType);
    478525            break;
    479526        case PDMNETWORKGSOTYPE_IPV6_TCP:
    480527            pdmNetGsoUpdateTcpHdr(pdmNetGsoUpdateIPv6Hdr(pbHdrs, pGso->offHdr1, cbPayload, pGso->cbHdrs,
    481528                                                         pGso->offHdr2, RTNETIPV4_PROT_TCP),
    482                                   pbHdrs, pGso->offHdr2, pbPayload, cbPayload, 0, pGso->cbHdrs, true, fPayloadChecksum);
     529                                  pbHdrs, pGso->offHdr2, pbPayload, cbPayload, 0, pGso->cbHdrs, true, enmCsumType);
    483530            break;
    484531        case PDMNETWORKGSOTYPE_IPV6_UDP:
    485532            pdmNetGsoUpdateUdpHdr(pdmNetGsoUpdateIPv6Hdr(pbHdrs, pGso->offHdr1, cbPayload, pGso->cbHdrs,
    486533                                                         pGso->offHdr2, RTNETIPV4_PROT_UDP),
    487                                   pbHdrs, pGso->offHdr2, pbPayload, cbPayload, pGso->cbHdrs, fPayloadChecksum);
     534                                  pbHdrs, pGso->offHdr2, pbPayload, cbPayload, pGso->cbHdrs, enmCsumType);
    488535            break;
    489536        case PDMNETWORKGSOTYPE_IPV4_IPV6_TCP:
    490537            pdmNetGsoUpdateIPv4Hdr(pbHdrs, pGso->offHdr1, cbPayload, 0, pGso->cbHdrs);
    491538            pdmNetGsoUpdateTcpHdr(pdmNetGsoUpdateIPv6Hdr(pbHdrs, pgmNetGsoCalcIpv6Offset(pbHdrs, pGso->offHdr1),
    492539                                                         cbPayload, pGso->cbHdrs, pGso->offHdr2, RTNETIPV4_PROT_TCP),
    493                                   pbHdrs, pGso->offHdr2, pbPayload, cbPayload, 0, pGso->cbHdrs, true, fPayloadChecksum);
     540                                  pbHdrs, pGso->offHdr2, pbPayload, cbPayload, 0, pGso->cbHdrs, true, enmCsumType);
    494541            break;
    495542        case PDMNETWORKGSOTYPE_IPV4_IPV6_UDP:
    496543            pdmNetGsoUpdateIPv4Hdr(pbHdrs, pGso->offHdr1, cbPayload, 0, pGso->cbHdrs);
    497544            pdmNetGsoUpdateUdpHdr(pdmNetGsoUpdateIPv6Hdr(pbHdrs, pgmNetGsoCalcIpv6Offset(pbHdrs, pGso->offHdr1),
    498545                                                         cbPayload, pGso->cbHdrs, pGso->offHdr2, RTNETIPV4_PROT_UDP),
    499                                   pbHdrs, pGso->offHdr2, pbPayload, cbPayload, pGso->cbHdrs, fPayloadChecksum);
     546                                  pbHdrs, pGso->offHdr2, pbPayload, cbPayload, pGso->cbHdrs, enmCsumType);
    500547            break;
    501548        case PDMNETWORKGSOTYPE_INVALID:
    502549        case PDMNETWORKGSOTYPE_END:
  • vboxnetflt/linux/VBoxNetFlt-linux.c

    old new  
    569581# endif
    570582        }
    571583        if (!fDstWire)
    572             PDMNetGsoPrepForDirectUse(&pSG->GsoCtx, pPkt->data, pSG->cbTotal, false /*fPayloadChecksum*/);
     584            PDMNetGsoPrepForDirectUse(&pSG->GsoCtx, pPkt->data, pSG->cbTotal, PDMNETCSUMTYPE_PSEUDO);
    573585    }
    574586#endif /* VBOXNETFLT_WITH_GSO_XMIT_WIRE || VBOXNETFLT_WITH_GSO_XMIT_HOST */
    575587

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