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

PimInterfaceTable contains an PimInterface entry for each interface on which PIM is enabled. More...

#include <PimInterfaceTable.h>

Inheritance diagram for inet::PimInterfaceTable:

Public Member Functions

virtual ~PimInterfaceTable ()
 
virtual int getNumInterfaces ()
 
virtual PimInterfacegetInterface (int k)
 
virtual PimInterfacegetInterfaceById (int interfaceId)
 

Protected Types

typedef std::vector< PimInterface * > PimInterfaceVector
 

Protected Member Functions

virtual int numInitStages () const override
 
virtual void initialize (int stage) override
 
virtual void handleMessage (cMessage *) override
 
virtual void receiveSignal (cComponent *source, simsignal_t signalID, cObject *obj, cObject *details) override
 
virtual void configureInterfaces (cXMLElement *config)
 
virtual PimInterfacecreateInterface (NetworkInterface *ie, cXMLElement *config)
 
virtual PimInterfaceVector::iterator findInterface (NetworkInterface *ie)
 
virtual void addInterface (NetworkInterface *ie)
 
virtual void removeInterface (NetworkInterface *ie)
 

Protected Attributes

PimInterfaceVector pimInterfaces
 

Detailed Description

PimInterfaceTable contains an PimInterface entry for each interface on which PIM is enabled.

When interfaces are added to/deleted from the InterfaceTable, then the corresponding PimInterface entry is added/deleted automatically.

Member Typedef Documentation

◆ PimInterfaceVector

Constructor & Destructor Documentation

◆ ~PimInterfaceTable()

inet::PimInterfaceTable::~PimInterfaceTable ( )
virtual
21 {
22  for (auto& elem : pimInterfaces)
23  delete elem;
24 }

Member Function Documentation

◆ addInterface()

void inet::PimInterfaceTable::addInterface ( NetworkInterface ie)
protectedvirtual
126 {
127  ASSERT(findInterface(ie) == pimInterfaces.end());
128 
129  cXMLElement *config = par("pimConfig");
130  cXMLElementList interfaceElements = config->getChildrenByTagName("interface");
131  InterfaceMatcher matcher(interfaceElements);
132 
133  int i = matcher.findMatchingSelector(ie);
134  if (i >= 0) {
135  PimInterface *pimInterface = createInterface(ie, interfaceElements[i]);
136  if (pimInterface)
137  pimInterfaces.push_back(pimInterface);
138  }
139 }

Referenced by receiveSignal().

◆ configureInterfaces()

void inet::PimInterfaceTable::configureInterfaces ( cXMLElement *  config)
protectedvirtual
51 {
52  cXMLElementList interfaceElements = config->getChildrenByTagName("interface");
53  InterfaceMatcher matcher(interfaceElements);
54  IInterfaceTable *ift = getModuleFromPar<IInterfaceTable>(par("interfaceTableModule"), this);
55 
56  for (int k = 0; k < ift->getNumInterfaces(); ++k) {
57  NetworkInterface *ie = ift->getInterface(k);
58  if (ie->isMulticast() && !ie->isLoopback()) {
59  int i = matcher.findMatchingSelector(ie);
60  if (i >= 0) {
61  PimInterface *pimInterface = createInterface(ie, interfaceElements[i]);
62  if (pimInterface)
63  pimInterfaces.push_back(pimInterface);
64  }
65  }
66  }
67 }

Referenced by initialize().

◆ createInterface()

PimInterface * inet::PimInterfaceTable::createInterface ( NetworkInterface ie,
cXMLElement *  config 
)
protectedvirtual
70 {
71  const char *modeAttr = config->getAttribute("mode");
72  if (!modeAttr)
73  return nullptr;
74 
76  if (strcmp(modeAttr, "dense") == 0)
78  else if (strcmp(modeAttr, "sparse") == 0)
80  else
81  throw cRuntimeError("PimInterfaceTable: invalid 'mode' attribute value in the configuration of interface '%s'", ie->getInterfaceName());
82 
83  const char *stateRefreshAttr = config->getAttribute("state-refresh");
84  bool stateRefreshFlag = stateRefreshAttr && !strcmp(stateRefreshAttr, "true");
85 
86  return new PimInterface(ie, mode, stateRefreshFlag);
87 }

Referenced by addInterface(), and configureInterfaces().

◆ findInterface()

PimInterfaceTable::PimInterfaceVector::iterator inet::PimInterfaceTable::findInterface ( NetworkInterface ie)
protectedvirtual
117 {
118  for (auto it = pimInterfaces.begin(); it != pimInterfaces.end(); ++it)
119  if ((*it)->getInterfacePtr() == ie)
120  return it;
121 
122  return pimInterfaces.end();
123 }

Referenced by addInterface(), and removeInterface().

◆ getInterface()

virtual PimInterface* inet::PimInterfaceTable::getInterface ( int  k)
inlinevirtual
69 { return pimInterfaces[k]; }

Referenced by getInterfaceById().

◆ getInterfaceById()

PimInterface * inet::PimInterfaceTable::getInterfaceById ( int  interfaceId)
virtual
90 {
91  for (int i = 0; i < getNumInterfaces(); i++)
92  if (interfaceId == getInterface(i)->getInterfaceId())
93  return getInterface(i);
94 
95  return nullptr;
96 }

◆ getNumInterfaces()

virtual int inet::PimInterfaceTable::getNumInterfaces ( )
inlinevirtual
68 { return pimInterfaces.size(); }

Referenced by getInterfaceById().

◆ handleMessage()

void inet::PimInterfaceTable::handleMessage ( cMessage *  msg)
overrideprotectedvirtual
27 {
28  throw cRuntimeError("This module doesn't process messages");
29 }

◆ initialize()

void inet::PimInterfaceTable::initialize ( int  stage)
overrideprotectedvirtual
32 {
33  cSimpleModule::initialize(stage);
34 
35  if (stage == INITSTAGE_LOCAL) {
36  WATCH_VECTOR(pimInterfaces);
37  }
38  // TODO INITSTAGE
39  else if (stage == INITSTAGE_LINK_LAYER) {
40  configureInterfaces(par("pimConfig"));
41 
42  cModule *host = findContainingNode(this);
43  if (!host)
44  throw cRuntimeError("PimInterfaceTable: containing node not found.");
45  host->subscribe(interfaceCreatedSignal, this);
46  host->subscribe(interfaceDeletedSignal, this);
47  }
48 }

◆ numInitStages()

virtual int inet::PimInterfaceTable::numInitStages ( ) const
inlineoverrideprotectedvirtual
73 { return NUM_INIT_STAGES; }

◆ receiveSignal()

void inet::PimInterfaceTable::receiveSignal ( cComponent *  source,
simsignal_t  signalID,
cObject *  obj,
cObject *  details 
)
overrideprotectedvirtual
99 {
100  Enter_Method("%s", cComponent::getSignalName(signalID));
101 
102  printSignalBanner(signalID, obj, details);
103 
104  if (signalID == interfaceCreatedSignal) {
105  NetworkInterface *ie = check_and_cast<NetworkInterface *>(obj);
106  if (ie->isMulticast() && !ie->isLoopback())
107  addInterface(ie);
108  }
109  else if (signalID == interfaceDeletedSignal) {
110  NetworkInterface *ie = check_and_cast<NetworkInterface *>(obj);
111  if (ie->isMulticast() && !ie->isLoopback())
112  removeInterface(ie);
113  }
114 }

◆ removeInterface()

void inet::PimInterfaceTable::removeInterface ( NetworkInterface ie)
protectedvirtual
142 {
143  auto it = findInterface(ie);
144  if (it != pimInterfaces.end())
145  pimInterfaces.erase(it);
146 }

Referenced by receiveSignal().

Member Data Documentation

◆ pimInterfaces

PimInterfaceVector inet::PimInterfaceTable::pimInterfaces
protected

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::PimInterfaceTable::pimInterfaces
PimInterfaceVector pimInterfaces
Definition: PimInterfaceTable.h:63
inet::PimInterfaceTable::getNumInterfaces
virtual int getNumInterfaces()
Definition: PimInterfaceTable.h:68
inet::PimInterface::DenseMode
@ DenseMode
Definition: PimInterfaceTable.h:25
inet::printSignalBanner
void printSignalBanner(simsignal_t signalID, const cObject *obj, const cObject *details)
Utility function.
Definition: Simsignals.cc:126
inet::PimInterfaceTable::createInterface
virtual PimInterface * createInterface(NetworkInterface *ie, cXMLElement *config)
Definition: PimInterfaceTable.cc:69
inet::PimInterface::PimMode
PimMode
Definition: PimInterfaceTable.h:24
inet::interfaceDeletedSignal
simsignal_t interfaceDeletedSignal
Definition: Simsignals.cc:31
inet::PimInterfaceTable::addInterface
virtual void addInterface(NetworkInterface *ie)
Definition: PimInterfaceTable.cc:125
inet::INITSTAGE_LOCAL
INET_API InitStage INITSTAGE_LOCAL
Initialization of local state that don't use or affect other modules includes:
NUM_INIT_STAGES
#define NUM_INIT_STAGES
Definition: InitStageRegistry.h:73
inet::physicallayer::k
const double k
Definition: Qam1024Modulation.cc:14
inet::PimInterfaceTable::removeInterface
virtual void removeInterface(NetworkInterface *ie)
Definition: PimInterfaceTable.cc:141
Enter_Method
#define Enter_Method(...)
Definition: SelfDoc.h:71
inet::PimInterfaceTable::findInterface
virtual PimInterfaceVector::iterator findInterface(NetworkInterface *ie)
Definition: PimInterfaceTable.cc:116
inet::PimInterfaceTable::getInterface
virtual PimInterface * getInterface(int k)
Definition: PimInterfaceTable.h:69
inet::PimInterface::getInterfaceId
int getInterfaceId() const
Definition: PimInterfaceTable.h:44
inet::PimInterface::SparseMode
@ SparseMode
Definition: PimInterfaceTable.h:26
inet::PimInterfaceTable::configureInterfaces
virtual void configureInterfaces(cXMLElement *config)
Definition: PimInterfaceTable.cc:50
inet::interfaceCreatedSignal
simsignal_t interfaceCreatedSignal
Definition: Simsignals.cc:30
inet::INITSTAGE_LINK_LAYER
INET_API InitStage INITSTAGE_LINK_LAYER
Initialization of link-layer protocols.