Index: trunk/src/VBox/HostDrivers/VBoxNetAdp/VBoxNetAdp.c
===================================================================
--- trunk/src/VBox/HostDrivers/VBoxNetAdp/VBoxNetAdp.c	(revision 28663)
+++ trunk/src/VBox/HostDrivers/VBoxNetAdp/VBoxNetAdp.c	(revision 28666)
@@ -441,7 +441,7 @@
 
 /**
- * @copydoc INTNETTRUNKIFPORT::pfnIsPromiscuous
- */
-static DECLCALLBACK(bool) vboxNetAdpPortIsPromiscuous(PINTNETTRUNKIFPORT pIfPort)
+ * @copydoc INTNETTRUNKIFPORT::pfnGetMacAddress
+ */
+static DECLCALLBACK(void) vboxNetAdpPortGetMacAddress(PINTNETTRUNKIFPORT pIfPort, PRTMAC pMac)
 {
     PVBOXNETADP pThis = IFPORT_2_VBOXNETADP(pIfPort);
@@ -455,49 +455,7 @@
 
     /*
-     * Ask the OS specific code.
-     */
-    return vboxNetAdpPortOsIsPromiscuous(pThis);
-}
-
-
-/**
- * @copydoc INTNETTRUNKIFPORT::pfnGetMacAddress
- */
-static DECLCALLBACK(void) vboxNetAdpPortGetMacAddress(PINTNETTRUNKIFPORT pIfPort, PRTMAC pMac)
-{
-    PVBOXNETADP pThis = IFPORT_2_VBOXNETADP(pIfPort);
-
-    /*
-     * Input validation.
-     */
-    AssertPtr(pThis);
-    Assert(pThis->MyPort.u32Version == INTNETTRUNKIFPORT_VERSION);
-    Assert(vboxNetAdpGetStateWithLock(pThis) == kVBoxNetAdpState_Active);
-
-    /*
      * Forward the question to the OS specific code.
      */
     vboxNetAdpPortOsGetMacAddress(pThis, pMac);
-}
-
-
-/**
- * @copydoc INTNETTRUNKIFPORT::pfnIsHostMac
- */
-static DECLCALLBACK(bool) vboxNetAdpPortIsHostMac(PINTNETTRUNKIFPORT pIfPort, PCRTMAC pMac)
-{
-    PVBOXNETADP pThis = IFPORT_2_VBOXNETADP(pIfPort);
-
-    /*
-     * Input validation.
-     */
-    AssertPtr(pThis);
-    Assert(pThis->MyPort.u32Version == INTNETTRUNKIFPORT_VERSION);
-    Assert(vboxNetAdpGetStateWithLock(pThis) == kVBoxNetAdpState_Active);
-
-    /*
-     * Ask the OS specific code.
-     */
-    return vboxNetAdpPortOsIsHostMac(pThis, pMac);
 }
 
@@ -891,6 +849,4 @@
     pNew->MyPort.pfnWaitForIdle         = vboxNetAdpPortWaitForIdle;
     pNew->MyPort.pfnGetMacAddress       = vboxNetAdpPortGetMacAddress;
-    pNew->MyPort.pfnIsHostMac           = vboxNetAdpPortIsHostMac;
-    pNew->MyPort.pfnIsPromiscuous       = vboxNetAdpPortIsPromiscuous;
     pNew->MyPort.pfnXmit                = vboxNetAdpPortXmit;
     pNew->MyPort.u32VersionEnd          = INTNETTRUNKIFPORT_VERSION;
Index: trunk/src/VBox/HostDrivers/VBoxNetFlt/VBoxNetFlt.c
===================================================================
--- trunk/src/VBox/HostDrivers/VBoxNetFlt/VBoxNetFlt.c	(revision 28663)
+++ trunk/src/VBox/HostDrivers/VBoxNetFlt/VBoxNetFlt.c	(revision 28666)
@@ -415,71 +415,4 @@
 
 /**
- * @copydoc INTNETTRUNKIFPORT::pfnIsPromiscuous
- */
-static DECLCALLBACK(bool) vboxNetFltPortIsPromiscuous(PINTNETTRUNKIFPORT pIfPort)
-{
-    PVBOXNETFLTINS pThis = IFPORT_2_VBOXNETFLTINS(pIfPort);
-
-    /*
-     * Input validation.
-     */
-    AssertPtr(pThis);
-    Assert(pThis->MyPort.u32Version == INTNETTRUNKIFPORT_VERSION);
-    Assert(vboxNetFltGetState(pThis) == kVBoxNetFltInsState_Connected);
-    /* No fActive check here. */
-
-    /*
-     * Ask the OS specific code.
-     */
-    return vboxNetFltPortOsIsPromiscuous(pThis);
-}
-
-
-/**
- * @copydoc INTNETTRUNKIFPORT::pfnGetMacAddress
- */
-static DECLCALLBACK(void) vboxNetFltPortGetMacAddress(PINTNETTRUNKIFPORT pIfPort, PRTMAC pMac)
-{
-    PVBOXNETFLTINS pThis = IFPORT_2_VBOXNETFLTINS(pIfPort);
-
-    /*
-     * Input validation.
-     */
-    AssertPtr(pThis);
-    Assert(pThis->MyPort.u32Version == INTNETTRUNKIFPORT_VERSION);
-    Assert(vboxNetFltGetState(pThis) == kVBoxNetFltInsState_Connected);
-    /* No fActive check here. */
-
-    /*
-     * Forward the question to the OS specific code.
-     */
-    vboxNetFltPortOsGetMacAddress(pThis, pMac);
-}
-
-
-/**
- * @copydoc INTNETTRUNKIFPORT::pfnIsHostMac
- */
-static DECLCALLBACK(bool) vboxNetFltPortIsHostMac(PINTNETTRUNKIFPORT pIfPort, PCRTMAC pMac)
-{
-    PVBOXNETFLTINS pThis = IFPORT_2_VBOXNETFLTINS(pIfPort);
-
-    /*
-     * Input validation.
-     */
-    AssertPtr(pThis);
-    Assert(pThis->MyPort.u32Version == INTNETTRUNKIFPORT_VERSION);
-    Assert(vboxNetFltGetState(pThis) == kVBoxNetFltInsState_Connected);
-/** @todo Assert(pThis->fActive); - disabled because we may call this
- *        without holding the out-bound lock and race the clearing. */
-
-    /*
-     * Ask the OS specific code.
-     */
-    return vboxNetFltPortOsIsHostMac(pThis, pMac);
-}
-
-
-/**
  * @copydoc INTNETTRUNKIFPORT::pfnWaitForIdle
  */
@@ -553,5 +486,5 @@
 {
     PVBOXNETFLTINS pThis = IFPORT_2_VBOXNETFLTINS(pIfPort);
-    RTSPINLOCKTMP Tmp = RTSPINLOCKTMP_INITIALIZER;
+    RTSPINLOCKTMP  Tmp   = RTSPINLOCKTMP_INITIALIZER;
 
     /*
@@ -846,10 +779,7 @@
     pNew->MyPort.pfnSetActive           = vboxNetFltPortSetActive;
     pNew->MyPort.pfnWaitForIdle         = vboxNetFltPortWaitForIdle;
-    pNew->MyPort.pfnGetMacAddress       = vboxNetFltPortGetMacAddress;
-    pNew->MyPort.pfnIsHostMac           = vboxNetFltPortIsHostMac;
-    pNew->MyPort.pfnIsPromiscuous       = vboxNetFltPortIsPromiscuous;
     pNew->MyPort.pfnXmit                = vboxNetFltPortXmit;
     pNew->MyPort.u32VersionEnd          = INTNETTRUNKIFPORT_VERSION;
-    pNew->pSwitchPort                   = NULL;
+    pNew->pSwitchPort                   = pSwitchPort;
     pNew->pGlobals                      = pGlobals;
     pNew->hSpinlock                     = NIL_RTSPINLOCK;
Index: trunk/src/VBox/HostDrivers/VBoxNetFlt/VBoxNetFltInternal.h
===================================================================
--- trunk/src/VBox/HostDrivers/VBoxNetFlt/VBoxNetFltInternal.h	(revision 28663)
+++ trunk/src/VBox/HostDrivers/VBoxNetFlt/VBoxNetFltInternal.h	(revision 28666)
@@ -131,4 +131,5 @@
     RTSEMEVENT hEventIdle;
 
+    /** @todo move MacAddr out of this structure!  */
     union
     {
@@ -153,5 +154,5 @@
             bool volatile fSetPromiscuous;
             /** The MAC address of the interface. */
-            RTMAC Mac;
+            RTMAC MacAddr;
             /** @} */
 # elif defined(RT_OS_LINUX)
@@ -166,5 +167,5 @@
             bool volatile fRegistered;
             /** The MAC address of the interface. */
-            RTMAC Mac;
+            RTMAC MacAddr;
             struct notifier_block Notifier;
             struct packet_type    PacketType;
@@ -191,5 +192,5 @@
             mac_promisc_handle_t hPromiscuous;
             /** The MAC address of the interface */
-            RTMAC Mac;
+            RTMAC MacAddr;
 #  else
             /** Pointer to the bound IPv4 stream. */
@@ -206,5 +207,5 @@
             ldi_handle_t hIface;
             /** The MAC address of the interface. */
-            RTMAC Mac;
+            RTMAC MacAddr;
             /** Mutex protection used for loopback. */
             RTSEMFASTMUTEX hFastMtx;
@@ -235,5 +236,5 @@
             struct task tskout;
             /** The MAC address of the interface. */
-            RTMAC Mac;
+            RTMAC MacAddr;
             /** @} */
 # elif defined(RT_OS_WINDOWS)
@@ -249,5 +250,5 @@
             PACKET_QUEUE_WORKER PacketQueueWorker;
             /** The MAC address of the interface. Caching MAC for performance reasons. */
-            RTMAC Mac;
+            RTMAC MacAddr;
             /** mutex used to synchronize ADAPT init/deinit */
             RTSEMMUTEX hAdaptMutex;
@@ -361,47 +362,4 @@
 
 /**
- * Checks if the interface is in promiscuous mode from the host perspective.
- *
- * If it is, then the internal networking switch will send frames
- * heading for the wire to the host as well.
- *
- * @see INTNETTRUNKIFPORT::pfnIsPromiscuous for more details.
- *
- * @returns true / false accordingly.
- * @param   pThis           The instance.
- *
- * @remarks Owns the network lock and the out-bound trunk port semaphores.
- */
-DECLHIDDEN(bool) vboxNetFltPortOsIsPromiscuous(PVBOXNETFLTINS pThis);
-
-/**
- * Get the MAC address of the interface we're attached to.
- *
- * Used by the internal networking switch for implementing the
- * shared-MAC-on-the-wire mode.
- *
- * @param   pThis           The instance.
- * @param   pMac            Where to store the MAC address.
- *                          If you don't know, set all the bits except the first (the multicast one).
- *
- * @remarks Owns the network lock and the out-bound trunk port semaphores.
- */
-DECLHIDDEN(void) vboxNetFltPortOsGetMacAddress(PVBOXNETFLTINS pThis, PRTMAC pMac);
-
-/**
- * Checks if the specified MAC address is for any of the host interfaces.
- *
- * Used by the internal networking switch to decide the destination(s)
- * of a frame.
- *
- * @returns true / false accordingly.
- * @param   pThis           The instance.
- * @param   pMac            The MAC address.
- *
- * @remarks Owns the network lock and the out-bound trunk port semaphores.
- */
-DECLHIDDEN(bool) vboxNetFltPortOsIsHostMac(PVBOXNETFLTINS pThis, PCRTMAC pMac);
-
-/**
  * This is called when activating or suspending the instance.
  *
@@ -451,4 +409,7 @@
  * after linking the instance into the list.
  *
+ * The MAC address as well promiscuousness and GSO capabilities should be
+ * reported by this function.
+ *
  * @return  IPRT status code.
  * @param   pThis           The new instance.
Index: trunk/src/VBox/HostDrivers/VBoxNetFlt/darwin/VBoxNetFlt-darwin.cpp
===================================================================
--- trunk/src/VBox/HostDrivers/VBoxNetFlt/darwin/VBoxNetFlt-darwin.cpp	(revision 28663)
+++ trunk/src/VBox/HostDrivers/VBoxNetFlt/darwin/VBoxNetFlt-darwin.cpp	(revision 28666)
@@ -615,4 +615,29 @@
     AssertMsg(!pvFrame, ("pvFrame=%p pMBuf=%p iSeg=%d\n", pvFrame, pMBuf, iSeg));
 }
+
+
+/**
+ * Helper for determining whether the host wants the interface to be
+ * promiscuous.
+ */
+static bool vboxNetFltDarwinIsPromiscuous(PVBOXNETFLTINS pThis)
+{
+    bool fRc = false;
+    ifnet_t pIfNet = vboxNetFltDarwinRetainIfNet(pThis);
+    if (pIfNet)
+    {
+        /* gather the data */
+        uint16_t fIf = ifnet_flags(pIfNet);
+        unsigned cPromisc = VBOX_GET_PCOUNT(pIfNet);
+        bool fSetPromiscuous = ASMAtomicUoReadBool(&pThis->u.s.fSetPromiscuous);
+        vboxNetFltDarwinReleaseIfNet(pThis, pIfNet);
+
+        /* calc the return. */
+        fRc = (fIf & IFF_PROMISC)
+           && cPromisc > fSetPromiscuous;
+    }
+    return fRc;
+}
+
 
 
@@ -751,4 +776,6 @@
             else if (pEvMsg->event_code == KEV_DL_LINK_OFF)
                 Log(("vboxNetFltDarwinIffEvent: %s goes down (%d)\n", pThis->szName, VBOX_GET_PCOUNT(pIfNet)));
+/** @todo KEV_DL_LINK_ADDRESS_CHANGED  -> pfnReportMacAddress */
+/** @todo KEV_DL_SIFFLAGS              -> pfnReportPromiscuousMode */
         }
         else
@@ -903,5 +930,5 @@
      * Get the mac address while we still have a valid ifnet reference.
      */
-    err = ifnet_lladdr_copy_bytes(pIfNet, &pThis->u.s.Mac, sizeof(pThis->u.s.Mac));
+    err = ifnet_lladdr_copy_bytes(pIfNet, &pThis->u.s.MacAddr, sizeof(pThis->u.s.MacAddr));
     if (!err)
     {
@@ -931,4 +958,13 @@
         }
         RTSpinlockRelease(pThis->hSpinlock, &Tmp);
+
+        /* Report capabilities. */
+        if (!pIfNet)
+        {
+            Assert(pThis->pSwitchPort);
+            pThis->pSwitchPort->pfnReportMacAddress(pThis->pSwitchPort, &pThis->u.s.MacAddr);
+            pThis->pSwitchPort->pfnReportPromiscuousMode(pThis->pSwitchPort, vboxNetFltDarwinIsPromiscuous(pThis));
+            pThis->pSwitchPort->pfnReportGsoCapabilities(pThis->pSwitchPort, 0,  INTNETTRUNKDIR_WIRE | INTNETTRUNKDIR_HOST);
+        }
     }
 
@@ -939,5 +975,5 @@
     int rc = RTErrConvertFromErrno(err);
     if (RT_SUCCESS(rc))
-        LogRel(("VBoxFltDrv: attached to '%s' / %.*Rhxs\n", pThis->szName, sizeof(pThis->u.s.Mac), &pThis->u.s.Mac));
+        LogRel(("VBoxFltDrv: attached to '%s' / %.*Rhxs\n", pThis->szName, sizeof(pThis->u.s.MacAddr), &pThis->u.s.MacAddr));
     else
         LogRel(("VBoxFltDrv: failed to attach to ifnet '%s' (err=%d)\n", pThis->szName, err));
@@ -1002,39 +1038,4 @@
 
     return rc;
-}
-
-
-bool vboxNetFltPortOsIsPromiscuous(PVBOXNETFLTINS pThis)
-{
-    bool fRc = false;
-    ifnet_t pIfNet = vboxNetFltDarwinRetainIfNet(pThis);
-    if (pIfNet)
-    {
-        /* gather the data */
-        uint16_t fIf = ifnet_flags(pIfNet);
-        unsigned cPromisc = VBOX_GET_PCOUNT(pIfNet);
-        bool fSetPromiscuous = ASMAtomicUoReadBool(&pThis->u.s.fSetPromiscuous);
-        vboxNetFltDarwinReleaseIfNet(pThis, pIfNet);
-
-        /* calc the return. */
-        fRc = (fIf & IFF_PROMISC)
-           && cPromisc > fSetPromiscuous;
-    }
-    return fRc;
-}
-
-
-void vboxNetFltPortOsGetMacAddress(PVBOXNETFLTINS pThis, PRTMAC pMac)
-{
-    *pMac = pThis->u.s.Mac;
-}
-
-
-bool vboxNetFltPortOsIsHostMac(PVBOXNETFLTINS pThis, PCRTMAC pMac)
-{
-    /* ASSUMES that the MAC address never changes. */
-    return pThis->u.s.Mac.au16[0] == pMac->au16[0]
-        && pThis->u.s.Mac.au16[1] == pMac->au16[1]
-        && pThis->u.s.Mac.au16[2] == pMac->au16[2];
 }
 
@@ -1192,5 +1193,5 @@
     pThis->u.s.fSetPromiscuous = false;
     pThis->u.s.fNeedSetPromiscuous = false;
-    //pThis->u.s.Mac = {0};
+    //pThis->u.s.MacAddr = {0};
 
     return VINF_SUCCESS;
Index: trunk/src/VBox/HostDrivers/VBoxNetFlt/freebsd/VBoxNetFlt-freebsd.c
===================================================================
--- trunk/src/VBox/HostDrivers/VBoxNetFlt/freebsd/VBoxNetFlt-freebsd.c	(revision 28663)
+++ trunk/src/VBox/HostDrivers/VBoxNetFlt/freebsd/VBoxNetFlt-freebsd.c	(revision 28666)
@@ -525,4 +525,11 @@
 }
 
+static bool vboxNetFltFreeBsdIsPromiscuous(PVBOXNETFLTINS pThis)
+{
+    /** @todo This isn't taking into account that we put the interface in
+     *        promiscuous mode.  */
+    return (pThis->u.s.flags & IFF_PROMISC) ? true : false;
+}
+
 int vboxNetFltOsInitInstance(PVBOXNETFLTINS pThis, void *pvContext)
 {
@@ -544,6 +551,7 @@
     ASMAtomicUoWritePtr((void * volatile *)&pThis->u.s.ifp, ifp);
     pThis->u.s.node = node;
-    bcopy(IF_LLADDR(ifp), &pThis->u.s.Mac, ETHER_ADDR_LEN);
+    bcopy(IF_LLADDR(ifp), &pThis->u.s.MacAddr, ETHER_ADDR_LEN);
     ASMAtomicUoWriteBool(&pThis->fDisconnectedFromHost, false);
+
     /* Initialize deferred input queue */
     bzero(&pThis->u.s.inq, sizeof(struct ifqueue));
@@ -559,7 +567,16 @@
 
     NG_NODE_SET_PRIVATE(node, pThis);
+
     /* Attempt to name it vboxnetflt_<ifname> */
     snprintf(nam, NG_NODESIZ, "vboxnetflt_%s", pThis->szName);
     ng_name_node(node, nam);
+
+    /* Report MAC address, promiscuous mode and GSO capabilities. */
+    /** @todo keep these reports up to date, either by polling for changes or
+     *        intercept some control flow if possible. */
+    Assert(pThis->pSwitchPort);
+    pThis->pSwitchPort->pfnReportMacAddress(pThis->pSwitchPort, &pThis->u.s.MacAddr);
+    pThis->pSwitchPort->pfnReportPromiscuousMode(pThis->pSwitchPort, vboxNetFltFreeBsdIsPromiscuous(pThis));
+    pThis->pSwitchPort->pfnReportGsoCapabilities(pThis->pSwitchPort, 0, INTNETTRUNKDIR_WIRE | INTNETTRUNKDIR_HOST);
 
     return VINF_SUCCESS;
@@ -704,21 +721,4 @@
 }
 
-bool vboxNetFltPortOsIsPromiscuous(PVBOXNETFLTINS pThis)
-{
-    return (pThis->u.s.flags & IFF_PROMISC) ? true : false;
-}
-
-void vboxNetFltPortOsGetMacAddress(PVBOXNETFLTINS pThis, PRTMAC pMac)
-{
-    *pMac = pThis->u.s.Mac;
-}
-
-bool vboxNetFltPortOsIsHostMac(PVBOXNETFLTINS pThis, PCRTMAC pMac)
-{
-    return pThis->u.s.Mac.au16[0] == pMac->au16[0]
-        && pThis->u.s.Mac.au16[1] == pMac->au16[1]
-        && pThis->u.s.Mac.au16[2] == pMac->au16[2];
-}
-
 int vboxNetFltOsDisconnectIt(PVBOXNETFLTINS pThis)
 {
Index: trunk/src/VBox/HostDrivers/VBoxNetFlt/linux/VBoxNetFlt-linux.c
===================================================================
--- trunk/src/VBox/HostDrivers/VBoxNetFlt/linux/VBoxNetFlt-linux.c	(revision 28663)
+++ trunk/src/VBox/HostDrivers/VBoxNetFlt/linux/VBoxNetFlt-linux.c	(revision 28666)
@@ -1281,4 +1281,22 @@
 
 /**
+ * Helper that determins whether the host (ignoreing us) is operating the
+ * interface in promiscuous mode or not.
+ */
+static bool vboxNetFltLinuxPromiscuous(PVBOXNETFLTINS pThis)
+{
+    bool                fRc  = false;
+    struct net_device * pDev = vboxNetFltLinuxRetainNetDev(pThis);
+    if (pDev)
+    {
+        fRc = !!(pDev->promiscuity - (ASMAtomicUoReadBool(&pThis->u.s.fPromiscuousSet) & 1));
+        LogFlow(("vboxNetFltPortOsIsPromiscuous: returns %d, pDev->promiscuity=%d, fPromiscuousSet=%d\n",
+                 fRc, pDev->promiscuity, pThis->u.s.fPromiscuousSet));
+        vboxNetFltLinuxReleaseNetDev(pThis, pDev);
+    }
+    return fRc;
+}
+
+/**
  * Internal worker for vboxNetFltLinuxNotifierCallback.
  *
@@ -1306,5 +1324,5 @@
 
     /* Get the mac address while we still have a valid net_device reference. */
-    memcpy(&pThis->u.s.Mac, pDev->dev_addr, sizeof(pThis->u.s.Mac));
+    memcpy(&pThis->u.s.MacAddr, pDev->dev_addr, sizeof(pThis->u.s.MacAddr));
 
     /*
@@ -1340,5 +1358,10 @@
      */
     if (!pDev)
+    {
+        Assert(pThis->pSwitchPort);
         vboxNetFltLinuxReportNicGsoCapabilities(pThis);
+        pThis->pSwitchPort->pfnReportMacAddress(pThis->pSwitchPort, &pThis->u.s.MacAddr);
+        pThis->pSwitchPort->pfnReportPromiscuousMode(pThis->pSwitchPort, vboxNetFltLinuxPromiscuous(pThis));
+    }
     else
     {
@@ -1353,5 +1376,5 @@
     }
 
-    LogRel(("VBoxNetFlt: attached to '%s' / %.*Rhxs\n", pThis->szName, sizeof(pThis->u.s.Mac), &pThis->u.s.Mac));
+    LogRel(("VBoxNetFlt: attached to '%s' / %.*Rhxs\n", pThis->szName, sizeof(pThis->u.s.MacAddr), &pThis->u.s.MacAddr));
     return VINF_SUCCESS;
 }
@@ -1555,34 +1578,4 @@
 
 
-bool vboxNetFltPortOsIsPromiscuous(PVBOXNETFLTINS pThis)
-{
-    bool fRc = false;
-    struct net_device * pDev = vboxNetFltLinuxRetainNetDev(pThis);
-    if (pDev)
-    {
-        fRc = !!(pDev->promiscuity - (ASMAtomicUoReadBool(&pThis->u.s.fPromiscuousSet) & 1));
-        LogFlow(("vboxNetFltPortOsIsPromiscuous: returns %d, pDev->promiscuity=%d, fPromiscuousSet=%d\n",
-                 fRc, pDev->promiscuity, pThis->u.s.fPromiscuousSet));
-        vboxNetFltLinuxReleaseNetDev(pThis, pDev);
-    }
-    return fRc;
-}
-
-
-void vboxNetFltPortOsGetMacAddress(PVBOXNETFLTINS pThis, PRTMAC pMac)
-{
-    *pMac = pThis->u.s.Mac;
-}
-
-
-bool vboxNetFltPortOsIsHostMac(PVBOXNETFLTINS pThis, PCRTMAC pMac)
-{
-    /* ASSUMES that the MAC address never changes. */
-    return pThis->u.s.Mac.au16[0] == pMac->au16[0]
-        && pThis->u.s.Mac.au16[1] == pMac->au16[1]
-        && pThis->u.s.Mac.au16[2] == pMac->au16[2];
-}
-
-
 void vboxNetFltPortOsSetActive(PVBOXNETFLTINS pThis, bool fActive)
 {
Index: trunk/src/VBox/HostDrivers/VBoxNetFlt/solaris/VBoxNetFlt-solaris.c
===================================================================
--- trunk/src/VBox/HostDrivers/VBoxNetFlt/solaris/VBoxNetFlt-solaris.c	(revision 28663)
+++ trunk/src/VBox/HostDrivers/VBoxNetFlt/solaris/VBoxNetFlt-solaris.c	(revision 28666)
@@ -1056,7 +1056,7 @@
                                     }
 
-                                    bcopy(pMsg->b_rptr + cOffset, &pThis->u.s.Mac, sizeof(pThis->u.s.Mac));
+                                    bcopy(pMsg->b_rptr + cOffset, &pThis->u.s.MacAddr, sizeof(pThis->u.s.MacAddr));
                                     LogFlow((DEVICE_NAME ":VBoxNetFltSolarisModReadPut: DL_NOTE_PHYS_ADDR. New Mac=%.*Rhxs\n",
-                                        sizeof(pThis->u.s.Mac), &pThis->u.s.Mac));
+                                             sizeof(pThis->u.s.MacAddr), &pThis->u.s.MacAddr));
                                     break;
                                 }
@@ -1381,10 +1381,16 @@
     AssertCompile(sizeof(RTMAC) == ETHERADDRL);
     dl_phys_addr_ack_t *pPhysAddrAck = (dl_phys_addr_ack_t *)pMsg->b_rptr;
-    if (pPhysAddrAck->dl_addr_length == sizeof(pThis->u.s.Mac))
-    {
-        bcopy(pMsg->b_rptr + pPhysAddrAck->dl_addr_offset, &pThis->u.s.Mac, sizeof(pThis->u.s.Mac));
-
-        LogFlow((DEVICE_NAME ":vboxNetFltSolarisCachePhysAddr: DL_PHYS_ADDR_ACK: Mac=%.*Rhxs\n", sizeof(pThis->u.s.Mac),
-                    &pThis->u.s.Mac));
+    if (pPhysAddrAck->dl_addr_length == sizeof(pThis->u.s.MacAddr))
+    {
+        bcopy(pMsg->b_rptr + pPhysAddrAck->dl_addr_offset, &pThis->u.s.MacAddr, sizeof(pThis->u.s.MacAddr));
+
+        LogFlow((DEVICE_NAME ":vboxNetFltSolarisCachePhysAddr: DL_PHYS_ADDR_ACK: Mac=%.*Rhxs\n",
+                 sizeof(pThis->u.s.MacAddr), &pThis->u.s.Mac));
+
+        vboxNetFltRetain(pThis, true /*fBusy*/);
+        Assert(pThis->pSwitchPort);
+        if (pThis->pSwitchPort)
+            pThis->pSwitchPort->pfnReportMacAddress(pThis->pSwitchPort, &pThis->u.s.MacAddr);
+        vboxNetFltRelease(pThis, true /*fBusy*/);
     }
     else
@@ -2607,7 +2613,17 @@
 
             /*
+             * Report promiscuousness and capabilities.
+             */
+            Assert(pThis->pSwitchPort);
+            /** @todo There is no easy way of obtaining the global host side promiscuous
+             * counter. Currently we just return false.  */
+            pThis->pSwitchPort->pfnReportPromiscuousMode(pThis->pSwitchPort, false);
+            pThis->pSwitchPort->pfnReportGsoCapabilities(pThis->pSwitchPort, 0,  INTNETTRUNKDIR_WIRE | INTNETTRUNKDIR_HOST);
+
+            /*
              * Ipv4 is successful, and maybe Ipv6, we're ready for transfers.
              */
             ASMAtomicWriteBool(&pThis->fDisconnectedFromHost, false);
+
             return VINF_SUCCESS;
         }
@@ -2844,5 +2860,5 @@
 
             bcopy(pMsg->b_rptr + pDlpiMsg->dl_dest_addr_offset, &EthHdr.DstMac, sizeof(EthHdr.DstMac));
-            bcopy(&pThis->u.s.Mac, &EthHdr.SrcMac, sizeof(EthHdr.SrcMac));
+            bcopy(&pThis->u.s.MacAddr, &EthHdr.SrcMac, sizeof(EthHdr.SrcMac));
 
             vboxnetflt_dladdr_t *pDLSapAddr = (vboxnetflt_dladdr_t *)(pMsg->b_rptr + pDlpiMsg->dl_dest_addr_offset);
@@ -3127,4 +3143,19 @@
 
 /**
+ * Helper.
+ */
+DECLINLINE(bool) vboxNetFltPortSolarisIsHostMac(PVBOXNETFLTINS pThis, PCRTMAC pMac)
+{
+    /*
+     * MAC address change acknowledgements are intercepted on the read side
+     * hence theoritically we are always update to date with any changes.
+     */
+    return pThis->u.s.MacAddr.au16[0] == pMac->au16[0]
+        && pThis->u.s.MacAddr.au16[1] == pMac->au16[1]
+        && pThis->u.s.MacAddr.au16[2] == pMac->au16[2];
+}
+
+
+/**
  * Worker for routing messages from the wire or from the host.
  *
@@ -3188,5 +3219,5 @@
     uint32_t fSrc = INTNETTRUNKDIR_WIRE;
     PRTNETETHERHDR pEthHdr = (PRTNETETHERHDR)pMsg->b_rptr;
-    if (vboxNetFltPortOsIsHostMac(pThis, &pEthHdr->SrcMac))
+    if (vboxNetFltPortSolarisIsHostMac(pThis, &pEthHdr->SrcMac))
         fSrc = INTNETTRUNKDIR_HOST;
 
@@ -3431,31 +3462,5 @@
 
 /* -=-=-=-=-=- Common Hooks -=-=-=-=-=- */
-bool vboxNetFltPortOsIsPromiscuous(PVBOXNETFLTINS pThis)
-{
-    /*
-     * There is no easy way of obtaining the global host side promiscuous counter.
-     * Currently we just return false.
-     */
-    return false;
-}
-
-
-void vboxNetFltPortOsGetMacAddress(PVBOXNETFLTINS pThis, PRTMAC pMac)
-{
-    LogFlowFunc((DEVICE_NAME ":vboxNetFltPortOsGetMacAddress pThis=%p\n", pThis));
-    *pMac = pThis->u.s.Mac;
-}
-
-
-bool vboxNetFltPortOsIsHostMac(PVBOXNETFLTINS pThis, PCRTMAC pMac)
-{
-    /*
-     * MAC address change acknowledgements are intercepted on the read side
-     * hence theoritically we are always update to date with any changes.
-     */
-    return pThis->u.s.Mac.au16[0] == pMac->au16[0]
-        && pThis->u.s.Mac.au16[1] == pMac->au16[1]
-        && pThis->u.s.Mac.au16[2] == pMac->au16[2];
-}
+
 
 
@@ -3576,5 +3581,5 @@
     pThis->u.s.hPollMtx = NIL_RTSEMFASTMUTEX;
 #endif
-    bzero(&pThis->u.s.Mac, sizeof(pThis->u.s.Mac));
+    bzero(&pThis->u.s.MacAddr, sizeof(pThis->u.s.MacAddr));
     return VINF_SUCCESS;
 }
Index: trunk/src/VBox/HostDrivers/VBoxNetFlt/solaris/VBoxNetFltBow-solaris.c
===================================================================
--- trunk/src/VBox/HostDrivers/VBoxNetFlt/solaris/VBoxNetFltBow-solaris.c	(revision 28663)
+++ trunk/src/VBox/HostDrivers/VBoxNetFlt/solaris/VBoxNetFltBow-solaris.c	(revision 28666)
@@ -594,4 +594,15 @@
 
 /**
+ * Helper.
+ */
+DECLINLINE(bool) vboxNetFltPortSolarisIsHostMac(PVBOXNETFLTINS pThis, PCRTMAC pMac)
+{
+    return pThis->u.s.MacAddr.au16[0] == pMac->au16[0]
+        && pThis->u.s.MacAddr.au16[1] == pMac->au16[1]
+        && pThis->u.s.MacAddr.au16[2] == pMac->au16[2];
+}
+
+
+/**
  * Receive (rx) entry point.
  *
@@ -624,5 +635,5 @@
     PRTNETETHERHDR pEthHdr = (PRTNETETHERHDR)pMsg->b_rptr;
     if (   MBLKL(pMsg) >= sizeof(RTNETETHERHDR)
-        && vboxNetFltPortOsIsHostMac(pThis, &pEthHdr->SrcMac))
+        && vboxNetFltPortSolarisIsHostMac(pThis, &pEthHdr->SrcMac))
         fSrc = INTNETTRUNKDIR_HOST;
 
@@ -798,8 +809,8 @@
                      */
                     AssertCompile(sizeof(RTMAC) == ETHERADDRL);
-                    mac_unicast_primary_get(pThis->u.s.hInterface, (uint8_t *)&pThis->u.s.Mac.au8);
+                    mac_unicast_primary_get(pThis->u.s.hInterface, (uint8_t *)&pThis->u.s.MacAddr.au8);
 
                     LogFlow((DEVICE_NAME ":vboxNetFltSolarisAttachToInterface MAC address of %s is %.*Rhxs\n", pThis->szName,
-                                    sizeof(pThis->u.s.Mac), &pThis->u.s.Mac));
+                             sizeof(pThis->u.s.MacAddr), &pThis->u.s.MacAddr));
 
                     /** @todo Obtain the MTU size using mac_sdu_get() */
@@ -830,10 +841,19 @@
                         if (!rc)
                         {
+                            /*
+                             * Report MAC address, promiscuous mode and capabilities.
+                             */
+                            Assert(pThis->pSwitchPort);
+                            pThis->pSwitchPort->pfnReportMacAddress(pThis->pSwitchPort, &pThis->u.s.MacAddr);
+                            pThis->pSwitchPort->pfnReportPromiscuousMode(pThis->pSwitchPort, false); /** @todo Promisc */
+                            pThis->pSwitchPort->pfnReportGsoCapabilities(pThis->pSwitchPort, 0, INTNETTRUNKDIR_WIRE | INTNETTRUNKDIR_HOST);
+
+
                             LogFlow((DEVICE_NAME ":vboxNetFltSolarisAttachToInterface successfully attached over '%s'\n", pThis->szName));
                             return VINF_SUCCESS;
                         }
-                        else
-                            LogRel((DEVICE_NAME ":vboxNetFltSolarisAttachToInterface failed to set client MAC address over link '%s' rc=%d\n",
-                                    pThis->szName, rc));
+
+                        LogRel((DEVICE_NAME ":vboxNetFltSolarisAttachToInterface failed to set client MAC address over link '%s' rc=%d\n",
+                                pThis->szName, rc));
 
                         mac_client_close(pThis->u.s.hClient, 0 /* fFlags */);
@@ -928,26 +948,4 @@
 
 /* -=-=-=-=-=- Common Hooks -=-=-=-=-=- */
-bool vboxNetFltPortOsIsPromiscuous(PVBOXNETFLTINS pThis)
-{
-    LogFlow((DEVICE_NAME ":vboxNetFltPortOsIsPromiscuous pThis=%p\n", pThis));
-    return false;
-}
-
-
-void vboxNetFltPortOsGetMacAddress(PVBOXNETFLTINS pThis, PRTMAC pMac)
-{
-    LogFlow((DEVICE_NAME ":vboxNetFltPortOsGetMacAddress pThis=%p\n", pThis));
-    *pMac = pThis->u.s.Mac;
-    return;
-}
-
-
-bool vboxNetFltPortOsIsHostMac(PVBOXNETFLTINS pThis, PCRTMAC pMac)
-{
-    /** @todo What happens when the MAC address of the underlying NIC changes?? */
-    return pThis->u.s.Mac.au16[0] == pMac->au16[0]
-        && pThis->u.s.Mac.au16[1] == pMac->au16[1]
-        && pThis->u.s.Mac.au16[2] == pMac->au16[2];
-}
 
 
@@ -1023,5 +1021,5 @@
     pThis->u.s.hUnicast = NULL;
     pThis->u.s.hPromiscuous = NULL;
-    bzero(&pThis->u.s.Mac, sizeof(pThis->u.s.Mac));
+    bzero(&pThis->u.s.MacAddr, sizeof(pThis->u.s.MacAddr));
     return VINF_SUCCESS;
 }
Index: trunk/src/VBox/HostDrivers/VBoxNetFlt/win/VBoxNetFlt-win.c
===================================================================
--- trunk/src/VBox/HostDrivers/VBoxNetFlt/win/VBoxNetFlt-win.c	(revision 28663)
+++ trunk/src/VBox/HostDrivers/VBoxNetFlt/win/VBoxNetFlt-win.c	(revision 28666)
@@ -1490,4 +1490,7 @@
 DECLHIDDEN(NDIS_STATUS) vboxNetFltWinSetPromiscuous(PADAPT pAdapt, bool bYes)
 {
+/** @todo Need to report changes to the switch via:
+ *  pThis->pSwitchPort->pfnReportPromiscuousMode(pThis->pSwitchPort, fPromisc);
+ */
     Assert(VBOXNETFLT_PROMISCUOUS_SUPPORTED(pAdapt));
     if(VBOXNETFLT_PROMISCUOUS_SUPPORTED(pAdapt))
@@ -3152,4 +3155,33 @@
 }
 
+
+/**
+ * Checks if the host (not us) has put the adapter in promiscuous mode.
+ *
+ * @returns true if promiscuous, false if not.
+ * @param   pThis               The instance.
+ */
+static bool vboxNetFltWinIsPromiscuous2(PVBOXNETFLTINS pThis)
+{
+#ifndef VBOXNETADP
+    PADAPT pAdapt = PVBOXNETFLTINS_2_PADAPT(pThis);
+    if(VBOXNETFLT_PROMISCUOUS_SUPPORTED(pAdapt))
+    {
+        bool bPromiscuous;
+        if(!vboxNetFltWinReferenceAdapt(pAdapt))
+            return false;
+
+        bPromiscuous = (pAdapt->fUpperProtocolSetFilter & NDIS_PACKET_TYPE_PROMISCUOUS) == NDIS_PACKET_TYPE_PROMISCUOUS;
+            /*vboxNetFltWinIsPromiscuous(pAdapt);*/
+
+        vboxNetFltWinDereferenceAdapt(pAdapt);
+        return bPromiscuous;
+    }
+    return false;
+#else
+    return true;
+#endif
+}
+
 /**
  * Worker for vboxNetFltWinAttachToInterface.
@@ -3241,4 +3273,14 @@
                             vboxNetFltRelease(pThis, false);
 
+                            /* 5. Report MAC address, promiscuousness and GSO capabilities. */
+                            /** @todo Keep these up to date, esp. the promiscuous mode bit. */
+                            if (pThis->pSwitchPort)
+                            {
+                                pThis->pSwitchPort->pfnReportMacAddress(pThis->pSwitchPort, &pThis->u.s.MacAddr);
+                                pThis->pSwitchPort->pfnReportPromiscuousMode(pThis->pSwitchPort,
+                                                                             vboxNetFltWinIsPromiscuous2(pThis));
+                                pThis->pSwitchPort->pfnReportGsoCapabilities(pThis->pSwitchPort, 0,
+                                                                             INTNETTRUNKDIR_WIRE | INTNETTRUNKDIR_HOST);
+                            }
                             return;
                         }
@@ -3284,5 +3326,5 @@
             }
 
-            Status = vboxNetFltWinGetMacAddress(pAdapt, &pThis->u.s.Mac);
+            Status = vboxNetFltWinGetMacAddress(pAdapt, &pThis->u.s.MacAddr);
             if (Status != NDIS_STATUS_SUCCESS)
             {
@@ -3463,39 +3505,4 @@
 }
 
-bool vboxNetFltPortOsIsPromiscuous(PVBOXNETFLTINS pThis)
-{
-#ifndef VBOXNETADP
-    PADAPT pAdapt = PVBOXNETFLTINS_2_PADAPT(pThis);
-    if(VBOXNETFLT_PROMISCUOUS_SUPPORTED(pAdapt))
-    {
-        bool bPromiscuous;
-        if(!vboxNetFltWinReferenceAdapt(pAdapt))
-            return false;
-
-        bPromiscuous = (pAdapt->fUpperProtocolSetFilter & NDIS_PACKET_TYPE_PROMISCUOUS) == NDIS_PACKET_TYPE_PROMISCUOUS;
-            /*vboxNetFltWinIsPromiscuous(pAdapt);*/
-
-        vboxNetFltWinDereferenceAdapt(pAdapt);
-        return bPromiscuous;
-    }
-    return false;
-#else
-    return true;
-#endif
-}
-
-void vboxNetFltPortOsGetMacAddress(PVBOXNETFLTINS pThis, PRTMAC pMac)
-{
-    *pMac = pThis->u.s.Mac;
-}
-
-bool vboxNetFltPortOsIsHostMac(PVBOXNETFLTINS pThis, PCRTMAC pMac)
-{
-    /* ASSUMES that the MAC address never changes. */
-    return pThis->u.s.Mac.au16[0] == pMac->au16[0]
-        && pThis->u.s.Mac.au16[1] == pMac->au16[1]
-        && pThis->u.s.Mac.au16[2] == pMac->au16[2];
-}
-
 void vboxNetFltPortOsSetActive(PVBOXNETFLTINS pThis, bool fActive)
 {
@@ -3633,5 +3640,5 @@
     {
 #ifndef VBOXNETADP
-        Status = vboxNetFltWinGetMacAddress(pAdapt, &pInstance->u.s.Mac);
+        Status = vboxNetFltWinGetMacAddress(pAdapt, &pInstance->u.s.MacAddr);
         if (Status == NDIS_STATUS_SUCCESS)
 #endif
