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;