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