VirtualBox

Ignore:
Timestamp:
Aug 9, 2011 8:37:03 AM (14 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
73396
Message:

vboxnetadp: BPF support for vboxnetX devices (#5817)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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            }
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