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

Ipv4 multicast route in IIpv4RoutingTable. More...

#include <Ipv4Route.h>

Inheritance diagram for inet::Ipv4MulticastRoute:
inet::IMulticastRoute

Public Types

enum  {
  F_ORIGIN, F_ORIGINMASK, F_MULTICASTGROUP, F_IN,
  F_OUT, F_SOURCE, F_METRIC, F_LAST
}
 
- Public Types inherited from inet::IMulticastRoute
enum  SourceType { MANUAL, DVMRP, PIM_DM, PIM_SM }
 Specifies where the route comes from. More...
 
typedef std::vector< OutInterface * > OutInterfaceVector
 

Public Member Functions

 Ipv4MulticastRoute ()
 
virtual ~Ipv4MulticastRoute ()
 
virtual std::string str () const override
 
virtual std::string detailedInfo () const
 
virtual void setRoutingTable (IIpv4RoutingTable *rt)
 To be called by the routing table when this route is added or removed from it. More...
 
IIpv4RoutingTablegetRoutingTable () const
 
virtual bool isValid () const
 test validity of route entry, e.g. More...
 
virtual bool matches (const Ipv4Address &origin, const Ipv4Address &group) const
 
virtual void setOrigin (Ipv4Address _origin)
 
virtual void setOriginNetmask (Ipv4Address _netmask)
 
virtual void setMulticastGroup (Ipv4Address _group)
 
virtual void setInInterface (InInterface *_inInterface) override
 
virtual void clearOutInterfaces () override
 
virtual void addOutInterface (OutInterface *outInterface) override
 
virtual bool removeOutInterface (const NetworkInterface *ie) override
 
virtual void removeOutInterface (unsigned int i) override
 
virtual void setSourceType (SourceType _source) override
 
virtual void setMetric (int _metric) override
 
Ipv4Address getOrigin () const
 Source address prefix to match. More...
 
Ipv4Address getOriginNetmask () const
 Represents length of prefix to match. More...
 
Ipv4Address getMulticastGroup () const
 Multicast group address. More...
 
InInterface * getInInterface () const
 In interface. More...
 
unsigned int getNumOutInterfaces () const
 Number of out interfaces. More...
 
OutInterfacegetOutInterface (unsigned int k) const
 The kth out interface. More...
 
SourceType getSourceType () const override
 Source of route. More...
 
int getMetric () const override
 "Cost" to reach the destination More...
 
void setSource (cObject *_source) override
 
cObject * getSource () const override
 Source of route. More...
 
virtual IRoutingTablegetRoutingTableAsGeneric () const override
 The routing table in which this route is inserted, or nullptr. More...
 
virtual void setEnabled (bool enabled) override
 
virtual void setOrigin (const L3Address &origin) override
 
virtual void setPrefixLength (int len) override
 
virtual void setMulticastGroup (const L3Address &group) override
 
virtual bool isEnabled () const override
 Disabled entries are ignored by routing until the became enabled again. More...
 
virtual bool isExpired () const override
 Expired entries are ignored by routing, and may be periodically purged. More...
 
virtual L3Address getOriginAsGeneric () const override
 Source address prefix to match. More...
 
virtual int getPrefixLength () const override
 Prefix length to match. More...
 
virtual L3Address getMulticastGroupAsGeneric () const override
 Multicast group address. More...
 
- Public Member Functions inherited from inet::IMulticastRoute
virtual ~IMulticastRoute ()
 
virtual void setInInterface (InInterface *_inInterface)=0
 
virtual void setSourceType (SourceType type)=0
 

Protected Member Functions

void changed (int fieldCode)
 

Private Member Functions

 Ipv4MulticastRoute (const Ipv4MulticastRoute &obj)
 
Ipv4MulticastRouteoperator= (const Ipv4MulticastRoute &obj)
 

Private Attributes

IIpv4RoutingTablert
 the routing table in which this route is inserted, or nullptr More...
 
Ipv4Address origin
 Source network. More...
 
Ipv4Address originNetmask
 Source network mask. More...
 
Ipv4Address group
 Multicast group, if unspecified then matches any. More...
 
InInterface * inInterface
 In interface (upstream) More...
 
OutInterfaceVector outInterfaces
 Out interfaces (downstream) More...
 
SourceType sourceType
 manual, routing prot, etc. More...
 
cObject * source
 Object identifying the source. More...
 
int metric
 Metric ("cost" to reach the source) More...
 

Additional Inherited Members

- Static Public Member Functions inherited from inet::IMulticastRoute
static const char * sourceTypeName (SourceType sourceType)
 

Detailed Description

Ipv4 multicast route in IIpv4RoutingTable.

Multicast routing protocols may extend this class to store protocol specific fields.

Multicast datagrams are forwarded along the edges of a multicast tree. The tree might depend on the multicast group and the source (origin) of the multicast datagram.

The forwarding algorithm chooses the route according the to origin (source address) and multicast group (destination address) of the received datagram. The route might specify a prefix of the origin and a multicast group to be matched.

Then the forwarding algorithm copies the datagrams arrived on the parent (upstream) interface to the child interfaces (downstream). If there are no downstream routers on a child interface (i.e. it is a leaf in the multicast routing tree), then the datagram is forwarded only if there are listeners of the multicast group on that link (TRPB routing).

See also
IIpv4RoutingTable, Ipv4RoutingTable

Member Enumeration Documentation

◆ anonymous enum

anonymous enum
Enumerator
F_ORIGIN 
F_ORIGINMASK 
F_MULTICASTGROUP 
F_IN 
F_OUT 
F_SOURCE 
F_METRIC 
F_LAST 

Constructor & Destructor Documentation

◆ Ipv4MulticastRoute() [1/2]

inet::Ipv4MulticastRoute::Ipv4MulticastRoute ( const Ipv4MulticastRoute obj)
private

◆ Ipv4MulticastRoute() [2/2]

inet::Ipv4MulticastRoute::Ipv4MulticastRoute ( )
inline
161 : rt(nullptr), inInterface(nullptr), sourceType(MANUAL), source(nullptr), metric(0) {}

◆ ~Ipv4MulticastRoute()

inet::Ipv4MulticastRoute::~Ipv4MulticastRoute ( )
virtual
117 {
118  delete inInterface;
119  for (auto& elem : outInterfaces)
120  delete elem;
121  outInterfaces.clear();
122 }

Member Function Documentation

◆ addOutInterface()

void inet::Ipv4MulticastRoute::addOutInterface ( OutInterface outInterface)
overridevirtual

Implements inet::IMulticastRoute.

195 {
196  ASSERT(outInterface);
197 
198  auto it = outInterfaces.begin();
199  for (; it != outInterfaces.end(); ++it) {
200  if ((*it)->getInterface() == outInterface->getInterface()) {
201  delete *it;
202  *it = outInterface;
203  changed(F_OUT);
204  return;
205  }
206  }
207 
208  outInterfaces.push_back(outInterface);
209  changed(F_OUT);
210 }

Referenced by inet::Ipv4NetworkConfigurator::configureRoutingTable(), inet::PimSm::createIpv4Route(), inet::PimDm::multicastReceiverAdded(), inet::Ipv4NetworkConfigurator::readManualMulticastRouteConfiguration(), inet::PimDm::rpfInterfaceHasChanged(), and inet::PimDm::unroutableMulticastPacketArrived().

◆ changed()

void inet::Ipv4MulticastRoute::changed ( int  fieldCode)
protected
234 {
235  if (rt)
236  rt->multicastRouteChanged(this, fieldCode);
237 }

Referenced by addOutInterface(), clearOutInterfaces(), removeOutInterface(), and setInInterface().

◆ clearOutInterfaces()

void inet::Ipv4MulticastRoute::clearOutInterfaces ( )
overridevirtual

Implements inet::IMulticastRoute.

180 {
181  if (!outInterfaces.empty()) {
182  for (auto& elem : outInterfaces)
183  delete elem;
184  outInterfaces.clear();
185  changed(F_OUT);
186  }
187 }

◆ detailedInfo()

std::string inet::Ipv4MulticastRoute::detailedInfo ( ) const
virtual
166 {
167  return str();
168 }

◆ getInInterface()

◆ getMetric()

int inet::Ipv4MulticastRoute::getMetric ( ) const
inlineoverridevirtual

◆ getMulticastGroup()

◆ getMulticastGroupAsGeneric()

virtual L3Address inet::Ipv4MulticastRoute::getMulticastGroupAsGeneric ( ) const
inlineoverridevirtual

Multicast group address.

Implements inet::IMulticastRoute.

227 { return getMulticastGroup(); }

◆ getNumOutInterfaces()

◆ getOrigin()

◆ getOriginAsGeneric()

virtual L3Address inet::Ipv4MulticastRoute::getOriginAsGeneric ( ) const
inlineoverridevirtual

Source address prefix to match.

Implements inet::IMulticastRoute.

225 { return getOrigin(); }

◆ getOriginNetmask()

◆ getOutInterface()

◆ getPrefixLength()

virtual int inet::Ipv4MulticastRoute::getPrefixLength ( ) const
inlineoverridevirtual

Prefix length to match.

Implements inet::IMulticastRoute.

226 { return getOriginNetmask().getNetmaskLength(); } // TODO inconsistent naming

◆ getRoutingTable()

◆ getRoutingTableAsGeneric()

IRoutingTable * inet::Ipv4MulticastRoute::getRoutingTableAsGeneric ( ) const
overridevirtual

The routing table in which this route is inserted, or nullptr.

Implements inet::IMulticastRoute.

190 {
191  return getRoutingTable();
192 }

◆ getSource()

◆ getSourceType()

SourceType inet::Ipv4MulticastRoute::getSourceType ( ) const
inlineoverridevirtual

Source of route.

MANUAL (read from file), from routing protocol, etc

Implements inet::IMulticastRoute.

209 { return sourceType; }

Referenced by inet::Ipv4NetworkConfigurator::configureRoutingTable().

◆ isEnabled()

virtual bool inet::Ipv4MulticastRoute::isEnabled ( ) const
inlineoverridevirtual

Disabled entries are ignored by routing until the became enabled again.

Implements inet::IMulticastRoute.

223 { return true; /*TODO isEnabled();*/ }

◆ isExpired()

virtual bool inet::Ipv4MulticastRoute::isExpired ( ) const
inlineoverridevirtual

Expired entries are ignored by routing, and may be periodically purged.

Implements inet::IMulticastRoute.

224 { return !isValid(); } // TODO rename Ipv4 method

◆ isValid()

virtual bool inet::Ipv4MulticastRoute::isValid ( ) const
inlinevirtual

test validity of route entry, e.g.

check expiry

171 { return true; }

Referenced by inet::Ipv4RoutingTable::purge().

◆ matches()

virtual bool inet::Ipv4MulticastRoute::matches ( const Ipv4Address origin,
const Ipv4Address group 
) const
inlinevirtual
174  {
175  return (this->group.isUnspecified() || this->group == group) &&
177  }

◆ operator=()

Ipv4MulticastRoute& inet::Ipv4MulticastRoute::operator= ( const Ipv4MulticastRoute obj)
private

◆ removeOutInterface() [1/2]

bool inet::Ipv4MulticastRoute::removeOutInterface ( const NetworkInterface ie)
overridevirtual

Implements inet::IMulticastRoute.

213 {
214  for (auto it = outInterfaces.begin(); it != outInterfaces.end(); ++it) {
215  if ((*it)->getInterface() == ie) {
216  delete *it;
217  outInterfaces.erase(it);
218  changed(F_OUT);
219  return true;
220  }
221  }
222  return false;
223 }

Referenced by inet::Ipv4RoutingTable::deleteInterfaceRoutes(), inet::PimSm::Route::removeDownstreamInterface(), and inet::PimDm::rpfInterfaceHasChanged().

◆ removeOutInterface() [2/2]

void inet::Ipv4MulticastRoute::removeOutInterface ( unsigned int  i)
overridevirtual

Implements inet::IMulticastRoute.

226 {
227  OutInterface *outInterface = outInterfaces.at(i);
228  delete outInterface;
229  outInterfaces.erase(outInterfaces.begin() + i);
230  changed(F_OUT);
231 }

◆ setEnabled()

virtual void inet::Ipv4MulticastRoute::setEnabled ( bool  enabled)
inlineoverridevirtual

Implements inet::IMulticastRoute.

218 { /*TODO setEnabled(enabled);*/ }

◆ setInInterface()

void inet::Ipv4MulticastRoute::setInInterface ( InInterface *  _inInterface)
overridevirtual

◆ setMetric()

virtual void inet::Ipv4MulticastRoute::setMetric ( int  _metric)
inlineoverridevirtual

◆ setMulticastGroup() [1/2]

virtual void inet::Ipv4MulticastRoute::setMulticastGroup ( const L3Address group)
inlineoverridevirtual

Implements inet::IMulticastRoute.

221 { setMulticastGroup(group.toIpv4()); }

Referenced by setMulticastGroup().

◆ setMulticastGroup() [2/2]

◆ setOrigin() [1/2]

virtual void inet::Ipv4MulticastRoute::setOrigin ( const L3Address origin)
inlineoverridevirtual

Implements inet::IMulticastRoute.

219 { setOrigin(origin.toIpv4()); }

Referenced by setOrigin().

◆ setOrigin() [2/2]

◆ setOriginNetmask()

◆ setPrefixLength()

virtual void inet::Ipv4MulticastRoute::setPrefixLength ( int  len)
inlineoverridevirtual

Implements inet::IMulticastRoute.

220 { setOriginNetmask(Ipv4Address::makeNetmask(len)); } // TODO inconsistent naming

◆ setRoutingTable()

virtual void inet::Ipv4MulticastRoute::setRoutingTable ( IIpv4RoutingTable rt)
inlinevirtual

To be called by the routing table when this route is added or removed from it.

167 { this->rt = rt; }

Referenced by inet::Ipv4RoutingTable::internalAddMulticastRoute(), and inet::Ipv4RoutingTable::removeMulticastRoute().

◆ setSource()

void inet::Ipv4MulticastRoute::setSource ( cObject *  _source)
inlineoverridevirtual

◆ setSourceType()

◆ str()

std::string inet::Ipv4MulticastRoute::str ( ) const
overridevirtual
125 {
126  std::stringstream out;
127 
128  out << "origin:";
129  if (origin.isUnspecified())
130  out << "* ";
131  else
132  out << origin << " ";
133  out << "mask:";
135  out << "* ";
136  else
137  out << originNetmask << " ";
138  out << "group:";
139  if (group.isUnspecified())
140  out << "* ";
141  else
142  out << group << " ";
143  out << "metric:" << metric << " ";
144  out << "in:";
145  if (!inInterface)
146  out << "* ";
147  else
148  out << inInterface->getInterface()->getInterfaceName() << " ";
149  out << "out:";
150  bool first = true;
151  for (auto& elem : outInterfaces) {
152  if (!first)
153  out << ",";
154  if (elem->isEnabled()) {
155  out << elem->getInterface()->getInterfaceName();
156  first = false;
157  }
158  }
159 
161 
162  return out.str();
163 }

Referenced by detailedInfo().

Member Data Documentation

◆ group

Ipv4Address inet::Ipv4MulticastRoute::group
private

Multicast group, if unspecified then matches any.

Referenced by str().

◆ inInterface

InInterface* inet::Ipv4MulticastRoute::inInterface
private

In interface (upstream)

Referenced by setInInterface(), str(), and ~Ipv4MulticastRoute().

◆ metric

int inet::Ipv4MulticastRoute::metric
private

Metric ("cost" to reach the source)

Referenced by str().

◆ origin

Ipv4Address inet::Ipv4MulticastRoute::origin
private

Source network.

Referenced by str().

◆ originNetmask

Ipv4Address inet::Ipv4MulticastRoute::originNetmask
private

Source network mask.

Referenced by str().

◆ outInterfaces

OutInterfaceVector inet::Ipv4MulticastRoute::outInterfaces
private

Out interfaces (downstream)

Referenced by addOutInterface(), clearOutInterfaces(), removeOutInterface(), str(), and ~Ipv4MulticastRoute().

◆ rt

IIpv4RoutingTable* inet::Ipv4MulticastRoute::rt
private

the routing table in which this route is inserted, or nullptr

Referenced by changed().

◆ source

cObject* inet::Ipv4MulticastRoute::source
private

Object identifying the source.

◆ sourceType

SourceType inet::Ipv4MulticastRoute::sourceType
private

manual, routing prot, etc.

Referenced by str().


The documentation for this class was generated from the following files:
inet::Ipv4MulticastRoute::source
cObject * source
Object identifying the source.
Definition: Ipv4Route.h:145
inet::Ipv4MulticastRoute::metric
int metric
Metric ("cost" to reach the source)
Definition: Ipv4Route.h:146
inet::Ipv4MulticastRoute::F_MULTICASTGROUP
@ F_MULTICASTGROUP
Definition: Ipv4Route.h:150
inet::Ipv4MulticastRoute::getMulticastGroup
Ipv4Address getMulticastGroup() const
Multicast group address.
Definition: Ipv4Route.h:197
inet::IIpv4RoutingTable::multicastRouteChanged
virtual void multicastRouteChanged(Ipv4MulticastRoute *entry, int fieldCode)=0
To be called from multicast route objects whenever a field changes.
inet::Ipv4MulticastRoute::setOrigin
virtual void setOrigin(Ipv4Address _origin)
Definition: Ipv4Route.h:179
inet::Ipv4Address::getNetmaskLength
int getNetmaskLength() const
Counts 1 bits in a netmask.
Definition: Ipv4Address.cc:234
inet::Ipv4MulticastRoute::getRoutingTable
IIpv4RoutingTable * getRoutingTable() const
Definition: Ipv4Route.h:168
inet::NetworkInterface::getInterfaceName
const char * getInterfaceName() const
Definition: NetworkInterface.h:233
inet::IMulticastRoute::InInterface::getInterface
NetworkInterface * getInterface() const
Definition: IRoute.h:180
inet::Ipv4MulticastRoute::F_OUT
@ F_OUT
Definition: Ipv4Route.h:150
inet::Ipv4MulticastRoute::setOriginNetmask
virtual void setOriginNetmask(Ipv4Address _netmask)
Definition: Ipv4Route.h:180
inet::Ipv4MulticastRoute::str
virtual std::string str() const override
Definition: Ipv4Route.cc:124
inet::Ipv4MulticastRoute::sourceType
SourceType sourceType
manual, routing prot, etc.
Definition: Ipv4Route.h:144
inet::Ipv4MulticastRoute::origin
Ipv4Address origin
Source network.
Definition: Ipv4Route.h:139
inet::Ipv4MulticastRoute::getOrigin
Ipv4Address getOrigin() const
Source address prefix to match.
Definition: Ipv4Route.h:191
inet::Ipv4MulticastRoute::F_SOURCE
@ F_SOURCE
Definition: Ipv4Route.h:150
inet::Ipv4MulticastRoute::F_ORIGINMASK
@ F_ORIGINMASK
Definition: Ipv4Route.h:150
inet::Ipv4MulticastRoute::group
Ipv4Address group
Multicast group, if unspecified then matches any.
Definition: Ipv4Route.h:141
inet::Ipv4MulticastRoute::rt
IIpv4RoutingTable * rt
the routing table in which this route is inserted, or nullptr
Definition: Ipv4Route.h:138
inet::Ipv4MulticastRoute::inInterface
InInterface * inInterface
In interface (upstream)
Definition: Ipv4Route.h:142
inet::Ipv4Address::maskedAddrAreEqual
static bool maskedAddrAreEqual(const Ipv4Address &addr1, const Ipv4Address &addr2, const Ipv4Address &netmask)
Test if the masked addresses (ie the mask is applied to addr1 and addr2) are equal.
Definition: Ipv4Address.cc:249
inet::Ipv4Address::makeNetmask
static Ipv4Address makeNetmask(int length)
Creates and returns a netmask with the given length.
Definition: Ipv4Address.h:329
inet::Ipv4MulticastRoute::F_ORIGIN
@ F_ORIGIN
Definition: Ipv4Route.h:150
inet::Ipv4MulticastRoute::setMulticastGroup
virtual void setMulticastGroup(Ipv4Address _group)
Definition: Ipv4Route.h:181
inet::IMulticastRoute::sourceTypeName
static const char * sourceTypeName(SourceType sourceType)
Definition: IRoute.cc:64
inet::Ipv4MulticastRoute::originNetmask
Ipv4Address originNetmask
Source network mask.
Definition: Ipv4Route.h:140
inet::IMulticastRoute::MANUAL
@ MANUAL
manually added static route
Definition: IRoute.h:166
inet::Ipv4MulticastRoute::getOriginNetmask
Ipv4Address getOriginNetmask() const
Represents length of prefix to match.
Definition: Ipv4Route.h:194
inet::physicallayer::k
const double k
Definition: Qam1024Modulation.cc:14
inet::Ipv4MulticastRoute::outInterfaces
OutInterfaceVector outInterfaces
Out interfaces (downstream)
Definition: Ipv4Route.h:143
inet::Ipv4MulticastRoute::isValid
virtual bool isValid() const
test validity of route entry, e.g.
Definition: Ipv4Route.h:171
inet::Ipv4MulticastRoute::F_IN
@ F_IN
Definition: Ipv4Route.h:150
inet::Ipv4Address::isUnspecified
bool isUnspecified() const
True if all four address bytes are zero.
Definition: Ipv4Address.h:165
inet::Ipv4MulticastRoute::F_METRIC
@ F_METRIC
Definition: Ipv4Route.h:150
inet::Ipv4MulticastRoute::F_LAST
@ F_LAST
Definition: Ipv4Route.h:150
inet::Ipv4MulticastRoute::changed
void changed(int fieldCode)
Definition: Ipv4Route.cc:233