VirtualBox

Changeset 28666 in vbox for trunk/src/VBox/HostDrivers


Ignore:
Timestamp:
Apr 23, 2010 5:25:58 PM (15 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
60537
Message:

SrvIntNet,VBoxNetFlt: Changing from getting to reporting (VBoxNetFlt reports stuff to SrvIntNet).

Location:
trunk/src/VBox/HostDrivers
Files:
9 edited

Legend:

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

    r25336 r28666  
    441441
    442442/**
    443  * @copydoc INTNETTRUNKIFPORT::pfnIsPromiscuous
    444  */
    445 static DECLCALLBACK(bool) vboxNetAdpPortIsPromiscuous(PINTNETTRUNKIFPORT pIfPort)
     443 * @copydoc INTNETTRUNKIFPORT::pfnGetMacAddress
     444 */
     445static DECLCALLBACK(void) vboxNetAdpPortGetMacAddress(PINTNETTRUNKIFPORT pIfPort, PRTMAC pMac)
    446446{
    447447    PVBOXNETADP pThis = IFPORT_2_VBOXNETADP(pIfPort);
     
    455455
    456456    /*
    457      * Ask the OS specific code.
    458      */
    459     return vboxNetAdpPortOsIsPromiscuous(pThis);
    460 }
    461 
    462 
    463 /**
    464  * @copydoc INTNETTRUNKIFPORT::pfnGetMacAddress
    465  */
    466 static DECLCALLBACK(void) vboxNetAdpPortGetMacAddress(PINTNETTRUNKIFPORT pIfPort, PRTMAC pMac)
    467 {
    468     PVBOXNETADP pThis = IFPORT_2_VBOXNETADP(pIfPort);
    469 
    470     /*
    471      * Input validation.
    472      */
    473     AssertPtr(pThis);
    474     Assert(pThis->MyPort.u32Version == INTNETTRUNKIFPORT_VERSION);
    475     Assert(vboxNetAdpGetStateWithLock(pThis) == kVBoxNetAdpState_Active);
    476 
    477     /*
    478457     * Forward the question to the OS specific code.
    479458     */
    480459    vboxNetAdpPortOsGetMacAddress(pThis, pMac);
    481 }
    482 
    483 
    484 /**
    485  * @copydoc INTNETTRUNKIFPORT::pfnIsHostMac
    486  */
    487 static DECLCALLBACK(bool) vboxNetAdpPortIsHostMac(PINTNETTRUNKIFPORT pIfPort, PCRTMAC pMac)
    488 {
    489     PVBOXNETADP pThis = IFPORT_2_VBOXNETADP(pIfPort);
    490 
    491     /*
    492      * Input validation.
    493      */
    494     AssertPtr(pThis);
    495     Assert(pThis->MyPort.u32Version == INTNETTRUNKIFPORT_VERSION);
    496     Assert(vboxNetAdpGetStateWithLock(pThis) == kVBoxNetAdpState_Active);
    497 
    498     /*
    499      * Ask the OS specific code.
    500      */
    501     return vboxNetAdpPortOsIsHostMac(pThis, pMac);
    502460}
    503461
     
    891849    pNew->MyPort.pfnWaitForIdle         = vboxNetAdpPortWaitForIdle;
    892850    pNew->MyPort.pfnGetMacAddress       = vboxNetAdpPortGetMacAddress;
    893     pNew->MyPort.pfnIsHostMac           = vboxNetAdpPortIsHostMac;
    894     pNew->MyPort.pfnIsPromiscuous       = vboxNetAdpPortIsPromiscuous;
    895851    pNew->MyPort.pfnXmit                = vboxNetAdpPortXmit;
    896852    pNew->MyPort.u32VersionEnd          = INTNETTRUNKIFPORT_VERSION;
  • trunk/src/VBox/HostDrivers/VBoxNetFlt/VBoxNetFlt.c

    r28623 r28666  
    415415
    416416/**
    417  * @copydoc INTNETTRUNKIFPORT::pfnIsPromiscuous
    418  */
    419 static DECLCALLBACK(bool) vboxNetFltPortIsPromiscuous(PINTNETTRUNKIFPORT pIfPort)
    420 {
    421     PVBOXNETFLTINS pThis = IFPORT_2_VBOXNETFLTINS(pIfPort);
    422 
    423     /*
    424      * Input validation.
    425      */
    426     AssertPtr(pThis);
    427     Assert(pThis->MyPort.u32Version == INTNETTRUNKIFPORT_VERSION);
    428     Assert(vboxNetFltGetState(pThis) == kVBoxNetFltInsState_Connected);
    429     /* No fActive check here. */
    430 
    431     /*
    432      * Ask the OS specific code.
    433      */
    434     return vboxNetFltPortOsIsPromiscuous(pThis);
    435 }
    436 
    437 
    438 /**
    439  * @copydoc INTNETTRUNKIFPORT::pfnGetMacAddress
    440  */
    441 static DECLCALLBACK(void) vboxNetFltPortGetMacAddress(PINTNETTRUNKIFPORT pIfPort, PRTMAC pMac)
    442 {
    443     PVBOXNETFLTINS pThis = IFPORT_2_VBOXNETFLTINS(pIfPort);
    444 
    445     /*
    446      * Input validation.
    447      */
    448     AssertPtr(pThis);
    449     Assert(pThis->MyPort.u32Version == INTNETTRUNKIFPORT_VERSION);
    450     Assert(vboxNetFltGetState(pThis) == kVBoxNetFltInsState_Connected);
    451     /* No fActive check here. */
    452 
    453     /*
    454      * Forward the question to the OS specific code.
    455      */
    456     vboxNetFltPortOsGetMacAddress(pThis, pMac);
    457 }
    458 
    459 
    460 /**
    461  * @copydoc INTNETTRUNKIFPORT::pfnIsHostMac
    462  */
    463 static DECLCALLBACK(bool) vboxNetFltPortIsHostMac(PINTNETTRUNKIFPORT pIfPort, PCRTMAC pMac)
    464 {
    465     PVBOXNETFLTINS pThis = IFPORT_2_VBOXNETFLTINS(pIfPort);
    466 
    467     /*
    468      * Input validation.
    469      */
    470     AssertPtr(pThis);
    471     Assert(pThis->MyPort.u32Version == INTNETTRUNKIFPORT_VERSION);
    472     Assert(vboxNetFltGetState(pThis) == kVBoxNetFltInsState_Connected);
    473 /** @todo Assert(pThis->fActive); - disabled because we may call this
    474  *        without holding the out-bound lock and race the clearing. */
    475 
    476     /*
    477      * Ask the OS specific code.
    478      */
    479     return vboxNetFltPortOsIsHostMac(pThis, pMac);
    480 }
    481 
    482 
    483 /**
    484417 * @copydoc INTNETTRUNKIFPORT::pfnWaitForIdle
    485418 */
     
    553486{
    554487    PVBOXNETFLTINS pThis = IFPORT_2_VBOXNETFLTINS(pIfPort);
    555     RTSPINLOCKTMP Tmp = RTSPINLOCKTMP_INITIALIZER;
     488    RTSPINLOCKTMP  Tmp  = RTSPINLOCKTMP_INITIALIZER;
    556489
    557490    /*
     
    846779    pNew->MyPort.pfnSetActive           = vboxNetFltPortSetActive;
    847780    pNew->MyPort.pfnWaitForIdle         = vboxNetFltPortWaitForIdle;
    848     pNew->MyPort.pfnGetMacAddress       = vboxNetFltPortGetMacAddress;
    849     pNew->MyPort.pfnIsHostMac           = vboxNetFltPortIsHostMac;
    850     pNew->MyPort.pfnIsPromiscuous       = vboxNetFltPortIsPromiscuous;
    851781    pNew->MyPort.pfnXmit                = vboxNetFltPortXmit;
    852782    pNew->MyPort.u32VersionEnd          = INTNETTRUNKIFPORT_VERSION;
    853     pNew->pSwitchPort                   = NULL;
     783    pNew->pSwitchPort                   = pSwitchPort;
    854784    pNew->pGlobals                      = pGlobals;
    855785    pNew->hSpinlock                     = NIL_RTSPINLOCK;
  • trunk/src/VBox/HostDrivers/VBoxNetFlt/VBoxNetFltInternal.h

    r25367 r28666  
    131131    RTSEMEVENT hEventIdle;
    132132
     133    /** @todo move MacAddr out of this structure!  */
    133134    union
    134135    {
     
    153154            bool volatile fSetPromiscuous;
    154155            /** The MAC address of the interface. */
    155             RTMAC Mac;
     156            RTMAC MacAddr;
    156157            /** @} */
    157158# elif defined(RT_OS_LINUX)
     
    166167            bool volatile fRegistered;
    167168            /** The MAC address of the interface. */
    168             RTMAC Mac;
     169            RTMAC MacAddr;
    169170            struct notifier_block Notifier;
    170171            struct packet_type    PacketType;
     
    191192            mac_promisc_handle_t hPromiscuous;
    192193            /** The MAC address of the interface */
    193             RTMAC Mac;
     194            RTMAC MacAddr;
    194195#  else
    195196            /** Pointer to the bound IPv4 stream. */
     
    206207            ldi_handle_t hIface;
    207208            /** The MAC address of the interface. */
    208             RTMAC Mac;
     209            RTMAC MacAddr;
    209210            /** Mutex protection used for loopback. */
    210211            RTSEMFASTMUTEX hFastMtx;
     
    235236            struct task tskout;
    236237            /** The MAC address of the interface. */
    237             RTMAC Mac;
     238            RTMAC MacAddr;
    238239            /** @} */
    239240# elif defined(RT_OS_WINDOWS)
     
    249250            PACKET_QUEUE_WORKER PacketQueueWorker;
    250251            /** The MAC address of the interface. Caching MAC for performance reasons. */
    251             RTMAC Mac;
     252            RTMAC MacAddr;
    252253            /** mutex used to synchronize ADAPT init/deinit */
    253254            RTSEMMUTEX hAdaptMutex;
     
    361362
    362363/**
    363  * Checks if the interface is in promiscuous mode from the host perspective.
    364  *
    365  * If it is, then the internal networking switch will send frames
    366  * heading for the wire to the host as well.
    367  *
    368  * @see INTNETTRUNKIFPORT::pfnIsPromiscuous for more details.
    369  *
    370  * @returns true / false accordingly.
    371  * @param   pThis           The instance.
    372  *
    373  * @remarks Owns the network lock and the out-bound trunk port semaphores.
    374  */
    375 DECLHIDDEN(bool) vboxNetFltPortOsIsPromiscuous(PVBOXNETFLTINS pThis);
    376 
    377 /**
    378  * Get the MAC address of the interface we're attached to.
    379  *
    380  * Used by the internal networking switch for implementing the
    381  * shared-MAC-on-the-wire mode.
    382  *
    383  * @param   pThis           The instance.
    384  * @param   pMac            Where to store the MAC address.
    385  *                          If you don't know, set all the bits except the first (the multicast one).
    386  *
    387  * @remarks Owns the network lock and the out-bound trunk port semaphores.
    388  */
    389 DECLHIDDEN(void) vboxNetFltPortOsGetMacAddress(PVBOXNETFLTINS pThis, PRTMAC pMac);
    390 
    391 /**
    392  * Checks if the specified MAC address is for any of the host interfaces.
    393  *
    394  * Used by the internal networking switch to decide the destination(s)
    395  * of a frame.
    396  *
    397  * @returns true / false accordingly.
    398  * @param   pThis           The instance.
    399  * @param   pMac            The MAC address.
    400  *
    401  * @remarks Owns the network lock and the out-bound trunk port semaphores.
    402  */
    403 DECLHIDDEN(bool) vboxNetFltPortOsIsHostMac(PVBOXNETFLTINS pThis, PCRTMAC pMac);
    404 
    405 /**
    406364 * This is called when activating or suspending the instance.
    407365 *
     
    451409 * after linking the instance into the list.
    452410 *
     411 * The MAC address as well promiscuousness and GSO capabilities should be
     412 * reported by this function.
     413 *
    453414 * @return  IPRT status code.
    454415 * @param   pThis           The new instance.
  • trunk/src/VBox/HostDrivers/VBoxNetFlt/darwin/VBoxNetFlt-darwin.cpp

    r28077 r28666  
    615615    AssertMsg(!pvFrame, ("pvFrame=%p pMBuf=%p iSeg=%d\n", pvFrame, pMBuf, iSeg));
    616616}
     617
     618
     619/**
     620 * Helper for determining whether the host wants the interface to be
     621 * promiscuous.
     622 */
     623static bool vboxNetFltDarwinIsPromiscuous(PVBOXNETFLTINS pThis)
     624{
     625    bool fRc = false;
     626    ifnet_t pIfNet = vboxNetFltDarwinRetainIfNet(pThis);
     627    if (pIfNet)
     628    {
     629        /* gather the data */
     630        uint16_t fIf = ifnet_flags(pIfNet);
     631        unsigned cPromisc = VBOX_GET_PCOUNT(pIfNet);
     632        bool fSetPromiscuous = ASMAtomicUoReadBool(&pThis->u.s.fSetPromiscuous);
     633        vboxNetFltDarwinReleaseIfNet(pThis, pIfNet);
     634
     635        /* calc the return. */
     636        fRc = (fIf & IFF_PROMISC)
     637           && cPromisc > fSetPromiscuous;
     638    }
     639    return fRc;
     640}
     641
    617642
    618643
     
    751776            else if (pEvMsg->event_code == KEV_DL_LINK_OFF)
    752777                Log(("vboxNetFltDarwinIffEvent: %s goes down (%d)\n", pThis->szName, VBOX_GET_PCOUNT(pIfNet)));
     778/** @todo KEV_DL_LINK_ADDRESS_CHANGED  -> pfnReportMacAddress */
     779/** @todo KEV_DL_SIFFLAGS              -> pfnReportPromiscuousMode */
    753780        }
    754781        else
     
    903930     * Get the mac address while we still have a valid ifnet reference.
    904931     */
    905     err = ifnet_lladdr_copy_bytes(pIfNet, &pThis->u.s.Mac, sizeof(pThis->u.s.Mac));
     932    err = ifnet_lladdr_copy_bytes(pIfNet, &pThis->u.s.MacAddr, sizeof(pThis->u.s.MacAddr));
    906933    if (!err)
    907934    {
     
    931958        }
    932959        RTSpinlockRelease(pThis->hSpinlock, &Tmp);
     960
     961        /* Report capabilities. */
     962        if (!pIfNet)
     963        {
     964            Assert(pThis->pSwitchPort);
     965            pThis->pSwitchPort->pfnReportMacAddress(pThis->pSwitchPort, &pThis->u.s.MacAddr);
     966            pThis->pSwitchPort->pfnReportPromiscuousMode(pThis->pSwitchPort, vboxNetFltDarwinIsPromiscuous(pThis));
     967            pThis->pSwitchPort->pfnReportGsoCapabilities(pThis->pSwitchPort, 0,  INTNETTRUNKDIR_WIRE | INTNETTRUNKDIR_HOST);
     968        }
    933969    }
    934970
     
    939975    int rc = RTErrConvertFromErrno(err);
    940976    if (RT_SUCCESS(rc))
    941         LogRel(("VBoxFltDrv: attached to '%s' / %.*Rhxs\n", pThis->szName, sizeof(pThis->u.s.Mac), &pThis->u.s.Mac));
     977        LogRel(("VBoxFltDrv: attached to '%s' / %.*Rhxs\n", pThis->szName, sizeof(pThis->u.s.MacAddr), &pThis->u.s.MacAddr));
    942978    else
    943979        LogRel(("VBoxFltDrv: failed to attach to ifnet '%s' (err=%d)\n", pThis->szName, err));
     
    10021038
    10031039    return rc;
    1004 }
    1005 
    1006 
    1007 bool vboxNetFltPortOsIsPromiscuous(PVBOXNETFLTINS pThis)
    1008 {
    1009     bool fRc = false;
    1010     ifnet_t pIfNet = vboxNetFltDarwinRetainIfNet(pThis);
    1011     if (pIfNet)
    1012     {
    1013         /* gather the data */
    1014         uint16_t fIf = ifnet_flags(pIfNet);
    1015         unsigned cPromisc = VBOX_GET_PCOUNT(pIfNet);
    1016         bool fSetPromiscuous = ASMAtomicUoReadBool(&pThis->u.s.fSetPromiscuous);
    1017         vboxNetFltDarwinReleaseIfNet(pThis, pIfNet);
    1018 
    1019         /* calc the return. */
    1020         fRc = (fIf & IFF_PROMISC)
    1021            && cPromisc > fSetPromiscuous;
    1022     }
    1023     return fRc;
    1024 }
    1025 
    1026 
    1027 void vboxNetFltPortOsGetMacAddress(PVBOXNETFLTINS pThis, PRTMAC pMac)
    1028 {
    1029     *pMac = pThis->u.s.Mac;
    1030 }
    1031 
    1032 
    1033 bool vboxNetFltPortOsIsHostMac(PVBOXNETFLTINS pThis, PCRTMAC pMac)
    1034 {
    1035     /* ASSUMES that the MAC address never changes. */
    1036     return pThis->u.s.Mac.au16[0] == pMac->au16[0]
    1037         && pThis->u.s.Mac.au16[1] == pMac->au16[1]
    1038         && pThis->u.s.Mac.au16[2] == pMac->au16[2];
    10391040}
    10401041
     
    11921193    pThis->u.s.fSetPromiscuous = false;
    11931194    pThis->u.s.fNeedSetPromiscuous = false;
    1194     //pThis->u.s.Mac = {0};
     1195    //pThis->u.s.MacAddr = {0};
    11951196
    11961197    return VINF_SUCCESS;
  • trunk/src/VBox/HostDrivers/VBoxNetFlt/freebsd/VBoxNetFlt-freebsd.c

    r28070 r28666  
    525525}
    526526
     527static bool vboxNetFltFreeBsdIsPromiscuous(PVBOXNETFLTINS pThis)
     528{
     529    /** @todo This isn't taking into account that we put the interface in
     530     *        promiscuous mode.  */
     531    return (pThis->u.s.flags & IFF_PROMISC) ? true : false;
     532}
     533
    527534int vboxNetFltOsInitInstance(PVBOXNETFLTINS pThis, void *pvContext)
    528535{
     
    544551    ASMAtomicUoWritePtr((void * volatile *)&pThis->u.s.ifp, ifp);
    545552    pThis->u.s.node = node;
    546     bcopy(IF_LLADDR(ifp), &pThis->u.s.Mac, ETHER_ADDR_LEN);
     553    bcopy(IF_LLADDR(ifp), &pThis->u.s.MacAddr, ETHER_ADDR_LEN);
    547554    ASMAtomicUoWriteBool(&pThis->fDisconnectedFromHost, false);
     555
    548556    /* Initialize deferred input queue */
    549557    bzero(&pThis->u.s.inq, sizeof(struct ifqueue));
     
    559567
    560568    NG_NODE_SET_PRIVATE(node, pThis);
     569
    561570    /* Attempt to name it vboxnetflt_<ifname> */
    562571    snprintf(nam, NG_NODESIZ, "vboxnetflt_%s", pThis->szName);
    563572    ng_name_node(node, nam);
     573
     574    /* Report MAC address, promiscuous mode and GSO capabilities. */
     575    /** @todo keep these reports up to date, either by polling for changes or
     576     *        intercept some control flow if possible. */
     577    Assert(pThis->pSwitchPort);
     578    pThis->pSwitchPort->pfnReportMacAddress(pThis->pSwitchPort, &pThis->u.s.MacAddr);
     579    pThis->pSwitchPort->pfnReportPromiscuousMode(pThis->pSwitchPort, vboxNetFltFreeBsdIsPromiscuous(pThis));
     580    pThis->pSwitchPort->pfnReportGsoCapabilities(pThis->pSwitchPort, 0, INTNETTRUNKDIR_WIRE | INTNETTRUNKDIR_HOST);
    564581
    565582    return VINF_SUCCESS;
     
    704721}
    705722
    706 bool vboxNetFltPortOsIsPromiscuous(PVBOXNETFLTINS pThis)
    707 {
    708     return (pThis->u.s.flags & IFF_PROMISC) ? true : false;
    709 }
    710 
    711 void vboxNetFltPortOsGetMacAddress(PVBOXNETFLTINS pThis, PRTMAC pMac)
    712 {
    713     *pMac = pThis->u.s.Mac;
    714 }
    715 
    716 bool vboxNetFltPortOsIsHostMac(PVBOXNETFLTINS pThis, PCRTMAC pMac)
    717 {
    718     return pThis->u.s.Mac.au16[0] == pMac->au16[0]
    719         && pThis->u.s.Mac.au16[1] == pMac->au16[1]
    720         && pThis->u.s.Mac.au16[2] == pMac->au16[2];
    721 }
    722 
    723723int vboxNetFltOsDisconnectIt(PVBOXNETFLTINS pThis)
    724724{
  • trunk/src/VBox/HostDrivers/VBoxNetFlt/linux/VBoxNetFlt-linux.c

    r28283 r28666  
    12811281
    12821282/**
     1283 * Helper that determins whether the host (ignoreing us) is operating the
     1284 * interface in promiscuous mode or not.
     1285 */
     1286static bool vboxNetFltLinuxPromiscuous(PVBOXNETFLTINS pThis)
     1287{
     1288    bool                fRc  = false;
     1289    struct net_device * pDev = vboxNetFltLinuxRetainNetDev(pThis);
     1290    if (pDev)
     1291    {
     1292        fRc = !!(pDev->promiscuity - (ASMAtomicUoReadBool(&pThis->u.s.fPromiscuousSet) & 1));
     1293        LogFlow(("vboxNetFltPortOsIsPromiscuous: returns %d, pDev->promiscuity=%d, fPromiscuousSet=%d\n",
     1294                 fRc, pDev->promiscuity, pThis->u.s.fPromiscuousSet));
     1295        vboxNetFltLinuxReleaseNetDev(pThis, pDev);
     1296    }
     1297    return fRc;
     1298}
     1299
     1300/**
    12831301 * Internal worker for vboxNetFltLinuxNotifierCallback.
    12841302 *
     
    13061324
    13071325    /* Get the mac address while we still have a valid net_device reference. */
    1308     memcpy(&pThis->u.s.Mac, pDev->dev_addr, sizeof(pThis->u.s.Mac));
     1326    memcpy(&pThis->u.s.MacAddr, pDev->dev_addr, sizeof(pThis->u.s.MacAddr));
    13091327
    13101328    /*
     
    13401358     */
    13411359    if (!pDev)
     1360    {
     1361        Assert(pThis->pSwitchPort);
    13421362        vboxNetFltLinuxReportNicGsoCapabilities(pThis);
     1363        pThis->pSwitchPort->pfnReportMacAddress(pThis->pSwitchPort, &pThis->u.s.MacAddr);
     1364        pThis->pSwitchPort->pfnReportPromiscuousMode(pThis->pSwitchPort, vboxNetFltLinuxPromiscuous(pThis));
     1365    }
    13431366    else
    13441367    {
     
    13531376    }
    13541377
    1355     LogRel(("VBoxNetFlt: attached to '%s' / %.*Rhxs\n", pThis->szName, sizeof(pThis->u.s.Mac), &pThis->u.s.Mac));
     1378    LogRel(("VBoxNetFlt: attached to '%s' / %.*Rhxs\n", pThis->szName, sizeof(pThis->u.s.MacAddr), &pThis->u.s.MacAddr));
    13561379    return VINF_SUCCESS;
    13571380}
     
    15551578
    15561579
    1557 bool vboxNetFltPortOsIsPromiscuous(PVBOXNETFLTINS pThis)
    1558 {
    1559     bool fRc = false;
    1560     struct net_device * pDev = vboxNetFltLinuxRetainNetDev(pThis);
    1561     if (pDev)
    1562     {
    1563         fRc = !!(pDev->promiscuity - (ASMAtomicUoReadBool(&pThis->u.s.fPromiscuousSet) & 1));
    1564         LogFlow(("vboxNetFltPortOsIsPromiscuous: returns %d, pDev->promiscuity=%d, fPromiscuousSet=%d\n",
    1565                  fRc, pDev->promiscuity, pThis->u.s.fPromiscuousSet));
    1566         vboxNetFltLinuxReleaseNetDev(pThis, pDev);
    1567     }
    1568     return fRc;
    1569 }
    1570 
    1571 
    1572 void vboxNetFltPortOsGetMacAddress(PVBOXNETFLTINS pThis, PRTMAC pMac)
    1573 {
    1574     *pMac = pThis->u.s.Mac;
    1575 }
    1576 
    1577 
    1578 bool vboxNetFltPortOsIsHostMac(PVBOXNETFLTINS pThis, PCRTMAC pMac)
    1579 {
    1580     /* ASSUMES that the MAC address never changes. */
    1581     return pThis->u.s.Mac.au16[0] == pMac->au16[0]
    1582         && pThis->u.s.Mac.au16[1] == pMac->au16[1]
    1583         && pThis->u.s.Mac.au16[2] == pMac->au16[2];
    1584 }
    1585 
    1586 
    15871580void vboxNetFltPortOsSetActive(PVBOXNETFLTINS pThis, bool fActive)
    15881581{
  • trunk/src/VBox/HostDrivers/VBoxNetFlt/solaris/VBoxNetFlt-solaris.c

    r28025 r28666  
    10561056                                    }
    10571057
    1058                                     bcopy(pMsg->b_rptr + cOffset, &pThis->u.s.Mac, sizeof(pThis->u.s.Mac));
     1058                                    bcopy(pMsg->b_rptr + cOffset, &pThis->u.s.MacAddr, sizeof(pThis->u.s.MacAddr));
    10591059                                    LogFlow((DEVICE_NAME ":VBoxNetFltSolarisModReadPut: DL_NOTE_PHYS_ADDR. New Mac=%.*Rhxs\n",
    1060                                         sizeof(pThis->u.s.Mac), &pThis->u.s.Mac));
     1060                                             sizeof(pThis->u.s.MacAddr), &pThis->u.s.MacAddr));
    10611061                                    break;
    10621062                                }
     
    13811381    AssertCompile(sizeof(RTMAC) == ETHERADDRL);
    13821382    dl_phys_addr_ack_t *pPhysAddrAck = (dl_phys_addr_ack_t *)pMsg->b_rptr;
    1383     if (pPhysAddrAck->dl_addr_length == sizeof(pThis->u.s.Mac))
    1384     {
    1385         bcopy(pMsg->b_rptr + pPhysAddrAck->dl_addr_offset, &pThis->u.s.Mac, sizeof(pThis->u.s.Mac));
    1386 
    1387         LogFlow((DEVICE_NAME ":vboxNetFltSolarisCachePhysAddr: DL_PHYS_ADDR_ACK: Mac=%.*Rhxs\n", sizeof(pThis->u.s.Mac),
    1388                     &pThis->u.s.Mac));
     1383    if (pPhysAddrAck->dl_addr_length == sizeof(pThis->u.s.MacAddr))
     1384    {
     1385        bcopy(pMsg->b_rptr + pPhysAddrAck->dl_addr_offset, &pThis->u.s.MacAddr, sizeof(pThis->u.s.MacAddr));
     1386
     1387        LogFlow((DEVICE_NAME ":vboxNetFltSolarisCachePhysAddr: DL_PHYS_ADDR_ACK: Mac=%.*Rhxs\n",
     1388                 sizeof(pThis->u.s.MacAddr), &pThis->u.s.Mac));
     1389
     1390        vboxNetFltRetain(pThis, true /*fBusy*/);
     1391        Assert(pThis->pSwitchPort);
     1392        if (pThis->pSwitchPort)
     1393            pThis->pSwitchPort->pfnReportMacAddress(pThis->pSwitchPort, &pThis->u.s.MacAddr);
     1394        vboxNetFltRelease(pThis, true /*fBusy*/);
    13891395    }
    13901396    else
     
    26072613
    26082614            /*
     2615             * Report promiscuousness and capabilities.
     2616             */
     2617            Assert(pThis->pSwitchPort);
     2618            /** @todo There is no easy way of obtaining the global host side promiscuous
     2619             * counter. Currently we just return false.  */
     2620            pThis->pSwitchPort->pfnReportPromiscuousMode(pThis->pSwitchPort, false);
     2621            pThis->pSwitchPort->pfnReportGsoCapabilities(pThis->pSwitchPort, 0,  INTNETTRUNKDIR_WIRE | INTNETTRUNKDIR_HOST);
     2622
     2623            /*
    26092624             * Ipv4 is successful, and maybe Ipv6, we're ready for transfers.
    26102625             */
    26112626            ASMAtomicWriteBool(&pThis->fDisconnectedFromHost, false);
     2627
    26122628            return VINF_SUCCESS;
    26132629        }
     
    28442860
    28452861            bcopy(pMsg->b_rptr + pDlpiMsg->dl_dest_addr_offset, &EthHdr.DstMac, sizeof(EthHdr.DstMac));
    2846             bcopy(&pThis->u.s.Mac, &EthHdr.SrcMac, sizeof(EthHdr.SrcMac));
     2862            bcopy(&pThis->u.s.MacAddr, &EthHdr.SrcMac, sizeof(EthHdr.SrcMac));
    28472863
    28482864            vboxnetflt_dladdr_t *pDLSapAddr = (vboxnetflt_dladdr_t *)(pMsg->b_rptr + pDlpiMsg->dl_dest_addr_offset);
     
    31273143
    31283144/**
     3145 * Helper.
     3146 */
     3147DECLINLINE(bool) vboxNetFltPortSolarisIsHostMac(PVBOXNETFLTINS pThis, PCRTMAC pMac)
     3148{
     3149    /*
     3150     * MAC address change acknowledgements are intercepted on the read side
     3151     * hence theoritically we are always update to date with any changes.
     3152     */
     3153    return pThis->u.s.MacAddr.au16[0] == pMac->au16[0]
     3154        && pThis->u.s.MacAddr.au16[1] == pMac->au16[1]
     3155        && pThis->u.s.MacAddr.au16[2] == pMac->au16[2];
     3156}
     3157
     3158
     3159/**
    31293160 * Worker for routing messages from the wire or from the host.
    31303161 *
     
    31883219    uint32_t fSrc = INTNETTRUNKDIR_WIRE;
    31893220    PRTNETETHERHDR pEthHdr = (PRTNETETHERHDR)pMsg->b_rptr;
    3190     if (vboxNetFltPortOsIsHostMac(pThis, &pEthHdr->SrcMac))
     3221    if (vboxNetFltPortSolarisIsHostMac(pThis, &pEthHdr->SrcMac))
    31913222        fSrc = INTNETTRUNKDIR_HOST;
    31923223
     
    34313462
    34323463/* -=-=-=-=-=- Common Hooks -=-=-=-=-=- */
    3433 bool vboxNetFltPortOsIsPromiscuous(PVBOXNETFLTINS pThis)
    3434 {
    3435     /*
    3436      * There is no easy way of obtaining the global host side promiscuous counter.
    3437      * Currently we just return false.
    3438      */
    3439     return false;
    3440 }
    3441 
    3442 
    3443 void vboxNetFltPortOsGetMacAddress(PVBOXNETFLTINS pThis, PRTMAC pMac)
    3444 {
    3445     LogFlowFunc((DEVICE_NAME ":vboxNetFltPortOsGetMacAddress pThis=%p\n", pThis));
    3446     *pMac = pThis->u.s.Mac;
    3447 }
    3448 
    3449 
    3450 bool vboxNetFltPortOsIsHostMac(PVBOXNETFLTINS pThis, PCRTMAC pMac)
    3451 {
    3452     /*
    3453      * MAC address change acknowledgements are intercepted on the read side
    3454      * hence theoritically we are always update to date with any changes.
    3455      */
    3456     return pThis->u.s.Mac.au16[0] == pMac->au16[0]
    3457         && pThis->u.s.Mac.au16[1] == pMac->au16[1]
    3458         && pThis->u.s.Mac.au16[2] == pMac->au16[2];
    3459 }
     3464
    34603465
    34613466
     
    35763581    pThis->u.s.hPollMtx = NIL_RTSEMFASTMUTEX;
    35773582#endif
    3578     bzero(&pThis->u.s.Mac, sizeof(pThis->u.s.Mac));
     3583    bzero(&pThis->u.s.MacAddr, sizeof(pThis->u.s.MacAddr));
    35793584    return VINF_SUCCESS;
    35803585}
  • trunk/src/VBox/HostDrivers/VBoxNetFlt/solaris/VBoxNetFltBow-solaris.c

    r28025 r28666  
    594594
    595595/**
     596 * Helper.
     597 */
     598DECLINLINE(bool) vboxNetFltPortSolarisIsHostMac(PVBOXNETFLTINS pThis, PCRTMAC pMac)
     599{
     600    return pThis->u.s.MacAddr.au16[0] == pMac->au16[0]
     601        && pThis->u.s.MacAddr.au16[1] == pMac->au16[1]
     602        && pThis->u.s.MacAddr.au16[2] == pMac->au16[2];
     603}
     604
     605
     606/**
    596607 * Receive (rx) entry point.
    597608 *
     
    624635    PRTNETETHERHDR pEthHdr = (PRTNETETHERHDR)pMsg->b_rptr;
    625636    if (   MBLKL(pMsg) >= sizeof(RTNETETHERHDR)
    626         && vboxNetFltPortOsIsHostMac(pThis, &pEthHdr->SrcMac))
     637        && vboxNetFltPortSolarisIsHostMac(pThis, &pEthHdr->SrcMac))
    627638        fSrc = INTNETTRUNKDIR_HOST;
    628639
     
    798809                     */
    799810                    AssertCompile(sizeof(RTMAC) == ETHERADDRL);
    800                     mac_unicast_primary_get(pThis->u.s.hInterface, (uint8_t *)&pThis->u.s.Mac.au8);
     811                    mac_unicast_primary_get(pThis->u.s.hInterface, (uint8_t *)&pThis->u.s.MacAddr.au8);
    801812
    802813                    LogFlow((DEVICE_NAME ":vboxNetFltSolarisAttachToInterface MAC address of %s is %.*Rhxs\n", pThis->szName,
    803                                     sizeof(pThis->u.s.Mac), &pThis->u.s.Mac));
     814                             sizeof(pThis->u.s.MacAddr), &pThis->u.s.MacAddr));
    804815
    805816                    /** @todo Obtain the MTU size using mac_sdu_get() */
     
    830841                        if (!rc)
    831842                        {
     843                            /*
     844                             * Report MAC address, promiscuous mode and capabilities.
     845                             */
     846                            Assert(pThis->pSwitchPort);
     847                            pThis->pSwitchPort->pfnReportMacAddress(pThis->pSwitchPort, &pThis->u.s.MacAddr);
     848                            pThis->pSwitchPort->pfnReportPromiscuousMode(pThis->pSwitchPort, false); /** @todo Promisc */
     849                            pThis->pSwitchPort->pfnReportGsoCapabilities(pThis->pSwitchPort, 0, INTNETTRUNKDIR_WIRE | INTNETTRUNKDIR_HOST);
     850
     851
    832852                            LogFlow((DEVICE_NAME ":vboxNetFltSolarisAttachToInterface successfully attached over '%s'\n", pThis->szName));
    833853                            return VINF_SUCCESS;
    834854                        }
    835                         else
    836                             LogRel((DEVICE_NAME ":vboxNetFltSolarisAttachToInterface failed to set client MAC address over link '%s' rc=%d\n",
    837                                     pThis->szName, rc));
     855
     856                        LogRel((DEVICE_NAME ":vboxNetFltSolarisAttachToInterface failed to set client MAC address over link '%s' rc=%d\n",
     857                                pThis->szName, rc));
    838858
    839859                        mac_client_close(pThis->u.s.hClient, 0 /* fFlags */);
     
    928948
    929949/* -=-=-=-=-=- Common Hooks -=-=-=-=-=- */
    930 bool vboxNetFltPortOsIsPromiscuous(PVBOXNETFLTINS pThis)
    931 {
    932     LogFlow((DEVICE_NAME ":vboxNetFltPortOsIsPromiscuous pThis=%p\n", pThis));
    933     return false;
    934 }
    935 
    936 
    937 void vboxNetFltPortOsGetMacAddress(PVBOXNETFLTINS pThis, PRTMAC pMac)
    938 {
    939     LogFlow((DEVICE_NAME ":vboxNetFltPortOsGetMacAddress pThis=%p\n", pThis));
    940     *pMac = pThis->u.s.Mac;
    941     return;
    942 }
    943 
    944 
    945 bool vboxNetFltPortOsIsHostMac(PVBOXNETFLTINS pThis, PCRTMAC pMac)
    946 {
    947     /** @todo What happens when the MAC address of the underlying NIC changes?? */
    948     return pThis->u.s.Mac.au16[0] == pMac->au16[0]
    949         && pThis->u.s.Mac.au16[1] == pMac->au16[1]
    950         && pThis->u.s.Mac.au16[2] == pMac->au16[2];
    951 }
    952950
    953951
     
    10231021    pThis->u.s.hUnicast = NULL;
    10241022    pThis->u.s.hPromiscuous = NULL;
    1025     bzero(&pThis->u.s.Mac, sizeof(pThis->u.s.Mac));
     1023    bzero(&pThis->u.s.MacAddr, sizeof(pThis->u.s.MacAddr));
    10261024    return VINF_SUCCESS;
    10271025}
  • trunk/src/VBox/HostDrivers/VBoxNetFlt/win/VBoxNetFlt-win.c

    r28070 r28666  
    14901490DECLHIDDEN(NDIS_STATUS) vboxNetFltWinSetPromiscuous(PADAPT pAdapt, bool bYes)
    14911491{
     1492/** @todo Need to report changes to the switch via:
     1493 *  pThis->pSwitchPort->pfnReportPromiscuousMode(pThis->pSwitchPort, fPromisc);
     1494 */
    14921495    Assert(VBOXNETFLT_PROMISCUOUS_SUPPORTED(pAdapt));
    14931496    if(VBOXNETFLT_PROMISCUOUS_SUPPORTED(pAdapt))
     
    31523155}
    31533156
     3157
     3158/**
     3159 * Checks if the host (not us) has put the adapter in promiscuous mode.
     3160 *
     3161 * @returns true if promiscuous, false if not.
     3162 * @param   pThis               The instance.
     3163 */
     3164static bool vboxNetFltWinIsPromiscuous2(PVBOXNETFLTINS pThis)
     3165{
     3166#ifndef VBOXNETADP
     3167    PADAPT pAdapt = PVBOXNETFLTINS_2_PADAPT(pThis);
     3168    if(VBOXNETFLT_PROMISCUOUS_SUPPORTED(pAdapt))
     3169    {
     3170        bool bPromiscuous;
     3171        if(!vboxNetFltWinReferenceAdapt(pAdapt))
     3172            return false;
     3173
     3174        bPromiscuous = (pAdapt->fUpperProtocolSetFilter & NDIS_PACKET_TYPE_PROMISCUOUS) == NDIS_PACKET_TYPE_PROMISCUOUS;
     3175            /*vboxNetFltWinIsPromiscuous(pAdapt);*/
     3176
     3177        vboxNetFltWinDereferenceAdapt(pAdapt);
     3178        return bPromiscuous;
     3179    }
     3180    return false;
     3181#else
     3182    return true;
     3183#endif
     3184}
     3185
    31543186/**
    31553187 * Worker for vboxNetFltWinAttachToInterface.
     
    32413273                            vboxNetFltRelease(pThis, false);
    32423274
     3275                            /* 5. Report MAC address, promiscuousness and GSO capabilities. */
     3276                            /** @todo Keep these up to date, esp. the promiscuous mode bit. */
     3277                            if (pThis->pSwitchPort)
     3278                            {
     3279                                pThis->pSwitchPort->pfnReportMacAddress(pThis->pSwitchPort, &pThis->u.s.MacAddr);
     3280                                pThis->pSwitchPort->pfnReportPromiscuousMode(pThis->pSwitchPort,
     3281                                                                             vboxNetFltWinIsPromiscuous2(pThis));
     3282                                pThis->pSwitchPort->pfnReportGsoCapabilities(pThis->pSwitchPort, 0,
     3283                                                                             INTNETTRUNKDIR_WIRE | INTNETTRUNKDIR_HOST);
     3284                            }
    32433285                            return;
    32443286                        }
     
    32843326            }
    32853327
    3286             Status = vboxNetFltWinGetMacAddress(pAdapt, &pThis->u.s.Mac);
     3328            Status = vboxNetFltWinGetMacAddress(pAdapt, &pThis->u.s.MacAddr);
    32873329            if (Status != NDIS_STATUS_SUCCESS)
    32883330            {
     
    34633505}
    34643506
    3465 bool vboxNetFltPortOsIsPromiscuous(PVBOXNETFLTINS pThis)
    3466 {
    3467 #ifndef VBOXNETADP
    3468     PADAPT pAdapt = PVBOXNETFLTINS_2_PADAPT(pThis);
    3469     if(VBOXNETFLT_PROMISCUOUS_SUPPORTED(pAdapt))
    3470     {
    3471         bool bPromiscuous;
    3472         if(!vboxNetFltWinReferenceAdapt(pAdapt))
    3473             return false;
    3474 
    3475         bPromiscuous = (pAdapt->fUpperProtocolSetFilter & NDIS_PACKET_TYPE_PROMISCUOUS) == NDIS_PACKET_TYPE_PROMISCUOUS;
    3476             /*vboxNetFltWinIsPromiscuous(pAdapt);*/
    3477 
    3478         vboxNetFltWinDereferenceAdapt(pAdapt);
    3479         return bPromiscuous;
    3480     }
    3481     return false;
    3482 #else
    3483     return true;
    3484 #endif
    3485 }
    3486 
    3487 void vboxNetFltPortOsGetMacAddress(PVBOXNETFLTINS pThis, PRTMAC pMac)
    3488 {
    3489     *pMac = pThis->u.s.Mac;
    3490 }
    3491 
    3492 bool vboxNetFltPortOsIsHostMac(PVBOXNETFLTINS pThis, PCRTMAC pMac)
    3493 {
    3494     /* ASSUMES that the MAC address never changes. */
    3495     return pThis->u.s.Mac.au16[0] == pMac->au16[0]
    3496         && pThis->u.s.Mac.au16[1] == pMac->au16[1]
    3497         && pThis->u.s.Mac.au16[2] == pMac->au16[2];
    3498 }
    3499 
    35003507void vboxNetFltPortOsSetActive(PVBOXNETFLTINS pThis, bool fActive)
    35013508{
     
    36333640    {
    36343641#ifndef VBOXNETADP
    3635         Status = vboxNetFltWinGetMacAddress(pAdapt, &pInstance->u.s.Mac);
     3642        Status = vboxNetFltWinGetMacAddress(pAdapt, &pInstance->u.s.MacAddr);
    36363643        if (Status == NDIS_STATUS_SUCCESS)
    36373644#endif
Note: See TracChangeset for help on using the changeset viewer.

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