[freenet-cvs] r14882 - branches/freenet-jfk/src/freenet/node

kryptos at freenetproject.org kryptos at freenetproject.org
Sat Aug 25 21:55:29 UTC 2007


Author: kryptos
Date: 2007-08-25 21:55:29 +0000 (Sat, 25 Aug 2007)
New Revision: 14882

Modified:
   branches/freenet-jfk/src/freenet/node/FNPPacketMangler.java
Log:
caching related issues

Modified: branches/freenet-jfk/src/freenet/node/FNPPacketMangler.java
===================================================================
--- branches/freenet-jfk/src/freenet/node/FNPPacketMangler.java	2007-08-25 19:35:04 UTC (rev 14881)
+++ branches/freenet-jfk/src/freenet/node/FNPPacketMangler.java	2007-08-25 21:55:29 UTC (rev 14882)
@@ -4,7 +4,6 @@
  * http://www.gnu.org/ for further details of the GPL. */
 package freenet.node;
 
-
 import freenet.io.comm.SocketHandler;
 import java.security.MessageDigest;
 import java.util.Arrays;
@@ -22,7 +21,6 @@
 import freenet.io.comm.FreenetInetAddress;
 import freenet.io.comm.IncomingPacketFilter;
 import freenet.io.comm.Message;
-import freenet.io.comm.*;
 import freenet.io.comm.MessageCore;
 import freenet.io.comm.NotConnectedException;
 import freenet.io.comm.Peer.LocalAddressException;
@@ -31,12 +29,15 @@
 import freenet.io.comm.Peer;
 import freenet.io.comm.PeerContext;
 import freenet.support.HexUtil;
+import freenet.support.LRUHashtable;
 import freenet.support.Logger;
 import freenet.support.StringArray;
 import freenet.support.TimeUtil;
 import freenet.support.WouldBlockException;
+import java.util.Map;
+import java.util.HashMap;
+import java.util.*;
 
-
 /**
  * @author amphibian
  * 
@@ -55,6 +56,8 @@
     final PacketSocketHandler sock;
     final EntropySource fnpTimingSource;
     final EntropySource myPacketDataSource;
+    static HashMap message3Cache;
+    static HashMap message4Cache;
     
     private static final int MAX_PACKETS_IN_FLIGHT = 256; 
     private static final int RANDOM_BYTES_LENGTH = 12;
@@ -564,8 +567,11 @@
         System.arraycopy(output,0,message3,0,output.length);
         System.arraycopy(authenticator,0,message3,output.length+1,authenticator.length);
 	System.arraycopy(unVerifiedData,0,message3,output.length+authenticator.length+1,unVerifiedData.length);
-        //Send params:Version,negType,phase,data,peernode,peer
-        sendMessage3or4Packet(1,2,2,message3,pn,replyTo);
+        if(message3Duplicate(1,2,2,message3,pn,replyTo))
+            System.out.println("Send message4 directly");
+        else
+            //Send params:Version,negType,phase,data,peernode,peer
+            sendMessage3Packet(1,2,2,message3,pn,replyTo);
         long t2=System.currentTimeMillis();
         if((t2-t1)>500)
                 Logger.error(this,"Message1 timeout error:Sending packet for"+pn.getPeer());
@@ -585,10 +591,7 @@
  	
     private void ProcessMessage4(PeerNode pn,Peer replyTo,byte[] payload,int phase)
     {
-	//Responder keeps a copy of recently received message3 and corresponding message4
-        //Receiving a duplicated message simply causes the responder to retransmit the
-	//corresponding message4 without creating a new state
-    	
+	    	
         byte[] unVerifiedData=new byte[iNonce().length+rNonce().length+Gr(pn).length+Gi(pn).length+1];
         System.arraycopy(iNonce(),0,unVerifiedData,0,iNonce().length);
         System.arraycopy(rNonce(),0,unVerifiedData,iNonce().length+1,rNonce().length);
@@ -617,11 +620,11 @@
         count += s.length;
         pk.blockEncipher(message4, 0, message4.length);
         //Send params:Version,negType,phase,data,peernode,peer 
-        sendMessage3or4Packet(1,2,3,message4,pn,replyTo);
+        sendMessage4Packet(1,2,3,message4,pn,replyTo);
     }	
 			
     /*
-     * Send Message1 packet
+     * Send Message1or2 packet
      * @param version
      * @param negType
      * @param The packet phase number
@@ -646,25 +649,90 @@
 		{
 			Logger.error(this, "Tried to send auth packet to local address: "+replyTo+" for "+pn);
 		}
-     }
+    }
     /*
-     * Send Message2 or 4 packet
+     * Caching recent messages
      * @param version
      * @param negType
      * @param The packet phase number
      * @param Concatenated data
      * @param The peerNode we are talking to
      * @param The peer to which we need to send the packet
+     * @return boolean
      */
+    private boolean message3Duplicate(int version,int negType,int phase,byte[] data,PeerNode pn,Peer replyTo)
+    {
+                //All recent messages 3 and 4 are cached
+                message3Cache = new HashMap();
+                message4Cache = new HashMap();
+                if(phase==2){
+                    message3Cache.put(data.hashCode()+"",data);
+                    for (Iterator i=message3Cache.keySet().iterator();i.hasNext();){
+                        //if duplicate message3; send corresponding message4
+                        if(data.toString().equalsIgnoreCase(i.next().toString())){
+                            sendMessage4Packet(1,2,3,data,pn,replyTo);
+                            return true;
+                        }
+                    }
+                }
+                else if(phase==3){
+                    message4Cache.put(data.toString().hashCode()+"",data.toString());
+                }
+                else{ 
+                    System.err.println("Wrong message");
+                    return false;
+                }
+                return false;
+    }
+    /*
+     * Send Message3 packet
+     * @param version
+     * @param negType
+     * @param The packet phase number
+     * @param Concatenated data
+     * @param The peerNode we are talking to
+     * @param The peer to which we need to send the packet
+     */
 
-    private void sendMessage3or4Packet(int version,int negType,int phase,byte[] data,PeerNode pn,Peer replyTo)
+    private void sendMessage3Packet(int version,int negType,int phase,byte[] data,PeerNode pn,Peer replyTo)
     {
                 long now = System.currentTimeMillis();
                 long delta = now - pn.lastSentPacketTime();
                 byte[] output = new byte[data.length+3];
                 if(data.length > sock.getMaxPacketSize())
                     throw new IllegalStateException("Packet length too long");
+                          
+                output[0] = (byte) version;
+                output[1] = (byte) negType;
+                output[2] = (byte) phase;
+                System.arraycopy(data, 0, output, 3, data.length);
+                if(logMINOR) Logger.minor(this, "Sending auth packet for "+pn.getPeer()+" (phase="+phase+", ver="+version+", nt="+negType+") (last packet sent "+TimeUtil.formatTime(delta, 2, true)+" ago) to "+replyTo+" data.length="+data.length);
+                try
+                {
+                        sendPacket(output,replyTo,pn,0);
+                }catch(LocalAddressException e)
+                {
+                        Logger.error(this, "Tried to send auth packet to local address: "+replyTo+" for "+pn.getPeer());
+                }
                                   
+    }
+    /*
+     * Send Message4 packet
+     * @param version
+     * @param negType
+     * @param The packet phase number
+     * @param Concatenated data
+     * @param The peerNode we are talking to
+     * @param The peer to which we need to send the packet
+     */
+
+    private void sendMessage4Packet(int version,int negType,int phase,byte[] data,PeerNode pn,Peer replyTo)
+    {
+                long now = System.currentTimeMillis();
+                long delta = now - pn.lastSentPacketTime();
+                byte[] output = new byte[data.length+3];
+                if(data.length > sock.getMaxPacketSize())
+                    throw new IllegalStateException("Packet length too long");
                 output[0] = (byte) version;
                 output[1] = (byte) negType;
                 output[2] = (byte) phase;




More information about the cvs mailing list