routesnetwork-protocolsomnet++inetospf

Omnet++ OSPF Routing table metric


Question 1: I implemented ospf protocol in Omnet++. According to the topology, r1 can reach two different ways to r3 .I have set the upper path metric to 1 and lower path to 10. However, according to the OSPF protocol, it should not select the lower path, but it always is selecting the lower path then returning the upper path. As you can see from the routing table, there is a problem with the metric values.

Question 2: I need to see routing table at console. I used printRoutingTable() method to print it but it does not work.

Question 3: How can I see linkstate database table to know whole topology?

Here you can see the code

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

enter image description here


Solution

  • An answer to the question 1.
    RASConfig.xml does not meet the requirements from OSPF.xsd (XML Schema):


    An answer to the question 2.
    The method printRoutingTable() has to be called for an instance of the routing table object. You have probably prepared own simple module called IP4RoutingTable, but neither StandardHost nor OSPFRouter does not contain that module.
    To print routing table just add the following line to your omnetpp.ini:

    **.configurator.dumpRoutes = true