public void UpdateTable(RoutingTable receivedTable, int metric, int time, int updateSeconds) { InstallTime(receivedTable, time); BrokenLink(receivedTable); if (NewNeighbor(receivedTable, metric, time) || NewRouter(receivedTable, metric, time) || UpdateLines(receivedTable, metric)) { OwnLine().SequenceNumber += 2; } _routingTableLines.Find(x => x.Destination == receivedTable.OwnLine().Destination).SequenceNumber = receivedTable.OwnLine().SequenceNumber; }
public bool NewNeighbor(RoutingTable receivedTable, int metric, int time) { var updated = false; var infoLine = receivedTable.OwnLine(); if (!_routingTableLines.Exists(x => x.Destination == infoLine.Destination)) { AddLine(infoLine.Destination, infoLine.Destination, metric, infoLine.SequenceNumber, time); updated = true; } return(updated); }
public void ChangeWeight(RoutingTable routingTable, int newWeight, string neighbor) { var neighborLine = routingTable.RoutingTableLines.Find(x => x.Destination == neighbor); int oldWeight = neighborLine.Metric; routingTable.OwnLine().SequenceNumber += 2; neighborLine.SequenceNumber += 2; var toChange = routingTable.RoutingTableLines.FindAll(x => x.NextHop == neighborLine.Destination); foreach (var line in toChange) { line.Metric += newWeight - oldWeight; } }
public void BrokenLink(RoutingTable receivedTable) { var infoLine = receivedTable.OwnLine(); foreach (var line in receivedTable._routingTableLines) { if (line.SequenceNumber.IsOdd()) { var toChange = _routingTableLines.Find(x => x.Destination == line.Destination && x.NextHop == infoLine.Destination); if (toChange != null) { toChange.Update(line.NextHop, line.Metric, line.SequenceNumber); } } } }
public bool NewRouter(RoutingTable receivedTable, int metric, int time) { bool updated = false; var infoLine = receivedTable.OwnLine(); var neighborLine = _routingTableLines.Find(x => x.Destination == receivedTable.OwnLine().Destination); if (infoLine.SequenceNumber == neighborLine.SequenceNumber) { foreach (var line in receivedTable._routingTableLines) { if (!_routingTableLines.Exists(x => x.Destination == line.Destination) && !line.SequenceNumber.IsOdd()) { AddLine(line.Destination, infoLine.Destination, metric + line.Metric, line.SequenceNumber, time); updated = true; } } } if (infoLine.SequenceNumber > neighborLine.SequenceNumber) { foreach (var line in receivedTable._routingTableLines) { if (!_routingTableLines.Exists(x => x.Destination == line.Destination) && !line.SequenceNumber.IsOdd()) { AddLine(line.Destination, infoLine.Destination, metric + line.Metric, line.SequenceNumber, time); updated = true; } else { var toCheck = _routingTableLines.Find(x => x.Destination == line.Destination); { if (toCheck.Metric > line.Metric + metric) { toCheck.Update(infoLine.Destination, line.Metric + metric, line.SequenceNumber); updated = true; } } } } } return(updated); }
public void ReceiveTable(RoutingTable table, Router sender, int time, int updateSeconds) { RoutingTable.UpdateTable(table, _neighbors[sender], time, updateSeconds); }
public Router(string name) { _neighbors = new Dictionary <Router, int>(); _name = name; _routingTable = new RoutingTable(this.Name); }