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


Reply via email to