Метрика таблицы маршрутизации Omnet++ OSPF

Вопрос 1: я реализовал протокол ospf в Omnet++. В соответствии с топологией r1 может достигать r3 двумя разными способами. Я установил метрику верхнего пути на 1 и нижнего пути на 10. Однако, согласно протоколу OSPF, он не должен выбирать нижний путь, но всегда выбирает нижний путь, а затем возврат к верхнему пути. Как видно из таблицы маршрутизации, есть проблема со значениями метрик.

Вопрос 2: мне нужно увидеть таблицу маршрутизации в консоли. Я использовал метод printRoutingTable() для его печати, но он не работает.

Вопрос 3. Как просмотреть таблицу состояния ссылок, чтобы узнать всю топологию?

Здесь вы можете увидеть код

ospfRouting.ned

package inet.examples.ospfRouting;

import inet.networklayer.configurator.ipv4.IPv4NetworkConfigurator;
import inet.networklayer.ipv4.IPv4RoutingTable;
import inet.networklayer.ted.LinkStateRouting;
import inet.node.ethernet.EtherSwitch;
import inet.node.inet.StandardHost;
import inet.node.ospfv2.OSPFRouter;
import inet.common.misc.ThruputMeteringChannel;

network OspfRouting
{
   @display("bgb=831,570");
   types:

     channel C extends ThruputMeteringChannel
     {
        parameters:
            delay = 0.1us;
            datarate = 100Mbps;
            thruputDisplayFormat = "#N";
     }        

submodules:
    R1: OSPFRouter {
        // @networkNode;
        @display("p=171,213");
        gates:
            ethg[3];
    }
    R2: OSPFRouter {
        // @networkNode;
        @display("p=344,105");
        gates:
            ethg[2];
    }
    R3: OSPFRouter {
        //@networkNode;
        @display("p=510,213");
        gates:
            ethg[3];
    }

    R4: OSPFRouter {
        //  @networkNode;
        @display("p=344,327");
        gates:
            ethg[2];
    }
    SW1: EtherSwitch {
        //  @networkNode;
        @display("p=57,212");
    }
    SW2: EtherSwitch {
        //   @networkNode;
        @display("p=678,212");
    }
    H1: StandardHost {
        //  @networkNode;
        @display("p=57,331");
        gates:
            ethg[1];
    }
    H2: StandardHost {
        //  @networkNode;
        @display("p=678,327");
        gates:
            ethg[1];
    }
    configurator: IPv4NetworkConfigurator {
        // @networkNode;
        @display("p=774.89996,143.5");
    }

connections:
{
        R1.ethg[0] <--> C <--> R4.ethg[0];
        R1.ethg[1] <--> C <--> R2.ethg[1];
        R2.ethg[0] <--> C <--> R3.ethg[0];
        R3.ethg[1] <--> C <--> R4.ethg[1];

        R1.ethg[2] <--> C <--> SW1.ethg++;
        R3.ethg[2] <--> C <--> SW2.ethg++;
        SW1.ethg++ <--> C <--> H1.ethg[0];
        SW2.ethg++ <--> C <--> H2.ethg[0];
    }
}

Rconfig.xml

<?xml version = "1.0"?>
<scenario>

<interface hosts = 'R1' names = 'eth0' address = '30.0.0.1' netmask = '255.0.0.0' metric = '1' />
<interface hosts = 'R1' names = 'eth1' address = '10.0.0.1' netmask = '255.0.0.0' metric = '1' />
<interface hosts = 'R1' names = 'eth2' address = '50.0.0.1' netmask = '255.0.0.0' metric = '1' />

<interface hosts = 'R2' names = 'eth0' address = '20.0.0.2' netmask = '255.0.0.0' metric = '1' />
<interface hosts = 'R2' names = 'eth1' address = '10.0.0.2' netmask = '255.0.0.0' metric = '1' />

<interface hosts = 'R3' names = 'eth0' address = '20.0.0.3' netmask = '255.0.0.0' metric = '1' />
<interface hosts = 'R3' names = 'eth1' address = '40.0.0.3' netmask = '255.0.0.0' metric = '1' />
<interface hosts = 'R3' names = 'eth2' address = '60.0.0.3' netmask = '255.0.0.0' metric = '1' />

<interface hosts = 'R4' names = 'eth0' address = '30.0.0.4' netmask = '255.0.0.0' metric = '1' />
<interface hosts = 'R4' names = 'eth1' address = '40.0.0.4' netmask = '255.0.0.0' metric = '1' />

<interface hosts = 'H1' names = 'eth0' address ='50.0.0.10' netmask = '255.0.0.0' metric = '1' />
<interface hosts = 'H2' names = 'eth0' address ='60.0.0.10' netmask = '255.0.0.0' metric = '1' />

<route hosts = 'H1' destination  = '*' netmask = '*' interface = 'eth0'/>
<route hosts = 'H2' destination  = '*' netmask = '*' interface = 'eth0'/>

</scenario>

RASConfig.xml

<?xml version="1.0"?>
<OSPFASConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="OSPF.xsd">

<Area id = "0.0.0.0">
    <AddressRange address = "10.0.0.0"
    mask = "255.0.0.0"
    status = "Advertise" />
</Area>

<Area id = "0.0.0.0">
    <AddressRange address = "20.0.0.0"
    mask = "255.0.0.0"
    status = "Advertise" />
</Area>

<Area id = "0.0.0.0">
    <AddressRange address = "30.0.0.0"
    mask = "255.0.0.0"
    status = "Advertise" />
</Area>

<Area id = "0.0.0.0">
    <AddressRange address = "40.0.0.0"
    mask = "255.0.0.0"
    status = "Advertise" />
</Area>

<Area id = "0.0.0.1">
    <AddressRange address = "50.0.0.0"
    mask = "255.0.0.0"
    status = "Advertise" />
</Area>

<Area id = "0.0.0.2">
    <AddressRange address = "60.0.0.0"
    mask = "255.0.0.0"
    status = "Advertise" />
</Area>

<Router name = "R1" RFC1583Compatible = "true">

     <BroadcastInterface
        ifName= "eth2"
        areaID= "0.0.0.1"
        InterfaceOutputCost = "1"
     />

     <PointToPointInterface
         ifName="eth0"
         areaID = "0.0.0.0"
         InterfaceOutputCost = "1"
      />

      <PointToPointInterface
         ifName="eth1"
         areaID = "0.0.0.0"
         InterfaceOutputCost = "1000"
      /> 

</Router>

<Router name = "R2" RFC1583Compatible = "true">

     <PointToPointInterface
         ifName="eth0"
         areaID = "0.0.0.0"
         InterfaceOutputCost = "1"
      />

      <PointToPointInterface
         ifName="eth1"
         areaID = "0.0.0.0"
         InterfaceOutputCost = "1"
      />

</Router>

<Router name = "R3" RFC1583Compatible = "true">

     <BroadcastInterface
        ifName= "eth2"
        areaID= "0.0.0.2"
        InterfaceOutputCost = "1"
     />

     <PointToPointInterface
         ifName="eth0"
         areaID = "0.0.0.0"
         InterfaceOutputCost = "1"
      />

      <PointToPointInterface
         ifName="eth1"
         areaID = "0.0.0.0"
         InterfaceOutputCost = "1000"
      />

</Router>

 <Router name = "R4" RFC1583Compatible = "true">

     <PointToPointInterface
         ifName="eth0"
         areaID = "0.0.0.0"
         InterfaceOutputCost = "1000"
      />

      <PointToPointInterface
         ifName="eth1"
         areaID = "0.0.0.0"
         InterfaceOutputCost = "1000"
      />

</Router>

</OSPFASConfig>

ospfR.ini

[General]
network = inet.examples.ospfRouting.OspfRouting
**.configurator.config = xmldoc("Rconfig.xml")
**.configurator.addStaticRoutes = false
**.configurator.addDefaultRoutes = false
**.ospf.ospfConfig = xmldoc("RASConfig.xml")
**.numPingApps = 1
**.H1.pingApp[0].destAddr = "H2"
**.pingApp[*].sendInterval = 1000ms
**.arp.cacheTimeout = 1s

IP4RoutingTable.cc

#include <iostream>
#include <fstream>
#include <string>
#include <IPv4RoutingTable.h>
using namespace std;

class IP4RoutingTable : public cSimpleModule
{
  public:
    virtual void  initialize();

};

Define_Module(IP4RoutingTable);


void IP4RoutingTable::initialize()
{
  IPv4RoutingTable:: printRoutingTable () ;
}

введите здесь описание изображения


person melek_3    schedule 13.12.2016    source источник
comment
Не могли бы вы показать omnetpp.ini вашего моделирования?   -  person Jerzy D.    schedule 13.12.2016
comment
я добавил ini-файл @JerzyD.   -  person melek_3    schedule 13.12.2016


Ответы (1)


Ответ на вопрос 1.
RASConfig.xml не соответствует требованиям OSPF.xsd (схема XML):

  • ключевая последовательность 0.0.0.0 существует более одного раза в элементе Area (допускается только один экземпляр)
  • должно быть interfaceOutputCost, а не InterfaceOutputCost
  • interfaceOutputCost должно быть меньше 1000

Ответ на вопрос 2.
Метод printRoutingTable() должен вызываться для экземпляра объекта таблицы маршрутизации. Возможно, вы подготовили собственный простой модуль с именем IP4RoutingTable, но ни StandardHost, ни OSPFRouter не содержат этого модуля.
Чтобы распечатать таблицу маршрутизации, просто добавьте следующую строку в ваш omnetpp.ini:

**.configurator.dumpRoutes = true
person Jerzy D.    schedule 13.12.2016
comment
Когда я добавляю эту строку, перед запуском моделирования на консоли появляется таблица маршрутизации. Но таблица не появляется при запуске проекта. - person melek_3; 13.12.2016
comment
Это правда, таблица маршрутизации печатается только во время инициализации. Однако вы можете проверить текущую таблицу маршрутизации любого хоста/маршрутизатора, щелкнув внутри элемента, затем ospf модуль и routingTable. - person Jerzy D.; 14.12.2016
comment
Когда я останавливаю симуляцию, есть ли у меня возможность увидеть текущую таблицу маршрутизации, в которую консоль добавила удаленные сети? @ЕжиД. - person melek_3; 14.12.2016
comment
@melek_3: Да, модуль ospf внутри маршрутизатора содержит текущую таблицу маршрутизации. - person Jerzy D.; 14.12.2016