INET Framework for OMNeT++/OMNEST
inet::PimBase Class Reference

Base class of PimSm and PimDm modules. More...

#include <PimBase.h>

Inheritance diagram for inet::PimBase:
inet::RoutingProtocolBase inet::OperationalBase inet::OperationalMixin< cSimpleModule > inet::ILifecycle inet::PimDm inet::PimSm

Classes

struct  AssertMetric
 
struct  Interface
 
struct  RouteEntry
 
struct  SourceAndGroup
 

Public Member Functions

 PimBase (PimInterface::PimMode mode)
 
virtual ~PimBase ()
 
- Public Member Functions inherited from inet::RoutingProtocolBase
 RoutingProtocolBase ()
 
- Public Member Functions inherited from inet::OperationalMixin< cSimpleModule >
virtual ~OperationalMixin ()
 }@ More...
 
- Public Member Functions inherited from inet::ILifecycle
virtual ~ILifecycle ()
 

Protected Types

enum  PimTimerKind {
  HelloTimer = 1, TriggeredHelloDelay, AssertTimer, PruneTimer,
  PrunePendingTimer, GraftRetryTimer, UpstreamOverrideTimer, PruneLimitTimer,
  SourceActiveTimer, StateRefreshTimer, KeepAliveTimer, RegisterStopTimer,
  ExpiryTimer, JoinTimer
}
 
- Protected Types inherited from inet::OperationalMixin< cSimpleModule >
enum  State
 

Protected Member Functions

virtual int numInitStages () const override
 
virtual void initialize (int stage) override
 
void sendHelloPackets ()
 
void sendHelloPacket (PimInterface *pimInterface)
 
void processHelloTimer (cMessage *timer)
 
void processHelloPacket (Packet *pk)
 
virtual void handleStartOperation (LifecycleOperation *operation) override
 
virtual void handleStopOperation (LifecycleOperation *operation) override
 
virtual void handleCrashOperation (LifecycleOperation *operation) override
 
- Protected Member Functions inherited from inet::RoutingProtocolBase
virtual bool isInitializeStage (int stage) const override
 
virtual bool isModuleStartStage (int stage) const override
 
virtual bool isModuleStopStage (int stage) const override
 
- Protected Member Functions inherited from inet::OperationalMixin< cSimpleModule >
virtual int numInitStages () const override
 
virtual void refreshDisplay () const override
 
virtual void handleMessage (cMessage *msg) override
 
virtual void handleMessageWhenDown (cMessage *msg)
 
virtual void handleMessageWhenUp (cMessage *msg)=0
 
virtual bool handleOperationStage (LifecycleOperation *operation, IDoneCallback *doneCallback) override
 Perform one stage of a lifecycle operation. More...
 
virtual State getInitialOperationalState () const
 Returns initial operational state: OPERATING or NOT_OPERATING. More...
 
virtual void handleActiveOperationTimeout (cMessage *message)
 
virtual bool isUp () const
 utility functions More...
 
virtual bool isDown () const
 
virtual void setOperationalState (State newState)
 
virtual void scheduleOperationTimeout (simtime_t timeout)
 
virtual void setupActiveOperation (LifecycleOperation *operation, IDoneCallback *doneCallback, State)
 
virtual void delayActiveOperationFinish (simtime_t timeout)
 
virtual void startActiveOperationExtraTime (simtime_t delay=SIMTIME_ZERO)
 
virtual void startActiveOperationExtraTimeOrFinish (simtime_t extraTime)
 
virtual void finishActiveOperation ()
 

Protected Attributes

ModuleRefByPar< IIpv4RoutingTablert
 
ModuleRefByPar< IInterfaceTableift
 
ModuleRefByPar< PimInterfaceTablepimIft
 
ModuleRefByPar< PimNeighborTablepimNbt
 
opp_component_ptr< PimpimModule
 
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
 
- Protected Attributes inherited from inet::OperationalMixin< cSimpleModule >
State operationalState
 
simtime_t lastChange
 
Operation activeOperation
 
cMessage * activeOperationTimeout
 
cMessage * activeOperationExtraTimer
 

Static Protected Attributes

static const Ipv4Address ALL_PIM_ROUTERS_MCAST
 
static simsignal_t sentHelloPkSignal = registerSignal("sentHelloPk")
 
static simsignal_t rcvdHelloPkSignal = registerSignal("rcvdHelloPk")
 

Friends

std::ostream & operator<< (std::ostream &out, const SourceAndGroup &sourceGroup)
 

Detailed Description

Base class of PimSm and PimDm modules.

Member Enumeration Documentation

◆ PimTimerKind

Enumerator
HelloTimer 
TriggeredHelloDelay 
AssertTimer 
PruneTimer 
PrunePendingTimer 
GraftRetryTimer 
UpstreamOverrideTimer 
PruneLimitTimer 
SourceActiveTimer 
StateRefreshTimer 
KeepAliveTimer 
RegisterStopTimer 
ExpiryTimer 
JoinTimer 
119  {
120  // global timers
121  HelloTimer = 1,
123 
124  // timers for each interface and each source-group pair (S,G,I)
125  AssertTimer,
126  PruneTimer,
128 
129  // timers for each source-group pair (S,G)
135 
136  // PIM-SM specific timers
139  ExpiryTimer,
140  JoinTimer,
141  };

Constructor & Destructor Documentation

◆ PimBase()

inet::PimBase::PimBase ( PimInterface::PimMode  mode)
inline
170 : mode(mode) {}

◆ ~PimBase()

inet::PimBase::~PimBase ( )
virtual
33 {
34  cancelAndDelete(helloTimer);
35 }

Member Function Documentation

◆ handleCrashOperation()

void inet::PimBase::handleCrashOperation ( LifecycleOperation operation)
overrideprotectedvirtual

Implements inet::OperationalMixin< cSimpleModule >.

Reimplemented in inet::PimDm, and inet::PimSm.

89 {
90  // TODO unregister IP_PROT_PIM
91  cancelAndDelete(helloTimer);
92  helloTimer = nullptr;
93 }

Referenced by inet::PimSm::handleCrashOperation(), and inet::PimDm::handleCrashOperation().

◆ handleStartOperation()

void inet::PimBase::handleStartOperation ( LifecycleOperation operation)
overrideprotectedvirtual

Implements inet::OperationalMixin< cSimpleModule >.

Reimplemented in inet::PimDm, and inet::PimSm.

61 {
62  generationID = intrand(UINT32_MAX);
63 
64  // to receive PIM messages, join to ALL_PIM_ROUTERS multicast group
65  isEnabled = false;
66  for (int i = 0; i < pimIft->getNumInterfaces(); i++) {
67  PimInterface *pimInterface = pimIft->getInterface(i);
68  if (pimInterface->getMode() == mode) {
69  pimInterface->getInterfacePtr()->getProtocolDataForUpdate<Ipv4InterfaceData>()->joinMulticastGroup(ALL_PIM_ROUTERS_MCAST);
70  isEnabled = true;
71  }
72  }
73 
74  if (isEnabled) {
75  EV_INFO << "PIM is enabled on device " << hostname << endl;
76  helloTimer = new cMessage("PIM HelloTimer", HelloTimer);
77  scheduleAfter(par("triggeredHelloDelay"), helloTimer);
78  }
79 }

Referenced by inet::PimSm::handleStartOperation(), and inet::PimDm::handleStartOperation().

◆ handleStopOperation()

void inet::PimBase::handleStopOperation ( LifecycleOperation operation)
overrideprotectedvirtual

Implements inet::OperationalMixin< cSimpleModule >.

Reimplemented in inet::PimDm, and inet::PimSm.

82 {
83  // TODO unregister IP_PROT_PIM
84  cancelAndDelete(helloTimer);
85  helloTimer = nullptr;
86 }

Referenced by inet::PimSm::handleStopOperation(), and inet::PimDm::handleStopOperation().

◆ initialize()

void inet::PimBase::initialize ( int  stage)
overrideprotectedvirtual

Reimplemented from inet::OperationalMixin< cSimpleModule >.

Reimplemented in inet::PimDm, and inet::PimSm.

38 {
40 
41  if (stage == INITSTAGE_LOCAL) {
42  ift.reference(this, "interfaceTableModule", true);
43  rt.reference(this, "routingTableModule", true);
44  pimIft.reference(this, "pimInterfaceTableModule", true);
45  pimNbt.reference(this, "pimNeighborTableModule", true);
46 
47  cModule *host = findContainingNode(this);
48  if (!host)
49  throw cRuntimeError("PimBase: containing node not found.");
50 
51  hostname = host->getName();
52 
53  helloPeriod = par("helloPeriod");
54  holdTime = par("holdTime");
55  designatedRouterPriority = mode == PimInterface::SparseMode ? par("designatedRouterPriority") : -1;
56  pimModule = check_and_cast<Pim *>(getParentModule());
57  }
58 }

Referenced by inet::PimSm::initialize(), and inet::PimDm::initialize().

◆ numInitStages()

virtual int inet::PimBase::numInitStages ( ) const
inlineoverrideprotectedvirtual

Reimplemented in inet::PimDm, and inet::PimSm.

174 { return NUM_INIT_STAGES; }

◆ processHelloPacket()

void inet::PimBase::processHelloPacket ( Packet pk)
protected
154 {
155  int interfaceId = packet->getTag<InterfaceInd>()->getInterfaceId();
156 
157  Ipv4Address address = packet->getTag<L3AddressInd>()->getSrcAddress().toIpv4();
158  const auto& pimPacket = packet->peekAtFront<PimHello>();
159  int version = pimPacket->getVersion();
160 
161  emit(rcvdHelloPkSignal, packet);
162 
163  // process options
164  double holdTime = 3.5 * 30;
165  long drPriority = -1L;
166  unsigned int generationId = 0;
167  for (unsigned int i = 0; i < pimPacket->getOptionsArraySize(); i++) {
168  const HelloOption *option = pimPacket->getOptions(i);
169  switch (option->getType()) {
170  case Holdtime:
171  holdTime = check_and_cast<const HoldtimeOption *>(option)->getHoldTime();
172  break;
173  case DRPriority:
174  drPriority = check_and_cast<const DrPriorityOption *>(option)->getPriority();
175  break;
176  case GenerationID:
177  generationId = check_and_cast<const GenerationIdOption *>(option)->getGenerationID();
178  break;
179  default:
180  break;
181  }
182  }
183 
184  NetworkInterface *ie = ift->getInterfaceById(interfaceId);
185 
186  EV_INFO << "Received PIM Hello from neighbor: interface=" << ie->getInterfaceName() << " address=" << address << "\n";
187 
188  PimNeighbor *neighbor = pimNbt->findNeighbor(interfaceId, address);
189  if (neighbor)
190  pimNbt->restartLivenessTimer(neighbor, holdTime);
191  else {
192  neighbor = new PimNeighbor(ie, address, version);
193  pimNbt->addNeighbor(neighbor, holdTime);
194 
195  // TODO If a Hello message is received from a new neighbor, the
196  // receiving router SHOULD send its own Hello message after a random
197  // delay between 0 and Triggered_Hello_Delay.
198  }
199 
200  neighbor->setGenerationId(generationId);
201  neighbor->setDRPriority(drPriority);
202 
203  delete packet;
204 }

Referenced by inet::PimSm::handleMessageWhenUp(), and inet::PimDm::handleMessageWhenUp().

◆ processHelloTimer()

void inet::PimBase::processHelloTimer ( cMessage *  timer)
protected
96 {
97  ASSERT(timer == helloTimer);
98  EV_DETAIL << "Hello Timer expired.\n";
100  scheduleAfter(helloPeriod, helloTimer);
101 }

Referenced by inet::PimSm::handleMessageWhenUp(), and inet::PimDm::handleMessageWhenUp().

◆ sendHelloPacket()

void inet::PimBase::sendHelloPacket ( PimInterface pimInterface)
protected
113 {
114  EV_INFO << "Sending Hello packet on interface '" << pimInterface->getInterfacePtr()->getInterfaceName() << "'\n";
115 
116  Packet *pk = new Packet("PimHello");
117  const auto& msg = makeShared<PimHello>();
118 
119  B byteLength = PIM_HEADER_LENGTH + B(6) + B(8); // HoldTime + GenerationID option
120 
121  msg->setOptionsArraySize(designatedRouterPriority < 0 ? 2 : 3);
122  HoldtimeOption *holdtimeOption = new HoldtimeOption();
123  holdtimeOption->setHoldTime(holdTime < 0 ? (uint16_t)0xffff : (uint16_t)holdTime);
124  msg->setOptions(0, holdtimeOption);
125 
126  GenerationIdOption *genIdOption = new GenerationIdOption();
127  genIdOption->setGenerationID(generationID);
128  msg->setOptions(1, genIdOption);
129 
130  if (designatedRouterPriority >= 0) {
131  DrPriorityOption *drPriorityOption = new DrPriorityOption();
132  drPriorityOption->setPriority(designatedRouterPriority);
133  msg->setOptions(2, drPriorityOption);
134  byteLength += B(8);
135  }
136 
137  msg->setChunkLength(byteLength);
138  msg->setCrcMode(pimModule->getCrcMode());
139  Pim::insertCrc(msg);
140  pk->insertAtFront(msg);
141  pk->addTag<PacketProtocolTag>()->setProtocol(&Protocol::pim);
142  pk->addTag<InterfaceReq>()->setInterfaceId(pimInterface->getInterfaceId());
143  pk->addTag<DispatchProtocolInd>()->setProtocol(&Protocol::pim);
144  pk->addTag<DispatchProtocolReq>()->setProtocol(&Protocol::ipv4);
145  pk->addTag<L3AddressReq>()->setDestAddress(ALL_PIM_ROUTERS_MCAST);
146  pk->addTag<HopLimitReq>()->setHopLimit(1);
147 
148  emit(sentHelloPkSignal, pk);
149 
150  send(pk, "ipOut");
151 }

Referenced by sendHelloPackets().

◆ sendHelloPackets()

void inet::PimBase::sendHelloPackets ( )
protected
104 {
105  for (int i = 0; i < pimIft->getNumInterfaces(); i++) {
106  PimInterface *pimInterface = pimIft->getInterface(i);
107  if (pimInterface->getMode() == mode)
108  sendHelloPacket(pimInterface);
109  }
110 }

Referenced by processHelloTimer().

Friends And Related Function Documentation

◆ operator<<

std::ostream& operator<< ( std::ostream &  out,
const SourceAndGroup sourceGroup 
)
friend
234 {
235  out << "(source: " << (sourceGroup.source.isUnspecified() ? "*" : sourceGroup.source.str()) << ", "
236  << "group: " << (sourceGroup.group.isUnspecified() ? "*" : sourceGroup.group.str()) << ")";
237  return out;
238 }

Member Data Documentation

◆ ALL_PIM_ROUTERS_MCAST

◆ designatedRouterPriority

int inet::PimBase::designatedRouterPriority = 0
protected

◆ generationID

uint32_t inet::PimBase::generationID = 0
protected

◆ helloPeriod

double inet::PimBase::helloPeriod = 0
protected

Referenced by initialize(), and processHelloTimer().

◆ helloTimer

cMessage* inet::PimBase::helloTimer = nullptr
protected

◆ holdTime

◆ hostname

const char* inet::PimBase::hostname = nullptr
protected

Referenced by handleStartOperation(), and initialize().

◆ ift

◆ isEnabled

◆ isUp

bool inet::PimBase::isUp = false
protected

◆ mode

PimInterface::PimMode inet::PimBase::mode = static_cast<PimInterface::PimMode>(0)
protected

◆ pimIft

◆ pimModule

◆ pimNbt

◆ rcvdHelloPkSignal

simsignal_t inet::PimBase::rcvdHelloPkSignal = registerSignal("rcvdHelloPk")
staticprotected

Referenced by processHelloPacket().

◆ rt

◆ sentHelloPkSignal

simsignal_t inet::PimBase::sentHelloPkSignal = registerSignal("sentHelloPk")
staticprotected

Referenced by sendHelloPacket().


The documentation for this class was generated from the following files:
inet::findContainingNode
cModule * findContainingNode(const cModule *from)
Find the node containing the given module.
Definition: ModuleAccess.cc:31
inet::GenerationID
@ GenerationID
Definition: PimPacket_m.h:126
inet::PimBase::mode
PimInterface::PimMode mode
Definition: PimBase.h:161
inet::PimBase::JoinTimer
@ JoinTimer
Definition: PimBase.h:140
inet::PIM_HEADER_LENGTH
const B PIM_HEADER_LENGTH
Definition: PimPacket_m.h:68
inet::PimBase::ift
ModuleRefByPar< IInterfaceTable > ift
Definition: PimBase.h:147
inet::PimBase::SourceActiveTimer
@ SourceActiveTimer
Definition: PimBase.h:133
inet::PimBase::KeepAliveTimer
@ KeepAliveTimer
Definition: PimBase.h:137
inet::Protocol::ipv4
static const Protocol ipv4
Definition: Protocol.h:93
inet::DRPriority
@ DRPriority
Definition: PimPacket_m.h:125
inet::OperationalMixin< cSimpleModule >::initialize
virtual void initialize(int stage) override
Definition: OperationalMixinImpl.h:26
inet::PimBase::isEnabled
bool isEnabled
Definition: PimBase.h:153
InterfaceReq
removed InterfaceReq
Definition: IUdp-gates.txt:11
DispatchProtocolReq
removed DscpReq Ipv4ControlInfo Ipv6ControlInfo up L3AddressInd DispatchProtocolReq L4PortInd Ipv4ControlInfo Ipv6ControlInfo down DispatchProtocolReq
Definition: IUdp-gates.txt:25
L3AddressInd
removed DscpReq Ipv4ControlInfo Ipv6ControlInfo up L3AddressInd L3AddressInd
Definition: IUdp-gates.txt:20
inet::PimBase::pimModule
opp_component_ptr< Pim > pimModule
Definition: PimBase.h:150
inet::PimBase::UpstreamOverrideTimer
@ UpstreamOverrideTimer
Definition: PimBase.h:131
inet::PimBase::sendHelloPacket
void sendHelloPacket(PimInterface *pimInterface)
Definition: PimBase.cc:112
inet::Pim::insertCrc
static void insertCrc(const Ptr< PimPacket > &pimPacket)
Definition: Pim.cc:103
inet::PimBase::PrunePendingTimer
@ PrunePendingTimer
Definition: PimBase.h:127
inet::PimBase::ALL_PIM_ROUTERS_MCAST
static const Ipv4Address ALL_PIM_ROUTERS_MCAST
Definition: PimBase.h:143
inet::PimBase::ExpiryTimer
@ ExpiryTimer
Definition: PimBase.h:139
PacketProtocolTag
removed DscpReq Ipv4ControlInfo Ipv6ControlInfo up L3AddressInd DispatchProtocolReq L4PortInd Ipv4ControlInfo Ipv6ControlInfo down PacketProtocolTag
Definition: IUdp-gates.txt:25
inet::PimBase::PruneLimitTimer
@ PruneLimitTimer
Definition: PimBase.h:132
inet::Protocol::pim
static const Protocol pim
Definition: Protocol.h:103
inet::PimBase::StateRefreshTimer
@ StateRefreshTimer
Definition: PimBase.h:134
inet::units::units::B
intscale< b, 1, 8 > B
Definition: Units.h:1168
inet::PimBase::PruneTimer
@ PruneTimer
Definition: PimBase.h:126
HopLimitReq
removed HopLimitReq
Definition: IUdp-gates.txt:11
inet::PimBase::pimIft
ModuleRefByPar< PimInterfaceTable > pimIft
Definition: PimBase.h:148
inet::PimBase::helloPeriod
double helloPeriod
Definition: PimBase.h:157
inet::INITSTAGE_LOCAL
INET_API InitStage INITSTAGE_LOCAL
Initialization of local state that don't use or affect other modules includes:
inet::PimBase::rcvdHelloPkSignal
static simsignal_t rcvdHelloPkSignal
Definition: PimBase.h:167
NUM_INIT_STAGES
#define NUM_INIT_STAGES
Definition: InitStageRegistry.h:73
inet::PimBase::holdTime
double holdTime
Definition: PimBase.h:158
inet::PimBase::sendHelloPackets
void sendHelloPackets()
Definition: PimBase.cc:103
inet::PimBase::pimNbt
ModuleRefByPar< PimNeighborTable > pimNbt
Definition: PimBase.h:149
inet::PimBase::designatedRouterPriority
int designatedRouterPriority
Definition: PimBase.h:159
inet::PimInterface::SparseMode
@ SparseMode
Definition: PimInterfaceTable.h:26
inet::PimBase::generationID
uint32_t generationID
Definition: PimBase.h:162
inet::PimBase::RegisterStopTimer
@ RegisterStopTimer
Definition: PimBase.h:138
inet::PimBase::TriggeredHelloDelay
@ TriggeredHelloDelay
Definition: PimBase.h:122
inet::PimBase::AssertTimer
@ AssertTimer
Definition: PimBase.h:125
inet::PimBase::sentHelloPkSignal
static simsignal_t sentHelloPkSignal
Definition: PimBase.h:166
inet::PimBase::GraftRetryTimer
@ GraftRetryTimer
Definition: PimBase.h:130
inet::PimBase::helloTimer
cMessage * helloTimer
Definition: PimBase.h:163
inet::Holdtime
@ Holdtime
Definition: PimPacket_m.h:123
inet::PimBase::HelloTimer
@ HelloTimer
Definition: PimBase.h:121
inet::PimBase::hostname
const char * hostname
Definition: PimBase.h:154
inet::PimBase::rt
ModuleRefByPar< IIpv4RoutingTable > rt
Definition: PimBase.h:146