Exemple #1
0
        public bool UpdateLines(RoutingTable receivedTable, int metric)
        {
            var updated = false;
            var receivedTableOwnLine = receivedTable.OwnLine();
            var neighborLine         = _routingTableLines.Find(x => x.Destination == receivedTableOwnLine.Destination);
            var toChange             = _routingTableLines.FindAll(x => x.Destination == receivedTableOwnLine.Destination);

            if (receivedTableOwnLine.SequenceNumber > neighborLine.SequenceNumber)
            {
                foreach (var line in toChange)
                {
                    var infoLine = receivedTable.RoutingTableLines.Find(x => x.Destination == line.Destination);
                    if (infoLine.SequenceNumber > line.SequenceNumber && line.NextHop == receivedTable.OwnLine().Destination)
                    {
                        if (infoLine.Metric + metric < line.Metric)
                        {
                            updated = true;
                            line.Update(receivedTableOwnLine.Destination, metric + infoLine.Metric, infoLine.SequenceNumber);
                        }
                    }
                }
            }
            foreach (var line in _routingTableLines)
            {
                var infoLine = receivedTable.RoutingTableLines.Find(x => x.Destination == line.Destination);
                if (infoLine != null && infoLine.SequenceNumber > line.SequenceNumber && infoLine.Metric + metric == line.Metric)
                {
                    line.Update(line.NextHop, line.Metric, infoLine.SequenceNumber);
                }
            }
            return(updated);
        }
Exemple #2
0
        public void InstallTime(RoutingTable receivedTable, int time)
        {
            var lines = _routingTableLines.FindAll(x => x.NextHop == receivedTable.OwnLine().Destination);

            foreach (var line in lines)
            {
                _ownRoutingTableLines[line] = time;
            }
        }
Exemple #3
0
 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;
 }
Exemple #4
0
        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);
        }
Exemple #5
0
        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);
        }
Exemple #6
0
        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;
            }
        }
Exemple #7
0
        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);
                    }
                }
            }
        }