|
INET Framework for OMNeT++/OMNEST
|
Implementation of PIM-SM protocol (RFC 4601).
More...
#include <PimSm.h>
|
| void | processJoinPrunePacket (Packet *pk) |
| |
| void | processRegisterPacket (Packet *pk) |
| | The method is used for processing PIM Register message sent from source DR. More...
|
| |
| void | processRegisterStopPacket (Packet *pk) |
| | The method is used for processing PIM Register-Stop message sent from RP. More...
|
| |
| void | processAssertPacket (Packet *pk) |
| |
| void | processJoinG (Ipv4Address group, Ipv4Address rp, Ipv4Address upstreamNeighborField, int holdTime, NetworkInterface *inInterface) |
| |
| void | processJoinSG (Ipv4Address origin, Ipv4Address group, Ipv4Address upstreamNeighborField, int holdTime, NetworkInterface *inInterface) |
| |
| void | processJoinSGrpt (Ipv4Address origin, Ipv4Address group, Ipv4Address upstreamNeighborField, int holdTime, NetworkInterface *inInterface) |
| |
| void | processPruneG (Ipv4Address multGroup, Ipv4Address upstreamNeighborField, NetworkInterface *inInterface) |
| |
| void | processPruneSG (Ipv4Address source, Ipv4Address group, Ipv4Address upstreamNeighborField, NetworkInterface *inInterface) |
| |
| void | processPruneSGrpt (Ipv4Address source, Ipv4Address group, Ipv4Address upstreamNeighborField, NetworkInterface *inInterface) |
| |
| void | processAssertSG (PimsmInterface *interface, const AssertMetric &receivedMetric) |
| |
| void | processAssertG (PimsmInterface *interface, const AssertMetric &receivedMetric) |
| |
| void | processKeepAliveTimer (cMessage *timer) |
| |
| void | processRegisterStopTimer (cMessage *timer) |
| |
| void | processExpiryTimer (cMessage *timer) |
| | The method is used to process PIM Expiry Timer. More...
|
| |
| void | processJoinTimer (cMessage *timer) |
| |
| void | processPrunePendingTimer (cMessage *timer) |
| | Prune Pending Timer is used for delaying of Prune message sending (for possible overriding Join from another PIM neighbor) More...
|
| |
| void | processAssertTimer (cMessage *timer) |
| |
| void | unroutableMulticastPacketArrived (Ipv4Address srcAddr, Ipv4Address destAddr) |
| |
| void | multicastPacketArrivedOnRpfInterface (Route *route) |
| | The method process notification about data which appears on RPF interface. More...
|
| |
| void | multicastPacketArrivedOnNonRpfInterface (Route *route, int interfaceId) |
| |
| void | multicastPacketForwarded (Packet *pk) |
| |
| void | multicastReceiverAdded (NetworkInterface *ie, Ipv4Address group) |
| |
| void | multicastReceiverRemoved (NetworkInterface *ie, Ipv4Address group) |
| |
| void | joinDesiredChanged (Route *route) |
| |
| void | designatedRouterAddressHasChanged (NetworkInterface *ie) |
| |
| void | iAmDRHasChanged (NetworkInterface *ie, bool iAmDR) |
| |
| void | sendPIMRegister (Packet *pk, Ipv4Address dest, int outInterfaceId) |
| |
| void | sendPIMRegisterStop (Ipv4Address source, Ipv4Address dest, Ipv4Address multGroup, Ipv4Address multSource) |
| |
| void | sendPIMRegisterNull (Ipv4Address multSource, Ipv4Address multDest) |
| |
| void | sendPIMJoin (Ipv4Address group, Ipv4Address source, Ipv4Address upstreamNeighbor, RouteType JPtype) |
| |
| void | sendPIMPrune (Ipv4Address group, Ipv4Address source, Ipv4Address upstreamNeighbor, RouteType JPtype) |
| |
| void | sendPIMAssert (Ipv4Address source, Ipv4Address group, AssertMetric metric, NetworkInterface *ie, bool rptBit) |
| |
| void | sendToIP (Packet *packet, Ipv4Address source, Ipv4Address dest, int outInterfaceId, short ttl) |
| |
| void | forwardMulticastData (Packet *pk, int outInterfaceId) |
| | The method is used as abstraction for encapsulation multicast data to Register packet. More...
|
| |
| double | joinPruneHoldTime () |
| |
| double | effectivePropagationDelay () |
| |
| double | effectiveOverrideInterval () |
| |
| double | joinPruneOverrideInterval () |
| |
| void | updateJoinDesired (Route *route) |
| |
| void | updateDesignatedRouterAddress (NetworkInterface *ie) |
| |
| void | updateCouldAssert (DownstreamInterface *interface) |
| |
| void | updateAssertTrackingDesired (PimsmInterface *interface) |
| |
| bool | IamRP (Ipv4Address rpAddr) |
| |
| bool | IamDR (NetworkInterface *ie) |
| |
| PimInterface * | getIncomingInterface (NetworkInterface *fromIE) |
| |
| bool | deleteMulticastRoute (Route *route) |
| |
| void | clearRoutes () |
| |
| void | cancelAndDeleteTimer (cMessage *&timer) |
| |
| void | restartTimer (cMessage *timer, double interval) |
| |
| void | restartExpiryTimer (Route *route, NetworkInterface *originIntf, int holdTime) |
| | The method is used to restart ET. More...
|
| |
| bool | removeRoute (Route *route) |
| |
| Route * | findRouteG (Ipv4Address group) |
| |
| Route * | findRouteSG (Ipv4Address source, Ipv4Address group) |
| |
| Route * | addNewRouteG (Ipv4Address group, int flags) |
| |
| Route * | addNewRouteSG (Ipv4Address source, Ipv4Address group, int flags) |
| |
| Ipv4MulticastRoute * | createIpv4Route (Route *route) |
| |
| Ipv4MulticastRoute * | findIpv4Route (Ipv4Address source, Ipv4Address group) |
| |
|
| enum | PimTimerKind {
HelloTimer = 1,
TriggeredHelloDelay,
AssertTimer,
PruneTimer,
PrunePendingTimer,
GraftRetryTimer,
UpstreamOverrideTimer,
PruneLimitTimer,
SourceActiveTimer,
StateRefreshTimer,
KeepAliveTimer,
RegisterStopTimer,
ExpiryTimer,
JoinTimer
} |
| |
| enum | State |
| |
| ModuleRefByPar< IIpv4RoutingTable > | rt |
| |
| ModuleRefByPar< IInterfaceTable > | ift |
| |
| ModuleRefByPar< PimInterfaceTable > | pimIft |
| |
| ModuleRefByPar< PimNeighborTable > | pimNbt |
| |
| opp_component_ptr< Pim > | pimModule |
| |
| bool | isUp = false |
| |
| bool | isEnabled = false |
| |
| const char * | hostname = nullptr |
| |
| double | helloPeriod = 0 |
| |
| double | holdTime = 0 |
| |
| int | designatedRouterPriority = 0 |
| |
| PimInterface::PimMode | mode = static_cast<PimInterface::PimMode>(0) |
| |
| uint32_t | generationID = 0 |
| |
| cMessage * | helloTimer = nullptr |
| |
| State | operationalState |
| |
| simtime_t | lastChange |
| |
| Operation | activeOperation |
| |
| cMessage * | activeOperationTimeout |
| |
| cMessage * | activeOperationExtraTimer |
| |
| static const Ipv4Address | ALL_PIM_ROUTERS_MCAST |
| |
| static simsignal_t | sentHelloPkSignal = registerSignal("sentHelloPk") |
| |
| static simsignal_t | rcvdHelloPkSignal = registerSignal("rcvdHelloPk") |
| |
Implementation of PIM-SM protocol (RFC 4601).
Protocol state is stored in two tables:
- gRoutes table contains (*,G) state
- sgRoutes table contains (S,G) state Note that (*,*,RP) and (S,G,rpt) state is currently missing.
The routes stored in the tables are not the same as the routes of the Ipv4RoutingTable. The RFC defines the terms "Tree Information Base" (TIB) and "Multicast Forwaring Information Base" (MFIB). According to this division, TIB is the state of this module, while MFIB is stored by Ipv4RoutingTable.
Incoming packets, notifications, and timer events may cause a change of the TIB, and of the MFIB (if the forwarding rules change).
◆ DownstreamInterfaceVector
◆ RoutingTable
◆ RouteType
◆ PimSm()
◆ ~PimSm()
◆ addNewRouteG()
1742 newRouteG->setFlags(flags);
1743 newRouteG->rpAddr =
rpAddr;
1747 Ipv4Route *routeToRP =
rt->findBestMatchingRoute(
rpAddr);
1749 NetworkInterface *ieTowardRP = routeToRP->getInterface();
1750 Ipv4Address rpfNeighbor = routeToRP->getGateway();
1751 if (!
pimNbt->findNeighbor(ieTowardRP->getInterfaceId(), rpfNeighbor) &&
1752 pimNbt->getNumNeighbors(ieTowardRP->getInterfaceId()) > 0)
1754 PimNeighbor *neighbor =
pimNbt->getNeighbor(ieTowardRP->getInterfaceId(), 0);
1756 rpfNeighbor = neighbor->getAddress();
1758 newRouteG->upstreamInterface =
new UpstreamInterface(newRouteG, ieTowardRP, rpfNeighbor);
1759 newRouteG->metric = AssertMetric(
true, routeToRP->getAdminDist(), routeToRP->getMetric());
1764 for (
int i = 0; i <
pimIft->getNumInterfaces(); i++) {
1765 PimInterface *pimInterface =
pimIft->getInterface(i);
1767 (!newRouteG->upstreamInterface || pimInterface->getInterfacePtr() != newRouteG->upstreamInterface->ie))
1770 newRouteG->addDownstreamInterface(downstream);
1780 if (elem.first.group == group) {
1781 Route *sgRoute = elem.second;
1782 sgRoute->gRoute = newRouteG;
Referenced by multicastReceiverAdded(), processJoinG(), processRegisterPacket(), and unroutableMulticastPacketArrived().
◆ addNewRouteSG()
1791 ASSERT(!source.isUnspecified());
1792 ASSERT(group.isMulticast() && !group.isLinkLocalMulticast());
1794 Route *newRouteSG =
new Route(
this,
SG, source, group);
1795 newRouteSG->setFlags(flags);
1796 newRouteSG->rpAddr =
rpAddr;
1799 Ipv4Route *routeToSource =
rt->findBestMatchingRoute(source);
1800 if (routeToSource) {
1801 NetworkInterface *ieTowardSource = routeToSource->getInterface();
1802 Ipv4Address rpfNeighbor = routeToSource->getGateway();
1804 if (rpfNeighbor.isUnspecified())
1807 if (!
pimNbt->findNeighbor(ieTowardSource->getInterfaceId(), rpfNeighbor) &&
1808 pimNbt->getNumNeighbors(ieTowardSource->getInterfaceId()) > 0)
1810 PimNeighbor *neighbor =
pimNbt->getNeighbor(ieTowardSource->getInterfaceId(), 0);
1812 rpfNeighbor = neighbor->getAddress();
1815 newRouteSG->upstreamInterface =
new UpstreamInterface(newRouteSG, ieTowardSource, rpfNeighbor);
1816 newRouteSG->metric = AssertMetric(
false, routeToSource->getAdminDist(), routeToSource->getMetric());
1820 for (
int i = 0; i <
pimIft->getNumInterfaces(); i++) {
1821 PimInterface *pimInterface =
pimIft->getInterface(i);
1822 if (pimInterface->getMode() ==
PimInterface::SparseMode && pimInterface->getInterfacePtr() != newRouteSG->upstreamInterface->ie) {
1824 newRouteSG->addDownstreamInterface(downstream);
1828 SourceAndGroup sg(source, group);
1836 Route *sgrptRoute =
nullptr;
1837 newRouteSG->sgrptRoute = sgrptRoute;
Referenced by processJoinSG(), processRegisterPacket(), and unroutableMulticastPacketArrived().
◆ cancelAndDeleteTimer()
| void inet::PimSm::cancelAndDeleteTimer |
( |
cMessage *& |
timer | ) |
|
|
private |
◆ clearRoutes()
| void inet::PimSm::clearRoutes |
( |
| ) |
|
|
private |
1716 bool changed =
true;
1719 for (
int i = 0; i <
rt->getNumMulticastRoutes(); i++) {
1720 Ipv4MulticastRoute *ipv4Route =
rt->getMulticastRoute(i);
1721 if (ipv4Route->getSource() ==
this) {
1722 rt->deleteMulticastRoute(ipv4Route);
Referenced by stopPIMRouting().
◆ createIpv4Route()
1849 Ipv4MulticastRoute *newRoute =
new Ipv4MulticastRoute();
1850 newRoute->setOrigin(route->source);
1852 newRoute->setMulticastGroup(route->group);
1854 newRoute->setSource(
this);
1855 if (route->upstreamInterface)
1856 newRoute->setInInterface(
new IMulticastRoute::InInterface(route->upstreamInterface->ie));
1857 unsigned int numOutInterfaces = route->downstreamInterfaces.size();
1858 for (
unsigned int i = 0; i < numOutInterfaces; ++i) {
1859 DownstreamInterface *downstream = route->downstreamInterfaces[i];
1860 newRoute->addOutInterface(
new PimSmOutInterface(downstream));
Referenced by addNewRouteG(), and addNewRouteSG().
◆ deleteMulticastRoute()
| bool inet::PimSm::deleteMulticastRoute |
( |
Route * |
route | ) |
|
|
private |
◆ designatedRouterAddressHasChanged()
◆ effectiveOverrideInterval()
| double inet::PimSm::effectiveOverrideInterval |
( |
| ) |
|
|
inlineprivate |
◆ effectivePropagationDelay()
| double inet::PimSm::effectivePropagationDelay |
( |
| ) |
|
|
inlineprivate |
◆ findIpv4Route()
1891 unsigned int numMulticastRoutes =
rt->getNumMulticastRoutes();
1892 for (
unsigned int i = 0; i < numMulticastRoutes; ++i) {
1893 Ipv4MulticastRoute *ipv4Route =
rt->getMulticastRoute(i);
1894 if (ipv4Route->getSource() ==
this && ipv4Route->getOrigin() == source && ipv4Route->getMulticastGroup() == group)
Referenced by deleteMulticastRoute().
◆ findRouteG()
◆ findRouteSG()
◆ forwardMulticastData()
| void inet::PimSm::forwardMulticastData |
( |
Packet * |
data, |
|
|
int |
outInterfaceId |
|
) |
| |
|
private |
The method is used as abstraction for encapsulation multicast data to Register packet.
The method create message MultData with multicast source address and multicast group address and send the message from RP to RPT.
1539 EV <<
"pimSM::forwardMulticastData" << endl;
1544 const auto& ipv4Header = data->popAtFront<Ipv4Header>();
1547 data->addTagIfAbsent<
PacketProtocolTag>()->setProtocol(ipv4Header->getProtocol());
1548 data->addTagIfAbsent<
InterfaceReq>()->setInterfaceId(outInterfaceId);
1549 auto addrTag = data->addTagIfAbsent<L3AddressReq>();
1550 addrTag->setSrcAddress(ipv4Header->getSrcAddress());
1551 addrTag->setNonLocalSrcAddress(
true);
1552 addrTag->setDestAddress(ipv4Header->getDestAddress());
1555 send(data,
"ipOut");
Referenced by processRegisterPacket().
◆ getIncomingInterface()
◆ handleCrashOperation()
◆ handleMessageWhenUp()
| void inet::PimSm::handleMessageWhenUp |
( |
cMessage * |
msg | ) |
|
|
overrideprotectedvirtual |
Implements inet::OperationalMixin< cSimpleModule >.
128 if (msg->isSelfMessage()) {
129 switch (msg->getKind()) {
159 throw cRuntimeError(
"PimSm: unknown self message: %s (%s)", msg->getName(), msg->getClassName());
163 Packet *pk = check_and_cast<Packet *>(msg);
164 const auto& pkt = pk->peekAtFront<PimPacket>();
166 throw cRuntimeError(
"PIM-SM: received unknown message: %s (%s).", msg->getName(), msg->getClassName());
168 EV_DETAIL <<
"PIM-SM is disabled, dropping packet.\n";
173 switch (pkt->getType()) {
195 EV_WARN <<
"Ignoring PIM-DM Graft packet.\n";
200 EV_WARN <<
"Ignoring PIM-DM GraftAck packet.\n";
205 EV_WARN <<
"Ignoring PIM-DM StateRefresh packet.\n";
218 throw cRuntimeError(
"PimSm: received unknown PIM packet: %s (%s)", pk->getName(), pk->getClassName());
◆ handleStartOperation()
Reimplemented from inet::PimBase.
72 throw cRuntimeError(
"PimSm: missing RP address parameter.");
77 throw cRuntimeError(
"PimDm: containing node not found.");
◆ handleStopOperation()
◆ IamDR()
1678 PimInterface *pimInterface =
pimIft->getInterfaceById(ie->getInterfaceId());
1679 ASSERT(pimInterface);
1680 Ipv4Address drAddress = pimInterface->getDRAddress();
1681 return drAddress.isUnspecified() || drAddress == ie->getProtocolData<Ipv4InterfaceData>()->getIPAddress();
◆ iAmDRHasChanged()
◆ IamRP()
◆ initialize()
| void inet::PimSm::initialize |
( |
int |
stage | ) |
|
|
overrideprotectedvirtual |
◆ joinDesiredChanged()
| void inet::PimSm::joinDesiredChanged |
( |
Route * |
route | ) |
|
|
private |
1266 if (route->type ==
G) {
1267 Route *routeG = route;
1269 if (routeG->isFlagSet(
Route::PRUNED) && routeG->joinDesired()) {
1274 if (routeG->upstreamInterface) {
1275 sendPIMJoin(routeG->group, routeG->rpAddr, routeG->upstreamInterface->rpfNeighbor(),
G);
1279 else if (!routeG->isFlagSet(
Route::PRUNED) && !routeG->joinDesired()) {
1285 if (routeG->upstreamInterface)
1286 sendPIMPrune(routeG->group, routeG->rpAddr, routeG->upstreamInterface->rpfNeighbor(),
G);
1289 else if (route->type ==
SG) {
1290 Route *routeSG = route;
1292 if (routeSG->isFlagSet(
Route::PRUNED) && routeSG->joinDesired()) {
1297 if (!routeSG->isSourceDirectlyConnected()) {
1298 sendPIMJoin(routeSG->group, routeSG->source, routeSG->upstreamInterface->rpfNeighbor(),
SG);
1302 else if (!routeSG->isFlagSet(
Route::PRUNED) && !route->joinDesired()) {
1314 if (!routeSG->isSourceDirectlyConnected())
1315 sendPIMPrune(routeSG->group, routeSG->source, routeSG->upstreamInterface->rpfNeighbor(),
SG);
Referenced by updateJoinDesired().
◆ joinPruneHoldTime()
| double inet::PimSm::joinPruneHoldTime |
( |
| ) |
|
|
inlineprivate |
◆ joinPruneOverrideInterval()
| double inet::PimSm::joinPruneOverrideInterval |
( |
| ) |
|
|
inlineprivate |
◆ multicastPacketArrivedOnNonRpfInterface()
| void inet::PimSm::multicastPacketArrivedOnNonRpfInterface |
( |
Route * |
route, |
|
|
int |
interfaceId |
|
) |
| |
|
private |
1202 if (route->type ==
G || route->type ==
SG) {
1208 DownstreamInterface *downstream = route->findDownstreamInterfaceByInterfaceId(interfaceId);
1217 downstream->winnerMetric = route->metric.setAddress(downstream->ie->getProtocolData<Ipv4InterfaceData>()->getIPAddress());
1218 sendPIMAssert(route->source, route->group, downstream->winnerMetric, downstream->ie, route->type ==
G);
Referenced by receiveSignal().
◆ multicastPacketArrivedOnRpfInterface()
| void inet::PimSm::multicastPacketArrivedOnRpfInterface |
( |
Route * |
route | ) |
|
|
private |
The method process notification about data which appears on RPF interface.
It means that source is still active. The result is resetting of Keep Alive Timer. Also if first data packet arrive to last hop router in RPT, switchover to SPT has to be considered.
1151 if (route->type ==
SG) {
1154 (!route->isFlagSet(
Route::PRUNED) && !route->isInheritedOlistNull()))
1156 EV_DETAIL <<
"Data arrived on RPF interface, restarting KAT(" << route->source <<
", " << route->group <<
") timer.\n";
1158 if (!route->keepAliveTimer)
Referenced by receiveSignal().
◆ multicastPacketForwarded()
| void inet::PimSm::multicastPacketForwarded |
( |
Packet * |
pk | ) |
|
|
private |
1233 const auto& ipv4Header = pk->peekAtFront<Ipv4Header>();
1234 Ipv4Address source = ipv4Header->getSrcAddress();
1235 Ipv4Address group = ipv4Header->getDestAddress();
1245 if (routeSG->keepAliveTimer) {
1246 EV <<
" (S,G) KAT timer refresh" << endl;
1250 NetworkInterface *interfaceTowardRP =
rt->getInterfaceForDestAddr(routeSG->rpAddr);
1251 ASSERT(interfaceTowardRP !=
nullptr);
1252 sendPIMRegister(pk, routeSG->rpAddr, interfaceTowardRP->getInterfaceId());
Referenced by receiveSignal().
◆ multicastReceiverAdded()
1132 EV_DETAIL <<
"Multicast receiver added for group " << group <<
" on interface '" << ie->getInterfaceName() <<
"'.\n";
1138 DownstreamInterface *downstream = routeG->getDownstreamInterfaceByInterfaceId(ie->getInterfaceId());
1139 downstream->setLocalReceiverInclude(
true);
Referenced by receiveSignal().
◆ multicastReceiverRemoved()
1120 EV_DETAIL <<
"No more receiver for group " << group <<
" on interface '" << ie->getInterfaceName() <<
"'.\n";
1124 DownstreamInterface *downstream = routeG->getDownstreamInterfaceByInterfaceId(ie->getInterfaceId());
1125 downstream->setLocalReceiverInclude(
false);
Referenced by receiveSignal().
◆ numInitStages()
| virtual int inet::PimSm::numInitStages |
( |
| ) |
const |
|
inlineoverrideprotectedvirtual |
◆ processAssertG()
784 Route *routeG = interface->route();
785 AssertMetric myMetric = interface->couldAssert() ?
786 routeG->metric.setAddress(interface->ie->getProtocolData<Ipv4InterfaceData>()->getIPAddress()) :
790 bool isPreferredAssert = receivedMetric < interface->winnerMetric;
794 bool isAcceptableAssert = receivedMetric < myMetric;
798 bool isInferiorAssert = myMetric < receivedMetric;
801 if (isInferiorAssert && receivedMetric.rptBit && interface->couldAssert()) {
810 interface->winnerMetric = myMetric;
812 else if (isAcceptableAssert && receivedMetric.rptBit && interface->assertTrackingDesired()) {
820 interface->winnerMetric = receivedMetric;
825 if (isInferiorAssert) {
832 else if (isPreferredAssert) {
837 interface->winnerMetric = receivedMetric;
842 if (isPreferredAssert && receivedMetric.rptBit) {
846 interface->winnerMetric = receivedMetric;
849 else if (isAcceptableAssert && receivedMetric.address == interface->winnerMetric.address && receivedMetric.rptBit) {
855 interface->winnerMetric = receivedMetric;
858 else if (isInferiorAssert && receivedMetric.address == interface->winnerMetric.address) {
866 interface->deleteAssertInfo();
Referenced by processAssertPacket().
◆ processAssertPacket()
| void inet::PimSm::processAssertPacket |
( |
Packet * |
pk | ) |
|
|
private |
631 const auto& pkt = pk->peekAtFront<PimAssert>();
632 int incomingInterfaceId = pk->getTag<InterfaceInd>()->getInterfaceId();
633 Ipv4Address source = pkt->getSourceAddress().unicastAddress.toIpv4();
634 Ipv4Address group = pkt->getGroupAddress().groupAddress.toIpv4();
635 AssertMetric receivedMetric = AssertMetric(pkt->getR(), pkt->getMetricPreference(), pkt->getMetric(), pk->getTag<
L3AddressInd>()->getSrcAddress().toIpv4());
637 EV_INFO <<
"Received Assert(" << (source.isUnspecified() ?
"*" : source.str()) <<
", " << group <<
")"
638 <<
" packet on interface '" <<
ift->getInterfaceById(incomingInterfaceId)->getInterfaceName() <<
"'.\n";
642 if (!source.isUnspecified() && !receivedMetric.rptBit) {
645 PimsmInterface *incomingInterface = routeSG->upstreamInterface->getInterfaceId() == incomingInterfaceId ?
646 static_cast<PimsmInterface *
>(routeSG->upstreamInterface) :
647 static_cast<PimsmInterface *
>(routeSG->getDownstreamInterfaceByInterfaceId(incomingInterfaceId));
648 ASSERT(incomingInterface);
664 PimsmInterface *incomingInterface = routeG->upstreamInterface->getInterfaceId() == incomingInterfaceId ?
665 static_cast<PimsmInterface *
>(routeG->upstreamInterface) :
666 static_cast<PimsmInterface *
>(routeG->getDownstreamInterfaceByInterfaceId(incomingInterfaceId));
667 ASSERT(incomingInterface);
Referenced by handleMessageWhenUp().
◆ processAssertSG()
676 Route *routeSG = interface->route();
677 AssertMetric myMetric = interface->couldAssert() ?
678 routeSG->metric.setAddress(interface->ie->getProtocolData<Ipv4InterfaceData>()->getIPAddress()) :
682 bool isPreferredAssert = receivedMetric < interface->winnerMetric;
686 bool isAcceptableAssert = receivedMetric < myMetric;
690 bool isInferiorAssert = myMetric < receivedMetric;
693 if (isInferiorAssert && !receivedMetric.rptBit && interface->couldAssert()) {
703 interface->winnerMetric = myMetric;
704 sendPIMAssert(routeSG->source, routeSG->group, myMetric, interface->ie,
false);
707 else if (receivedMetric.rptBit && interface->couldAssert()) {
714 interface->winnerMetric = myMetric;
715 sendPIMAssert(routeSG->source, routeSG->group, myMetric, interface->ie,
false);
718 else if (isAcceptableAssert && !receivedMetric.rptBit && interface->assertTrackingDesired()) {
727 interface->winnerMetric = receivedMetric;
734 if (isInferiorAssert) {
739 sendPIMAssert(routeSG->source, routeSG->group, myMetric, interface->ie,
false);
742 else if (isPreferredAssert) {
749 interface->winnerMetric = receivedMetric;
754 if (isPreferredAssert) {
758 interface->winnerMetric = receivedMetric;
761 else if (isAcceptableAssert && !receivedMetric.rptBit && receivedMetric.address == interface->winnerMetric.address) {
766 interface->winnerMetric = receivedMetric;
769 else if (isInferiorAssert && receivedMetric.address == interface->winnerMetric.address) {
777 interface->deleteAssertInfo();
Referenced by processAssertPacket().
◆ processAssertTimer()
| void inet::PimSm::processAssertTimer |
( |
cMessage * |
timer | ) |
|
|
private |
1024 PimsmInterface *interfaceData =
static_cast<PimsmInterface *
>(timer->getContextPointer());
1025 ASSERT(timer == interfaceData->assertTimer);
1028 Route *route = interfaceData->route();
1029 if (route->type ==
SG || route->type ==
G) {
1034 EV_DETAIL <<
"AssertTimer(" << (route->type ==
G ?
"*" : route->source.str()) <<
", "
1035 << route->group <<
", " << interfaceData->ie->getInterfaceName() <<
") has expired.\n";
1045 sendPIMAssert(route->source, route->group, route->metric, interfaceData->ie, route->type ==
G);
1052 EV_DEBUG <<
"Going into NO_ASSERT_INFO state.\n";
1053 interfaceData->deleteAssertInfo();
Referenced by handleMessageWhenUp().
◆ processExpiryTimer()
| void inet::PimSm::processExpiryTimer |
( |
cMessage * |
timer | ) |
|
|
private |
The method is used to process PIM Expiry Timer.
It is timer for (S,G) and (*,G). When Expiry timer expires,route is removed from multicast routing table.
913 EV <<
"pimSM::processExpiryTimer: " << endl;
915 PimsmInterface *
interface = static_cast<PimsmInterface *>(timer->getContextPointer());
916 Route *route = interface->route();
918 if (interface != route->upstreamInterface) {
922 DownstreamInterface *downstream = check_and_cast<DownstreamInterface *>(interface);
925 downstream->expiryTimer =
nullptr;
929 if (route->isInheritedOlistNull()) {
931 if (route->type ==
G && !
IamRP(route->rpAddr))
932 sendPIMPrune(route->group, route->rpAddr, route->upstreamInterface->rpfNeighbor(),
G);
933 else if (route->type ==
SG)
934 sendPIMPrune(route->group, route->source, route->upstreamInterface->rpfNeighbor(),
SG);
939 if (route->upstreamInterface->expiryTimer && interface == route->upstreamInterface) {
940 for (
unsigned i = 0; i < route->downstreamInterfaces.size();) {
941 if (route->downstreamInterfaces[i]->expiryTimer)
942 route->removeDownstreamInterface(i);
947 EV <<
"ET for (*,G) route on RP expires - go to stopped" << endl;
Referenced by handleMessageWhenUp().
◆ processJoinG()
340 EV_DETAIL <<
"Processing Join(*," << group <<
") received on interface '" << inInterface->getInterfaceName() <<
"'.\n";
349 if (upstreamNeighborField != inInterface->getProtocolData<Ipv4InterfaceData>()->getIPAddress())
352 bool newRoute =
false;
359 DownstreamInterface *downstream = routeG->findDownstreamInterfaceByInterfaceId(inInterface->getInterfaceId());
369 downstream->startExpiryTimer(
holdTime);
376 if (simTime() +
holdTime > downstream->expiryTimer->getArrivalTime())
386 if (simTime() +
holdTime > downstream->expiryTimer->getArrivalTime())
396 if (!newRoute && !routeG->upstreamInterface) {
Referenced by processJoinPrunePacket().
◆ processJoinPrunePacket()
| void inet::PimSm::processJoinPrunePacket |
( |
Packet * |
pk | ) |
|
|
private |
294 const auto& pkt = pk->peekAtFront<PimJoinPrune>();
295 EV_INFO <<
"Received JoinPrune packet.\n";
299 NetworkInterface *inInterface =
ift->getInterfaceById(pk->getTag<InterfaceInd>()->getInterfaceId());
302 Ipv4Address upstreamNeighbor = pkt->getUpstreamNeighborAddress().unicastAddress.toIpv4();
304 for (
unsigned int i = 0; i < pkt->getJoinPruneGroupsArraySize(); i++) {
305 JoinPruneGroup group = pkt->getJoinPruneGroups(i);
306 Ipv4Address groupAddr = group.getGroupAddress().groupAddress.toIpv4();
309 for (
unsigned int j = 0; j < group.getJoinedSourceAddressArraySize(); j++) {
310 const auto& source = group.getJoinedSourceAddress(j);
313 processJoinG(groupAddr, source.sourceAddress.toIpv4(), upstreamNeighbor,
holdTime, inInterface);
322 for (
unsigned int j = 0; j < group.getPrunedSourceAddressArraySize(); j++) {
323 const auto& source = group.getPrunedSourceAddress(j);
328 processPruneSGrpt(source.sourceAddress.toIpv4(), groupAddr, upstreamNeighbor, inInterface);
330 processPruneSG(source.sourceAddress.toIpv4(), groupAddr, upstreamNeighbor, inInterface);
Referenced by handleMessageWhenUp().
◆ processJoinSG()
403 EV_DETAIL <<
"Processing Join(" << source <<
", " << group <<
") received on interface '" << inInterface->getInterfaceName() <<
"'.'n";
410 if (upstreamNeighborField != inInterface->getProtocolData<Ipv4InterfaceData>()->getIPAddress())
419 DownstreamInterface *downstream = routeSG->findDownstreamInterfaceByInterfaceId(inInterface->getInterfaceId());
429 downstream->startExpiryTimer(
holdTime);
436 if (simTime() +
holdTime > downstream->expiryTimer->getArrivalTime())
446 if (simTime() +
holdTime > downstream->expiryTimer->getArrivalTime())
Referenced by processJoinPrunePacket().
◆ processJoinSGrpt()
◆ processJoinTimer()
| void inet::PimSm::processJoinTimer |
( |
cMessage * |
timer | ) |
|
|
private |
957 EV <<
"pimSM::processJoinTimer:" << endl;
959 Route *route =
static_cast<Route *
>(timer->getContextPointer());
960 ASSERT(timer == route->joinTimer);
961 Ipv4Address joinAddr = route->type ==
G ? route->rpAddr : route->source;
963 if (!route->isInheritedOlistNull()) {
964 sendPIMJoin(route->group, joinAddr, route->upstreamInterface->nextHop, route->type);
969 route->joinTimer =
nullptr;
Referenced by handleMessageWhenUp().
◆ processKeepAliveTimer()
| void inet::PimSm::processKeepAliveTimer |
( |
cMessage * |
timer | ) |
|
|
private |
877 EV <<
"pimSM::processKeepAliveTimer: route will be deleted" << endl;
878 Route *route =
static_cast<Route *
>(timer->getContextPointer());
879 ASSERT(route->type ==
SG);
880 ASSERT(timer == route->keepAliveTimer);
883 route->keepAliveTimer =
nullptr;
Referenced by handleMessageWhenUp().
◆ processPruneG()
462 EV_DETAIL <<
"Processing Prune(*," << group <<
") received on interface '" << inInterface->getInterfaceName() <<
"'.\n";
469 if (upstreamNeighborField != inInterface->getProtocolData<Ipv4InterfaceData>()->getIPAddress())
474 DownstreamInterface *downstream = routeG->findDownstreamInterfaceByInterfaceId(inInterface->getInterfaceId());
483 double pruneOverrideInterval =
pimNbt->getNumNeighbors(inInterface->getInterfaceId()) > 1 ?
485 downstream->startPrunePendingTimer(pruneOverrideInterval);
Referenced by processJoinPrunePacket().
◆ processPrunePendingTimer()
| void inet::PimSm::processPrunePendingTimer |
( |
cMessage * |
timer | ) |
|
|
private |
Prune Pending Timer is used for delaying of Prune message sending (for possible overriding Join from another PIM neighbor)
979 EV <<
"pimSM::processPrunePendingTimer:" << endl;
980 DownstreamInterface *downstream =
static_cast<DownstreamInterface *
>(timer->getContextPointer());
981 ASSERT(timer == downstream->prunePendingTimer);
983 Route *route = downstream->route();
985 if (route->type ==
G || route->type ==
SG) {
993 downstream->prunePendingTimer =
nullptr;
997 if (
pimNbt->getNumNeighbors(downstream->ie->getInterfaceId()) > 1) {
1004 Ipv4Address pruneAddr = route->type ==
G ? route->rpAddr : route->source;
1005 Ipv4Address upstreamNeighborField = downstream->ie->getProtocolData<Ipv4InterfaceData>()->getIPAddress();
1006 sendPIMPrune(route->group, pruneAddr, upstreamNeighborField, route->type);
1009 else if (route->type ==
SGrpt) {
Referenced by handleMessageWhenUp().
◆ processPruneSG()
496 EV_DETAIL <<
"Processing Prune(" << source <<
", " << group <<
") received on interface '" << inInterface->getInterfaceName() <<
"'.'n";
503 if (upstreamNeighborField != inInterface->getProtocolData<Ipv4InterfaceData>()->getIPAddress())
508 DownstreamInterface *downstream = routeSG->findDownstreamInterfaceByInterfaceId(inInterface->getInterfaceId());
517 double pruneOverrideInterval =
pimNbt->getNumNeighbors(inInterface->getInterfaceId()) > 1 ?
519 downstream->startPrunePendingTimer(pruneOverrideInterval);
Referenced by processJoinPrunePacket().
◆ processPruneSGrpt()
◆ processRegisterPacket()
| void inet::PimSm::processRegisterPacket |
( |
Packet * |
pk | ) |
|
|
private |
The method is used for processing PIM Register message sent from source DR.
If PIM Register isn't Null and route doesn't exist, it is created and PIM Register-Stop is sent. If PIM Register is Null, Register-Stop is sent.
540 const auto& pkt = pk->popAtFront<PimRegister>();
541 EV_INFO <<
"Received Register packet.\n";
545 Ipv4Address srcAddr = pk->getTag<
L3AddressInd>()->getSrcAddress().toIpv4();
546 Ipv4Address destAddr = pk->getTag<
L3AddressInd>()->getDestAddress().toIpv4();
547 const auto& encapData = pk->peekAtFront<Ipv4Header>();
548 Ipv4Address source = encapData->getSrcAddress();
549 Ipv4Address group = encapData->getDestAddress();
562 else if (routeSG->keepAliveTimer) {
563 EV <<
" (S,G) KAT timer refresh" << endl;
567 if (!routeG->isInheritedOlistNull()) {
573 for (
auto& elem : routeG->downstreamInterfaces) {
574 DownstreamInterface *downstream = elem;
575 if (downstream->isInInheritedOlist())
580 sendPIMJoin(group, source, routeSG->upstreamInterface->rpfNeighbor(),
SG);
Referenced by handleMessageWhenUp().
◆ processRegisterStopPacket()
| void inet::PimSm::processRegisterStopPacket |
( |
Packet * |
pk | ) |
|
|
private |
The method is used for processing PIM Register-Stop message sent from RP.
If the message is received Register Tunnel between RP and source DR is set from Join status revert to Prune status. Also Register Stop Timer is created for periodic sending PIM Register Null messages.
605 const auto& pkt = pk->peekAtFront<PimRegisterStop>();
606 EV_INFO <<
"Received RegisterStop packet.\n";
611 Route *routeSG =
findRouteSG(pkt->getSourceAddress().unicastAddress.toIpv4(), pkt->getGroupAddress().groupAddress.toIpv4());
Referenced by handleMessageWhenUp().
◆ processRegisterStopTimer()
| void inet::PimSm::processRegisterStopTimer |
( |
cMessage * |
timer | ) |
|
|
private |
889 EV <<
"pimSM::processRegisterStopTimer: " << endl;
890 Route *routeSG =
static_cast<Route *
>(timer->getContextPointer());
891 ASSERT(timer == routeSG->registerStopTimer);
892 ASSERT(routeSG->type ==
SG);
895 routeSG->registerStopTimer =
nullptr;
Referenced by handleMessageWhenUp().
◆ receiveSignal()
| void inet::PimSm::receiveSignal |
( |
cComponent * |
source, |
|
|
simsignal_t |
signalID, |
|
|
cObject * |
obj, |
|
|
cObject * |
details |
|
) |
| |
|
overrideprotectedvirtual |
225 Enter_Method(
"%s", cComponent::getSignalName(signalID));
230 EV <<
"pimSM::receiveChangeNotification - NEW IGMP ADDED" << endl;
231 const Ipv4MulticastGroupInfo *info = check_and_cast<const Ipv4MulticastGroupInfo *>(obj);
232 PimInterface *pimInterface =
pimIft->getInterfaceById(info->ie->getInterfaceId());
237 EV <<
"pimSM::receiveChangeNotification - IGMP REMOVED" << endl;
238 const Ipv4MulticastGroupInfo *info = check_and_cast<const Ipv4MulticastGroupInfo *>(obj);
239 PimInterface *pimInterface =
pimIft->getInterfaceById(info->ie->getInterfaceId());
244 EV <<
"PimSM::receiveChangeNotification - NEW MULTICAST" << endl;
245 const Ipv4Header *ipv4Header = check_and_cast<const Ipv4Header *>(obj);
246 Ipv4Address srcAddr = ipv4Header->getSrcAddress();
247 Ipv4Address destAddr = ipv4Header->getDestAddress();
251 EV <<
"pimSM::receiveChangeNotification - DATA ON RPF" << endl;
252 const Ipv4Header *ipv4Header = check_and_cast<const Ipv4Header *>(obj);
253 PimInterface *incomingInterface =
getIncomingInterface(check_and_cast<NetworkInterface *>(details));
255 Route *route =
findRouteG(ipv4Header->getDestAddress());
258 route =
findRouteSG(ipv4Header->getSrcAddress(), ipv4Header->getDestAddress());
264 const Ipv4Header *ipv4Header = check_and_cast<const Ipv4Header *>(obj);
265 PimInterface *incomingInterface =
getIncomingInterface(check_and_cast<NetworkInterface *>(details));
267 Ipv4Address srcAddr = ipv4Header->getSrcAddress();
268 Ipv4Address destAddr = ipv4Header->getDestAddress();
270 if ((route =
findRouteSG(srcAddr, destAddr)) !=
nullptr)
272 else if ((route =
findRouteG(destAddr)) !=
nullptr)
277 EV <<
"pimSM::receiveChangeNotification - REGISTER DATA" << endl;
278 Packet *pk = check_and_cast<Packet *>(obj);
279 const auto& ipv4Header = pk->peekAtFront<Ipv4Header>();
280 PimInterface *incomingInterface =
getIncomingInterface(check_and_cast<NetworkInterface *>(details));
281 Route *route =
findRouteSG(ipv4Header->getSrcAddress(), ipv4Header->getDestAddress());
287 PimNeighbor *neighbor = check_and_cast<PimNeighbor *>(obj);
◆ removeRoute()
| bool inet::PimSm::removeRoute |
( |
Route * |
route | ) |
|
|
private |
1867 SourceAndGroup sg(route->source, route->group);
1868 if (route->type ==
G)
Referenced by deleteMulticastRoute().
◆ restartExpiryTimer()
The method is used to restart ET.
ET is used for outgoing interfaces and whole route in router. After ET expires, outgoing interface is removed or if there aren't any outgoing interface, route is removed after ET expires.
1069 EV <<
"pimSM::restartExpiryTimer: next ET @ " << simTime() +
holdTime <<
" for type: ";
1073 if (route->upstreamInterface && route->upstreamInterface->expiryTimer)
1077 for (
unsigned i = 0; i < route->downstreamInterfaces.size(); i++) {
1078 DownstreamInterface *downstream = route->downstreamInterfaces[i];
1079 if (downstream->expiryTimer && (downstream->getInterfaceId() == originIntf->getInterfaceId())) {
1080 EV << route->group <<
" , " << route->source <<
", int: " << downstream->ie->getInterfaceName() << endl;
◆ restartTimer()
| void inet::PimSm::restartTimer |
( |
cMessage * |
timer, |
|
|
double |
interval |
|
) |
| |
|
private |
1908 rescheduleAfter(interval, timer);
Referenced by multicastPacketArrivedOnRpfInterface(), multicastPacketForwarded(), processAssertG(), processAssertSG(), processAssertTimer(), processJoinG(), processJoinSG(), processJoinTimer(), processRegisterPacket(), and restartExpiryTimer().
◆ sendPIMAssert()
1496 EV_INFO <<
"Sending Assert(S= " << source <<
", G= " << group <<
") message on interface '" << ie->getInterfaceName() <<
"'\n";
1498 Packet *pk =
new Packet(
"PimAssert");
1499 const auto& pkt = makeShared<PimAssert>();
1500 pkt->getGroupAddressForUpdate().groupAddress = group;
1502 pkt->getSourceAddressForUpdate().unicastAddress = source;
1504 pkt->setMetricPreference(metric.preference);
1505 pkt->setMetric(metric.metric);
1511 pkt->setCrcMode(
pimModule->getCrcMode());
1513 pk->insertAtFront(pkt);
Referenced by multicastPacketArrivedOnNonRpfInterface(), processAssertG(), processAssertSG(), and processAssertTimer().
◆ sendPIMJoin()
1336 EV_INFO <<
"Sending Join(S=" << (routeType ==
G ?
"*" : source.str()) <<
", G=" << group <<
") to neighbor " << upstreamNeighbor <<
".\n";
1338 Packet *pk =
new Packet(
"PIMJoin");
1339 const auto& msg = makeShared<PimJoinPrune>();
1341 msg->getUpstreamNeighborAddressForUpdate().unicastAddress = upstreamNeighbor;
1344 msg->setJoinPruneGroupsArraySize(1);
1345 JoinPruneGroup& multGroup = msg->getJoinPruneGroupsForUpdate(0);
1346 auto& groupAddr = multGroup.getGroupAddressForUpdate();
1347 groupAddr.groupAddress = group;
1349 multGroup.setJoinedSourceAddressArraySize(1);
1350 auto& encodedAddr = multGroup.getJoinedSourceAddressForUpdate(0);
1351 encodedAddr.sourceAddress = source;
1352 encodedAddr.S =
true;
1353 encodedAddr.W = (routeType ==
G);
1354 encodedAddr.R = (routeType ==
G);
1362 msg->setCrcMode(
pimModule->getCrcMode());
1365 pk->insertAtFront(msg);
1369 NetworkInterface *interfaceToRP =
rt->getInterfaceForDestAddr(source);
Referenced by joinDesiredChanged(), processJoinTimer(), and processRegisterPacket().
◆ sendPIMPrune()
1375 EV_INFO <<
"Sending Prune(S=" << (routeType ==
G ?
"*" : source.str()) <<
", G=" << group <<
") to neighbor " << upstreamNeighbor <<
".\n";
1377 Packet *pk =
new Packet(
"PIMPrune");
1378 const auto& msg = makeShared<PimJoinPrune>();
1380 msg->getUpstreamNeighborAddressForUpdate().unicastAddress = upstreamNeighbor;
1383 msg->setJoinPruneGroupsArraySize(1);
1384 JoinPruneGroup& multGroup = msg->getJoinPruneGroupsForUpdate(0);
1385 multGroup.getGroupAddressForUpdate().groupAddress = group;
1386 multGroup.setPrunedSourceAddressArraySize(1);
1387 auto& encodedAddr = multGroup.getPrunedSourceAddressForUpdate(0);
1388 encodedAddr.sourceAddress = source;
1389 encodedAddr.S =
true;
1390 encodedAddr.W = (routeType ==
G);
1391 encodedAddr.R = (routeType ==
G);
1399 msg->setCrcMode(
pimModule->getCrcMode());
1402 pk->insertAtFront(msg);
1406 NetworkInterface *interfaceToRP =
rt->getInterfaceForDestAddr(source);
Referenced by joinDesiredChanged(), processExpiryTimer(), and processPrunePendingTimer().
◆ sendPIMRegister()
| void inet::PimSm::sendPIMRegister |
( |
Packet * |
pk, |
|
|
Ipv4Address |
dest, |
|
|
int |
outInterfaceId |
|
) |
| |
|
private |
1447 ASSERT(ipv4Packet->peekAtFront<Ipv4Header>() !=
nullptr);
1449 EV <<
"pimSM::sendPIMRegister - encapsulating data packet into Register packet and sending to RP" << endl;
1451 Packet *pk =
new Packet(
"PimRegister");
1452 const auto& msg = makeShared<PimRegister>();
1458 msg->setCrcMode(
pimModule->getCrcMode());
1461 pk->insertAtBack(ipv4Packet->peekDataAt(
b(0), ipv4Packet->getDataLength()));
1462 pk->insertAtFront(msg);
Referenced by multicastPacketForwarded().
◆ sendPIMRegisterNull()
1412 EV <<
"pimSM::sendPIMRegisterNull" << endl;
1417 Packet *pk =
new Packet(
"PimRegister(Null)");
1418 const auto& msg = makeShared<PimRegister>();
1423 msg->setCrcMode(
pimModule->getCrcMode());
1425 pk->insertAtFront(msg);
1428 const auto& ipv4Header = makeShared<Ipv4Header>();
1429 ipv4Header->setDestAddress(multGroup);
1430 ipv4Header->setSrcAddress(multOrigin);
1434 ipv4Header->setCrcMode(
pimModule->getCrcMode());
1436 pk->insertAtBack(ipv4Header);
1440 NetworkInterface *interfaceToRP =
rt->getInterfaceForDestAddr(
rpAddr);
Referenced by processRegisterStopTimer().
◆ sendPIMRegisterStop()
1471 EV <<
"pimSM::sendPIMRegisterStop" << endl;
1474 Packet *pk =
new Packet(
"PimRegisterStop");
1475 const auto& msg = makeShared<PimRegisterStop>();
1479 msg->getSourceAddressForUpdate().unicastAddress = multSource;
1480 msg->getGroupAddressForUpdate().groupAddress = multGroup;
1483 msg->setCrcMode(
pimModule->getCrcMode());
1485 pk->insertAtFront(msg);
1490 NetworkInterface *interfaceToDR =
rt->getInterfaceForDestAddr(dest);
Referenced by processRegisterPacket().
◆ sendToIP()
◆ stopPIMRouting()
| void inet::PimSm::stopPIMRouting |
( |
| ) |
|
|
protectedvirtual |
◆ unroutableMulticastPacketArrived()
1094 Ipv4Route *routeTowardSource =
rt->findBestMatchingRoute(source);
1095 if (!routeTowardSource)
1098 PimInterface *rpfInterface =
pimIft->getInterfaceById(routeTowardSource->getInterface()->getInterfaceId());
1102 NetworkInterface *interfaceTowardRP =
rt->getInterfaceForDestAddr(
rpAddr);
1105 if ((interfaceTowardRP != routeTowardSource->getInterface()) && routeTowardSource->getGateway().isUnspecified()) {
1106 EV_DETAIL <<
"New multicast source observed: source=" << source <<
", group=" << group <<
".\n";
Referenced by receiveSignal().
◆ updateAssertTrackingDesired()
| void inet::PimSm::updateAssertTrackingDesired |
( |
PimsmInterface * |
interface | ) |
|
|
private |
◆ updateCouldAssert()
◆ updateDesignatedRouterAddress()
1594 int interfaceId = ie->getInterfaceId();
1595 int numNeighbors =
pimNbt->getNumNeighbors(interfaceId);
1597 bool eachNeighborHasPriority =
true;
1598 for (
int i = 0; i < numNeighbors && eachNeighborHasPriority; i++)
1599 if (
pimNbt->getNeighbor(interfaceId, i))
1600 eachNeighborHasPriority =
false;
1602 Ipv4Address drAddress = ie->getProtocolData<Ipv4InterfaceData>()->getIPAddress();
1604 for (
int i = 0; i < numNeighbors; i++) {
1605 PimNeighbor *neighbor =
pimNbt->getNeighbor(interfaceId, i);
1606 bool isBetter = eachNeighborHasPriority ?
1607 (neighbor->getDRPriority() > drPriority ||
1608 (neighbor->getDRPriority() == drPriority &&
1609 neighbor->getAddress() > drAddress)) :
1610 (neighbor->getAddress() > drAddress);
1612 drPriority = neighbor->getDRPriority();
1613 drAddress = neighbor->getAddress();
1617 PimInterface *pimInterface =
pimIft->getInterfaceById(interfaceId);
1618 ASSERT(pimInterface);
1619 Ipv4Address oldDRAddress = pimInterface->getDRAddress();
1620 if (drAddress != oldDRAddress) {
1621 pimInterface->setDRAddress(drAddress);
1624 Ipv4Address myAddress = ie->getProtocolData<Ipv4InterfaceData>()->getIPAddress();
1625 bool iWasDR = oldDRAddress.isUnspecified() || oldDRAddress == myAddress;
1626 bool iAmDR = drAddress == myAddress;
1627 if (iWasDR != iAmDR)
Referenced by receiveSignal().
◆ updateJoinDesired()
| void inet::PimSm::updateJoinDesired |
( |
Route * |
route | ) |
|
|
private |
◆ operator<<
| std::ostream& operator<< |
( |
std::ostream & |
out, |
|
|
const PimSm::Route & |
sourceGroup |
|
) |
| |
|
friend |
2158 out <<
"(" << (route.source.isUnspecified() ?
"*" : route.source.str()) <<
", "
2159 << (route.group.isUnspecified() ?
"*" : route.group.str()) <<
"), ";
2160 out <<
"RP is " << route.rpAddr <<
", ";
2162 out <<
"Incoming interface: ";
2163 if (route.upstreamInterface) {
2164 out << route.upstreamInterface->ie->getInterfaceName() <<
", ";
2165 out <<
"RPF neighbor: " << route.upstreamInterface->rpfNeighbor() <<
", ";
2170 out <<
"Downstream interfaces: ";
2171 for (
unsigned int i = 0; i < route.downstreamInterfaces.size(); ++i) {
2174 out << route.downstreamInterfaces[i]->ie->getInterfaceName() <<
" ";
2175 switch (route.downstreamInterfaces[i]->joinPruneState) {
◆ assertOverrideInterval
| double inet::PimSm::assertOverrideInterval = 0 |
|
private |
◆ assertTime
| double inet::PimSm::assertTime = 0 |
|
private |
◆ defaultOverrideInterval
| double inet::PimSm::defaultOverrideInterval = 0 |
|
private |
◆ defaultPropagationDelay
| double inet::PimSm::defaultPropagationDelay = 0 |
|
private |
◆ gRoutes
◆ joinPrunePeriod
| double inet::PimSm::joinPrunePeriod = 0 |
|
private |
◆ keepAlivePeriod
| double inet::PimSm::keepAlivePeriod = 0 |
|
private |
◆ rcvdAssertPkSignal
| simsignal_t inet::PimSm::rcvdAssertPkSignal = registerSignal("rcvdAssertPk") |
|
staticprivate |
◆ rcvdJoinPrunePkSignal
| simsignal_t inet::PimSm::rcvdJoinPrunePkSignal = registerSignal("rcvdJoinPrunePk") |
|
staticprivate |
◆ rcvdRegisterPkSignal
| simsignal_t inet::PimSm::rcvdRegisterPkSignal = registerSignal("rcvdRegisterPk") |
|
staticprivate |
◆ rcvdRegisterStopPkSignal
| simsignal_t inet::PimSm::rcvdRegisterStopPkSignal = registerSignal("rcvdRegisterStopPk") |
|
staticprivate |
◆ registerProbeTime
| double inet::PimSm::registerProbeTime = 0 |
|
private |
◆ registerSuppressionTime
| double inet::PimSm::registerSuppressionTime = 0 |
|
private |
◆ rpAddr
◆ rpKeepAlivePeriod
| double inet::PimSm::rpKeepAlivePeriod = 0 |
|
private |
◆ sentAssertPkSignal
| simsignal_t inet::PimSm::sentAssertPkSignal = registerSignal("sentAssertPk") |
|
staticprivate |
◆ sentJoinPrunePkSignal
| simsignal_t inet::PimSm::sentJoinPrunePkSignal = registerSignal("sentJoinPrunePk") |
|
staticprivate |
◆ sentRegisterPkSignal
| simsignal_t inet::PimSm::sentRegisterPkSignal = registerSignal("sentRegisterPk") |
|
staticprivate |
◆ sentRegisterStopPkSignal
| simsignal_t inet::PimSm::sentRegisterStopPkSignal = registerSignal("sentRegisterStopPk") |
|
staticprivate |
◆ sgRoutes
The documentation for this class was generated from the following files:
cModule * findContainingNode(const cModule *from)
Find the node containing the given module.
Definition: ModuleAccess.cc:31
@ Register
Definition: PimPacket_m.h:94
simsignal_t ipv4DataOnRpfSignal
Definition: Simsignals.cc:58
@ NO_ASSERT_INFO
Definition: PimBase.h:74
void cancelAndDeleteTimer(cMessage *&timer)
Definition: PimSm.cc:1900
@ Hello
Definition: PimPacket_m.h:93
void processAssertPacket(Packet *pk)
Definition: PimSm.cc:629
Ipv4Address rpAddr
Definition: PimSm.h:190
@ JoinTimer
Definition: PimBase.h:140
double assertTime
Definition: PimSm.h:198
AssertState
Definition: PimBase.h:74
RoutingTable sgRoutes
Definition: PimSm.h:213
void processRegisterStopPacket(Packet *pk)
The method is used for processing PIM Register-Stop message sent from RP.
Definition: PimSm.cc:603
@ RS_JOIN
Definition: PimSm.h:155
@ PRUNE_PENDING
Definition: PimSm.h:95
const B PIM_HEADER_LENGTH
Definition: PimPacket_m.h:68
void sendPIMRegisterNull(Ipv4Address multSource, Ipv4Address multDest)
Definition: PimSm.cc:1410
void restartTimer(cMessage *timer, double interval)
Definition: PimSm.cc:1906
ModuleRefByPar< IInterfaceTable > ift
Definition: PimBase.h:147
virtual void handleCrashOperation(LifecycleOperation *operation) override
Definition: PimBase.cc:88
simsignal_t pimNeighborDeletedSignal
Definition: Simsignals.cc:61
@ REGISTER
Definition: PimSm.h:132
@ KeepAliveTimer
Definition: PimBase.h:137
PimInterface * getIncomingInterface(NetworkInterface *fromIE)
Definition: PimSm.cc:1684
static const Protocol ipv4
Definition: Protocol.h:93
double joinPruneOverrideInterval()
Definition: PimSm.h:280
double registerSuppressionTime
Definition: PimSm.h:196
void sendToIP(Packet *packet, Ipv4Address source, Ipv4Address dest, int outInterfaceId, short ttl)
Definition: PimSm.cc:1520
@ SOURCE_DIRECTLY_CONNECTED
Definition: PimSm.h:135
const B ENCODED_GROUP_ADDRESS_LENGTH
Definition: PimPacket_m.h:70
simsignal_t pimNeighborChangedSignal
Definition: Simsignals.cc:62
void updateDesignatedRouterAddress(NetworkInterface *ie)
Definition: PimSm.cc:1592
@ I_WON_ASSERT
Definition: PimBase.h:74
#define MAX_TTL
Maximum TTL.
Definition: PimSm.h:20
void processRegisterStopTimer(cMessage *timer)
Definition: PimSm.cc:887
void clearRoutes()
Definition: PimSm.cc:1713
void sendPIMAssert(Ipv4Address source, Ipv4Address group, AssertMetric metric, NetworkInterface *ie, bool rptBit)
Definition: PimSm.cc:1494
Route * findRouteG(Ipv4Address group)
Definition: PimSm.cc:1874
bool isEnabled
Definition: PimBase.h:153
removed InterfaceReq
Definition: IUdp-gates.txt:11
static simsignal_t rcvdRegisterStopPkSignal
Definition: PimSm.h:205
removed DscpReq Ipv4ControlInfo Ipv6ControlInfo up L3AddressInd DispatchProtocolReq L4PortInd Ipv4ControlInfo Ipv6ControlInfo down DispatchProtocolReq
Definition: IUdp-gates.txt:25
void printSignalBanner(simsignal_t signalID, const cObject *obj, const cObject *details)
Utility function.
Definition: Simsignals.cc:126
static simsignal_t sentAssertPkSignal
Definition: PimSm.h:208
removed DscpReq Ipv4ControlInfo Ipv6ControlInfo up L3AddressInd L3AddressInd
Definition: IUdp-gates.txt:20
double rpKeepAlivePeriod
Definition: PimSm.h:195
void processPruneG(Ipv4Address multGroup, Ipv4Address upstreamNeighborField, NetworkInterface *inInterface)
Definition: PimSm.cc:460
opp_component_ptr< Pim > pimModule
Definition: PimBase.h:150
void processAssertG(PimsmInterface *interface, const AssertMetric &receivedMetric)
Definition: PimSm.cc:782
void joinDesiredChanged(Route *route)
Definition: PimSm.cc:1264
void designatedRouterAddressHasChanged(NetworkInterface *ie)
Definition: PimSm.cc:1320
Route * addNewRouteG(Ipv4Address group, int flags)
Definition: PimSm.cc:1739
Route * addNewRouteSG(Ipv4Address source, Ipv4Address group, int flags)
Definition: PimSm.cc:1789
void multicastReceiverAdded(NetworkInterface *ie, Ipv4Address group)
Definition: PimSm.cc:1130
void unroutableMulticastPacketArrived(Ipv4Address srcAddr, Ipv4Address destAddr)
Definition: PimSm.cc:1092
virtual void stopPIMRouting()
Definition: PimSm.cc:106
static simsignal_t sentJoinPrunePkSignal
Definition: PimSm.h:206
static void insertCrc(const Ptr< PimPacket > &pimPacket)
Definition: Pim.cc:103
double joinPruneHoldTime()
Definition: PimSm.h:277
@ PrunePendingTimer
Definition: PimBase.h:127
static const Ipv4Address ALL_PIM_ROUTERS_MCAST
Definition: PimBase.h:143
@ ExpiryTimer
Definition: PimBase.h:139
@ SPT_BIT
Definition: PimSm.h:133
double joinPrunePeriod
Definition: PimSm.h:191
void sendPIMRegister(Packet *pk, Ipv4Address dest, int outInterfaceId)
Definition: PimSm.cc:1445
@ RP
Definition: PimSm.h:122
virtual void handleStartOperation(LifecycleOperation *operation) override
Definition: PimBase.cc:60
static simsignal_t rcvdJoinPrunePkSignal
Definition: PimSm.h:207
void iAmDRHasChanged(NetworkInterface *ie, bool iAmDR)
Definition: PimSm.cc:1325
removed DscpReq Ipv4ControlInfo Ipv6ControlInfo up L3AddressInd DispatchProtocolReq L4PortInd Ipv4ControlInfo Ipv6ControlInfo down PacketProtocolTag
Definition: IUdp-gates.txt:25
void updateJoinDesired(Route *route)
Definition: PimSm.cc:1561
simsignal_t ipv4NewMulticastSignal
Definition: Simsignals.cc:56
static const Ipv4Address ALLONES_ADDRESS
255.255.255.255
Definition: Ipv4Address.h:94
void forwardMulticastData(Packet *pk, int outInterfaceId)
The method is used as abstraction for encapsulation multicast data to Register packet.
Definition: PimSm.cc:1537
@ JOIN
Definition: PimSm.h:95
simsignal_t ipv4MdataRegisterSignal
Definition: Simsignals.cc:59
@ StateRefresh
Definition: PimPacket_m.h:102
simsignal_t pimNeighborAddedSignal
Definition: Simsignals.cc:60
void sendPIMJoin(Ipv4Address group, Ipv4Address source, Ipv4Address upstreamNeighbor, RouteType JPtype)
Definition: PimSm.cc:1334
@ RegisterStop
Definition: PimPacket_m.h:95
double defaultOverrideInterval
Definition: PimSm.h:192
@ PRUNED
Definition: PimSm.h:131
static const Protocol pim
Definition: Protocol.h:103
@ NO_INFO
Definition: PimSm.h:95
PimBase(PimInterface::PimMode mode)
Definition: PimBase.h:170
intscale< b, 1, 8 > B
Definition: Units.h:1168
Ipv4MulticastRoute * createIpv4Route(Route *route)
Definition: PimSm.cc:1847
void processJoinTimer(cMessage *timer)
Definition: PimSm.cc:955
@ I_LOST_ASSERT
Definition: PimBase.h:74
double effectiveOverrideInterval()
Definition: PimSm.h:279
void processJoinSG(Ipv4Address origin, Ipv4Address group, Ipv4Address upstreamNeighborField, int holdTime, NetworkInterface *inInterface)
Definition: PimSm.cc:401
void multicastPacketArrivedOnNonRpfInterface(Route *route, int interfaceId)
Definition: PimSm.cc:1200
simsignal_t ipv4MulticastGroupRegisteredSignal
Definition: Simsignals.cc:52
removed HopLimitReq
Definition: IUdp-gates.txt:11
ModuleRefByPar< PimInterfaceTable > pimIft
Definition: PimBase.h:148
static simsignal_t rcvdRegisterPkSignal
Definition: PimSm.h:203
@ SGrpt
Definition: PimSm.h:125
double assertOverrideInterval
Definition: PimSm.h:199
void processJoinSGrpt(Ipv4Address origin, Ipv4Address group, Ipv4Address upstreamNeighborField, int holdTime, NetworkInterface *inInterface)
Definition: PimSm.cc:455
Ipv4MulticastRoute * findIpv4Route(Ipv4Address source, Ipv4Address group)
Definition: PimSm.cc:1889
double effectivePropagationDelay()
Definition: PimSm.h:278
static simsignal_t rcvdAssertPkSignal
Definition: PimSm.h:209
static simsignal_t sentRegisterPkSignal
Definition: PimSm.h:202
INET_API InitStage INITSTAGE_LOCAL
Initialization of local state that don't use or affect other modules includes:
static const AssertMetric PIM_INFINITE
Definition: PimBase.h:37
@ Graft
Definition: PimPacket_m.h:99
value< int64_t, units::b > b
Definition: Units.h:1241
const B ENCODED_SOURCE_ADDRESS_LENGTH
Definition: PimPacket_m.h:71
#define NUM_INIT_STAGES
Definition: InitStageRegistry.h:73
simsignal_t ipv4DataOnNonrpfSignal
Definition: Simsignals.cc:57
double holdTime
Definition: PimBase.h:158
void processPrunePendingTimer(cMessage *timer)
Prune Pending Timer is used for delaying of Prune message sending (for possible overriding Join from ...
Definition: PimSm.cc:977
void processHelloTimer(cMessage *timer)
Definition: PimBase.cc:95
void sendPIMPrune(Ipv4Address group, Ipv4Address source, Ipv4Address upstreamNeighbor, RouteType JPtype)
Definition: PimSm.cc:1373
ModuleRefByPar< PimNeighborTable > pimNbt
Definition: PimBase.h:149
void multicastPacketForwarded(Packet *pk)
Definition: PimSm.cc:1231
static const Ipv4Address UNSPECIFIED_ADDRESS
0.0.0.0
Definition: Ipv4Address.h:91
#define Enter_Method(...)
Definition: SelfDoc.h:71
RoutingTable gRoutes
Definition: PimSm.h:212
simsignal_t ipv4MulticastGroupUnregisteredSignal
Definition: Simsignals.cc:53
@ IP_PROT_PIM
Definition: IpProtocolId_m.h:106
int designatedRouterPriority
Definition: PimBase.h:159
void processPruneSGrpt(Ipv4Address source, Ipv4Address group, Ipv4Address upstreamNeighborField, NetworkInterface *inInterface)
Definition: PimSm.cc:528
@ SparseMode
Definition: PimInterfaceTable.h:26
@ RS_JOIN_PENDING
Definition: PimSm.h:155
static void insertCrc(const Ptr< Ipv4Header > &ipv4Header)
Definition: Ipv4.cc:832
@ RegisterStopTimer
Definition: PimBase.h:138
void multicastPacketArrivedOnRpfInterface(Route *route)
The method process notification about data which appears on RPF interface.
Definition: PimSm.cc:1149
void processJoinG(Ipv4Address group, Ipv4Address rp, Ipv4Address upstreamNeighborField, int holdTime, NetworkInterface *inInterface)
Definition: PimSm.cc:338
void sendPIMRegisterStop(Ipv4Address source, Ipv4Address dest, Ipv4Address multGroup, Ipv4Address multSource)
Definition: PimSm.cc:1469
@ SG
Definition: PimSm.h:124
@ AssertTimer
Definition: PimBase.h:125
void processExpiryTimer(cMessage *timer)
The method is used to process PIM Expiry Timer.
Definition: PimSm.cc:911
void processKeepAliveTimer(cMessage *timer)
Definition: PimSm.cc:875
void processRegisterPacket(Packet *pk)
The method is used for processing PIM Register message sent from source DR.
Definition: PimSm.cc:538
bool IamRP(Ipv4Address rpAddr)
Definition: PimSm.h:289
@ Assert
Definition: PimPacket_m.h:98
const B ENCODED_UNICODE_ADDRESS_LENGTH
Definition: PimPacket_m.h:69
@ RS_PRUNE
Definition: PimSm.h:155
Route * findRouteSG(Ipv4Address source, Ipv4Address group)
Definition: PimSm.cc:1881
bool deleteMulticastRoute(Route *route)
Definition: PimSm.cc:1691
virtual void handleStopOperation(LifecycleOperation *operation) override
Definition: PimBase.cc:81
static simsignal_t sentRegisterStopPkSignal
Definition: PimSm.h:204
const B IPv4_MIN_HEADER_LENGTH
Definition: Ipv4Header_m.h:68
#define KAT
Keep alive timer, if RPT is disconnect.
Definition: PimSm.h:19
void processPruneSG(Ipv4Address source, Ipv4Address group, Ipv4Address upstreamNeighborField, NetworkInterface *inInterface)
Definition: PimSm.cc:494
void processAssertSG(PimsmInterface *interface, const AssertMetric &receivedMetric)
Definition: PimSm.cc:674
void processJoinPrunePacket(Packet *pk)
Definition: PimSm.cc:292
@ CandidateRPAdvertisement
Definition: PimPacket_m.h:101
bool isUnspecified() const
True if all four address bytes are zero.
Definition: Ipv4Address.h:165
double registerProbeTime
Definition: PimSm.h:197
@ PIM_SM
managed by PIM-SM router
Definition: IRoute.h:169
@ G
Definition: PimSm.h:123
@ Bootstrap
Definition: PimPacket_m.h:97
double defaultPropagationDelay
Definition: PimSm.h:193
virtual void initialize(int stage) override
Definition: PimBase.cc:37
bool removeRoute(Route *route)
Definition: PimSm.cc:1865
void processAssertTimer(cMessage *timer)
Definition: PimSm.cc:1022
void processHelloPacket(Packet *pk)
Definition: PimBase.cc:153
void multicastReceiverRemoved(NetworkInterface *ie, Ipv4Address group)
Definition: PimSm.cc:1118
@ HelloTimer
Definition: PimBase.h:121
double keepAlivePeriod
Definition: PimSm.h:194
@ JOIN_DESIRED
Definition: PimSm.h:134
@ GraftAck
Definition: PimPacket_m.h:100
@ JoinPrune
Definition: PimPacket_m.h:96
ModuleRefByPar< IIpv4RoutingTable > rt
Definition: PimBase.h:146