Rip.ned
NED File src/inet/routing/rip/Rip.ned
| Name | Type | Description |
|---|---|---|
| Rip | simple module |
Routing Information Protocol. |
Source code
// // Copyright (C) 2013 OpenSim Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later // package inet.routing.rip; import inet.common.SimpleModule; import inet.applications.contract.IApp; // // 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); }