1182 } |
1216 } |
1183 CleanupStack::PopAndDestroy();// view |
1217 CleanupStack::PopAndDestroy();// view |
1184 CleanupStack::PopAndDestroy(iapDatabase); |
1218 CleanupStack::PopAndDestroy(iapDatabase); |
1185 return; |
1219 return; |
1186 } |
1220 } |
1187 |
1221 #endif // __SYMBIAN_COMPILE_UNUSED__ |
1188 TInt CSocketDesc :: SetInterfaceDetails( void *aParam ,TInt aFlag, TInt aType ) |
1222 |
1189 { |
1223 |
1190 ifreq *ifr = (ifreq *)aParam; |
1224 |
1191 TPckgBuf<TSoInetIfQuery> ifq; |
1225 TInt CSocketDesc::GetInterfaceInfo(TSoInetInterfaceInfo& aIfInfo, TInt aIapId ) |
1192 TBuf8 <25> ipBuf8; |
1226 { |
1193 TName aBuf; |
1227 TPckgBuf<TSoInetInterfaceInfo> info; |
1194 TInt ret = KErrNone; |
1228 TInt ret = KErrNone; |
1195 ATOMICSOCKETOP( ret = iSocket.SetOpt(KSoInetEnumInterfaces, KSolInetIfCtrl), ret = KErrBadHandle ) |
1229 ATOMICSOCKETOP( ret = iSocket.SetOpt(KSoInetEnumInterfaces, KSolInetIfCtrl), ret = KErrBadHandle ) |
1196 if (ret != KErrNone) |
1230 if (ret != KErrNone) |
1197 { |
1231 { |
1198 return KErrGeneral; |
1232 return KErrGeneral; |
1199 } |
1233 } |
1200 TPckgBuf<TSoInet6InterfaceInfo> info; |
|
1201 TSoInet6InterfaceInfo &in = info(); |
|
1202 ATOMICSOCKETOP( ret = iSocket.GetOpt(KSoInetNextInterface, KSolInetIfCtrl, info), ret = KErrBadHandle ) |
1234 ATOMICSOCKETOP( ret = iSocket.GetOpt(KSoInetNextInterface, KSolInetIfCtrl, info), ret = KErrBadHandle ) |
1203 while(ret == KErrNone) |
1235 while(ret == KErrNone) |
1204 { |
1236 { |
1205 if(info().iName != _L("") && info().iName != _L("loop6") && info().iName != _L("loop4")) |
1237 if(info().iName != _L("")) |
1206 { |
1238 { |
1207 TDes16& aName = info().iName; |
1239 TPckgBuf<TSoInetIfQuery> optifquery; |
1208 if( ((aFlag == 0 ) && ( aName.FindC(_L("WLAN")) != KErrNotFound )) || |
1240 optifquery().iName = info().iName; |
1209 ((aFlag == 1) && (aName.FindC(_L("Generic")) != KErrNotFound )) ) |
1241 ATOMICSOCKETOP( ret = iSocket.GetOpt(KSoInetIfQueryByName, KSolInetIfQuery, optifquery), ret = KErrBadHandle ) |
1210 { |
1242 if( ret == KErrNone) |
1211 switch(aType) |
1243 { |
1212 { |
1244 if(optifquery().iZone[1] == aIapId && info().iAddress.Address() != NULL) |
1213 case EACCESS_SETMETRIC: |
1245 { |
1214 if(info().iState == EIfUp) |
1246 aIfInfo = info(); |
1215 { |
1247 return KErrNone; |
1216 info().iSpeedMetric = ifr->ifr_metric; |
1248 } |
1217 } |
1249 } |
1218 goto setout; |
1250 } |
1219 |
1251 ATOMICSOCKETOP( ret = iSocket.GetOpt(KSoInetNextInterface, KSolInetIfCtrl, info), ret = KErrBadHandle ) |
1220 case EACCESS_SETMTU: |
1252 } |
1221 if(info().iState == EIfUp) |
1253 return KErrNotFound; |
1222 { |
1254 } |
1223 info().iMtu = ifr->ifr_mtu ; |
1255 TInt CSocketDesc :: SetInterfaceDetails( void *aParam ,TInt /*aFlag*/, TInt aType, TInt aIapId ) |
1224 } |
1256 { |
1225 goto setout; |
1257 TSoInet6InterfaceInfo ifInfo; |
1226 |
1258 TInt ret = KErrNone; |
1227 case EACCESS_SETNETMASK : |
1259 if((ret = GetInterfaceInfo(ifInfo,aIapId)) != KErrNone) |
1228 // Presently netmask address is NULL |
1260 { |
1229 if((info().iState == EIfUp) && (ifr->ifr_addr.sa_data !=NULL)) |
1261 return ret; |
1230 { |
1262 } |
1231 /* |
1263 ifreq *ifr = (ifreq *)aParam; |
1232 CharToTBuf8(ifr->ifr_addr.sa_data,ipBuf8); |
1264 switch(aType) |
1233 if (CnvUtfConverter::ConvertToUnicodeFromUtf8( aBuf,ipBuf8 ) == KErrNone) |
1265 { |
1234 { |
1266 case EACCESS_SETMETRIC: |
1235 ret = info().iNetMask.Input(aBuf); |
1267 if(ifInfo.iState == EIfUp) |
1236 } |
1268 { |
1237 info().iNetMask.SetAddress(INET_ADDR(255,255,255,0)); |
1269 ifInfo.iSpeedMetric = ifr->ifr_metric; |
1238 */ |
1270 } |
1239 return KErrNotSupported; |
1271 break; |
1240 } |
1272 |
1241 break; |
1273 case EACCESS_SETMTU: |
1242 case EACCESS_SETBROADCAST : |
1274 if(ifInfo.iState == EIfUp) |
1243 if((info().iState == EIfUp) && (ifr->ifr_broadaddr.sa_data !=NULL)) |
1275 { |
1244 { |
1276 ifInfo.iMtu = ifr->ifr_mtu ; |
1245 /*CharToTBuf8(ifr->ifr_broadaddr.sa_data,ipBuf8); |
1277 } |
1246 if (CnvUtfConverter::ConvertToUnicodeFromUtf8( aBuf,ipBuf8 ) == KErrNone) |
1278 break; |
1247 { |
1279 |
1248 ret = info().iBrdAddr.Input(aBuf); |
1280 case EACCESS_SETPHYSADDR : |
1249 } |
1281 // Currently no imeplentation is given as KIfHasHardwareAddr is always |
1250 */ |
1282 // set to 0 for wlan and GPRS |
1251 return KErrNotSupported; |
1283 if(ifInfo.iFeatures&KIfHasHardwareAddr) |
1252 } |
1284 { |
1253 |
1285 return KErrNotSupported; |
1254 break; |
1286 } |
1255 case EACCESS_SETPHYSADDR : |
1287 break; |
1256 // Currently no imeplentation is given as KIfHasHardwareAddr is always |
1288 case EACCESS_SETDNSSUFFIX: |
1257 // set to 0 for wlan and GPRS |
1289 { |
1258 if(info().iFeatures&KIfHasHardwareAddr) |
1290 if_dns_suffixes * dns_suffix = static_cast<if_dns_suffixes *>(aParam); |
1259 { |
1291 char **suffixes = dns_suffix->suffixes; |
1260 return KErrNotSupported; |
1292 TSoInetInterfaceInfoExtnDnsSuffix interfaceInfo; |
1261 } |
1293 (TSoInetInterfaceInfo &)interfaceInfo = ifInfo; |
1262 break; |
1294 interfaceInfo.iDomainSuffix.DeleteAll(); |
1263 case EACCESS_SETFLAGS : |
1295 TPckgBuf<TSoInetInterfaceInfoExtnDnsSuffix> configInfo(interfaceInfo); |
1264 info().iFeatures = 0; |
1296 |
1265 // Interface UP |
1297 ATOMICSOCKETOP(ret = iSocket.SetOpt(KSoInetConfigInterface,KSolInetIfCtrl,configInfo), ret = KErrBadHandle) |
1266 if((ifr->ifr_flags & IFF_UP) && (ifr->ifr_flags & IFF_DRV_RUNNING)) |
1298 |
1267 { |
1299 for(int i = 0; suffixes[i]; i++) //check the number of suffixes that can be configured |
1268 info().iState = EIfUp; |
1300 { |
1269 } |
1301 TPtrC8 suffix((const unsigned char *)suffixes[i]); |
1270 else |
1302 /*ret = configInfo().iDomainSuffix.Copy(suffix); |
1271 { |
1303 if(ret != KErrNone) |
1272 info().iState = EIfDown; |
1304 { |
1273 } |
1305 return ret; |
1274 |
1306 }*/ |
1275 // Loopback |
1307 ret = CnvUtfConverter::ConvertToUnicodeFromUtf8(configInfo().iDomainSuffix.iSuffixName,suffix); |
1276 if(ifr->ifr_flags & IFF_LOOPBACK) |
1308 configInfo().iDomainSuffix.iDomainSuffixFunction = EInetAddSuffix; |
1277 { |
1309 ATOMICSOCKETOP( ret = iSocket.SetOpt(KSoInetConfigInterface,KSolInetIfCtrl,configInfo), ret = KErrBadHandle) |
1278 info().iFeatures |= KIfIsLoopback; |
1310 if(ret != KErrNone) |
1279 } |
1311 { |
1280 |
1312 return ret; |
1281 // point to point support |
1313 } |
1282 if(ifr->ifr_flags & IFF_POINTOPOINT) |
1314 |
1283 { |
1315 } |
1284 info().iFeatures |= KIfIsPointToPoint; |
1316 return ret; |
1285 } |
1317 } |
1286 |
1318 case EACCESS_SETNAMESERVERS: |
1287 // Broadcast |
1319 { |
1288 if(ifr->ifr_flags & IFF_BROADCAST) |
1320 if_name_servers *name_server = static_cast<if_name_servers*>(aParam); |
1289 { |
1321 if((ret = ConvertSockToTInetAddr(&name_server->nameserver1,ifInfo.iNameSer1)) != KErrNone) |
1290 info().iFeatures |=KIfCanBroadcast; |
1322 { |
1291 } |
1323 return ret; |
1292 |
1324 } |
1293 |
1325 if((ret = ConvertSockToTInetAddr(&name_server->nameserver2,ifInfo.iNameSer2)) != KErrNone) |
1294 // Multicast |
1326 { |
1295 if(ifr->ifr_flagshigh & IFF_MULTICAST) |
1327 return ret; |
1296 { |
1328 } |
1297 info().iFeatures = KIfCanMulticast; |
1329 break; |
1298 } |
1330 } |
1299 //these flags details are available in symbian but not used by lib layer. |
1331 |
1300 /* if(info().iFeatures&KIfCanSetMTU) |
1332 default: |
1301 if(info().iFeatures&KIfHasHardwareAddr) |
1333 return KErrArgument; |
1302 if(info().iFeatures&KIfCanSetHardwareAddr) */ |
1334 } |
1303 goto setout; |
1335 TPckgBuf<TSoInet6InterfaceInfo> pkgIfInfo(ifInfo); |
1304 |
1336 ATOMICSOCKETOP(ret = iSocket.SetOpt(KSoInetConfigInterface, KSolInetIfCtrl,pkgIfInfo), ret = KErrBadHandle) |
1305 default: |
|
1306 break; |
|
1307 } |
|
1308 } |
|
1309 |
|
1310 } |
|
1311 ATOMICSOCKETOP( ret = iSocket.GetOpt(KSoInetNextInterface, KSolInetIfCtrl, info), ret = KErrBadHandle ) |
|
1312 } |
|
1313 setout: |
|
1314 TPckgBuf<TSoInet6InterfaceInfo> changeToNew(info()); |
|
1315 ATOMICSOCKETOP(ret = iSocket.SetOpt(KSoInetConfigInterface, KSolInetIfCtrl,changeToNew), return KErrBadHandle ) |
|
1316 return ret; |
1337 return ret; |
1317 } |
1338 } |
1318 #endif // __SYMBIAN_COMPILE_UNUSED__ |
1339 |
1319 |
1340 //This function frees the memory allocated by SIOCGETDNSSUFFIX ioctl |
1320 TInt CSocketDesc::GetInterfaceDetails( void *aParam ,TInt aFlag, TInt aType ) |
1341 void CSocketDesc::FreeDNSSuffixes(char ** suffixes) |
1321 { |
1342 { |
1322 TPckgBuf<TSoInetIfQuery> ifq; |
1343 for(int i = 0; suffixes[i]; i++) |
1323 |
1344 { |
1324 TInt ret = KErrNone; |
1345 delete[] suffixes[i]; |
1325 ATOMICSOCKETOP( ret = iSocket.SetOpt(KSoInetEnumInterfaces, KSolInetIfCtrl), ret = KErrBadHandle ) |
1346 } |
1326 if (ret != KErrNone) |
1347 delete[] suffixes; |
1327 { |
1348 } |
1328 return KErrGeneral; |
1349 |
1329 } |
1350 TInt CSocketDesc::GetInterfaceDetails( void *aParam ,TInt /*aFlag*/, TInt aType, TInt aIapId ) |
1330 |
1351 { |
|
1352 |
1331 ifreq *ifr = (ifreq *)aParam; |
1353 ifreq *ifr = (ifreq *)aParam; |
1332 *(ifr->ifr_addr.sa_data) = '\0'; |
1354 *(ifr->ifr_addr.sa_data) = '\0'; |
1333 |
1355 TInt ret = 0; |
1334 TPckgBuf<TSoInetInterfaceInfo> info; |
1356 |
1335 ATOMICSOCKETOP( ret = iSocket.GetOpt(KSoInetNextInterface, KSolInetIfCtrl, info), ret = KErrBadHandle ) |
1357 TSoInetInterfaceInfo ifInfo; |
1336 while( ret == KErrNone) |
1358 |
1337 { |
1359 if((ret = GetInterfaceInfo(ifInfo,aIapId)) != KErrNone) |
1338 |
1360 { |
1339 if(info().iName != _L("") && info().iName != _L("loop6") && info().iName != _L("loop4")) |
1361 return ret; |
1340 { |
1362 } |
1341 TDes16& aName = info().iName; |
1363 |
1342 TName aBuf; |
1364 switch(aType) |
1343 TBuf8<KMaxName> ipAddr; |
1365 { |
1344 if( ((aFlag == 0 ) && ( aName.FindC(_L("WLAN")) != KErrNotFound )) || |
1366 |
1345 ((aFlag == 1) && (aName.FindC(_L("Generic")) != KErrNotFound )) ) |
1367 case EACTIVE_GETIP : |
1346 { |
1368 if(ifInfo.iState == EIfUp) |
1347 switch(aType) |
1369 { |
1348 { |
1370 ret = ConvertTInetToSockAddr(ifInfo.iAddress,&ifr->ifr_addr); |
1349 |
1371 return ret; |
1350 case EACTIVE_GETIP : |
1372 } |
1351 if((info().iState == EIfUp) && (info().iAddress.Address() != NULL)) |
1373 break; |
1352 { |
1374 case EACCESS_GETMETRIC: |
1353 if(!((info().iAddress.IsLinkLocal()) || (info().iAddress.IsSiteLocal()))) |
1375 if(ifInfo.iState == EIfUp) |
1354 { |
1376 { |
1355 info().iAddress.Output(aBuf); |
1377 ifr->ifr_metric = ifInfo.iSpeedMetric; |
1356 if (CnvUtfConverter::ConvertFromUnicodeToUtf8( ipAddr, aBuf ) == KErrNone) |
1378 return KErrNone; |
1357 { |
1379 } |
1358 StrlCopy(ifr->ifr_addr.sa_data,(const char *) ipAddr.PtrZ(),ipAddr.Length()+1); |
1380 break; |
1359 } |
1381 case EACCESS_GETMTU: |
1360 } |
1382 if(ifInfo.iState == EIfUp) |
1361 } |
1383 { |
1362 break; |
1384 ifr->ifr_mtu = ifInfo.iMtu; |
1363 case EACCESS_GETMETRIC: |
1385 return KErrNone; |
1364 ifr->ifr_metric = 0; |
1386 } |
1365 if (info().iState == EIfUp) |
1387 break; |
1366 { |
1388 case EACCESS_GETNETMASK : |
1367 ifr->ifr_metric = info().iSpeedMetric; |
1389 // Presently netmask address is NULL |
1368 } |
1390 if(ifInfo.iState == EIfUp) |
1369 break; |
1391 { |
1370 case EACCESS_GETMTU: |
1392 ret = ConvertTInetToSockAddr(ifInfo.iNetMask,&ifr->ifr_addr); |
1371 ifr->ifr_mtu = 0; |
1393 return ret; |
1372 if (info().iState == EIfUp) |
1394 } |
1373 { |
1395 break; |
1374 ifr->ifr_mtu = info().iMtu; |
1396 case EACCESS_GETBROADCAST : |
1375 } |
1397 // Presently Breaodcast address is NULL |
1376 break; |
1398 if(ifInfo.iState == EIfUp) |
1377 case EACCESS_GETNETMASK : |
1399 { |
1378 *(ifr->ifr_addr.sa_data) = '\0'; |
1400 ret = ConvertTInetToSockAddr(ifInfo.iBrdAddr,&ifr->ifr_broadaddr); |
1379 // Presently netmask address is NULL |
1401 return ret; |
1380 if((info().iState == EIfUp) && (info().iNetMask.Address() != NULL)) |
1402 } |
1381 { |
1403 break; |
1382 //anAddr = info().iNetMask.Address(); |
1404 case EACCESS_GETDNSSUFFIX: |
1383 info().iNetMask.Output(aBuf); |
1405 { |
1384 if (CnvUtfConverter::ConvertFromUnicodeToUtf8( ipAddr, aBuf ) == KErrNone) |
1406 |
1385 { |
1407 TInetSuffix data; |
1386 StrlCopy(ifr->ifr_addr.sa_data,(const char *) ipAddr.PtrZ(),ipAddr.Length()+1); |
1408 TPckgBuf<TInetSuffix> opt(data); |
1387 } |
1409 // Set the option to start enumeration of domain suffix on the active interface |
1388 } |
1410 TInt err = KErrNone; |
1389 break; |
1411 ATOMICSOCKETOP( err = iSocket.SetOpt(KSoInetEnumDomainSuffix, KSolInetIfCtrl), err = KErrBadHandle) |
1390 case EACCESS_GETBROADCAST : |
1412 if(err != KErrNone) |
1391 *(ifr->ifr_broadaddr.sa_data) = '\0'; |
1413 { |
1392 // Presently Breaodcast address is NULL |
1414 return err; |
1393 if((info().iState == EIfUp) && (info().iBrdAddr.Address() != NULL)) |
1415 } |
1394 { |
1416 struct if_dns_suffixes * dns_suffix = static_cast<if_dns_suffixes *>(aParam); |
1395 |
1417 RPointerArray<char> suffixArray; |
1396 //anAddr = info().iBrdAddr.Address(); |
1418 ATOMICSOCKETOP (err = iSocket.GetOpt(KSoInetNextDomainSuffix, KSolInetIfCtrl, opt),err = KErrBadHandle) |
1397 info().iBrdAddr.Output(aBuf); |
1419 while(err == KErrNone) |
1398 if (CnvUtfConverter::ConvertFromUnicodeToUtf8( ipAddr, aBuf ) == KErrNone) |
1420 { |
1399 { |
1421 char *suffix = new char[opt().iSuffixName.Length()+1]; |
1400 StrlCopy(ifr->ifr_broadaddr.sa_data,(const char *) ipAddr.PtrZ(),ipAddr.Length()+1); |
1422 if((ret = suffixArray.Append(suffix)) != KErrNone) |
1401 } |
1423 { |
1402 } |
1424 suffixArray.ResetAndDestroy(); |
1403 break; |
1425 return ret; |
1404 case EACCESS_GETPHYSADDR : |
1426 } |
1405 ifr->ifr_phys = 0; |
1427 TPtr8 ptr((unsigned char *)suffix,opt().iSuffixName.Length()+1); |
1406 // Currently no imeplentation is given as KIfHasHardwareAddr is always |
1428 ret = CnvUtfConverter::ConvertFromUnicodeToUtf8(ptr,opt().iSuffixName); |
1407 // set to 0 for wlan and GPRS |
1429 //ptr.Copy(opt().iSuffixName); |
1408 if(info().iFeatures&KIfHasHardwareAddr) |
1430 if(ret != KErrNone) |
1409 { |
1431 { |
1410 //nada. |
1432 suffixArray.ResetAndDestroy(); |
1411 } |
1433 return ret; |
1412 break; |
1434 } |
1413 case EACCESS_GETFLAGS : |
1435 ptr.ZeroTerminate(); |
1414 ifr->ifr_flags = 0; |
1436 ATOMICSOCKETOP (err = iSocket.GetOpt(KSoInetNextDomainSuffix, KSolInetIfCtrl, opt),err = KErrBadHandle) |
1415 ifr->ifr_flagshigh=0; |
1437 } |
1416 // Interface UP |
1438 |
1417 if(info().iState == EIfUp) |
1439 dns_suffix->suffixes = new char*[suffixArray.Count() + 1]; |
1418 { |
1440 for(int i = 0 ; i< suffixArray.Count(); i++) |
1419 ifr->ifr_flags |= IFF_UP; |
1441 { |
1420 ifr->ifr_flags |= IFF_DRV_RUNNING; |
1442 dns_suffix->suffixes[i] = suffixArray[i]; |
1421 } |
1443 } |
1422 // Loopback |
1444 dns_suffix->suffixes[suffixArray.Count()] = NULL; |
1423 if(info().iFeatures&KIfIsLoopback) |
1445 suffixArray.Close(); |
1424 { |
1446 return KErrNone; |
1425 ifr->ifr_flags |= IFF_LOOPBACK; |
1447 |
1426 } |
1448 } |
1427 |
1449 |
1428 // point to point support |
1450 case EACCESS_GETNAMESERVERS: |
1429 if(info().iFeatures&KIfIsPointToPoint) |
1451 { |
1430 { |
1452 if_name_servers *name_server = static_cast<if_name_servers*>(aParam); |
1431 ifr->ifr_flags |= IFF_POINTOPOINT; |
1453 if((ret = ConvertTInetToSockAddr(ifInfo.iNameSer1, &name_server->nameserver1)) != KErrNone) |
1432 } |
1454 { |
1433 |
1455 return ret; |
1434 // Broadcast |
1456 } |
1435 if(info().iFeatures&KIfCanBroadcast) |
1457 if((ret = ConvertTInetToSockAddr(ifInfo.iNameSer2, &name_server->nameserver2)) != KErrNone) |
1436 { |
1458 { |
1437 ifr->ifr_flags |= IFF_BROADCAST; |
1459 return ret; |
1438 } |
1460 } |
1439 |
1461 return KErrNone; |
1440 // Multicast |
1462 |
1441 if(info().iFeatures&KIfCanMulticast) |
1463 } |
1442 { |
1464 |
1443 ifr->ifr_flagshigh |= ((IFF_MULTICAST & 0xff00) >> 8); |
1465 case EACCESS_GETPHYSADDR : |
1444 } |
1466 ifr->ifr_phys = 0; |
1445 //these flags details are available in symbian but not used by lib layer. |
1467 // Currently no imeplentation is given as KIfHasHardwareAddr is always |
1446 /* if(info().iFeatures&KIfCanSetMTU) |
1468 // set to 0 for wlan and GPRS |
1447 if(info().iFeatures&KIfHasHardwareAddr) |
1469 if(ifInfo.iFeatures&KIfHasHardwareAddr) |
1448 if(info().iFeatures&KIfCanSetHardwareAddr) */ |
1470 { |
1449 |
1471 //nada. |
1450 break; |
1472 } |
1451 |
1473 return KErrNotSupported; |
1452 } |
1474 |
1453 } |
1475 case EACCESS_GETDEFGATEWAY: |
1454 |
1476 if(ifInfo.iState == EIfUp) |
1455 } |
1477 { |
1456 ATOMICSOCKETOP( ret = iSocket.GetOpt(KSoInetNextInterface, KSolInetIfCtrl, info), ret = KErrBadHandle ) |
1478 ret = ConvertTInetToSockAddr(ifInfo.iDefGate,&ifr->ifr_defgatewayaddr); |
1457 } |
1479 return ret; |
1458 |
1480 } |
1459 return KErrNone; |
1481 break; |
|
1482 |
|
1483 |
|
1484 case EACCESS_GETFLAGS : |
|
1485 ifr->ifr_flags = 0; |
|
1486 ifr->ifr_flagshigh=0; |
|
1487 // Interface UP |
|
1488 if(ifInfo.iState == EIfUp) |
|
1489 { |
|
1490 ifr->ifr_flags |= IFF_UP; |
|
1491 ifr->ifr_flags |= IFF_DRV_RUNNING; |
|
1492 } |
|
1493 // Loopback |
|
1494 if(ifInfo.iFeatures&KIfIsLoopback) |
|
1495 { |
|
1496 ifr->ifr_flags |= IFF_LOOPBACK; |
|
1497 } |
|
1498 |
|
1499 // point to point support |
|
1500 if(ifInfo.iFeatures&KIfIsPointToPoint) |
|
1501 { |
|
1502 ifr->ifr_flags |= IFF_POINTOPOINT; |
|
1503 } |
|
1504 |
|
1505 // Broadcast |
|
1506 if(ifInfo.iFeatures&KIfCanBroadcast) |
|
1507 { |
|
1508 ifr->ifr_flags |= IFF_BROADCAST; |
|
1509 } |
|
1510 |
|
1511 // Multicast |
|
1512 if(ifInfo.iFeatures&KIfCanMulticast) |
|
1513 { |
|
1514 ifr->ifr_flagshigh |= ((IFF_MULTICAST & 0xff00) >> 8); |
|
1515 } |
|
1516 return KErrNone; |
|
1517 |
|
1518 default: |
|
1519 return KErrArgument; |
|
1520 } |
|
1521 |
|
1522 |
|
1523 return KErrNotFound; |
|
1524 |
1460 } |
1525 } |
1461 |
1526 |
1462 TInt CSocketDesc::Poll(TPollMode aMode,TBool& aReadyStatus,TInt& aErrno) |
1527 TInt CSocketDesc::Poll(TPollMode aMode,TBool& aReadyStatus,TInt& aErrno) |
1463 { |
1528 { |
1464 TInt ret = maybe_reopen_socket(); |
1529 TInt ret = maybe_reopen_socket(); |
2244 } |
2309 } |
2245 ifreq *ifr = (ifreq * )aParam; |
2310 ifreq *ifr = (ifreq * )aParam; |
2246 ifr->ifr_index = opt().iZone[1]; //IAP_ID |
2311 ifr->ifr_index = opt().iZone[1]; //IAP_ID |
2247 return KErrNone; |
2312 return KErrNone; |
2248 } |
2313 } |
|
2314 |
|
2315 |
|
2316 TInt CSocketDesc::GetActiveInterfaceIAPIdByName(const char *aIapName,TInt& aIapId) |
|
2317 { |
|
2318 |
|
2319 TInt rcIndex = 0; |
|
2320 RConnection *rc; |
|
2321 TAccessPointRecord tempRecord; |
|
2322 char iapName[IFNAMSIZ]; |
|
2323 TInt ret = KErrNotFound; |
|
2324 // ifreq * ifr = static_cast<ifreq *> (aParam); //may not work, will have to reinterper_cast |
|
2325 |
|
2326 while(((CFileTable*)iFids)->RConnectionAt(rcIndex++, rc) == KErrNone) |
|
2327 { |
|
2328 if( GetRConnectionDetails(rc, tempRecord) != KErrNone ) |
|
2329 { |
|
2330 continue; |
|
2331 } |
|
2332 TPtr8 ptr((TText8*)iapName, IFNAMSIZ-1); |
|
2333 |
|
2334 ret = CnvUtfConverter::ConvertFromUnicodeToUtf8(ptr, tempRecord.iName); |
|
2335 if(ret == KErrNone) |
|
2336 { |
|
2337 ptr.ZeroTerminate(); |
|
2338 if(StrCmp(iapName, aIapName) == 0) |
|
2339 { |
|
2340 aIapId = tempRecord.iId; |
|
2341 return KErrNone; |
|
2342 } |
|
2343 } |
|
2344 } |
|
2345 return ret; //is it okay? ret contains rite val? |
|
2346 } |
|
2347 //converts Symbian Inetaddres structure to posix sockaddr structure |
|
2348 TInt CSocketDesc::ConvertTInetToSockAddr(const TInetAddr& aInetAddr, sockaddr * aSockAddr ) |
|
2349 { |
|
2350 TUSockAddr addr(aInetAddr); |
|
2351 unsigned long len = sizeof(sockaddr); |
|
2352 addr.Get(aSockAddr,&len); |
|
2353 return addr.iError; |
|
2354 } |
|
2355 |
|
2356 //converts posix sockaddr structure to Symbian Inetaddres structure |
|
2357 TInt CSocketDesc::ConvertSockToTInetAddr(const sockaddr * aSockAddr, TInetAddr& aInetAddr) |
|
2358 { |
|
2359 unsigned int len = sizeof(sockaddr); |
|
2360 TUSockAddr addr(aSockAddr,len); |
|
2361 aInetAddr = addr; |
|
2362 return addr.iError; |
|
2363 } |
|
2364 |
|
2365 //Gets the Iap id by IAP name and using iap id gets the interface details |
|
2366 TInt CSocketDesc::GetInterfaceAttributes(void *aParam, int aFlag) |
|
2367 { |
|
2368 ifreq * ifr = static_cast<ifreq *> (aParam); //may not work, will have to reinterper_cast |
|
2369 TInt ret = KErrGeneral, iapId; |
|
2370 ret = GetActiveInterfaceIAPIdByName(ifr->ifr_name,iapId); |
|
2371 if(ret == KErrNone) |
|
2372 { |
|
2373 ret = GetInterfaceDetails( ifr ,0, aFlag, iapId); //what to do with return value |
|
2374 } |
|
2375 return ret; |
|
2376 |
|
2377 } |
|
2378 |
|
2379 //Gets the Iap id by IAP name and using iap id sets the interface details |
|
2380 TInt CSocketDesc::SetInterfaceAttributes(void *aParam, int aFlag) |
|
2381 { |
|
2382 ifreq * ifr = static_cast<ifreq *> (aParam); //access of only if_name guaranteed to work. |
|
2383 TInt ret = KErrGeneral, iapId; |
|
2384 ret = GetActiveInterfaceIAPIdByName(ifr->ifr_name,iapId); |
|
2385 if(ret == KErrNone) |
|
2386 { |
|
2387 ret = SetInterfaceDetails( aParam ,0, aFlag, iapId); //what to do with return value |
|
2388 } |
|
2389 return ret; |
|
2390 } |
|
2391 |
|
2392 //Enumerates the routes configured on the system |
|
2393 TInt CSocketDesc::EnumerateRoutes(void *aParam) |
|
2394 { |
|
2395 TInt ret = KErrNone; |
|
2396 rtconf *rtc = (rtconf*)aParam; |
|
2397 TInt routeCount = (rtc->rt_len) /sizeof (route_entry); |
|
2398 route_entry *rtentry = rtc->rtc_rtcu.rtcu_entry; |
|
2399 ATOMICSOCKETOP(ret = iSocket.SetOpt(KSoInetEnumRoutes, KSolInetRtCtrl),ret = KErrBadHandle) |
|
2400 if(ret != KErrNone ) |
|
2401 { |
|
2402 return ret; |
|
2403 } |
|
2404 //If the length is zero, we fill the number of routes available information |
|
2405 TInt count = 0; |
|
2406 TPckgBuf<TSoInetRouteInfo> route; |
|
2407 if(routeCount <=0 || rtc->rtc_buf ==NULL) |
|
2408 { |
|
2409 ATOMICSOCKETOP(ret = iSocket.GetOpt(KSoInetNextRoute, KSolInetRtCtrl, route), ret = KErrBadHandle) |
|
2410 while(ret == KErrNone) |
|
2411 { |
|
2412 count++; |
|
2413 ATOMICSOCKETOP(ret = iSocket.GetOpt(KSoInetNextRoute, KSolInetRtCtrl, route), ret = KErrBadHandle) |
|
2414 } |
|
2415 rtc->rt_len = count * sizeof(route_entry) ; |
|
2416 return KErrNone; |
|
2417 } |
|
2418 for(TInt i=0; i<routeCount ; i++) |
|
2419 { |
|
2420 ATOMICSOCKETOP(ret = iSocket.GetOpt(KSoInetNextRoute, KSolInetRtCtrl, route),ret = KErrBadHandle) |
|
2421 if(ret != KErrNone) |
|
2422 { |
|
2423 break; |
|
2424 } |
|
2425 ConvertTInetToSockAddr(route().iDstAddr, &rtentry[i].dst_addr); |
|
2426 ConvertTInetToSockAddr(route().iIfAddr, &rtentry[i].ifaddr); |
|
2427 ConvertTInetToSockAddr(route().iGateway, &rtentry[i].gateway_addr); |
|
2428 ConvertTInetToSockAddr(route().iNetMask, &rtentry[i].dst_netmask); |
|
2429 TInt state = route().iState; |
|
2430 TInt type = route().iType; |
|
2431 rtentry[i].rt_metric = route().iMetric; |
|
2432 rtentry[i].rt_flags.state = state; |
|
2433 rtentry[i].rt_flags.type = type; |
|
2434 |
|
2435 } |
|
2436 |
|
2437 return KErrNone; |
|
2438 } |
|
2439 |
|
2440 //Sets the nameserver of an interface |
|
2441 TInt CSocketDesc::SetNameServer(void *aParam, int aFlag) |
|
2442 { |
|
2443 if_name_servers * dns_server = static_cast<if_name_servers *> (aParam); //access of only if_name guaranteed to work. |
|
2444 TInt iapId; |
|
2445 TInt ret = GetActiveInterfaceIAPIdByName(dns_server->if_name, iapId); |
|
2446 if(ret == KErrNone) |
|
2447 { |
|
2448 ret = SetInterfaceDetails( aParam ,0, aFlag, iapId); //what to do with return value |
|
2449 } |
|
2450 return ret; |
|
2451 } |
|
2452 |
|
2453 //Gets the nameserver of an interface |
|
2454 TInt CSocketDesc::GetNameServer(void *aParam, int aFlag) |
|
2455 { |
|
2456 if_name_servers * dns_server = static_cast<if_name_servers *> (aParam); //access of only if_name guaranteed to work. |
|
2457 TInt iapId; |
|
2458 TInt ret = GetActiveInterfaceIAPIdByName(dns_server->if_name, iapId); |
|
2459 if(ret == KErrNone) |
|
2460 { |
|
2461 ret = GetInterfaceDetails( dns_server ,0, aFlag, iapId); //what to do with return value |
|
2462 } |
|
2463 return ret; |
|
2464 } |