VirtualBox

Changeset 35809 in vbox


Ignore:
Timestamp:
Feb 1, 2011 12:31:15 PM (14 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
69787
Message:

netadp: Re-create configured vboxnetX interfaces (#4213) on Darwin and FreeBSD

Location:
trunk/src
Files:
7 edited

Legend:

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

    r35785 r35809  
    10561056
    10571057VBOXNETADP g_aAdapters[VBOXNETADP_MAX_INSTANCES];
    1058 
    1059 
     1058static uint8_t g_aUnits[VBOXNETADP_MAX_UNITS/8];
     1059
     1060
     1061DECLINLINE(int) vboxNetAdpGetUnitByName(const char *pcszName)
     1062{
     1063    uint32_t nUnit = RTStrToUInt32(pcszName + sizeof(VBOXNETADP_NAME) - 1);
     1064
     1065    if (nUnit >= VBOXNETADP_MAX_UNITS)
     1066        return -1;
     1067
     1068    bool bOld = ASMAtomicBitTestAndSet(g_aUnits, nUnit);
     1069    return bOld ? -1 : (int)nUnit;
     1070}
     1071
     1072DECLINLINE(int) vboxNetAdpGetNextAvailableUnit(void)
     1073{
     1074    bool bOld;
     1075    int nUnit;
     1076    /* There is absolutely no chance that all units are taken */
     1077    do {
     1078        nUnit = ASMBitFirstClear(g_aUnits, VBOXNETADP_MAX_UNITS);
     1079        if (nUnit < 0)
     1080            break;
     1081        bOld = ASMAtomicBitTestAndSet(g_aUnits, nUnit);
     1082    } while (bOld);
     1083
     1084    return nUnit;
     1085}
     1086
     1087DECLINLINE(void) vboxNetAdpReleaseUnit(int nUnit)
     1088{
     1089    Assert(ASMAtomicBitTestAndClear(g_aUnits, nUnit));
     1090}
    10601091
    10611092/**
     
    10721103    pMac->au8[2] = 0x27;
    10731104
    1074     pMac->au8[3] = 0; /* pThis->uUnit >> 16; */
    1075     pMac->au8[4] = 0; /* pThis->uUnit >> 8; */
    1076     pMac->au8[5] = pThis->uUnit;
     1105    pMac->au8[3] = 0; /* pThis->nUnit >> 16; */
     1106    pMac->au8[4] = 0; /* pThis->nUnit >> 8; */
     1107    pMac->au8[5] = pThis->nUnit;
    10771108}
    10781109
     
    10901121            /* Found an empty slot -- use it. */
    10911122            Log(("vboxNetAdpCreate: found empty slot: %d\n", i));
    1092             vboxNetAdpComposeMACAddress(pThis, &Mac);
    1093             rc = vboxNetAdpOsCreate(pThis, &Mac, pcszName);
    1094             Log(("vboxNetAdpCreate: pThis=%p pThis->szName=%p\n", pThis, pThis->szName));
     1123            if (pcszName)
     1124            {
     1125                Log(("vboxNetAdpCreate: using name: %s\n", pcszName));
     1126                pThis->nUnit = vboxNetAdpGetUnitByName(pcszName);
     1127                strncpy(pThis->szName, pcszName, sizeof(pThis->szName));
     1128                pThis->szName[sizeof(pThis->szName) - 1] = '\0';
     1129            }
     1130            else
     1131            {
     1132                pThis->nUnit = vboxNetAdpGetNextAvailableUnit();
     1133                pThis->szName[0] = '\0';
     1134            }
     1135            if (pThis->nUnit < 0)
     1136                rc = VERR_INVALID_PARAMETER;
     1137            else
     1138            {
     1139                vboxNetAdpComposeMACAddress(pThis, &Mac);
     1140                rc = vboxNetAdpOsCreate(pThis, &Mac);
     1141                Log(("vboxNetAdpCreate: pThis=%p pThis->nUnit=%d, pThis->szName=%s\n",
     1142                     pThis, pThis->nUnit, pThis->szName));
     1143            }
    10951144            if (RT_SUCCESS(rc))
    10961145            {
    10971146                *ppNew = pThis;
    10981147                ASMAtomicWriteU32((uint32_t volatile *)&pThis->enmState, kVBoxNetAdpState_Active);
     1148                Log2(("VBoxNetAdpCreate: Created %s\n", g_aAdapters[i].szName));
    10991149            }
    11001150            else
     
    11031153                Log(("vboxNetAdpCreate: vboxNetAdpOsCreate failed with '%Rrc'.\n", rc));
    11041154            }
    1105             Log2(("VBoxNetAdpCreate: Created %s\n", g_aAdapters[i].szName));
    11061155            for (i = 0; i < RT_ELEMENTS(g_aAdapters); i++)
    1107                 Log2(("VBoxNetAdpCreate: Scanning entry: state=%d name=%s\n", g_aAdapters[i].enmState, g_aAdapters[i].szName));
     1156                Log2(("VBoxNetAdpCreate: Scanning entry: state=%d unit=%d name=%s\n",
     1157                      g_aAdapters[i].enmState, g_aAdapters[i].nUnit, g_aAdapters[i].szName));
    11081158            return rc;
    11091159        }
     
    11221172        return VERR_INTNET_FLT_IF_BUSY;
    11231173
     1174    Assert(pThis->nUnit >= 0 && pThis->nUnit < VBOXNETADP_MAX_UNITS);
    11241175    vboxNetAdpOsDestroy(pThis);
     1176    vboxNetAdpReleaseUnit(pThis->nUnit);
     1177    pThis->nUnit = -1;
     1178    pThis->szName[0] = '\0';
    11251179
    11261180    ASMAtomicWriteU32((uint32_t volatile *)&pThis->enmState, kVBoxNetAdpState_Invalid);
     
    11321186{
    11331187    unsigned i;
    1134     PVBOXNETADP pVboxnet0;
    11351188    /*
    11361189     * Init common members and call OS-specific init.
    11371190     */
     1191    memset(g_aUnits, 0, sizeof(g_aUnits));
     1192    memset(g_aAdapters, 0, sizeof(g_aAdapters));
    11381193    for (i = 0; i < RT_ELEMENTS(g_aAdapters); i++)
    11391194    {
    11401195        g_aAdapters[i].enmState = kVBoxNetAdpState_Invalid;
    1141         g_aAdapters[i].uUnit    = i;
     1196        g_aAdapters[i].nUnit    = -1;
    11421197        vboxNetAdpOsInit(&g_aAdapters[i]);
    11431198    }
    11441199
    11451200    return VINF_SUCCESS;
    1146     /* Create vboxnet0
    1147        return vboxNetAdpCreate(&pVboxnet0);*/
    11481201}
    11491202
  • trunk/src/VBox/HostDrivers/VBoxNetAdp/VBoxNetAdpInternal.h

    r35785 r35809  
    3131
    3232#define VBOXNETADP_MAX_INSTANCES   8
     33#define VBOXNETADP_MAX_UNITS       128
    3334#define VBOXNETADP_NAME            "vboxnet"
    3435#define VBOXNETADP_MAX_NAME_LEN    32
     
    4041
    4142#define VBOXNETADP_CTL_DEV_NAME    "vboxnetctl"
    42 #define VBOXNETADP_CTL_ADD    _IOR('v', 1, VBOXNETADPREQ)
     43#define VBOXNETADP_CTL_ADD   _IOWR('v', 1, VBOXNETADPREQ)
    4344#define VBOXNETADP_CTL_REMOVE _IOW('v', 2, VBOXNETADPREQ)
    4445
     
    8586    VBOXNETADPSTATE   enmState;
    8687    /** Corresponds to the digit at the end of device name. */
    87     uint32_t          uUnit;
     88    int               nUnit;
    8889
    8990    union
     
    177178 * @remarks Owns no locks.
    178179 */
    179 DECLHIDDEN(int) vboxNetAdpOsCreate(PVBOXNETADP pThis, PCRTMAC pMac, const char *pcszName);
     180DECLHIDDEN(int) vboxNetAdpOsCreate(PVBOXNETADP pThis, PCRTMAC pMac);
    180181
    181182
  • trunk/src/VBox/HostDrivers/VBoxNetAdp/darwin/VBoxNetAdp-darwin.cpp

    r35786 r35809  
    136136    pUuid->Gen.u8ClockSeqHiAndReserved = (pUuid->Gen.u8ClockSeqHiAndReserved & 0x3f) | 0x80;
    137137    pUuid->Gen.u16TimeHiAndVersion = (pUuid->Gen.u16TimeHiAndVersion & 0x0fff) | 0x4000;
    138     pUuid->Gen.u8ClockSeqLow = pThis->uUnit;
     138    pUuid->Gen.u8ClockSeqLow = pThis->nUnit;
    139139    vboxNetAdpComposeMACAddress(pThis, (PRTMAC)pUuid->Gen.au8Node);
    140140}
     
    193193
    194194
    195 int vboxNetAdpOsCreate(PVBOXNETADP pThis, PCRTMAC pMACAddress, const char *pcszName)
    196 {
    197     /* TODO: Use pcszName */
     195
     196int vboxNetAdpOsCreate(PVBOXNETADP pThis, PCRTMAC pMACAddress)
     197{
    198198    int rc;
    199199    struct ifnet_init_params Params;
     
    216216    memcpy(LLADDR(&mac), pMACAddress->au8, mac.sdl_alen);
    217217
    218     RTStrPrintf(pThis->szName, VBOXNETADP_MAX_NAME_LEN, "%s%d", VBOXNETADP_NAME, pThis->uUnit);
     218    RTStrPrintf(pThis->szName, VBOXNETADP_MAX_NAME_LEN, "%s%d", VBOXNETADP_NAME, pThis->nUnit);
    219219    vboxNetAdpDarwinComposeUUID(pThis, &uuid);
    220220    Params.uniqueid = uuid.au8;
    221221    Params.uniqueid_len = sizeof(uuid);
    222222    Params.name = VBOXNETADP_NAME;
    223     Params.unit = pThis->uUnit;
     223    Params.unit = pThis->nUnit;
    224224    Params.family = IFNET_FAMILY_ETHERNET;
    225225    Params.type = IFT_ETHER;
     
    294294    if (rc == VERR_TIMEOUT)
    295295        LogRel(("VBoxAdpDrv: Failed to detach interface %s%d\n.",
    296                 VBOXNETADP_NAME, pThis->uUnit));
     296                VBOXNETADP_NAME, pThis->nUnit));
    297297    err = ifnet_release(pThis->u.s.pIface);
    298298    if (err)
     
    348348        case IOCBASECMD(VBOXNETADP_CTL_ADD):
    349349        {
    350             if (   (IOC_DIRMASK & iCmd) != IOC_OUT
     350            if (   (IOC_DIRMASK & iCmd) != IOC_INOUT
    351351                || cbReq < sizeof(VBOXNETADPREQ))
    352352                return EINVAL;
    353353
    354354            PVBOXNETADP pNew;
    355             rc = vboxNetAdpCreate(&pNew, NULL);
     355            Log(("VBoxNetAdpDarwinIOCtl: szName=%s\n", pReq->szName));
     356            rc = vboxNetAdpCreate(&pNew,
     357                                  pReq->szName[0] && RTStrEnd(pReq->szName, RT_MIN(cbReq, sizeof(pReq->szName))) ?
     358                                  pReq->szName : NULL);
    356359            if (RT_FAILURE(rc))
    357360                return EINVAL;
  • trunk/src/VBox/HostDrivers/VBoxNetAdp/freebsd/VBoxNetAdp-freebsd.c

    r35786 r35809  
    264264        return VERR_NO_MEMORY;
    265265
    266     if_initname(ifp, VBOXNETADP_NAME, pThis->uUnit);
     266    if_initname(ifp, VBOXNETADP_NAME, pThis->nUnit);
    267267    ifp->if_softc = pThis;
    268268    ifp->if_mtu = ETHERMTU;
  • trunk/src/VBox/HostDrivers/VBoxNetAdp/linux/VBoxNetAdp-linux.c

    r35785 r35809  
    176176
    177177
    178 int vboxNetAdpOsCreate(PVBOXNETADP pThis, PCRTMAC pMACAddress, const char *pcszName)
     178int vboxNetAdpOsCreate(PVBOXNETADP pThis, PCRTMAC pMACAddress)
    179179{
    180180    int rc = VINF_SUCCESS;
     
    183183    /* No need for private data. */
    184184    pNetDev = alloc_netdev(sizeof(VBOXNETADPPRIV),
    185                            pcszName ? pcszName : VBOXNETADP_LINUX_NAME,
     185                           pThis->szName[0] ? pThis->szName : VBOXNETADP_LINUX_NAME,
    186186                           vboxNetAdpNetDevInit);
    187187    if (pNetDev)
  • trunk/src/VBox/Main/src-server/HostImpl.cpp

    r35804 r35809  
    4343#endif
    4444
    45 #if defined(RT_OS_LINUX)
     45#if defined(RT_OS_LINUX) || defined(RT_OS_DARWIN) || defined(RT_OS_FREEBSD)
    4646# include <set>
    4747#endif
     
    367367#endif /* VBOX_WITH_CROGL */
    368368
    369 #if defined (RT_OS_LINUX)
     369#if defined (RT_OS_LINUX) || defined(RT_OS_DARWIN) || defined(RT_OS_FREEBSD)
    370370    /* Extract the list of configured host-only interfaces */
    371371    std::set<Utf8Str> aConfiguredNames;
     
    401401    }
    402402
    403 #endif /* defined (RT_OS_LINUX) */
     403#endif /* defined (RT_OS_LINUX) || defined(RT_OS_DARWIN) || defined(RT_OS_FREEBSD) */
    404404
    405405    /* Confirm a successful initialization */
  • trunk/src/apps/adpctl/VBoxNetAdpCtl.cpp

    r35785 r35809  
    4141#define VBOXNETADP_NAME            "vboxnet"
    4242#define VBOXNETADP_MAX_NAME_LEN    32
    43 #define VBOXNETADP_CTL_ADD    _IOR('v', 1, VBOXNETADPREQ)
     43#define VBOXNETADP_CTL_ADD   _IOWR('v', 1, VBOXNETADPREQ)
    4444#define VBOXNETADP_CTL_REMOVE _IOW('v', 2, VBOXNETADPREQ)
    4545typedef struct VBoxNetAdpReq
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