VirtualBox

Ignore:
Timestamp:
Feb 16, 2010 12:44:10 PM (15 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
57756
Message:

Networking: Preparing to make the driver return a send buffer to the device emulation.

Location:
trunk/src/VBox/Devices/Network/testcase
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Network/testcase/tstIntNet-1.cpp

    r26517 r26574  
    2424*******************************************************************************/
    2525#include <VBox/intnet.h>
     26#include <VBox/intnetinline.h>
    2627#include <VBox/sup.h>
    2728#include <VBox/vmm.h>
     
    167168
    168169/**
    169  * Writes a frame packet to the buffer.
    170  *
    171  * @returns VBox status code.
    172  * @param   pBuf        The buffer.
    173  * @param   pRingBuf    The ring buffer to read from.
    174  * @param   pvFrame     The frame to write.
    175  * @param   cbFrame     The size of the frame.
    176  * @remark  This is the same as INTNETRingWriteFrame and drvIntNetRingWriteFrame.
    177  */
    178 static int tstIntNetWriteFrame(PINTNETBUF pBuf, PINTNETRINGBUF pRingBuf, const void *pvFrame, uint32_t cbFrame)
    179 {
    180     /*
    181      * Validate input.
    182      */
    183     Assert(pBuf);
    184     Assert(pRingBuf);
    185     Assert(pvFrame);
    186     Assert(cbFrame >= sizeof(RTMAC) * 2);
    187     uint32_t offWrite = pRingBuf->offWrite;
    188     Assert(offWrite == RT_ALIGN_32(offWrite, sizeof(INTNETHDR)));
    189     uint32_t offRead = pRingBuf->offRead;
    190     Assert(offRead == RT_ALIGN_32(offRead, sizeof(INTNETHDR)));
    191 
    192     const uint32_t cb = RT_ALIGN_32(cbFrame, sizeof(INTNETHDR));
    193     if (offRead <= offWrite)
    194     {
    195         /*
    196          * Try fit it all before the end of the buffer.
    197          */
    198         if (pRingBuf->offEnd - offWrite >= cb + sizeof(INTNETHDR))
    199         {
    200             PINTNETHDR pHdr = (PINTNETHDR)((uint8_t *)pBuf + offWrite);
    201             pHdr->u16Type  = INTNETHDR_TYPE_FRAME;
    202             pHdr->cbFrame  = cbFrame;
    203             pHdr->offFrame = sizeof(INTNETHDR);
    204 
    205             memcpy(pHdr + 1, pvFrame, cbFrame);
    206 
    207             offWrite += cb + sizeof(INTNETHDR);
    208             Assert(offWrite <= pRingBuf->offEnd && offWrite >= pRingBuf->offStart);
    209             if (offWrite >= pRingBuf->offEnd)
    210                 offWrite = pRingBuf->offStart;
    211             Log2(("WriteFrame: offWrite: %#x -> %#x (1)\n", pRingBuf->offWrite, offWrite));
    212             ASMAtomicXchgU32(&pRingBuf->offWrite, offWrite);
    213             return VINF_SUCCESS;
    214         }
    215 
    216         /*
    217          * Try fit the frame at the start of the buffer.
    218          * (The header fits before the end of the buffer because of alignment.)
    219          */
    220         AssertMsg(pRingBuf->offEnd - offWrite >= sizeof(INTNETHDR), ("offEnd=%x offWrite=%x\n", pRingBuf->offEnd, offWrite));
    221         if (offRead - pRingBuf->offStart > cb) /* not >= ! */
    222         {
    223             PINTNETHDR  pHdr = (PINTNETHDR)((uint8_t *)pBuf + offWrite);
    224             void       *pvFrameOut = (PINTNETHDR)((uint8_t *)pBuf + pRingBuf->offStart);
    225             pHdr->u16Type  = INTNETHDR_TYPE_FRAME;
    226             pHdr->cbFrame  = cbFrame;
    227             pHdr->offFrame = (intptr_t)pvFrameOut - (intptr_t)pHdr;
    228 
    229             memcpy(pvFrameOut, pvFrame, cbFrame);
    230 
    231             offWrite = pRingBuf->offStart + cb;
    232             ASMAtomicXchgU32(&pRingBuf->offWrite, offWrite);
    233             Log2(("WriteFrame: offWrite: %#x -> %#x (2)\n", pRingBuf->offWrite, offWrite));
    234             return VINF_SUCCESS;
    235         }
    236     }
    237     /*
    238      * The reader is ahead of the writer, try fit it into that space.
    239      */
    240     else if (offRead - offWrite > cb + sizeof(INTNETHDR)) /* not >= ! */
    241     {
    242         PINTNETHDR pHdr = (PINTNETHDR)((uint8_t *)pBuf + offWrite);
    243         pHdr->u16Type  = INTNETHDR_TYPE_FRAME;
    244         pHdr->cbFrame  = cbFrame;
    245         pHdr->offFrame = sizeof(INTNETHDR);
    246 
    247         memcpy(pHdr + 1, pvFrame, cbFrame);
    248 
    249         offWrite += cb + sizeof(INTNETHDR);
    250         ASMAtomicXchgU32(&pRingBuf->offWrite, offWrite);
    251         Log2(("WriteFrame: offWrite: %#x -> %#x (3)\n", pRingBuf->offWrite, offWrite));
    252         return VINF_SUCCESS;
    253     }
    254 
    255     /* (it didn't fit) */
    256     /** @todo stats */
    257     return VERR_BUFFER_OVERFLOW;
    258 }
    259 
    260 
    261 /**
    262170 * Transmits one frame after appending the CRC.
    263171 *
     
    295203     * it's not supposed to happen here in this testcase.
    296204     */
    297     int rc = tstIntNetWriteFrame(pBuf, &pBuf->Send, pvFrame, (uint32_t)cbFrame);
     205    int rc = INTNETRingWriteFrame(&pBuf->Send, pvFrame, cbFrame);
    298206    if (RT_SUCCESS(rc))
    299207    {
     
    303211    else
    304212    {
    305         RTPrintf("tstIntNet-1: tstIntNetWriteFrame failed, %Rrc; cbFrame=%d pBuf->cbSend=%d\n", rc, cbFrame, pBuf->cbSend);
     213        RTPrintf("tstIntNet-1: INTNETRingWriteFrame failed, %Rrc; cbFrame=%d pBuf->cbSend=%d\n", rc, cbFrame, pBuf->cbSend);
    306214        g_cErrors++;
    307215    }
     
    555463         * Process the receive buffer.
    556464         */
    557         while (INTNETRingGetReadable(pRingBuf) > 0)
     465        PINTNETHDR pHdr;
     466        while ((pHdr = INTNETRingGetNextFrameToRead(pRingBuf)))
    558467        {
    559             PINTNETHDR pHdr = (PINTNETHDR)((uintptr_t)pBuf + pRingBuf->offRead);
    560468            if (pHdr->u16Type == INTNETHDR_TYPE_FRAME)
    561469            {
    562470                size_t      cbFrame = pHdr->cbFrame;
    563471                const void *pvFrame = INTNETHdrGetFramePtr(pHdr, pBuf);
    564                 uint64_t    NanoTS = RTTimeNanoTS() - g_StartTS;
     472                uint64_t    NanoTS  = RTTimeNanoTS() - g_StartTS;
    565473
    566474                if (pFileRaw)
     
    638546            {
    639547                RTPrintf("tstIntNet-1: Unknown frame type %d\n", pHdr->u16Type);
     548                STAM_REL_COUNTER_INC(&pBuf->cStatBadFrames);
    640549                g_cErrors++;
    641550            }
    642551
    643552            /* Advance to the next frame. */
    644             INTNETRingSkipFrame(pBuf, pRingBuf);
     553            INTNETRingSkipFrame(pRingBuf);
    645554        }
    646555    }
     
    650559                 "%3RU64.%09u: stopped. cRecvs=%RU64 cbRecv=%RU64 cLost=%RU64 cOYs=%RU64 cNYs=%RU64\n",
    651560                 NanoTS / 1000000000, (uint32_t)(NanoTS % 1000000000),
    652                  pBuf->cStatRecvs.c,
    653                  pBuf->cbStatRecv.c,
     561                 pBuf->Recv.cStatFrames.c,
     562                 pBuf->Recv.cbStatWritten.c,
    654563                 pBuf->cStatLost.c,
    655564                 pBuf->cStatYieldsOk.c,
  • trunk/src/VBox/Devices/Network/testcase/tstIntNetR0.cpp

    r26517 r26574  
    2727*   Header Files                                                               *
    2828*******************************************************************************/
     29#define RTMEM_WRAP_TO_EF_APIS       // debugging debugging remove
     30#define INTNET_POISON_READ_FRAMES   // debugging debugging remove
    2931#define IN_INTNET_TESTCASE
    3032#define IN_INTNET_R3
     
    212214#include "../SrvIntNetR0.cpp"
    213215
    214 typedef struct ARGS
     216typedef struct MYARGS
    215217{
    216218    PINTNET pIntNet;
     
    220222    uint64_t u64Start;
    221223    uint64_t u64End;
    222 } ARGS, *PARGS;
     224} MYARGS, *PMYARGS;
    223225
    224226
     
    231233DECLCALLBACK(int) SendThread(RTTHREAD Thread, void *pvArg)
    232234{
    233     PARGS   pArgs = (PARGS)pvArg;
     235    PMYARGS pArgs = (PMYARGS)pvArg;
    234236
    235237    /*
     
    237239     */
    238240    uint8_t abBuf[4096] = {0};
    239     PRTMAC pMacSrc = (PRTMAC)&abBuf[0];
    240     PRTMAC pMacDst = pMacSrc + 1;
     241    PRTMAC  pMacSrc = (PRTMAC)&abBuf[0];
     242    PRTMAC  pMacDst = pMacSrc + 1;
    241243    *pMacSrc = pArgs->Mac;
    242244    *pMacDst = pArgs->Mac;
     
    244246    unsigned *puFrame = (unsigned *)(pMacDst + 1);
    245247    unsigned iFrame = 0;
    246     unsigned cbSent = 0;
     248    uint32_t cbSent = 0;
     249    uint32_t cSend  = 0;
    247250    pArgs->u64Start = RTTimeNanoTS();
    248251    for (; cbSent < TEST_TRANSFER_SIZE; iFrame++)
     
    255258        INTNETSG Sg;
    256259        intnetR0SgInitTemp(&Sg, abBuf, cb);
    257         int rc = intnetR0RingWriteFrame(pArgs->pBuf, &pArgs->pBuf->Send, &Sg, NULL);
     260        int rc = intnetR0RingWriteFrame(&pArgs->pBuf->Send, &Sg, NULL);
    258261        if (RT_SUCCESS(rc))
    259262            rc = INTNETR0IfSend(pArgs->pIntNet, pArgs->hIf, g_pSession, NULL, 0);
     
    285288    }
    286289
    287     RTPrintf("tstIntNetR0: sender thread %.6Rhxs terminating. iFrame=%d cbSent=%d\n", &pArgs->Mac, iFrame, cbSent);
     290    RTPrintf("tstIntNetR0: sender   thread %.6Rhxs terminating.\n"
     291             "tstIntNetR0:   iFrame=%u  cb=%'u\n",
     292             &pArgs->Mac, iFrame, cbSent);
    288293    return 0;
    289294}
     
    299304DECLCALLBACK(int) ReceiveThread(RTTHREAD Thread, void *pvArg)
    300305{
    301     unsigned    cbReceived = 0;
    302     unsigned    cLostFrames = 0;
    303     unsigned    iFrame = ~0;
    304     PARGS       pArgs = (PARGS)pvArg;
     306    uint32_t    cbReceived = 0;
     307    uint32_t    cLostFrames = 0;
     308    uint32_t    iFrame      = UINT32_MAX;
     309    PMYARGS     pArgs       = (PMYARGS)pvArg;
    305310    for (;;)
    306311    {
     
    315320                break;
    316321            case VERR_SEM_DESTROYED:
    317                 RTPrintf("tstIntNetR0: receiver thread %.6Rhxs terminating. cbReceived=%u cLostFrames=%u iFrame=%u\n",
    318                          &pArgs->Mac, cbReceived, cLostFrames, iFrame);
     322                RTPrintf("tstIntNetR0: receiver thread %.6Rhxs terminating. iFrame=%u cb=%'u c=%'u cLost=%'u\n",
     323                         &pArgs->Mac, iFrame, cbReceived, iFrame - cLostFrames, cLostFrames);
    319324                return VINF_SUCCESS;
    320325
    321326            default:
    322                 RTPrintf("tstIntNetR0: receiver thread %.6Rhxs got odd return value %Rrc! cbReceived=%u cLostFrames=%u iFrame=%u\n",
    323                          &pArgs->Mac, rc, cbReceived, cLostFrames, iFrame);
     327                RTPrintf("tstIntNetR0: receiver thread %.6Rhxs got odd return value %Rrc! iFrame=%u cb=%'u c=%'u cLost=%'u\n",
     328                         &pArgs->Mac, rc, iFrame, cbReceived, iFrame - cLostFrames, cLostFrames);
    324329                g_cErrors++;
    325330                return rc;
     
    329334         * Read data.
    330335         */
    331         while (INTNETRingGetReadable(&pArgs->pBuf->Recv))
     336        while (INTNETRingHasMoreToRead(&pArgs->pBuf->Recv))
    332337        {
    333338            uint8_t abBuf[16384];
    334             unsigned cb = intnetR0RingReadFrame(pArgs->pBuf, &pArgs->pBuf->Recv, abBuf);
     339            uint32_t cb = INTNETRingReadAndSkipFrame(&pArgs->pBuf->Recv, abBuf);
    335340            unsigned *puFrame = (unsigned *)&abBuf[sizeof(RTMAC) * 2];
    336341
     
    342347                &&  puFrame[3] == 0xffffdead)
    343348            {
    344                 RTPrintf("tstIntNetR0: receiver thread %.6Rhxs terminating. cbReceived=%u cLostFrames=%u iFrame=%u\n",
    345                          &pArgs->Mac, cbReceived, cLostFrames, iFrame);
    346349                pArgs->u64End = RTTimeNanoTS();
     350                RTPrintf("tstIntNetR0: receiver thread %.6Rhxs terminating.\n"
     351                         "tstIntNetR0:   iFrame=%u  cb=%'u  c=%'u  %'uKB/s  %'ufps  cLost=%'u \n",
     352                         &pArgs->Mac, iFrame, cbReceived, iFrame - cLostFrames,
     353                         (unsigned)(cbReceived * 1000000000.0 / 1024 / (pArgs->u64End - pArgs->u64Start)),
     354                         (unsigned)((iFrame - cLostFrames) * 1000000000.0 / (pArgs->u64End - pArgs->u64Start)),
     355                         cLostFrames);
    347356                return VINF_SUCCESS;
    348357            }
     
    523532                                g_cErrors++;
    524533                            }
    525                             unsigned cb = intnetR0RingReadFrame(pBuf1, &pBuf1->Recv, abBuf);
     534                            uint32_t cb = INTNETRingReadAndSkipFrame(&pBuf1->Recv, abBuf);
    526535                            if (cb != sizeof(g_TestFrame0))
    527536                            {
     
    555564                            if (!g_cErrors)
    556565                            {
    557                                 ARGS Args0;
     566                                MYARGS Args0;
    558567                                RT_ZERO(Args0);
    559568                                Args0.hIf = hIf0;
     
    564573                                Args0.Mac.au16[2] = 0;
    565574
    566                                 ARGS Args1;
     575                                MYARGS Args1;
    567576                                RT_ZERO(Args1);
    568577                                Args1.hIf = hIf1;
     
    588597                                    int rc2 = VINF_SUCCESS;
    589598                                    rc = RTThreadWait(ThreadSend0, 5*60*1000, &rc2);
    590 #if 1 /** @todo it looks like I'm subject to some false wakeup calls here (2.6.23-gentoo-r3 amd64). See #3023.*/
    591                                     for (int cTries = 100; rc == VERR_TIMEOUT && cTries > 0; cTries--)
    592                                     {
    593                                         RTThreadSleep(1);
    594                                         rc = RTThreadWait(ThreadSend0, 1, &rc2);
    595                                     }
    596 #endif
    597599                                    AssertRC(rc);
    598600                                    if (RT_SUCCESS(rc))
     
    600602                                        ThreadSend0 = NIL_RTTHREAD;
    601603                                        rc = RTThreadWait(ThreadSend1, 5*60*1000, RT_SUCCESS(rc2) ? &rc2 : NULL);
    602 #if 1 /** @todo it looks like I'm subject to some false wakeup calls here (2.6.23-gentoo-r3 amd64). See #3023.*/
    603                                         for (int cTries = 100; rc == VERR_TIMEOUT && cTries > 0; cTries--)
    604                                         {
    605                                             RTThreadSleep(1);
    606                                             rc = RTThreadWait(ThreadSend1, 1, &rc2);
    607                                         }
    608 #endif
    609604                                        AssertRC(rc);
    610605                                        if (RT_SUCCESS(rc))
     
    618613                                         */
    619614                                        unsigned cYields = 100000;
    620                                         while (     (   INTNETRingGetReadable(&pBuf0->Recv)
    621                                                     ||  INTNETRingGetReadable(&pBuf1->Recv))
     615                                        while (     (  INTNETRingHasMoreToRead(&pBuf0->Recv)
     616                                                    || INTNETRingHasMoreToRead(&pBuf1->Recv))
    622617                                               &&   cYields-- > 0)
    623618                                            RTThreadYield();
     
    625620                                        uint64_t u64Elapsed = RT_MAX(Args0.u64End, Args1.u64End) - RT_MIN(Args0.u64Start, Args1.u64Start);
    626621                                        uint64_t u64Speed = (uint64_t)((2 * TEST_TRANSFER_SIZE / 1024) / (u64Elapsed / 1000000000.0));
    627                                         RTPrintf("tstIntNetR0: transfered %d bytes in %RU64 ns (%RU64 KB/s)\n",
     622                                        RTPrintf("tstIntNetR0: transfered %d bytes in %'RU64 ns (%'RU64 KB/s)\n",
    628623                                                 2 * TEST_TRANSFER_SIZE, u64Elapsed, u64Speed);
    629624
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