VirtualBox

Changeset 38370 in vbox for trunk


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
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/HostDrivers/VBoxNetAdp/VBoxNetAdp.c

    r36951 r38370  
    11971197    for (i = 0; i < RT_ELEMENTS(g_aAdapters); i++)
    11981198    {
     1199        g_aAdapters[i].uMagic   = VBOXNETADP_MAGIC;
    11991200        g_aAdapters[i].enmState = kVBoxNetAdpState_Invalid;
    12001201        g_aAdapters[i].iUnit    = -1;
  • trunk/src/VBox/HostDrivers/VBoxNetAdp/VBoxNetAdpInternal.h

    r35824 r38370  
    3030typedef struct VBOXNETADPGLOBALS *PVBOXNETADPGLOBALS;
    3131
     32/* WARNING! There a copy of VBOXNETADP_MAGIC in VBoxNetFlt/VBoxNetFltInternal.h! */
     33/*                                   v b n a */
     34#define VBOXNETADP_MAGIC           0x56424e41
    3235#define VBOXNETADP_MAX_INSTANCES   8
    3336#define VBOXNETADP_MAX_UNITS       128
     
    8386struct VBoxNetAdapter
    8487{
     88    /** Magic id to tell vboxnetX interfaces apart. */
     89    uint32_t          uMagic;
    8590    /** Denotes availability of this slot in adapter array. */
    8691    VBOXNETADPSTATE   enmState;
     
    104109            /** Protocol families attached to this adapter. */
    105110            protocol_family_t aAttachedFamilies[VBOXNETADP_MAX_FAMILIES];
     111            /** Packet sniffer mode. */
     112            bpf_tap_mode      nTapMode;
    106113            /** @} */
    107114# elif defined(RT_OS_LINUX)
  • trunk/src/VBox/HostDrivers/VBoxNetAdp/darwin/VBoxNetAdp-darwin.cpp

    r37423 r38370  
    5555#include <sys/conf.h>
    5656#include <miscfs/devfs/devfs.h>
     57extern "C" {
     58#include <net/bpf.h>
     59}
    5760
    5861#define VBOXNETADP_OS_SPECFIC 1
     
    142145static errno_t vboxNetAdpDarwinOutput(ifnet_t pIface, mbuf_t pMBuf)
    143146{
     147    PVBOXNETADP pThis = VBOXNETADP_FROM_IFACE(pIface);
     148    Assert(pThis);
     149    if (pThis->u.s.nTapMode & BPF_MODE_OUTPUT)
     150    {
     151        Log2(("vboxnetadp: out len=%d\n%.*Rhxd\n", mbuf_len(pMBuf), 14, mbuf_data(pMBuf)));
     152        bpf_tap_out(pIface, DLT_EN10MB, pMBuf, NULL, 0);
     153    }
    144154    mbuf_freem_list(pMBuf);
    145155    return 0;
     
    192202}
    193203
    194 
     204static errno_t vboxNetAdpDarwinDemux(ifnet_t pIface, mbuf_t pMBuf,
     205                                     char *pFrameHeader,
     206                                     protocol_family_t *pProtocolFamily)
     207{
     208    PVBOXNETADP pThis = VBOXNETADP_FROM_IFACE(pIface);
     209    Assert(pThis);
     210    Log2(("vboxNetAdpDarwinDemux: mode=%d\n", nMode));
     211    if (pThis->u.s.nTapMode & BPF_MODE_INPUT)
     212    {
     213        Log2(("vboxnetadp: in len=%d\n%.*Rhxd\n", mbuf_len(pMBuf), 14, pFrameHeader));
     214        bpf_tap_in(pIface, DLT_EN10MB, pMBuf, pFrameHeader, ETHER_HDR_LEN);
     215    }
     216    return ether_demux(pIface, pMBuf, pFrameHeader, pProtocolFamily);
     217}
     218
     219static errno_t vboxNetAdpDarwinBpfTap(ifnet_t pIface, u_int32_t uLinkType, bpf_tap_mode nMode)
     220{
     221    PVBOXNETADP pThis = VBOXNETADP_FROM_IFACE(pIface);
     222    Assert(pThis);
     223    Log2(("vboxNetAdpDarwinBpfTap: mode=%d\n", nMode));
     224    pThis->u.s.nTapMode = nMode;
     225    return 0;
     226}
     227
     228static errno_t vboxNetAdpDarwinBpfSend(ifnet_t pIface, u_int32_t uLinkType, mbuf_t pMBuf)
     229{
     230    LogRel(("vboxnetadp: BPF send function is not implemented (dlt=%d)\n", uLinkType));
     231    mbuf_freem_list(pMBuf);
     232    return 0;
     233}
    195234
    196235int vboxNetAdpOsCreate(PVBOXNETADP pThis, PCRTMAC pMACAddress)
     
    208247        return rc;
    209248    }
     249
     250    pThis->u.s.nTapMode = BPF_MODE_DISABLED;
    210251
    211252    mac.sdl_len = sizeof(mac);
     
    225266    Params.type = IFT_ETHER;
    226267    Params.output = vboxNetAdpDarwinOutput;
    227     Params.demux = ether_demux;
     268    Params.demux = vboxNetAdpDarwinDemux;
    228269    Params.add_proto = vboxNetAdpDarwinAddProto;
    229270    Params.del_proto = vboxNetAdpDarwinDelProto;
     
    244285        if (!err)
    245286        {
     287            err = bpf_attach(pThis->u.s.pIface, DLT_EN10MB, ETHER_HDR_LEN,
     288                      vboxNetAdpDarwinBpfSend, vboxNetAdpDarwinBpfTap);
     289            if (err)
     290            {
     291                LogRel(("vboxnetadp: bpf_attach failed with %d\n", err));
     292            }
    246293            err = ifnet_set_flags(pThis->u.s.pIface, IFF_RUNNING | IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST, 0xFFFF);
    247294            if (!err)
    248295            {
    249296                ifnet_set_mtu(pThis->u.s.pIface, VBOXNETADP_MTU);
     297                Log2(("vboxnetadp: created interface %s (%p), pThis=%p, pMagic=%p, *pMagic=%x(%x)\n",
     298                        pThis->szName, pThis->u.s.pIface, pThis, ifnet_softc(pThis->u.s.pIface), *(uint32_t*)ifnet_softc(pThis->u.s.pIface), pThis->uMagic));
    250299                return VINF_SUCCESS;
    251300            }
  • 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