Hi,
        I've written a patch to address #500:
        https://bugs.freenetproject.org/view.php?id=500

        It needs to be reviewed before it's commited.

NextGen$
-------------- next part --------------
Index: /home/nextgens/src/eclipse/Freenet 
0.7/src/freenet/clients/http/N2NTMToadlet.java
===================================================================
--- /home/nextgens/src/eclipse/Freenet 
0.7/src/freenet/clients/http/N2NTMToadlet.java   (revision 9517)
+++ /home/nextgens/src/eclipse/Freenet 
0.7/src/freenet/clients/http/N2NTMToadlet.java   (working copy)
@@ -164,7 +164,7 @@
                                  buf.append("PeerNode.hashCode 
'"+request.getParam("hashcode")+"' not found.<br /><br />\n");
                                  buf.append("</div>");
                                  buf.append("</div>");
-                         } else if(!pn.isConnected() && 
!pn.isVerifiedIncompatibleNewerVersion() && 
!pn.isVerifiedIncompatibleOlderVersion()) {
+                         } else if(!pn.isConnected()) {
                                  ctx.getPageMaker().makeHead(buf, "Node To 
Node Text Message Failed");

                                  buf.append("<div class=\"infobox 
infobox-error\">");
Index: /home/nextgens/src/eclipse/Freenet 
0.7/src/freenet/io/comm/DummyPeerContext.java
===================================================================
--- /home/nextgens/src/eclipse/Freenet 
0.7/src/freenet/io/comm/DummyPeerContext.java    (revision 9517)
+++ /home/nextgens/src/eclipse/Freenet 
0.7/src/freenet/io/comm/DummyPeerContext.java    (working copy)
@@ -22,8 +22,11 @@
                // Do nothing
        }

+       public boolean isReallyConnected() {
+               return false;
+       }
+       
        public boolean isConnected() {
                return false;
        }
-
 }
Index: /home/nextgens/src/eclipse/Freenet 
0.7/src/freenet/io/comm/PeerContext.java
===================================================================
--- /home/nextgens/src/eclipse/Freenet 0.7/src/freenet/io/comm/PeerContext.java 
(revision 9517)
+++ /home/nextgens/src/eclipse/Freenet 0.7/src/freenet/io/comm/PeerContext.java 
(working copy)
@@ -13,6 +13,9 @@
     /** Force the peer to disconnect */
        void forceDisconnect();

-       /** Is the peer connected? If we can't tell, return true. */
+       /** Is the peer connected? Have we established the session link? */
        boolean isConnected();
+       
+       /** Is the peer connected? are we able to route requests to it? */
+       boolean isReallyConnected();
 }
Index: /home/nextgens/src/eclipse/Freenet 
0.7/src/freenet/node/CHKInsertSender.java
===================================================================
--- /home/nextgens/src/eclipse/Freenet 
0.7/src/freenet/node/CHKInsertSender.java        (revision 9517)
+++ /home/nextgens/src/eclipse/Freenet 
0.7/src/freenet/node/CHKInsertSender.java        (working copy)
@@ -646,7 +646,7 @@
                        MessageFilter mf = null;
                        for(int i=0;i<waiters.length;i++) {
                                AwaitingCompletion awc = waiters[i];
-                               if(!awc.pn.isConnected()) {
+                               if(!awc.pn.isReallyConnected()) {
                                        Logger.normal(this, "Disconnected: 
"+awc.pn+" in "+CHKInsertSender.this);
                                        continue;
                                }
@@ -678,7 +678,7 @@
                                        }
                                        if(noTimeLeft) {
                                                for(int 
i=0;i<waiters.length;i++) {
-                                                       
if(!waiters[i].pn.isConnected()) continue;
+                                                       
if(!waiters[i].pn.isReallyConnected()) continue;
                                                        
if(!waiters[i].completedTransfer) {
                                                                
waiters[i].completedTransfer(false);
                                                        }
@@ -745,7 +745,7 @@
                                        if(noTimeLeft) {
                                                Logger.minor(this, "Overall 
timeout on "+CHKInsertSender.this);
                                                for(int 
i=0;i<waiters.length;i++) {
-                                                       
if(!waiters[i].pn.isConnected()) continue;
+                                                       
if(!waiters[i].pn.isReallyConnected()) continue;
                                                        
if(!waiters[i].receivedCompletionNotice)
                                                                
waiters[i].completed(false, false);
                                                        
if(!waiters[i].completedTransfer)
@@ -770,7 +770,7 @@
                        boolean completedTransfers = true;
                        synchronized(nodesWaitingForCompletion) {
                                for(int i=0;i<waiters.length;i++) {
-                                       if(!waiters[i].pn.isConnected()) 
continue;
+                                       if(!waiters[i].pn.isReallyConnected()) 
continue;
                                        if(!waiters[i].completedTransfer) {
                                                completedTransfers = false;
                                                break;
@@ -786,7 +786,7 @@
                                                }
                                                completedTransfers = true;
                                                for(int 
i=0;i<waiters.length;i++) {
-                                                       
if(!waiters[i].pn.isConnected()) continue;
+                                                       
if(!waiters[i].pn.isReallyConnected()) continue;
                                                        
if(!waiters[i].completedTransfer) {
                                                                
completedTransfers = false;
                                                                break;
Index: /home/nextgens/src/eclipse/Freenet 
0.7/src/freenet/node/FNPPacketMangler.java
===================================================================
--- /home/nextgens/src/eclipse/Freenet 
0.7/src/freenet/node/FNPPacketMangler.java       (revision 9517)
+++ /home/nextgens/src/eclipse/Freenet 
0.7/src/freenet/node/FNPPacketMangler.java       (working copy)
@@ -126,7 +126,7 @@
                 if(tryProcessAuth(buf, offset, length, pn, peer)) return;
             }
         }
-        if(opn != null && !opn.isConnected())
+        if(opn != null && !opn.isReallyConnected())
             Logger.minor(this,"Unmatchable packet from "+peer);
         else
             Logger.error(this,"Unmatchable packet from "+peer);
@@ -1398,6 +1398,11 @@

     public boolean isDisconnected(PeerContext context) {
         if(context == null) return false;
-        return !((PeerNode)context).isConnected();
+        return !((PeerNode)context).isReallyConnected();
+    }
+    
+    public boolean isRestricted(PeerContext context) {
+        if(context == null) return false;
+        return (!((PeerNode)context).isReallyConnected() && 
((PeerNode)context).isConnected());
     }
 }
Index: /home/nextgens/src/eclipse/Freenet 
0.7/src/freenet/node/IPDetectorPluginManager.java
===================================================================
--- /home/nextgens/src/eclipse/Freenet 
0.7/src/freenet/node/IPDetectorPluginManager.java        (revision 9517)
+++ /home/nextgens/src/eclipse/Freenet 
0.7/src/freenet/node/IPDetectorPluginManager.java        (working copy)
@@ -153,7 +153,7 @@
                                                // Unique IP address?
                                                Peer peer = p.getPeer();
                                                InetAddress addr = 
peer.getAddress(false);
-                                               if(p.isConnected() && peer != 
null && addr != null && IPUtil.checkAddress(peer.getAddress())) {
+                                               if(p.isReallyConnected() && 
peer != null && addr != null && IPUtil.checkAddress(peer.getAddress())) {
                                                        // Connected node, on a 
real internet IP address.
                                                        // Is it internal?
                                                        boolean internal = 
false;
@@ -246,11 +246,10 @@
                                                // No locally detected IP, only 
one or two connections.
                                                // Have we had more relatively 
recently?
                                                int count = 0;
-                                               long timeref = now;
-                                               if(firstTimeMaybeFakePeers > 0) 
timeref = firstTimeMaybeFakePeers;
+
                                                for(int i=0;i<peers.length;i++) 
{
                                                        PeerNode p = peers[i];
-                                                       if((!p.isConnected()) 
|| now - p.lastReceivedPacketTime() < 5*60*1000) {
+                                                       
if((!p.isReallyConnected()) || now - p.lastReceivedPacketTime() < 5*60*1000) {
                                                                // Not 
connected now but has been within the past 5 minutes.
                                                                count++;
                                                        }
Index: /home/nextgens/src/eclipse/Freenet 
0.7/src/freenet/node/InsertHandler.java
===================================================================
--- /home/nextgens/src/eclipse/Freenet 0.7/src/freenet/node/InsertHandler.java  
(revision 9517)
+++ /home/nextgens/src/eclipse/Freenet 0.7/src/freenet/node/InsertHandler.java  
(working copy)
@@ -39,7 +39,6 @@
     private byte[] headers;
     private BlockReceiver br;
     private Thread runThread;
-    private boolean sentSuccess;

     PartiallyReceivedBlock prb;

@@ -103,7 +102,7 @@

         if(msg == null) {
                try {
-                       if(source.isConnected() && startTime > 
(source.timeLastConnected()+Node.HANDSHAKE_TIMEOUT*4))
+                       if(source.isReallyConnected() && startTime > 
(source.timeLastConnected()+Node.HANDSHAKE_TIMEOUT*4))
                                Logger.error(this, "Did not receive DataInsert 
on "+uid+" from "+source+" !");
                        Message tooSlow = DMT.createFNPRejectedTimeout(uid);
                        source.sendAsync(tooSlow, null, 0, null);
@@ -144,7 +143,6 @@
         if(htl == 0) {
             canCommit = true;
                msg = DMT.createFNPInsertReply(uid);
-               sentSuccess = true;
                try {
                                source.send(msg, null);
                        } catch (NotConnectedException e) {
@@ -253,7 +251,6 @@

             if(status == CHKInsertSender.SUCCESS) {
                msg = DMT.createFNPInsertReply(uid);
-               sentSuccess = true;
                try {
                                        source.send(msg, null);
                                } catch (NotConnectedException e) {
Index: /home/nextgens/src/eclipse/Freenet 0.7/src/freenet/node/KeyTracker.java
===================================================================
--- /home/nextgens/src/eclipse/Freenet 0.7/src/freenet/node/KeyTracker.java     
(revision 9517)
+++ /home/nextgens/src/eclipse/Freenet 0.7/src/freenet/node/KeyTracker.java     
(working copy)
@@ -634,7 +634,7 @@
      */
     public int allocateOutgoingPacketNumber() throws KeyChangedException, 
NotConnectedException {
         int packetNumber;
-        if(!pn.isConnected()) throw new NotConnectedException();
+        if(!pn.isReallyConnected()) throw new NotConnectedException();
         synchronized(this) {
             if(isDeprecated) throw new KeyChangedException();
             packetNumber = nextPacketNumber++;
Index: /home/nextgens/src/eclipse/Freenet 
0.7/src/freenet/node/LocationManager.java
===================================================================
--- /home/nextgens/src/eclipse/Freenet 
0.7/src/freenet/node/LocationManager.java        (revision 9517)
+++ /home/nextgens/src/eclipse/Freenet 
0.7/src/freenet/node/LocationManager.java        (working copy)
@@ -124,7 +124,7 @@
                                 PeerNode[] peers = node.peers.connectedPeers;
                                 for(int i=0;i<peers.length;i++) {
                                     PeerNode pn = peers[i];
-                                    if(pn.isConnected()) {
+                                    if(pn.isReallyConnected()) {
                                         double ploc = 
pn.getLocation().getValue();
                                         if(ploc == myLoc) {
                                             myFlag = true;
@@ -386,7 +386,7 @@
                 }

                 if(reply == null) {
-                    if(pn.isConnected() && System.currentTimeMillis() - 
pn.timeLastConnected() > TIMEOUT*2) {
+                    if(pn.isReallyConnected() && System.currentTimeMillis() - 
pn.timeLastConnected() > TIMEOUT*2) {
                         // Timed out! Abort...
                         Logger.error(this, "Timed out waiting for 
SwapRejected/SwapReply on "+uid);
                     }
@@ -421,7 +421,7 @@
                 }

                 if(reply == null) {
-                    if(pn.isConnected() && System.currentTimeMillis() - 
pn.timeLastConnected() > TIMEOUT*2) {
+                    if(pn.isReallyConnected() && System.currentTimeMillis() - 
pn.timeLastConnected() > TIMEOUT*2) {
                         // Hrrrm!
                         Logger.error(this, "Timed out waiting for SwapComplete 
- malicious node?? on "+uid);
                     }
Index: /home/nextgens/src/eclipse/Freenet 
0.7/src/freenet/node/NodeDispatcher.java
===================================================================
--- /home/nextgens/src/eclipse/Freenet 0.7/src/freenet/node/NodeDispatcher.java 
(revision 9517)
+++ /home/nextgens/src/eclipse/Freenet 0.7/src/freenet/node/NodeDispatcher.java 
(working copy)
@@ -50,7 +50,32 @@
                 Logger.minor(this, "Lost connection replying to "+m);
             }
             return true;
+        }else if(spec == DMT.FNPLinkPing) {
+               long id = m.getLong(DMT.PING_SEQNO);
+               Message msg = DMT.createFNPLinkPong(id);
+               try {
+                               source.sendAsync(msg, null, 0, null);
+                       } catch (NotConnectedException e) {
+                               // Ignore
+                       }
+               return true;
+        } else if(spec == DMT.FNPLinkPong) {
+               long id = m.getLong(DMT.PING_SEQNO);
+               source.receivedLinkPong(id);
+               return true;
+        } else if(spec == DMT.FNPDetectedIPAddress) {
+               Peer p = (Peer) m.getObject(DMT.EXTERNAL_ADDRESS);
+               source.setRemoteDetectedPeer(p);
+               node.redetectAddress();
+        } else if(spec == DMT.FNPVoid) {
+               return true;
+        } else if(spec == DMT.nodeToNodeTextMessage) {
+               node.receivedNodeToNodeTextMessage(m);
+               return true;
         }
+        
+        if(!source.isReallyConnected()) return false;
+        
         if(spec == DMT.FNPLocChangeNotification) {
             double newLoc = m.getDouble(DMT.LOCATION);
             source.updateLocation(newLoc);
@@ -79,29 +104,7 @@
                return handleInsertRequest(m, false);
         } else if(spec == DMT.FNPSSKInsertRequest) {
             return handleInsertRequest(m, true);
-        } else if(spec == DMT.FNPLinkPing) {
-               long id = m.getLong(DMT.PING_SEQNO);
-               Message msg = DMT.createFNPLinkPong(id);
-               try {
-                               source.sendAsync(msg, null, 0, null);
-                       } catch (NotConnectedException e) {
-                               // Ignore
-                       }
-               return true;
-        } else if(spec == DMT.FNPLinkPong) {
-               long id = m.getLong(DMT.PING_SEQNO);
-               source.receivedLinkPong(id);
-               return true;
-        } else if(spec == DMT.FNPDetectedIPAddress) {
-               Peer p = (Peer) m.getObject(DMT.EXTERNAL_ADDRESS);
-               source.setRemoteDetectedPeer(p);
-               node.redetectAddress();
-        } else if(spec == DMT.FNPVoid) {
-               return true;
-        } else if(spec == DMT.nodeToNodeTextMessage) {
-               node.receivedNodeToNodeTextMessage(m);
-               return true;
-        }
+        } 
         return false;
     }

Index: /home/nextgens/src/eclipse/Freenet 0.7/src/freenet/node/PacketSender.java
===================================================================
--- /home/nextgens/src/eclipse/Freenet 0.7/src/freenet/node/PacketSender.java   
(revision 9517)
+++ /home/nextgens/src/eclipse/Freenet 0.7/src/freenet/node/PacketSender.java   
(working copy)
@@ -154,7 +154,10 @@
             if(pn.isConnected()) {

                if(pn.shouldDisconnectNow()) {
-                       pn.forceDisconnect();
+                       // we don't disconnect but we mark it incompatible
+                       pn.invalidate();
+                       pn.setPeerNodeStatus(now);
+                       Logger.normal(this, "shouldDisconnect has returned true 
: marking the peer as incompatible");
                        continue;
                }

@@ -175,7 +178,7 @@
                     try {
                                                pn.sendAnyUrgentNotifications();
                                        } catch (PacketSequenceException e) {
-                       Logger.error(this, "Caught "+e+" - disconnecting", e);
+                       Logger.error(this, "Caught "+e+" - while sending urgent 
notifications : disconnecting", e);
                        pn.forceDisconnect();
                                        }
                 } else {
Index: /home/nextgens/src/eclipse/Freenet 0.7/src/freenet/node/PeerManager.java
===================================================================
--- /home/nextgens/src/eclipse/Freenet 0.7/src/freenet/node/PeerManager.java    
(revision 9517)
+++ /home/nextgens/src/eclipse/Freenet 0.7/src/freenet/node/PeerManager.java    
(working copy)
@@ -180,7 +180,7 @@
        }

     public void addConnectedPeer(PeerNode pn) {
-       if(!pn.isConnected()) {
+       if(!pn.isReallyConnected()) {
                Logger.minor(this, "Not connected: "+pn);
                return;
        }
@@ -272,7 +272,7 @@
         locs = new double[connectedPeers.length];
         int x = 0;
         for(int i=0;i<conns.length;i++) {
-            if(conns[i].isConnected())
+            if(conns[i].isReallyConnected())
                 locs[x++] = conns[i].getLocation().getValue();
         }
         // Wipe out any information contained in the order
@@ -294,7 +294,7 @@
         for(int i=0;i<5;i++) {
             PeerNode pn = 
connectedPeers[node.random.nextInt(connectedPeers.length)];
             if(pn == exclude) continue;
-            if(pn.isConnected()) return pn;
+            if(pn.isReallyConnected()) return pn;
         }
         // None of them worked
         // Move the un-connected ones out
@@ -304,7 +304,7 @@
         for(int i=0;i<myPeers.length;i++) {
             PeerNode pn = myPeers[i];
             if(pn == exclude) continue;
-            if(pn.isConnected()) {
+            if(pn.isReallyConnected()) {
                 v.add(pn);
             } else {
                Logger.minor(this, "Excluding "+pn+" because is disconnected");
@@ -311,7 +311,7 @@
             }
         }
         int lengthWithoutExcluded = v.size();
-        if(exclude != null && exclude.isConnected())
+        if(exclude != null && exclude.isReallyConnected())
             v.add(exclude);
         PeerNode[] newConnectedPeers = new PeerNode[v.size()];
         newConnectedPeers = (PeerNode[]) v.toArray(newConnectedPeers);
@@ -348,7 +348,7 @@
         PeerNode best = null;
         for(int i=0;i<peers.length;i++) {
             PeerNode p = peers[i];
-            if(!p.isConnected()) continue;
+            if(!p.isReallyConnected()) continue;
             double diff = distance(p, loc);
             if(diff < bestDiff) {
                 best = p;
@@ -423,7 +423,7 @@
                Logger.minor(this, "Skipping (req came from): "+p.getPeer());
                continue;
             }
-            if(!p.isConnected()) {
+            if(!p.isReallyConnected()) {
                Logger.minor(this, "Skipping (not connected): "+p.getPeer());
                continue;
             }
@@ -580,7 +580,7 @@
        public boolean anyConnectedPeers() {
                PeerNode[] conns = connectedPeers;
                for(int i=0;i<conns.length;i++) {
-                       if(conns[i].isConnected()) return true;
+                       if(conns[i].isReallyConnected()) return true;
                }
                return false;
        }
Index: /home/nextgens/src/eclipse/Freenet 0.7/src/freenet/node/PeerNode.java
===================================================================
--- /home/nextgens/src/eclipse/Freenet 0.7/src/freenet/node/PeerNode.java       
(revision 9517)
+++ /home/nextgens/src/eclipse/Freenet 0.7/src/freenet/node/PeerNode.java       
(working copy)
@@ -680,8 +680,17 @@
      * Note possible deadlocks! PeerManager calls this, we call
      * PeerManager in e.g. verified.
      */
+    public boolean isReallyConnected() {
+        return isConnected;
+    }
+    
+    /**
+     * the node has established the session link : doesn't mean we can route 
to it!
+     * check isReallyConnected() insteed.
+     */
     public boolean isConnected() {
-        return isConnected;
+       // maybe we should check the protocol versions too
+        return (isConnected || (hasCompletedHandshake() && 
(isVerifiedIncompatibleNewerVersion() || 
isVerifiedIncompatibleOlderVersion())));
     }

     /**
@@ -694,7 +703,7 @@
      */
     public void sendAsync(Message msg, AsyncMessageCallback cb, int 
alreadyReportedBytes, ByteCounter ctr) throws NotConnectedException {
         Logger.minor(this, "Sending async: "+msg+" : "+cb+" on "+this);
-        if(!isConnected) throw new NotConnectedException();
+        if(!isConnected()) throw new NotConnectedException();
         MessageItem item = new MessageItem(msg, cb == null ? null : new 
AsyncMessageCallback[] {cb}, alreadyReportedBytes, ctr);
         synchronized(routingBackoffSync) {
                reportBackoffStatus(System.currentTimeMillis());
@@ -732,6 +741,7 @@
         synchronized(this) {
                // Force renegotiation.
             isConnected = false;
+            completedHandshake = false;
             setPeerNodeStatus(now);
             // Prevent sending packets to the node until that happens.
             if(currentTracker != null)
@@ -1110,27 +1120,18 @@
                        } catch (NumberFormatException e) {
                                // ignore
                        }
-                       Logger.normal(this, "Not connecting to "+this+" - 
reverse invalid version "+Version.getVersionString()+" for peer's 
lastGoodversion: "+lastGoodVersion);
+                       Logger.normal(this, "Connecting to "+this+" - reverse 
invalid version "+Version.getVersionString()+" for peer's lastGoodversion: 
"+lastGoodVersion);
                        verifiedIncompatibleNewerVersion = true;
                        isConnected = false;
-                       setPeerNodeStatus(now);
-                       node.peers.disconnected(this);
-                       return false;
-               } else {
-                       verifiedIncompatibleNewerVersion = false;
-                       setPeerNodeStatus(now);
-               }
-               if(invalidVersion()) {
-                       Logger.normal(this, "Not connecting to "+this+" - 
invalid version "+version);
+               }else if(invalidVersion()) {
+                       Logger.normal(this, "Connecting to "+this+" - invalid 
version "+version);
                        verifiedIncompatibleOlderVersion = true;
                        isConnected = false;
-                       setPeerNodeStatus(now);
-                       node.peers.disconnected(this);
-                       return false;
                } else {
                        verifiedIncompatibleOlderVersion = false;
-                       setPeerNodeStatus(now);
                }
+               setPeerNodeStatus(now);
+               
                KeyTracker newTracker = new KeyTracker(this, encCipher, encKey);
                changedIP(replyTo);
                if(thisBootID != this.bootID) {
@@ -1164,7 +1165,6 @@
                        unverifiedTracker = null;
                        if(previousTracker != null)
                                previousTracker.deprecated();
-                       isConnected = true;
                        neverConnected = false;
                        peerAddedTime = 0;  // don't store anymore
                        setPeerNodeStatus(now);
@@ -1170,7 +1170,7 @@
                        setPeerNodeStatus(now);
                        ctx = null;
                }
-               if(!isConnected)
+               if(!isConnected())
                        node.peers.disconnected(this);
                Logger.normal(this, "Completed handshake with "+this+" on 
"+replyTo+" - current: "+currentTracker+" old: "+previousTracker+" unverified: 
"+unverifiedTracker+" bootID: "+thisBootID+" myName: "+myName);
                try {
@@ -1196,7 +1196,8 @@
             else return;
             if(unverifiedTracker != null) return;
         }
-        sendInitialMessages();
+        if(isReallyConnected())
+               sendInitialMessages();
     }

     /**
@@ -1207,7 +1208,7 @@
         Message ipMsg = DMT.createFNPDetectedIPAddress(detectedPeer);

         try {
-            sendAsync(locMsg, null, 0, null);
+               sendAsync(locMsg, null, 0, null);
             sendAsync(ipMsg, null, 0, null);
         } catch (NotConnectedException e) {
             Logger.error(this, "Completed handshake with "+getPeer()+" but 
disconnected!!!", new Exception("error"));
@@ -1453,8 +1454,16 @@
     }

     public String getStatus() {
+       String status;
+       if(isReallyConnected())
+               status = new String("CONNECTED");
+       else if(isConnected())
+               status = new String("INCOMPATIBLE");
+       else
+               status = new String("DISCONNECTED");
+       
         return 
-               (isConnected ? "CONNECTED   " : "DISCONNECTED") + " " + 
getPeer()+" "+myName+" "+currentLocation.getValue()+" "+getVersion()+" backoff: 
"+routingBackoffLength+" ("+(Math.max(routingBackedOffUntil - 
System.currentTimeMillis(),0))+")";
+               status + " " + getPeer()+" "+myName+" 
"+currentLocation.getValue()+" "+getVersion()+" backoff: 
"+routingBackoffLength+" ("+(Math.max(routingBackedOffUntil - 
System.currentTimeMillis(),0))+")";
     }

     public String getTMCIPeerInfo() {
@@ -1774,7 +1783,8 @@
                        pingAverage.report(now - startTime);
                        Logger.minor(this, "Reporting ping time to "+this+" : 
"+(now - startTime));
                }
-               if(verifiedIncompatibleOlderVersion)
+               
+               if(shouldDisconnectNow())
                                forceDisconnect();
        }

@@ -2052,8 +2062,14 @@
         * This will return true if our lastGoodBuild has changed due to a 
timed mandatory.
         */
        public synchronized boolean shouldDisconnectNow() {
+               if(!isReallyConnected()) return false;
                verifiedIncompatibleOlderVersion = invalidVersion();
-               return verifiedIncompatibleOlderVersion;
+               verifiedIncompatibleNewerVersion = reverseInvalidVersion();
+               return verifiedIncompatibleOlderVersion || 
verifiedIncompatibleNewerVersion;
+       }
+       
+       public synchronized void invalidate() {
+               isConnected = false;
        }

        public boolean allowLocalAddresses() {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
URL: 
<https://emu.freenetproject.org/pipermail/devl/attachments/20060709/9bc4dc2f/attachment.pgp>

Reply via email to