Author: toad
Date: 2007-11-27 00:55:44 +0000 (Tue, 27 Nov 2007)
New Revision: 15950

Modified:
   trunk/freenet/src/freenet/io/AddressTrackerItem.java
Log:
Beginnings of send...receive-gap-based port forwarding detection.

Modified: trunk/freenet/src/freenet/io/AddressTrackerItem.java
===================================================================
--- trunk/freenet/src/freenet/io/AddressTrackerItem.java        2007-11-25 
22:05:35 UTC (rev 15949)
+++ trunk/freenet/src/freenet/io/AddressTrackerItem.java        2007-11-27 
00:55:44 UTC (rev 15950)
@@ -43,6 +43,10 @@
        private long packetsSent;
        /** The total number of packets received from this address */
        private long packetsReceived;
+       static final int TRACK_GAPS = 5;
+       private long[] topGapLengths;
+       private long[] topGapLengthRecvTimes;
+       static final int GAP_THRESHOLD = AddressTracker.MAX_TUNNEL_LENGTH;

        public AddressTrackerItem(long timeDefinitelyNoPacketsReceived, long 
timeDefinitelyNoPacketsSent) {
                timeFirstReceivedPacket = -1;
@@ -53,6 +57,8 @@
                packetsReceived = 0;
                this.timeDefinitelyNoPacketsReceived = 
timeDefinitelyNoPacketsReceived;
                this.timeDefinitelyNoPacketsSent = timeDefinitelyNoPacketsSent;
+               topGapLengths = new long[TRACK_GAPS];
+               topGapLengthRecvTimes = new long[TRACK_GAPS];
        }

        public synchronized void sentPacket(long now) {
@@ -67,6 +73,19 @@
                if(timeFirstReceivedPacket < 0)
                        timeFirstReceivedPacket = now;
                timeLastReceivedPacket = now;
+               // Establish the interval
+               long startTime;
+               if(timeFirstSentPacket > 0) startTime = timeFirstSentPacket;
+               else startTime = timeDefinitelyNoPacketsSent;
+               if(now - startTime > GAP_THRESHOLD) {
+                       // Rotate gaps array
+                       for(int i=1;i<TRACK_GAPS;i++) {
+                               topGapLengths[i] = topGapLengths[i-1];
+                               topGapLengthRecvTimes[i] = 
topGapLengthRecvTimes[i-1];
+                       }
+                       topGapLengths[0] = (now - timeFirstSentPacket);
+                       topGapLengthRecvTimes[0] = now;
+               }
        }

        public synchronized long firstReceivedPacket() {


Reply via email to