VirtualBox

Ignore:
Timestamp:
Aug 9, 2011 8:37:03 AM (13 years ago)
Author:
vboxsync
Message:

vboxnetadp: BPF support for vboxnetX devices (#5817)

Location:
trunk/src/VBox/HostDrivers/VBoxNetFlt
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/HostDrivers/VBoxNetFlt/VBoxNetFltInternal.h

    r38140 r38370  
    2424#include <iprt/assert.h>
    2525
     26/* Copied from VBoxNetAdp/VBoxNetAdpInternal.h */
     27#define VBOXNETADP_MAGIC           0x56424e41
    2628
    2729RT_C_DECLS_BEGIN
  • trunk/src/VBox/HostDrivers/VBoxNetFlt/darwin/VBoxNetFlt-darwin.cpp

    r33676 r38370  
    787787 * @param   fSrc            Where the packet (allegedly) comes from, one INTNETTRUNKDIR_* value.
    788788 * @param   eProtocol       The protocol.
     789 * @param   pIfNet          The network interface.
    789790 */
    790791static errno_t vboxNetFltDarwinIffInputOutputWorker(PVBOXNETFLTINS pThis, mbuf_t pMBuf, void *pvFrame,
    791                                                     uint32_t fSrc, protocol_family_t eProtocol)
     792                                                    uint32_t fSrc, protocol_family_t eProtocol,
     793                                                    ifnet_t pIfNet)
    792794{
    793795    /*
     
    838840        fDropIt = pThis->pSwitchPort->pfnRecv(pThis->pSwitchPort, NULL /* pvIf */, pSG, fSrc);
    839841        if (fDropIt)
    840             mbuf_freem(pMBuf);
     842        {
     843            /*
     844             * Check is this interface belongs to vboxnetadp. We should not drop
     845             * any packets before they get to vboxnetadp as it passes them to tap
     846             * callbacks in order for BPF to work properly.
     847             */
     848            uint32_t *pMagic = (uint32_t *)ifnet_softc(pIfNet);
     849            Log2(("vboxnetflt: pMagic=%p *pMagic=%x\n", pMagic, pMagic ? *pMagic : -1));
     850            if (pMagic && *pMagic == VBOXNETADP_MAGIC)
     851                fDropIt = false;
     852            else
     853                mbuf_freem(pMBuf);
     854        }
    841855    }
    842856
     
    857871
    858872    NOREF(eProtocol);
    859     NOREF(pIfNet);
    860     return vboxNetFltDarwinIffInputOutputWorker((PVBOXNETFLTINS)pvThis, *ppMBuf, NULL, INTNETTRUNKDIR_HOST, eProtocol);
     873    return vboxNetFltDarwinIffInputOutputWorker((PVBOXNETFLTINS)pvThis, *ppMBuf, NULL, INTNETTRUNKDIR_HOST, eProtocol, pIfNet);
    861874}
    862875
     
    870883{
    871884    NOREF(eProtocol);
    872     NOREF(pIfNet);
    873     return vboxNetFltDarwinIffInputOutputWorker((PVBOXNETFLTINS)pvThis, *ppMBuf, *ppchFrame, INTNETTRUNKDIR_WIRE, eProtocol);
     885    return vboxNetFltDarwinIffInputOutputWorker((PVBOXNETFLTINS)pvThis, *ppMBuf, *ppchFrame, INTNETTRUNKDIR_WIRE, eProtocol, pIfNet);
    874886}
    875887
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette