Changeset 28666 in vbox for trunk/src/VBox/HostDrivers
- Timestamp:
- Apr 23, 2010 5:25:58 PM (15 years ago)
- svn:sync-xref-src-repo-rev:
- 60537
- Location:
- trunk/src/VBox/HostDrivers
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/HostDrivers/VBoxNetAdp/VBoxNetAdp.c
r25336 r28666 441 441 442 442 /** 443 * @copydoc INTNETTRUNKIFPORT::pfn IsPromiscuous444 */ 445 static DECLCALLBACK( bool) vboxNetAdpPortIsPromiscuous(PINTNETTRUNKIFPORT pIfPort)443 * @copydoc INTNETTRUNKIFPORT::pfnGetMacAddress 444 */ 445 static DECLCALLBACK(void) vboxNetAdpPortGetMacAddress(PINTNETTRUNKIFPORT pIfPort, PRTMAC pMac) 446 446 { 447 447 PVBOXNETADP pThis = IFPORT_2_VBOXNETADP(pIfPort); … … 455 455 456 456 /* 457 * Ask the OS specific code.458 */459 return vboxNetAdpPortOsIsPromiscuous(pThis);460 }461 462 463 /**464 * @copydoc INTNETTRUNKIFPORT::pfnGetMacAddress465 */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 /*478 457 * Forward the question to the OS specific code. 479 458 */ 480 459 vboxNetAdpPortOsGetMacAddress(pThis, pMac); 481 }482 483 484 /**485 * @copydoc INTNETTRUNKIFPORT::pfnIsHostMac486 */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);502 460 } 503 461 … … 891 849 pNew->MyPort.pfnWaitForIdle = vboxNetAdpPortWaitForIdle; 892 850 pNew->MyPort.pfnGetMacAddress = vboxNetAdpPortGetMacAddress; 893 pNew->MyPort.pfnIsHostMac = vboxNetAdpPortIsHostMac;894 pNew->MyPort.pfnIsPromiscuous = vboxNetAdpPortIsPromiscuous;895 851 pNew->MyPort.pfnXmit = vboxNetAdpPortXmit; 896 852 pNew->MyPort.u32VersionEnd = INTNETTRUNKIFPORT_VERSION; -
trunk/src/VBox/HostDrivers/VBoxNetFlt/VBoxNetFlt.c
r28623 r28666 415 415 416 416 /** 417 * @copydoc INTNETTRUNKIFPORT::pfnIsPromiscuous418 */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::pfnGetMacAddress440 */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::pfnIsHostMac462 */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 this474 * 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 /**484 417 * @copydoc INTNETTRUNKIFPORT::pfnWaitForIdle 485 418 */ … … 553 486 { 554 487 PVBOXNETFLTINS pThis = IFPORT_2_VBOXNETFLTINS(pIfPort); 555 RTSPINLOCKTMP Tmp= RTSPINLOCKTMP_INITIALIZER;488 RTSPINLOCKTMP Tmp = RTSPINLOCKTMP_INITIALIZER; 556 489 557 490 /* … … 846 779 pNew->MyPort.pfnSetActive = vboxNetFltPortSetActive; 847 780 pNew->MyPort.pfnWaitForIdle = vboxNetFltPortWaitForIdle; 848 pNew->MyPort.pfnGetMacAddress = vboxNetFltPortGetMacAddress;849 pNew->MyPort.pfnIsHostMac = vboxNetFltPortIsHostMac;850 pNew->MyPort.pfnIsPromiscuous = vboxNetFltPortIsPromiscuous;851 781 pNew->MyPort.pfnXmit = vboxNetFltPortXmit; 852 782 pNew->MyPort.u32VersionEnd = INTNETTRUNKIFPORT_VERSION; 853 pNew->pSwitchPort = NULL;783 pNew->pSwitchPort = pSwitchPort; 854 784 pNew->pGlobals = pGlobals; 855 785 pNew->hSpinlock = NIL_RTSPINLOCK; -
trunk/src/VBox/HostDrivers/VBoxNetFlt/VBoxNetFltInternal.h
r25367 r28666 131 131 RTSEMEVENT hEventIdle; 132 132 133 /** @todo move MacAddr out of this structure! */ 133 134 union 134 135 { … … 153 154 bool volatile fSetPromiscuous; 154 155 /** The MAC address of the interface. */ 155 RTMAC Mac ;156 RTMAC MacAddr; 156 157 /** @} */ 157 158 # elif defined(RT_OS_LINUX) … … 166 167 bool volatile fRegistered; 167 168 /** The MAC address of the interface. */ 168 RTMAC Mac ;169 RTMAC MacAddr; 169 170 struct notifier_block Notifier; 170 171 struct packet_type PacketType; … … 191 192 mac_promisc_handle_t hPromiscuous; 192 193 /** The MAC address of the interface */ 193 RTMAC Mac ;194 RTMAC MacAddr; 194 195 # else 195 196 /** Pointer to the bound IPv4 stream. */ … … 206 207 ldi_handle_t hIface; 207 208 /** The MAC address of the interface. */ 208 RTMAC Mac ;209 RTMAC MacAddr; 209 210 /** Mutex protection used for loopback. */ 210 211 RTSEMFASTMUTEX hFastMtx; … … 235 236 struct task tskout; 236 237 /** The MAC address of the interface. */ 237 RTMAC Mac ;238 RTMAC MacAddr; 238 239 /** @} */ 239 240 # elif defined(RT_OS_WINDOWS) … … 249 250 PACKET_QUEUE_WORKER PacketQueueWorker; 250 251 /** The MAC address of the interface. Caching MAC for performance reasons. */ 251 RTMAC Mac ;252 RTMAC MacAddr; 252 253 /** mutex used to synchronize ADAPT init/deinit */ 253 254 RTSEMMUTEX hAdaptMutex; … … 361 362 362 363 /** 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 frames366 * 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 the381 * 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 /**406 364 * This is called when activating or suspending the instance. 407 365 * … … 451 409 * after linking the instance into the list. 452 410 * 411 * The MAC address as well promiscuousness and GSO capabilities should be 412 * reported by this function. 413 * 453 414 * @return IPRT status code. 454 415 * @param pThis The new instance. -
trunk/src/VBox/HostDrivers/VBoxNetFlt/darwin/VBoxNetFlt-darwin.cpp
r28077 r28666 615 615 AssertMsg(!pvFrame, ("pvFrame=%p pMBuf=%p iSeg=%d\n", pvFrame, pMBuf, iSeg)); 616 616 } 617 618 619 /** 620 * Helper for determining whether the host wants the interface to be 621 * promiscuous. 622 */ 623 static 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 617 642 618 643 … … 751 776 else if (pEvMsg->event_code == KEV_DL_LINK_OFF) 752 777 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 */ 753 780 } 754 781 else … … 903 930 * Get the mac address while we still have a valid ifnet reference. 904 931 */ 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)); 906 933 if (!err) 907 934 { … … 931 958 } 932 959 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 } 933 969 } 934 970 … … 939 975 int rc = RTErrConvertFromErrno(err); 940 976 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)); 942 978 else 943 979 LogRel(("VBoxFltDrv: failed to attach to ifnet '%s' (err=%d)\n", pThis->szName, err)); … … 1002 1038 1003 1039 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];1039 1040 } 1040 1041 … … 1192 1193 pThis->u.s.fSetPromiscuous = false; 1193 1194 pThis->u.s.fNeedSetPromiscuous = false; 1194 //pThis->u.s.Mac = {0};1195 //pThis->u.s.MacAddr = {0}; 1195 1196 1196 1197 return VINF_SUCCESS; -
trunk/src/VBox/HostDrivers/VBoxNetFlt/freebsd/VBoxNetFlt-freebsd.c
r28070 r28666 525 525 } 526 526 527 static 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 527 534 int vboxNetFltOsInitInstance(PVBOXNETFLTINS pThis, void *pvContext) 528 535 { … … 544 551 ASMAtomicUoWritePtr((void * volatile *)&pThis->u.s.ifp, ifp); 545 552 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); 547 554 ASMAtomicUoWriteBool(&pThis->fDisconnectedFromHost, false); 555 548 556 /* Initialize deferred input queue */ 549 557 bzero(&pThis->u.s.inq, sizeof(struct ifqueue)); … … 559 567 560 568 NG_NODE_SET_PRIVATE(node, pThis); 569 561 570 /* Attempt to name it vboxnetflt_<ifname> */ 562 571 snprintf(nam, NG_NODESIZ, "vboxnetflt_%s", pThis->szName); 563 572 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); 564 581 565 582 return VINF_SUCCESS; … … 704 721 } 705 722 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 723 723 int vboxNetFltOsDisconnectIt(PVBOXNETFLTINS pThis) 724 724 { -
trunk/src/VBox/HostDrivers/VBoxNetFlt/linux/VBoxNetFlt-linux.c
r28283 r28666 1281 1281 1282 1282 /** 1283 * Helper that determins whether the host (ignoreing us) is operating the 1284 * interface in promiscuous mode or not. 1285 */ 1286 static 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 /** 1283 1301 * Internal worker for vboxNetFltLinuxNotifierCallback. 1284 1302 * … … 1306 1324 1307 1325 /* 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)); 1309 1327 1310 1328 /* … … 1340 1358 */ 1341 1359 if (!pDev) 1360 { 1361 Assert(pThis->pSwitchPort); 1342 1362 vboxNetFltLinuxReportNicGsoCapabilities(pThis); 1363 pThis->pSwitchPort->pfnReportMacAddress(pThis->pSwitchPort, &pThis->u.s.MacAddr); 1364 pThis->pSwitchPort->pfnReportPromiscuousMode(pThis->pSwitchPort, vboxNetFltLinuxPromiscuous(pThis)); 1365 } 1343 1366 else 1344 1367 { … … 1353 1376 } 1354 1377 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)); 1356 1379 return VINF_SUCCESS; 1357 1380 } … … 1555 1578 1556 1579 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 1587 1580 void vboxNetFltPortOsSetActive(PVBOXNETFLTINS pThis, bool fActive) 1588 1581 { -
trunk/src/VBox/HostDrivers/VBoxNetFlt/solaris/VBoxNetFlt-solaris.c
r28025 r28666 1056 1056 } 1057 1057 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)); 1059 1059 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)); 1061 1061 break; 1062 1062 } … … 1381 1381 AssertCompile(sizeof(RTMAC) == ETHERADDRL); 1382 1382 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*/); 1389 1395 } 1390 1396 else … … 2607 2613 2608 2614 /* 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 /* 2609 2624 * Ipv4 is successful, and maybe Ipv6, we're ready for transfers. 2610 2625 */ 2611 2626 ASMAtomicWriteBool(&pThis->fDisconnectedFromHost, false); 2627 2612 2628 return VINF_SUCCESS; 2613 2629 } … … 2844 2860 2845 2861 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)); 2847 2863 2848 2864 vboxnetflt_dladdr_t *pDLSapAddr = (vboxnetflt_dladdr_t *)(pMsg->b_rptr + pDlpiMsg->dl_dest_addr_offset); … … 3127 3143 3128 3144 /** 3145 * Helper. 3146 */ 3147 DECLINLINE(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 /** 3129 3160 * Worker for routing messages from the wire or from the host. 3130 3161 * … … 3188 3219 uint32_t fSrc = INTNETTRUNKDIR_WIRE; 3189 3220 PRTNETETHERHDR pEthHdr = (PRTNETETHERHDR)pMsg->b_rptr; 3190 if (vboxNetFltPort OsIsHostMac(pThis, &pEthHdr->SrcMac))3221 if (vboxNetFltPortSolarisIsHostMac(pThis, &pEthHdr->SrcMac)) 3191 3222 fSrc = INTNETTRUNKDIR_HOST; 3192 3223 … … 3431 3462 3432 3463 /* -=-=-=-=-=- 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 3460 3465 3461 3466 … … 3576 3581 pThis->u.s.hPollMtx = NIL_RTSEMFASTMUTEX; 3577 3582 #endif 3578 bzero(&pThis->u.s.Mac , sizeof(pThis->u.s.Mac));3583 bzero(&pThis->u.s.MacAddr, sizeof(pThis->u.s.MacAddr)); 3579 3584 return VINF_SUCCESS; 3580 3585 } -
trunk/src/VBox/HostDrivers/VBoxNetFlt/solaris/VBoxNetFltBow-solaris.c
r28025 r28666 594 594 595 595 /** 596 * Helper. 597 */ 598 DECLINLINE(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 /** 596 607 * Receive (rx) entry point. 597 608 * … … 624 635 PRTNETETHERHDR pEthHdr = (PRTNETETHERHDR)pMsg->b_rptr; 625 636 if ( MBLKL(pMsg) >= sizeof(RTNETETHERHDR) 626 && vboxNetFltPort OsIsHostMac(pThis, &pEthHdr->SrcMac))637 && vboxNetFltPortSolarisIsHostMac(pThis, &pEthHdr->SrcMac)) 627 638 fSrc = INTNETTRUNKDIR_HOST; 628 639 … … 798 809 */ 799 810 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); 801 812 802 813 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)); 804 815 805 816 /** @todo Obtain the MTU size using mac_sdu_get() */ … … 830 841 if (!rc) 831 842 { 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 832 852 LogFlow((DEVICE_NAME ":vboxNetFltSolarisAttachToInterface successfully attached over '%s'\n", pThis->szName)); 833 853 return VINF_SUCCESS; 834 854 } 835 else 836 837 855 856 LogRel((DEVICE_NAME ":vboxNetFltSolarisAttachToInterface failed to set client MAC address over link '%s' rc=%d\n", 857 pThis->szName, rc)); 838 858 839 859 mac_client_close(pThis->u.s.hClient, 0 /* fFlags */); … … 928 948 929 949 /* -=-=-=-=-=- 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 }952 950 953 951 … … 1023 1021 pThis->u.s.hUnicast = NULL; 1024 1022 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)); 1026 1024 return VINF_SUCCESS; 1027 1025 } -
trunk/src/VBox/HostDrivers/VBoxNetFlt/win/VBoxNetFlt-win.c
r28070 r28666 1490 1490 DECLHIDDEN(NDIS_STATUS) vboxNetFltWinSetPromiscuous(PADAPT pAdapt, bool bYes) 1491 1491 { 1492 /** @todo Need to report changes to the switch via: 1493 * pThis->pSwitchPort->pfnReportPromiscuousMode(pThis->pSwitchPort, fPromisc); 1494 */ 1492 1495 Assert(VBOXNETFLT_PROMISCUOUS_SUPPORTED(pAdapt)); 1493 1496 if(VBOXNETFLT_PROMISCUOUS_SUPPORTED(pAdapt)) … … 3152 3155 } 3153 3156 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 */ 3164 static 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 3154 3186 /** 3155 3187 * Worker for vboxNetFltWinAttachToInterface. … … 3241 3273 vboxNetFltRelease(pThis, false); 3242 3274 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 } 3243 3285 return; 3244 3286 } … … 3284 3326 } 3285 3327 3286 Status = vboxNetFltWinGetMacAddress(pAdapt, &pThis->u.s.Mac );3328 Status = vboxNetFltWinGetMacAddress(pAdapt, &pThis->u.s.MacAddr); 3287 3329 if (Status != NDIS_STATUS_SUCCESS) 3288 3330 { … … 3463 3505 } 3464 3506 3465 bool vboxNetFltPortOsIsPromiscuous(PVBOXNETFLTINS pThis)3466 {3467 #ifndef VBOXNETADP3468 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 #else3483 return true;3484 #endif3485 }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 3500 3507 void vboxNetFltPortOsSetActive(PVBOXNETFLTINS pThis, bool fActive) 3501 3508 { … … 3633 3640 { 3634 3641 #ifndef VBOXNETADP 3635 Status = vboxNetFltWinGetMacAddress(pAdapt, &pInstance->u.s.Mac );3642 Status = vboxNetFltWinGetMacAddress(pAdapt, &pInstance->u.s.MacAddr); 3636 3643 if (Status == NDIS_STATUS_SUCCESS) 3637 3644 #endif
Note:
See TracChangeset
for help on using the changeset viewer.