PimSm

Package: inet.routing.pim.modes

simple module PimSm

Implementation of PIM-SM protocol (RFC 4601).

PIM-SM is a multicast routing protocol which builds a shared multicast forwarding tree rooted at a Rendezvous Point (RP) per group, and a source specific forwarding tree from the sources to the RP. It is also capable of switching to a shortest path tree, so that traffic from sources to receivers does not have to pass through the RP.

The module must access the PimInterfaceTable and PimNeighborTable modules; their path is given as the pimInterfaceTableModule and pimNeighborTableModule parameters.

The ‘RP’ parameter specifies the address of the Rendezvous Point. Currently only one global RP is supported.

If there are multiple PIM routers on a multi-access LAN, only one of them will be responsible for forwarding datagrams to the LAN. This will be the router with the highest IP address except if all routers have designatedRouterPriority set, in which case the highest priority wins (or highest IP address on ties).

Other parameters set the time constants to the values specified in RFC 4601. They should not be changed except for testing.

Limitations:

  • Only one global RP is supported and it must be specified statically.

    PIM Bootstrap and RP discovery are not yet implemented.

  • Switchover to the shortest path tree is not supported.

  • Source specific excludes in the shared tree are not supported.

inet.routing.pim.modes.PimSmPimSmsimple

Usage diagram

Inheritance diagram

Used in compound modules

Name

Type

Description

Pim

compound module

Implements the Protocol Independent Multicast (PIM) routing protocol for IP multicast. This module integrates both PIM-DM (Dense Mode) and PIM-SM (Sparse Mode) implementations, using a splitter to direct packets to the appropriate mode based on interface configuration. PIM builds distribution trees for efficient multicast data delivery across IP 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

routingTableModule

string

pimInterfaceTableModule

string

pimNeighborTableModule

string

addressFamily

string

“ipv4”

address family this PIM-SM instance operates on

RP

string

“”

designatedRouterPriority

int

-1

triggeredHelloDelay

double

uniform(0s,5s)

helloPeriod

double

30s

holdTime

double

3.5 * helloPeriod

joinPrunePeriod

double

60s

Period between Join/Prune messages (called t_periodic in the RFC)

defaultOverrideInterval

double

2.5s

defaultPropagationDelay

double

0.5s

keepAlivePeriod

double

210s

rpKeepAlivePeriod

double

3 * registerSuppressionTime + registerProbeTime

registerSuppressionTime

double

60s

registerProbeTime

double

5s

assertTime

double

180s

assertOverrideInterval

double

3s

Properties

Name

Value

Description

class

PimSm

display

i=block/network2

Gates

Name

Direction

Size

Description

ipIn

input

ipOut

output

Signals

Name

Type

Unit

Description

rcvdAssertPk

cPacket

rcvdHelloPk

cPacket

rcvdJoinPrunePk

cPacket

rcvdRegisterPk

cPacket

rcvdRegisterStopPk

cPacket

sentAssertPk

cPacket

sentHelloPk

cPacket

sentJoinPrunePk

cPacket

sentRegisterPk

cPacket

sentRegisterStopPk

cPacket

Source code

//
// Implementation of PIM-SM protocol (RFC 4601).
//
// PIM-SM is a multicast routing protocol which
// builds a shared multicast forwarding tree rooted at a Rendezvous Point (RP)
// per group, and a source specific forwarding tree from the sources to the RP.
// It is also capable of switching to a shortest path tree, so that traffic from
// sources to receivers does not have to pass through the RP.
//
// The module must access the ~PimInterfaceTable and ~PimNeighborTable
// modules; their path is given as the `pimInterfaceTableModule` and
// `pimNeighborTableModule` parameters.
//
// The 'RP' parameter specifies the address of the Rendezvous Point.
// Currently only one global RP is supported.
//
// If there are multiple PIM routers on a multi-access LAN, only one
// of them will be responsible for forwarding datagrams to the LAN.
// This will be the router with the highest IP address except if
// all routers have `designatedRouterPriority` set, in which case
// the highest priority wins (or highest IP address on ties).
//
// Other parameters set the time constants to the values specified
// in RFC 4601. They should not be changed except for testing.
//
// Limitations:
// - Only one global RP is supported and it must be specified statically.
//   PIM Bootstrap and RP discovery are not yet implemented.
// - Switchover to the shortest path tree is not supported.
// - Source specific excludes in the shared tree are not supported.
//
simple PimSm extends SimpleModule
{
    parameters:
        @class(PimSm);
        @display("i=block/network2");
        string interfaceTableModule;
        string routingTableModule;
        string pimInterfaceTableModule;
        string pimNeighborTableModule;
        string addressFamily @enum("ipv4","ipv6") = default("ipv4"); // address family this PIM-SM instance operates on
        string RP = default("");
        int designatedRouterPriority = default(-1);

        volatile double triggeredHelloDelay @unit(s) = uniform(0s,5s);
        double helloPeriod @unit(s) = 30s;
        double holdTime @unit(s) = default(3.5 * helloPeriod);
        double joinPrunePeriod @unit(s) = default(60s); // Period between Join/Prune messages (called t_periodic in the RFC)
        double defaultOverrideInterval @unit(s) = 2.5s;
        double defaultPropagationDelay @unit(s) = 0.5s;
        double keepAlivePeriod @unit(s) = 210s;
        double rpKeepAlivePeriod @unit(s) = 3 * registerSuppressionTime + registerProbeTime;
        double registerSuppressionTime @unit(s) = 60s;
        double registerProbeTime @unit(s) = 5s;
        double assertTime @unit(s) = 180s;
        double assertOverrideInterval @unit(s) = 3s;

        @signal[sentHelloPk](type=cPacket);
        @signal[rcvdHelloPk](type=cPacket);
        @signal[sentRegisterPk](type=cPacket);
        @signal[rcvdRegisterPk](type=cPacket);
        @signal[sentRegisterStopPk](type=cPacket);
        @signal[rcvdRegisterStopPk](type=cPacket);
        @signal[sentJoinPrunePk](type=cPacket);
        @signal[rcvdJoinPrunePk](type=cPacket);
        @signal[sentAssertPk](type=cPacket);
        @signal[rcvdAssertPk](type=cPacket);

    gates:
        input ipIn;
        output ipOut;
}

File: src/inet/routing/pim/modes/PimSm.ned