diff --git a/src/net/sf/briar/plugins/tcp/MappingResult.java b/src/net/sf/briar/plugins/tcp/MappingResult.java index f558a8d731f45d162900485e9ba8253a5a896872..e598d0c2a7c5f476cbd9e6c275cdd4c4908ec557 100644 --- a/src/net/sf/briar/plugins/tcp/MappingResult.java +++ b/src/net/sf/briar/plugins/tcp/MappingResult.java @@ -1,32 +1,31 @@ package net.sf.briar.plugins.tcp; import java.net.InetAddress; +import java.net.InetSocketAddress; class MappingResult { private final InetAddress internal, external; + private final int port; private final boolean succeeded; - MappingResult(InetAddress internal, InetAddress external, + MappingResult(InetAddress internal, InetAddress external, int port, boolean succeeded) { this.internal = internal; this.external = external; + this.port = port; this.succeeded = succeeded; } - InetAddress getInternal() { - return internal; + InetSocketAddress getInternal() { + return isUsable() ? new InetSocketAddress(internal, port) : null; } - InetAddress getExternal() { - return external; - } - - boolean getSucceeded() { - return succeeded; + InetSocketAddress getExternal() { + return isUsable() ? new InetSocketAddress(external, port) : null; } boolean isUsable() { - return internal != null && external != null && succeeded; + return internal != null && external != null && port != 0 && succeeded; } } diff --git a/src/net/sf/briar/plugins/tcp/PortMapperImpl.java b/src/net/sf/briar/plugins/tcp/PortMapperImpl.java index e990cb2e38eb1e90c3301dcac142400821b089ec..d3da9eb63cfab8e60f4553cb9768e50665438202 100644 --- a/src/net/sf/briar/plugins/tcp/PortMapperImpl.java +++ b/src/net/sf/briar/plugins/tcp/PortMapperImpl.java @@ -1,5 +1,6 @@ package net.sf.briar.plugins.tcp; +import static java.util.logging.Level.INFO; import static java.util.logging.Level.WARNING; import java.io.IOException; @@ -44,7 +45,11 @@ class PortMapperImpl implements PortMapper { public void stop() { if(gateway == null) return; try { - for(Integer port: ports) gateway.deletePortMapping(port, "TCP"); + for(Integer port: ports) { + gateway.deletePortMapping(port, "TCP"); + if(LOG.isLoggable(INFO)) + LOG.info("Deleted mapping for port " + port); + } } catch(IOException e) { if(LOG.isLoggable(WARNING)) LOG.warning(e.toString()); } catch(SAXException e) { @@ -71,12 +76,16 @@ class PortMapperImpl implements PortMapper { String externalString = gateway.getExternalIPAddress(); if(externalString != null) external = InetAddress.getByName(externalString); + if(LOG.isLoggable(INFO)) { + if(succeeded) LOG.info("External address " + externalString); + else LOG.info("Could not create port mapping"); + } } catch(IOException e) { if(LOG.isLoggable(WARNING)) LOG.warning(e.toString()); } catch(SAXException e) { if(LOG.isLoggable(WARNING)) LOG.warning(e.toString()); } if(succeeded) ports.add(port); - return new MappingResult(internal, external, succeeded); + return new MappingResult(internal, external, port, succeeded); } } diff --git a/src/net/sf/briar/plugins/tcp/WanTcpPlugin.java b/src/net/sf/briar/plugins/tcp/WanTcpPlugin.java index 9b2cd234fa938d2ca74e47d024c97dfe30590438..c0849cf92749799f83e1a59ac8ba32a27e3c0ab2 100644 --- a/src/net/sf/briar/plugins/tcp/WanTcpPlugin.java +++ b/src/net/sf/briar/plugins/tcp/WanTcpPlugin.java @@ -72,7 +72,7 @@ class WanTcpPlugin extends TcpPlugin { @Override protected List<SocketAddress> getLocalSocketAddresses() { List<SocketAddress> addrs = new ArrayList<SocketAddress>(); - // Prefer a previously used external address and port if available + // Prefer a previously used address and port if available TransportProperties p = callback.getLocalProperties(); String addrString = p.get("address"); String portString = p.get("port"); @@ -90,6 +90,7 @@ class WanTcpPlugin extends TcpPlugin { if(LOG.isLoggable(WARNING)) LOG.warning(e.toString()); } } + // Get a list of the device's network interfaces List<NetworkInterface> ifaces; try { ifaces = Collections.list(NetworkInterface.getNetworkInterfaces()); @@ -107,11 +108,11 @@ class WanTcpPlugin extends TcpPlugin { if(!link && !site) addrs.add(new InetSocketAddress(a, 0)); } } - // Accept interfaces that can be port-mapped + // Accept interfaces with local addresses that can be port-mapped if(port == 0) port = chooseEphemeralPort(); mappingResult = portMapper.map(port); if(mappingResult != null && mappingResult.isUsable()) - addrs.add(new InetSocketAddress(mappingResult.getInternal(), port)); + addrs.add(mappingResult.getInternal()); return addrs; } @@ -121,13 +122,13 @@ class WanTcpPlugin extends TcpPlugin { @Override protected void setLocalSocketAddress(InetSocketAddress a) { - InetAddress addr = a.getAddress(); if(mappingResult != null && mappingResult.isUsable()) { - if(addr.equals(mappingResult.getInternal())) - addr = mappingResult.getExternal(); + // Advertise the external address to contacts + if(a.equals(mappingResult.getInternal())) + a = mappingResult.getExternal(); } TransportProperties p = new TransportProperties(); - p.put("address", addr.getHostAddress()); + p.put("address", a.getAddress().getHostAddress()); p.put("port", String.valueOf(a.getPort())); callback.mergeLocalProperties(p); }