Beispiel #1
0
        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++;
            }
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        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));
 }