Changeset 28277 in vbox
- Timestamp:
- Apr 13, 2010 8:31:08 PM (15 years ago)
- svn:sync-xref-src-repo-rev:
- 60019
- Location:
- trunk/src/VBox/Devices/Network
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Network/DevE1000.cpp
r28275 r28277 16 16 17 17 /* 18 * Copyright (C) 2007 Sun Microsystems, Inc.18 * Copyright (C) 2007-2010 Sun Microsystems, Inc. 19 19 * 20 20 * This file is part of VirtualBox Open Source Edition (OSE), as … … 108 108 109 109 #define INSTANCE(pState) pState->szInstance 110 #define IFACE_TO_STATE(pIface, ifaceName) ((E1KSTATE *)((char*)pIface - RT_OFFSETOF(E1KSTATE, ifaceName)))111 110 #define STATE_TO_DEVINS(pState) (((E1KSTATE *)pState)->CTX_SUFF(pDevIns)) 112 111 #define E1K_RELOCATE(p, o) *(RTHCUINTPTR *)&p += o … … 2598 2597 * 2599 2598 * @remarks Write into RDT forces switch to HC and signal to 2600 * e1k WaitReceiveAvail().2599 * e1kNetworkDown_WaitReceiveAvail(). 2601 2600 * 2602 2601 * @returns VBox status code. … … 3121 3120 * a real ethernet wire. 3122 3121 * 3123 * @param pState The device state structure. 3122 * @param pState The device state structure. 3123 * @param fOnWorkerThread Whether we're on a worker thread or an EMT. 3124 3124 * @thread E1000_TX 3125 3125 */ 3126 static void e1kTransmitFrame(E1KSTATE* pState )3126 static void e1kTransmitFrame(E1KSTATE* pState, bool fOnWorkerThread) 3127 3127 { 3128 3128 PPDMSCATTERGATHER pSg = pState->pTxSgR3; … … 3181 3181 e1kMutexRelease(pState); 3182 3182 STAM_PROFILE_START(&pState->StatTransmitSend, a); 3183 rc = pDrv->pfnSendBuf(pDrv, pSg, true /*fOnWorkerThread*/);3183 rc = pDrv->pfnSendBuf(pDrv, pSg, fOnWorkerThread); 3184 3184 STAM_PROFILE_STOP(&pState->StatTransmitSend, a); 3185 3185 e1kMutexAcquire(pState, VERR_SEM_BUSY, RT_SRC_POS); … … 3250 3250 * legacy.u64BufAddr. 3251 3251 * 3252 * @param pState The device state structure.3253 * @param pDesc Pointer to the descriptor to transmit.3254 * @param u16Len Length of buffer to the end of segment.3255 * @param fSend Force packet sending.3256 * @param pSgBuf The current scatter gather buffer.3252 * @param pState The device state structure. 3253 * @param pDesc Pointer to the descriptor to transmit. 3254 * @param u16Len Length of buffer to the end of segment. 3255 * @param fSend Force packet sending. 3256 * @param fOnWorkerThread Whether we're on a worker thread or an EMT. 3257 3257 * @thread E1000_TX 3258 3258 */ 3259 static void e1kFallbackAddSegment(E1KSTATE* pState, RTGCPHYS PhysAddr, uint16_t u16Len, bool fSend )3259 static void e1kFallbackAddSegment(E1KSTATE* pState, RTGCPHYS PhysAddr, uint16_t u16Len, bool fSend, bool fOnWorkerThread) 3260 3260 { 3261 3261 /* TCP header being transmitted */ … … 3353 3353 pState->pTxSgR3->aSegs[0].cbSeg = pState->u16TxPktLen; 3354 3354 } 3355 e1kTransmitFrame(pState );3355 e1kTransmitFrame(pState, fOnWorkerThread); 3356 3356 3357 3357 /* Update Sequence Number */ … … 3372 3372 * @returns true if the frame should be transmitted, false if not. 3373 3373 * 3374 * @param pState The device state structure. 3375 * @param pDesc Pointer to the descriptor to transmit. 3376 * @param cbFragment Length of descriptor's buffer. 3374 * @param pState The device state structure. 3375 * @param pDesc Pointer to the descriptor to transmit. 3376 * @param cbFragment Length of descriptor's buffer. 3377 * @param fOnWorkerThread Whether we're on a worker thread or an EMT. 3377 3378 * @thread E1000_TX 3378 3379 */ 3379 static bool e1kFallbackAddToFrame(E1KSTATE* pState, E1KTXDESC* pDesc, uint32_t cbFragment )3380 static bool e1kFallbackAddToFrame(E1KSTATE* pState, E1KTXDESC* pDesc, uint32_t cbFragment, bool fOnWorkerThread) 3380 3381 { 3381 3382 PPDMSCATTERGATHER pTxSg = pState->pTxSgR3; … … 3399 3400 /* This descriptor fits completely into current segment */ 3400 3401 cb = cbFragment; 3401 e1kFallbackAddSegment(pState, pDesc->data.u64BufAddr, cb, pDesc->data.cmd.fEOP /*fSend*/ );3402 e1kFallbackAddSegment(pState, pDesc->data.u64BufAddr, cb, pDesc->data.cmd.fEOP /*fSend*/, fOnWorkerThread); 3402 3403 } 3403 3404 else 3404 3405 { 3405 e1kFallbackAddSegment(pState, pDesc->data.u64BufAddr, cb, true /*fSend*/ );3406 e1kFallbackAddSegment(pState, pDesc->data.u64BufAddr, cb, true /*fSend*/, fOnWorkerThread); 3406 3407 /* 3407 3408 * Rewind the packet tail pointer to the beginning of payload, … … 3545 3546 * - context sets up the context for following data descriptors. 3546 3547 * 3547 * @param pState The device state structure. 3548 * @param pDesc Pointer to descriptor union. 3549 * @param addr Physical address of descriptor in guest memory. 3548 * @param pState The device state structure. 3549 * @param pDesc Pointer to descriptor union. 3550 * @param addr Physical address of descriptor in guest memory. 3551 * @param fOnWorkerThread Whether we're on a worker thread or an EMT. 3550 3552 * @thread E1000_TX 3551 3553 */ 3552 static void e1kXmitDesc(E1KSTATE* pState, E1KTXDESC* pDesc, RTGCPHYS addr )3554 static void e1kXmitDesc(E1KSTATE* pState, E1KTXDESC* pDesc, RTGCPHYS addr, bool fOnWorkerThread) 3553 3555 { 3554 3556 e1kPrintTDesc(pState, pDesc, "vvv"); … … 3636 3638 && pState->pTxSgR3->cbUsed == (size_t)pState->contextTSE.dw3.u8HDRLEN + pState->contextTSE.dw2.u20PAYLEN) 3637 3639 { 3638 e1kTransmitFrame(pState );3640 e1kTransmitFrame(pState, fOnWorkerThread); 3639 3641 E1K_INC_CNT32(TSCTC); 3640 3642 } … … 3670 3672 pState->contextNormal.tu.u8CSS, 3671 3673 pState->contextNormal.tu.u16CSE); 3672 e1kTransmitFrame(pState );3674 e1kTransmitFrame(pState, fOnWorkerThread); 3673 3675 } 3674 3676 else … … 3680 3682 { 3681 3683 STAM_COUNTER_INC(&pState->StatTxPathFallback); 3682 e1kFallbackAddToFrame(pState, pDesc, pDesc->data.cmd.u20DTALEN );3684 e1kFallbackAddToFrame(pState, pDesc, pDesc->data.cmd.u20DTALEN, fOnWorkerThread); 3683 3685 } 3684 3686 … … 3714 3716 { 3715 3717 /** @todo Offload processing goes here. */ 3716 e1kTransmitFrame(pState );3718 e1kTransmitFrame(pState, fOnWorkerThread); 3717 3719 pState->u16TxPktLen = 0; 3718 3720 } … … 3743 3745 * 3744 3746 * @param pState The E1000 state. 3745 * /3746 static int e1kXmitPending(E1KSTATE *pState) 3747 { 3748 PPDMINETWORKUP pDrv = pState->pDrv; 3749 int 3747 * @param fOnWorkerThread Whether we're on a worker thread or on an EMT. 3748 */ 3749 static int e1kXmitPending(E1KSTATE *pState, bool fOnWorkerThread) 3750 { 3751 int rc; 3750 3752 3751 3753 /* 3752 3754 * Grab the xmit lock of the driver as well as the E1K device state. 3753 3755 */ 3756 PPDMINETWORKUP pDrv = pState->pDrv; 3754 3757 if (pDrv) 3755 3758 { … … 3772 3775 3773 3776 e1kLoadDesc(pState, &desc, ((uint64_t)TDBAH << 32) + TDBAL + TDH * sizeof(desc)); 3774 e1kXmitDesc(pState, &desc, ((uint64_t)TDBAH << 32) + TDBAL + TDH * sizeof(desc) );3777 e1kXmitDesc(pState, &desc, ((uint64_t)TDBAH << 32) + TDBAL + TDH * sizeof(desc), fOnWorkerThread); 3775 3778 if (++TDH * sizeof(desc) >= TDLEN) 3776 3779 TDH = 0; … … 3797 3800 pDrv->pfnEndXmit(pDrv); 3798 3801 return rc; 3802 } 3803 3804 /** 3805 * @interface_method_impl{PDMINETWORKDOWN,pfnXmitPending} 3806 */ 3807 static DECLCALLBACK(void) e1kNetworkDown_XmitPending(PPDMINETWORKDOWN pInterface) 3808 { 3809 E1KSTATE *pState = RT_FROM_MEMBER(pInterface, E1KSTATE, INetworkDown); 3810 e1kXmitPending(pState, true /*fOnWorkerThread*/); 3799 3811 } 3800 3812 … … 3847 3859 if (pThread->enmState == PDMTHREADSTATE_RUNNING) 3848 3860 { 3849 rc = e1kXmitPending(pState );3861 rc = e1kXmitPending(pState, true /*fOnWorkerThread*/); 3850 3862 AssertMsgReturn(RT_SUCCESS(rc) || rc == VERR_TRY_AGAIN, ("%Rrc\n", rc), rc); 3851 3863 } … … 4665 4677 } 4666 4678 4667 static DECLCALLBACK(int) e1kWaitReceiveAvail(PPDMINETWORKDOWN pInterface, RTMSINTERVAL cMillies) 4668 { 4669 E1KSTATE *pState = IFACE_TO_STATE(pInterface, INetworkDown); 4679 /** 4680 * @interface_method_impl{PDMINETWORKDOWN,pfnWaitReceiveAvail} 4681 */ 4682 static DECLCALLBACK(int) e1kNetworkDown_WaitReceiveAvail(PPDMINETWORKDOWN pInterface, RTMSINTERVAL cMillies) 4683 { 4684 E1KSTATE *pState = RT_FROM_MEMBER(pInterface, E1KSTATE, INetworkDown); 4670 4685 int rc = e1kCanReceive(pState); 4671 4686 … … 4688 4703 break; 4689 4704 } 4690 E1kLogRel(("E1000 e1k WaitReceiveAvail: waiting cMillies=%u...\n",4705 E1kLogRel(("E1000 e1kNetworkDown_WaitReceiveAvail: waiting cMillies=%u...\n", 4691 4706 cMillies)); 4692 E1kLog(("%s e1k WaitReceiveAvail: waiting cMillies=%u...\n",4707 E1kLog(("%s e1kNetworkDown_WaitReceiveAvail: waiting cMillies=%u...\n", 4693 4708 INSTANCE(pState), cMillies)); 4694 4709 RTSemEventWait(pState->hEventMoreRxDescAvail, cMillies); … … 4863 4878 4864 4879 /** 4865 * Receive data from the network. 4866 * 4867 * @returns VBox status code. 4868 * @param pInterface Pointer to the interface structure containing the called function pointer. 4869 * @param pvBuf The available data. 4870 * @param cb Number of bytes available in the buffer. 4871 * @thread ??? 4872 */ 4873 static DECLCALLBACK(int) e1kReceive(PPDMINETWORKDOWN pInterface, const void *pvBuf, size_t cb) 4874 { 4875 E1KSTATE *pState = IFACE_TO_STATE(pInterface, INetworkDown); 4880 * @interface_method_impl{PDMINETWORKDOWN,pfnReceive} 4881 */ 4882 static DECLCALLBACK(int) e1kNetworkDown_Receive(PPDMINETWORKDOWN pInterface, const void *pvBuf, size_t cb) 4883 { 4884 E1KSTATE *pState = RT_FROM_MEMBER(pInterface, E1KSTATE, INetworkDown); 4876 4885 int rc = VINF_SUCCESS; 4877 4886 … … 4938 4947 static DECLCALLBACK(int) e1kQueryStatusLed(PPDMILEDPORTS pInterface, unsigned iLUN, PPDMLED *ppLed) 4939 4948 { 4940 E1KSTATE *pState = IFACE_TO_STATE(pInterface, ILeds);4949 E1KSTATE *pState = RT_FROM_MEMBER(pInterface, E1KSTATE, ILeds); 4941 4950 int rc = VERR_PDM_LUN_NOT_FOUND; 4942 4951 … … 4959 4968 static DECLCALLBACK(int) e1kGetMac(PPDMINETWORKCONFIG pInterface, PRTMAC pMac) 4960 4969 { 4961 E1KSTATE *pState = IFACE_TO_STATE(pInterface, INetworkConfig);4970 E1KSTATE *pState = RT_FROM_MEMBER(pInterface, E1KSTATE, INetworkConfig); 4962 4971 pState->eeprom.getMac(pMac); 4963 4972 return VINF_SUCCESS; … … 4974 4983 static DECLCALLBACK(PDMNETWORKLINKSTATE) e1kGetLinkState(PPDMINETWORKCONFIG pInterface) 4975 4984 { 4976 E1KSTATE *pState = IFACE_TO_STATE(pInterface, INetworkConfig);4985 E1KSTATE *pState = RT_FROM_MEMBER(pInterface, E1KSTATE, INetworkConfig); 4977 4986 if (STATUS & STATUS_LU) 4978 4987 return PDMNETWORKLINKSTATE_UP; … … 4991 5000 static DECLCALLBACK(int) e1kSetLinkState(PPDMINETWORKCONFIG pInterface, PDMNETWORKLINKSTATE enmState) 4992 5001 { 4993 E1KSTATE *pState = IFACE_TO_STATE(pInterface, INetworkConfig);5002 E1KSTATE *pState = RT_FROM_MEMBER(pInterface, E1KSTATE, INetworkConfig); 4994 5003 bool fOldUp = !!(STATUS & STATUS_LU); 4995 5004 bool fNewUp = enmState == PDMNETWORKLINKSTATE_UP; … … 5026 5035 static DECLCALLBACK(void *) e1kQueryInterface(struct PDMIBASE *pInterface, const char *pszIID) 5027 5036 { 5028 E1KSTATE *pThis = IFACE_TO_STATE(pInterface, IBase);5037 E1KSTATE *pThis = RT_FROM_MEMBER(pInterface, E1KSTATE, IBase); 5029 5038 Assert(&pThis->IBase == pInterface); 5030 5039 … … 5698 5707 /* Interfaces */ 5699 5708 pState->IBase.pfnQueryInterface = e1kQueryInterface; 5700 pState->INetworkDown.pfnWaitReceiveAvail = e1kWaitReceiveAvail; 5701 pState->INetworkDown.pfnReceive = e1kReceive; 5709 5710 pState->INetworkDown.pfnWaitReceiveAvail = e1kNetworkDown_WaitReceiveAvail; 5711 pState->INetworkDown.pfnReceive = e1kNetworkDown_Receive; 5712 pState->INetworkDown.pfnXmitPending = e1kNetworkDown_XmitPending; 5713 5702 5714 pState->ILeds.pfnQueryStatusLed = e1kQueryStatusLed; 5715 5703 5716 pState->INetworkConfig.pfnGetMac = e1kGetMac; 5704 5717 pState->INetworkConfig.pfnGetLinkState = e1kGetLinkState; -
trunk/src/VBox/Devices/Network/DevINIP.cpp
r28258 r28277 385 385 386 386 /** 387 * @interface_method_impl{PDMINETWORKDOWN,pfn DoTransmitWork}388 */ 389 static DECLCALLBACK(void) devINIPNetworkDown_ DoTransmitWork(PPDMINETWORKDOWN pInterface)387 * @interface_method_impl{PDMINETWORKDOWN,pfnXmitPending} 388 */ 389 static DECLCALLBACK(void) devINIPNetworkDown_XmitPending(PPDMINETWORKDOWN pInterface) 390 390 { 391 391 NOREF(pInterface); … … 494 494 pThis->INetworkDown.pfnWaitReceiveAvail = devINIPNetworkDown_WaitInputAvail; 495 495 pThis->INetworkDown.pfnReceive = devINIPNetworkDown_Input; 496 pThis->INetworkDown.pfn DoTransmitWork = devINIPNetworkDown_DoTransmitWork;496 pThis->INetworkDown.pfnXmitPending = devINIPNetworkDown_XmitPending; 497 497 498 498 /* -
trunk/src/VBox/Devices/Network/DevPCNet.cpp
r28275 r28277 11 11 12 12 /* 13 * Copyright (C) 2006-20 08Sun Microsystems, Inc.13 * Copyright (C) 2006-2010 Sun Microsystems, Inc. 14 14 * 15 15 * This file is part of VirtualBox Open Source Edition (OSE), as … … 2062 2062 #ifndef VBOX_WITH_TX_THREAD_IN_NET_DEVICES 2063 2063 /* 2064 * Processas much as we can.2064 * Transmit as much as we can. 2065 2065 */ 2066 int rc = VINF_SUCCESS; 2067 PPDMINETWORKUP pDrv = pThis->pDrvR3; 2068 if (pDrv) 2069 { 2070 rc = pDrv->pfnBeginXmit(pDrv, false /*fOnWorkerThread*/); 2071 AssertMsg(rc == VINF_SUCCESS || rc == VERR_TRY_AGAIN, ("%Rrc\n", rc)); 2072 } 2073 if (RT_SUCCESS(rc)) 2074 { 2075 rc = PDMCritSectEnter(&pThis->CritSect, VERR_SEM_BUSY); 2076 if (RT_SUCCESS(rc)) 2077 { 2078 int rc2 = pcnetAsyncTransmit(pThis, false /*fOnWorkerThread*/); 2079 AssertReleaseRC(rc2); 2080 2081 PDMCritSectLeave(&pThis->CritSect); 2082 } 2083 else 2084 AssertReleaseRC(rc); 2085 if (pDrv) 2086 pDrv->pfnEndXmit(pDrv); 2087 } 2066 pcnetXmitPending(pThis, true /*fOnWorkerThread*/); 2088 2067 #else 2089 2068 /* … … 2669 2648 } 2670 2649 2650 2651 /** 2652 * Transmit pending descriptors. 2653 * 2654 * @returns VBox status code. VERR_TRY_AGAIN is returned if we're busy. 2655 * 2656 * @param pThis The PCNet instance data. 2657 * @param fOnWorkerThread Whether we're on a worker thread or on an EMT. 2658 */ 2659 static int pcnetXmitPending(PCNetState *pThis, bool fOnWorkerThread) 2660 { 2661 int rc = VINF_SUCCESS; 2662 2663 /* 2664 * Grab the xmit lock of the driver as well as the E1K device state. 2665 */ 2666 PPDMINETWORKUP pDrv = pThis->pDrvR3; 2667 if (pDrv) 2668 { 2669 rc = pDrv->pfnBeginXmit(pDrv, false /*fOnWorkerThread*/); 2670 if (RT_FAILURE(rc)) 2671 return rc; 2672 } 2673 rc = PDMCritSectEnter(&pThis->CritSect, VERR_SEM_BUSY); 2674 if (RT_SUCCESS(rc)) 2675 { 2676 /** @todo check if we're supposed to suspend now. */ 2677 /* 2678 * Do the transmitting. 2679 */ 2680 int rc2 = pcnetAsyncTransmit(pThis, false /*fOnWorkerThread*/); 2681 AssertReleaseRC(rc2); 2682 2683 /* 2684 * Release the locks. 2685 */ 2686 PDMCritSectLeave(&pThis->CritSect); 2687 } 2688 else 2689 AssertLogRelRC(rc); 2690 if (pDrv) 2691 pDrv->pfnEndXmit(pDrv); 2692 2693 return rc; 2694 } 2695 2671 2696 #ifdef VBOX_WITH_TX_THREAD_IN_NET_DEVICES 2672 2697 … … 2711 2736 2712 2737 /* 2713 * Perform async send. Mind that we might be requested to 2714 * suspended while waiting for the critical sections. 2738 * Perform async send. 2715 2739 */ 2716 PPDMINETWORKUP pDrv = pThis->pDrvR3; 2717 if (pDrv) 2718 { 2719 rc = pDrv->pfnBeginXmit(pDrv, true /*fOnWorkerThread*/); 2720 if (rc == VERR_TRY_AGAIN) 2721 continue; 2722 AssertReleaseRCReturn(rc, rc); 2723 } 2724 rc = PDMCritSectEnter(&pThis->CritSect, VERR_SEM_BUSY); 2725 if (RT_SUCCESS(rc)) 2726 { 2727 if (pThread->enmState == PDMTHREADSTATE_RUNNING) 2728 { 2729 int rc2 = pcnetAsyncTransmit(pThis, true /*fOnWorkerThread*/); 2730 AssertReleaseRC(rc2); 2731 } 2732 2733 PDMCritSectLeave(&pThis->CritSect); 2734 } 2735 if (pDrv) 2736 pDrv->pfnEndXmit(pDrv); 2737 AssertReleaseRCReturn(rc, rc); 2738 } 2740 rc = pcnetXmitPending(pThis, true /*fOnWorkerThread*/); 2741 AssertMsg(rc == VINF_SUCCESS || rc == VERR_TRY_AGAIN, ("%Rrc\n", rc)); 2742 } 2739 2743 2740 2744 /* The thread is being suspended or terminated. */ … … 4635 4639 } 4636 4640 4637 /** Converts a pointer to PCNetState::INetworkDown to a PCNetState pointer. */4638 #define INETWORKPORT_2_DATA(pInterface) ( (PCNetState *)((uintptr_t)pInterface - RT_OFFSETOF(PCNetState, INetworkDown)) )4639 4641 4640 4642 … … 4674 4676 4675 4677 /** 4676 * 4677 */ 4678 static DECLCALLBACK(int) pcnet WaitReceiveAvail(PPDMINETWORKDOWN pInterface, RTMSINTERVAL cMillies)4679 { 4680 PCNetState *pThis = INETWORKPORT_2_DATA(pInterface);4678 * @interface_method_impl{PDMINETWORKDOWN,pfnWaitReceiveAvail} 4679 */ 4680 static DECLCALLBACK(int) pcnetNetworkDown_WaitReceiveAvail(PPDMINETWORKDOWN pInterface, RTMSINTERVAL cMillies) 4681 { 4682 PCNetState *pThis = RT_FROM_MEMBER(pInterface, PCNetState, INetworkDown); 4681 4683 4682 4684 int rc = pcnetCanReceive(pThis); … … 4699 4701 break; 4700 4702 } 4701 LogFlow(("pcnet WaitReceiveAvail: waiting cMillies=%u...\n", cMillies));4703 LogFlow(("pcnetNetworkDown_WaitReceiveAvail: waiting cMillies=%u...\n", cMillies)); 4702 4704 /* Start the poll timer once which will remain active as long fMaybeOutOfSpace 4703 4705 * is true -- even if (transmit) polling is disabled (CSR_DPOLL). */ … … 4716 4718 4717 4719 /** 4718 * Receive data from the network. 4719 * 4720 * @returns VBox status code. 4721 * @param pInterface Pointer to the interface structure containing the called function pointer. 4722 * @param pvBuf The available data. 4723 * @param cb Number of bytes available in the buffer. 4724 * @thread EMT 4725 */ 4726 static DECLCALLBACK(int) pcnetReceive(PPDMINETWORKDOWN pInterface, const void *pvBuf, size_t cb) 4727 { 4728 PCNetState *pThis = INETWORKPORT_2_DATA(pInterface); 4720 * @interface_method_impl{PDMINETWORKDOWN,pfnReceive} 4721 */ 4722 static DECLCALLBACK(int) pcnetNetworkDown_Receive(PPDMINETWORKDOWN pInterface, const void *pvBuf, size_t cb) 4723 { 4724 PCNetState *pThis = RT_FROM_MEMBER(pInterface, PCNetState, INetworkDown); 4729 4725 int rc; 4730 4726 … … 4771 4767 } 4772 4768 4773 /** Converts a pointer to PCNetState::INetworkConfig to a PCNetState pointer. */ 4774 #define INETWORKCONFIG_2_DATA(pInterface) ( (PCNetState *)((uintptr_t)pInterface - RT_OFFSETOF(PCNetState, INetworkConfig)) ) 4769 4770 /** 4771 * @interface_method_impl{PDMINETWORKDOWN,pfnXmitPending} 4772 */ 4773 static DECLCALLBACK(void) pcnetNetworkDown_XmitPending(PPDMINETWORKDOWN pInterface) 4774 { 4775 PCNetState *pThis = RT_FROM_MEMBER(pInterface, PCNetState, INetworkDown); 4776 pcnetXmitPending(pThis, true /*fOnWorkerThread*/); 4777 } 4778 4775 4779 4776 4780 … … 4785 4789 static DECLCALLBACK(int) pcnetGetMac(PPDMINETWORKCONFIG pInterface, PRTMAC pMac) 4786 4790 { 4787 PCNetState *pThis = INETWORKCONFIG_2_DATA(pInterface);4791 PCNetState *pThis = RT_FROM_MEMBER(pInterface, PCNetState, INetworkConfig); 4788 4792 memcpy(pMac, pThis->aPROM, sizeof(*pMac)); 4789 4793 return VINF_SUCCESS; … … 4800 4804 static DECLCALLBACK(PDMNETWORKLINKSTATE) pcnetGetLinkState(PPDMINETWORKCONFIG pInterface) 4801 4805 { 4802 PCNetState *pThis = INETWORKCONFIG_2_DATA(pInterface);4806 PCNetState *pThis = RT_FROM_MEMBER(pInterface, PCNetState, INetworkConfig); 4803 4807 if (pThis->fLinkUp && !pThis->fLinkTempDown) 4804 4808 return PDMNETWORKLINKSTATE_UP; … … 4822 4826 static DECLCALLBACK(int) pcnetSetLinkState(PPDMINETWORKCONFIG pInterface, PDMNETWORKLINKSTATE enmState) 4823 4827 { 4824 PCNetState *pThis = INETWORKCONFIG_2_DATA(pInterface);4828 PCNetState *pThis = RT_FROM_MEMBER(pInterface, PCNetState, INetworkConfig); 4825 4829 bool fLinkUp; 4826 4830 if ( enmState != PDMNETWORKLINKSTATE_DOWN … … 5151 5155 pThis->IBase.pfnQueryInterface = pcnetQueryInterface; 5152 5156 /* INeworkPort */ 5153 pThis->INetworkDown.pfnWaitReceiveAvail = pcnetWaitReceiveAvail; 5154 pThis->INetworkDown.pfnReceive = pcnetReceive; 5157 pThis->INetworkDown.pfnWaitReceiveAvail = pcnetNetworkDown_WaitReceiveAvail; 5158 pThis->INetworkDown.pfnReceive = pcnetNetworkDown_Receive; 5159 pThis->INetworkDown.pfnXmitPending = pcnetNetworkDown_XmitPending; 5155 5160 /* INetworkConfig */ 5156 5161 pThis->INetworkConfig.pfnGetMac = pcnetGetMac; -
trunk/src/VBox/Devices/Network/DevVirtioNet.cpp
r28275 r28277 5 5 6 6 /* 7 * Copyright (C) 2009 Sun Microsystems, Inc.7 * Copyright (C) 2009-2010 Sun Microsystems, Inc. 8 8 * 9 9 * This file is part of VirtualBox Open Source Edition (OSE), as … … 38 38 39 39 #define INSTANCE(pState) pState->VPCI.szInstance 40 #define IFACE_TO_STATE(pIface, ifaceName) \41 ((VNETSTATE *)((char*)pIface - RT_OFFSETOF(VNETSTATE, ifaceName)))42 40 #define STATUS pState->config.uStatus 43 41 … … 543 541 } 544 542 545 static DECLCALLBACK(int) vnetWaitReceiveAvail(PPDMINETWORKDOWN pInterface, RTMSINTERVAL cMillies) 546 { 547 VNETSTATE *pState = IFACE_TO_STATE(pInterface, INetworkDown); 548 LogFlow(("%s vnetWaitReceiveAvail(cMillies=%u)\n", INSTANCE(pState), cMillies)); 543 /** 544 * @interface_method_impl{PDMINETWORKDOWN,pfnWaitReceiveAvail} 545 */ 546 static DECLCALLBACK(int) vnetNetworkDown_WaitReceiveAvail(PPDMINETWORKDOWN pInterface, RTMSINTERVAL cMillies) 547 { 548 VNETSTATE *pState = RT_FROM_MEMBER(pInterface, VNETSTATE, INetworkDown); 549 LogFlow(("%s vnetNetworkDown_WaitReceiveAvail(cMillies=%u)\n", INSTANCE(pState), cMillies)); 549 550 int rc = vnetCanReceive(pState); 550 551 … … 568 569 break; 569 570 } 570 Log(("%s vnet WaitReceiveAvail: waiting cMillies=%u...\n",571 Log(("%s vnetNetworkDown_WaitReceiveAvail: waiting cMillies=%u...\n", 571 572 INSTANCE(pState), cMillies)); 572 573 RTSemEventWait(pState->hEventMoreRxDescAvail, cMillies); … … 575 576 ASMAtomicXchgBool(&pState->fMaybeOutOfSpace, false); 576 577 577 LogFlow(("%s vnet WaitReceiveAvail -> %d\n", INSTANCE(pState), rc));578 LogFlow(("%s vnetNetworkDown_WaitReceiveAvail -> %d\n", INSTANCE(pState), rc)); 578 579 return rc; 579 580 } … … 585 586 static DECLCALLBACK(void *) vnetQueryInterface(struct PDMIBASE *pInterface, const char *pszIID) 586 587 { 587 VNETSTATE *pThis = IFACE_TO_STATE(pInterface, VPCI.IBase);588 VNETSTATE *pThis = RT_FROM_MEMBER(pInterface, VNETSTATE, VPCI.IBase); 588 589 Assert(&pThis->VPCI.IBase == pInterface); 589 590 … … 722 723 723 724 /** 724 * Receive data from the network. 725 * 726 * @returns VBox status code. 727 * @param pInterface Pointer to the interface structure containing the called function pointer. 728 * @param pvBuf The available data. 729 * @param cb Number of bytes available in the buffer. 730 * @thread RX 731 */ 732 static DECLCALLBACK(int) vnetReceive(PPDMINETWORKDOWN pInterface, const void *pvBuf, size_t cb) 733 { 734 VNETSTATE *pState = IFACE_TO_STATE(pInterface, INetworkDown); 735 736 Log2(("%s vnetReceive: pvBuf=%p cb=%u\n", INSTANCE(pState), pvBuf, cb)); 725 * @interface_method_impl{PDMINETWORKDOWN,pfnReceive} 726 */ 727 static DECLCALLBACK(int) vnetNetworkDown_Receive(PPDMINETWORKDOWN pInterface, const void *pvBuf, size_t cb) 728 { 729 VNETSTATE *pState = RT_FROM_MEMBER(pInterface, VNETSTATE, INetworkDown); 730 731 Log2(("%s vnetNetworkDown_Receive: pvBuf=%p cb=%u\n", INSTANCE(pState), pvBuf, cb)); 737 732 int rc = vnetCanReceive(pState); 738 733 if (RT_FAILURE(rc)) … … 773 768 static DECLCALLBACK(int) vnetGetMac(PPDMINETWORKCONFIG pInterface, PRTMAC pMac) 774 769 { 775 VNETSTATE *pState = IFACE_TO_STATE(pInterface, INetworkConfig);770 VNETSTATE *pState = RT_FROM_MEMBER(pInterface, VNETSTATE, INetworkConfig); 776 771 memcpy(pMac, pState->config.mac.au8, sizeof(RTMAC)); 777 772 return VINF_SUCCESS; … … 787 782 static DECLCALLBACK(PDMNETWORKLINKSTATE) vnetGetLinkState(PPDMINETWORKCONFIG pInterface) 788 783 { 789 VNETSTATE *pState = IFACE_TO_STATE(pInterface, INetworkConfig);784 VNETSTATE *pState = RT_FROM_MEMBER(pInterface, VNETSTATE, INetworkConfig); 790 785 if (STATUS & VNET_S_LINK_UP) 791 786 return PDMNETWORKLINKSTATE_UP; … … 803 798 static DECLCALLBACK(int) vnetSetLinkState(PPDMINETWORKCONFIG pInterface, PDMNETWORKLINKSTATE enmState) 804 799 { 805 VNETSTATE *pState = IFACE_TO_STATE(pInterface, INetworkConfig);800 VNETSTATE *pState = RT_FROM_MEMBER(pInterface, VNETSTATE, INetworkConfig); 806 801 bool fOldUp = !!(STATUS & VNET_S_LINK_UP); 807 802 bool fNewUp = enmState == PDMNETWORKLINKSTATE_UP; … … 834 829 } 835 830 836 static DECLCALLBACK(void)vnetTransmitPendingPackets(PVNETSTATE pState, PVQUEUE pQueue, bool fOnWorkerThread)831 static void vnetTransmitPendingPackets(PVNETSTATE pState, PVQUEUE pQueue, bool fOnWorkerThread) 837 832 { 838 833 /* … … 926 921 } 927 922 923 /** 924 * @interface_method_impl{PDMINETWORKDOWN,pfnXmitPending} 925 */ 926 static DECLCALLBACK(void) vnetNetworkDown_XmitPending(PPDMINETWORKDOWN pInterface) 927 { 928 VNETSTATE *pThis = RT_FROM_MEMBER(pInterface, VNETSTATE, INetworkDown); 929 vnetTransmitPendingPackets(pThis, pThis->pTxQueue, false /*fOnWorkerThread*/); 930 } 931 928 932 #ifdef VNET_TX_DELAY 933 929 934 static DECLCALLBACK(void) vnetQueueTransmit(void *pvState, PVQUEUE pQueue) 930 935 { … … 995 1000 996 1001 #else /* !VNET_TX_DELAY */ 1002 997 1003 static DECLCALLBACK(void) vnetQueueTransmit(void *pvState, PVQUEUE pQueue) 998 1004 { … … 1001 1007 vnetTransmitPendingPackets(pState, pQueue, false /*fOnWorkerThread*/); 1002 1008 } 1009 1003 1010 #endif /* !VNET_TX_DELAY */ 1004 1011 … … 1307 1314 } 1308 1315 1309 /* Takes down the link temporarily if it's current status is up. 1316 /** 1317 * Takes down the link temporarily if it's current status is up. 1310 1318 * 1311 1319 * This is used during restore and when replumbing the network link. … … 1693 1701 1694 1702 /* Interfaces */ 1695 pState->INetworkDown.pfnWaitReceiveAvail = vnetWaitReceiveAvail; 1696 pState->INetworkDown.pfnReceive = vnetReceive; 1703 pState->INetworkDown.pfnWaitReceiveAvail = vnetNetworkDown_WaitReceiveAvail; 1704 pState->INetworkDown.pfnReceive = vnetNetworkDown_Receive; 1705 pState->INetworkDown.pfnXmitPending = vnetNetworkDown_XmitPending; 1706 1697 1707 pState->INetworkConfig.pfnGetMac = vnetGetMac; 1698 1708 pState->INetworkConfig.pfnGetLinkState = vnetGetLinkState; -
trunk/src/VBox/Devices/Network/DrvNetSniffer.cpp
r28275 r28277 229 229 230 230 /** 231 * @interface_method_impl{PDMINETWORKDOWN,pfn DoTransmitWork}232 */ 233 static DECLCALLBACK(void) drvNetSnifferDown_ DoTransmitWork(PPDMINETWORKDOWN pInterface)231 * @interface_method_impl{PDMINETWORKDOWN,pfnXmitPending} 232 */ 233 static DECLCALLBACK(void) drvNetSnifferDown_XmitPending(PPDMINETWORKDOWN pInterface) 234 234 { 235 235 PDRVNETSNIFFER pThis = RT_FROM_MEMBER(pInterface, DRVNETSNIFFER, INetworkDown); 236 pThis->pIAboveNet->pfn DoTransmitWork(pThis->pIAboveNet);236 pThis->pIAboveNet->pfnXmitPending(pThis->pIAboveNet); 237 237 } 238 238 … … 400 400 pThis->INetworkDown.pfnWaitReceiveAvail = drvNetSnifferDown_WaitReceiveAvail; 401 401 pThis->INetworkDown.pfnReceive = drvNetSnifferDown_Receive; 402 pThis->INetworkDown.pfn DoTransmitWork = drvNetSnifferDown_DoTransmitWork;402 pThis->INetworkDown.pfnXmitPending = drvNetSnifferDown_XmitPending; 403 403 /* INetworkConfig */ 404 404 pThis->INetworkConfig.pfnGetMac = drvNetSnifferDownCfg_GetMac;
Note:
See TracChangeset
for help on using the changeset viewer.