VBoxNetFlt-solaris.c revision 7ef9513278f58c6406f4320cb98a78bf3cd662eb
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * VBoxNetFlt - Network Filter Driver (Host), Solaris Specific Code.
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * Copyright (C) 2008 Sun Microsystems, Inc.
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * available from http://www.virtualbox.org. This file is free software;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * you can redistribute it and/or modify it under the terms of the GNU
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * General Public License (GPL) as published by the Free Software
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * Clara, CA 95054 USA or visit http://www.sun.com if you need
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * additional information or have any questions.
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync/*******************************************************************************
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync* Header Files *
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync*******************************************************************************/
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync#if defined(DEBUG_ramshankar) && !defined(LOG_ENABLED)
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * Experimental: Using netinfo interfaces and queuing out packets.
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * This is for playing better with IPFilter.
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync// Workaround for very strange define in sys/user.h
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync// #define u (curproc->p_user) /* user is now part of proc structure */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync/*******************************************************************************
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync* Defined Constants And Macros *
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync*******************************************************************************/
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync/** The module name. */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync/** The module descriptions as seen in 'modinfo'. */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync/** @todo Remove the below hackery once done! */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync#if defined(DEBUG_ramshankar) && defined(LOG_ENABLED)
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync/** Maximum loopback packet queue size per interface */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync/*******************************************************************************
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync* Global Functions *
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync*******************************************************************************/
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * Stream Driver hooks.
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncstatic int VBoxNetFltSolarisGetInfo(dev_info_t *pDip, ddi_info_cmd_t enmCmd, void *pArg, void **ppResult);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncstatic int VBoxNetFltSolarisAttach(dev_info_t *pDip, ddi_attach_cmd_t enmCmd);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncstatic int VBoxNetFltSolarisDetach(dev_info_t *pDip, ddi_detach_cmd_t enmCmd);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * Stream Module hooks.
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncstatic int VBoxNetFltSolarisModOpen(queue_t *pQueue, dev_t *pDev, int fFile, int fStream, cred_t *pCred);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncstatic int VBoxNetFltSolarisModClose(queue_t *pQueue, int fFile, cred_t *pCred);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncstatic int VBoxNetFltSolarisModReadPut(queue_t *pQueue, mblk_t *pMsg);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncstatic int VBoxNetFltSolarisModWritePut(queue_t *pQueue, mblk_t *pMsg);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * OS specific hooks invoked from common VBoxNetFlt ring-0.
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync/** @todo r=bird: What are these doing here? */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncbool vboxNetFltPortOsIsPromiscuous(PVBOXNETFLTINS pThis);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncvoid vboxNetFltPortOsGetMacAddress(PVBOXNETFLTINS pThis, PRTMAC pMac);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncbool vboxNetFltPortOsIsHostMac(PVBOXNETFLTINS pThis, PCRTMAC pMac);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncvoid vboxNetFltPortOsSetActive(PVBOXNETFLTINS pThis, bool fActive);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncvoid vboxNetFltOsDeleteInstance(PVBOXNETFLTINS pThis);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncint vboxNetFltOsInitInstance(PVBOXNETFLTINS pThis, void *pvContext);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncint vboxNetFltOsPreInitInstance(PVBOXNETFLTINS pThis);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync/*******************************************************************************
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync* Structures and Typedefs *
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync*******************************************************************************/
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * Streams: module info.
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncstatic struct module_info g_VBoxNetFltSolarisModInfo =
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync 0, /* min. packet size */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync 0, /* hi-water mark */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync 0 /* lo-water mark */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * Streams: read queue hooks.
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * Streams: write queue hooks.
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * Streams: IO stream tab.
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncstatic struct streamtab g_VBoxNetFltSolarisStreamTab =
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * cb_ops: driver char/block entry points
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * dev_ops: driver entry/exit and other ops.
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync 0, /* ref count */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync (struct bus_ops *)0,
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * modldrv: export driver specifics to kernel
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync DEVICE_DESC_DRV " " VBOX_VERSION_STRING "r" VBOXSOLQUOTE(VBOX_SVN_REV),
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * fmodsw: streams module ops
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * modlstrmod: streams module specifics to kernel
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncstatic struct modlstrmod g_VBoxNetFltSolarisModule =
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync DEVICE_DESC_MOD " " VBOX_VERSION_STRING "r" VBOXSOLQUOTE(VBOX_SVN_REV),
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * modlinkage: export install/remove/info to the kernel
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncstatic struct modlinkage g_VBoxNetFltSolarisModLinkage =
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync &g_VBoxNetFltSolarisDriver, /* streams driver framework */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync &g_VBoxNetFltSolarisModule, /* streams module framework */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * vboxnetflt_dladdr_t: DL SAP address format
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync#define VBOXNETFLT_DLADDRL sizeof(vboxnetflt_dladdr_t)
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * which stream is this?
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * loopback packet identifier
1b33c96954667ba382fa595baf7b31290bfdd517vboxsynctypedef struct VBOXNETFLTPACKETID *PVBOXNETFLTPACKETID;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * vboxnetflt_stream_t: per-stream data (multiple streams per interface)
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync struct vboxnetflt_stream_t *pNext; /* next stream in list */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync PVBOXNETFLTINS volatile pThis; /* the backend instance */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync VBOXNETFLTSTREAMTYPE Type; /* the type of the stream */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * vboxnetflt_promisc_stream_t: per-interface dedicated stream data
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync vboxnetflt_stream_t Stream; /* The generic stream */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync bool fRawMode; /* whether raw mode request was successful */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync uint32_t ModeReqId; /* track MIOCTLs for swallowing our fake request acknowledgements */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync PVBOXNETFLTPACKETID pHead; /* loopback packet identifier head */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync PVBOXNETFLTPACKETID pTail; /* loopback packet identifier tail */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync/*******************************************************************************
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync* Internal Functions *
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync*******************************************************************************/
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncstatic int vboxNetFltSolarisSetRawMode(vboxnetflt_promisc_stream_t *pPromiscStream);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync/* static int vboxNetFltSolarisSetFastMode(queue_t *pQueue); */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncstatic int vboxNetFltSolarisPhysAddrReq(queue_t *pQueue);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncstatic void vboxNetFltSolarisCachePhysAddr(PVBOXNETFLTINS pThis, mblk_t *pPhysAddrAckMsg);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncstatic int vboxNetFltSolarisBindReq(queue_t *pQueue, int SAP);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncstatic int vboxNetFltSolarisNotifyReq(queue_t *pQueue);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncstatic int vboxNetFltSolarisUnitDataToRaw(PVBOXNETFLTINS pThis, mblk_t *pMsg, mblk_t **ppRawMsg);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncstatic int vboxNetFltSolarisRawToUnitData(mblk_t *pMsg, mblk_t **ppDlpiMsg);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncstatic inline void vboxNetFltSolarisInitPacketId(PVBOXNETFLTPACKETID pTag, mblk_t *pMsg);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncstatic int vboxNetFltSolarisQueueLoopback(PVBOXNETFLTINS pThis, vboxnetflt_promisc_stream_t *pPromiscStream, mblk_t *pMsg);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncstatic bool vboxNetFltSolarisIsOurMBlk(PVBOXNETFLTINS pThis, vboxnetflt_promisc_stream_t *pPromiscStream, mblk_t *pMsg);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncstatic mblk_t *vboxNetFltSolarisMBlkFromSG(PVBOXNETFLTINS pThis, PINTNETSG pSG, uint32_t fDst);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncstatic unsigned vboxNetFltSolarisMBlkCalcSGSegs(PVBOXNETFLTINS pThis, mblk_t *pMsg);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncstatic int vboxNetFltSolarisMBlkToSG(PVBOXNETFLTINS pThis, mblk_t *pMsg, PINTNETSG pSG, unsigned cSegs, uint32_t fSrc);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncstatic int vboxNetFltSolarisRecv(PVBOXNETFLTINS pThis, vboxnetflt_stream_t *pStream, queue_t *pQueue, mblk_t *pMsg);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncstatic mblk_t *vboxNetFltSolarisFixChecksums(mblk_t *pMsg);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncstatic void vboxNetFltSolarisAnalyzeMBlk(mblk_t *pMsg);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync/*******************************************************************************
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync* Global Variables *
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync*******************************************************************************/
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync/** Global device info handle. */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync/** The (common) global data. */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncstatic VBOXNETFLTGLOBALS g_VBoxNetFltSolarisGlobals;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync/** The list of all opened streams. */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync/** Global mutex protecting open/close. */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncstatic RTSEMFASTMUTEX g_VBoxNetFltSolarisMtx = NIL_RTSEMFASTMUTEX;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * g_VBoxNetFltInstance is the current PVBOXNETFLTINS to be associated with the stream being created
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * in ModOpen. This is just shared global data between the dynamic attach and the ModOpen procedure.
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncPVBOXNETFLTINS volatile g_VBoxNetFltSolarisInstance;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync/** Goes along with the instance to determine type of stream being opened/created. */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncVBOXNETFLTSTREAMTYPE volatile g_VBoxNetFltSolarisStreamType;
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * Kernel entry points
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * Prevent module autounloading.
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync modctl_t *pModCtl = mod_getctl(&g_VBoxNetFltSolarisModLinkage);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync LogRel((DEVICE_NAME ":failed to disable autounloading!\n"));
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * Initialize IPRT.
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * Initialize Solaris specific globals here.
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync int rc = RTSemFastMutexCreate(&g_VBoxNetFltSolarisMtx);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * Initialize the globals and connect to the support driver.
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * This will call back vboxNetFltOsOpenSupDrv (and maybe vboxNetFltOsCloseSupDrv)
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * for establishing the connect to the support driver.
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync memset(&g_VBoxNetFltSolarisGlobals, 0, sizeof(g_VBoxNetFltSolarisGlobals));
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync rc = vboxNetFltInitGlobalsAndIdc(&g_VBoxNetFltSolarisGlobals);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync LogRel((DEVICE_NAME ":mod_install failed. rc=%d\n", rc));
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync vboxNetFltTryDeleteIdcAndGlobals(&g_VBoxNetFltSolarisGlobals);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync LogRel((DEVICE_NAME ":failed to initialize globals.\n"));
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync LogRel((DEVICE_NAME ":failed to initialize IPRT (rc=%d)\n", rc));
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync memset(&g_VBoxNetFltSolarisGlobals, 0, sizeof(g_VBoxNetFltSolarisGlobals));
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * Undo the work done during start (in reverse order).
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync rc = vboxNetFltTryDeleteIdcAndGlobals(&g_VBoxNetFltSolarisGlobals);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync int rc = mod_info(&g_VBoxNetFltSolarisModLinkage, pModInfo);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * Attach entry point, to attach a device to the system or resume it.
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * @param pDip The module structure instance.
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * @param enmCmd Operation type (attach/resume).
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * @returns corresponding solaris error code.
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncstatic int VBoxNetFltSolarisAttach(dev_info_t *pDip, ddi_attach_cmd_t enmCmd)
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync LogFlow((DEVICE_NAME ":VBoxNetFltSolarisAttach pDip=%p enmCmd=%d\n", pDip, enmCmd));
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync int rc = ddi_create_minor_node(pDip, DEVICE_NAME, S_IFCHR, instance, DDI_PSEUDO, CLONE_DEV);
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync LogRel((DEVICE_NAME ":VBoxNetFltSolarisAttach failed to create minor node. rc%d\n", rc));
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync /* Nothing to do here... */
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * Detach entry point, to detach a device to the system or suspend it.
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * @param pDip The module structure instance.
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * @param enmCmd Operation type (detach/suspend).
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync * @returns corresponding solaris error code.
1b33c96954667ba382fa595baf7b31290bfdd517vboxsyncstatic int VBoxNetFltSolarisDetach(dev_info_t *pDip, ddi_detach_cmd_t enmCmd)
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync LogFlow((DEVICE_NAME ":VBoxNetFltSolarisDetach pDip=%p enmCmd=%d\n", pDip, enmCmd));
1b33c96954667ba382fa595baf7b31290bfdd517vboxsync /* Nothing to do here... */
static int VBoxNetFltSolarisGetInfo(dev_info_t *pDip, ddi_info_cmd_t enmCmd, void *pvArg, void **ppResult)
LogFlow((DEVICE_NAME ":VBoxNetFltSolarisGetInfo pDip=%p enmCmd=%d pArg=%p instance=%d\n", pDip, enmCmd,
switch (enmCmd)
case DDI_INFO_DEVT2DEVINFO:
return DDI_SUCCESS;
case DDI_INFO_DEVT2INSTANCE:
return DDI_SUCCESS;
return DDI_FAILURE;
static int VBoxNetFltSolarisModOpen(queue_t *pQueue, dev_t *pDev, int fOpenMode, int fStreamMode, cred_t *pCred)
LogFlow((DEVICE_NAME ":VBoxNetFltSolarisModOpen pQueue=%p pDev=%p fOpenMode=%d fStreamMode=%d\n", pQueue, pDev,
return ENOENT;
if (!pThis)
return ENOENT;
return ENOENT;
DevMinor++;
return ENOMEM;
* Allocate & initialize per-stream data. Hook it into the (read and write) queue's module specific data.
return ENOMEM;
case kPromiscStream: ASMAtomicUoWritePtr((void * volatile *)&pThis->u.s.pvPromiscStream, pStream); break;
LogFlow((DEVICE_NAME ":VBoxNetFltSolarisModOpen returns 0, DevMinor=%d pQueue=%p\n", DevMinor, pStream->pReadQueue));
return ENXIO;
while (pCur)
for (ppPrevStream = &g_VBoxNetFltSolarisStreams; (pStream = *ppPrevStream) != NULL; ppPrevStream = &pStream->pNext)
if (!pMsg)
bool fSendUpstream = true;
if ( pStream
fSendUpstream = false;
case M_DATA:
if ( fActive
case M_PROTO:
case M_PCPROTO:
switch (Prim)
case DL_NOTIFY_IND:
LogRel((DEVICE_NAME ":VBoxNetFltSolarisModReadPut: Invalid notification size; expected>=%d got=%d\n",
case DL_NOTE_PHYS_ADDR:
fSendUpstream = false;
case DL_NOTE_LINK_UP:
if (fDisconnected)
case DL_NOTE_LINK_DOWN:
if (!fDisconnected)
case DL_BIND_ACK:
case DL_PHYS_ADDR_ACK:
case DL_OK_ACK:
case M_IOCACK:
case M_IOCNAK:
LogRel((DEVICE_NAME ":VBoxNetFltSolarisModReadPut: WARNING! Mode not acknowledged. RawMode is %s\n",
case M_FLUSH:
if (fSendUpstream)
return VERR_NO_MEMORY;
if (!pQueue)
return VERR_INVALID_POINTER;
return VINF_SUCCESS;
return VERR_NO_MEMORY;
return VERR_NO_MEMORY;
return VINF_SUCCESS;
* @param PromiscLevel Promiscous level; DL_PROMISC_PHYS/SAP/MULTI.
if (fPromisc)
return VERR_NO_MEMORY;
return VERR_NO_MEMORY;
if (fPromisc)
return VINF_SUCCESS;
return VERR_NO_MEMORY;
return VINF_SUCCESS;
LogFlow((DEVICE_NAME ":vboxNetFltSolarisCachePhysAddr: DL_PHYS_ADDR_ACK: Mac=%.*Rhxs\n", sizeof(pThis->u.s.Mac),
LogRel((DEVICE_NAME ":vboxNetFltSolarisCachePhysAddr: Invalid address size. expected=%d got=%d\n", ETHERADDRL,
return VERR_NO_MEMORY;
return VINF_SUCCESS;
return VERR_NO_MEMORY;
return VINF_SUCCESS;
static int vboxNetFltSolarisOpenDev(char *pszDev, vnode_t **ppVNode, vnode_t **ppVNodeHeld, TIUSER **ppUser)
int rc;
if (!rc)
if (!rc)
return VINF_SUCCESS;
return VERR_PATH_NOT_FOUND;
int rc;
int ret;
if (!rc)
return VINF_SUCCESS;
int rc;
int ret;
if (!rc)
return VINF_SUCCESS;
int ret;
if (!rc)
return VINF_SUCCESS;
static int vboxNetFltSolarisRelinkIp4(vnode_t *pVNode, struct lifreq *pInterface, int IpMuxFd, int ArpMuxFd)
LogFlow((DEVICE_NAME ":vboxNetFltSolarisRelinkIp4: pVNode=%p pInterface=%p IpMuxFd=%d ArpMuxFd=%d\n", pVNode,
int NewIpMuxId;
int NewArpMuxId;
if ( !rc
&& !rc2)
return VINF_SUCCESS;
return VERR_GENERAL_FAILURE;
LogFlow((DEVICE_NAME ":vboxNetFltSolarisRelinkIp6: pVNode=%p pInterface=%p Ip6MuxFd=%d\n", pVNode, pInterface, Ip6MuxFd));
int NewIp6MuxId;
if (!rc)
return VINF_SUCCESS;
return VERR_GENERAL_FAILURE;
LogFlow((DEVICE_NAME ":vboxNetFltSolarisDetermineModPos: fAttach=%d pVNode=%p pModPos=%p\n", fAttach, pVNode, pModPos));
int cMod;
if (!rc)
LogRel((DEVICE_NAME ":vboxNetFltSolarisDetermineModPos: too few modules on host interface. cMod=%d\n"));
return VERR_OUT_OF_RANGE;
if (fAttach)
return VINF_SUCCESS;
return VERR_NO_MEMORY;
int ret;
if (!rc)
LogFlow((DEVICE_NAME ":vboxNetFltSolarisDetermineModPos: Success! Found %s at %d.\n", DEVICE_NAME, i));
*pModPos = i;
return VINF_SUCCESS;
LogRel((DEVICE_NAME ":vboxNetFltSolarisDetermineModPos: failed to get module information. rc=%d\n"));
LogRel((DEVICE_NAME ":vboxNetFltSolarisDetermineModPos: failed to get list of modules on host interface. rc=%d\n", rc));
return VERR_GENERAL_FAILURE;
int ret;
if ( rc
if (rc)
LogRel((DEVICE_NAME ":vboxNetFltSolarisOpenStream Failed to open '%s' rc=%d pszName='%s'\n", szDev, rc, pThis->szName));
return VERR_INTNET_FLT_IF_FAILED;
if (!rc)
if (!ret)
if (!rc)
return VINF_SUCCESS;
LogRel((DEVICE_NAME ":vboxNetFltSolarisOpenStream Failed to push filter onto host interface '%s'\n", pThis->szName));
return VINF_SUCCESS;
LogRel((DEVICE_NAME ":vboxNetFltSolarisOpenStream Failed to search for filter in interface '%s'.\n", pThis->szName));
return VERR_INTNET_FLT_IF_FAILED;
int rc;
int rc2;
int ret;
if (rc)
LogRel((DEVICE_NAME ":vboxNetFltSolarisAttachIp4: failed to open the IP stream on '%s'.\n", pThis->szName));
return VERR_INTNET_FLT_IF_FAILED;
if (rc)
LogRel((DEVICE_NAME ":vboxNetFltSolarisAttachIp4: failed to open the ARP stream on '%s'.\n", pThis->szName));
return VERR_INTNET_FLT_IF_FAILED;
if (!rc)
int Ip4MuxFd;
int ArpMuxFd;
int ret;
rc2 = strioctl(pUdp4VNode, I_PUNLINK, (intptr_t)Ip4Interface.lifr_arp_muxid, 0, K_TO_K, kcred, &ret);
if ( !rc
&& !rc2)
if ( pIpFile
&& pArpFile
if (!fAttach)
if (!rc)
if (!fAttach)
if (!rc)
return VINF_SUCCESS;
if (fAttach)
if (fAttach)
if (!fAttach)
if (!fAttach)
LogRel((DEVICE_NAME ":vboxNetFltSolarisAttachIp4: failed to find position. rc=%d rc2=%d\n", rc, rc2));
LogRel((DEVICE_NAME ":vboxNetFltSolarisAttachIp4: failed to unlink upper stream rc=%d rc2=%d.\n", rc, rc2));
LogRel((DEVICE_NAME ":vboxNetFltSolarisAttachIp4: failed to get MuxFd from MuxId. rc=%d rc2=%d\n"));
LogRel((DEVICE_NAME ":vboxNetFltSolarisAttachIp4: Warning: seems '%s' is unplumbed.\n", pThis->szName));
return rc;
return VERR_INTNET_FLT_IF_FAILED;
int rc;
int rc2;
int ret;
if (rc)
LogRel((DEVICE_NAME ":vboxNetFltSolarisAttachIp6: failed to open the IPv6 stream on '%s'.\n", pThis->szName));
return VERR_INTNET_FLT_IF_FAILED;
if (!rc)
int Ip6MuxFd;
int ret;
if (!rc)
if ( pIpFile
if (!fAttach)
if (!rc)
return VINF_SUCCESS;
if (fAttach)
if (!fAttach)
LogRel((DEVICE_NAME ":vboxNetFltSolarisAttachIp6: failed to find position. rc=%d rc2=%d\n", rc, rc2));
LogRel((DEVICE_NAME ":vboxNetFltSolarisAttachIp6: failed to unlink upper stream rc=%d rc2=%d.\n", rc, rc2));
LogRel((DEVICE_NAME ":vboxNetFltSolarisAttachIp6: failed to get MuxFd from MuxId. rc=%d rc2=%d\n"));
return rc;
return VERR_INTNET_FLT_IF_FAILED;
LogRel((DEVICE_NAME ":vboxNetFltSolarisAttachToInterface vboxNetFltSolarisOpenStream failed rc=%Rrc\n", rc));
return rc;
return rc;
LogRel((DEVICE_NAME ":vboxNetFltSolarisMBlkFromSG failed to alloc %d bytes for mblk_t.\n", pSG->cbTotal));
return NULL;
* need/possibility for using a mblk_t chain rather.
return pMsg;
unsigned cSegs = 0;
cSegs++;
#ifdef PADD_RUNT_FRAMES_FROM_HOST
cSegs++;
static int vboxNetFltSolarisMBlkToSG(PVBOXNETFLTINS pThis, mblk_t *pMsg, PINTNETSG pSG, unsigned cSegs, uint32_t fSrc)
LogFlow((DEVICE_NAME ":vboxNetFltSolarisMBlkToSG pThis=%p pMsg=%p pSG=%p cSegs=%d\n", pThis, pMsg, pSG, cSegs));
unsigned iSeg = 0;
while (pCur)
if (cbSeg)
iSeg++;
#ifdef PADD_RUNT_FRAMES_FROM_HOST
LogFlow((DEVICE_NAME ":vboxNetFltSolarisMBlkToSG iSeg=%d pSG->cbTotal=%d msgdsize=%d\n", iSeg, pSG->cbTotal, msgdsize(pMsg)));
return VINF_SUCCESS;
return VERR_NO_MEMORY;
return VERR_NO_MEMORY;
vboxnetflt_dladdr_t *pDlAddr = (vboxnetflt_dladdr_t *)(pDlpiMsg->b_rptr + pDlpiData->dl_dest_addr_offset);
return VINF_SUCCESS;
return VERR_NET_PROTOCOL_ERROR;
case DL_UNITDATA_IND:
vboxnetflt_dladdr_t *pDLSapAddr = (vboxnetflt_dladdr_t *)(pMsg->b_rptr + pDlpiMsg->dl_dest_addr_offset);
case DL_UNITDATA_REQ:
vboxnetflt_dladdr_t *pDLSapAddr = (vboxnetflt_dladdr_t *)(pMsg->b_rptr + pDlpiMsg->dl_dest_addr_offset);
LogRel((DEVICE_NAME ":vboxNetFltSolarisUnitDataToRaw Unknown M_PROTO. This shouldn't be happening!!"));
return VERR_NET_PROTOCOL_ERROR;
return VERR_NO_MEMORY;
return VINF_SUCCESS;
static int vboxNetFltSolarisQueueLoopback(PVBOXNETFLTINS pThis, vboxnetflt_promisc_stream_t *pPromiscStream, mblk_t *pMsg)
LogFlow((DEVICE_NAME ":vboxNetFltSolarisQueueLoopback pThis=%p pPromiscStream=%p pMsg=%p\n", pThis, pPromiscStream, pMsg));
return VERR_NOT_SUPPORTED;
return VERR_NET_MSG_SIZE;
LogFlow((DEVICE_NAME ":vboxNetFltSolarisQueueLoopback added head checksum=%u cLoopback=%d.\n", pCur->Checksum,
LogFlow((DEVICE_NAME ":vboxNetFltSolarisQueueLoopback recycled tail!! checksum=%u cLoopback=%d\n", pCur->Checksum,
return rc;
static bool vboxNetFltSolarisIsOurMBlk(PVBOXNETFLTINS pThis, vboxnetflt_promisc_stream_t *pPromiscStream, mblk_t *pMsg)
bool fIsOurPacket = false;
while (pCur)
if (pPrev)
fIsOurPacket = true;
LogFlow((DEVICE_NAME ":vboxNetFltSolarisIsOurMBlk found packet %p Checksum=%u cLoopback=%d\n", pMsg, Checksum,
return fIsOurPacket;
static int vboxNetFltSolarisRecv(PVBOXNETFLTINS pThis, vboxnetflt_stream_t *pStream, queue_t *pQueue, mblk_t *pMsg)
vboxnetflt_promisc_stream_t *pPromiscStream = ASMAtomicUoReadPtr((void * volatile *)&pThis->u.s.pvPromiscStream);
return VERR_INVALID_POINTER;
return VINF_SUCCESS;
if (pCorrectedMsg)
return VINF_SUCCESS;
return NULL;
* odd/non-pulled up sizes are welcome.
LogRel((DEVICE_NAME ":vboxNetFltSolarisFixChecksums failed to alloc new message of %d bytes.\n", cbFullMsg));
return NULL;
bool fChecksumAdjusted = false;
* Fix up TCP/UDP and IP checksums if they're incomplete/invalid.
fChecksumAdjusted = true;
fChecksumAdjusted = true;
if (fChecksumAdjusted)
if (pFullMsg)
return pFullMsg;
return pMsg;
if (pFullMsg)
return NULL;
return NULL;
LogFlow((DEVICE_NAME ":ICMP D=%.6Rhxs S=%.6Rhxs T=%04x\n", pb, pb + 6, RT_BE2H_U16(*(uint16_t *)(pb + 12))));
LogRel((DEVICE_NAME ":UDP bootp ack D=%.6Rhxs S=%.6Rhxs UDP_CheckSum=%04x Computex=%04x\n", pb, pb + 6,
typedef struct VLANHEADER
} VLANHEADER;
LogFlow((DEVICE_NAME ":VLAN Pcp=%d Cfi=%d Id=%d\n", pVlanHdr->Pcp, pVlanHdr->Cfi, pVlanHdr->Vid >> 4));
LogFlow((DEVICE_NAME ":Unknown EtherType=%x D=%.6Rhxs S=%.6Rhxs\n", RT_H2BE_U16(pEthHdr->EtherType), &pEthHdr->DstMac,
if (pStream)
return VINF_SUCCESS;
return VINF_SUCCESS;
return rc;
return rc;
return VINF_SUCCESS;
unsigned uProtocol;
if (pNetStack)
if (pNetData)
if (pInterface)
if (!rc)
vboxnetflt_promisc_stream_t *pPromiscStream = ASMAtomicUoReadPtr((void * volatile *)&pThis->u.s.pvPromiscStream);
if (!pIp4Stream)
return rc;
if (pArpStream)
&& pIp6Stream)
return rc;