Author: zothar
Date: 2006-06-25 05:31:21 +0000 (Sun, 25 Jun 2006)
New Revision: 9384
Modified:
trunk/freenet/src/freenet/clients/http/DarknetConnectionsToadlet.java
trunk/freenet/src/freenet/node/Node.java
trunk/freenet/src/freenet/node/PeerNode.java
Log:
Add initial support for LISTENING peers in advanced mode. LISTENING peers are
peers that have been set ListenOnly. ListenOnly means that we won't send
handshake requests to the peer, but we will connect with the peer if we get a
handshake request from them. WARNING: DO NOT set ListenOnly if your node
requires UDP hole punching as your node won't connect with those peers if UDP
hole punching is needed. WARNING: If both ends set ListenOnly for each other,
they'll never connect. NOTE: It may take a minute or two for your LISTENING
peers to connect after node restart. NOTE: In the future, I plan for LISTENING
to really mean that we send an handshake request occassionally.
Modified: trunk/freenet/src/freenet/clients/http/DarknetConnectionsToadlet.java
===================================================================
--- trunk/freenet/src/freenet/clients/http/DarknetConnectionsToadlet.java
2006-06-25 04:29:57 UTC (rev 9383)
+++ trunk/freenet/src/freenet/clients/http/DarknetConnectionsToadlet.java
2006-06-25 05:31:21 UTC (rev 9384)
@@ -75,9 +75,10 @@
int numberOfDisconnected =
node.getPeerNodeStatusSize(Node.PEER_NODE_STATUS_DISCONNECTED);
int numberOfNeverConnected =
node.getPeerNodeStatusSize(Node.PEER_NODE_STATUS_NEVER_CONNECTED);
int numberOfDisabled =
node.getPeerNodeStatusSize(Node.PEER_NODE_STATUS_DISABLED);
+ int numberOfListening =
node.getPeerNodeStatusSize(Node.PEER_NODE_STATUS_LISTENING);
int numberOfSimpleConnected = numberOfConnected +
numberOfRoutingBackedOff;
- int numberOfNotConnected = numberOfTooNew + numberOfTooOld +
numberOfDisconnected + numberOfNeverConnected + numberOfDisabled;
+ int numberOfNotConnected = numberOfTooNew + numberOfTooOld +
numberOfDisconnected + numberOfNeverConnected + numberOfDisabled +
numberOfListening;
String titleCountString = null;
if(advancedEnabled) {
titleCountString = "(" + numberOfConnected + "/" +
numberOfRoutingBackedOff + "/" + numberOfNotConnected + ")";
@@ -191,6 +192,9 @@
if (numberOfDisabled > 0) {
buf.append("<li><span
class=\"peer_never_connected\">Disabled: ").append(numberOfDisabled).append("</span></li>");
// **FIXME**
}
+ if (numberOfListening > 0) {
+ buf.append("<li><span
class=\"peer_never_connected\">Listening: ").append(numberOfListening).append("</span></li>");
// **FIXME**
+ }
buf.append("</ul>");
buf.append("</div>");
buf.append("</div>\n");
@@ -400,6 +404,8 @@
buf.append(" <option value=\"\">-- Select
Action --</option>\n");
buf.append(" <option value=\"enable\">Enable
Selected Peers</option>\n");
buf.append(" <option value=\"disable\">Disable
Selected Peers</option>\n");
+ buf.append(" <option
value=\"set_listen_only\">On Selected Peers, Set ListenOnly</option>\n");
+ buf.append(" <option
value=\"clear_listen_only\">On Selected Peers, Clear ListenOnly</option>\n");
buf.append(" <option value=\"\">-- --
--</option>\n");
buf.append(" <option value=\"remove\">Remove
Selected Peers</option>\n");
buf.append("</select>\n");
@@ -568,6 +574,32 @@
headers.put("Location", "/darknet/");
ctx.sendReplyHeaders(302, "Found", headers, null, 0);
return;
+ } else if (request.isPartSet("submit") &&
request.getPartAsString("action",25).equals("set_listen_only")) {
+ //int hashcode =
Integer.decode(request.getParam("node")).intValue();
+
+ PeerNode[] peerNodes = node.getDarknetConnections();
+ for(int i = 0; i < peerNodes.length; i++) {
+ if
(request.isPartSet("node_"+peerNodes[i].hashCode())) {
+ peerNodes[i].setListenOnly(true);
+ }
+ }
+ MultiValueTable headers = new MultiValueTable();
+ headers.put("Location", "/darknet/");
+ ctx.sendReplyHeaders(302, "Found", headers, null, 0);
+ return;
+ } else if (request.isPartSet("submit") &&
request.getPartAsString("action",25).equals("clear_listen_only")) {
+ //int hashcode =
Integer.decode(request.getParam("node")).intValue();
+
+ PeerNode[] peerNodes = node.getDarknetConnections();
+ for(int i = 0; i < peerNodes.length; i++) {
+ if
(request.isPartSet("node_"+peerNodes[i].hashCode())) {
+ peerNodes[i].setListenOnly(false);
+ }
+ }
+ MultiValueTable headers = new MultiValueTable();
+ headers.put("Location", "/darknet/");
+ ctx.sendReplyHeaders(302, "Found", headers, null, 0);
+ return;
} else if (request.isPartSet("remove") ||
(request.isPartSet("submit") &&
request.getPartAsString("action",25).equals("remove"))) {
//int hashcode =
Integer.decode(request.getParam("node")).intValue();
Modified: trunk/freenet/src/freenet/node/Node.java
===================================================================
--- trunk/freenet/src/freenet/node/Node.java 2006-06-25 04:29:57 UTC (rev
9383)
+++ trunk/freenet/src/freenet/node/Node.java 2006-06-25 05:31:21 UTC (rev
9384)
@@ -573,6 +573,7 @@
public static final int PEER_NODE_STATUS_DISCONNECTED = 5;
public static final int PEER_NODE_STATUS_NEVER_CONNECTED = 6;
public static final int PEER_NODE_STATUS_DISABLED = 7;
+ public static final int PEER_NODE_STATUS_LISTENING = 8;
public static final int N2N_TEXT_MESSAGE_TYPE_USERALERT = 1;
public final long bootID;
@@ -3122,7 +3123,9 @@
int numberOfTooOld =
getPeerNodeStatusSize(PEER_NODE_STATUS_TOO_OLD);
int numberOfDisconnected =
getPeerNodeStatusSize(PEER_NODE_STATUS_DISCONNECTED);
int numberOfNeverConnected =
getPeerNodeStatusSize(PEER_NODE_STATUS_NEVER_CONNECTED);
- Logger.normal(this, "Connected: "+numberOfConnected+" Routing
Backed Off: "+numberOfRoutingBackedOff+" Too New: "+numberOfTooNew+" Too Old:
"+numberOfTooOld+" Disconnected: "+numberOfDisconnected+" Never Connected:
"+numberOfNeverConnected);
+ int numberOfDisabled =
getPeerNodeStatusSize(PEER_NODE_STATUS_DISABLED);
+ int numberOfListening =
getPeerNodeStatusSize(PEER_NODE_STATUS_LISTENING);
+ Logger.normal(this, "Connected: "+numberOfConnected+" Routing
Backed Off: "+numberOfRoutingBackedOff+" Too New: "+numberOfTooNew+" Too Old:
"+numberOfTooOld+" Disconnected: "+numberOfDisconnected+" Never Connected:
"+numberOfNeverConnected+" Disabled: "+numberOfDisabled+" Listening:
"+numberOfListening);
nextPeerNodeStatusLogTime = now + peerNodeStatusLogInterval;
}
}
Modified: trunk/freenet/src/freenet/node/PeerNode.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerNode.java 2006-06-25 04:29:57 UTC
(rev 9383)
+++ trunk/freenet/src/freenet/node/PeerNode.java 2006-06-25 05:31:21 UTC
(rev 9384)
@@ -233,6 +233,9 @@
/** True if this peer is not to be connected with */
private boolean isDisabled = false;
+
+ /** True if we don't send handshake requests to this peer, but will
connect if we receive one */
+ private boolean isListenOnly = false;
/**
* Create a PeerNode from a SimpleFieldSet containing a
@@ -443,6 +446,12 @@
} else {
isDisabled = false;
}
+ String tempIsListenOnlyString = metadata.get("isListenOnly");
+ if(tempIsListenOnlyString != null &&
tempIsListenOnlyString.equals("true")) {
+ isListenOnly = true;
+ } else {
+ isListenOnly = false;
+ }
}
} else {
neverConnected = true;
@@ -821,6 +830,7 @@
long now = System.currentTimeMillis();
return (!isConnected) &&
(!isDisabled) && // don't connect to disabled
peers
+ (!isListenOnly) && // don't send handshake
requests to isListenOnly peers
(handshakeIPs != null) &&
(now > sendHandshakeTime) &&
!(hasLiveHandshake(now));
@@ -1492,6 +1502,8 @@
fs.put("neverConnected", "true");
if(isDisabled)
fs.put("isDisabled", "true");
+ if(isListenOnly)
+ fs.put("isListenOnly", "true");
return fs;
}
@@ -1870,6 +1882,8 @@
return "NEVER CONNECTED";
if(status == Node.PEER_NODE_STATUS_DISABLED)
return "DISABLED";
+ if(status == Node.PEER_NODE_STATUS_LISTENING)
+ return "LISTENING";
return "UNKNOWN STATUS";
}
@@ -1889,6 +1903,8 @@
return "peer_never_connected";
if(status == Node.PEER_NODE_STATUS_DISABLED)
return "peer_disconnected"; // **FIXME**
+ if(status == Node.PEER_NODE_STATUS_LISTENING)
+ return "peer_disconnected"; // **FIXME**
return "peer_unknown_status";
}
@@ -1919,6 +1935,8 @@
peerNodeStatus = Node.PEER_NODE_STATUS_TOO_OLD;
} else if(neverConnected) {
peerNodeStatus = Node.PEER_NODE_STATUS_NEVER_CONNECTED;
+ } else if(isListenOnly) {
+ peerNodeStatus = Node.PEER_NODE_STATUS_LISTENING;
} else {
peerNodeStatus = Node.PEER_NODE_STATUS_DISCONNECTED;
}
@@ -1963,5 +1981,15 @@
public boolean isDisabled() {
return isDisabled;
}
+
+ public void setListenOnly(boolean setting) {
+ isListenOnly = setting;
+ setPeerNodeStatus(System.currentTimeMillis());
+ node.peers.writePeers();
+ }
+
+ public boolean isListenOnly() {
+ return isListenOnly;
+ }
}