VirtualBox

Changeset 28037 in vbox for trunk/include


Ignore:
Timestamp:
Apr 7, 2010 9:56:45 AM (15 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
59744
Message:

DevE1000,GSO: coding.

Location:
trunk/include/VBox
Files:
3 edited

Legend:

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

    r28027 r28037  
    8282    pSG->GsoCtx.cbMaxSeg= 0;
    8383    pSG->GsoCtx.offHdr1 = 0;
    84     pSG->GsoCtx.cbHdr1  = 0;
    8584    pSG->GsoCtx.offHdr2 = 0;
    86     pSG->GsoCtx.cbHdr2  = 0;
     85    pSG->GsoCtx.au8Unused[0] = 0;
     86    pSG->GsoCtx.au8Unused[1] = 0;
    8787#if ARCH_BITS == 64
    8888    pSG->uPadding       = 0;
     
    120120    pSG->GsoCtx.cbMaxSeg= pGso->cbMaxSeg;
    121121    pSG->GsoCtx.offHdr1 = pGso->offHdr1;
    122     pSG->GsoCtx.cbHdr1  = pGso->cbHdr1;
    123122    pSG->GsoCtx.offHdr2 = pGso->offHdr2;
    124     pSG->GsoCtx.cbHdr2  = pGso->cbHdr2;
     123    pSG->GsoCtx.au8Unused[0] = 0;
     124    pSG->GsoCtx.au8Unused[1] = 0;
    125125#if ARCH_BITS == 64
    126126    pSG->uPadding       = 0;
  • trunk/include/VBox/pdmnetinline.h

    r28028 r28037  
    5252
    5353    PDMNETWORKGSOTYPE const enmType = (PDMNETWORKGSOTYPE)pGso->u8Type;
    54     if (RT_UNLIKELY(enmType <= PDMNETWORKGSOTYPE_INVALID || enmType >= PDMNETWORKGSOTYPE_END))
     54    if (RT_UNLIKELY( enmType <= PDMNETWORKGSOTYPE_INVALID || enmType >= PDMNETWORKGSOTYPE_END ))
    5555        return false;
    5656
    5757    /* all types requires both headers. */
    58     if (RT_UNLIKELY(pGso->offHdr1 < sizeof(RTNETETHERHDR)))
    59         return false;
    60     if (RT_UNLIKELY(pGso->offHdr2 < sizeof(RTNETETHERHDR)))
    61         return false;
    62     if (RT_UNLIKELY(pGso->offHdr2 < (unsigned)pGso->offHdr1 + pGso->cbHdr1))
    63         return false;
    64     if (RT_UNLIKELY(pGso->cbHdrs  < (unsigned)pGso->offHdr2 + pGso->cbHdr2))
     58    if (RT_UNLIKELY( pGso->offHdr1 < sizeof(RTNETETHERHDR) ))
     59        return false;
     60    if (RT_UNLIKELY( pGso->offHdr2 <= pGso->offHdr1 ))
     61        return false;
     62    if (RT_UNLIKELY( pGso->cbHdrs  <= pGso->offHdr2 ))
    6563        return false;
    6664
     
    7068        case PDMNETWORKGSOTYPE_IPV4_TCP:
    7169        case PDMNETWORKGSOTYPE_IPV4_UDP:
    72             if (RT_UNLIKELY(pGso->cbHdr1 < sizeof(RTNETIPV4_MIN_LEN)))
     70            if (RT_UNLIKELY( (unsigned)pGso->offHdr2 - pGso->offHdr1 < RTNETIPV4_MIN_LEN ))
     71                return false;
     72            break;
     73        case PDMNETWORKGSOTYPE_IPV6_TCP:
     74        case PDMNETWORKGSOTYPE_IPV6_UDP:
     75            if (RT_UNLIKELY( (unsigned)pGso->offHdr2 - pGso->offHdr1 < RTNETIPV6_MIN_LEN ))
    7376                return false;
    7477            break;
    7578        case PDMNETWORKGSOTYPE_IPV4_IPV6_TCP:
    7679        case PDMNETWORKGSOTYPE_IPV4_IPV6_UDP:
    77             if (RT_UNLIKELY(pGso->cbHdr1 < sizeof(RTNETIPV4_MIN_LEN)))
    78                 return false;
    79             if (RT_UNLIKELY(pGso->offHdr1 + pGso->cbHdr1 + RTNETIPV6_MIN_LEN > pGso->offHdr2))
    80                 return false;
    81             break;
    82         case PDMNETWORKGSOTYPE_IPV6_TCP:
    83         case PDMNETWORKGSOTYPE_IPV6_UDP:
    84             if (RT_UNLIKELY(pGso->cbHdr1 < sizeof(RTNETIPV6_MIN_LEN)))
     80            if (RT_UNLIKELY( (unsigned)pGso->offHdr2 - pGso->offHdr1 < RTNETIPV4_MIN_LEN + RTNETIPV6_MIN_LEN ))
    8581                return false;
    8682            break;
     
    9793        case PDMNETWORKGSOTYPE_IPV6_TCP:
    9894        case PDMNETWORKGSOTYPE_IPV4_IPV6_TCP:
    99             if (RT_UNLIKELY(pGso->cbHdr2 < sizeof(RTNETTCP_MIN_LEN)))
     95            if (RT_UNLIKELY( (unsigned)pGso->cbHdrs - pGso->offHdr2 < RTNETTCP_MIN_LEN ))
    10096                return false;
    10197            break;
     
    10399        case PDMNETWORKGSOTYPE_IPV6_UDP:
    104100        case PDMNETWORKGSOTYPE_IPV4_IPV6_UDP:
    105             if (RT_UNLIKELY(pGso->cbHdr2 < sizeof(RTNETUDP_MIN_LEN)))
     101            if (RT_UNLIKELY( (unsigned)pGso->cbHdrs - pGso->offHdr2 < RTNETUDP_MIN_LEN ))
    106102                return false;
    107103            break;
     
    113109
    114110    /* There must be at more than one segment. */
    115     if (RT_UNLIKELY(cbFrame <= pGso->cbHdrs))
    116         return false;
    117     if (RT_UNLIKELY(cbFrame - pGso->cbHdrs < pGso->cbMaxSeg))
     111    if (RT_UNLIKELY( cbFrame <= pGso->cbHdrs ))
     112        return false;
     113    if (RT_UNLIKELY( cbFrame - pGso->cbHdrs < pGso->cbMaxSeg ))
    118114        return false;
    119115
     
    215211{
    216212    PRTNETIPV6 pIpHdr  = (PRTNETIPV6)&pbSegHdrs[offIpHdr];
    217     uint32_t cbPayload = cbHdrs - offIpHdr + sizeof(*pIpHdr) + cbSegPayload;
     213    uint16_t cbPayload = (uint16_t)(cbHdrs - (offIpHdr + sizeof(RTNETIPV6)) + cbSegPayload);
    218214    pIpHdr->ip6_plen   = RT_H2N_U16(cbPayload);
    219     cbPayload         -= (offPktHdr - offPktHdr - sizeof(*pIpHdr));
    220     return RTNetIPv6PseudoChecksumEx(pIpHdr, bProtocol, (uint16_t)cbPayload);
     215    return RTNetIPv6PseudoChecksumEx(pIpHdr, bProtocol, (uint16_t)(cbHdrs - offPktHdr + cbSegPayload));
    221216}
    222217
     
    309304        case PDMNETWORKGSOTYPE_IPV6_TCP:
    310305            pdmNetGsoUpdateTcpHdr(pdmNetGsoUpdateIPv6Hdr(pbSegHdrs, pGso->offHdr1, cbSegPayload, pGso->cbHdrs,
    311                                                          pGso->cbHdr2, RTNETIPV4_PROT_TCP),
     306                                                         pGso->offHdr2, RTNETIPV4_PROT_TCP),
    312307                                  pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, iSeg * pGso->cbMaxSeg,
    313308                                  pGso->cbHdrs, iSeg + 1 == cSegs);
     
    315310        case PDMNETWORKGSOTYPE_IPV6_UDP:
    316311            pdmNetGsoUpdateUdpHdr(pdmNetGsoUpdateIPv6Hdr(pbSegHdrs, pGso->offHdr1, cbSegPayload, pGso->cbHdrs,
    317                                                          pGso->cbHdr2, RTNETIPV4_PROT_UDP),
     312                                                         pGso->offHdr2, RTNETIPV4_PROT_UDP),
    318313                                  pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, pGso->cbHdrs);
    319314            break;
     
    321316            pdmNetGsoUpdateIPv4Hdr(pbSegHdrs, pGso->offHdr1, cbSegPayload, iSeg, pGso->cbHdrs);
    322317            pdmNetGsoUpdateTcpHdr(pdmNetGsoUpdateIPv6Hdr(pbSegHdrs, pgmNetGsoCalcIpv6Offset(pbSegHdrs, pGso->offHdr1),
    323                                                          cbSegPayload, pGso->cbHdrs, pGso->cbHdr2, RTNETIPV4_PROT_TCP),
     318                                                         cbSegPayload, pGso->cbHdrs, pGso->offHdr2, RTNETIPV4_PROT_TCP),
    324319                                  pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, iSeg * pGso->cbMaxSeg,
    325320                                  pGso->cbHdrs, iSeg + 1 == cSegs);
     
    328323            pdmNetGsoUpdateIPv4Hdr(pbSegHdrs, pGso->offHdr1, cbSegPayload, iSeg, pGso->cbHdrs);
    329324            pdmNetGsoUpdateUdpHdr(pdmNetGsoUpdateIPv6Hdr(pbSegHdrs, pgmNetGsoCalcIpv6Offset(pbSegHdrs, pGso->offHdr1),
    330                                                          cbSegPayload, pGso->cbHdrs, pGso->cbHdr2, RTNETIPV4_PROT_UDP),
     325                                                         cbSegPayload, pGso->cbHdrs, pGso->offHdr2, RTNETIPV4_PROT_UDP),
    331326                                  pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, pGso->cbHdrs);
    332327            break;
     
    402397        case PDMNETWORKGSOTYPE_IPV6_TCP:
    403398            pdmNetGsoUpdateTcpHdr(pdmNetGsoUpdateIPv6Hdr(pbSegHdrs, pGso->offHdr1, cbSegPayload, pGso->cbHdrs,
    404                                                          pGso->cbHdr2, RTNETIPV4_PROT_TCP),
     399                                                         pGso->offHdr2, RTNETIPV4_PROT_TCP),
    405400                                  pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, iSeg * pGso->cbMaxSeg,
    406401                                  pGso->cbHdrs, iSeg + 1 == cSegs);
     
    408403        case PDMNETWORKGSOTYPE_IPV6_UDP:
    409404            pdmNetGsoUpdateUdpHdr(pdmNetGsoUpdateIPv6Hdr(pbSegHdrs, pGso->offHdr1, cbSegPayload, pGso->cbHdrs,
    410                                                          pGso->cbHdr2, RTNETIPV4_PROT_UDP),
     405                                                         pGso->offHdr2, RTNETIPV4_PROT_UDP),
    411406                                  pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, pGso->cbHdrs);
    412407            break;
     
    414409            pdmNetGsoUpdateIPv4Hdr(pbSegHdrs, pGso->offHdr1, cbSegPayload, iSeg, pGso->cbHdrs);
    415410            pdmNetGsoUpdateTcpHdr(pdmNetGsoUpdateIPv6Hdr(pbSegHdrs, pgmNetGsoCalcIpv6Offset(pbSegHdrs, pGso->offHdr1),
    416                                                          cbSegPayload, pGso->cbHdrs, pGso->cbHdr2, RTNETIPV4_PROT_TCP),
     411                                                         cbSegPayload, pGso->cbHdrs, pGso->offHdr2, RTNETIPV4_PROT_TCP),
    417412                                  pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, iSeg * pGso->cbMaxSeg,
    418413                                  pGso->cbHdrs, iSeg + 1 == cSegs);
     
    421416            pdmNetGsoUpdateIPv4Hdr(pbSegHdrs, pGso->offHdr1, cbSegPayload, iSeg, pGso->cbHdrs);
    422417            pdmNetGsoUpdateUdpHdr(pdmNetGsoUpdateIPv6Hdr(pbSegHdrs, pgmNetGsoCalcIpv6Offset(pbSegHdrs, pGso->offHdr1),
    423                                                          cbSegPayload, pGso->cbHdrs, pGso->cbHdr2, RTNETIPV4_PROT_UDP),
     418                                                         cbSegPayload, pGso->cbHdrs, pGso->offHdr2, RTNETIPV4_PROT_UDP),
    424419                                  pbSegHdrs, pGso->offHdr2, pbSegPayload, cbSegPayload, pGso->cbHdrs);
    425420            break;
  • trunk/include/VBox/types.h

    r28025 r28037  
    744744    /** Invalid zero value. */
    745745    PDMNETWORKGSOTYPE_INVALID = 0,
    746     /** TCP/IPv4. */
     746    /** TCP/IPv4 - no CWR/ECE encoding. */
    747747    PDMNETWORKGSOTYPE_IPV4_TCP,
    748     /** TCP/IPv6. */
     748    /** TCP/IPv6 - no CWR/ECE encoding. */
    749749    PDMNETWORKGSOTYPE_IPV6_TCP,
    750750    /** UDP/IPv4. */
     
    752752    /** UDP/IPv6. */
    753753    PDMNETWORKGSOTYPE_IPV6_UDP,
    754     /** TCP/IPv6 over IPv4 tunneling.
     754    /** TCP/IPv6 over IPv4 tunneling - no CWR/ECE encoding.
    755755     * The header offsets and sizes relates to IPv4 and TCP, the IPv6 header is
    756756     * figured out as needed.
     
    788788    /** Offset of the first header (IPv4 / IPv6).  0 if not not needed. */
    789789    uint8_t             offHdr1;
    790     /** The size of the first header (IPv4 / IPv6).  0 if not not needed. */
    791     uint8_t             cbHdr1;
    792 
    793790    /** Offset of the second header (TCP / UDP).  0 if not not needed. */
    794791    uint8_t             offHdr2;
    795     /** The size of the second header (TCP / UDP).  0 if not not needed. */
    796     uint8_t             cbHdr2;
     792    /** Unused. */
     793    uint8_t             au8Unused[2];
    797794} PDMNETWORKGSO;
    798795/** Pointer to a GSO context. */
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