Exemple #1
0
 private void UpdateRoute(TopologyEntry newEntry)
 {
     lock (tablesLock)
     {
         var oldEntry = RoutingTable.FirstOrDefault(r => r.Destination.Equals(newEntry.Destination));
         if (oldEntry == null && newEntry.Feasible != -1)
         {
             RoutingTable.Add(new RouteEntry(newEntry.Destination, newEntry.Neighbor, DateTime.Now));
         }
         else
         {
             var fastest = TopologyTable.Where(t => t.Destination.Equals(newEntry.Destination)).OrderBy(t => t.Feasible).FirstOrDefault();
             if (fastest == null)
             {
                 RoutingTable.Remove(oldEntry);
             }
             else if (!oldEntry.Neighbor.Equals(fastest.Neighbor))
             {
                 RoutingTable.Remove(oldEntry);
                 RoutingTable.Add(new RouteEntry(fastest.Destination, fastest.Neighbor, DateTime.Now));
             }
         }
     }
 }
Exemple #2
0
        public void AddTopology(TopologyEntry entry)
        {
            /*
             * if(entry.Feasible == -1)
             * {
             *  //remove topology
             *  lock(tablesLock)
             *  {
             *      var existing = TopologyTable.FirstOrDefault(t => t.Destination.Equals(entry.Destination) && t.Neighbor.Equals(entry.Neighbor));
             *      if(existing != null)
             *      {
             *          TopologyTable.Remove(existing);
             *          UpdateRoute(entry);
             *      }
             *      return;
             *  }
             * }
             */
            if (entry.Destination.Equals(Text))
            {
                return;
            }
            if (entry.Feasible != -1)
            {
                lock (tablesLock)
                {
                    var fastest = TopologyTable.Where(t => t.Destination.Equals(entry.Destination))?.OrderBy(t => t.Feasible).FirstOrDefault();

                    if (fastest != null && entry.Advertised >= fastest.Feasible)
                    {
                        return;
                    }

                    var existing = TopologyTable.Where(t => t.Destination.Equals(entry.Destination) && t.Neighbor.Equals(entry.Neighbor) && t.Feasible == entry.Feasible).FirstOrDefault();
                    if (existing != null)
                    {
                        return;
                    }

                    TopologyTable.Add(entry);
                }
            }
            else
            {
                lock (tablesLock)
                {
                    var existing = TopologyTable.FirstOrDefault(t => t.Destination.Equals(entry.Destination) && t.Neighbor.Equals(entry.Neighbor));
                    if (existing != null)
                    {
                        TopologyTable.Remove(existing);
                    }
                }
            }
            UpdateRoute(entry);

            var neighbors = NeighborhoodTable.Where(n => !n.Address.Equals(entry.Neighbor)).ToList();

            foreach (var neighbor in neighbors)
            {
                var node = Nodes.FirstOrDefault(n => (n as RouterNode).Text.Equals(neighbor.Address)) as RouterNode;
                var link = Links.FirstOrDefault(l => l.ToNode.Equals(node) || l.FromNode.Equals(node)) as GoLabeledLink;
                if (node == null || link == null)
                {
                    continue;
                }

                TopologyEntry fastest;
                lock (tablesLock)
                {
                    fastest = TopologyTable.Where(t => t.Destination.Equals(entry.Destination)).OrderBy(t => t.Feasible).FirstOrDefault();
                }

                node.AddTopology(new TopologyEntry(entry.Destination, Text, fastest == null ? -1 : fastest.Feasible + link.UserFlags, fastest.Feasible));
            }
        }