Author: toad
Date: 2007-12-10 18:33:54 +0000 (Mon, 10 Dec 2007)
New Revision: 16449

Removed:
   trunk/freenet/src/freenet/io/PortForwardBrokenDetector.java
Modified:
   trunk/freenet/src/freenet/io/AddressTracker.java
   trunk/freenet/src/freenet/io/comm/UdpSocketHandler.java
   trunk/freenet/src/freenet/node/FNPPacketMangler.java
   trunk/freenet/src/freenet/node/NodeCrypto.java
   trunk/freenet/src/freenet/node/OutgoingPacketMangler.java
   trunk/freenet/src/freenet/node/PeerNode.java
Log:
Simplify port-forwarding-broken reporting: Detected by PeerNode on basis of 
packet deltas, reported once to AddressTracker, rather than a callback from 
AddressTracker polling all peernode's.
Also fixes a deadlock.

Modified: trunk/freenet/src/freenet/io/AddressTracker.java
===================================================================
--- trunk/freenet/src/freenet/io/AddressTracker.java    2007-12-10 18:18:46 UTC 
(rev 16448)
+++ trunk/freenet/src/freenet/io/AddressTracker.java    2007-12-10 18:33:54 UTC 
(rev 16449)
@@ -49,14 +49,14 @@
        /** InetAddressAddressTrackerItem's by InetAddress */
        private final HashMap ipTrackers;

-       private PortForwardBrokenDetector brokenDetector;
-       
        /** Maximum number of Item's of either type */
        static final int MAX_ITEMS = 1000;

        private long timeDefinitelyNoPacketsReceived;
        private long timeDefinitelyNoPacketsSent;

+       private boolean isBroken;
+       
        public static AddressTracker create(long lastBootID, File nodeDir, int 
port) {
                File data = new File(nodeDir, "packets-"+port+".dat");
                File dataBak = new File(nodeDir, "packets-"+port+".bak");
@@ -229,7 +229,7 @@

        public int getPortForwardStatus() {
                long minGap = getLongestSendReceiveGap(HORIZON);
-               if(brokenDetector != null && brokenDetector.isBroken()) return 
DEFINITELY_NATED;
+               if(isBroken) return DEFINITELY_NATED;
                if(minGap > DEFINITELY_TUNNEL_LENGTH)
                        return DEFINITELY_PORT_FORWARDED;
                if(minGap > MAYBE_TUNNEL_LENGTH)
@@ -237,10 +237,6 @@
                return DONT_KNOW;
        }

-       public synchronized void setBrokenDetector(PortForwardBrokenDetector d) 
{
-               brokenDetector = d;
-       }
-       
        public static String statusString(int status) {
                switch(status) {
                case DEFINITELY_PORT_FORWARDED:
@@ -259,7 +255,7 @@
        /** Persist the table to disk */
        public void storeData(long bootID, File nodeDir, int port) {
                // Don't write to disk if we know we're NATed anyway!
-               if(brokenDetector != null && brokenDetector.isBroken()) return;
+               if(isBroken) return;
                File data = new File(nodeDir, "packets-"+port+".dat");
                File dataBak = new File(nodeDir, "packets-"+port+".bak");
                data.delete();
@@ -315,4 +311,8 @@
        public void rescan() {
                // Do nothing for now, as we don't maintain any final state yet.
        }
+
+       public synchronized void setBroken() {
+               isBroken = true;
+       }
 }

Deleted: trunk/freenet/src/freenet/io/PortForwardBrokenDetector.java
===================================================================
--- trunk/freenet/src/freenet/io/PortForwardBrokenDetector.java 2007-12-10 
18:18:46 UTC (rev 16448)
+++ trunk/freenet/src/freenet/io/PortForwardBrokenDetector.java 2007-12-10 
18:33:54 UTC (rev 16449)
@@ -1,8 +0,0 @@
-package freenet.io;
-
-public interface PortForwardBrokenDetector {
-
-       /** @return True if there is a good reason to think that port 
forwarding is broken. */
-       boolean isBroken();
-
-}

Modified: trunk/freenet/src/freenet/io/comm/UdpSocketHandler.java
===================================================================
--- trunk/freenet/src/freenet/io/comm/UdpSocketHandler.java     2007-12-10 
18:18:46 UTC (rev 16448)
+++ trunk/freenet/src/freenet/io/comm/UdpSocketHandler.java     2007-12-10 
18:33:54 UTC (rev 16449)
@@ -12,7 +12,6 @@
 import org.tanukisoftware.wrapper.WrapperManager;

 import freenet.io.AddressTracker;
-import freenet.io.PortForwardBrokenDetector;
 import freenet.io.comm.Peer.LocalAddressException;
 import freenet.node.LoggingConfigHandler;
 import freenet.node.Node;
@@ -410,10 +409,6 @@
                tracker.rescan();
        }

-       public void setPortForwardBrokenDetector(PortForwardBrokenDetector 
detector) {
-               tracker.setBrokenDetector(detector);
-       }
-
        public int getDetectedConnectivityStatus() {
                return tracker.getPortForwardStatus();
        }

Modified: trunk/freenet/src/freenet/node/FNPPacketMangler.java
===================================================================
--- trunk/freenet/src/freenet/node/FNPPacketMangler.java        2007-12-10 
18:18:46 UTC (rev 16448)
+++ trunk/freenet/src/freenet/node/FNPPacketMangler.java        2007-12-10 
18:33:54 UTC (rev 16449)
@@ -2748,4 +2748,8 @@
                return crypto.allowConnection(pn, addr);
        }

+       public void setPortForwardingBroken() {
+               crypto.setPortForwardingBroken();
+       }
+
 }

Modified: trunk/freenet/src/freenet/node/NodeCrypto.java
===================================================================
--- trunk/freenet/src/freenet/node/NodeCrypto.java      2007-12-10 18:18:46 UTC 
(rev 16448)
+++ trunk/freenet/src/freenet/node/NodeCrypto.java      2007-12-10 18:33:54 UTC 
(rev 16449)
@@ -24,7 +24,6 @@
 import freenet.crypt.SHA256;
 import freenet.crypt.UnsupportedCipherException;
 import freenet.crypt.ciphers.Rijndael;
-import freenet.io.PortForwardBrokenDetector;
 import freenet.io.comm.FreenetInetAddress;
 import freenet.io.comm.Peer;
 import freenet.io.comm.UdpSocketHandler;
@@ -134,20 +133,7 @@
                        }
                }
                socket = u;
-               
-               u.setPortForwardBrokenDetector(new PortForwardBrokenDetector() {
-                       public boolean isBroken() {
-                               PeerManager pm = node.peers;
-                               if(pm == null) return false;
-                               PeerNode[] peers = isOpennet ? 
((PeerNode[])pm.getOpennetPeers()) : ((PeerNode[])pm.getDarknetPeers());
-                               for(int i=0;i<peers.length;i++) {
-                                       if(peers[i].forceDisconnectCalled()) 
continue;
-                                       
if(peers[i].manyPacketsClaimedSentNotReceived()) return true;
-                               }
-                               return false;
-                       }
-               });
-               
+
                Logger.normal(this, "FNP port created on "+bindto+ ':' +port);
                System.out.println("FNP port created on "+bindto+ ':' +port);
                portNumber = port;
@@ -470,4 +456,8 @@
                }
                return (PeerNode[]) v.toArray(new PeerNode[v.size()]);
        }
+       
+       void setPortForwardingBroken() {
+               this.socket.getAddressTracker().setBroken();
+       }
 }

Modified: trunk/freenet/src/freenet/node/OutgoingPacketMangler.java
===================================================================
--- trunk/freenet/src/freenet/node/OutgoingPacketMangler.java   2007-12-10 
18:18:46 UTC (rev 16448)
+++ trunk/freenet/src/freenet/node/OutgoingPacketMangler.java   2007-12-10 
18:33:54 UTC (rev 16449)
@@ -118,4 +118,9 @@
         * a specific IP address?
         */
        public boolean allowConnection(PeerNode node, FreenetInetAddress addr);
+
+       /**
+        * If the lower level code detects the port forwarding is broken, it 
will call this method.
+        */
+       public void setPortForwardingBroken();
 }

Modified: trunk/freenet/src/freenet/node/PeerNode.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerNode.java        2007-12-10 18:18:46 UTC 
(rev 16448)
+++ trunk/freenet/src/freenet/node/PeerNode.java        2007-12-10 18:33:54 UTC 
(rev 16449)
@@ -1191,9 +1191,10 @@
        /**
         * Set sendHandshakeTime, and return whether to fetch the ARK.
         */
-       protected synchronized boolean innerCalcNextHandshake(boolean 
successfulHandshakeSend, boolean dontFetchARK, long now) {
+       protected boolean innerCalcNextHandshake(boolean 
successfulHandshakeSend, boolean dontFetchARK, long now) {
                if(isBurstOnly())
                        return calcNextHandshakeBurstOnly(now);
+               synchronized(this) {
                long delay;
                if(verifiedIncompatibleOlderVersion || 
verifiedIncompatibleNewerVersion || disableRouting) {
                        // Let them know we're here, but have no hope of 
connecting
@@ -1212,6 +1213,7 @@
                        firstHandshake = false;
                handshakeCount++;
                return ((handshakeCount == MAX_HANDSHAKE_COUNT) && 
!(verifiedIncompatibleOlderVersion || verifiedIncompatibleNewerVersion));
+               }
        }

        private synchronized boolean calcNextHandshakeBurstOnly(long now) {
@@ -3222,6 +3224,9 @@
                                }
                        }
                }
+               if(manyPacketsClaimedSentNotReceived) {
+                       outgoingMangler.setPortForwardingBroken();
+               }
        }
        private boolean manyPacketsClaimedSentNotReceived = false;



Reply via email to