/** * @copydoc INTNETTRUNKIFPORT::pfnXmit */ static DECLCALLBACK(int) vboxNetAdpPortXmit(PINTNETTRUNKIFPORT pIfPort, PINTNETSG pSG, uint32_t fDst) { PVBOXNETADP pThis = IFPORT_2_VBOXNETADP(pIfPort); int rc = VINF_SUCCESS; /* * Input validation. */ AssertPtr(pThis); AssertPtr(pSG); Assert(pThis->MyPort.u32Version == INTNETTRUNKIFPORT_VERSION); Log(("vboxNetAdpPortXmit: outgoing packet (len=%d)\n", pSG->cbTotal)); /* * Do a retain/busy, invoke the OS specific code. */ RTSpinlockAcquire(pThis->hSpinlock); if (vboxNetAdpGetState(pThis) != kVBoxNetAdpState_Active) { RTSpinlockRelease(pThis->hSpinlock); Log(("vboxNetAdpReceive: Dropping incoming packet for inactive interface %s.\n", pThis->szName)); return VERR_INVALID_STATE; } vboxNetAdpRetain(pThis); vboxNetAdpBusy(pThis); RTSpinlockRelease(pThis->hSpinlock); rc = vboxNetAdpPortOsXmit(pThis, pSG, fDst); vboxNetAdpIdle(pThis); vboxNetAdpRelease(pThis); return rc; }
/** * Forwards scatter/gather list to internal network and decreases busy and ref counters. * * @param pThis The instance. */ DECLHIDDEN(void) vboxNetAdpReceive(PVBOXNETADP pThis, PINTNETSG pSG) { /* * Input validation. */ AssertPtr(pThis); AssertPtr(pSG); AssertPtr(pThis->pSwitchPort); Assert(pThis->MyPort.u32Version == INTNETTRUNKIFPORT_VERSION); Log(("vboxNetAdpReceive: forwarding packet to internal net...\n")); pThis->pSwitchPort->pfnRecv(pThis->pSwitchPort, pSG, INTNETTRUNKDIR_HOST); vboxNetAdpIdle(pThis); vboxNetAdpRelease(pThis); }
/** * Decreases busy and ref counters. * * @param pThis The instance. */ DECLHIDDEN(void) vboxNetAdpCancelReceive(PVBOXNETADP pThis) { Log(("vboxNetAdpCancelReceive: cancelled.\n")); vboxNetAdpIdle(pThis); vboxNetAdpRelease(pThis); }