Author: toad
Date: 2008-02-14 17:25:23 +0000 (Thu, 14 Feb 2008)
New Revision: 17896

Modified:
   trunk/freenet/src/freenet/io/comm/DMT.java
   trunk/freenet/src/freenet/io/comm/Message.java
   trunk/freenet/src/freenet/io/comm/MessageType.java
   trunk/freenet/src/freenet/node/NetworkIDManager.java
   trunk/freenet/src/freenet/node/Node.java
   trunk/freenet/src/freenet/node/NodeDispatcher.java
   trunk/freenet/src/freenet/node/PeerManager.java
   trunk/freenet/src/freenet/node/simulator/RealNodeRoutingTest.java
   trunk/freenet/src/freenet/node/simulator/RealNodeSecretPingTest.java
Log:
Include node identity as well as location in routed pings.
Use this information to find the node if we are near it, even though it may 
have swapped.

Modified: trunk/freenet/src/freenet/io/comm/DMT.java
===================================================================
--- trunk/freenet/src/freenet/io/comm/DMT.java  2008-02-14 16:22:20 UTC (rev 
17895)
+++ trunk/freenet/src/freenet/io/comm/DMT.java  2008-02-14 17:25:23 UTC (rev 
17896)
@@ -129,6 +129,7 @@
        public static final String OFFER_AUTHENTICATOR = "offerAuthenticator";
        public static final String DAWN_HTL = "dawnHtl";
        public static final String SECRET = "secret";
+       public static final String NODE_IDENTITY = "nodeIdentity";

        /** Very urgent */
        public static final short PRIORITY_NOW=-2;
@@ -1156,11 +1157,12 @@
        public static final MessageType FNPRoutedPing = new 
MessageType("FNPRoutedPing", PRIORITY_LOW) {{
                addRoutedToNodeMessageFields();
                addField(COUNTER, Integer.class);
+               
        }};

-       public static final Message createFNPRoutedPing(long uid, double 
targetLocation, short htl, int counter) {
+       public static final Message createFNPRoutedPing(long uid, double 
targetLocation, short htl, int counter, byte[] nodeIdentity) {
                Message msg = new Message(FNPRoutedPing);
-               msg.setRoutedToNodeFields(uid, targetLocation, htl);
+               msg.setRoutedToNodeFields(uid, targetLocation, htl, 
nodeIdentity);
                msg.set(COUNTER, counter);
                return msg;
        }
@@ -1184,9 +1186,9 @@
        }};


-       public static final Message createFNPSecretPing(long uid, double 
targetLocation, short htl, short dawnHtl, int counter) {
+       public static final Message createFNPSecretPing(long uid, double 
targetLocation, short htl, short dawnHtl, int counter, byte[] nodeIdentity) {
                Message msg = new Message(FNPSecretPing);
-               msg.setRoutedToNodeFields(uid, targetLocation, htl);
+               msg.setRoutedToNodeFields(uid, targetLocation, htl, 
nodeIdentity);
                msg.set(COUNTER, counter);
                msg.set(DAWN_HTL, dawnHtl);
                return msg;

Modified: trunk/freenet/src/freenet/io/comm/Message.java
===================================================================
--- trunk/freenet/src/freenet/io/comm/Message.java      2008-02-14 16:22:20 UTC 
(rev 17895)
+++ trunk/freenet/src/freenet/io/comm/Message.java      2008-02-14 17:25:23 UTC 
(rev 17896)
@@ -26,6 +26,7 @@
 import freenet.support.Fields;
 import freenet.support.Logger;
 import freenet.support.Serializer;
+import freenet.support.ShortBuffer;

 /**
  * A Message which can be read from and written to a DatagramPacket
@@ -284,11 +285,13 @@

     /**
      * Set fields for a routed-to-a-specific-node message.
+     * @param nodeIdentity 
      */
-    public void setRoutedToNodeFields(long uid, double targetLocation, short 
htl) {
+    public void setRoutedToNodeFields(long uid, double targetLocation, short 
htl, byte[] nodeIdentity) {
         set(DMT.UID, uid);
         set(DMT.TARGET_LOCATION, targetLocation);
         set(DMT.HTL, htl);
+        set(DMT.NODE_IDENTITY, new ShortBuffer(nodeIdentity));
     }

        public int receivedByteCount() {

Modified: trunk/freenet/src/freenet/io/comm/MessageType.java
===================================================================
--- trunk/freenet/src/freenet/io/comm/MessageType.java  2008-02-14 16:22:20 UTC 
(rev 17895)
+++ trunk/freenet/src/freenet/io/comm/MessageType.java  2008-02-14 17:25:23 UTC 
(rev 17896)
@@ -22,6 +22,7 @@
 import java.util.*;

 import freenet.support.Logger;
+import freenet.support.ShortBuffer;

 public class MessageType {

@@ -73,6 +74,7 @@
         addField(DMT.UID, Long.class);
         addField(DMT.TARGET_LOCATION, Double.class);
         addField(DMT.HTL, Short.class);
+        addField(DMT.NODE_IDENTITY, ShortBuffer.class);
        }

        public boolean checkType(String fieldName, Object fieldValue) {

Modified: trunk/freenet/src/freenet/node/NetworkIDManager.java
===================================================================
--- trunk/freenet/src/freenet/node/NetworkIDManager.java        2008-02-14 
16:22:20 UTC (rev 17895)
+++ trunk/freenet/src/freenet/node/NetworkIDManager.java        2008-02-14 
17:25:23 UTC (rev 17896)
@@ -16,6 +16,7 @@
 import freenet.io.comm.NotConnectedException;

 import freenet.support.Logger;
+import freenet.support.ShortBuffer;
 import freenet.support.math.BootstrappingDecayingRunningAverage;
 import freenet.support.math.RunningAverage;
 import freenet.support.math.TrivialRunningAverage;
@@ -131,6 +132,7 @@
                        if (logMINOR) Logger.minor(this, "recently 
complete/loop: "+uid);
                        source.sendAsync(DMT.createFNPRejectedLoop(uid), null, 
0, null);
                } else {
+                       byte[] nodeIdentity = ((ShortBuffer) 
m.getObject(DMT.NODE_IDENTITY)).getData();
                        StoredSecret match;
                        //Yes, I know... it looks really weird sync.ing on a 
separate map...
                        synchronized (secretsByPeer) {
@@ -183,7 +185,7 @@
                                        counter++;
                                        routedTo.add(next);
                                        try {
-                                               
next.sendAsync(DMT.createFNPSecretPing(uid, target, htl, dawnHtl, counter), 
null, 0, null);
+                                               
next.sendAsync(DMT.createFNPSecretPing(uid, target, htl, dawnHtl, counter, 
nodeIdentity), null, 0, null);
                                        } catch (NotConnectedException e) {
                                                Logger.normal(this, next+" 
disconnected before secret-ping-forward");
                                                continue;
@@ -510,7 +512,7 @@
                        }

                        //next... send a secretping through next to target
-                       next.sendSync(DMT.createFNPSecretPing(uid, 
target.getLocation(), htl, dawn, 0), null);
+                       next.sendSync(DMT.createFNPSecretPing(uid, 
target.getLocation(), htl, dawn, 0, target.identity), null);

                        //wait for a response; SecretPong, RejectLoop, or 
timeout
                        MessageFilter mfPong = 
MessageFilter.create().setSource(next).setField(DMT.UID, 
uid).setTimeout(SECRETPONG_TIMEOUT).setType(DMT.FNPSecretPong);

Modified: trunk/freenet/src/freenet/node/Node.java
===================================================================
--- trunk/freenet/src/freenet/node/Node.java    2008-02-14 16:22:20 UTC (rev 
17895)
+++ trunk/freenet/src/freenet/node/Node.java    2008-02-14 17:25:23 UTC (rev 
17896)
@@ -355,7 +355,7 @@
         * topology can be reconstructed. */
        public long swapIdentifier;
        private String myName;
-       final LocationManager lm;
+       public final LocationManager lm;
        /** My peers */
        public final PeerManager peers;
        /** Directory to put node, peers, etc into */
@@ -1852,10 +1852,10 @@
         * @return The number of hops it took to find the node, if it was found.
         * Otherwise -1.
         */
-       public int routedPing(double loc2) {
+       public int routedPing(double loc2, byte[] nodeIdentity) {
                long uid = random.nextLong();
                int initialX = random.nextInt();
-               Message m = DMT.createFNPRoutedPing(uid, loc2, maxHTL, 
initialX);
+               Message m = DMT.createFNPRoutedPing(uid, loc2, maxHTL, 
initialX, nodeIdentity);
                Logger.normal(this, "Message: "+m);

                dispatcher.handleRouted(m, null);

Modified: trunk/freenet/src/freenet/node/NodeDispatcher.java
===================================================================
--- trunk/freenet/src/freenet/node/NodeDispatcher.java  2008-02-14 16:22:20 UTC 
(rev 17895)
+++ trunk/freenet/src/freenet/node/NodeDispatcher.java  2008-02-14 17:25:23 UTC 
(rev 17896)
@@ -465,14 +465,16 @@
                final HashSet notIgnored;
                Message msg;
                short lastHtl;
+               final byte[] identity;

-               RoutedContext(Message msg, PeerNode source) {
+               RoutedContext(Message msg, PeerNode source, byte[] identity) {
                        createdTime = accessTime = System.currentTimeMillis();
                        this.source = source;
                        routedTo = new HashSet();
                        notIgnored = new HashSet();
                        this.msg = msg;
                        lastHtl = msg.getShort(DMT.HTL);
+                       this.identity = identity;
                }

                void addSent(PeerNode n) {
@@ -527,7 +529,7 @@
                        }
                } else {
                        // Try routing to the next node
-                       forward(rc.msg, id, rc.source, htl, 
rc.msg.getDouble(DMT.TARGET_LOCATION), rc);
+                       forward(rc.msg, id, rc.source, htl, 
rc.msg.getDouble(DMT.TARGET_LOCATION), rc, rc.identity);
                }
                return true;
        }
@@ -546,6 +548,7 @@
                long id = m.getLong(DMT.UID);
                Long lid = new Long(id);
                short htl = m.getShort(DMT.HTL);
+               byte[] identity = ((ShortBuffer) 
m.getObject(DMT.NODE_IDENTITY)).getData();
                if(source != null) htl = source.decrementHTL(htl);
                RoutedContext ctx;
                ctx = (RoutedContext)routedContexts.get(lid);
@@ -557,7 +560,7 @@
                        }
                        return true;
                }
-               ctx = new RoutedContext(m, source);
+               ctx = new RoutedContext(m, source, identity);
                synchronized (routedContexts) {
                        routedContexts.put(lid, ctx);
                }
@@ -579,7 +582,7 @@
                        }
                        return true;
                } else {
-                       return forward(m, id, source, htl, target, ctx);
+                       return forward(m, id, source, htl, target, ctx, 
identity);
                }
        }

@@ -602,12 +605,18 @@
                return true;
        }

-       private boolean forward(Message m, long id, PeerNode pn, short htl, 
double target, RoutedContext ctx) {
+       private boolean forward(Message m, long id, PeerNode pn, short htl, 
double target, RoutedContext ctx, byte[] targetIdentity) {
                if(logMINOR) Logger.minor(this, "Should forward");
                // Forward
                m = preForward(m, htl);
                while(true) {
-                       PeerNode next = node.peers.closerPeer(pn, ctx.routedTo, 
ctx.notIgnored, target, true, node.isAdvancedModeEnabled(), -1, null, null);
+                       PeerNode next = 
node.peers.getByIdentity(targetIdentity);
+                       if(next != null && !next.isConnected()) {
+                               Logger.error(this, "Found target but 
disconnected!: "+next);
+                               next = null;
+                       }
+                       if(next == null)
+                       next = node.peers.closerPeer(pn, ctx.routedTo, 
ctx.notIgnored, target, true, node.isAdvancedModeEnabled(), -1, null, null);
                        if(logMINOR) Logger.minor(this, "Next: "+next+" 
message: "+m);
                        if(next != null) {
                                // next is connected, or at least has been => 
next.getPeer() CANNOT be null.

Modified: trunk/freenet/src/freenet/node/PeerManager.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerManager.java     2008-02-14 16:22:20 UTC 
(rev 17895)
+++ trunk/freenet/src/freenet/node/PeerManager.java     2008-02-14 17:25:23 UTC 
(rev 17896)
@@ -1636,4 +1636,13 @@
                }
                return count;
        }
+       
+       public PeerNode getByIdentity(byte[] identity) {
+               PeerNode[] peers = myPeers;
+               for(int i=0;i<peers.length;i++) {
+                       if(Arrays.equals(peers[i].getIdentity(), identity))
+                               return peers[i];
+               }
+               return null;
+       }
 }

Modified: trunk/freenet/src/freenet/node/simulator/RealNodeRoutingTest.java
===================================================================
--- trunk/freenet/src/freenet/node/simulator/RealNodeRoutingTest.java   
2008-02-14 16:22:20 UTC (rev 17895)
+++ trunk/freenet/src/freenet/node/simulator/RealNodeRoutingTest.java   
2008-02-14 17:25:23 UTC (rev 17896)
@@ -112,6 +112,15 @@
             System.err.println("Swaps failed:" +LocationManager.noSwaps);
             System.err.println("Swaps succeeded:" +LocationManager.swaps);

+            double totalSwapInterval = 0.0;
+            double totalSwapTime = 0.0;
+            for(int i=0;i<nodes.length;i++) {
+               totalSwapInterval += nodes[i].lm.getSendSwapInterval();
+               totalSwapTime += nodes[i].lm.getAverageSwapTime();
+            }
+            System.err.println("Average swap time: "+(totalSwapTime / 
nodes.length));
+            System.err.println("Average swap sender interval: 
"+(totalSwapInterval / nodes.length));
+            
             waitForAllConnected(nodes);

             lastSwaps = newSwaps;
@@ -128,7 +137,7 @@
                     randomNode2 = nodes[random.nextInt(nodes.length)];
                 double loc2 = randomNode2.getLocation();
                Logger.normal(RealNodeRoutingTest.class, "Pinging 
"+randomNode2.getDarknetPortNumber()+" @ "+loc2+" from 
"+randomNode.getDarknetPortNumber()+" @ "+randomNode.getLocation());
-                int hopsTaken = randomNode.routedPing(loc2);
+                int hopsTaken = randomNode.routedPing(loc2, 
randomNode2.getDarknetIdentity());
                 pings++;
                 if(hopsTaken < 0) {
                     failures++;

Modified: trunk/freenet/src/freenet/node/simulator/RealNodeSecretPingTest.java
===================================================================
--- trunk/freenet/src/freenet/node/simulator/RealNodeSecretPingTest.java        
2008-02-14 16:22:20 UTC (rev 17895)
+++ trunk/freenet/src/freenet/node/simulator/RealNodeSecretPingTest.java        
2008-02-14 17:25:23 UTC (rev 17896)
@@ -119,7 +119,7 @@
                                }

                                //Send the request for the secret through the 
'pathway' node.
-                               pathway.sendSync(DMT.createFNPSecretPing(uid, 
verify.getLocation(), PING_HTL, DAWN_HTL, 0), null);
+                               pathway.sendSync(DMT.createFNPSecretPing(uid, 
verify.getLocation(), PING_HTL, DAWN_HTL, 0, verify.getIdentity()), null);

                                long result=getSecretPingResponse(source, 
pathway, uid);
                                if (result!=secret) {


Reply via email to