public boolean addPeerConnection(PeerNode pn) { boolean retval = peers.addPeer(pn); peers.writePeersUrgent(pn.isOpennet()); return retval; }
if(!lastRoutingBackoffReasonRT.equals(previousRoutingBackoffReasonRT) || (previousRoutingBackoffReasonRT == null)) { if(previousRoutingBackoffReasonRT != null) { peers.removePeerNodeRoutingBackoffReason(previousRoutingBackoffReasonRT, this, true); peers.addPeerNodeRoutingBackoffReason(lastRoutingBackoffReasonRT, this, true); previousRoutingBackoffReasonRT = lastRoutingBackoffReasonRT; peers.removePeerNodeRoutingBackoffReason(previousRoutingBackoffReasonRT, this, true); previousRoutingBackoffReasonRT = null; if(!lastRoutingBackoffReasonBulk.equals(previousRoutingBackoffReasonBulk) || (previousRoutingBackoffReasonBulk == null)) { if(previousRoutingBackoffReasonBulk != null) { peers.removePeerNodeRoutingBackoffReason(previousRoutingBackoffReasonBulk, this, false); peers.addPeerNodeRoutingBackoffReason(lastRoutingBackoffReasonBulk, this, false); previousRoutingBackoffReasonBulk = lastRoutingBackoffReasonBulk; peers.removePeerNodeRoutingBackoffReason(previousRoutingBackoffReasonBulk, this, false); previousRoutingBackoffReasonBulk = null; peerNodeStatus = PeerManager.PEER_NODE_STATUS_DISCONNECTED; if(!isConnected && (previousRoutingBackoffReasonRT != null)) { peers.removePeerNodeRoutingBackoffReason(previousRoutingBackoffReasonRT, this, true); previousRoutingBackoffReasonRT = null; peers.removePeerNodeRoutingBackoffReason(previousRoutingBackoffReasonBulk, this, false); previousRoutingBackoffReasonBulk = null;
int peers, darknetPeers, opennetPeers; synchronized(this) { darknetPeers = this.getDarknetPeers().length; opennetPeers = this.getOpennetPeers().length; ua.opennetAssumeNAT = opennetAssumeNAT; ua.darknetAssumeNAT = darknetAssumeNAT; ua.darknetConns = getPeerNodeStatusSize(PEER_NODE_STATUS_CONNECTED, true) + getPeerNodeStatusSize(PEER_NODE_STATUS_ROUTING_BACKED_OFF, true); ua.conns = getPeerNodeStatusSize(PEER_NODE_STATUS_CONNECTED, false) + getPeerNodeStatusSize(PEER_NODE_STATUS_ROUTING_BACKED_OFF, false); ua.darknetPeers = darknetPeers; ua.disconnDarknetPeers = darknetPeers - ua.darknetConns; ua.peers = peers; ua.neverConn = getPeerNodeStatusSize(PEER_NODE_STATUS_NEVER_CONNECTED, true); ua.clockProblem = getPeerNodeStatusSize(PEER_NODE_STATUS_CLOCK_PROBLEM, false); ua.connError = getPeerNodeStatusSize(PEER_NODE_STATUS_CONN_ERROR, true); ua.isOpennetEnabled = opennetEnabled; ua.tooNewPeersDarknet = getPeerNodeStatusSize(PEER_NODE_STATUS_TOO_NEW, true); ua.tooNewPeersTotal = getPeerNodeStatusSize(PEER_NODE_STATUS_TOO_NEW, false); if(anyConnectedPeers()) node.onConnectedPeer();
/** * Connect to a node provided the fieldset representing it. * @throws PeerTooOldException */ public void connect(SimpleFieldSet noderef, OutgoingPacketMangler mangler, FRIEND_TRUST trust, FRIEND_VISIBILITY visibility) throws FSParseException, PeerParseException, ReferenceSignatureVerificationException, PeerTooOldException { PeerNode pn = node.createNewDarknetNode(noderef, trust, visibility); PeerNode[] peerList = myPeers(); for(PeerNode mp: peerList) { if(Arrays.equals(mp.peerECDSAPubKeyHash, pn.peerECDSAPubKeyHash)) return; } addPeer(pn); }
long soonestTimeoutWakeup = Long.MAX_VALUE; PeerNode[] peers = connectedPeers(); if(!node.enablePerNodeFailureTables) key = null; PeerNode first = closerPeer(pn, routedTo, target, ignoreSelf, false, minVersion, null, maxDistance, key, outgoingHTL, ignoreBackoffUnder, isLocal, realTime, null, true, now, newLoadManagement); if(first != null) { long firstTime; HashSet<PeerNode> newRoutedTo = new HashSet<PeerNode>(routedTo); newRoutedTo.add(first); PeerNode second = closerPeer(pn, newRoutedTo, target, ignoreSelf, false, minVersion, null, maxDistance, key, outgoingHTL, ignoreBackoffUnder, isLocal, realTime, null, true, now, newLoadManagement); if(second != null) { if((secondTime = entry.getTimeoutTime(first, outgoingHTL, now, false)) > now) { else check = checkBackoffsForRecentlyFailed(peers, best, target, bestDistance, myLoc, prevLoc, now, entry, outgoingHTL); if(check < until) { if(logMINOR) Logger.minor(this, "Reducing RecentlyFailed from "+(until-now)+"ms to "+(check-now)+"ms because of check for peers to wakeup"); int numberOfConnected = getPeerNodeStatusSize(PEER_NODE_STATUS_CONNECTED, false); int numberOfRoutingBackedOff = getPeerNodeStatusSize(PEER_NODE_STATUS_ROUTING_BACKED_OFF, false); if(numberOfRoutingBackedOff + numberOfConnected > 0) node.nodeStats.backedOffPercent.report((double) numberOfRoutingBackedOff / (double) (numberOfRoutingBackedOff + numberOfConnected));
addPeerNodeStatus(pn.getPeerNodeStatus(), pn, false); pn.setPeerNodeStatus(System.currentTimeMillis()); if((!ignoreOpennet) && pn instanceof OpennetPeerNode) { else { Logger.error(this, "Adding opennet peer when no opennet enabled!!!: " + pn + " - removing..."); removePeer(pn); return false; notifyPeerStatusChangeListeners(); if(!pn.isSeed()) {
return; if(n.peers.addPeer(pn)) System.out.println("Added peer: "+pn); n.peers.writePeersDarknetUrgent();
/** * Connect this node to another node (for purposes of testing) */ public void connectToSeednode(SeedServerTestPeerNode node) throws OpennetDisabledException, FSParseException, PeerParseException, ReferenceSignatureVerificationException { peers.addPeer(node,false,false); } public void connect(Node node, FRIEND_TRUST trust, FRIEND_VISIBILITY visibility) throws FSParseException, PeerParseException, ReferenceSignatureVerificationException, PeerTooOldException {
Logger.error(this, "Connecting to " + pn + " but not in peers!"); addPeer(pn); updatePMUserAlert(); node.lm.announceLocChange();
if(notMany) { if(nodeToAddNow != null) { node.peers.addPeer(nodeToAddNow, true, true); // Add to peers outside the OM lock if(nodeToAddNow != null && canAdd && !node.peers.addPeer(nodeToAddNow, true, true)) { if(logMINOR) Logger.minor(this, "Already in global peers list: "+nodeToAddNow+" when adding opennet node"); if(logMINOR) Logger.minor(this, "Dropping LRU opennet peer: "+pn); pn.setAddedReason(null); node.peers.disconnectAndRemove(pn, true, true, true);
node.peers.disconnected(this); return -1; node.peers.disconnected(this); else if(!wasARekey) { node.peers.addConnectedPeer(this); maybeOnConnect();
@Override public boolean isValid() { return node.peers.anyDarknetPeers(); } }
public boolean noConnectedPeers() { return !peers.anyConnectedPeers(); }
public boolean allowConnection(PeerNode pn, FreenetInetAddress addr) { if(config.oneConnectionPerAddress()) { // Disallow multiple connections to the same address // TODO: this is inadequate for IPv6, should be replaced by // check for "same /64 subnet" [configurable] instead of exact match if(node.peers.anyConnectedPeerHasAddress(addr, pn) && !detector.includes(addr) && addr.isRealInternetAddress(false, false, false)) { Logger.normal(this, "Not sending handshake packets to "+addr+" for "+pn+" : Same IP address as another node"); return false; } } return true; }
node.peers.addConnectedPeer(this); maybeOnConnect(); if(completelyDeprecatedTracker != null) {
public int setPeerNodeStatus(long now, boolean noLog) { long localRoutingBackedOffUntilRT = getRoutingBackedOffUntil(true); long localRoutingBackedOffUntilBulk = getRoutingBackedOffUntil(true); int oldPeerNodeStatus; long threshold = maxPeerPingTime(); boolean noLoadStats = noLoadStats(); synchronized(this) { oldPeerNodeStatus = peerNodeStatus; peerNodeStatus = getPeerNodeStatus(now, localRoutingBackedOffUntilRT, localRoutingBackedOffUntilBulk, averagePingTime() > threshold, noLoadStats); if(peerNodeStatus != oldPeerNodeStatus && recordStatus()) { peers.changePeerNodeStatus(this, oldPeerNodeStatus, peerNodeStatus, noLog); } } if(logMINOR) Logger.minor(this, "Peer node status now "+peerNodeStatus+" was "+oldPeerNodeStatus); if(peerNodeStatus!=oldPeerNodeStatus){ if(oldPeerNodeStatus == PeerManager.PEER_NODE_STATUS_ROUTING_BACKED_OFF) { outputLoadTrackerRealTime.maybeNotifySlotWaiter(); outputLoadTrackerBulk.maybeNotifySlotWaiter(); } notifyPeerNodeStatusChangeListeners(); } if(peerNodeStatus == PeerManager.PEER_NODE_STATUS_ROUTING_BACKED_OFF) { long delta = Math.max(localRoutingBackedOffUntilRT, localRoutingBackedOffUntilBulk) - now + 1; if(delta > 0) node.ticker.queueTimedJob(checkStatusAfterBackoff, "Update status for "+this, delta, true, true); } return peerNodeStatus; }
peers = new PeerManager(this, shutdownHook);
public boolean addPeer(PeerNode pn) { return addPeer(pn, false, false); }
/** * Return all the ports that we have reason to believe are not forwarded. E.g. for the user-alert, which only * shows if what we return is of nonzero length. */ public int[] getUDPPortsNotForwarded() { OpennetManager om = node.getOpennet(); Status darknetStatus = (node.peers.anyDarknetPeers() ? node.darknetCrypto.getDetectedConnectivityStatus() : AddressTracker.Status.DONT_KNOW); Status opennetStatus = om == null ? Status.DONT_KNOW : om.crypto.getDetectedConnectivityStatus(); if(om == null || opennetStatus.ordinal() >= AddressTracker.Status.DONT_KNOW.ordinal()) { if(darknetStatus.ordinal() >= AddressTracker.Status.DONT_KNOW.ordinal()) { return new int[] { }; } else { return new int[] { (darknetStatus.ordinal() < AddressTracker.Status.MAYBE_NATED.ordinal() ? -1 : 1) * node.getDarknetPortNumber() }; } } else { if(darknetStatus.ordinal() >= AddressTracker.Status.DONT_KNOW.ordinal()) { return new int[] { (opennetStatus.ordinal() < AddressTracker.Status.MAYBE_NATED.ordinal() ? -1 : 1 ) * om.crypto.portNumber }; } else { return new int[] { ((darknetStatus.ordinal() < AddressTracker.Status.MAYBE_NATED.ordinal()) ? -1 : 1 ) * node.getDarknetPortNumber(), (opennetStatus.ordinal() < AddressTracker.Status.MAYBE_NATED.ordinal() ? -1 : 1 ) * om.crypto.portNumber }; } } }
opennet.addOldOpennetNode((OpennetPeerNode)pn); } else addPeer(pn, true, false); gotSome = true; } catch(FSParseException e2) {