VBoxNetFlt-linux.c revision 19a258565a4d24e5a0af62f626943ac9b898d957
98N/A#include "the-linux-kernel.h"
98N/A#include "version-generated.h"
98N/A#include "../VBoxNetFltInternal.h"
static int VBoxNetFltLinuxInit(void);
static void VBoxNetFltLinuxUnload(void);
#ifdef MODULE_VERSION
# define str(s) #s
int rc;
RTR0Term();
int rc;
RTR0Term();
if (pDev)
Log(("vboxNetFltLinuxRetainNetDev: Device %p(%s) retained. ref=%d\n", pDev, pDev->name, atomic_read(&pDev->refcnt)));
return pDev;
if (pDev)
Log(("vboxNetFltLinuxReleaseNetDev: Device %p(%s) released. ref=%d\n", pDev, pDev->name, atomic_read(&pDev->refcnt)));
static struct sk_buff *vboxNetFltLinuxSkBufFromSG(PVBOXNETFLTINS pThis, PINTNETSG pSG, bool fDstWire)
LogRel(("VBoxNetFlt: Dropped multi-segment(%d) packet coming from internal network.\n", pSG->cSegsUsed));
return NULL;
return NULL;
if (pPkt)
if (fDstWire)
return pPkt;
return NULL;
DECLINLINE(void) vboxNetFltLinuxSkBufToSG(PVBOXNETFLTINS pThis, struct sk_buff *pBuf, PINTNETSG pSG, unsigned cSegs, uint32_t fSrc)
#ifdef PADD_RUNT_FRAMES_FROM_HOST
if (!pBuf)
#ifdef PADD_RUNT_FRAMES_FROM_HOST
cSegs++;
return cSegs;
bool fDropIt;
unsigned cSegs;
fDropIt = false;
if (!pSG)
bool fActive;
if (fActive)
if (!fActive)
if (!pDev)
return VERR_INTNET_FLT_IF_NOT_FOUND;
Log(("vboxNetFltLinuxAttachToInterface: Device %p(%s) retained. ref=%d\n", pDev, pDev->name, atomic_read(&pDev->refcnt)));
Log(("vboxNetFltLinuxAttachToInterface: Got pDev=%p pThis=%p pThis->u.s.pDev=%p\n", pDev, pThis, ASMAtomicUoReadPtr((void * volatile *)&pThis->u.s.pDev)));
if (pDev)
if (pDev)
Log(("vboxNetFltLinuxAttachToInterface: Device %p(%s) released. ref=%d\n", pDev, pDev->name, atomic_read(&pDev->refcnt)));
LogRel(("VBoxNetFlt: attached to '%s' / %.*Rhxs\n", pThis->szName, sizeof(pThis->u.s.Mac), &pThis->u.s.Mac));
return VINF_SUCCESS;
Log(("vboxNetFltLinuxUnregisterDevice: this=%p: Packet handler removed, xmit queue purged.\n", pThis));
Log(("vboxNetFltLinuxUnregisterDevice: Device %p(%s) released. ref=%d\n", pDev, pDev->name, atomic_read(&pDev->refcnt)));
return NOTIFY_OK;
Log(("vboxNetFltLinuxDeviceIsUp: enabled promiscuous mode on %s (%d)\n", pThis->szName, VBOX_GET_PCOUNT(pDev)));
Log(("vboxNetFltLinuxDeviceIsUp: no need to enable promiscuous mode on %s (%d)\n", pThis->szName, VBOX_GET_PCOUNT(pDev)));
return NOTIFY_OK;
Log(("vboxNetFltLinuxDeviceGoingDown: disabled promiscuous mode on %s (%d)\n", pThis->szName, VBOX_GET_PCOUNT(pDev)));
Log(("vboxNetFltLinuxDeviceGoingDown: no need to disable promiscuous mode on %s (%d)\n", pThis->szName, VBOX_GET_PCOUNT(pDev)));
return NOTIFY_OK;
static int vboxNetFltLinuxNotifierCallback(struct notifier_block *self, unsigned long ulEventType, void *ptr)
int rc;
#ifdef DEBUG
switch (ulEventType)
pszEvent, ulEventType, pDev->name, pDev, pThis, ASMAtomicUoReadPtr((void * volatile *)&pThis->u.s.pDev)));
return NOTIFY_OK;
switch (ulEventType)
case NETDEV_UNREGISTER:
case NETDEV_UP:
case NETDEV_GOING_DOWN:
case NETDEV_CHANGENAME:
return rc;
int err;
if (pDev)
if (pBuf)
if (err)
if (pBuf)
if (err)
return rc;
bool fRc = false;
if (pDev)
return fRc;
if (pDev)
if (fActive)
int err = 0;
rtnl_lock();
rtnl_unlock();
Log(("vboxNetFltPortOsSetActive: enabled promiscuous mode on %s (%d)\n", pThis->szName, VBOX_GET_PCOUNT(pDev)));
if (!err)
Log(("vboxNetFlt: fixed IFF_PROMISC on %s (%d->%d)\n", pThis->szName, cPromiscBefore, VBOX_GET_PCOUNT(pDev)));
else if (!err)
Log(("VBoxNetFlt: Waiting for the link to come up... (%d->%d)\n", cPromiscBefore, VBOX_GET_PCOUNT(pDev)));
if (err)
LogRel(("VBoxNetFlt: Failed to put '%s' into promiscuous mode, err=%d (%d->%d)\n", pThis->szName, err, cPromiscBefore, VBOX_GET_PCOUNT(pDev)));
rtnl_lock();
rtnl_unlock();
Log(("vboxNetFltPortOsSetActive: disabled promiscuous mode on %s (%d)\n", pThis->szName, VBOX_GET_PCOUNT(pDev)));
return VINF_SUCCESS;
return VINF_SUCCESS;
bool fRegistered;
if (fRegistered)
Log(("vboxNetFltOsDeleteInstance: Device %p(%s) released. ref=%d\n", pDev, pDev->name, atomic_read(&pDev->refcnt)));
int err;
if (err)
return VERR_INTNET_FLT_IF_FAILED;
return VERR_INTNET_FLT_IF_NOT_FOUND;
return VINF_SUCCESS;