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)); } } } }
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)); } }