Changeset 35809 in vbox
- Timestamp:
- Feb 1, 2011 12:31:15 PM (14 years ago)
- svn:sync-xref-src-repo-rev:
- 69787
- Location:
- trunk/src
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/HostDrivers/VBoxNetAdp/VBoxNetAdp.c
r35785 r35809 1056 1056 1057 1057 VBOXNETADP g_aAdapters[VBOXNETADP_MAX_INSTANCES]; 1058 1059 1058 static uint8_t g_aUnits[VBOXNETADP_MAX_UNITS/8]; 1059 1060 1061 DECLINLINE(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 1072 DECLINLINE(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 1087 DECLINLINE(void) vboxNetAdpReleaseUnit(int nUnit) 1088 { 1089 Assert(ASMAtomicBitTestAndClear(g_aUnits, nUnit)); 1090 } 1060 1091 1061 1092 /** … … 1072 1103 pMac->au8[2] = 0x27; 1073 1104 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; 1077 1108 } 1078 1109 … … 1090 1121 /* Found an empty slot -- use it. */ 1091 1122 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 } 1095 1144 if (RT_SUCCESS(rc)) 1096 1145 { 1097 1146 *ppNew = pThis; 1098 1147 ASMAtomicWriteU32((uint32_t volatile *)&pThis->enmState, kVBoxNetAdpState_Active); 1148 Log2(("VBoxNetAdpCreate: Created %s\n", g_aAdapters[i].szName)); 1099 1149 } 1100 1150 else … … 1103 1153 Log(("vboxNetAdpCreate: vboxNetAdpOsCreate failed with '%Rrc'.\n", rc)); 1104 1154 } 1105 Log2(("VBoxNetAdpCreate: Created %s\n", g_aAdapters[i].szName));1106 1155 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)); 1108 1158 return rc; 1109 1159 } … … 1122 1172 return VERR_INTNET_FLT_IF_BUSY; 1123 1173 1174 Assert(pThis->nUnit >= 0 && pThis->nUnit < VBOXNETADP_MAX_UNITS); 1124 1175 vboxNetAdpOsDestroy(pThis); 1176 vboxNetAdpReleaseUnit(pThis->nUnit); 1177 pThis->nUnit = -1; 1178 pThis->szName[0] = '\0'; 1125 1179 1126 1180 ASMAtomicWriteU32((uint32_t volatile *)&pThis->enmState, kVBoxNetAdpState_Invalid); … … 1132 1186 { 1133 1187 unsigned i; 1134 PVBOXNETADP pVboxnet0;1135 1188 /* 1136 1189 * Init common members and call OS-specific init. 1137 1190 */ 1191 memset(g_aUnits, 0, sizeof(g_aUnits)); 1192 memset(g_aAdapters, 0, sizeof(g_aAdapters)); 1138 1193 for (i = 0; i < RT_ELEMENTS(g_aAdapters); i++) 1139 1194 { 1140 1195 g_aAdapters[i].enmState = kVBoxNetAdpState_Invalid; 1141 g_aAdapters[i]. uUnit = i;1196 g_aAdapters[i].nUnit = -1; 1142 1197 vboxNetAdpOsInit(&g_aAdapters[i]); 1143 1198 } 1144 1199 1145 1200 return VINF_SUCCESS; 1146 /* Create vboxnet01147 return vboxNetAdpCreate(&pVboxnet0);*/1148 1201 } 1149 1202 -
trunk/src/VBox/HostDrivers/VBoxNetAdp/VBoxNetAdpInternal.h
r35785 r35809 31 31 32 32 #define VBOXNETADP_MAX_INSTANCES 8 33 #define VBOXNETADP_MAX_UNITS 128 33 34 #define VBOXNETADP_NAME "vboxnet" 34 35 #define VBOXNETADP_MAX_NAME_LEN 32 … … 40 41 41 42 #define VBOXNETADP_CTL_DEV_NAME "vboxnetctl" 42 #define VBOXNETADP_CTL_ADD _IOR('v', 1, VBOXNETADPREQ)43 #define VBOXNETADP_CTL_ADD _IOWR('v', 1, VBOXNETADPREQ) 43 44 #define VBOXNETADP_CTL_REMOVE _IOW('v', 2, VBOXNETADPREQ) 44 45 … … 85 86 VBOXNETADPSTATE enmState; 86 87 /** Corresponds to the digit at the end of device name. */ 87 uint32_t uUnit;88 int nUnit; 88 89 89 90 union … … 177 178 * @remarks Owns no locks. 178 179 */ 179 DECLHIDDEN(int) vboxNetAdpOsCreate(PVBOXNETADP pThis, PCRTMAC pMac , const char *pcszName);180 DECLHIDDEN(int) vboxNetAdpOsCreate(PVBOXNETADP pThis, PCRTMAC pMac); 180 181 181 182 -
trunk/src/VBox/HostDrivers/VBoxNetAdp/darwin/VBoxNetAdp-darwin.cpp
r35786 r35809 136 136 pUuid->Gen.u8ClockSeqHiAndReserved = (pUuid->Gen.u8ClockSeqHiAndReserved & 0x3f) | 0x80; 137 137 pUuid->Gen.u16TimeHiAndVersion = (pUuid->Gen.u16TimeHiAndVersion & 0x0fff) | 0x4000; 138 pUuid->Gen.u8ClockSeqLow = pThis-> uUnit;138 pUuid->Gen.u8ClockSeqLow = pThis->nUnit; 139 139 vboxNetAdpComposeMACAddress(pThis, (PRTMAC)pUuid->Gen.au8Node); 140 140 } … … 193 193 194 194 195 int vboxNetAdpOsCreate(PVBOXNETADP pThis, PCRTMAC pMACAddress, const char *pcszName) 196 { 197 /* TODO: Use pcszName */ 195 196 int vboxNetAdpOsCreate(PVBOXNETADP pThis, PCRTMAC pMACAddress) 197 { 198 198 int rc; 199 199 struct ifnet_init_params Params; … … 216 216 memcpy(LLADDR(&mac), pMACAddress->au8, mac.sdl_alen); 217 217 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); 219 219 vboxNetAdpDarwinComposeUUID(pThis, &uuid); 220 220 Params.uniqueid = uuid.au8; 221 221 Params.uniqueid_len = sizeof(uuid); 222 222 Params.name = VBOXNETADP_NAME; 223 Params.unit = pThis-> uUnit;223 Params.unit = pThis->nUnit; 224 224 Params.family = IFNET_FAMILY_ETHERNET; 225 225 Params.type = IFT_ETHER; … … 294 294 if (rc == VERR_TIMEOUT) 295 295 LogRel(("VBoxAdpDrv: Failed to detach interface %s%d\n.", 296 VBOXNETADP_NAME, pThis-> uUnit));296 VBOXNETADP_NAME, pThis->nUnit)); 297 297 err = ifnet_release(pThis->u.s.pIface); 298 298 if (err) … … 348 348 case IOCBASECMD(VBOXNETADP_CTL_ADD): 349 349 { 350 if ( (IOC_DIRMASK & iCmd) != IOC_ OUT350 if ( (IOC_DIRMASK & iCmd) != IOC_INOUT 351 351 || cbReq < sizeof(VBOXNETADPREQ)) 352 352 return EINVAL; 353 353 354 354 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); 356 359 if (RT_FAILURE(rc)) 357 360 return EINVAL; -
trunk/src/VBox/HostDrivers/VBoxNetAdp/freebsd/VBoxNetAdp-freebsd.c
r35786 r35809 264 264 return VERR_NO_MEMORY; 265 265 266 if_initname(ifp, VBOXNETADP_NAME, pThis-> uUnit);266 if_initname(ifp, VBOXNETADP_NAME, pThis->nUnit); 267 267 ifp->if_softc = pThis; 268 268 ifp->if_mtu = ETHERMTU; -
trunk/src/VBox/HostDrivers/VBoxNetAdp/linux/VBoxNetAdp-linux.c
r35785 r35809 176 176 177 177 178 int vboxNetAdpOsCreate(PVBOXNETADP pThis, PCRTMAC pMACAddress , const char *pcszName)178 int vboxNetAdpOsCreate(PVBOXNETADP pThis, PCRTMAC pMACAddress) 179 179 { 180 180 int rc = VINF_SUCCESS; … … 183 183 /* No need for private data. */ 184 184 pNetDev = alloc_netdev(sizeof(VBOXNETADPPRIV), 185 p cszName ? pcszName : VBOXNETADP_LINUX_NAME,185 pThis->szName[0] ? pThis->szName : VBOXNETADP_LINUX_NAME, 186 186 vboxNetAdpNetDevInit); 187 187 if (pNetDev) -
trunk/src/VBox/Main/src-server/HostImpl.cpp
r35804 r35809 43 43 #endif 44 44 45 #if defined(RT_OS_LINUX) 45 #if defined(RT_OS_LINUX) || defined(RT_OS_DARWIN) || defined(RT_OS_FREEBSD) 46 46 # include <set> 47 47 #endif … … 367 367 #endif /* VBOX_WITH_CROGL */ 368 368 369 #if defined (RT_OS_LINUX) 369 #if defined (RT_OS_LINUX) || defined(RT_OS_DARWIN) || defined(RT_OS_FREEBSD) 370 370 /* Extract the list of configured host-only interfaces */ 371 371 std::set<Utf8Str> aConfiguredNames; … … 401 401 } 402 402 403 #endif /* defined (RT_OS_LINUX) */403 #endif /* defined (RT_OS_LINUX) || defined(RT_OS_DARWIN) || defined(RT_OS_FREEBSD) */ 404 404 405 405 /* Confirm a successful initialization */ -
trunk/src/apps/adpctl/VBoxNetAdpCtl.cpp
r35785 r35809 41 41 #define VBOXNETADP_NAME "vboxnet" 42 42 #define VBOXNETADP_MAX_NAME_LEN 32 43 #define VBOXNETADP_CTL_ADD _IOR('v', 1, VBOXNETADPREQ)43 #define VBOXNETADP_CTL_ADD _IOWR('v', 1, VBOXNETADPREQ) 44 44 #define VBOXNETADP_CTL_REMOVE _IOW('v', 2, VBOXNETADPREQ) 45 45 typedef struct VBoxNetAdpReq
Note:
See TracChangeset
for help on using the changeset viewer.