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

Compound module for PIM protocol (RFC 4601). More...

#include <Pim.h>

Inheritance diagram for inet::Pim:
inet::RoutingProtocolBase inet::OperationalBase inet::OperationalMixin< cSimpleModule > inet::ILifecycle

Public Member Functions

 Pim ()
 
virtual ~Pim ()
 
CrcMode getCrcMode ()
 
- 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 ()
 

Static Public Member Functions

static void insertCrc (const Ptr< PimPacket > &pimPacket)
 
static void insertCrc (const Protocol *networkProtocol, const L3Address &srcAddress, const L3Address &destAddress, const Ptr< PimPacket > &pimPacket)
 
static bool verifyCrc (const Protocol *networkProtocol, const Ptr< const PimPacket > &pimPacket, Packet *packet)
 
static uint16_t computeCrc (const Protocol *networkProtocol, const L3Address &srcAddress, const L3Address &destAddress, const Ptr< const PimPacket > &pimPacket)
 

Protected Member Functions

virtual int numInitStages () const override
 
virtual void initialize (int stage) override
 
virtual void handleMessageWhenUp (cMessage *msg) override
 
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 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

CrcMode crcMode = CRC_MODE_UNDEFINED
 
- Protected Attributes inherited from inet::OperationalMixin< cSimpleModule >
State operationalState
 
simtime_t lastChange
 
Operation activeOperation
 
cMessage * activeOperationTimeout
 
cMessage * activeOperationExtraTimer
 

Additional Inherited Members

- Protected Types inherited from inet::OperationalMixin< cSimpleModule >
enum  State
 

Detailed Description

Compound module for PIM protocol (RFC 4601).

Constructor & Destructor Documentation

◆ Pim()

inet::Pim::Pim ( )
inline
39 {}

◆ ~Pim()

inet::Pim::~Pim ( )
virtual
24 {
25 }

Member Function Documentation

◆ computeCrc()

uint16_t inet::Pim::computeCrc ( const Protocol networkProtocol,
const L3Address srcAddress,
const L3Address destAddress,
const Ptr< const PimPacket > &  pimPacket 
)
static
165 {
166  MemoryOutputStream stream;
167  if (networkProtocol == &Protocol::ipv6) {
168  auto pseudoHeader = makeShared<TransportPseudoHeader>();
169  pseudoHeader->setSrcAddress(srcAddress);
170  pseudoHeader->setDestAddress(destAddress);
171  pseudoHeader->setNetworkProtocolId(networkProtocol->getId());
172  pseudoHeader->setProtocolId(IP_PROT_PIM);
173  pseudoHeader->setPacketLength(pimPacket->getChunkLength());
174  pseudoHeader->setChunkLength(B(40));
175  Chunk::serialize(stream, pseudoHeader);
176  }
177  Chunk::serialize(stream, pimPacket);
178  uint16_t crc = TcpIpChecksum::checksum(stream.getData());
179  return crc;
180 }

Referenced by insertCrc(), and verifyCrc().

◆ getCrcMode()

CrcMode inet::Pim::getCrcMode ( )
inline
41 { return crcMode; }

◆ handleCrashOperation()

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

Implements inet::OperationalMixin< cSimpleModule >.

76 {
77 }

◆ handleMessageWhenUp()

void inet::Pim::handleMessageWhenUp ( cMessage *  msg)
overrideprotectedvirtual

Implements inet::OperationalMixin< cSimpleModule >.

63 {
64  throw cRuntimeError("this module doesn't allow incoming packets");
65 }

◆ handleStartOperation()

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

Implements inet::OperationalMixin< cSimpleModule >.

68 {
69 }

◆ handleStopOperation()

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

Implements inet::OperationalMixin< cSimpleModule >.

72 {
73 }

◆ initialize()

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

Reimplemented from inet::OperationalMixin< cSimpleModule >.

28 {
30 
31  if (stage == INITSTAGE_LOCAL) {
32  const char *crcModeString = par("crcMode");
33  crcMode = parseCrcMode(crcModeString, false);
34  }
35  else if (stage == INITSTAGE_TRANSPORT_LAYER) {
36  if (crcMode == CRC_COMPUTED) {
37  cModuleType *moduleType = cModuleType::get("inet.routing.pim.PimCrcInsertionHook");
38  auto crcInsertion = check_and_cast<PimCrcInsertionHook *>(moduleType->create("crcInsertion", this));
39  crcInsertion->finalizeParameters();
40  crcInsertion->callInitialize();
41 
42  // For IPv6, the checksum also includes the IPv6 "pseudo-header",
43  // as specified in RFC 2460, Section 8.1 [5]. This
44  // "pseudo-header" is prepended to the PIM header for the purposes
45  // of calculating the checksum. The "Upper-Layer Packet Length"
46  // in the pseudo-header is set to the length of the PIM message,
47  // except in Register messages where it is set to the length of
48  // the PIM register header (8). The Next Header value used in the
49  // pseudo-header is 103.
50 #ifdef INET_WITH_IPv6
51  auto ipv6 = dynamic_cast<INetfilter *>(findModuleByPath("^.ipv6.ipv6"));
52  if (ipv6 != nullptr)
53  ipv6->registerHook(0, crcInsertion);
54 #endif
55  }
56  }
57  else if (stage == INITSTAGE_ROUTING_PROTOCOLS) {
58  registerProtocol(Protocol::pim, gate("networkLayerOut"), gate("networkLayerIn"));
59  }
60 }

◆ insertCrc() [1/2]

void inet::Pim::insertCrc ( const Protocol networkProtocol,
const L3Address srcAddress,
const L3Address destAddress,
const Ptr< PimPacket > &  pimPacket 
)
static
109 {
110  CrcMode crcMode = pimPacket->getCrcMode();
111  switch (crcMode) {
112  case CRC_DISABLED:
113  // if the CRC mode is disabled, then the CRC is 0
114  pimPacket->setCrc(0x0000);
115  break;
117  // if the CRC mode is declared to be correct, then set the CRC to an easily recognizable value
118  pimPacket->setCrc(0xC00D);
119  break;
121  // if the CRC mode is declared to be incorrect, then set the CRC to an easily recognizable value
122  pimPacket->setCrc(0xBAAD);
123  break;
124  case CRC_COMPUTED: {
125  // if the CRC mode is computed, then compute the CRC and set it
126  // this computation is delayed after the routing decision, see INetfilter hook
127  pimPacket->setCrc(0x0000); // make sure that the CRC is 0 in the Udp header before computing the CRC
128  auto crc = computeCrc(networkProtocol, srcAddress, destAddress, pimPacket);
129  pimPacket->setCrc(crc);
130  break;
131  }
132  default:
133  throw cRuntimeError("Unknown CRC mode: %d", (int)crcMode);
134  }
135 }

◆ insertCrc() [2/2]

◆ numInitStages()

virtual int inet::Pim::numInitStages ( ) const
inlineoverrideprotectedvirtual
48 { return NUM_INIT_STAGES; }

◆ verifyCrc()

bool inet::Pim::verifyCrc ( const Protocol networkProtocol,
const Ptr< const PimPacket > &  pimPacket,
Packet packet 
)
static
138 {
139  switch (pimPacket->getCrcMode()) {
140  case CRC_DISABLED:
141  // if the CRC mode is disabled, then the check passes if the CRC is 0
142  return pimPacket->getCrc() == 0x0000;
143  case CRC_DECLARED_CORRECT: {
144  // if the CRC mode is declared to be correct, then the check passes if and only if the chunks are correct
145  auto totalLength = pimPacket->getChunkLength();
146  auto udpDataBytes = packet->peekDataAt(B(0), totalLength - pimPacket->getChunkLength(), Chunk::PF_ALLOW_INCORRECT);
147  return pimPacket->isCorrect() && udpDataBytes->isCorrect();
148  }
150  // if the CRC mode is declared to be incorrect, then the check fails
151  return false;
152  case CRC_COMPUTED: {
153  auto l3AddressInd = packet->getTag<L3AddressInd>();
154  auto srcAddress = l3AddressInd->getSrcAddress();
155  auto destAddress = l3AddressInd->getDestAddress();
156  auto computedCrc = computeCrc(networkProtocol, srcAddress, destAddress, pimPacket);
157  return computedCrc == 0xFFFF;
158  }
159  default:
160  throw cRuntimeError("Unknown CRC mode");
161  }
162 }

Member Data Documentation

◆ crcMode

CrcMode inet::Pim::crcMode = CRC_MODE_UNDEFINED
protected

Referenced by initialize(), and insertCrc().


The documentation for this class was generated from the following files:
inet::Protocol::ipv4
static const Protocol ipv4
Definition: Protocol.h:93
inet::Protocol::ipv6
static const Protocol ipv6
Definition: Protocol.h:94
inet::OperationalMixin< cSimpleModule >::initialize
virtual void initialize(int stage) override
Definition: OperationalMixinImpl.h:26
inet::CRC_COMPUTED
@ CRC_COMPUTED
Definition: CrcMode_m.h:59
inet::Chunk::serialize
static void serialize(MemoryOutputStream &stream, const Ptr< const Chunk > &chunk, b offset=b(0), b length=b(-1))
Serializes a chunk into the given stream.
Definition: Chunk.cc:175
L3AddressInd
removed DscpReq Ipv4ControlInfo Ipv6ControlInfo up L3AddressInd L3AddressInd
Definition: IUdp-gates.txt:20
inet::parseCrcMode
CrcMode parseCrcMode(const char *crcModeString, bool allowDisable)
Definition: CrcMode.cc:14
inet::CRC_DISABLED
@ CRC_DISABLED
Definition: CrcMode_m.h:56
inet::Pim::computeCrc
static uint16_t computeCrc(const Protocol *networkProtocol, const L3Address &srcAddress, const L3Address &destAddress, const Ptr< const PimPacket > &pimPacket)
Definition: Pim.cc:164
inet::Pim::insertCrc
static void insertCrc(const Ptr< PimPacket > &pimPacket)
Definition: Pim.cc:103
inet::Protocol::pim
static const Protocol pim
Definition: Protocol.h:103
inet::units::units::B
intscale< b, 1, 8 > B
Definition: Units.h:1168
inet::INITSTAGE_TRANSPORT_LAYER
INET_API InitStage INITSTAGE_TRANSPORT_LAYER
Initialization of transport-layer protocols.
inet::INITSTAGE_LOCAL
INET_API InitStage INITSTAGE_LOCAL
Initialization of local state that don't use or affect other modules includes:
inet::CrcMode
CrcMode
Enum generated from inet/transportlayer/common/CrcMode.msg:12 by opp_msgtool.
Definition: CrcMode_m.h:54
NUM_INIT_STAGES
#define NUM_INIT_STAGES
Definition: InitStageRegistry.h:73
inet::Chunk::PF_ALLOW_INCORRECT
@ PF_ALLOW_INCORRECT
Definition: Chunk.h:281
inet::TcpIpChecksum::checksum
static uint16_t checksum(const void *addr, unsigned int count)
Definition: TcpIpChecksum.h:33
inet::CRC_DECLARED_CORRECT
@ CRC_DECLARED_CORRECT
Definition: CrcMode_m.h:57
inet::CRC_DECLARED_INCORRECT
@ CRC_DECLARED_INCORRECT
Definition: CrcMode_m.h:58
inet::Pim::crcMode
CrcMode crcMode
Definition: Pim.h:36
inet::IP_PROT_PIM
@ IP_PROT_PIM
Definition: IpProtocolId_m.h:106
inet::registerProtocol
void registerProtocol(const Protocol &protocol, cGate *gate, ServicePrimitive servicePrimitive)
Registers a protocol primitive (PDU processing) at the given gate.
Definition: IProtocolRegistrationListener.cc:83
inet::INITSTAGE_ROUTING_PROTOCOLS
INET_API InitStage INITSTAGE_ROUTING_PROTOCOLS
Initialization of routing protocols.