Package: inet.routing.pim.modes
PimDm
simple moduleImplementation of PIM-DM protocol (RFC 3973).
PIM-DM is a multicast routing protocol which is designed for networks where the receivers are densely distributed. PIM-DM initially floods the multicast datagrams to all areas of the network. If some areas of the network does not have group members, then they will be pruned off the forwarding tree.
The prune state of a branch must be confirmed periodically, otherwise the forwarding restarts automatically. The router can also cancel the prune by sending a Graft message.
The module must access the PimInterfaceTable and PimNeighborTable modules, their path is given as the 'pimInterfaceTableModule' and 'pimNeighborTableModule' parameters.
Other parameters are timer values from the specification. They should not be modified except for testing purposes.
Used in compound modules
Name | Type | Description |
---|---|---|
Pim | compound module | (no description) |
Parameters
Name | Type | Default value | Description |
---|---|---|---|
interfaceTableModule | string | ||
routingTableModule | string | ||
pimInterfaceTableModule | string | ||
pimNeighborTableModule | string | ||
triggeredHelloDelay | double | uniform(0s,5s) | |
helloPeriod | double | 30s | |
holdTime | double | 3.5 * helloPeriod | |
pruneInterval | double | 180s | |
pruneLimitInterval | double | 210s | |
overrideInterval | double | 2.5s | |
propagationDelay | double | 0.5s | |
graftRetryInterval | double | 3s | |
sourceActiveInterval | double | 210s | |
stateRefreshInterval | double | 60s | |
assertTime | double | 180s |
Properties
Name | Value | Description |
---|---|---|
display | i=block/network2 |
Gates
Name | Direction | Size | Description |
---|---|---|---|
ipIn | input | ||
ipOut | output |
Signals
Name | Type | Unit |
---|---|---|
sentHelloPk | cPacket | |
sentJoinPrunePk | cPacket | |
rcvdStateRefreshPk | cPacket | |
rcvdHelloPk | cPacket | |
rcvdJoinPrunePk | cPacket | |
sentGraftPk | cPacket | |
rcvdGraftPk | cPacket | |
sentAssertPk | cPacket | |
sentGraftAckPk | cPacket | |
rcvdAssertPk | cPacket | |
rcvdGraftAckPk | cPacket | |
sentStateRefreshPk | cPacket |
Scheduled messages (observed)
msg | kind | ctrl | tags | msgname | context |
---|---|---|---|---|---|
omnetpp::cMessage | 1 | PIM HelloTimer | |||
omnetpp::cMessage | 3 | PimAssertTimer | filled | ||
omnetpp::cMessage | 4 | PimPruneTimer | filled | ||
omnetpp::cMessage | 5 | PimPrunePendingTimer | filled | ||
omnetpp::cMessage | 7 | PIMOverrideTimer | filled |
Direct method calls (observed)
call to | function | info |
---|---|---|
InterfaceTable | inet::InterfaceTable::interfaceChanged | interfaceChanged |
Igmpv2 | inet::Igmpv2::receiveSignal | ipv4MulticastGroupJoined |
Ipv4RoutingTable | inet::Ipv4RoutingTable::addMulticastRoute | addMulticastRoute(...) |
Ipv4RoutingTable | inet::Ipv4RoutingTable::findBestMatchingRoute | findBestMatchingRoute(%u.%u.%u.%u) |
PimNeighborTable | inet::PimNeighborTable::addNeighbor | addNeighbor |
PimNeighborTable | inet::PimNeighborTable::restartLivenessTimer | restartLivenessTimer |
Called methods (observed)
function | info | call from |
---|---|---|
inet::PimDm::receiveSignal | ipv4DataOnNonrpf | Ipv4 |
inet::PimDm::receiveSignal | ipv4DataOnRpf | Ipv4 |
inet::PimDm::receiveSignal | ipv4MulticastGroupRegistered | Igmpv2 |
inet::PimDm::receiveSignal | ipv4NewMulticast | Ipv4 |
inet::PimDm::receiveSignal | routeAdded | Ipv4RoutingTable |
Incoming messages (observed)
gate | msg | kind | ctrl | srcModule | tags |
---|---|---|---|---|---|
ipIn | Packet | 0 | PimSplitter | DispatchProtocolReq, DscpInd, EcnInd, HopLimitInd, InterfaceInd, L3AddressInd, MacAddressInd, NetworkProtocolInd, PacketProtocolTag, TosInd |
Outgoing messages (observed)
gate | msg | kind | ctrl | destModule | tags |
---|---|---|---|---|---|
ipOut | Packet | 0 | PimSplitter | DispatchProtocolInd, DispatchProtocolReq, HopLimitReq, InterfaceReq, L3AddressReq, PacketProtocolTag |
Packet operations (observed)
chunkType | packetAction |
---|---|
PimAssert | insertAtFront, peekAtFront |
PimGraft | insertAtFront, peekAtFront |
PimHello | insertAtFront, peekAtFront |
PimJoinPrune | insertAtFront, peekAtFront |
PimPacket | peekAtFront |
Shared Tagging operations (observed)
tagType | tagAction |
---|---|
DispatchProtocolInd | addTag, addTagIfAbsent |
DispatchProtocolReq | addTag, addTagIfAbsent |
HopLimitReq | addTag, addTagIfAbsent |
InterfaceInd | getTag |
InterfaceReq | addTag, addTagIfAbsent |
L3AddressInd | getTag |
L3AddressReq | addTag, addTagIfAbsent |
PacketProtocolTag | addTag, addTagIfAbsent |
Tagging operations (observed)
tagType | tagAction |
---|---|
inet::Ipv4InterfaceData | getTag, getTagForUpdate |
Source code
// // Implementation of PIM-DM protocol (RFC 3973). // // PIM-DM is a multicast routing protocol which is designed // for networks where the receivers are densely distributed. // PIM-DM initially floods the multicast datagrams to all areas // of the network. If some areas of the network does not have // group members, then they will be pruned off the forwarding tree. // // The prune state of a branch must be confirmed periodically, // otherwise the forwarding restarts automatically. The router // can also cancel the prune by sending a Graft message. // // The module must access the ~PimInterfaceTable and ~PimNeighborTable // modules, their path is given as the 'pimInterfaceTableModule' and // 'pimNeighborTableModule' parameters. // // Other parameters are timer values from the specification. // They should not be modified except for testing purposes. // simple PimDm { parameters: @display("i=block/network2"); string interfaceTableModule; string routingTableModule; string pimInterfaceTableModule; string pimNeighborTableModule; volatile double triggeredHelloDelay @unit(s) = uniform(0s,5s); double helloPeriod @unit(s) = 30s; double holdTime @unit(s) = default(3.5 * helloPeriod); double pruneInterval @unit(s) = 180s; double pruneLimitInterval @unit(s) = 210s; double overrideInterval @unit(s) = 2.5s; double propagationDelay @unit(s) = 0.5s; double graftRetryInterval @unit(s) = 3s; double sourceActiveInterval @unit(s) = 210s; double stateRefreshInterval @unit(s) = 60s; double assertTime @unit(s) = 180s; @signal[sentHelloPk](type=cPacket); @signal[rcvdHelloPk](type=cPacket); @signal[sentGraftPk](type=cPacket); @signal[rcvdGraftPk](type=cPacket); @signal[sentGraftAckPk](type=cPacket); @signal[rcvdGraftAckPk](type=cPacket); @signal[sentJoinPrunePk](type=cPacket); @signal[rcvdJoinPrunePk](type=cPacket); @signal[sentAssertPk](type=cPacket); @signal[rcvdAssertPk](type=cPacket); @signal[sentStateRefreshPk](type=cPacket); @signal[rcvdStateRefreshPk](type=cPacket); gates: input ipIn; output ipOut; }File: src/inet/routing/pim/modes/PimDm.ned