VirtualBox

Changeset 28037 in vbox


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
Files:
5 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. */
  • trunk/src/VBox/Devices/Network/DevE1000.cpp

    r27974 r28037  
    5656#include <VBox/pdmdev.h>
    5757#include <VBox/pdmnetifs.h>
     58#include <VBox/pdmnetinline.h>
    5859#include <VBox/tm.h>
    5960#include <VBox/vm.h>
     
    10071008    /** TX: Context used for ordinary packets. */
    10081009    E1KTXCTX    contextNormal;
     1010    /** GSO context. u8Type is set to PDMNETWORKGSOTYPE_INVALID when not
     1011     *  applicable to the current TSE mode. */
     1012    PDMNETWORKGSO GsoCtx;
    10091013#if 1 /** @todo bird/buffering: change this to a 240 bytes buffer of the headers when TSE=1. */
    10101014    /** TX: Transmit packet buffer. */
     
    28152819
    28162820
     2821/**
     2822 * Sets up the GSO context according to the TSE new context descriptor.
     2823 *
     2824 * @param   pGso                The GSO context to setup.
     2825 * @param   pCtx                The context descriptor.
     2826 */
     2827DECLINLINE(void) e1kSetupGsoCtx(PPDMNETWORKGSO pGso, E1KTXCTX const *pCtx)
     2828{
     2829    pGso->u8Type = PDMNETWORKGSOTYPE_INVALID;
     2830
     2831    /*
     2832     * See if the context descriptor describes something that could be TCP or
     2833     * UDP over IPv[46].
     2834     */
     2835    /* Check the header ordering and spacing: 1. Ethernet, 2. IP, 3. TCP/UDP. */
     2836    if (RT_UNLIKELY( pCtx->ip.u8CSS < sizeof(RTNETETHERHDR) ))
     2837        return;
     2838    if (RT_UNLIKELY( pCtx->tu.u8CSS     < (size_t)pCtx->ip.u8CSS + (pCtx->dw2.fIP  ? RTNETIPV4_MIN_LEN : RTNETIPV6_MIN_LEN) ))
     2839        return;
     2840    if (RT_UNLIKELY(   pCtx->dw2.fTCP
     2841                     ? pCtx->dw3.u8HDRLEN <  (size_t)pCtx->tu.u8CSS + RTNETTCP_MIN_LEN
     2842                     : pCtx->dw3.u8HDRLEN != (size_t)pCtx->tu.u8CSS + RTNETUDP_MIN_LEN ))
     2843        return;
     2844
     2845    /* The end of the TCP/UDP checksum should stop at the end of the packet or at least after the headers. */
     2846    if (RT_UNLIKELY( pCtx->tu.u16CSE > 0 && pCtx->tu.u16CSE <= pCtx->dw3.u8HDRLEN ))
     2847        return;
     2848
     2849    /* IPv4 checksum offset. */
     2850    if (RT_UNLIKELY( pCtx->dw2.fIP && pCtx->ip.u8CSO - pCtx->ip.u8CSS != RT_OFFSETOF(RTNETIPV4, ip_sum) ))
     2851        return;
     2852
     2853    /* TCP/UDP checksum offsets. */
     2854    if (RT_UNLIKELY( pCtx->tu.u8CSO - pCtx->tu.u8CSS != ( pCtx->dw2.fTCP
     2855                                                         ? RT_OFFSETOF(RTNETTCP, th_sum)
     2856                                                         : RT_OFFSETOF(RTNETUDP, uh_sum) ) ))
     2857        return;
     2858
     2859    /*
     2860     * We're good for now - we'll do more checks when seeing the data.
     2861     * So, figure the type of offloading and setup the context.
     2862     */
     2863    if (pCtx->dw2.fIP)
     2864    {
     2865        if (pCtx->dw2.fTCP)
     2866            pGso->u8Type = PDMNETWORKGSOTYPE_IPV4_TCP;
     2867        else
     2868            pGso->u8Type = PDMNETWORKGSOTYPE_IPV4_UDP;
     2869        /** @todo Detect IPv4-IPv6 tunneling (need test setup since linux doesn't do
     2870         *        this yet it seems)... */
     2871    }
     2872    else
     2873    {
     2874        if (pCtx->dw2.fTCP)
     2875            pGso->u8Type = PDMNETWORKGSOTYPE_IPV6_TCP;
     2876        else
     2877            pGso->u8Type = PDMNETWORKGSOTYPE_IPV6_UDP;
     2878    }
     2879    pGso->offHdr1  = pCtx->ip.u8CSS;
     2880    pGso->offHdr2  = pCtx->tu.u8CSS;
     2881    pGso->cbHdrs   = pCtx->dw3.u8HDRLEN;
     2882    pGso->cbMaxSeg = pCtx->dw3.u16MSS;
     2883    Assert(PDMNetGsoIsValid(pGso, sizeof(*pGso), pGso->cbMaxSeg * 5));
     2884}
    28172885
    28182886/**
     
    32383306                pState->u32PayRemain = pDesc->context.dw2.u20PAYLEN;
    32393307                pState->u16HdrRemain = pDesc->context.dw3.u8HDRLEN;
     3308                e1kSetupGsoCtx(&pState->GsoCtx, &pDesc->context);
    32403309            }
    32413310            else
     
    47834852        rc = SSMR3GetMem(pSSM, &pState->contextNormal, sizeof(pState->contextNormal));
    47844853        AssertRCReturn(rc, rc);
     4854
     4855        /* derived state  */
     4856        e1kSetupGsoCtx(&pState->GsoCtx, &pState->contextTSE);
     4857
    47854858        E1kLog(("%s State has been restored\n", INSTANCE(pState)));
    47864859        e1kDumpState(pState);
  • trunk/src/VBox/Devices/Network/DrvIntNet.cpp

    r28025 r28037  
    518518                                         cbFrame, u64Now, u64Now - pThis->u64LastReceiveTS, u64Now - pThis->u64LastTransferTS, cSegs));
    519519                                pThis->u64LastReceiveTS = u64Now;
    520                                 Log2(("drvR3IntNetAsyncIoRun: cbFrame=%#x type=%d cbHdrs=%#x Hdr1=%#x/%#x Hdr2=%#x/%#x MMS=%#x\n"
     520                                Log2(("drvR3IntNetAsyncIoRun: cbFrame=%#x type=%d cbHdrs=%#x Hdr1=%#x Hdr2=%#x MMS=%#x\n"
    521521                                      "%.*Rhxd\n",
    522                                       cbFrame, pGso->u8Type, pGso->cbHdrs, pGso->offHdr1, pGso->cbHdr1, pGso->offHdr2, pGso->cbHdr2,
    523                                       pGso->cbMaxSeg, cbFrame - sizeof(*pGso), pGso + 1));
     522                                      cbFrame, pGso->u8Type, pGso->cbHdrs, pGso->offHdr1, pGso->offHdr2, pGso->cbMaxSeg,
     523                                      cbFrame - sizeof(*pGso), pGso + 1));
    524524                            }
    525525#endif
     
    541541                        else
    542542                        {
    543                             AssertMsgFailed(("cbFrame=%#x type=%d cbHdrs=%#x Hdr1=%#x/%#x Hdr2=%#x/%#x MMS=%#x\n",
    544                                              cbFrame, pGso->u8Type, pGso->cbHdrs, pGso->offHdr1, pGso->cbHdr1, pGso->offHdr2, pGso->cbHdr2, pGso->cbMaxSeg));
     543                            AssertMsgFailed(("cbFrame=%#x type=%d cbHdrs=%#x Hdr1=%#x Hdr2=%#x MMS=%#x\n",
     544                                             cbFrame, pGso->u8Type, pGso->cbHdrs, pGso->offHdr1, pGso->offHdr2, pGso->cbMaxSeg));
    545545                            STAM_REL_COUNTER_INC(&pBuf->cStatBadFrames);
    546546                        }
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