Author: toad
Date: 2007-11-28 15:14:43 +0000 (Wed, 28 Nov 2007)
New Revision: 16012
Modified:
trunk/freenet/src/freenet/io/AddressTracker.java
trunk/freenet/src/freenet/io/AddressTrackerItem.java
Log:
getLongestSendReceiveGap()
Modified: trunk/freenet/src/freenet/io/AddressTracker.java
===================================================================
--- trunk/freenet/src/freenet/io/AddressTracker.java 2007-11-28 15:13:56 UTC
(rev 16011)
+++ trunk/freenet/src/freenet/io/AddressTracker.java 2007-11-28 15:14:43 UTC
(rev 16012)
@@ -193,6 +193,25 @@
/** Time after which we ignore evidence that we are port forwarded */
public static final long HORIZON = 24*60*60*1000L;
+ /**
+ * Find the longest send/known-no-packets-sent ... receive gap.
+ * It is highly unlikely that we are behind a NAT or symmetric
+ * firewall with a timeout less than the returned length.
+ */
+ public long getLongestSendReceiveGap(long horizon) {
+ long longestGap = -1;
+ long now = System.currentTimeMillis();
+ 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;
+ longestGap = Math.max(longestGap,
item.longestGap(horizon, now));
+ }
+ return longestGap;
+
+ }
+
public int getPortForwardStatus() {
PeerAddressTrackerItem[] items = getPeerAddressTrackerItems();
for(int i=0;i<items.length;i++) {
Modified: trunk/freenet/src/freenet/io/AddressTrackerItem.java
===================================================================
--- trunk/freenet/src/freenet/io/AddressTrackerItem.java 2007-11-28
15:13:56 UTC (rev 16011)
+++ trunk/freenet/src/freenet/io/AddressTrackerItem.java 2007-11-28
15:14:43 UTC (rev 16012)
@@ -124,6 +124,15 @@
public synchronized boolean hasLongTunnel(long horizon) {
return gapLengthRecvTimes[0] > System.currentTimeMillis() -
horizon;
}
+
+ public long longestGap(long horizon, long now) {
+ long longestGap = 0;
+ for(int i=0;i<TRACK_GAPS;i++) {
+ if(gapLengthRecvTimes[0] < now - horizon) continue;
+ longestGap = Math.max(longestGap, gapLengths[i]);
+ }
+ return longestGap;
+ }
public class Gap {
public final long gapLength;