VirtualBox

Changeset 28156 in vbox for trunk/include/VBox


Ignore:
Timestamp:
Apr 10, 2010 1:14:10 AM (15 years ago)
Author:
vboxsync
Message:

VBoxNetFlt-linux: GSO to host and wire experiment, the former is a success the latter needs more magic.

File:
1 edited

Legend:

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

    r28153 r28156  
    158158 * @param   cbPayload           The amount of payload.
    159159 * @param   cbHdrs              The size of all the headers.
     160 * @param   fPayloadChecksum    Whether to checksum the payload or not.
    160161 * @internal
    161162 */
    162163DECLINLINE(void) pdmNetGsoUpdateUdpHdr(uint32_t u32PseudoSum, uint8_t *pbSegHdrs, uint8_t offUdpHdr,
    163                                        uint8_t const *pbPayload, uint32_t cbPayload, uint8_t cbHdrs)
     164                                       uint8_t const *pbPayload, uint32_t cbPayload, uint8_t cbHdrs, bool fPayloadChecksum)
    164165{
    165166    PRTNETUDP pUdpHdr = (PRTNETUDP)&pbSegHdrs[offUdpHdr];
    166167    pUdpHdr->uh_ulen = cbPayload + cbHdrs - offUdpHdr;
    167     pUdpHdr->uh_sum  = RTNetUDPChecksum(u32PseudoSum, pUdpHdr);
     168    pUdpHdr->uh_sum  = fPayloadChecksum ? RTNetUDPChecksum(u32PseudoSum, pUdpHdr) : 0;
    168169}
    169170
     
    182183 * @param   cbHdrs              The size of all the headers.
    183184 * @param   fLastSeg            Set if this is the last segment.
     185 * @param   fPayloadChecksum    Whether to checksum the payload or not.
    184186 * @internal
    185187 */
    186188DECLINLINE(void) pdmNetGsoUpdateTcpHdr(uint32_t u32PseudoSum, uint8_t *pbSegHdrs, uint8_t offTcpHdr,
    187                                        uint8_t const *pbPayload, uint32_t cbPayload, uint32_t offPayload, uint8_t cbHdrs, bool fLastSeg)
     189                                       uint8_t const *pbPayload, uint32_t cbPayload, uint32_t offPayload, uint8_t cbHdrs,
     190                                       bool fLastSeg, bool fPayloadChecksum)
    188191{
    189192    PRTNETTCP pTcpHdr = (PRTNETTCP)&pbSegHdrs[offTcpHdr];
     
    191194    if (!fLastSeg)
    192195        pTcpHdr->th_flags &= ~(RTNETTCP_F_FIN | RTNETTCP_F_PSH);
    193     pTcpHdr->th_sum = RTNetTCPChecksum(u32PseudoSum, pTcpHdr, pbPayload, cbPayload);
     196    pTcpHdr->th_sum = fPayloadChecksum ? RTNetTCPChecksum(u32PseudoSum, pTcpHdr, pbPayload, cbPayload) : 0;
    194197}
    195198
     
    298301            pdmNetGsoUpdateTcpHdr(pdmNetGsoUpdateIPv4Hdr(pbSegHdrs, pGso->offHdr1, cbSegPayload, iSeg, pGso->cbHdrs),
    299302                                  pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, iSeg * pGso->cbMaxSeg,
    300                                   pGso->cbHdrs, iSeg + 1 == cSegs);
     303                                  pGso->cbHdrs, iSeg + 1 == cSegs, true);
    301304            break;
    302305        case PDMNETWORKGSOTYPE_IPV4_UDP:
    303306            pdmNetGsoUpdateUdpHdr(pdmNetGsoUpdateIPv4Hdr(pbSegHdrs, pGso->offHdr1, cbSegPayload, iSeg, pGso->cbHdrs),
    304                                   pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, pGso->cbHdrs);
     307                                  pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, pGso->cbHdrs, true);
    305308            break;
    306309        case PDMNETWORKGSOTYPE_IPV6_TCP:
     
    308311                                                         pGso->offHdr2, RTNETIPV4_PROT_TCP),
    309312                                  pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, iSeg * pGso->cbMaxSeg,
    310                                   pGso->cbHdrs, iSeg + 1 == cSegs);
     313                                  pGso->cbHdrs, iSeg + 1 == cSegs, true);
    311314            break;
    312315        case PDMNETWORKGSOTYPE_IPV6_UDP:
    313316            pdmNetGsoUpdateUdpHdr(pdmNetGsoUpdateIPv6Hdr(pbSegHdrs, pGso->offHdr1, cbSegPayload, pGso->cbHdrs,
    314317                                                         pGso->offHdr2, RTNETIPV4_PROT_UDP),
    315                                   pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, pGso->cbHdrs);
     318                                  pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, pGso->cbHdrs, true);
    316319            break;
    317320        case PDMNETWORKGSOTYPE_IPV4_IPV6_TCP:
     
    320323                                                         cbSegPayload, pGso->cbHdrs, pGso->offHdr2, RTNETIPV4_PROT_TCP),
    321324                                  pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, iSeg * pGso->cbMaxSeg,
    322                                   pGso->cbHdrs, iSeg + 1 == cSegs);
     325                                  pGso->cbHdrs, iSeg + 1 == cSegs, true);
    323326            break;
    324327        case PDMNETWORKGSOTYPE_IPV4_IPV6_UDP:
     
    326329            pdmNetGsoUpdateUdpHdr(pdmNetGsoUpdateIPv6Hdr(pbSegHdrs, pgmNetGsoCalcIpv6Offset(pbSegHdrs, pGso->offHdr1),
    327330                                                         cbSegPayload, pGso->cbHdrs, pGso->offHdr2, RTNETIPV4_PROT_UDP),
    328                                   pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, pGso->cbHdrs);
     331                                  pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, pGso->cbHdrs, true);
    329332            break;
    330333        case PDMNETWORKGSOTYPE_INVALID:
     
    391394            pdmNetGsoUpdateTcpHdr(pdmNetGsoUpdateIPv4Hdr(pbSegHdrs, pGso->offHdr1, cbSegPayload, iSeg, pGso->cbHdrs),
    392395                                  pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, iSeg * pGso->cbMaxSeg,
    393                                   pGso->cbHdrs, iSeg + 1 == cSegs);
     396                                  pGso->cbHdrs, iSeg + 1 == cSegs, true);
    394397            break;
    395398        case PDMNETWORKGSOTYPE_IPV4_UDP:
    396399            pdmNetGsoUpdateUdpHdr(pdmNetGsoUpdateIPv4Hdr(pbSegHdrs, pGso->offHdr1, cbSegPayload, iSeg, pGso->cbHdrs),
    397                                   pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, pGso->cbHdrs);
     400                                  pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, pGso->cbHdrs, true);
    398401            break;
    399402        case PDMNETWORKGSOTYPE_IPV6_TCP:
     
    401404                                                         pGso->offHdr2, RTNETIPV4_PROT_TCP),
    402405                                  pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, iSeg * pGso->cbMaxSeg,
    403                                   pGso->cbHdrs, iSeg + 1 == cSegs);
     406                                  pGso->cbHdrs, iSeg + 1 == cSegs, true);
    404407            break;
    405408        case PDMNETWORKGSOTYPE_IPV6_UDP:
    406409            pdmNetGsoUpdateUdpHdr(pdmNetGsoUpdateIPv6Hdr(pbSegHdrs, pGso->offHdr1, cbSegPayload, pGso->cbHdrs,
    407410                                                         pGso->offHdr2, RTNETIPV4_PROT_UDP),
    408                                   pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, pGso->cbHdrs);
     411                                  pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, pGso->cbHdrs, true);
    409412            break;
    410413        case PDMNETWORKGSOTYPE_IPV4_IPV6_TCP:
     
    413416                                                         cbSegPayload, pGso->cbHdrs, pGso->offHdr2, RTNETIPV4_PROT_TCP),
    414417                                  pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, iSeg * pGso->cbMaxSeg,
    415                                   pGso->cbHdrs, iSeg + 1 == cSegs);
     418                                  pGso->cbHdrs, iSeg + 1 == cSegs, true);
    416419            break;
    417420        case PDMNETWORKGSOTYPE_IPV4_IPV6_UDP:
     
    419422            pdmNetGsoUpdateUdpHdr(pdmNetGsoUpdateIPv6Hdr(pbSegHdrs, pgmNetGsoCalcIpv6Offset(pbSegHdrs, pGso->offHdr1),
    420423                                                         cbSegPayload, pGso->cbHdrs, pGso->offHdr2, RTNETIPV4_PROT_UDP),
    421                                   pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, pGso->cbHdrs);
     424                                  pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, pGso->cbHdrs, true);
    422425            break;
    423426        case PDMNETWORKGSOTYPE_INVALID:
     
    432435
    433436
    434 
    435 
    436 DECLINLINE(void) PDMNetGsoPrepForDirectUse(PCPDMNETWORKGSO pGso, void *pvFrame, size_t cbFrame,
    437                                            bool fHeaderChecskum, bool fPayloadChecksum)
    438 {
    439 /** @todo Need to implement this eventually, not important yet as it's only use
    440  *        by DHCP where GSO isn't normally used. */
     437/**
     438 * Prepares the GSO frame for direct use without any segmenting.
     439 *
     440 * @param   pGso                The GSO context.
     441 * @param   pvFrame             The frame to prepare.
     442 * @param   cbFrame             The frame size.
     443 * @param   fPayloadChecksum    Whether to checksum payload.
     444 */
     445DECLINLINE(void) PDMNetGsoPrepForDirectUse(PCPDMNETWORKGSO pGso, void *pvFrame, size_t cbFrame, bool fPayloadChecksum)
     446{
     447    /*
     448     * Figure out where the payload is and where the header starts before we
     449     * do the protocol bits.
     450     */
     451    uint8_t * const pbHdrs    = (uint8_t *)pvFrame;
     452    uint8_t * const pbPayload = pbHdrs  + pGso->cbHdrs;
     453    size_t    const cbPayload = cbFrame - pGso->cbHdrs;
     454
     455    /*
     456     * Check assumptions (doing it after declaring the variables because of C).
     457     */
     458    Assert(PDMNetGsoIsValid(pGso, sizeof(*pGso), cbFrame));
     459
     460    /*
     461     * Get down to busienss.
     462     */
     463    switch ((PDMNETWORKGSOTYPE)pGso->u8Type)
     464    {
     465        case PDMNETWORKGSOTYPE_IPV4_TCP:
     466            pdmNetGsoUpdateTcpHdr(pdmNetGsoUpdateIPv4Hdr(pbHdrs, pGso->offHdr1, cbFrame - pGso->cbHdrs, 0, pGso->cbHdrs),
     467                                  pbHdrs, pGso->offHdr2, pbPayload, cbPayload, 0, pGso->cbHdrs, true, fPayloadChecksum);
     468            break;
     469        case PDMNETWORKGSOTYPE_IPV4_UDP:
     470            pdmNetGsoUpdateUdpHdr(pdmNetGsoUpdateIPv4Hdr(pbHdrs, pGso->offHdr1, cbFrame - pGso->cbHdrs, 0, pGso->cbHdrs),
     471                                  pbHdrs, pGso->offHdr2, pbPayload, cbPayload, pGso->cbHdrs, fPayloadChecksum);
     472            break;
     473        case PDMNETWORKGSOTYPE_IPV6_TCP:
     474            pdmNetGsoUpdateTcpHdr(pdmNetGsoUpdateIPv6Hdr(pbHdrs, pGso->offHdr1, cbPayload, pGso->cbHdrs,
     475                                                         pGso->offHdr2, RTNETIPV4_PROT_TCP),
     476                                  pbHdrs, pGso->offHdr2, pbPayload, cbPayload, 0, pGso->cbHdrs, true, fPayloadChecksum);
     477            break;
     478        case PDMNETWORKGSOTYPE_IPV6_UDP:
     479            pdmNetGsoUpdateUdpHdr(pdmNetGsoUpdateIPv6Hdr(pbHdrs, pGso->offHdr1, cbPayload, pGso->cbHdrs,
     480                                                         pGso->offHdr2, RTNETIPV4_PROT_UDP),
     481                                  pbHdrs, pGso->offHdr2, pbPayload, cbPayload, pGso->cbHdrs, fPayloadChecksum);
     482            break;
     483        case PDMNETWORKGSOTYPE_IPV4_IPV6_TCP:
     484            pdmNetGsoUpdateIPv4Hdr(pbHdrs, pGso->offHdr1, cbPayload, 0, pGso->cbHdrs);
     485            pdmNetGsoUpdateTcpHdr(pdmNetGsoUpdateIPv6Hdr(pbHdrs, pgmNetGsoCalcIpv6Offset(pbHdrs, pGso->offHdr1),
     486                                                         cbPayload, pGso->cbHdrs, pGso->offHdr2, RTNETIPV4_PROT_TCP),
     487                                  pbHdrs, pGso->offHdr2, pbPayload, cbPayload, 0, pGso->cbHdrs, true, fPayloadChecksum);
     488            break;
     489        case PDMNETWORKGSOTYPE_IPV4_IPV6_UDP:
     490            pdmNetGsoUpdateIPv4Hdr(pbHdrs, pGso->offHdr1, cbPayload, 0, pGso->cbHdrs);
     491            pdmNetGsoUpdateUdpHdr(pdmNetGsoUpdateIPv6Hdr(pbHdrs, pgmNetGsoCalcIpv6Offset(pbHdrs, pGso->offHdr1),
     492                                                         cbPayload, pGso->cbHdrs, pGso->offHdr2, RTNETIPV4_PROT_UDP),
     493                                  pbHdrs, pGso->offHdr2, pbPayload, cbPayload, pGso->cbHdrs, fPayloadChecksum);
     494            break;
     495        case PDMNETWORKGSOTYPE_INVALID:
     496        case PDMNETWORKGSOTYPE_END:
     497            /* no default! wnat gcc warnings. */
     498            break;
     499    }
    441500}
    442501
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