public void AddDirectConnection(IAddress other) { var newLink = new RoutingMapLink(OwnAddress, other); var existingLink = Links.FirstOrDefault(link => Equals(link, newLink)); if (!existingLink.Connected) { Links.Remove(existingLink); Links.Add(new RoutingMapLink(OwnAddress, other, existingLink.Version + 1, true)); Version++; } }
public bool IsLinkExcess(RoutingMapLink link) { if (!link.Connected) { return(false); } var stateBefore = GraphHelper.CalculateConnectivity(Links); var nodesBefore = GraphHelper.GetNodes(Links); Links.Remove(link); var stateAfter = GraphHelper.CalculateConnectivity(Links); var nodesAfter = GraphHelper.GetNodes(Links); Links.Add(link); return(Equals(stateAfter, stateBefore) && nodesAfter.Count == nodesBefore.Count); }
public bool ShouldConnectTo(IAddress other) { var peers = GraphHelper.GetPeers(OwnAddress, Links).ToList(); if (peers.Count >= config.MaxConnections || peers.Contains(other)) { return(false); } var newLink = new RoutingMapLink(OwnAddress, other); if (GraphHelper.IsReachable(other, OwnAddress, Links)) { if (peers.Count >= config.DesiredConnections) { return(false); } var existingLink = Links.FirstOrDefault(link => Equals(link, newLink)); var stateBefore = GraphHelper.CalculateConnectivity(Links); Links.Remove(existingLink); Links.Add(newLink); var stateAfter = GraphHelper.CalculateConnectivity(Links); Links.Remove(newLink); if (existingLink.A != null) { Links.Add(existingLink); } if (Equals(stateAfter, stateBefore)) { return(false); } } return(true); }
public bool Equals(RoutingMapLink other) { return(Equals(A, other.A) && Equals(B, other.B) || Equals(A, other.B) && Equals(B, other.A)); }