INET Framework for OMNeT++/OMNEST
inet::eigrp::EigrpRtpT< IPAddress > Class Template Reference

Class represents Reliable Transport Protocol for reliable transmission of EIGRP messages. More...

#include <EigrpRtp.h>

Inheritance diagram for inet::eigrp::EigrpRtpT< IPAddress >:

Classes

struct  NeighborInfo
 

Public Member Functions

 EigrpRtpT ()
 
virtual ~EigrpRtpT ()
 

Protected Member Functions

virtual void initialize (int stage)
 
virtual void handleMessage (cMessage *msg)
 
virtual int numInitStages () const
 
void initialize (int stage)
 
void initialize (int stage)
 

Private Types

typedef std::list< EigrpMsgReq * > MessageQueue
 

Private Member Functions

void processRequest (cMessage *msg)
 Process request for message sending. More...
 
void processHeader (cMessage *msg)
 Process message header for ensuring reliable transmission. More...
 
void scheduleNextMsg (int ifaceId)
 Schedule sending next reliable/unreliable message in transmission queue. More...
 
void scheduleNewMsg (EigrpMsgReq *msgReq)
 Schedule new request for sending message. More...
 
void sendMsg (EigrpMsgReq *msgReq)
 Send reliable/unreliable message. More...
 
void sendRelMsg (EigrpMsgReq *msgReq)
 Send reliable message. More...
 
void sendUnrelMsg (EigrpMsgReq *msgReq)
 Send unreliable message. More...
 
void discardMsg (EigrpMsgReq *msgReq)
 Delete request. More...
 
EigrpNeighbor< IPAddress > * getNeighborId (cMessage *msg)
 Return informations about neighbor. More...
 
void acknowledgeMsg (int neighId, int ifaceId, uint32_t ackNum)
 Send message with specified acknowledge number to neighbor. More...
 
EigrpNeighbor< Ipv4Address > * getNeighborId (cMessage *msg)
 
EigrpNeighbor< Ipv6Address > * getNeighborId (cMessage *msg)
 

Private Attributes

const char * RTP_OUTPUT_GW
 
uint32_t seqNumber
 Sequence number for reliable transport of messages. More...
 
EigrpRequestQueuerequestQ
 
EigrpInterfaceTableeigrpIft
 
EigrpNeighborTable< IPAddress > * eigrpNt
 

Detailed Description

template<typename IPAddress>
class inet::eigrp::EigrpRtpT< IPAddress >

Class represents Reliable Transport Protocol for reliable transmission of EIGRP messages.

Member Typedef Documentation

◆ MessageQueue

template<typename IPAddress >
typedef std::list<EigrpMsgReq *> inet::eigrp::EigrpRtpT< IPAddress >::MessageQueue
private

Constructor & Destructor Documentation

◆ EigrpRtpT()

template<typename IPAddress >
inet::eigrp::EigrpRtpT< IPAddress >::EigrpRtpT
214 {
215  RTP_OUTPUT_GW = "pdmOut";
216 }

◆ ~EigrpRtpT()

template<typename IPAddress >
inet::eigrp::EigrpRtpT< IPAddress >::~EigrpRtpT
virtual
220 {
221  delete requestQ;
222 }

Member Function Documentation

◆ acknowledgeMsg()

template<typename IPAddress >
void inet::eigrp::EigrpRtpT< IPAddress >::acknowledgeMsg ( int  neighId,
int  ifaceId,
uint32_t  ackNum 
)
private

Send message with specified acknowledge number to neighbor.

341 {
342  EigrpMsgReq *msgReq = nullptr;
343 
344  /*if ((msgReq = requestQ->findReqByIf(ifaceId, false)) != nullptr && msgReq->getDestNeighbor() == neighId)
345  { // Use scheduled message as acknowledge
346  EV_DEBUG << "EIGRP RTP: do not create Ack message, use existing message to neighbor " << neighId << endl;
347  msgReq->setAckNumber(ackNum);
348  }
349  else*/
350  // Create Ack message and send it
351  msgReq = new EigrpMsgReq("Ack");
352  msgReq->setOpcode(EIGRP_HELLO_MSG);
353  msgReq->setDestNeighbor(neighId);
354  msgReq->setDestInterface(ifaceId);
355  msgReq->setAckNumber(ackNum);
356 
357  scheduleNewMsg(msgReq);
358 }

◆ discardMsg()

template<typename IPAddress >
void inet::eigrp::EigrpRtpT< IPAddress >::discardMsg ( EigrpMsgReq msgReq)
private

Delete request.

420 {
421  EV_DEBUG << "EIGRP RTP: discard message " << eigrpRtp::UserMsgs[msgReq->getOpcode()] << endl;
422  requestQ->removeReq(msgReq);
423  delete msgReq;
424 
425  scheduleNextMsg(msgReq->getDestInterface());
426 }

◆ getNeighborId() [1/3]

template<typename IPAddress >
EigrpNeighbor<IPAddress>* inet::eigrp::EigrpRtpT< IPAddress >::getNeighborId ( cMessage *  msg)
private

Return informations about neighbor.

◆ getNeighborId() [2/3]

EigrpNeighbor< Ipv4Address > * inet::eigrp::EigrpRtpT< Ipv4Address >::getNeighborId ( cMessage *  msg)
private
362 {
363  Packet *packet = check_and_cast<Packet *>(msg);
364  Ipv4Address srcAddr = packet->getTag<L3AddressInd>()->getSrcAddress().toIpv4();
365 
366  return eigrpNt->findNeighbor(srcAddr);
367 }

◆ getNeighborId() [3/3]

EigrpNeighbor< Ipv6Address > * inet::eigrp::EigrpRtpT< Ipv6Address >::getNeighborId ( cMessage *  msg)
private
372 {
373  Packet *packet = check_and_cast<Packet *>(msg);
374  Ipv6Address srcAddr = packet->getTag<L3AddressInd>()->getSrcAddress().toIpv6();
375 
376  return eigrpNt->findNeighbor(srcAddr);
377 }

◆ handleMessage()

template<typename IPAddress >
void inet::eigrp::EigrpRtpT< IPAddress >::handleMessage ( cMessage *  msg)
protectedvirtual
264 {
265 
266  if (msg->isSelfMessage()) { // Timer
267  }
268  else {
269  if (dynamic_cast<EigrpMsgReq *>(msg) != nullptr) { // EIGRP message request
270  processRequest(msg);
271 
272  // Do not delete msg
273  }
274  else { // Process EIGRP header
275  processHeader(msg);
276 
277  delete msg;
278  }
279  }
280 }

◆ initialize() [1/3]

template<typename IPAddress >
virtual void inet::eigrp::EigrpRtpT< IPAddress >::initialize ( int  stage)
protectedvirtual

◆ initialize() [2/3]

void inet::eigrp::EigrpRtpT< Ipv4Address >::initialize ( int  stage)
protected
226 {
227  cSimpleModule::initialize(stage);
228  if (stage == INITSTAGE_ROUTING_PROTOCOLS) {
229  seqNumber = 1;
230 
231 // this->eigrpIft = EigrpIfTableAccess().get();
232 // this->eigrpNt = Eigrpv4NeighTableAccess().get();
233  eigrpIft = check_and_cast<EigrpInterfaceTable *>(getModuleByPath("^.eigrpInterfaceTable"));
234  eigrpNt = check_and_cast<EigrpIpv4NeighborTable *>(getModuleByPath("^.eigrpIpv4NeighborTable"));
235 
236  requestQ = new EigrpRequestQueue();
237 
238 // WATCH_PTRLIST(requestQ->reqQueue);
239  }
240 }

◆ initialize() [3/3]

void inet::eigrp::EigrpRtpT< Ipv6Address >::initialize ( int  stage)
protected
245 {
246  cSimpleModule::initialize(stage);
247  if (stage == INITSTAGE_ROUTING_PROTOCOLS) {
248  seqNumber = 1;
249 
250 // this->eigrpIft = EigrpIfTable6Access().get();
251 // this->eigrpNt = Eigrpv6NeighTableAccess().get();
252  eigrpIft = check_and_cast<EigrpInterfaceTable *>(getModuleByPath("^.eigrpInterfaceTable6"));
253  eigrpNt = check_and_cast<EigrpIpv6NeighborTable *>(getModuleByPath("^.eigrpIpv6NeighborTable"));
254  requestQ = new EigrpRequestQueue();
255 
256 // WATCH_PTRLIST(requestQ->reqQueue);
257  }
258 }

◆ numInitStages()

template<typename IPAddress >
virtual int inet::eigrp::EigrpRtpT< IPAddress >::numInitStages ( ) const
inlineprotectedvirtual
127 { return NUM_INIT_STAGES; }

◆ processHeader()

template<typename IPAddress >
void inet::eigrp::EigrpRtpT< IPAddress >::processHeader ( cMessage *  msg)
private

Process message header for ensuring reliable transmission.

292 {
293  Packet *pk = check_and_cast<Packet *>(msg);
294  const auto& header = pk->peekAtFront<EigrpMessage>();
295  uint32_t seqNumNeigh; // Sequence number of neighbor
296  uint32_t ackNum; // Acknowledge number
297  EigrpMsgReq *msgReq = nullptr;
298  int numOfAck;
299  EigrpNeighbor<IPAddress> *neigh = nullptr;
300  EigrpInterface *eigrpIface = nullptr;
301 
302  if ((neigh = getNeighborId(msg)) == nullptr)
303  return;
304 
305 // EV_DEBUG << "EIGRP RTP: received " << eigrpRtp::UserMsgs[header->getOpcode()] << " message for processing" << endl;
306  //header->getOpcode() == EIGRP_UPDATE_MSG
307  seqNumNeigh = header->getSeqNum();
308  ackNum = header->getAckNum();
309 
310  if (ackNum != 0) { // Acknowledge of message
311  if ((msgReq = requestQ->findReqBySeq(ackNum)) != nullptr && neigh->getAck() == ackNum) { // Record ack
312  neigh->setAck(0);
313  numOfAck = msgReq->getNumOfAck();
314  msgReq->setNumOfAck(--numOfAck);
315 
316  if (numOfAck == 0) { // All acknowledges received
317  eigrpIface = eigrpIft->findInterfaceById(neigh->getIfaceId());
318  eigrpIface->decPendingMsgs();
319 
320  // Delete request
321  requestQ->removeReq(msgReq);
322  delete msgReq;
323  msgReq = nullptr;
324 
325  scheduleNextMsg(neigh->getIfaceId());
326  }
327  }
328  // else do nothing (wrong message ack)
329  }
330 
331  if (seqNumNeigh != 0) { // Received message must be acknowledged
332  // Store last sequence number from neighbor
333  neigh->setSeqNumber(seqNumNeigh);
334 
335  acknowledgeMsg(neigh->getNeighborId(), neigh->getIfaceId(), seqNumNeigh);
336  }
337 }

◆ processRequest()

template<typename IPAddress >
void inet::eigrp::EigrpRtpT< IPAddress >::processRequest ( cMessage *  msg)
private

Process request for message sending.

284 {
285  EigrpMsgReq *msgReq = check_and_cast<EigrpMsgReq *>(msg);
286 
287  scheduleNewMsg(msgReq);
288 }

◆ scheduleNewMsg()

template<typename IPAddress >
void inet::eigrp::EigrpRtpT< IPAddress >::scheduleNewMsg ( EigrpMsgReq msgReq)
private

Schedule new request for sending message.

383 {
384  requestQ->pushReq(msgReq);
385 
386  EV_DEBUG << "EIGRP RTP: enqueue " << eigrpRtp::UserMsgs[msgReq->getOpcode()];
387  if (msgReq->getOpcode() == EIGRP_HELLO_MSG && msgReq->getAckNumber() != 0)
388  EV_DEBUG << " (ack) ";
389  EV_DEBUG << " on IF: " << msgReq->getDestInterface() << endl;
390 
391  scheduleNextMsg(msgReq->getDestInterface());
392 }

◆ scheduleNextMsg()

template<typename IPAddress >
void inet::eigrp::EigrpRtpT< IPAddress >::scheduleNextMsg ( int  ifaceId)
private

Schedule sending next reliable/unreliable message in transmission queue.

396 {
397  EigrpMsgReq *msgReq = nullptr;
398  EigrpInterface *eigrpIface = eigrpIft->findInterfaceById(ifaceId);
399 
400  if (eigrpIface == nullptr) {
401  requestQ->removeAllMsgsToIf(ifaceId);
402  return;
403  }
404 
405  if (eigrpIface->getPendingMsgs() == 0) { // Try to send first rel/unrel message
406  if ((msgReq = requestQ->findReqByIf(ifaceId)) != nullptr) {
407  ASSERT(msgReq->getNumOfAck() == 0);
408  sendMsg(msgReq);
409  }
410  }
411  else { // Try to send first unrel message
412  if ((msgReq = requestQ->findUnrelReqByIf(ifaceId)) != nullptr) {
413  sendUnrelMsg(msgReq);
414  }
415  }
416 }

◆ sendMsg()

template<typename IPAddress >
void inet::eigrp::EigrpRtpT< IPAddress >::sendMsg ( EigrpMsgReq msgReq)
private

Send reliable/unreliable message.

441 {
442  if (msgReq->isMsgReliable()) { // Reliable
443  sendRelMsg(msgReq);
444  }
445  else { // Unreliable
446  sendUnrelMsg(msgReq);
447  }
448 }

◆ sendRelMsg()

template<typename IPAddress >
void inet::eigrp::EigrpRtpT< IPAddress >::sendRelMsg ( EigrpMsgReq msgReq)
private

Send reliable message.

452 {
453  NeighborInfo info;
454  EigrpMsgReq *msgToSend = nullptr;
455  EigrpNeighbor<IPAddress> *neigh = nullptr;
456  EigrpInterface *eigrpIface = nullptr;
457 
458  info.neighborId = msgReq->getDestNeighbor();
459  info.neighborIfaceId = msgReq->getDestInterface();
460 
461  if (msgReq->getSeqNumber() == 0) { // Add sequence number
462  msgReq->setSeqNumber(seqNumber);
463  seqNumber++;
464  }
465 
466  if (info.neighborId != 0) { // Unicast
467  if ((neigh = eigrpNt->findNeighborById(info.neighborId)) == nullptr) {
468  requestQ->removeAllMsgsToNeigh(info.neighborId);
469  discardMsg(msgReq);
470  return;
471  }
472  info.numOfAck = 1;
473  neigh->setAck(msgReq->getSeqNumber());
474  info.lastSeqNum = neigh->getSeqNumber();
475  }
476  else { // Multicast
477  info.numOfAck = eigrpNt->setAckOnIface(info.neighborIfaceId, msgReq->getSeqNumber());
478  info.lastSeqNum = 0; // Multicast message can not be an ack
479  }
480 
481  eigrpIface = eigrpIft->findInterfaceById(info.neighborIfaceId);
482  eigrpIface->incPendingMsgs();
483 
484  // Add last sequence number from neighbor
485  msgReq->setAckNumber(info.lastSeqNum);
486  msgReq->setNumOfAck(info.numOfAck);
487 
488  // Request and message must be duplicated (PDM deletes request and sends message)
489  msgToSend = msgReq->dup();
490  send(msgToSend, RTP_OUTPUT_GW);
491 
492  scheduleNextMsg(info.neighborIfaceId);
493 }

◆ sendUnrelMsg()

template<typename IPAddress >
void inet::eigrp::EigrpRtpT< IPAddress >::sendUnrelMsg ( EigrpMsgReq msgReq)
private

Send unreliable message.

430 {
431  int ifaceId = msgReq->getDestInterface();
432 
433  requestQ->removeReq(msgReq);
434  send(msgReq, RTP_OUTPUT_GW); /* Do not duplicate EigrpMsgReq */
435  // Schedule next waiting message
436  scheduleNextMsg(ifaceId);
437 }

Member Data Documentation

◆ eigrpIft

template<typename IPAddress >
EigrpInterfaceTable* inet::eigrp::EigrpRtpT< IPAddress >::eigrpIft
private

◆ eigrpNt

template<typename IPAddress >
EigrpNeighborTable<IPAddress>* inet::eigrp::EigrpRtpT< IPAddress >::eigrpNt
private

◆ requestQ

template<typename IPAddress >
EigrpRequestQueue* inet::eigrp::EigrpRtpT< IPAddress >::requestQ
private

◆ RTP_OUTPUT_GW

template<typename IPAddress >
const char* inet::eigrp::EigrpRtpT< IPAddress >::RTP_OUTPUT_GW
private

◆ seqNumber

template<typename IPAddress >
uint32_t inet::eigrp::EigrpRtpT< IPAddress >::seqNumber
private

Sequence number for reliable transport of messages.


The documentation for this class was generated from the following files:
inet::eigrp::EigrpRtpT::sendRelMsg
void sendRelMsg(EigrpMsgReq *msgReq)
Send reliable message.
Definition: EigrpRtp.cc:451
inet::eigrp::EigrpInterface::decPendingMsgs
void decPendingMsgs()
Definition: EigrpInterfaceTable.h:117
inet::eigrp::EigrpRtpT::getNeighborId
EigrpNeighbor< IPAddress > * getNeighborId(cMessage *msg)
Return informations about neighbor.
inet::eigrp::EigrpRequestQueue::findReqByIf
EigrpMsgReq * findReqByIf(int ifaceId, bool sent=true)
Get first rel/unrel message with given interface ID from request Queue.
Definition: EigrpRtp.cc:105
inet::eigrp::EigrpRtpT::sendUnrelMsg
void sendUnrelMsg(EigrpMsgReq *msgReq)
Send unreliable message.
Definition: EigrpRtp.cc:429
inet::eigrp::EigrpRequestQueue::findUnrelReqByIf
EigrpMsgReq * findUnrelReqByIf(int ifaceId)
Get first unrel message with given interface ID from request Queue.
Definition: EigrpRtp.cc:136
inet::eigrp::EigrpRequestQueue::findReqBySeq
EigrpMsgReq * findReqBySeq(uint32_t seqNumber)
Definition: EigrpRtp.cc:147
inet::eigrp::EigrpRtpT::processHeader
void processHeader(cMessage *msg)
Process message header for ensuring reliable transmission.
Definition: EigrpRtp.cc:291
inet::eigrp::EigrpRtpT::RTP_OUTPUT_GW
const char * RTP_OUTPUT_GW
Definition: EigrpRtp.h:72
L3AddressInd
removed DscpReq Ipv4ControlInfo Ipv6ControlInfo up L3AddressInd L3AddressInd
Definition: IUdp-gates.txt:20
inet::EIGRP_HELLO_MSG
@ EIGRP_HELLO_MSG
Definition: EigrpMessage_m.h:93
inet::eigrp::EigrpRtpT::acknowledgeMsg
void acknowledgeMsg(int neighId, int ifaceId, uint32_t ackNum)
Send message with specified acknowledge number to neighbor.
Definition: EigrpRtp.cc:340
inet::eigrp::EigrpRtpT::scheduleNextMsg
void scheduleNextMsg(int ifaceId)
Schedule sending next reliable/unreliable message in transmission queue.
Definition: EigrpRtp.cc:395
inet::eigrp::EigrpInterfaceTable::findInterfaceById
EigrpInterface * findInterfaceById(int ifaceId)
Gets interface from table by interface ID.
Definition: EigrpInterfaceTable.cc:155
inet::eigrp::EigrpRtpT::processRequest
void processRequest(cMessage *msg)
Process request for message sending.
Definition: EigrpRtp.cc:283
inet::eigrp::EigrpRequestQueue::pushReq
void pushReq(EigrpMsgReq *req)
Definition: EigrpRtp.cc:157
inet::eigrp::EigrpInterface::incPendingMsgs
void incPendingMsgs()
Definition: EigrpInterfaceTable.h:116
inet::eigrp::EigrpRequestQueue::removeAllMsgsToIf
void removeAllMsgsToIf(int ifaceId)
Delete all messages with given destination interface ID (fall of interface,...).
Definition: EigrpRtp.cc:183
inet::eigrp::EigrpRtpT::discardMsg
void discardMsg(EigrpMsgReq *msgReq)
Delete request.
Definition: EigrpRtp.cc:419
inet::eigrp::eigrpRtp::UserMsgs
const char * UserMsgs[]
Definition: EigrpRtp.cc:48
inet::eigrp::EigrpRequestQueue::removeAllMsgsToNeigh
void removeAllMsgsToNeigh(int ifaceId)
Delete all messages with given destination neighbor ID (end of neighborship,...).
Definition: EigrpRtp.cc:199
inet::eigrp::EigrpRtpT::eigrpIft
EigrpInterfaceTable * eigrpIft
Definition: EigrpRtp.h:78
NUM_INIT_STAGES
#define NUM_INIT_STAGES
Definition: InitStageRegistry.h:73
inet::eigrp::EigrpRtpT::sendMsg
void sendMsg(EigrpMsgReq *msgReq)
Send reliable/unreliable message.
Definition: EigrpRtp.cc:440
inet::eigrp::EigrpRtpT::scheduleNewMsg
void scheduleNewMsg(EigrpMsgReq *msgReq)
Schedule new request for sending message.
Definition: EigrpRtp.cc:382
inet::eigrp::EigrpRequestQueue::removeReq
EigrpMsgReq * removeReq(EigrpMsgReq *msgReq)
Definition: EigrpRtp.cc:165
inet::eigrp::EigrpRtpT::seqNumber
uint32_t seqNumber
Sequence number for reliable transport of messages.
Definition: EigrpRtp.h:74
inet::eigrp::EigrpRtpT::requestQ
EigrpRequestQueue * requestQ
Definition: EigrpRtp.h:76
inet::INITSTAGE_ROUTING_PROTOCOLS
INET_API InitStage INITSTAGE_ROUTING_PROTOCOLS
Initialization of routing protocols.
inet::eigrp::EigrpRtpT::eigrpNt
EigrpNeighborTable< IPAddress > * eigrpNt
Definition: EigrpRtp.h:79