Author: toad
Date: 2007-11-28 15:30:24 +0000 (Wed, 28 Nov 2007)
New Revision: 16017

Modified:
   trunk/freenet/src/freenet/io/AddressTracker.java
   trunk/freenet/src/freenet/io/AddressTrackerItem.java
Log:
12 hours 1 minute = definitely port forwarded
5 minutes 1 second = maybe port forwarded

Modified: trunk/freenet/src/freenet/io/AddressTracker.java
===================================================================
--- trunk/freenet/src/freenet/io/AddressTracker.java    2007-11-28 15:29:12 UTC 
(rev 16016)
+++ trunk/freenet/src/freenet/io/AddressTracker.java    2007-11-28 15:30:24 UTC 
(rev 16017)
@@ -184,12 +184,15 @@
                return (InetAddressAddressTrackerItem[]) 
ipTrackers.values().toArray(items);
        }

-       public static final int DEFINITELY_PORT_FORWARDED = 1;
+       public static final int DEFINITELY_PORT_FORWARDED = 2;
+       public static final int MAYBE_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;
+       /** If the minimum gap is at least this, we might be port forwarded */
+       public static long MAYBE_TUNNEL_LENGTH = ((5*60)+1)*1000L;
+       /** If the minimum gap is at least this, we are almost certainly port 
forwarded */
+       public static long DEFINITELY_TUNNEL_LENGTH = (12*60+1)*60*1000L;
        /** Time after which we ignore evidence that we are port forwarded */
        public static final long HORIZON = 24*60*60*1000L;

@@ -217,22 +220,11 @@
        }

        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.peer.isRealInternetAddress(false, false)) 
continue;
-                       if(item.hasLongTunnel(HORIZON)) {
-                               // FIXME should require more than one
-                               return DEFINITELY_PORT_FORWARDED;
-                       }
-                       if(!item.weSentFirst()) {
-                               if(item.timeFromStartupToFirstReceivedPacket() 
> MAX_TUNNEL_LENGTH) {
-                                       // FIXME should require more than one
-                                       return DEFINITELY_PORT_FORWARDED;
-                               }
-                       }
-               }
+               long minGap = getLongestSendReceiveGap(HORIZON);
+               if(minGap > DEFINITELY_TUNNEL_LENGTH)
+                       return DEFINITELY_PORT_FORWARDED;
+               if(minGap > MAYBE_TUNNEL_LENGTH)
+                       return MAYBE_PORT_FORWARDED;
                return DONT_KNOW;
        }

@@ -240,6 +232,8 @@
                switch(status) {
                case DEFINITELY_PORT_FORWARDED:
                        return "Port forwarded";
+               case MAYBE_PORT_FORWARDED:
+                       return "Maybe port forwarded";
                case DEFINITELY_NATED:
                        return "Behind NAT";
                case DONT_KNOW:

Modified: trunk/freenet/src/freenet/io/AddressTrackerItem.java
===================================================================
--- trunk/freenet/src/freenet/io/AddressTrackerItem.java        2007-11-28 
15:29:12 UTC (rev 16016)
+++ trunk/freenet/src/freenet/io/AddressTrackerItem.java        2007-11-28 
15:30:24 UTC (rev 16017)
@@ -50,7 +50,7 @@
        public static final int TRACK_GAPS = 5;
        private long[] gapLengths;
        private long[] gapLengthRecvTimes;
-       static final int GAP_THRESHOLD = AddressTracker.MAX_TUNNEL_LENGTH;
+       static final long GAP_THRESHOLD = AddressTracker.MAYBE_TUNNEL_LENGTH;
        static final boolean INCLUDE_RECEIVED_PACKETS = true;

        public AddressTrackerItem(long timeDefinitelyNoPacketsReceived, long 
timeDefinitelyNoPacketsSent) {


Reply via email to