INET Framework for OMNeT++/OMNEST
inet::ospfv2::LinkStateRequestHandler Class Reference

#include <LinkStateRequestHandler.h>

Inheritance diagram for inet::ospfv2::LinkStateRequestHandler:
inet::ospfv2::IMessageHandler

Public Member Functions

 LinkStateRequestHandler (Router *containingRouter)
 
void processPacket (Packet *packet, Ospfv2Interface *intf, Neighbor *neighbor) override
 
- Public Member Functions inherited from inet::ospfv2::IMessageHandler
 IMessageHandler (Router *containingRouter)
 
virtual ~IMessageHandler ()
 

Additional Inherited Members

- Protected Attributes inherited from inet::ospfv2::IMessageHandler
Routerrouter
 

Constructor & Destructor Documentation

◆ LinkStateRequestHandler()

inet::ospfv2::LinkStateRequestHandler::LinkStateRequestHandler ( Router containingRouter)
18  :
19  IMessageHandler(containingRouter)
20 {
21 }

Member Function Documentation

◆ processPacket()

void inet::ospfv2::LinkStateRequestHandler::processPacket ( Packet packet,
Ospfv2Interface intf,
Neighbor neighbor 
)
overridevirtual

Implements inet::ospfv2::IMessageHandler.

24 {
25  router->getMessageHandler()->printEvent("Link State Request packet received", intf, neighbor);
26 
27  Neighbor::NeighborStateType neighborState = neighbor->getState();
28 
29  if ((neighborState == Neighbor::EXCHANGE_STATE) ||
30  (neighborState == Neighbor::LOADING_STATE) ||
31  (neighborState == Neighbor::FULL_STATE))
32  {
33  const auto& lsRequestPacket = packet->peekAtFront<Ospfv2LinkStateRequestPacket>();
34 
35  unsigned long requestCount = lsRequestPacket->getRequestsArraySize();
36  bool error = false;
37  std::vector<Ospfv2Lsa *> lsas;
38 
39  EV_INFO << " Processing packet contents:\n";
40 
41  for (unsigned long i = 0; i < requestCount; i++) {
42  const auto& request = lsRequestPacket->getRequests(i);
43  LsaKeyType lsaKey;
44 
45  EV_INFO << " LsaRequest: type=" << request.lsType
46  << ", LSID=" << request.linkStateID
47  << ", advertisingRouter=" << request.advertisingRouter
48  << "\n";
49 
50  lsaKey.linkStateID = request.linkStateID;
51  lsaKey.advertisingRouter = request.advertisingRouter;
52 
53  Ospfv2Lsa *lsaInDatabase = router->findLSA(static_cast<Ospfv2LsaType>(request.lsType), lsaKey, intf->getArea()->getAreaID());
54 
55  if (lsaInDatabase != nullptr) {
56  lsas.push_back(lsaInDatabase);
57  }
58  else {
59  error = true;
60  neighbor->processEvent(Neighbor::BAD_LINK_STATE_REQUEST);
61  break;
62  }
63  }
64 
65  if (!error) {
66  int updatesCount = lsas.size();
67  int ttl = (intf->getType() == Ospfv2Interface::VIRTUAL) ? VIRTUAL_LINK_TTL : 1;
68  MessageHandler *messageHandler = router->getMessageHandler();
69 
70  for (int j = 0; j < updatesCount; j++) {
71  Packet *updatePacket = intf->createUpdatePacket(lsas[j]);
72  if (updatePacket != nullptr) {
73  if (intf->getType() == Ospfv2Interface::BROADCAST) {
74  if ((intf->getState() == Ospfv2Interface::DESIGNATED_ROUTER_STATE) ||
75  (intf->getState() == Ospfv2Interface::BACKUP_STATE) ||
76  (intf->getDesignatedRouter() == NULL_DESIGNATEDROUTERID))
77  {
78  messageHandler->sendPacket(updatePacket, Ipv4Address::ALL_OSPF_ROUTERS_MCAST, intf, ttl);
79  }
80  else {
81  messageHandler->sendPacket(updatePacket, Ipv4Address::ALL_OSPF_DESIGNATED_ROUTERS_MCAST, intf, ttl);
82  }
83  }
84  else {
85  if (intf->getType() == Ospfv2Interface::POINTTOPOINT) {
86  messageHandler->sendPacket(updatePacket, Ipv4Address::ALL_OSPF_ROUTERS_MCAST, intf, ttl);
87  }
88  else {
89  messageHandler->sendPacket(updatePacket, neighbor->getAddress(), intf, ttl);
90  }
91  }
92  }
93  }
94  // These update packets should not be placed on retransmission lists
95  }
96  }
97 }

Referenced by inet::ospfv2::MessageHandler::processPacket().


The documentation for this class was generated from the following files:
VIRTUAL_LINK_TTL
#define VIRTUAL_LINK_TTL
Definition: Ospfv2Common.h:36
inet::ospfv2::Neighbor::FULL_STATE
@ FULL_STATE
Definition: Ospfv2Neighbor.h:57
inet::ospfv2::MessageHandler::printEvent
void printEvent(const char *eventString, const Ospfv2Interface *onInterface=nullptr, const Neighbor *forNeighbor=nullptr) const
Definition: MessageHandler.cc:380
inet::ospfv2::Ospfv2Interface::POINTTOPOINT
@ POINTTOPOINT
Definition: Ospfv2Interface.h:32
inet::ospfv2::Neighbor::NeighborStateType
NeighborStateType
Definition: Ospfv2Neighbor.h:49
inet::ospfv2::Ospfv2Interface::DESIGNATED_ROUTER_STATE
@ DESIGNATED_ROUTER_STATE
Definition: Ospfv2Interface.h:58
inet::ospfv2::Ospfv2LsaType
Ospfv2LsaType
Enum generated from inet/routing/ospfv2/Ospfv2Packet.msg:78 by opp_msgtool.
Definition: Ospfv2Packet_m.h:282
inet::ospfv2::Router::getMessageHandler
MessageHandler * getMessageHandler()
Definition: Ospfv2Router.h:66
inet::ospfv2::NULL_DESIGNATEDROUTERID
const DesignatedRouterId NULL_DESIGNATEDROUTERID
Definition: Ospfv2Common.h:156
inet::ospfv2::Neighbor::BAD_LINK_STATE_REQUEST
@ BAD_LINK_STATE_REQUEST
Definition: Ospfv2Neighbor.h:35
inet::ospfv2::Ospfv2Interface::VIRTUAL
@ VIRTUAL
Definition: Ospfv2Interface.h:36
inet::Ipv4Address::ALL_OSPF_DESIGNATED_ROUTERS_MCAST
static const Ipv4Address ALL_OSPF_DESIGNATED_ROUTERS_MCAST
224.0.0.6 All OSPF Designated Routers
Definition: Ipv4Address.h:100
inet::ospfv2::MessageHandler::sendPacket
void sendPacket(Packet *packet, Ipv4Address destination, Ospfv2Interface *outputIf, short ttl=1)
Definition: MessageHandler.cc:303
inet::ospfv2::Neighbor::EXCHANGE_STATE
@ EXCHANGE_STATE
Definition: Ospfv2Neighbor.h:55
inet::ospfv2::Router::findLSA
Ospfv2Lsa * findLSA(Ospfv2LsaType lsaType, LsaKeyType lsaKey, AreaId areaID)
Find the LSA identified by the input lsaKey in the database.
Definition: Ospfv2Router.cc:226
inet::ospfv2::IMessageHandler::IMessageHandler
IMessageHandler(Router *containingRouter)
Definition: IMessageHandler.h:27
inet::ospfv2::Neighbor::LOADING_STATE
@ LOADING_STATE
Definition: Ospfv2Neighbor.h:56
inet::ospfv2::Ospfv2Interface::BROADCAST
@ BROADCAST
Definition: Ospfv2Interface.h:33
inet::ospfv2::IMessageHandler::router
Router * router
Definition: IMessageHandler.h:24
inet::ospfv2::Ospfv2Interface::BACKUP_STATE
@ BACKUP_STATE
Definition: Ospfv2Interface.h:57
inet::Ipv4Address::ALL_OSPF_ROUTERS_MCAST
static const Ipv4Address ALL_OSPF_ROUTERS_MCAST
224.0.0.5 All OSPF routers (DR Others)
Definition: Ipv4Address.h:99