Changeset 26574 in vbox for trunk/src/VBox/Devices/Network/testcase
- Timestamp:
- Feb 16, 2010 12:44:10 PM (15 years ago)
- svn:sync-xref-src-repo-rev:
- 57756
- 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 24 24 *******************************************************************************/ 25 25 #include <VBox/intnet.h> 26 #include <VBox/intnetinline.h> 26 27 #include <VBox/sup.h> 27 28 #include <VBox/vmm.h> … … 167 168 168 169 /** 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 /**262 170 * Transmits one frame after appending the CRC. 263 171 * … … 295 203 * it's not supposed to happen here in this testcase. 296 204 */ 297 int rc = tstIntNetWriteFrame(pBuf, &pBuf->Send, pvFrame, (uint32_t)cbFrame);205 int rc = INTNETRingWriteFrame(&pBuf->Send, pvFrame, cbFrame); 298 206 if (RT_SUCCESS(rc)) 299 207 { … … 303 211 else 304 212 { 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); 306 214 g_cErrors++; 307 215 } … … 555 463 * Process the receive buffer. 556 464 */ 557 while (INTNETRingGetReadable(pRingBuf) > 0) 465 PINTNETHDR pHdr; 466 while ((pHdr = INTNETRingGetNextFrameToRead(pRingBuf))) 558 467 { 559 PINTNETHDR pHdr = (PINTNETHDR)((uintptr_t)pBuf + pRingBuf->offRead);560 468 if (pHdr->u16Type == INTNETHDR_TYPE_FRAME) 561 469 { 562 470 size_t cbFrame = pHdr->cbFrame; 563 471 const void *pvFrame = INTNETHdrGetFramePtr(pHdr, pBuf); 564 uint64_t NanoTS = RTTimeNanoTS() - g_StartTS;472 uint64_t NanoTS = RTTimeNanoTS() - g_StartTS; 565 473 566 474 if (pFileRaw) … … 638 546 { 639 547 RTPrintf("tstIntNet-1: Unknown frame type %d\n", pHdr->u16Type); 548 STAM_REL_COUNTER_INC(&pBuf->cStatBadFrames); 640 549 g_cErrors++; 641 550 } 642 551 643 552 /* Advance to the next frame. */ 644 INTNETRingSkipFrame(p Buf, pRingBuf);553 INTNETRingSkipFrame(pRingBuf); 645 554 } 646 555 } … … 650 559 "%3RU64.%09u: stopped. cRecvs=%RU64 cbRecv=%RU64 cLost=%RU64 cOYs=%RU64 cNYs=%RU64\n", 651 560 NanoTS / 1000000000, (uint32_t)(NanoTS % 1000000000), 652 pBuf-> cStatRecvs.c,653 pBuf-> cbStatRecv.c,561 pBuf->Recv.cStatFrames.c, 562 pBuf->Recv.cbStatWritten.c, 654 563 pBuf->cStatLost.c, 655 564 pBuf->cStatYieldsOk.c, -
trunk/src/VBox/Devices/Network/testcase/tstIntNetR0.cpp
r26517 r26574 27 27 * Header Files * 28 28 *******************************************************************************/ 29 #define RTMEM_WRAP_TO_EF_APIS // debugging debugging remove 30 #define INTNET_POISON_READ_FRAMES // debugging debugging remove 29 31 #define IN_INTNET_TESTCASE 30 32 #define IN_INTNET_R3 … … 212 214 #include "../SrvIntNetR0.cpp" 213 215 214 typedef struct ARGS216 typedef struct MYARGS 215 217 { 216 218 PINTNET pIntNet; … … 220 222 uint64_t u64Start; 221 223 uint64_t u64End; 222 } ARGS, *PARGS;224 } MYARGS, *PMYARGS; 223 225 224 226 … … 231 233 DECLCALLBACK(int) SendThread(RTTHREAD Thread, void *pvArg) 232 234 { 233 P ARGS pArgs = (PARGS)pvArg;235 PMYARGS pArgs = (PMYARGS)pvArg; 234 236 235 237 /* … … 237 239 */ 238 240 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; 241 243 *pMacSrc = pArgs->Mac; 242 244 *pMacDst = pArgs->Mac; … … 244 246 unsigned *puFrame = (unsigned *)(pMacDst + 1); 245 247 unsigned iFrame = 0; 246 unsigned cbSent = 0; 248 uint32_t cbSent = 0; 249 uint32_t cSend = 0; 247 250 pArgs->u64Start = RTTimeNanoTS(); 248 251 for (; cbSent < TEST_TRANSFER_SIZE; iFrame++) … … 255 258 INTNETSG Sg; 256 259 intnetR0SgInitTemp(&Sg, abBuf, cb); 257 int rc = intnetR0RingWriteFrame( pArgs->pBuf,&pArgs->pBuf->Send, &Sg, NULL);260 int rc = intnetR0RingWriteFrame(&pArgs->pBuf->Send, &Sg, NULL); 258 261 if (RT_SUCCESS(rc)) 259 262 rc = INTNETR0IfSend(pArgs->pIntNet, pArgs->hIf, g_pSession, NULL, 0); … … 285 288 } 286 289 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); 288 293 return 0; 289 294 } … … 299 304 DECLCALLBACK(int) ReceiveThread(RTTHREAD Thread, void *pvArg) 300 305 { 301 u nsigned cbReceived= 0;302 u nsignedcLostFrames = 0;303 u nsigned iFrame = ~0;304 P ARGS pArgs = (PARGS)pvArg;306 uint32_t cbReceived = 0; 307 uint32_t cLostFrames = 0; 308 uint32_t iFrame = UINT32_MAX; 309 PMYARGS pArgs = (PMYARGS)pvArg; 305 310 for (;;) 306 311 { … … 315 320 break; 316 321 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); 319 324 return VINF_SUCCESS; 320 325 321 326 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); 324 329 g_cErrors++; 325 330 return rc; … … 329 334 * Read data. 330 335 */ 331 while (INTNETRing GetReadable(&pArgs->pBuf->Recv))336 while (INTNETRingHasMoreToRead(&pArgs->pBuf->Recv)) 332 337 { 333 338 uint8_t abBuf[16384]; 334 u nsigned cb = intnetR0RingReadFrame(pArgs->pBuf,&pArgs->pBuf->Recv, abBuf);339 uint32_t cb = INTNETRingReadAndSkipFrame(&pArgs->pBuf->Recv, abBuf); 335 340 unsigned *puFrame = (unsigned *)&abBuf[sizeof(RTMAC) * 2]; 336 341 … … 342 347 && puFrame[3] == 0xffffdead) 343 348 { 344 RTPrintf("tstIntNetR0: receiver thread %.6Rhxs terminating. cbReceived=%u cLostFrames=%u iFrame=%u\n",345 &pArgs->Mac, cbReceived, cLostFrames, iFrame);346 349 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); 347 356 return VINF_SUCCESS; 348 357 } … … 523 532 g_cErrors++; 524 533 } 525 u nsigned cb = intnetR0RingReadFrame(pBuf1,&pBuf1->Recv, abBuf);534 uint32_t cb = INTNETRingReadAndSkipFrame(&pBuf1->Recv, abBuf); 526 535 if (cb != sizeof(g_TestFrame0)) 527 536 { … … 555 564 if (!g_cErrors) 556 565 { 557 ARGS Args0;566 MYARGS Args0; 558 567 RT_ZERO(Args0); 559 568 Args0.hIf = hIf0; … … 564 573 Args0.Mac.au16[2] = 0; 565 574 566 ARGS Args1;575 MYARGS Args1; 567 576 RT_ZERO(Args1); 568 577 Args1.hIf = hIf1; … … 588 597 int rc2 = VINF_SUCCESS; 589 598 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 #endif597 599 AssertRC(rc); 598 600 if (RT_SUCCESS(rc)) … … 600 602 ThreadSend0 = NIL_RTTHREAD; 601 603 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 #endif609 604 AssertRC(rc); 610 605 if (RT_SUCCESS(rc)) … … 618 613 */ 619 614 unsigned cYields = 100000; 620 while ( ( INTNETRingGetReadable(&pBuf0->Recv)621 || INTNETRingGetReadable(&pBuf1->Recv))615 while ( ( INTNETRingHasMoreToRead(&pBuf0->Recv) 616 || INTNETRingHasMoreToRead(&pBuf1->Recv)) 622 617 && cYields-- > 0) 623 618 RTThreadYield(); … … 625 620 uint64_t u64Elapsed = RT_MAX(Args0.u64End, Args1.u64End) - RT_MIN(Args0.u64Start, Args1.u64Start); 626 621 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", 628 623 2 * TEST_TRANSFER_SIZE, u64Elapsed, u64Speed); 629 624
Note:
See TracChangeset
for help on using the changeset viewer.