08266121784fb8ee9e77961250d150471c6b6640vboxsync/* $Id$ */
08266121784fb8ee9e77961250d150471c6b6640vboxsync/** @file
08266121784fb8ee9e77961250d150471c6b6640vboxsync * DrvDedicatedNic - Experimental network driver for using a dedicated (V)NIC.
08266121784fb8ee9e77961250d150471c6b6640vboxsync */
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync/*
c7814cf6e1240a519cbec0441e033d0e2470ed00vboxsync * Copyright (C) 2010-2012 Oracle Corporation
08266121784fb8ee9e77961250d150471c6b6640vboxsync *
08266121784fb8ee9e77961250d150471c6b6640vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
08266121784fb8ee9e77961250d150471c6b6640vboxsync * available from http://www.virtualbox.org. This file is free software;
08266121784fb8ee9e77961250d150471c6b6640vboxsync * you can redistribute it and/or modify it under the terms of the GNU
08266121784fb8ee9e77961250d150471c6b6640vboxsync * General Public License (GPL) as published by the Free Software
08266121784fb8ee9e77961250d150471c6b6640vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
08266121784fb8ee9e77961250d150471c6b6640vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
08266121784fb8ee9e77961250d150471c6b6640vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
08266121784fb8ee9e77961250d150471c6b6640vboxsync */
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync/*******************************************************************************
08266121784fb8ee9e77961250d150471c6b6640vboxsync* Header Files *
08266121784fb8ee9e77961250d150471c6b6640vboxsync*******************************************************************************/
08266121784fb8ee9e77961250d150471c6b6640vboxsync#define LOG_GROUP LOG_GROUP_DEFAULT
08266121784fb8ee9e77961250d150471c6b6640vboxsync#include <VBox/log.h>
43747b1f0bc8302a238fb35e55857a5e9aa1933dvboxsync#include <VBox/vmm/pdmcritsect.h>
43747b1f0bc8302a238fb35e55857a5e9aa1933dvboxsync#include <VBox/vmm/pdmdrv.h>
43747b1f0bc8302a238fb35e55857a5e9aa1933dvboxsync#include <VBox/vmm/pdmnetifs.h>
43747b1f0bc8302a238fb35e55857a5e9aa1933dvboxsync#include <VBox/vmm/pdmnetinline.h>
08266121784fb8ee9e77961250d150471c6b6640vboxsync#include <VBox/intnet.h>
08266121784fb8ee9e77961250d150471c6b6640vboxsync#include <VBox/intnetinline.h>
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync#include <iprt/asm.h>
08266121784fb8ee9e77961250d150471c6b6640vboxsync#include <iprt/assert.h>
08266121784fb8ee9e77961250d150471c6b6640vboxsync#include <iprt/mem.h>
08266121784fb8ee9e77961250d150471c6b6640vboxsync#include <iprt/path.h>
08266121784fb8ee9e77961250d150471c6b6640vboxsync#include <iprt/string.h>
08266121784fb8ee9e77961250d150471c6b6640vboxsync#include <iprt/thread.h>
08266121784fb8ee9e77961250d150471c6b6640vboxsync#include <iprt/uuid.h>
08266121784fb8ee9e77961250d150471c6b6640vboxsync
f5e53763b0a581b0299e98028c6c52192eb06785vboxsync#include "VBoxDD.h"
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync/*******************************************************************************
08266121784fb8ee9e77961250d150471c6b6640vboxsync* Structures and Typedefs *
08266121784fb8ee9e77961250d150471c6b6640vboxsync*******************************************************************************/
08266121784fb8ee9e77961250d150471c6b6640vboxsync/**
08266121784fb8ee9e77961250d150471c6b6640vboxsync * Instance data for the dedicated (V)NIC driver.
08266121784fb8ee9e77961250d150471c6b6640vboxsync *
08266121784fb8ee9e77961250d150471c6b6640vboxsync * @implements PDMINETWORKUP
08266121784fb8ee9e77961250d150471c6b6640vboxsync */
08266121784fb8ee9e77961250d150471c6b6640vboxsynctypedef struct DRVDEDICATEDNIC
08266121784fb8ee9e77961250d150471c6b6640vboxsync{
08266121784fb8ee9e77961250d150471c6b6640vboxsync /** The network interface. */
08266121784fb8ee9e77961250d150471c6b6640vboxsync PDMINETWORKUP INetworkUpR3;
08266121784fb8ee9e77961250d150471c6b6640vboxsync /** The network interface. */
08266121784fb8ee9e77961250d150471c6b6640vboxsync R3PTRTYPE(PPDMINETWORKDOWN) pIAboveNet;
08266121784fb8ee9e77961250d150471c6b6640vboxsync /** The network config interface.
08266121784fb8ee9e77961250d150471c6b6640vboxsync * Can (in theory at least) be NULL. */
08266121784fb8ee9e77961250d150471c6b6640vboxsync R3PTRTYPE(PPDMINETWORKCONFIG) pIAboveConfigR3;
08266121784fb8ee9e77961250d150471c6b6640vboxsync /** Pointer to the driver instance. */
08266121784fb8ee9e77961250d150471c6b6640vboxsync PPDMDRVINSR3 pDrvInsR3;
08266121784fb8ee9e77961250d150471c6b6640vboxsync /** Ring-3 base interface for the ring-0 context. */
08266121784fb8ee9e77961250d150471c6b6640vboxsync PDMIBASER0 IBaseR0;
08266121784fb8ee9e77961250d150471c6b6640vboxsync /** Ring-3 base interface for the raw-mode context. */
08266121784fb8ee9e77961250d150471c6b6640vboxsync PDMIBASERC IBaseRC;
08266121784fb8ee9e77961250d150471c6b6640vboxsync RTR3PTR R3PtrAlignment;
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync /** The network interface for the ring-0 context. */
08266121784fb8ee9e77961250d150471c6b6640vboxsync PDMINETWORKUPR0 INetworkUpR0;
08266121784fb8ee9e77961250d150471c6b6640vboxsync /** Pointer to the driver instance. */
08266121784fb8ee9e77961250d150471c6b6640vboxsync PPDMDRVINSR0 pDrvInsR0;
08266121784fb8ee9e77961250d150471c6b6640vboxsync RTR0PTR R0PtrAlignment;
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync /** The interface we're talking to. */
08266121784fb8ee9e77961250d150471c6b6640vboxsync R0PTRTYPE(PINTNETTRUNKIFPORT) pIfPortR0;
08266121784fb8ee9e77961250d150471c6b6640vboxsync /** Set if the link is up, clear if its down. */
08266121784fb8ee9e77961250d150471c6b6640vboxsync bool fLinkDown;
08266121784fb8ee9e77961250d150471c6b6640vboxsync /** Set if the current transmit operation is done the XMIT thread. If clear,
08266121784fb8ee9e77961250d150471c6b6640vboxsync * we assume its an EMT. */
08266121784fb8ee9e77961250d150471c6b6640vboxsync bool fXmitOnXmitThread;
08266121784fb8ee9e77961250d150471c6b6640vboxsync /** The name of the interface that we're connected to. */
08266121784fb8ee9e77961250d150471c6b6640vboxsync char szIfName[128 + 8 - 2];
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync /** Critical section serializing transmission. */
08266121784fb8ee9e77961250d150471c6b6640vboxsync PDMCRITSECT XmitLock;
08266121784fb8ee9e77961250d150471c6b6640vboxsync /** The transmit scatter gather buffer (ring-3 -> ring-0). */
08266121784fb8ee9e77961250d150471c6b6640vboxsync PDMSCATTERGATHER XmitSg;
08266121784fb8ee9e77961250d150471c6b6640vboxsync /** The transmit GSO context (when applicable). */
08266121784fb8ee9e77961250d150471c6b6640vboxsync PDMNETWORKGSO XmitGso;
08266121784fb8ee9e77961250d150471c6b6640vboxsync /** The transmit buffer (ring-3 -> ring-0). */
08266121784fb8ee9e77961250d150471c6b6640vboxsync uint8_t abXmitBuf[_64K];
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync /** The receive scatter gather buffer. */
08266121784fb8ee9e77961250d150471c6b6640vboxsync PDMSCATTERGATHER RecvSg;
08266121784fb8ee9e77961250d150471c6b6640vboxsync /** The receive buffer (ring-0 -> ring-3). */
08266121784fb8ee9e77961250d150471c6b6640vboxsync uint8_t abRecvBuf[_64K];
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync} DRVDEDICATEDNIC;
08266121784fb8ee9e77961250d150471c6b6640vboxsync/** Pointer to the instance data for the dedicated (V)NIC driver. */
08266121784fb8ee9e77961250d150471c6b6640vboxsynctypedef DRVDEDICATEDNIC *PDRVDEDICATEDNIC;
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync/**
08266121784fb8ee9e77961250d150471c6b6640vboxsync * Ring-0 operations.
08266121784fb8ee9e77961250d150471c6b6640vboxsync */
08266121784fb8ee9e77961250d150471c6b6640vboxsynctypedef enum DRVDEDICATEDNICR0OP
08266121784fb8ee9e77961250d150471c6b6640vboxsync{
08266121784fb8ee9e77961250d150471c6b6640vboxsync /** Invalid zero value.. */
08266121784fb8ee9e77961250d150471c6b6640vboxsync DRVDEDICATEDNICR0OP_INVALID = 0,
08266121784fb8ee9e77961250d150471c6b6640vboxsync /** Initialize the connection to the NIC. */
08266121784fb8ee9e77961250d150471c6b6640vboxsync DRVDEDICATEDNICR0OP_INIT,
08266121784fb8ee9e77961250d150471c6b6640vboxsync /** Terminate the connection to the NIC. */
08266121784fb8ee9e77961250d150471c6b6640vboxsync DRVDEDICATEDNICR0OP_TERM,
08266121784fb8ee9e77961250d150471c6b6640vboxsync /** Suspend the operation. */
08266121784fb8ee9e77961250d150471c6b6640vboxsync DRVDEDICATEDNICR0OP_SUSPEND,
08266121784fb8ee9e77961250d150471c6b6640vboxsync /** Resume the operation. */
08266121784fb8ee9e77961250d150471c6b6640vboxsync DRVDEDICATEDNICR0OP_RESUME,
08266121784fb8ee9e77961250d150471c6b6640vboxsync /** Wait for and do receive work.
08266121784fb8ee9e77961250d150471c6b6640vboxsync * We do this in ring-0 instead of ring-3 to save 1-2 buffer copies and
08266121784fb8ee9e77961250d150471c6b6640vboxsync * unnecessary context switching. */
08266121784fb8ee9e77961250d150471c6b6640vboxsync DRVDEDICATEDNICR0OP_RECV,
08266121784fb8ee9e77961250d150471c6b6640vboxsync /** Wait for and do transmit work.
08266121784fb8ee9e77961250d150471c6b6640vboxsync * We do this in ring-0 instead of ring-3 to save 1-2 buffer copies and
08266121784fb8ee9e77961250d150471c6b6640vboxsync * unnecessary context switching. */
08266121784fb8ee9e77961250d150471c6b6640vboxsync DRVDEDICATEDNICR0OP_SEND,
08266121784fb8ee9e77961250d150471c6b6640vboxsync /** Changes the promiscuousness of the interface (guest point of view). */
08266121784fb8ee9e77961250d150471c6b6640vboxsync DRVDEDICATEDNICR0OP_PROMISC,
08266121784fb8ee9e77961250d150471c6b6640vboxsync /** End of the valid operations. */
08266121784fb8ee9e77961250d150471c6b6640vboxsync DRVDEDICATEDNICR0OP_END,
08266121784fb8ee9e77961250d150471c6b6640vboxsync /** The usual 32-bit hack. */
08266121784fb8ee9e77961250d150471c6b6640vboxsync DRVDEDICATEDNICR0OP_32BIT_HACK = 0x7fffffff
08266121784fb8ee9e77961250d150471c6b6640vboxsync} DRVDEDICATEDNICR0OP;
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync#ifdef IN_RING0
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync/**
08266121784fb8ee9e77961250d150471c6b6640vboxsync * @interface_method_impl{FNPDMDRVREQHANDLERR0}
08266121784fb8ee9e77961250d150471c6b6640vboxsync */
08266121784fb8ee9e77961250d150471c6b6640vboxsyncPDMBOTHCBDECL(int) drvR0DedicatedNicReqHandler(PPDMDRVINS pDrvIns, uint32_t uOperation, uint64_t u64Arg)
08266121784fb8ee9e77961250d150471c6b6640vboxsync{
08266121784fb8ee9e77961250d150471c6b6640vboxsync switch ((DRVDEDICATEDNICR0OP)uOperation)
08266121784fb8ee9e77961250d150471c6b6640vboxsync {
08266121784fb8ee9e77961250d150471c6b6640vboxsync case DRVDEDICATEDNICR0OP_INIT:
08266121784fb8ee9e77961250d150471c6b6640vboxsync return VERR_NOT_IMPLEMENTED;//drvR0DedicatedNicReqInit(pDrvIns, u64Arg);
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync case DRVDEDICATEDNICR0OP_TERM:
08266121784fb8ee9e77961250d150471c6b6640vboxsync return VERR_NOT_IMPLEMENTED;//drvR0DedicatedNicReqTerm(pDrvIns);
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync case DRVDEDICATEDNICR0OP_SUSPEND:
08266121784fb8ee9e77961250d150471c6b6640vboxsync return VERR_NOT_IMPLEMENTED;//drvR0DedicatedNicReqSuspend(pDrvIns);
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync case DRVDEDICATEDNICR0OP_RESUME:
08266121784fb8ee9e77961250d150471c6b6640vboxsync return VERR_NOT_IMPLEMENTED;//drvR0DedicatedNicReqResume(pDrvIns);
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync case DRVDEDICATEDNICR0OP_RECV:
08266121784fb8ee9e77961250d150471c6b6640vboxsync return VERR_NOT_IMPLEMENTED;//drvR0DedicatedNicReqRecv(pDrvIns);
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync case DRVDEDICATEDNICR0OP_SEND:
08266121784fb8ee9e77961250d150471c6b6640vboxsync return VERR_NOT_IMPLEMENTED;//drvR0DedicatedNicReqSend(pDrvIns);
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync case DRVDEDICATEDNICR0OP_PROMISC:
08266121784fb8ee9e77961250d150471c6b6640vboxsync return VERR_NOT_IMPLEMENTED;//drvR0DedicatedNicReqPromisc(pDrvIns, !!u64Arg);
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync case DRVDEDICATEDNICR0OP_END:
08266121784fb8ee9e77961250d150471c6b6640vboxsync default:
08266121784fb8ee9e77961250d150471c6b6640vboxsync return VERR_INVALID_FUNCTION;
08266121784fb8ee9e77961250d150471c6b6640vboxsync }
08266121784fb8ee9e77961250d150471c6b6640vboxsync return VINF_SUCCESS;
08266121784fb8ee9e77961250d150471c6b6640vboxsync}
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync#endif /* IN_RING0 */
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync/* -=-=-=-=- PDMINETWORKUP -=-=-=-=- */
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync/**
08266121784fb8ee9e77961250d150471c6b6640vboxsync * @interface_method_impl{PDMINETWORKUP,pfnBeginXmit}
08266121784fb8ee9e77961250d150471c6b6640vboxsync */
08266121784fb8ee9e77961250d150471c6b6640vboxsyncPDMBOTHCBDECL(int) drvDedicatedNicUp_BeginXmit(PPDMINETWORKUP pInterface, bool fOnWorkerThread)
08266121784fb8ee9e77961250d150471c6b6640vboxsync{
08266121784fb8ee9e77961250d150471c6b6640vboxsync PDRVDEDICATEDNIC pThis = RT_FROM_MEMBER(pInterface, DRVDEDICATEDNIC, CTX_SUFF(INetworkUp));
08266121784fb8ee9e77961250d150471c6b6640vboxsync int rc = PDMCritSectTryEnter(&pThis->XmitLock);
08266121784fb8ee9e77961250d150471c6b6640vboxsync if (RT_SUCCESS(rc))
08266121784fb8ee9e77961250d150471c6b6640vboxsync ASMAtomicUoWriteBool(&pThis->fXmitOnXmitThread, fOnWorkerThread);
08266121784fb8ee9e77961250d150471c6b6640vboxsync return rc;
08266121784fb8ee9e77961250d150471c6b6640vboxsync}
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync/**
08266121784fb8ee9e77961250d150471c6b6640vboxsync * @interface_method_impl{PDMINETWORKUP,pfnAllocBuf}
08266121784fb8ee9e77961250d150471c6b6640vboxsync */
08266121784fb8ee9e77961250d150471c6b6640vboxsyncPDMBOTHCBDECL(int) drvDedicatedNicUp_AllocBuf(PPDMINETWORKUP pInterface, size_t cbMin,
08266121784fb8ee9e77961250d150471c6b6640vboxsync PCPDMNETWORKGSO pGso, PPPDMSCATTERGATHER ppSgBuf)
08266121784fb8ee9e77961250d150471c6b6640vboxsync{
08266121784fb8ee9e77961250d150471c6b6640vboxsync PDRVDEDICATEDNIC pThis = RT_FROM_MEMBER(pInterface, DRVDEDICATEDNIC, CTX_SUFF(INetworkUp));
08266121784fb8ee9e77961250d150471c6b6640vboxsync Assert(PDMCritSectIsOwner(&pThis->XmitLock));
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync /*
08266121784fb8ee9e77961250d150471c6b6640vboxsync * If the net is down, we can return immediately.
08266121784fb8ee9e77961250d150471c6b6640vboxsync */
08266121784fb8ee9e77961250d150471c6b6640vboxsync if (pThis->fLinkDown)
08266121784fb8ee9e77961250d150471c6b6640vboxsync return VERR_NET_DOWN;
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync#ifdef IN_RING0
08266121784fb8ee9e77961250d150471c6b6640vboxsync /** @todo Ask the driver for a buffer, atomically if we're called on EMT. */
08266121784fb8ee9e77961250d150471c6b6640vboxsync return VERR_TRY_AGAIN;
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync#else /* IN_RING3 */
08266121784fb8ee9e77961250d150471c6b6640vboxsync /*
08266121784fb8ee9e77961250d150471c6b6640vboxsync * Are we busy or is the request too big?
08266121784fb8ee9e77961250d150471c6b6640vboxsync */
17d9ea41c65a6814691cea6800877f268b7618b9vboxsync if (RT_UNLIKELY((pThis->XmitSg.fFlags & PDMSCATTERGATHER_FLAGS_MAGIC_MASK) == PDMSCATTERGATHER_FLAGS_MAGIC))
08266121784fb8ee9e77961250d150471c6b6640vboxsync return VERR_TRY_AGAIN;
08266121784fb8ee9e77961250d150471c6b6640vboxsync if (cbMin > sizeof(pThis->abXmitBuf))
08266121784fb8ee9e77961250d150471c6b6640vboxsync return VERR_NO_MEMORY;
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync /*
08266121784fb8ee9e77961250d150471c6b6640vboxsync * Initialize the S/G buffer and return.
08266121784fb8ee9e77961250d150471c6b6640vboxsync */
08266121784fb8ee9e77961250d150471c6b6640vboxsync pThis->XmitSg.fFlags = PDMSCATTERGATHER_FLAGS_MAGIC | PDMSCATTERGATHER_FLAGS_OWNER_1;
08266121784fb8ee9e77961250d150471c6b6640vboxsync pThis->XmitSg.cbUsed = 0;
08266121784fb8ee9e77961250d150471c6b6640vboxsync pThis->XmitSg.cbAvailable = sizeof(pThis->abXmitBuf);
08266121784fb8ee9e77961250d150471c6b6640vboxsync pThis->XmitSg.pvAllocator = NULL;
08266121784fb8ee9e77961250d150471c6b6640vboxsync if (!pGso)
08266121784fb8ee9e77961250d150471c6b6640vboxsync {
08266121784fb8ee9e77961250d150471c6b6640vboxsync pThis->XmitSg.pvUser = NULL;
08266121784fb8ee9e77961250d150471c6b6640vboxsync pThis->XmitGso.u8Type = PDMNETWORKGSOTYPE_INVALID;
08266121784fb8ee9e77961250d150471c6b6640vboxsync }
08266121784fb8ee9e77961250d150471c6b6640vboxsync else
08266121784fb8ee9e77961250d150471c6b6640vboxsync {
08266121784fb8ee9e77961250d150471c6b6640vboxsync pThis->XmitSg.pvUser = &pThis->XmitGso;
08266121784fb8ee9e77961250d150471c6b6640vboxsync pThis->XmitGso = *pGso;
08266121784fb8ee9e77961250d150471c6b6640vboxsync }
08266121784fb8ee9e77961250d150471c6b6640vboxsync pThis->XmitSg.cSegs = 1;
08266121784fb8ee9e77961250d150471c6b6640vboxsync pThis->XmitSg.aSegs[0].cbSeg = pThis->XmitSg.cbAvailable;
08266121784fb8ee9e77961250d150471c6b6640vboxsync pThis->XmitSg.aSegs[0].pvSeg = &pThis->abXmitBuf[0];
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync# if 0 /* poison */
08266121784fb8ee9e77961250d150471c6b6640vboxsync memset(pThis->XmitSg.aSegs[0].pvSeg, 'F', pThis->XmitSg.aSegs[0].cbSeg);
08266121784fb8ee9e77961250d150471c6b6640vboxsync# endif
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync *ppSgBuf = &pThis->XmitSg;
08266121784fb8ee9e77961250d150471c6b6640vboxsync return VINF_SUCCESS;
08266121784fb8ee9e77961250d150471c6b6640vboxsync#endif /* IN_RING3 */
08266121784fb8ee9e77961250d150471c6b6640vboxsync}
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync/**
08266121784fb8ee9e77961250d150471c6b6640vboxsync * @interface_method_impl{PDMINETWORKUP,pfnFreeBuf}
08266121784fb8ee9e77961250d150471c6b6640vboxsync */
08266121784fb8ee9e77961250d150471c6b6640vboxsyncPDMBOTHCBDECL(int) drvDedicatedNicUp_FreeBuf(PPDMINETWORKUP pInterface, PPDMSCATTERGATHER pSgBuf)
08266121784fb8ee9e77961250d150471c6b6640vboxsync{
08266121784fb8ee9e77961250d150471c6b6640vboxsync PDRVDEDICATEDNIC pThis = RT_FROM_MEMBER(pInterface, DRVDEDICATEDNIC, CTX_SUFF(INetworkUp));
08266121784fb8ee9e77961250d150471c6b6640vboxsync Assert(pSgBuf->fFlags == (PDMSCATTERGATHER_FLAGS_MAGIC | PDMSCATTERGATHER_FLAGS_OWNER_1));
08266121784fb8ee9e77961250d150471c6b6640vboxsync Assert(pSgBuf->cbUsed <= pSgBuf->cbAvailable);
08266121784fb8ee9e77961250d150471c6b6640vboxsync Assert(PDMCritSectIsOwner(&pThis->XmitLock));
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync if (pSgBuf)
08266121784fb8ee9e77961250d150471c6b6640vboxsync {
08266121784fb8ee9e77961250d150471c6b6640vboxsync#ifdef IN_RING0
08266121784fb8ee9e77961250d150471c6b6640vboxsync // ...
08266121784fb8ee9e77961250d150471c6b6640vboxsync#else
08266121784fb8ee9e77961250d150471c6b6640vboxsync Assert(pSgBuf == &pThis->XmitSg);
08266121784fb8ee9e77961250d150471c6b6640vboxsync Assert((pSgBuf->fFlags & PDMSCATTERGATHER_FLAGS_MAGIC_MASK) == PDMSCATTERGATHER_FLAGS_MAGIC);
08266121784fb8ee9e77961250d150471c6b6640vboxsync pSgBuf->fFlags = 0;
08266121784fb8ee9e77961250d150471c6b6640vboxsync#endif
08266121784fb8ee9e77961250d150471c6b6640vboxsync }
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync return VINF_SUCCESS;
08266121784fb8ee9e77961250d150471c6b6640vboxsync}
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync/**
08266121784fb8ee9e77961250d150471c6b6640vboxsync * @interface_method_impl{PDMINETWORKUP,pfnSendBuf}
08266121784fb8ee9e77961250d150471c6b6640vboxsync */
08266121784fb8ee9e77961250d150471c6b6640vboxsyncPDMBOTHCBDECL(int) drvDedicatedNicUp_SendBuf(PPDMINETWORKUP pInterface, PPDMSCATTERGATHER pSgBuf, bool fOnWorkerThread)
08266121784fb8ee9e77961250d150471c6b6640vboxsync{
08266121784fb8ee9e77961250d150471c6b6640vboxsync PDRVDEDICATEDNIC pThis = RT_FROM_MEMBER(pInterface, DRVDEDICATEDNIC, CTX_SUFF(INetworkUp));
08266121784fb8ee9e77961250d150471c6b6640vboxsync STAM_PROFILE_START(&pThis->StatTransmit, a);
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync AssertPtr(pSgBuf);
08266121784fb8ee9e77961250d150471c6b6640vboxsync Assert(pSgBuf->fFlags == (PDMSCATTERGATHER_FLAGS_MAGIC | PDMSCATTERGATHER_FLAGS_OWNER_1));
08266121784fb8ee9e77961250d150471c6b6640vboxsync Assert(pSgBuf->cbUsed <= pSgBuf->cbAvailable);
08266121784fb8ee9e77961250d150471c6b6640vboxsync#ifdef IN_RING0
08266121784fb8ee9e77961250d150471c6b6640vboxsync Assert(pSgBuf == &pThis->XmitSg);
08266121784fb8ee9e77961250d150471c6b6640vboxsync#endif
08266121784fb8ee9e77961250d150471c6b6640vboxsync Assert(PDMCritSectIsOwner(&pThis->XmitLock));
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync#ifdef IN_RING0
08266121784fb8ee9e77961250d150471c6b6640vboxsync /*
08266121784fb8ee9e77961250d150471c6b6640vboxsync * Tell the driver to send the packet.
08266121784fb8ee9e77961250d150471c6b6640vboxsync */
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync return VERR_INTERNAL_ERROR_4;
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync#else /* IN_RING3 */
08266121784fb8ee9e77961250d150471c6b6640vboxsync /*
08266121784fb8ee9e77961250d150471c6b6640vboxsync * Call ring-0 to start the transfer.
08266121784fb8ee9e77961250d150471c6b6640vboxsync */
08266121784fb8ee9e77961250d150471c6b6640vboxsync int rc = PDMDrvHlpCallR0(pThis->pDrvInsR3, DRVDEDICATEDNICR0OP_SEND, pSgBuf->cbUsed);
08266121784fb8ee9e77961250d150471c6b6640vboxsync if (RT_FAILURE(rc) && rc != VERR_NET_DOWN)
08266121784fb8ee9e77961250d150471c6b6640vboxsync rc = VERR_NET_NO_BUFFER_SPACE;
08266121784fb8ee9e77961250d150471c6b6640vboxsync pSgBuf->fFlags = 0;
08266121784fb8ee9e77961250d150471c6b6640vboxsync return rc;
08266121784fb8ee9e77961250d150471c6b6640vboxsync#endif /* IN_RING3 */
08266121784fb8ee9e77961250d150471c6b6640vboxsync}
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync/**
08266121784fb8ee9e77961250d150471c6b6640vboxsync * @interface_method_impl{PDMINETWORKUP,pfnEndXmit}
08266121784fb8ee9e77961250d150471c6b6640vboxsync */
08266121784fb8ee9e77961250d150471c6b6640vboxsyncPDMBOTHCBDECL(void) drvDedicatedNicUp_EndXmit(PPDMINETWORKUP pInterface)
08266121784fb8ee9e77961250d150471c6b6640vboxsync{
08266121784fb8ee9e77961250d150471c6b6640vboxsync PDRVDEDICATEDNIC pThis = RT_FROM_MEMBER(pInterface, DRVDEDICATEDNIC, CTX_SUFF(INetworkUp));
08266121784fb8ee9e77961250d150471c6b6640vboxsync ASMAtomicUoWriteBool(&pThis->fXmitOnXmitThread, false);
08266121784fb8ee9e77961250d150471c6b6640vboxsync PDMCritSectLeave(&pThis->XmitLock);
08266121784fb8ee9e77961250d150471c6b6640vboxsync}
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync/**
08266121784fb8ee9e77961250d150471c6b6640vboxsync * @interface_method_impl{PDMINETWORKUP,pfnSetPromiscuousMode}
08266121784fb8ee9e77961250d150471c6b6640vboxsync */
08266121784fb8ee9e77961250d150471c6b6640vboxsyncPDMBOTHCBDECL(void) drvDedicatedNicUp_SetPromiscuousMode(PPDMINETWORKUP pInterface, bool fPromiscuous)
08266121784fb8ee9e77961250d150471c6b6640vboxsync{
08266121784fb8ee9e77961250d150471c6b6640vboxsync PDRVDEDICATEDNIC pThis = RT_FROM_MEMBER(pInterface, DRVDEDICATEDNIC, CTX_SUFF(INetworkUp));
08266121784fb8ee9e77961250d150471c6b6640vboxsync /** @todo enable/disable promiscuous mode (should be easy) */
2be9d7aaf29390865922e4200cd20e2fb6063f6bvboxsync NOREF(pThis);
08266121784fb8ee9e77961250d150471c6b6640vboxsync}
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync#ifdef IN_RING3
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync/**
08266121784fb8ee9e77961250d150471c6b6640vboxsync * @interface_method_impl{PDMINETWORKUP,pfnNotifyLinkChanged}
08266121784fb8ee9e77961250d150471c6b6640vboxsync */
08266121784fb8ee9e77961250d150471c6b6640vboxsyncstatic DECLCALLBACK(void) drvR3DedicatedNicUp_NotifyLinkChanged(PPDMINETWORKUP pInterface, PDMNETWORKLINKSTATE enmLinkState)
08266121784fb8ee9e77961250d150471c6b6640vboxsync{
08266121784fb8ee9e77961250d150471c6b6640vboxsync PDRVDEDICATEDNIC pThis = RT_FROM_MEMBER(pInterface, DRVDEDICATEDNIC, CTX_SUFF(INetworkUp));
08266121784fb8ee9e77961250d150471c6b6640vboxsync bool fLinkDown;
08266121784fb8ee9e77961250d150471c6b6640vboxsync switch (enmLinkState)
08266121784fb8ee9e77961250d150471c6b6640vboxsync {
08266121784fb8ee9e77961250d150471c6b6640vboxsync case PDMNETWORKLINKSTATE_DOWN:
08266121784fb8ee9e77961250d150471c6b6640vboxsync case PDMNETWORKLINKSTATE_DOWN_RESUME:
08266121784fb8ee9e77961250d150471c6b6640vboxsync fLinkDown = true;
08266121784fb8ee9e77961250d150471c6b6640vboxsync break;
08266121784fb8ee9e77961250d150471c6b6640vboxsync default:
08266121784fb8ee9e77961250d150471c6b6640vboxsync AssertMsgFailed(("enmLinkState=%d\n", enmLinkState));
08266121784fb8ee9e77961250d150471c6b6640vboxsync case PDMNETWORKLINKSTATE_UP:
08266121784fb8ee9e77961250d150471c6b6640vboxsync fLinkDown = false;
08266121784fb8ee9e77961250d150471c6b6640vboxsync break;
08266121784fb8ee9e77961250d150471c6b6640vboxsync }
08266121784fb8ee9e77961250d150471c6b6640vboxsync LogFlow(("drvR3DedicatedNicUp_NotifyLinkChanged: enmLinkState=%d %d->%d\n", enmLinkState, pThis->fLinkDown, fLinkDown));
08266121784fb8ee9e77961250d150471c6b6640vboxsync ASMAtomicWriteBool(&pThis->fLinkDown, fLinkDown);
08266121784fb8ee9e77961250d150471c6b6640vboxsync}
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync/* -=-=-=-=- PDMIBASER0 -=-=-=-=- */
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync/**
08266121784fb8ee9e77961250d150471c6b6640vboxsync * @interface_method_impl{PDMIBASER0,pfnQueryInterface}
08266121784fb8ee9e77961250d150471c6b6640vboxsync */
08266121784fb8ee9e77961250d150471c6b6640vboxsyncstatic DECLCALLBACK(RTR0PTR) drvR3DedicatedNicIBaseR0_QueryInterface(PPDMIBASER0 pInterface, const char *pszIID)
08266121784fb8ee9e77961250d150471c6b6640vboxsync{
08266121784fb8ee9e77961250d150471c6b6640vboxsync PDRVDEDICATEDNIC pThis = RT_FROM_MEMBER(pInterface, DRVDEDICATEDNIC, IBaseR0);
08266121784fb8ee9e77961250d150471c6b6640vboxsync PDMIBASER0_RETURN_INTERFACE(pThis->pDrvInsR3, pszIID, PDMINETWORKUP, &pThis->INetworkUpR0);
08266121784fb8ee9e77961250d150471c6b6640vboxsync return NIL_RTR0PTR;
08266121784fb8ee9e77961250d150471c6b6640vboxsync}
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync/* -=-=-=-=- PDMIBASE -=-=-=-=- */
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync/**
08266121784fb8ee9e77961250d150471c6b6640vboxsync * @interface_method_impl{PDMIBASE,pfnQueryInterface}
08266121784fb8ee9e77961250d150471c6b6640vboxsync */
08266121784fb8ee9e77961250d150471c6b6640vboxsyncstatic DECLCALLBACK(void *) drvR3DedicatedNicIBase_QueryInterface(PPDMIBASE pInterface, const char *pszIID)
08266121784fb8ee9e77961250d150471c6b6640vboxsync{
08266121784fb8ee9e77961250d150471c6b6640vboxsync PPDMDRVINS pDrvIns = PDMIBASE_2_PDMDRV(pInterface);
08266121784fb8ee9e77961250d150471c6b6640vboxsync PDRVDEDICATEDNIC pThis = PDMINS_2_DATA(pDrvIns, PDRVDEDICATEDNIC);
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync PDMIBASE_RETURN_INTERFACE(pszIID, PDMIBASE, &pDrvIns->IBase);
08266121784fb8ee9e77961250d150471c6b6640vboxsync PDMIBASE_RETURN_INTERFACE(pszIID, PDMIBASER0, &pThis->IBaseR0);
08266121784fb8ee9e77961250d150471c6b6640vboxsync PDMIBASE_RETURN_INTERFACE(pszIID, PDMINETWORKUP, &pThis->INetworkUpR3);
08266121784fb8ee9e77961250d150471c6b6640vboxsync return NULL;
08266121784fb8ee9e77961250d150471c6b6640vboxsync}
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync/* -=-=-=-=- PDMDRVREG -=-=-=-=- */
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync/**
08266121784fb8ee9e77961250d150471c6b6640vboxsync * @interface_method_impl{PDMDRVREG,pfnPowerOff}
08266121784fb8ee9e77961250d150471c6b6640vboxsync */
08266121784fb8ee9e77961250d150471c6b6640vboxsyncstatic DECLCALLBACK(void) drvR3DedicatedNicPowerOff(PPDMDRVINS pDrvIns)
08266121784fb8ee9e77961250d150471c6b6640vboxsync{
08266121784fb8ee9e77961250d150471c6b6640vboxsync LogFlow(("drvR3DedicatedNicPowerOff\n"));
08266121784fb8ee9e77961250d150471c6b6640vboxsync PDRVDEDICATEDNIC pThis = PDMINS_2_DATA(pDrvIns, PDRVDEDICATEDNIC);
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync int rc = PDMDrvHlpCallR0(pDrvIns, DRVDEDICATEDNICR0OP_SUSPEND, 0);
08266121784fb8ee9e77961250d150471c6b6640vboxsync AssertRC(rc);
08266121784fb8ee9e77961250d150471c6b6640vboxsync}
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync/**
08266121784fb8ee9e77961250d150471c6b6640vboxsync * @interface_method_impl{PDMDRVREG,pfnResume}
08266121784fb8ee9e77961250d150471c6b6640vboxsync */
08266121784fb8ee9e77961250d150471c6b6640vboxsyncstatic DECLCALLBACK(void) drvR3DedicatedNicResume(PPDMDRVINS pDrvIns)
08266121784fb8ee9e77961250d150471c6b6640vboxsync{
08266121784fb8ee9e77961250d150471c6b6640vboxsync LogFlow(("drvR3DedicatedNicPowerResume\n"));
08266121784fb8ee9e77961250d150471c6b6640vboxsync PDRVDEDICATEDNIC pThis = PDMINS_2_DATA(pDrvIns, PDRVDEDICATEDNIC);
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync int rc = PDMDrvHlpCallR0(pDrvIns, DRVDEDICATEDNICR0OP_RESUME, 0);
08266121784fb8ee9e77961250d150471c6b6640vboxsync AssertRC(rc);
08266121784fb8ee9e77961250d150471c6b6640vboxsync}
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync/**
08266121784fb8ee9e77961250d150471c6b6640vboxsync * @interface_method_impl{PDMDRVREG,pfnSuspend}
08266121784fb8ee9e77961250d150471c6b6640vboxsync */
08266121784fb8ee9e77961250d150471c6b6640vboxsyncstatic DECLCALLBACK(void) drvR3DedicatedNicSuspend(PPDMDRVINS pDrvIns)
08266121784fb8ee9e77961250d150471c6b6640vboxsync{
08266121784fb8ee9e77961250d150471c6b6640vboxsync LogFlow(("drvR3DedicatedNicPowerSuspend\n"));
08266121784fb8ee9e77961250d150471c6b6640vboxsync PDRVDEDICATEDNIC pThis = PDMINS_2_DATA(pDrvIns, PDRVDEDICATEDNIC);
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync int rc = PDMDrvHlpCallR0(pDrvIns, DRVDEDICATEDNICR0OP_SUSPEND, 0);
08266121784fb8ee9e77961250d150471c6b6640vboxsync AssertRC(rc);
08266121784fb8ee9e77961250d150471c6b6640vboxsync}
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync/**
08266121784fb8ee9e77961250d150471c6b6640vboxsync * @interface_method_impl{PDMDRVREG,pfnPowerOn}
08266121784fb8ee9e77961250d150471c6b6640vboxsync */
08266121784fb8ee9e77961250d150471c6b6640vboxsyncstatic DECLCALLBACK(void) drvR3DedicatedNicPowerOn(PPDMDRVINS pDrvIns)
08266121784fb8ee9e77961250d150471c6b6640vboxsync{
08266121784fb8ee9e77961250d150471c6b6640vboxsync LogFlow(("drvR3DedicatedNicPowerOn\n"));
08266121784fb8ee9e77961250d150471c6b6640vboxsync PDRVDEDICATEDNIC pThis = PDMINS_2_DATA(pDrvIns, PDRVDEDICATEDNIC);
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync int rc = PDMDrvHlpCallR0(pDrvIns, DRVDEDICATEDNICR0OP_RESUME, 0);
08266121784fb8ee9e77961250d150471c6b6640vboxsync AssertRC(rc);
08266121784fb8ee9e77961250d150471c6b6640vboxsync}
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync/**
08266121784fb8ee9e77961250d150471c6b6640vboxsync * @interface_method_impl{PDMDRVREG,pfnDestruct}
08266121784fb8ee9e77961250d150471c6b6640vboxsync */
08266121784fb8ee9e77961250d150471c6b6640vboxsyncstatic DECLCALLBACK(void) drvR3DedicatedNicDestruct(PPDMDRVINS pDrvIns)
08266121784fb8ee9e77961250d150471c6b6640vboxsync{
08266121784fb8ee9e77961250d150471c6b6640vboxsync LogFlow(("drvR3DedicatedNicDestruct\n"));
08266121784fb8ee9e77961250d150471c6b6640vboxsync PDRVDEDICATEDNIC pThis = PDMINS_2_DATA(pDrvIns, PDRVDEDICATEDNIC);
08266121784fb8ee9e77961250d150471c6b6640vboxsync PDMDRV_CHECK_VERSIONS_RETURN_VOID(pDrvIns);
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync if (pThis->pIfPortR0)
08266121784fb8ee9e77961250d150471c6b6640vboxsync {
08266121784fb8ee9e77961250d150471c6b6640vboxsync int rc = PDMDrvHlpCallR0(pDrvIns, DRVDEDICATEDNICR0OP_TERM, 0);
08266121784fb8ee9e77961250d150471c6b6640vboxsync AssertRC(rc);;
08266121784fb8ee9e77961250d150471c6b6640vboxsync }
08266121784fb8ee9e77961250d150471c6b6640vboxsync}
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync/**
08266121784fb8ee9e77961250d150471c6b6640vboxsync * @interface_method_impl{PDMDRVREG,pfnConstruct}
08266121784fb8ee9e77961250d150471c6b6640vboxsync */
08266121784fb8ee9e77961250d150471c6b6640vboxsyncstatic DECLCALLBACK(int) drvR3DedicatedNicConstruct(PPDMDRVINS pDrvIns, PCFGMNODE pCfg, uint32_t fFlags)
08266121784fb8ee9e77961250d150471c6b6640vboxsync{
08266121784fb8ee9e77961250d150471c6b6640vboxsync PDRVDEDICATEDNIC pThis = PDMINS_2_DATA(pDrvIns, PDRVDEDICATEDNIC);
08266121784fb8ee9e77961250d150471c6b6640vboxsync bool f;
08266121784fb8ee9e77961250d150471c6b6640vboxsync PDMDRV_CHECK_VERSIONS_RETURN(pDrvIns);
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync /*
08266121784fb8ee9e77961250d150471c6b6640vboxsync * Init the static parts.
08266121784fb8ee9e77961250d150471c6b6640vboxsync */
08266121784fb8ee9e77961250d150471c6b6640vboxsync pThis->pDrvInsR3 = pDrvIns;
08266121784fb8ee9e77961250d150471c6b6640vboxsync pThis->pDrvInsR0 = PDMDRVINS_2_R0PTR(pDrvIns);
08266121784fb8ee9e77961250d150471c6b6640vboxsync#if 0
08266121784fb8ee9e77961250d150471c6b6640vboxsync pThis->hRecvThread = NIL_RTTHREAD;
08266121784fb8ee9e77961250d150471c6b6640vboxsync pThis->hRecvEvt = NIL_RTSEMEVENT;
08266121784fb8ee9e77961250d150471c6b6640vboxsync pThis->pXmitThread = NULL;
08266121784fb8ee9e77961250d150471c6b6640vboxsync pThis->hXmitEvt = NIL_SUPSEMEVENT;
08266121784fb8ee9e77961250d150471c6b6640vboxsync pThis->pSupDrvSession = PDMDrvHlpGetSupDrvSession(pDrvIns);
08266121784fb8ee9e77961250d150471c6b6640vboxsync pThis->hSgCache = NIL_RTMEMCACHE;
08266121784fb8ee9e77961250d150471c6b6640vboxsync pThis->enmRecvState = RECVSTATE_SUSPENDED;
08266121784fb8ee9e77961250d150471c6b6640vboxsync pThis->fActivateEarlyDeactivateLate = false;
08266121784fb8ee9e77961250d150471c6b6640vboxsync /* IBase* */
08266121784fb8ee9e77961250d150471c6b6640vboxsync pDrvIns->IBase.pfnQueryInterface = drvR3DedicatedNicIBase_QueryInterface;
08266121784fb8ee9e77961250d150471c6b6640vboxsync pThis->IBaseR0.pfnQueryInterface = drvR3DedicatedNicIBaseR0_QueryInterface;
08266121784fb8ee9e77961250d150471c6b6640vboxsync pThis->IBaseRC.pfnQueryInterface = drvR3DedicatedNicIBaseRC_QueryInterface;
08266121784fb8ee9e77961250d150471c6b6640vboxsync /* INetworkUp */
08266121784fb8ee9e77961250d150471c6b6640vboxsync pThis->INetworkUpR3.pfnBeginXmit = drvDedicatedNic_BeginXmit;
08266121784fb8ee9e77961250d150471c6b6640vboxsync pThis->INetworkUpR3.pfnAllocBuf = drvDedicatedNic_AllocBuf;
08266121784fb8ee9e77961250d150471c6b6640vboxsync pThis->INetworkUpR3.pfnFreeBuf = drvDedicatedNic_FreeBuf;
08266121784fb8ee9e77961250d150471c6b6640vboxsync pThis->INetworkUpR3.pfnSendBuf = drvDedicatedNic_SendBuf;
08266121784fb8ee9e77961250d150471c6b6640vboxsync pThis->INetworkUpR3.pfnEndXmit = drvDedicatedNic_EndXmit;
08266121784fb8ee9e77961250d150471c6b6640vboxsync pThis->INetworkUpR3.pfnSetPromiscuousMode = drvDedicatedNic_SetPromiscuousMode;
08266121784fb8ee9e77961250d150471c6b6640vboxsync pThis->INetworkUpR3.pfnNotifyLinkChanged = drvR3DedicatedNicUp_NotifyLinkChanged;
08266121784fb8ee9e77961250d150471c6b6640vboxsync#endif
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync /** @todo
08266121784fb8ee9e77961250d150471c6b6640vboxsync * Need to create a generic way of calling into the ring-0 side of the driver so
08266121784fb8ee9e77961250d150471c6b6640vboxsync * we can initialize the thing as well as send and receive. Hmm ... the
08266121784fb8ee9e77961250d150471c6b6640vboxsync * sending could be done more efficiently from a ring-0 kernel thread actually
08266121784fb8ee9e77961250d150471c6b6640vboxsync * (saves context switching and 1-2 copy operations). Ditto for receive, except
08266121784fb8ee9e77961250d150471c6b6640vboxsync * we need to tie the thread to the process or we cannot access the guest ram so
08266121784fb8ee9e77961250d150471c6b6640vboxsync * easily.
08266121784fb8ee9e77961250d150471c6b6640vboxsync */
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync return VERR_NOT_IMPLEMENTED;
08266121784fb8ee9e77961250d150471c6b6640vboxsync}
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync/**
08266121784fb8ee9e77961250d150471c6b6640vboxsync * Internal networking transport driver registration record.
08266121784fb8ee9e77961250d150471c6b6640vboxsync */
08266121784fb8ee9e77961250d150471c6b6640vboxsyncconst PDMDRVREG g_DrvDedicatedNic =
08266121784fb8ee9e77961250d150471c6b6640vboxsync{
08266121784fb8ee9e77961250d150471c6b6640vboxsync /* u32Version */
08266121784fb8ee9e77961250d150471c6b6640vboxsync PDM_DRVREG_VERSION,
08266121784fb8ee9e77961250d150471c6b6640vboxsync /* szName */
08266121784fb8ee9e77961250d150471c6b6640vboxsync "DedicatedNic",
08266121784fb8ee9e77961250d150471c6b6640vboxsync /* szRCMod */
08266121784fb8ee9e77961250d150471c6b6640vboxsync "",
08266121784fb8ee9e77961250d150471c6b6640vboxsync /* szR0Mod */
08266121784fb8ee9e77961250d150471c6b6640vboxsync "VBoxDDR0.r0",
08266121784fb8ee9e77961250d150471c6b6640vboxsync /* pszDescription */
08266121784fb8ee9e77961250d150471c6b6640vboxsync "Dedicated (V)NIC Driver",
08266121784fb8ee9e77961250d150471c6b6640vboxsync /* fFlags */
08266121784fb8ee9e77961250d150471c6b6640vboxsync PDM_DRVREG_FLAGS_HOST_BITS_DEFAULT | PDM_DRVREG_FLAGS_R0,
08266121784fb8ee9e77961250d150471c6b6640vboxsync /* fClass. */
08266121784fb8ee9e77961250d150471c6b6640vboxsync PDM_DRVREG_CLASS_NETWORK,
08266121784fb8ee9e77961250d150471c6b6640vboxsync /* cMaxInstances */
ad48e47654d22f79b025dc4b21cb162cb123801avboxsync ~0U,
08266121784fb8ee9e77961250d150471c6b6640vboxsync /* cbInstance */
08266121784fb8ee9e77961250d150471c6b6640vboxsync sizeof(DRVDEDICATEDNIC),
08266121784fb8ee9e77961250d150471c6b6640vboxsync /* pfnConstruct */
08266121784fb8ee9e77961250d150471c6b6640vboxsync drvR3DedicatedNicConstruct,
08266121784fb8ee9e77961250d150471c6b6640vboxsync /* pfnDestruct */
08266121784fb8ee9e77961250d150471c6b6640vboxsync drvR3DedicatedNicDestruct,
08266121784fb8ee9e77961250d150471c6b6640vboxsync /* pfnRelocate */
08266121784fb8ee9e77961250d150471c6b6640vboxsync NULL,
08266121784fb8ee9e77961250d150471c6b6640vboxsync /* pfnIOCtl */
08266121784fb8ee9e77961250d150471c6b6640vboxsync NULL,
08266121784fb8ee9e77961250d150471c6b6640vboxsync /* pfnPowerOn */
08266121784fb8ee9e77961250d150471c6b6640vboxsync drvR3DedicatedNicPowerOn,
08266121784fb8ee9e77961250d150471c6b6640vboxsync /* pfnReset */
08266121784fb8ee9e77961250d150471c6b6640vboxsync NULL,
08266121784fb8ee9e77961250d150471c6b6640vboxsync /* pfnSuspend */
08266121784fb8ee9e77961250d150471c6b6640vboxsync drvR3DedicatedNicSuspend,
08266121784fb8ee9e77961250d150471c6b6640vboxsync /* pfnResume */
08266121784fb8ee9e77961250d150471c6b6640vboxsync drvR3DedicatedNicResume,
08266121784fb8ee9e77961250d150471c6b6640vboxsync /* pfnAttach */
08266121784fb8ee9e77961250d150471c6b6640vboxsync NULL,
08266121784fb8ee9e77961250d150471c6b6640vboxsync /* pfnDetach */
08266121784fb8ee9e77961250d150471c6b6640vboxsync NULL,
08266121784fb8ee9e77961250d150471c6b6640vboxsync /* pfnPowerOff */
08266121784fb8ee9e77961250d150471c6b6640vboxsync drvR3DedicatedNicPowerOff,
08266121784fb8ee9e77961250d150471c6b6640vboxsync /* pfnSoftReset */
08266121784fb8ee9e77961250d150471c6b6640vboxsync NULL,
08266121784fb8ee9e77961250d150471c6b6640vboxsync /* u32EndVersion */
08266121784fb8ee9e77961250d150471c6b6640vboxsync PDM_DRVREG_VERSION
08266121784fb8ee9e77961250d150471c6b6640vboxsync};
08266121784fb8ee9e77961250d150471c6b6640vboxsync
08266121784fb8ee9e77961250d150471c6b6640vboxsync#endif /* IN_RING3 */
08266121784fb8ee9e77961250d150471c6b6640vboxsync