Author: toad
Date: 2007-11-21 15:53:52 +0000 (Wed, 21 Nov 2007)
New Revision: 15906
Modified:
trunk/freenet/src/freenet/clients/http/ConnectivityToadlet.java
trunk/freenet/src/freenet/io/AddressTracker.java
trunk/freenet/src/freenet/l10n/freenet.l10n.en.properties
Log:
Simple detection logic.
Modified: trunk/freenet/src/freenet/clients/http/ConnectivityToadlet.java
===================================================================
--- trunk/freenet/src/freenet/clients/http/ConnectivityToadlet.java
2007-11-21 15:43:31 UTC (rev 15905)
+++ trunk/freenet/src/freenet/clients/http/ConnectivityToadlet.java
2007-11-21 15:53:52 UTC (rev 15906)
@@ -72,10 +72,10 @@
for(int i=0;i<handlers.length;i++) {
// Peers
- HTMLNode portsBox =
pageMaker.getInfobox(L10n.getString("ConnectivityToadlet.byPortTitle", "port",
handlers[i].getName()));
+ AddressTracker tracker =
handlers[i].getAddressTracker();
+ HTMLNode portsBox =
pageMaker.getInfobox(L10n.getString("ConnectivityToadlet.byPortTitle", new
String[] { "port", "status" }, new String[] { handlers[i].getName(),
AddressTracker.statusString(tracker.getPortForwardStatus()) }));
contentNode.addChild(portsBox);
HTMLNode portsContent =
pageMaker.getContentNode(portsBox);
- AddressTracker tracker =
handlers[i].getAddressTracker();
PeerAddressTrackerItem[] items =
tracker.getPeerAddressTrackerItems();
HTMLNode table = portsContent.addChild("table");
HTMLNode row = table.addChild("tr");
@@ -101,7 +101,7 @@
}
// IPs
- portsBox =
pageMaker.getInfobox(L10n.getString("ConnectivityToadlet.byIPTitle", "ip",
handlers[i].getName()));
+ portsBox =
pageMaker.getInfobox(L10n.getString("ConnectivityToadlet.byIPTitle", new
String[] { "ip", "status" }, new String[] { handlers[i].getName(),
AddressTracker.statusString(tracker.getPortForwardStatus()) }));
contentNode.addChild(portsBox);
portsContent = pageMaker.getContentNode(portsBox);
InetAddressAddressTrackerItem[] ipItems =
tracker.getInetAddressTrackerItems();
Modified: trunk/freenet/src/freenet/io/AddressTracker.java
===================================================================
--- trunk/freenet/src/freenet/io/AddressTracker.java 2007-11-21 15:43:31 UTC
(rev 15905)
+++ trunk/freenet/src/freenet/io/AddressTracker.java 2007-11-21 15:53:52 UTC
(rev 15906)
@@ -110,4 +110,39 @@
InetAddressAddressTrackerItem[] items = new
InetAddressAddressTrackerItem[ipTrackers.size()];
return (InetAddressAddressTrackerItem[])
ipTrackers.values().toArray(items);
}
+
+ public static final int DEFINITELY_PORT_FORWARDED = 1;
+ public static final int DEFINITELY_NATED = -1;
+ public static final int DONT_KNOW = 0;
+
+ /** Assume NAT UDP hole punching tunnels are no longer than this */
+ public static int MAX_TUNNEL_LENGTH = ((5*60)+1)*1000;
+
+ public int getPortForwardStatus() {
+ PeerAddressTrackerItem[] items = getPeerAddressTrackerItems();
+ for(int i=0;i<items.length;i++) {
+ PeerAddressTrackerItem item = items[i];
+ if(item.packetsReceived() <= 0) continue;
+ if(item.weSentFirst()) continue;
+ if(!item.peer.isRealInternetAddress(false, false))
continue;
+ if(item.timeFromStartupToFirstReceivedPacket() >
MAX_TUNNEL_LENGTH) {
+ // FIXME should require more than one
+ return DEFINITELY_PORT_FORWARDED;
+ }
+ }
+ return DONT_KNOW;
+ }
+
+ public static String statusString(int status) {
+ switch(status) {
+ case DEFINITELY_PORT_FORWARDED:
+ return "Port forwarded";
+ case DEFINITELY_NATED:
+ return "Behind NAT";
+ case DONT_KNOW:
+ return "Status unknown";
+ default:
+ return "Error";
+ }
+ }
}
Modified: trunk/freenet/src/freenet/l10n/freenet.l10n.en.properties
===================================================================
--- trunk/freenet/src/freenet/l10n/freenet.l10n.en.properties 2007-11-21
15:43:31 UTC (rev 15905)
+++ trunk/freenet/src/freenet/l10n/freenet.l10n.en.properties 2007-11-21
15:53:52 UTC (rev 15906)
@@ -87,7 +87,7 @@
ConfigToadlet.true=true
ConfigurablePersister.doesNotExistCannotCreate=File does not exist and cannot
be created
ConfigurablePersister.existsCannotReadWrite=File exists and cannot read/write
it
-ConnectivityToadlet.byIPTitle=Packets for ${ip} by IP address
+ConnectivityToadlet.byIPTitle=Packets for ${ip} by IP address - ${status}
ConnectivityToadlet.title=Internet connectivity for ${nodeName}
ConnectivityToadlet.connectivity=Internet Connectivity
ConnectivityToadlet.connectivityTitle=Connectivity
@@ -96,7 +96,7 @@
ConnectivityToadlet.localRemoteTitle=Local/remote
ConnectivityToadlet.addressTitle=Address
ConnectivityToadlet.sentReceivedTitle=Sent/received packets
-ConnectivityToadlet.byPortTitle=Packets for ${port} by port
+ConnectivityToadlet.byPortTitle=Packets for ${port} by port - ${status}
ConnectivityToadlet.local=LOCAL
ConnectivityToadlet.remote=REMOTE
ConnectivityToadlet.noreply=NO REPLY