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:&nbsp;").append(numberOfDisabled).append("</span></li>");
  // **FIXME**
                }
+               if (numberOfListening > 0) {
+                       buf.append("<li><span 
class=\"peer_never_connected\">Listening:&nbsp;").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;
+       }
 }



Reply via email to