Transport: Prefer temporary IPv6 addresses when in laptop mode

This commit is contained in:
zzz
2019-09-08 12:09:35 +00:00
parent 32d420e76f
commit 331ecf0625

View File

@ -245,31 +245,38 @@ public class TransportManager implements TransportEventListener {
Set<String> ipset = Addresses.getAddresses(_context.getBooleanProperty("i2np.allowLocal"), false, true); Set<String> ipset = Addresses.getAddresses(_context.getBooleanProperty("i2np.allowLocal"), false, true);
String lastv4 = _context.getProperty(UDPTransport.PROP_IP); String lastv4 = _context.getProperty(UDPTransport.PROP_IP);
String lastv6 = _context.getProperty(UDPTransport.PROP_IPV6); String lastv6 = _context.getProperty(UDPTransport.PROP_IPV6);
boolean preferTemp = _context.getBooleanProperty(UDPTransport.PROP_LAPTOP_MODE);
// //
// Avoid IPv6 temporary addresses if we have a non-temporary one // Avoid IPv6 temporary addresses if we have a non-temporary one,
// unless laptop mode
// //
boolean hasNonTempV6Address = false; boolean hasPreferredV6Address = false;
List<InetAddress> addresses = new ArrayList<InetAddress>(4); List<InetAddress> addresses = new ArrayList<InetAddress>(4);
List<Inet6Address> tempV6Addresses = new ArrayList<Inet6Address>(4); List<Inet6Address> nonPreferredV6Addresses = new ArrayList<Inet6Address>(4);
for (String ips : ipset) { for (String ips : ipset) {
try { try {
InetAddress addr = InetAddress.getByName(ips); InetAddress addr = InetAddress.getByName(ips);
if (ips.contains(":") && (addr instanceof Inet6Address)) { if (ips.contains(":") && (addr instanceof Inet6Address)) {
Inet6Address v6addr = (Inet6Address) addr; Inet6Address v6addr = (Inet6Address) addr;
// getAddresses(false, true) will not return deprecated addresses // getAddresses(false, true) will not return deprecated addresses
//if (Addresses.isDeprecated(v6addr)) { boolean isTemp = Addresses.isTemporary(v6addr);
// if (_log.shouldWarn()) if (preferTemp) {
// _log.warn("Not binding to deprecated temporary address " + bt); if (!isTemp) {
// continue; // Save permanent addresses
//} // we only use these if we don't have a temporary address,
if (Addresses.isTemporary(v6addr) && !ips.equals(lastv6)) { nonPreferredV6Addresses.add(v6addr);
// Save temporary addresses continue;
// we only use these if we don't have a non-temporary address, }
// unless it's the last IP we used } else {
tempV6Addresses.add(v6addr); if (isTemp && !ips.equals(lastv6)) {
continue; // Save temporary addresses
// we only use these if we don't have a permanent address,
// unless it's the last IP we used
nonPreferredV6Addresses.add(v6addr);
continue;
}
} }
hasNonTempV6Address = true; hasPreferredV6Address = true;
} }
// put previously used addresses at the front of the list // put previously used addresses at the front of the list
if (ips.equals(lastv4) || ips.equals(lastv6)) if (ips.equals(lastv4) || ips.equals(lastv6))
@ -280,16 +287,21 @@ public class TransportManager implements TransportEventListener {
_log.error("UDP failed to bind to local address", e); _log.error("UDP failed to bind to local address", e);
} }
} }
// we only use these if we don't have a non-temporary adress // we only use these if we don't have a preferred adress
if (!tempV6Addresses.isEmpty()) { if (!nonPreferredV6Addresses.isEmpty()) {
if (hasNonTempV6Address) { if (hasPreferredV6Address) {
if (_log.shouldWarn()) { if (_log.shouldWarn()) {
for (Inet6Address addr : tempV6Addresses) { for (Inet6Address addr : nonPreferredV6Addresses) {
_log.warn("Not binding to temporary address " + addr.getHostAddress()); _log.warn("Not binding to address " + addr.getHostAddress());
} }
} }
} else { } else {
addresses.addAll(tempV6Addresses); addresses.addAll(nonPreferredV6Addresses);
}
}
if (_log.shouldWarn()) {
for (InetAddress ia : addresses) {
_log.warn("Transport address: " + ia.getHostAddress());
} }
} }
for (Transport t : ts) { for (Transport t : ts) {