Changeset 25993 in vbox for trunk/src/VBox/Devices
- Timestamp:
- Jan 25, 2010 11:04:09 AM (15 years ago)
- svn:sync-xref-src-repo-rev:
- 56864
- Location:
- trunk/src/VBox/Devices
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Makefile.kmk
r25946 r25993 509 509 Network/DevPCNet.cpp \ 510 510 Serial/DevSerial.cpp \ 511 Parallel/DevParallel.cpp 511 Parallel/DevParallel.cpp \ 512 \ 513 Network/DrvIntNet.cpp 512 514 513 515 ifdef VBOX_DYNAMIC_NET_ATTACH … … 608 610 Network/DevPCNet.cpp \ 609 611 Serial/DevSerial.cpp \ 610 Parallel/DevParallel.cpp 612 Parallel/DevParallel.cpp \ 613 \ 614 Network/DrvIntNet.cpp 611 615 612 616 ifdef VBOX_DYNAMIC_NET_ATTACH -
trunk/src/VBox/Devices/Network/DrvIntNet.cpp
r25985 r25993 5 5 6 6 /* 7 * Copyright (C) 2006-20 07Sun Microsystems, Inc.7 * Copyright (C) 2006-2010 Sun Microsystems, Inc. 8 8 * 9 9 * This file is part of VirtualBox Open Source Edition (OSE), as … … 63 63 64 64 /** 65 * Blockdriver instance data.65 * Internal networking driver instance data. 66 66 * 67 67 * @implements PDMINETWORKCONNECTOR … … 70 70 { 71 71 /** The network interface. */ 72 PDMINETWORKCONNECTOR INetworkConnector;72 PDMINETWORKCONNECTOR INetworkConnectorR3; 73 73 /** The network interface. */ 74 PPDMINETWORKPORT pPort;74 R3PTRTYPE(PPDMINETWORKPORT) pIPortR3; 75 75 /** The network config interface. 76 76 * Can (in theory at least) be NULL. */ 77 PPDMINETWORKCONFIG pConfigIf;77 R3PTRTYPE(PPDMINETWORKCONFIG) pIConfigIfR3; 78 78 /** Pointer to the driver instance. */ 79 PPDMDRVINS pDrvIns; 79 PPDMDRVINSR3 pDrvInsR3; 80 /** Pointer to the communication buffer. */ 81 R3PTRTYPE(PINTNETBUF) pBufR3; 80 82 /** Interface handle. */ 81 INTNETIFHANDLE hIf; 82 /** Pointer to the communication buffer. */ 83 PINTNETBUF pBuf; 83 INTNETIFHANDLE hIf; 84 84 85 /** The thread state. */ 85 ASYNCSTATE volatile enmState;86 ASYNCSTATE volatile enmState; 86 87 /** Reader thread. */ 87 RTTHREAD Thread;88 RTTHREAD Thread; 88 89 /** Event semaphore the Thread waits on while the VM is suspended. */ 89 RTSEMEVENT EventSuspended;90 RTSEMEVENT EventSuspended; 90 91 /** Set if the link is down. 91 92 * When the link is down all incoming packets will be dropped. */ 92 bool volatile fLinkDown;93 bool volatile fLinkDown; 93 94 /** Set if data transmission should start immediately and deactivate 94 95 * as late as possible. */ 95 bool fActivateEarlyDeactivateLate; 96 bool fActivateEarlyDeactivateLate; 97 /** Padding. */ 98 bool afReserved[2]; 99 /** The network name. */ 100 char szNetwork[INTNET_MAX_NETWORK_NAME]; 96 101 97 102 #ifdef LOG_ENABLED 98 103 /** The nano ts of the last transfer. */ 99 uint64_t u64LastTransferTS;104 uint64_t u64LastTransferTS; 100 105 /** The nano ts of the last receive. */ 101 uint64_t u64LastReceiveTS;106 uint64_t u64LastReceiveTS; 102 107 #endif 103 104 108 #ifdef VBOX_WITH_STATISTICS 105 109 /** Profiling packet transmit runs. */ 106 STAMPROFILE StatTransmit;110 STAMPROFILE StatTransmit; 107 111 /** Profiling packet receive runs. */ 108 STAMPROFILEADV StatReceive;112 STAMPROFILEADV StatReceive; 109 113 #endif /* VBOX_WITH_STATISTICS */ 110 111 /** The network name. */ 112 char szNetwork[INTNET_MAX_NETWORK_NAME]; 113 } DRVINTNET, *PDRVINTNET; 114 115 116 /** Converts a pointer to DRVINTNET::INetworkConnector to a PDRVINTNET. */ 117 #define PDMINETWORKCONNECTOR_2_DRVINTNET(pInterface) ( (PDRVINTNET)((uintptr_t)pInterface - RT_OFFSETOF(DRVINTNET, INetworkConnector)) ) 118 114 } DRVINTNET; 115 /** Pointer to instance data of the internal networking driver. */ 116 typedef DRVINTNET *PDRVINTNET; 117 118 119 #ifdef IN_RING3 120 121 /* -=-=-=-=- PDMINETWORKCONNECTOR -=-=-=-=- */ 122 123 /** Converts a pointer to DRVINTNET::INetworkConnectorR3 to a PDRVINTNET. */ 124 #define PDMINETWORKCONNECTOR_2_DRVINTNET(pInterface) \ 125 RT_FROM_MEMBER(pInterface, DRVINTNET, INetworkConnectorR3) 119 126 120 127 /** … … 124 131 * @param pThis The driver instance. 125 132 */ 126 static int drv IntNetUpdateMacAddress(PDRVINTNET pThis)127 { 128 if (!pThis->p ConfigIf)133 static int drvR3IntNetUpdateMacAddress(PDRVINTNET pThis) 134 { 135 if (!pThis->pIConfigIfR3) 129 136 return VINF_SUCCESS; 130 137 … … 134 141 SetMacAddressReq.pSession = NIL_RTR0PTR; 135 142 SetMacAddressReq.hIf = pThis->hIf; 136 int rc = pThis->p ConfigIf->pfnGetMac(pThis->pConfigIf, &SetMacAddressReq.Mac);143 int rc = pThis->pIConfigIfR3->pfnGetMac(pThis->pIConfigIfR3, &SetMacAddressReq.Mac); 137 144 if (RT_SUCCESS(rc)) 138 rc = PDMDrvHlpSUPCallVMMR0Ex(pThis->pDrvIns , VMMR0_DO_INTNET_IF_SET_MAC_ADDRESS,145 rc = PDMDrvHlpSUPCallVMMR0Ex(pThis->pDrvInsR3, VMMR0_DO_INTNET_IF_SET_MAC_ADDRESS, 139 146 &SetMacAddressReq, sizeof(SetMacAddressReq)); 140 147 141 Log(("drv IntNetUpdateMacAddress: %.*Rhxs rc=%Rrc\n", sizeof(SetMacAddressReq.Mac), &SetMacAddressReq.Mac, rc));148 Log(("drvR3IntNetUpdateMacAddress: %.*Rhxs rc=%Rrc\n", sizeof(SetMacAddressReq.Mac), &SetMacAddressReq.Mac, rc)); 142 149 return rc; 143 150 } … … 153 160 * @param fActive The new state. 154 161 */ 155 static int drv IntNetSetActive(PDRVINTNET pThis, bool fActive)156 { 157 if (!pThis->p ConfigIf)162 static int drvR3IntNetSetActive(PDRVINTNET pThis, bool fActive) 163 { 164 if (!pThis->pIConfigIfR3) 158 165 return VINF_SUCCESS; 159 166 … … 164 171 SetActiveReq.hIf = pThis->hIf; 165 172 SetActiveReq.fActive = fActive; 166 int rc = PDMDrvHlpSUPCallVMMR0Ex(pThis->pDrvIns , VMMR0_DO_INTNET_IF_SET_ACTIVE,173 int rc = PDMDrvHlpSUPCallVMMR0Ex(pThis->pDrvInsR3, VMMR0_DO_INTNET_IF_SET_ACTIVE, 167 174 &SetActiveReq, sizeof(SetActiveReq)); 168 175 169 Log(("drv IntNetUpdateMacAddress: fActive=%d rc=%Rrc\n", fActive, rc));176 Log(("drvR3IntNetSetActive: fActive=%d rc=%Rrc\n", fActive, rc)); 170 177 AssertRC(rc); 171 178 return rc; … … 183 190 * @remark This is the same as INTNETRingWriteFrame 184 191 */ 185 static int drv IntNetRingWriteFrame(PINTNETBUF pBuf, PINTNETRINGBUF pRingBuf, const void *pvFrame, uint32_t cbFrame)192 static int drvR3IntNetRingWriteFrame(PINTNETBUF pBuf, PINTNETRINGBUF pRingBuf, const void *pvFrame, uint32_t cbFrame) 186 193 { 187 194 /* … … 275 282 * @thread EMT 276 283 */ 277 static DECLCALLBACK(int) drv IntNetSend(PPDMINETWORKCONNECTOR pInterface, const void *pvBuf, size_t cb)284 static DECLCALLBACK(int) drvR3IntNetSend(PPDMINETWORKCONNECTOR pInterface, const void *pvBuf, size_t cb) 278 285 { 279 286 PDRVINTNET pThis = PDMINETWORKCONNECTOR_2_DRVINTNET(pInterface); … … 282 289 #ifdef LOG_ENABLED 283 290 uint64_t u64Now = RTTimeProgramNanoTS(); 284 LogFlow(("drv IntNetSend: %-4d bytes at %llu ns deltas: r=%llu t=%llu\n",291 LogFlow(("drvR3IntNetSend: %-4d bytes at %llu ns deltas: r=%llu t=%llu\n", 285 292 cb, u64Now, u64Now - pThis->u64LastReceiveTS, u64Now - pThis->u64LastTransferTS)); 286 293 pThis->u64LastTransferTS = u64Now; 287 Log2(("drv IntNetSend: pvBuf=%p cb=%#x\n"294 Log2(("drvR3IntNetSend: pvBuf=%p cb=%#x\n" 288 295 "%.*Rhxd\n", 289 296 pvBuf, cb, cb, pvBuf)); … … 293 300 * Add the frame to the send buffer and push it onto the network. 294 301 */ 295 int rc = drv IntNetRingWriteFrame(pThis->pBuf, &pThis->pBuf->Send, pvBuf, (uint32_t)cb);302 int rc = drvR3IntNetRingWriteFrame(pThis->pBufR3, &pThis->pBufR3->Send, pvBuf, (uint32_t)cb); 296 303 if ( rc == VERR_BUFFER_OVERFLOW 297 && pThis->pBuf ->cbSend < cb)304 && pThis->pBufR3->cbSend < cb) 298 305 { 299 306 INTNETIFSENDREQ SendReq; … … 302 309 SendReq.pSession = NIL_RTR0PTR; 303 310 SendReq.hIf = pThis->hIf; 304 PDMDrvHlpSUPCallVMMR0Ex(pThis->pDrvIns , VMMR0_DO_INTNET_IF_SEND, &SendReq, sizeof(SendReq));305 306 rc = drv IntNetRingWriteFrame(pThis->pBuf, &pThis->pBuf->Send, pvBuf, (uint32_t)cb);311 PDMDrvHlpSUPCallVMMR0Ex(pThis->pDrvInsR3, VMMR0_DO_INTNET_IF_SEND, &SendReq, sizeof(SendReq)); 312 313 rc = drvR3IntNetRingWriteFrame(pThis->pBufR3, &pThis->pBufR3->Send, pvBuf, (uint32_t)cb); 307 314 } 308 315 … … 314 321 SendReq.pSession = NIL_RTR0PTR; 315 322 SendReq.hIf = pThis->hIf; 316 rc = PDMDrvHlpSUPCallVMMR0Ex(pThis->pDrvIns , VMMR0_DO_INTNET_IF_SEND, &SendReq, sizeof(SendReq));323 rc = PDMDrvHlpSUPCallVMMR0Ex(pThis->pDrvInsR3, VMMR0_DO_INTNET_IF_SEND, &SendReq, sizeof(SendReq)); 317 324 } 318 325 … … 333 340 * @thread EMT 334 341 */ 335 static DECLCALLBACK(void) drv IntNetSetPromiscuousMode(PPDMINETWORKCONNECTOR pInterface, bool fPromiscuous)342 static DECLCALLBACK(void) drvR3IntNetSetPromiscuousMode(PPDMINETWORKCONNECTOR pInterface, bool fPromiscuous) 336 343 { 337 344 PDRVINTNET pThis = PDMINETWORKCONNECTOR_2_DRVINTNET(pInterface); … … 342 349 Req.hIf = pThis->hIf; 343 350 Req.fPromiscuous = fPromiscuous; 344 int rc = PDMDrvHlpSUPCallVMMR0Ex(pThis->pDrvIns , VMMR0_DO_INTNET_IF_SET_PROMISCUOUS_MODE, &Req, sizeof(Req));345 LogFlow(("drv IntNetSetPromiscuousMode: fPromiscuous=%RTbool\n", fPromiscuous));351 int rc = PDMDrvHlpSUPCallVMMR0Ex(pThis->pDrvInsR3, VMMR0_DO_INTNET_IF_SET_PROMISCUOUS_MODE, &Req, sizeof(Req)); 352 LogFlow(("drvR3IntNetSetPromiscuousMode: fPromiscuous=%RTbool\n", fPromiscuous)); 346 353 AssertRC(rc); 347 354 } … … 355 362 * @thread EMT 356 363 */ 357 static DECLCALLBACK(void) drv IntNetNotifyLinkChanged(PPDMINETWORKCONNECTOR pInterface, PDMNETWORKLINKSTATE enmLinkState)364 static DECLCALLBACK(void) drvR3IntNetNotifyLinkChanged(PPDMINETWORKCONNECTOR pInterface, PDMNETWORKLINKSTATE enmLinkState) 358 365 { 359 366 PDRVINTNET pThis = PDMINETWORKCONNECTOR_2_DRVINTNET(pInterface); … … 371 378 break; 372 379 } 373 LogFlow(("drv IntNetNotifyLinkChanged: enmLinkState=%d %d->%d\n", enmLinkState, pThis->fLinkDown, fLinkDown));380 LogFlow(("drvR3IntNetNotifyLinkChanged: enmLinkState=%d %d->%d\n", enmLinkState, pThis->fLinkDown, fLinkDown)); 374 381 ASMAtomicXchgSize(&pThis->fLinkDown, fLinkDown); 375 382 } … … 384 391 * @param pThis Pointer to the instance data. 385 392 */ 386 static int drv IntNetAsyncIoWaitForSpace(PDRVINTNET pThis)387 { 388 LogFlow(("drv IntNetAsyncIoWaitForSpace:\n"));393 static int drvR3IntNetAsyncIoWaitForSpace(PDRVINTNET pThis) 394 { 395 LogFlow(("drvR3IntNetAsyncIoWaitForSpace:\n")); 389 396 STAM_PROFILE_ADV_STOP(&pThis->StatReceive, a); 390 int rc = pThis->p Port->pfnWaitReceiveAvail(pThis->pPort, RT_INDEFINITE_WAIT);397 int rc = pThis->pIPortR3->pfnWaitReceiveAvail(pThis->pIPortR3, RT_INDEFINITE_WAIT); 391 398 STAM_PROFILE_ADV_START(&pThis->StatReceive, a); 392 LogFlow(("drv IntNetAsyncIoWaitForSpace: returns %Rrc\n", rc));399 LogFlow(("drvR3IntNetAsyncIoWaitForSpace: returns %Rrc\n", rc)); 393 400 return rc; 394 401 } … … 402 409 * @param pThis The driver instance data. 403 410 */ 404 static int drv IntNetAsyncIoRun(PDRVINTNET pThis)405 { 406 PPDMDRVINS pDrvIns = pThis->pDrvIns ;407 LogFlow(("drv IntNetAsyncIoRun: pThis=%p\n", pThis));411 static int drvR3IntNetAsyncIoRun(PDRVINTNET pThis) 412 { 413 PPDMDRVINS pDrvIns = pThis->pDrvInsR3; 414 LogFlow(("drvR3IntNetAsyncIoRun: pThis=%p\n", pThis)); 408 415 409 416 /* … … 411 418 */ 412 419 STAM_PROFILE_ADV_START(&pThis->StatReceive, a); 413 PINTNETBUF pBuf = pThis->pBuf ;414 PINTNETRINGBUF pRingBuf = &p This->pBuf->Recv;420 PINTNETBUF pBuf = pThis->pBufR3; 421 PINTNETRINGBUF pRingBuf = &pBuf->Recv; 415 422 for (;;) 416 423 { … … 426 433 { 427 434 STAM_PROFILE_ADV_STOP(&pThis->StatReceive, a); 428 LogFlow(("drv IntNetAsyncIoRun: returns VERR_STATE_CHANGED (state changed - #0)\n"));435 LogFlow(("drvR3IntNetAsyncIoRun: returns VERR_STATE_CHANGED (state changed - #0)\n")); 429 436 return VERR_STATE_CHANGED; 430 437 } … … 439 446 */ 440 447 size_t cbFrame = pHdr->cbFrame; 441 int rc = pThis->p Port->pfnWaitReceiveAvail(pThis->pPort, 0);448 int rc = pThis->pIPortR3->pfnWaitReceiveAvail(pThis->pIPortR3, 0); 442 449 if (rc == VINF_SUCCESS) 443 450 { 444 451 #ifdef LOG_ENABLED 445 452 uint64_t u64Now = RTTimeProgramNanoTS(); 446 LogFlow(("drv IntNetAsyncIoRun: %-4d bytes at %llu ns deltas: r=%llu t=%llu\n",453 LogFlow(("drvR3IntNetAsyncIoRun: %-4d bytes at %llu ns deltas: r=%llu t=%llu\n", 447 454 cbFrame, u64Now, u64Now - pThis->u64LastReceiveTS, u64Now - pThis->u64LastTransferTS)); 448 455 pThis->u64LastReceiveTS = u64Now; 449 Log2(("drv IntNetAsyncIoRun: cbFrame=%#x\n"456 Log2(("drvR3IntNetAsyncIoRun: cbFrame=%#x\n" 450 457 "%.*Rhxd\n", 451 458 cbFrame, cbFrame, INTNETHdrGetFramePtr(pHdr, pBuf))); 452 459 #endif 453 rc = pThis->p Port->pfnReceive(pThis->pPort, INTNETHdrGetFramePtr(pHdr, pBuf), cbFrame);460 rc = pThis->pIPortR3->pfnReceive(pThis->pIPortR3, INTNETHdrGetFramePtr(pHdr, pBuf), cbFrame); 454 461 AssertRC(rc); 455 462 … … 462 469 * Wait for sufficient space to become available and then retry. 463 470 */ 464 rc = drv IntNetAsyncIoWaitForSpace(pThis);471 rc = drvR3IntNetAsyncIoWaitForSpace(pThis); 465 472 if (RT_FAILURE(rc)) 466 473 { … … 477 484 { 478 485 STAM_PROFILE_ADV_STOP(&pThis->StatReceive, a); 479 LogFlow(("drv IntNetAsyncIoRun: returns %Rrc (wait-for-space)\n", rc));486 LogFlow(("drvR3IntNetAsyncIoRun: returns %Rrc (wait-for-space)\n", rc)); 480 487 return rc; 481 488 } … … 500 507 { 501 508 STAM_PROFILE_ADV_STOP(&pThis->StatReceive, a); 502 LogFlow(("drv IntNetAsyncIoRun: returns VINF_SUCCESS (state changed - #1)\n"));509 LogFlow(("drvR3IntNetAsyncIoRun: returns VINF_SUCCESS (state changed - #1)\n")); 503 510 return VERR_STATE_CHANGED; 504 511 } … … 515 522 && rc != VERR_INTERRUPTED) 516 523 { 517 LogFlow(("drv IntNetAsyncIoRun: returns %Rrc\n", rc));524 LogFlow(("drvR3IntNetAsyncIoRun: returns %Rrc\n", rc)); 518 525 return rc; 519 526 } … … 530 537 * @param pvUser Pointer to a DRVINTNET structure. 531 538 */ 532 static DECLCALLBACK(int) drv IntNetAsyncIoThread(RTTHREAD ThreadSelf, void *pvUser)539 static DECLCALLBACK(int) drvR3IntNetAsyncIoThread(RTTHREAD ThreadSelf, void *pvUser) 533 540 { 534 541 PDRVINTNET pThis = (PDRVINTNET)pvUser; 535 LogFlow(("drv IntNetAsyncIoThread: pThis=%p\n", pThis));542 LogFlow(("drvR3IntNetAsyncIoThread: pThis=%p\n", pThis)); 536 543 STAM_PROFILE_ADV_START(&pThis->StatReceive, a); 537 544 … … 550 557 && rc != VERR_TIMEOUT) 551 558 { 552 LogFlow(("drv IntNetAsyncIoThread: returns %Rrc\n", rc));559 LogFlow(("drvR3IntNetAsyncIoThread: returns %Rrc\n", rc)); 553 560 return rc; 554 561 } … … 558 565 case ASYNCSTATE_RUNNING: 559 566 { 560 int rc = drv IntNetAsyncIoRun(pThis);567 int rc = drvR3IntNetAsyncIoRun(pThis); 561 568 if ( rc != VERR_STATE_CHANGED 562 569 && RT_FAILURE(rc)) 563 570 { 564 LogFlow(("drv IntNetAsyncIoThread: returns %Rrc\n", rc));571 LogFlow(("drvR3IntNetAsyncIoThread: returns %Rrc\n", rc)); 565 572 return rc; 566 573 } … … 571 578 AssertMsgFailed(("Invalid state %d\n", enmState)); 572 579 case ASYNCSTATE_TERMINATE: 573 LogFlow(("drv IntNetAsyncIoThread: returns VINF_SUCCESS\n"));580 LogFlow(("drvR3IntNetAsyncIoThread: returns VINF_SUCCESS\n")); 574 581 return VINF_SUCCESS; 575 582 } … … 577 584 } 578 585 586 /* -=-=-=-=- PDMINETWORKCONNECTOR -=-=-=-=- */ 579 587 580 588 /** 581 589 * @interface_method_impl{PDMIBASE,pfnQueryInterface} 582 590 */ 583 static DECLCALLBACK(void *) drv IntNetQueryInterface(PPDMIBASE pInterface, const char *pszIID)591 static DECLCALLBACK(void *) drvR3IntNetQueryInterface(PPDMIBASE pInterface, const char *pszIID) 584 592 { 585 593 PPDMDRVINS pDrvIns = PDMIBASE_2_PDMDRV(pInterface); … … 587 595 588 596 PDMIBASE_RETURN_INTERFACE(pszIID, PDMIBASE, &pDrvIns->IBase); 589 PDMIBASE_RETURN_INTERFACE(pszIID, PDMINETWORKCONNECTOR, &pThis->INetworkConnector );597 PDMIBASE_RETURN_INTERFACE(pszIID, PDMINETWORKCONNECTOR, &pThis->INetworkConnectorR3); 590 598 return NULL; 591 599 } 592 600 601 /* -=-=-=-=- PDMDRVREG -=-=-=-=- */ 593 602 594 603 /** … … 597 606 * @param pDrvIns The driver instance. 598 607 */ 599 static DECLCALLBACK(void) drv IntNetPowerOff(PPDMDRVINS pDrvIns)600 { 601 LogFlow(("drv IntNetPowerOff\n"));608 static DECLCALLBACK(void) drvR3IntNetPowerOff(PPDMDRVINS pDrvIns) 609 { 610 LogFlow(("drvR3IntNetPowerOff\n")); 602 611 PDRVINTNET pThis = PDMINS_2_DATA(pDrvIns, PDRVINTNET); 603 612 if (!pThis->fActivateEarlyDeactivateLate) 604 613 { 605 614 ASMAtomicXchgSize(&pThis->enmState, ASYNCSTATE_SUSPENDED); 606 drv IntNetSetActive(pThis, false /* fActive */);615 drvR3IntNetSetActive(pThis, false /* fActive */); 607 616 } 608 617 } … … 614 623 * @param pDrvIns The driver instance. 615 624 */ 616 static DECLCALLBACK(void) drv IntNetResume(PPDMDRVINS pDrvIns)617 { 618 LogFlow(("drv IntNetPowerResume\n"));625 static DECLCALLBACK(void) drvR3IntNetResume(PPDMDRVINS pDrvIns) 626 { 627 LogFlow(("drvR3IntNetPowerResume\n")); 619 628 PDRVINTNET pThis = PDMINS_2_DATA(pDrvIns, PDRVINTNET); 620 629 if (!pThis->fActivateEarlyDeactivateLate) … … 622 631 ASMAtomicXchgSize(&pThis->enmState, ASYNCSTATE_RUNNING); 623 632 RTSemEventSignal(pThis->EventSuspended); 624 drv IntNetUpdateMacAddress(pThis); /* (could be a state restore) */625 drv IntNetSetActive(pThis, true /* fActive */);633 drvR3IntNetUpdateMacAddress(pThis); /* (could be a state restore) */ 634 drvR3IntNetSetActive(pThis, true /* fActive */); 626 635 } 627 636 if ( PDMDrvHlpVMTeleportedAndNotFullyResumedYet(pDrvIns) 628 && pThis->p ConfigIf)637 && pThis->pIConfigIfR3) 629 638 { 630 639 /* … … 645 654 Frame.Hdr.DstMac.au16[2] = 0xffff; 646 655 Frame.Hdr.EtherType = RT_H2BE_U16(0x801e); 647 int rc = pThis->p ConfigIf->pfnGetMac(pThis->pConfigIf, &Frame.Hdr.SrcMac);656 int rc = pThis->pIConfigIfR3->pfnGetMac(pThis->pIConfigIfR3, &Frame.Hdr.SrcMac); 648 657 if (RT_SUCCESS(rc)) 649 rc = drv IntNetSend(&pThis->INetworkConnector, &Frame, sizeof(Frame));658 rc = drvR3IntNetSend(&pThis->INetworkConnectorR3, &Frame, sizeof(Frame)); 650 659 if (RT_FAILURE(rc)) 651 660 LogRel(("IntNet#%u: Sending dummy frame failed: %Rrc\n", pDrvIns->iInstance, rc)); … … 659 668 * @param pDrvIns The driver instance. 660 669 */ 661 static DECLCALLBACK(void) drv IntNetSuspend(PPDMDRVINS pDrvIns)662 { 663 LogFlow(("drv IntNetPowerSuspend\n"));670 static DECLCALLBACK(void) drvR3IntNetSuspend(PPDMDRVINS pDrvIns) 671 { 672 LogFlow(("drvR3IntNetPowerSuspend\n")); 664 673 PDRVINTNET pThis = PDMINS_2_DATA(pDrvIns, PDRVINTNET); 665 674 if (!pThis->fActivateEarlyDeactivateLate) 666 675 { 667 676 ASMAtomicXchgSize(&pThis->enmState, ASYNCSTATE_SUSPENDED); 668 drv IntNetSetActive(pThis, false /* fActive */);677 drvR3IntNetSetActive(pThis, false /* fActive */); 669 678 } 670 679 } … … 676 685 * @param pDrvIns The driver instance. 677 686 */ 678 static DECLCALLBACK(void) drv IntNetPowerOn(PPDMDRVINS pDrvIns)679 { 680 LogFlow(("drv IntNetPowerOn\n"));687 static DECLCALLBACK(void) drvR3IntNetPowerOn(PPDMDRVINS pDrvIns) 688 { 689 LogFlow(("drvR3IntNetPowerOn\n")); 681 690 PDRVINTNET pThis = PDMINS_2_DATA(pDrvIns, PDRVINTNET); 682 691 if (!pThis->fActivateEarlyDeactivateLate) … … 684 693 ASMAtomicXchgSize(&pThis->enmState, ASYNCSTATE_RUNNING); 685 694 RTSemEventSignal(pThis->EventSuspended); 686 drv IntNetUpdateMacAddress(pThis);687 drv IntNetSetActive(pThis, true /* fActive */);695 drvR3IntNetUpdateMacAddress(pThis); 696 drvR3IntNetSetActive(pThis, true /* fActive */); 688 697 } 689 698 } … … 698 707 * @param pDrvIns The driver instance data. 699 708 */ 700 static DECLCALLBACK(void) drv IntNetDestruct(PPDMDRVINS pDrvIns)701 { 702 LogFlow(("drv IntNetDestruct\n"));709 static DECLCALLBACK(void) drvR3IntNetDestruct(PPDMDRVINS pDrvIns) 710 { 711 LogFlow(("drvR3IntNetDestruct\n")); 703 712 PDRVINTNET pThis = PDMINS_2_DATA(pDrvIns, PDRVINTNET); 704 713 … … 747 756 * Deregister statistics in case we're being detached. 748 757 */ 749 PDMDrvHlpSTAMDeregister(pDrvIns, &pThis->pBuf ->cbStatRecv);750 PDMDrvHlpSTAMDeregister(pDrvIns, &pThis->pBuf ->cbStatSend);751 PDMDrvHlpSTAMDeregister(pDrvIns, &pThis->pBuf ->cStatRecvs);752 PDMDrvHlpSTAMDeregister(pDrvIns, &pThis->pBuf ->cStatSends);753 PDMDrvHlpSTAMDeregister(pDrvIns, &pThis->pBuf ->cStatLost);754 PDMDrvHlpSTAMDeregister(pDrvIns, &pThis->pBuf ->cStatYieldsNok);758 PDMDrvHlpSTAMDeregister(pDrvIns, &pThis->pBufR3->cbStatRecv); 759 PDMDrvHlpSTAMDeregister(pDrvIns, &pThis->pBufR3->cbStatSend); 760 PDMDrvHlpSTAMDeregister(pDrvIns, &pThis->pBufR3->cStatRecvs); 761 PDMDrvHlpSTAMDeregister(pDrvIns, &pThis->pBufR3->cStatSends); 762 PDMDrvHlpSTAMDeregister(pDrvIns, &pThis->pBufR3->cStatLost); 763 PDMDrvHlpSTAMDeregister(pDrvIns, &pThis->pBufR3->cStatYieldsNok); 755 764 #ifdef VBOX_WITH_STATISTICS 756 765 PDMDrvHlpSTAMDeregister(pDrvIns, &pThis->StatReceive); … … 765 774 * @copydoc FNPDMDRVCONSTRUCT 766 775 */ 767 static DECLCALLBACK(int) drv IntNetConstruct(PPDMDRVINS pDrvIns, PCFGMNODE pCfgHandle, uint32_t fFlags)776 static DECLCALLBACK(int) drvR3IntNetConstruct(PPDMDRVINS pDrvIns, PCFGMNODE pCfgHandle, uint32_t fFlags) 768 777 { 769 778 PDRVINTNET pThis = PDMINS_2_DATA(pDrvIns, PDRVINTNET); … … 773 782 * Init the static parts. 774 783 */ 775 pThis->pDrvIns = pDrvIns;776 pThis->hIf = INTNET_HANDLE_INVALID;777 pThis->Thread = NIL_RTTHREAD;778 pThis->EventSuspended = NIL_RTSEMEVENT;779 pThis->enmState = ASYNCSTATE_SUSPENDED;780 pThis->fActivateEarlyDeactivateLate = false;784 pThis->pDrvInsR3 = pDrvIns; 785 pThis->hIf = INTNET_HANDLE_INVALID; 786 pThis->Thread = NIL_RTTHREAD; 787 pThis->EventSuspended = NIL_RTSEMEVENT; 788 pThis->enmState = ASYNCSTATE_SUSPENDED; 789 pThis->fActivateEarlyDeactivateLate = false; 781 790 /* IBase */ 782 pDrvIns->IBase.pfnQueryInterface = drvIntNetQueryInterface;791 pDrvIns->IBase.pfnQueryInterface = drvR3IntNetQueryInterface; 783 792 /* INetwork */ 784 pThis->INetworkConnector .pfnSend = drvIntNetSend;785 pThis->INetworkConnector .pfnSetPromiscuousMode = drvIntNetSetPromiscuousMode;786 pThis->INetworkConnector .pfnNotifyLinkChanged = drvIntNetNotifyLinkChanged;793 pThis->INetworkConnectorR3.pfnSend = drvR3IntNetSend; 794 pThis->INetworkConnectorR3.pfnSetPromiscuousMode= drvR3IntNetSetPromiscuousMode; 795 pThis->INetworkConnectorR3.pfnNotifyLinkChanged = drvR3IntNetNotifyLinkChanged; 787 796 788 797 /* … … 818 827 * Query the network port interface. 819 828 */ 820 pThis->p Port= PDMIBASE_QUERY_INTERFACE(pDrvIns->pUpBase, PDMINETWORKPORT);821 if (!pThis->p Port)829 pThis->pIPortR3 = PDMIBASE_QUERY_INTERFACE(pDrvIns->pUpBase, PDMINETWORKPORT); 830 if (!pThis->pIPortR3) 822 831 { 823 832 AssertMsgFailed(("Configuration error: the above device/driver didn't export the network port interface!\n")); 824 833 return VERR_PDM_MISSING_INTERFACE_ABOVE; 825 834 } 826 pThis->p ConfigIf= PDMIBASE_QUERY_INTERFACE(pDrvIns->pUpBase, PDMINETWORKCONFIG);835 pThis->pIConfigIfR3 = PDMIBASE_QUERY_INTERFACE(pDrvIns->pUpBase, PDMINETWORKCONFIG); 827 836 828 837 /* … … 1081 1090 N_("Failed to get ring-3 buffer for the newly created interface to '%s'"), pThis->szNetwork); 1082 1091 AssertRelease(VALID_PTR(GetRing3BufferReq.pRing3Buf)); 1083 pThis->pBuf = GetRing3BufferReq.pRing3Buf;1092 pThis->pBufR3 = GetRing3BufferReq.pRing3Buf; 1084 1093 1085 1094 /* … … 1087 1096 * Note! Using a PDM thread here doesn't fit with the IsService=true operation. 1088 1097 */ 1089 rc = RTThreadCreate(&pThis->Thread, drv IntNetAsyncIoThread, pThis, _128K, RTTHREADTYPE_IO, RTTHREADFLAGS_WAITABLE, "INTNET");1098 rc = RTThreadCreate(&pThis->Thread, drvR3IntNetAsyncIoThread, pThis, _128K, RTTHREADTYPE_IO, RTTHREADFLAGS_WAITABLE, "INTNET"); 1090 1099 if (RT_FAILURE(rc)) 1091 1100 { … … 1094 1103 } 1095 1104 1096 PDMDrvHlpSTAMRegisterF(pDrvIns, &pThis->pBuf ->cbStatRecv,STAMTYPE_COUNTER, STAMVISIBILITY_ALWAYS, STAMUNIT_BYTES, "Number of received bytes.", "/Net/IntNet%d/Bytes/Received", pDrvIns->iInstance);1097 PDMDrvHlpSTAMRegisterF(pDrvIns, &pThis->pBuf ->cbStatSend,STAMTYPE_COUNTER, STAMVISIBILITY_ALWAYS, STAMUNIT_BYTES, "Number of sent bytes.", "/Net/IntNet%d/Bytes/Sent", pDrvIns->iInstance);1098 PDMDrvHlpSTAMRegisterF(pDrvIns, &pThis->pBuf ->cStatRecvs,STAMTYPE_COUNTER, STAMVISIBILITY_ALWAYS, STAMUNIT_COUNT, "Number of received packets.", "/Net/IntNet%d/Packets/Received", pDrvIns->iInstance);1099 PDMDrvHlpSTAMRegisterF(pDrvIns, &pThis->pBuf ->cStatSends,STAMTYPE_COUNTER, STAMVISIBILITY_ALWAYS, STAMUNIT_COUNT, "Number of sent packets.", "/Net/IntNet%d/Packets/Sent", pDrvIns->iInstance);1100 PDMDrvHlpSTAMRegisterF(pDrvIns, &pThis->pBuf ->cStatLost,STAMTYPE_COUNTER, STAMVISIBILITY_ALWAYS, STAMUNIT_COUNT, "Number of sent packets.", "/Net/IntNet%d/Packets/Lost", pDrvIns->iInstance);1101 PDMDrvHlpSTAMRegisterF(pDrvIns, &pThis->pBuf ->cStatYieldsNok,STAMTYPE_COUNTER, STAMVISIBILITY_ALWAYS, STAMUNIT_COUNT, "Number of times yielding didn't help fix an overflow.", "/Net/IntNet%d/YieldNok", pDrvIns->iInstance);1105 PDMDrvHlpSTAMRegisterF(pDrvIns, &pThis->pBufR3->cbStatRecv, STAMTYPE_COUNTER, STAMVISIBILITY_ALWAYS, STAMUNIT_BYTES, "Number of received bytes.", "/Net/IntNet%d/Bytes/Received", pDrvIns->iInstance); 1106 PDMDrvHlpSTAMRegisterF(pDrvIns, &pThis->pBufR3->cbStatSend, STAMTYPE_COUNTER, STAMVISIBILITY_ALWAYS, STAMUNIT_BYTES, "Number of sent bytes.", "/Net/IntNet%d/Bytes/Sent", pDrvIns->iInstance); 1107 PDMDrvHlpSTAMRegisterF(pDrvIns, &pThis->pBufR3->cStatRecvs, STAMTYPE_COUNTER, STAMVISIBILITY_ALWAYS, STAMUNIT_COUNT, "Number of received packets.", "/Net/IntNet%d/Packets/Received", pDrvIns->iInstance); 1108 PDMDrvHlpSTAMRegisterF(pDrvIns, &pThis->pBufR3->cStatSends, STAMTYPE_COUNTER, STAMVISIBILITY_ALWAYS, STAMUNIT_COUNT, "Number of sent packets.", "/Net/IntNet%d/Packets/Sent", pDrvIns->iInstance); 1109 PDMDrvHlpSTAMRegisterF(pDrvIns, &pThis->pBufR3->cStatLost, STAMTYPE_COUNTER, STAMVISIBILITY_ALWAYS, STAMUNIT_COUNT, "Number of sent packets.", "/Net/IntNet%d/Packets/Lost", pDrvIns->iInstance); 1110 PDMDrvHlpSTAMRegisterF(pDrvIns, &pThis->pBufR3->cStatYieldsNok, STAMTYPE_COUNTER, STAMVISIBILITY_ALWAYS, STAMUNIT_COUNT, "Number of times yielding didn't help fix an overflow.", "/Net/IntNet%d/YieldNok", pDrvIns->iInstance); 1102 1111 #ifdef VBOX_WITH_STATISTICS 1103 1112 PDMDrvHlpSTAMRegisterF(pDrvIns, &pThis->StatReceive, STAMTYPE_PROFILE, STAMVISIBILITY_ALWAYS, STAMUNIT_TICKS_PER_CALL, "Profiling packet receive runs.", "/Net/IntNet%d/Receive", pDrvIns->iInstance); … … 1112 1121 ASMAtomicXchgSize(&pThis->enmState, ASYNCSTATE_RUNNING); 1113 1122 RTSemEventSignal(pThis->EventSuspended); 1114 drv IntNetUpdateMacAddress(pThis);1115 drv IntNetSetActive(pThis, true /* fActive */);1123 drvR3IntNetUpdateMacAddress(pThis); 1124 drvR3IntNetSetActive(pThis, true /* fActive */); 1116 1125 } 1117 1126 … … 1130 1139 "IntNet", 1131 1140 /* szRCMod */ 1132 " ",1141 "VBoxDD", 1133 1142 /* szR0Mod */ 1134 " ",1143 "VBoxDD", 1135 1144 /* pszDescription */ 1136 1145 "Internal Networking Transport Driver", 1137 1146 /* fFlags */ 1147 #ifdef VBOX_WITH_R0_AND_RC_DRIVERS 1148 PDM_DRVREG_FLAGS_HOST_BITS_DEFAULT | PDM_DRVREG_FLAGS_R0 | PDM_DRVREG_FLAGS_RC, 1149 #else 1138 1150 PDM_DRVREG_FLAGS_HOST_BITS_DEFAULT, 1151 #endif 1139 1152 /* fClass. */ 1140 1153 PDM_DRVREG_CLASS_NETWORK, … … 1144 1157 sizeof(DRVINTNET), 1145 1158 /* pfnConstruct */ 1146 drv IntNetConstruct,1159 drvR3IntNetConstruct, 1147 1160 /* pfnDestruct */ 1148 drv IntNetDestruct,1161 drvR3IntNetDestruct, 1149 1162 /* pfnRelocate */ 1150 1163 NULL, … … 1152 1165 NULL, 1153 1166 /* pfnPowerOn */ 1154 drv IntNetPowerOn,1167 drvR3IntNetPowerOn, 1155 1168 /* pfnReset */ 1156 1169 NULL, 1157 1170 /* pfnSuspend */ 1158 drv IntNetSuspend,1171 drvR3IntNetSuspend, 1159 1172 /* pfnResume */ 1160 drv IntNetResume,1173 drvR3IntNetResume, 1161 1174 /* pfnAttach */ 1162 1175 NULL, … … 1164 1177 NULL, 1165 1178 /* pfnPowerOff */ 1166 drv IntNetPowerOff,1179 drvR3IntNetPowerOff, 1167 1180 /* pfnSoftReset */ 1168 1181 NULL, … … 1171 1184 }; 1172 1185 1186 #endif /* IN_RING3 */ 1187
Note:
See TracChangeset
for help on using the changeset viewer.