|
|
|
|
@ -672,6 +672,7 @@ bool WindowsEthernetTap::addIp(const InetAddress &ip)
|
|
|
|
|
{ |
|
|
|
|
if (!ip.netmaskBits()) // sanity check... netmask of 0.0.0.0 is WUT?
|
|
|
|
|
return false; |
|
|
|
|
|
|
|
|
|
Mutex::Lock _l(_assignedIps_m); |
|
|
|
|
if (std::find(_assignedIps.begin(),_assignedIps.end(),ip) != _assignedIps.end()) |
|
|
|
|
return true; |
|
|
|
|
@ -682,6 +683,9 @@ bool WindowsEthernetTap::addIp(const InetAddress &ip)
|
|
|
|
|
|
|
|
|
|
bool WindowsEthernetTap::removeIp(const InetAddress &ip) |
|
|
|
|
{ |
|
|
|
|
if (ip.isV6()) |
|
|
|
|
return true; |
|
|
|
|
|
|
|
|
|
{ |
|
|
|
|
Mutex::Lock _l(_assignedIps_m); |
|
|
|
|
std::vector<InetAddress>::iterator aip(std::find(_assignedIps.begin(),_assignedIps.end(),ip)); |
|
|
|
|
@ -713,18 +717,20 @@ bool WindowsEthernetTap::removeIp(const InetAddress &ip)
|
|
|
|
|
DeleteUnicastIpAddressEntry(&(ipt->Table[i])); |
|
|
|
|
FreeMibTable(ipt); |
|
|
|
|
|
|
|
|
|
std::vector<std::string> regIps(_getRegistryIPv4Value("IPAddress")); |
|
|
|
|
std::vector<std::string> regSubnetMasks(_getRegistryIPv4Value("SubnetMask")); |
|
|
|
|
std::string ipstr(ip.toIpString()); |
|
|
|
|
for(std::vector<std::string>::iterator rip(regIps.begin()),rm(regSubnetMasks.begin());((rip!=regIps.end())&&(rm!=regSubnetMasks.end()));++rip,++rm) { |
|
|
|
|
if (*rip == ipstr) { |
|
|
|
|
regIps.erase(rip); |
|
|
|
|
regSubnetMasks.erase(rm); |
|
|
|
|
_setRegistryIPv4Value("IPAddress",regIps); |
|
|
|
|
_setRegistryIPv4Value("SubnetMask",regSubnetMasks); |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if (ip.isV4()) { |
|
|
|
|
std::vector<std::string> regIps(_getRegistryIPv4Value("IPAddress")); |
|
|
|
|
std::vector<std::string> regSubnetMasks(_getRegistryIPv4Value("SubnetMask")); |
|
|
|
|
std::string ipstr(ip.toIpString()); |
|
|
|
|
for (std::vector<std::string>::iterator rip(regIps.begin()), rm(regSubnetMasks.begin()); ((rip != regIps.end()) && (rm != regSubnetMasks.end())); ++rip, ++rm) { |
|
|
|
|
if (*rip == ipstr) { |
|
|
|
|
regIps.erase(rip); |
|
|
|
|
regSubnetMasks.erase(rm); |
|
|
|
|
_setRegistryIPv4Value("IPAddress", regIps); |
|
|
|
|
_setRegistryIPv4Value("SubnetMask", regSubnetMasks); |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
@ -1195,15 +1201,18 @@ void WindowsEthernetTap::_syncIps()
|
|
|
|
|
CreateUnicastIpAddressEntry(&ipr); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
std::string ipStr(aip->toString()); |
|
|
|
|
std::vector<std::string> regIps(_getRegistryIPv4Value("IPAddress")); |
|
|
|
|
if (std::find(regIps.begin(),regIps.end(),ipStr) == regIps.end()) { |
|
|
|
|
std::vector<std::string> regSubnetMasks(_getRegistryIPv4Value("SubnetMask")); |
|
|
|
|
regIps.push_back(ipStr); |
|
|
|
|
regSubnetMasks.push_back(aip->netmask().toIpString()); |
|
|
|
|
_setRegistryIPv4Value("IPAddress",regIps); |
|
|
|
|
_setRegistryIPv4Value("SubnetMask",regSubnetMasks); |
|
|
|
|
} |
|
|
|
|
if (aip->isV4()) |
|
|
|
|
{ |
|
|
|
|
std::string ipStr(aip->toIpString()); |
|
|
|
|
std::vector<std::string> regIps(_getRegistryIPv4Value("IPAddress")); |
|
|
|
|
if (std::find(regIps.begin(), regIps.end(), ipStr) == regIps.end()) { |
|
|
|
|
std::vector<std::string> regSubnetMasks(_getRegistryIPv4Value("SubnetMask")); |
|
|
|
|
regIps.push_back(ipStr); |
|
|
|
|
regSubnetMasks.push_back(aip->netmask().toIpString()); |
|
|
|
|
_setRegistryIPv4Value("IPAddress", regIps); |
|
|
|
|
_setRegistryIPv4Value("SubnetMask", regSubnetMasks); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|