rendered paste bodyIndex: /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 9509)+++ /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 9509)+++ /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 9509)+++ /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 9509)+++ /home/nextgens/src/eclipse/Freenet 0.7/src/freenet/node/CHKInsertSender.java (working copy)@@ -644,7 +644,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; }@@ -675,7 +675,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); }@@ -741,7 +741,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)@@ -765,7 +765,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;@@ -780,7 +780,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 9509)+++ /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);@@ -1126,7 +1126,7 @@ else log += (""+callbacks.length+(callbacks.length >= 1 ? String.valueOf(callbacks[0]) : "")); Logger.minor(this, log); }- if(tracker == null || (!tracker.pn.isConnected())) {+ if(tracker == null || (!tracker.pn.isReallyConnected())) { throw new NotConnectedException(); } @@ -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 9509)+++ /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;@@ -250,7 +250,7 @@ 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 9509)+++ /home/nextgens/src/eclipse/Freenet 0.7/src/freenet/node/InsertHandler.java (working copy)@@ -103,7 +103,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);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 9509)+++ /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++;@@ -658,7 +658,7 @@ */ public int allocateOutgoingPacketNumberNeverBlock() throws KeyChangedException, NotConnectedException, WouldBlockException { int packetNumber;- if(!pn.isConnected()) throw new NotConnectedException();+ if(!pn.isReallyConnected()) throw new NotConnectedException(); synchronized(this) { packetNumber = nextPacketNumber; if(isDeprecated) throw new KeyChangedException();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 9509)+++ /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 9509)+++ /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/PeerManager.java===================================================================--- /home/nextgens/src/eclipse/Freenet 0.7/src/freenet/node/PeerManager.java (revision 9509)+++ /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 9509)+++ /home/nextgens/src/eclipse/Freenet 0.7/src/freenet/node/PeerNode.java (working copy)@@ -680,9 +680,18 @@ * Note possible deadlocks! PeerManager calls this, we call * PeerManager in e.g. verified. */- public boolean isConnected() {+ 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() {+ // maybe we should check the protocol versions too+ return (isConnected || (hasCompletedHandshake() && (isVerifiedIncompatibleNewerVersion() || isVerifiedIncompatibleOlderVersion())));+ } /** * Send a message, off-thread, to this node.@@ -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());@@ -1113,13 +1122,11 @@ Logger.normal(this, "Not 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);+ verifiedIncompatibleNewerVersion = false; }+ + if(invalidVersion()) { Logger.normal(this, "Not connecting to "+this+" - invalid version "+version); verifiedIncompatibleOlderVersion = true;@@ -1124,13 +1131,11 @@ Logger.normal(this, "Not 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 +1169,6 @@ unverifiedTracker = null; if(previousTracker != null) previousTracker.deprecated();- isConnected = true; neverConnected = false; peerAddedTime = 0; // don't store anymore setPeerNodeStatus(now);@@ -1170,7 +1174,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 +1200,8 @@ else return; if(unverifiedTracker != null) return; }- sendInitialMessages();+ if(isReallyConnected())+ sendInitialMessages(); } /**@@ -1453,8 +1458,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 +1787,8 @@ pingAverage.report(now - startTime); Logger.minor(this, "Reporting ping time to "+this+" : "+(now - startTime)); }- if(verifiedIncompatibleOlderVersion)+ + if(isReallyConnected() && verifiedIncompatibleOlderVersion) forceDisconnect(); } @@ -2052,6 +2066,7 @@ * 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; }