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) {