Rip

Package: inet.routing.rip

simple module Rip

Routing Information Protocol.

Implements distance vector routing as specified in RFC 2453 (RIPv2) and RFC 2080 (RIPng). The routing protocol uses the Bellman-Ford algorithm to compute the optimal routes. Each router periodically sends its routes to the neighboring routers. This update message contains the destination (address, netmask) and metric of each route. When a router receives an update message, it adds the cost of the incoming interface to the cost of the received route and if it is smaller than the metric of its current route then it updates the current route.

Limitations of the protocol:

  • only the hop-count metric is supported

  • the metric diameter of the network must be smaller than 16

  • the protocol depends on “counting to infinity” to recover

    from routing loops

The module has the following parameters:

  • mode: either “RIPv2” (RFC 2453) or “RIPng” (RFC 2080)

  • routingTableModule: path to the routing table module

  • ripConfig: an XML configuration file containing per-interface parameters

The configuration file specifies the per interface parameters. Each <interface> element configures one or more interfaces; the @hosts, @names, @towards, @among attributes select the configured interfaces (see Ipv4NetworkConfigurator). The other attributes set parameters of the selected interfaces:

  • @metric: metric assigned to the link, default value is 1.

    This value is added to the metric of a learned route, received on this interface. It must be an integer in the [1,15] interval.

  • @mode: mode of the interface; an enumerated value, default is

    SplitHorizonPoisonedReverse. Accepted values are:

    • NoRIP: no RIP messages are sent or received on this interface

    • NoSplitHorizon: no split horizon filtering; send all routes to

      neighbors.

    • SplitHorizon: do not send routes whose next hop is the neighbor

    • SplitHorizonPoisonedReverse: if the next hop is the neighbor, then

      set the metric of the route to infinity.

inet.routing.rip.RipRipsimple

Usage diagram

Inheritance diagram

Used in compound modules

Name

Type

Description

Router

compound module

A network router device with support for multiple routing protocols and network interfaces. Provides the foundation for simulating various types of routers in both wired and wireless networks.

Extends

Name

Type

Description

SimpleModule

simple module

Base module for all INET simple modules.

Parameters

Name

Type

Default value

Description

displayStringTextFormat

string

“”

Determines the text that is written on top of the submodule, supports displaying pars, watches, and module-specific information

interfaceTableModule

string

The path to the InterfaceTable module

routingTableModule

string

ripConfig

xml

xml(“<config><interface metric=’1’/></config>”)

mode

string

“RIPv2”

udpPort

int

(mode == “RIPng” ? 521 : 520)

startupTime

double

uniform(0s,updateInterval)

Delay before starting RIP

shutdownTime

double

1s

Delay before shutting down RIP

updateInterval

double

30s

30s timer or update timer

routeExpiryTime

double

180s

Invalid timer

routePurgeTime

double

120s

Garbage collection timer or flush timer

holdDownTime

double

0s

Hold-down timer (not defined in RFC). 0s means not active

triggeredUpdate

bool

true

Sending triggered updates on route changes

triggeredUpdateDelay

double

uniform(1s,5s)

stopOperationExtraTime

double

-1s

Extra time after lifecycle stop operation finished

stopOperationTimeout

double

2s

Timeout value for lifecycle stop operation

Properties

Name

Value

Description

class

Rip

display

i=block/network2

lifecycleSupport

Gates

Name

Direction

Size

Description

socketIn

input

socketOut

output

Signals

Name

Type

Unit

Description

badResponse

cPacket

numRoutes

unsigned long

rcvdResponse

cPacket

sentRequest

cPacket

sentUpdate

cPacket

Statistics

Name

Title

Source

Record

Unit

Interpolation Mode

Description

badResponse

bad response received

badResponse

count,”vector(constant1)”

none

numRoutes

number of routes

numRoutes

last,vector

none

rcvdResponse

response received

rcvdResponse

count,”vector(constant1)”

none

sentRequest

request sent

sentRequest

count,”vector(constant1)”

none

sentUpdate

update sent

sentUpdate

count,”vector(constant1)”

none

Source code

//
// Routing Information Protocol.
//
// Implements distance vector routing as
// specified in RFC 2453 (RIPv2) and RFC 2080 (RIPng).
// The routing protocol uses the Bellman-Ford algorithm to compute
// the optimal routes. Each router periodically sends its
// routes to the neighboring routers. This update message
// contains the destination (address, netmask) and metric
// of each route. When a router receives an update message,
// it adds the cost of the incoming interface
// to the cost of the received route and if it is smaller than the metric
// of its current route then it updates the current route.
//
// Limitations of the protocol:
//   - only the hop-count metric is supported
//   - the metric diameter of the network must be smaller than 16
//   - the protocol depends on "counting to infinity" to recover
//     from routing loops
//
// The module has the following parameters:
//   - mode: either "RIPv2" (RFC 2453) or "RIPng" (RFC 2080)
//   - `routingTableModule`: path to the routing table module
//   - `ripConfig`: an XML configuration file containing per-interface parameters
//
// The configuration file specifies the per interface parameters.
// Each <interface> element configures one or more interfaces;
// the @hosts, @names, @towards, @among attributes select the
// configured interfaces (see ~Ipv4NetworkConfigurator).
// The other attributes set parameters of the selected interfaces:
//
// - @metric: metric assigned to the link, default value is 1.
//            This value is added to the metric of a learned route,
//            received on this interface. It must be an integer in
//            the [1,15] interval.
// - @mode: mode of the interface; an enumerated value, default is
//          `SplitHorizonPoisonedReverse`. Accepted values are:
//     - `NoRIP`: no RIP messages are sent or received on this interface
//     - `NoSplitHorizon`: no split horizon filtering; send all routes to
//                         neighbors.
//     - `SplitHorizon`:   do not send routes whose next hop is the neighbor
//     - `SplitHorizonPoisonedReverse`: if the next hop is the neighbor, then
//                         set the metric of the route to infinity.
simple Rip extends SimpleModule like IApp
{
    parameters:
        @class(Rip);
        @display("i=block/network2");

        string interfaceTableModule;   // The path to the InterfaceTable module
        string routingTableModule;

        xml ripConfig = default(xml("<config><interface metric='1'/></config>"));
        string mode @enum("RIPv2", "RIPng") = default("RIPv2");
        int udpPort = (mode == "RIPng" ? 521 : 520);

        double startupTime @unit(s) = default(uniform(0s,updateInterval)); // Delay before starting RIP
        double shutdownTime @unit(s) = default(1s); // Delay before shutting down RIP

        // RIP timers
        double updateInterval @unit(s) = default(30s);   // 30s timer or update timer
        double routeExpiryTime @unit(s) = default(180s); // Invalid timer
        double routePurgeTime @unit(s) = default(120s);  // Garbage collection timer or flush timer
        double holdDownTime @unit(s) = default(0s);      // Hold-down timer (not defined in RFC). 0s means not active

        bool triggeredUpdate = default(true);  // Sending triggered updates on route changes
        volatile double triggeredUpdateDelay @unit(s) = default(uniform(1s,5s));

        @lifecycleSupport;
        double stopOperationExtraTime @unit(s) = default(-1s);    // Extra time after lifecycle stop operation finished
        double stopOperationTimeout @unit(s) = default(2s);    // Timeout value for lifecycle stop operation

        @signal[sentRequest](type=cPacket);
        @signal[sentUpdate](type=cPacket);
        @signal[rcvdResponse](type=cPacket);
        @signal[badResponse](type=cPacket);
        @signal[numRoutes](type=unsigned long);
        @statistic[sentRequest](title="request sent"; source=sentRequest; record=count,"vector(constant1)"; interpolationmode=none);
        @statistic[sentUpdate](title="update sent"; source=sentUpdate; record=count,"vector(constant1)"; interpolationmode=none);
        @statistic[rcvdResponse](title="response received"; source=rcvdResponse; record=count,"vector(constant1)"; interpolationmode=none);
        @statistic[badResponse](title="bad response received"; source=badResponse; record=count,"vector(constant1)"; interpolationmode=none);
        @statistic[numRoutes](title="number of routes"; source=numRoutes; record=last,vector; interpolationmode=none);
    gates:
        input socketIn @labels(UdpCommand/up);
        output socketOut @labels(UdpCommand/down);
}

File: src/inet/routing/rip/Rip.ned