|
INET Framework for OMNeT++/OMNEST
|
#include <LinkStateUpdateHandler.h>
◆ LinkStateUpdateHandler()
| inet::ospfv2::LinkStateUpdateHandler::LinkStateUpdateHandler |
( |
Router * |
containingRouter | ) |
|
◆ acknowledgeLSA()
224 bool sendDirectAcknowledgment =
false;
226 if (!acknowledgementFlags.floodedBackOut) {
228 if ((acknowledgementFlags.lsaIsNewer && (lsaSource == intf->getDesignatedRouter().routerID)) ||
229 (acknowledgementFlags.lsaIsDuplicate && acknowledgementFlags.impliedAcknowledgement))
231 intf->addDelayedAcknowledgement(lsaHeader);
234 if ((acknowledgementFlags.lsaIsDuplicate && !acknowledgementFlags.impliedAcknowledgement) ||
235 (acknowledgementFlags.lsaReachedMaxAge &&
236 acknowledgementFlags.noLSAInstanceInDatabase &&
237 acknowledgementFlags.anyNeighborInExchangeOrLoadingState))
239 sendDirectAcknowledgment =
true;
244 if (acknowledgementFlags.lsaIsNewer) {
245 intf->addDelayedAcknowledgement(lsaHeader);
248 if ((acknowledgementFlags.lsaIsDuplicate && !acknowledgementFlags.impliedAcknowledgement) ||
249 (acknowledgementFlags.lsaReachedMaxAge &&
250 acknowledgementFlags.noLSAInstanceInDatabase &&
251 acknowledgementFlags.anyNeighborInExchangeOrLoadingState))
253 sendDirectAcknowledgment =
true;
259 if (sendDirectAcknowledgment) {
260 const auto& ackPacket = makeShared<Ospfv2LinkStateAcknowledgementPacket>();
264 ackPacket->setAreaID(Ipv4Address(intf->getArea()->getAreaID()));
265 ackPacket->setAuthenticationType(intf->getAuthenticationType());
267 ackPacket->setLsaHeadersArraySize(1);
268 ackPacket->setLsaHeaders(0, lsaHeader);
271 ackPacket->setChunkLength(
B(ackPacket->getPacketLengthField()));
273 AuthenticationKeyType authKey = intf->getAuthenticationKey();
274 for (
int i = 0; i < 8; i++) {
275 ackPacket->setAuthentication(i, authKey.bytes[i]);
280 Packet *pk =
new Packet();
281 pk->insertAtBack(ackPacket);
301 Neighbor *neighbor = intf->getNeighborById(lsaSource);
Referenced by processPacket().
◆ processPacket()
- See also
- RFC2328 Section 13.
Implements inet::ospfv2::IMessageHandler.
43 const auto& lsUpdatePacket = packet->peekAtFront<Ospfv2LinkStateUpdatePacket>();
44 bool shouldRebuildRoutingTable =
false;
47 AreaId areaID = lsUpdatePacket->getAreaID();
50 EV_INFO <<
" Processing packet contents:\n";
52 for (
unsigned int i = 0; i < lsUpdatePacket->getOspfLSAsArraySize(); i++) {
53 const Ospfv2Lsa *currentLSA = lsUpdatePacket->getOspfLSAs(i);
69 LsaProcessingMarker marker(i);
70 EV_DETAIL <<
" " << currentLSA->getHeader() <<
"\n";
73 if ((lsaType ==
AS_EXTERNAL_LSA_TYPE) && !(area !=
nullptr && area->getExternalRoutingCapability())) {
78 lsaKey.linkStateID = currentLSA->getHeader().getLinkStateID();
79 lsaKey.advertisingRouter = currentLSA->getHeader().getAdvertisingRouter();
81 Ospfv2Lsa *lsaInDatabase =
router->
findLSA(lsaType, lsaKey, areaID);
83 AcknowledgementFlags ackFlags;
85 ackFlags.floodedBackOut =
false;
86 ackFlags.lsaIsNewer =
false;
87 ackFlags.lsaIsDuplicate =
false;
88 ackFlags.impliedAcknowledgement =
false;
89 ackFlags.lsaReachedMaxAge = (lsAge ==
MAX_AGE);
90 ackFlags.noLSAInstanceInDatabase = (lsaInDatabase ==
nullptr);
93 if ((ackFlags.lsaReachedMaxAge) && (ackFlags.noLSAInstanceInDatabase) && (!ackFlags.anyNeighborInExchangeOrLoadingState)) {
110 intf->sendLsAcknowledgement(&(currentLSA->getHeader()), neighbor->getAddress());
116 if (!ackFlags.noLSAInstanceInDatabase) {
118 ackFlags.lsaIsNewer = (lsaInDatabase->getHeader() < currentLSA->getHeader());
119 ackFlags.lsaIsDuplicate = (
operator==(lsaInDatabase->getHeader(), currentLSA->getHeader()));
121 if ((ackFlags.noLSAInstanceInDatabase) || (ackFlags.lsaIsNewer)) {
122 LsaTrackingInfo *info = (!ackFlags.noLSAInstanceInDatabase) ?
dynamic_cast<LsaTrackingInfo *
>(lsaInDatabase) :
nullptr;
123 if ((!ackFlags.noLSAInstanceInDatabase) &&
130 ackFlags.floodedBackOut =
router->
floodLSA(currentLSA, areaID, intf, neighbor);
131 if (!ackFlags.noLSAInstanceInDatabase) {
134 lsaKey.linkStateID = lsaInDatabase->getHeader().getLinkStateID();
135 lsaKey.advertisingRouter = lsaInDatabase->getHeader().getAdvertisingRouter();
141 EV_INFO <<
" (update installed)\n";
143 acknowledgeLSA(currentLSA->getHeader(), intf, ackFlags, lsUpdatePacket->getRouterID());
148 if (ackFlags.noLSAInstanceInDatabase) {
149 auto lsaCopy = currentLSA->dup();
150 lsaCopy->getHeaderForUpdate().setLsAge(
MAX_AGE);
154 if (ackFlags.lsaIsNewer) {
155 long sequenceNumber = currentLSA->getHeader().getLsSequenceNumber();
157 lsaInDatabase->getHeaderForUpdate().setLsAge(
MAX_AGE);
161 lsaInDatabase->getHeaderForUpdate().setLsSequenceNumber(sequenceNumber + 1);
169 if (neighbor->isLSAOnRequestList(lsaKey)) {
173 if (ackFlags.lsaIsDuplicate) {
174 if (neighbor->isLinkStateRequestListEmpty(lsaKey)) {
175 neighbor->removeFromRetransmissionList(lsaKey);
176 ackFlags.impliedAcknowledgement =
true;
178 acknowledgeLSA(currentLSA->getHeader(), intf, ackFlags, lsUpdatePacket->getRouterID());
181 if ((lsaInDatabase->getHeader().getLsAge() ==
MAX_AGE) &&
186 if (!neighbor->isOnTransmittedLSAList(lsaKey)) {
187 Packet *updatePacket = intf->createUpdatePacket(lsaInDatabase);
188 if (updatePacket !=
nullptr) {
215 if (shouldRebuildRoutingTable)
Referenced by inet::ospfv2::MessageHandler::processPacket().
◆ validateLSChecksum()
| bool inet::ospfv2::LinkStateUpdateHandler::validateLSChecksum |
( |
const Ospfv2Lsa * |
lsa | ) |
|
|
inlineprivate |
The documentation for this class was generated from the following files:
#define VIRTUAL_LINK_TTL
Definition: Ospfv2Common.h:36
void printEvent(const char *eventString, const Ospfv2Interface *onInterface=nullptr, const Neighbor *forNeighbor=nullptr) const
Definition: MessageHandler.cc:380
@ LINKSTATE_ACKNOWLEDGEMENT_PACKET
Definition: OspfPacketBase_m.h:69
@ POINTTOPOINT
Definition: Ospfv2Interface.h:32
void removeFromAllRetransmissionLists(LsaKeyType lsaKey)
Removes all LSAs from all Neighbor's retransmission lists which are identified by the input lsaKey.
Definition: Ospfv2Router.cc:393
#define MAX_SEQUENCE_NUMBER
Definition: Ospfv2Common.h:34
void acknowledgeLSA(const Ospfv2LsaHeader &lsaHeader, Ospfv2Interface *intf, AcknowledgementFlags acknowledgementFlags, RouterId lsaSource)
Definition: LinkStateUpdateHandler.cc:219
@ SUMMARYLSA_NETWORKS_TYPE
Definition: Ospfv2Packet_m.h:285
bool installLSA(const Ospfv2Lsa *lsa, AreaId areaID=BACKBONE_AREAID)
Installs a new LSA into the Router database.
Definition: Ospfv2Router.cc:102
@ DESIGNATED_ROUTER_STATE
Definition: Ospfv2Interface.h:58
void setOspfCrc(const Ptr< Ospfv2Packet > &ospfPacket, CrcMode crcMode)
Definition: Ospfv2Crc.cc:17
Ospfv2LsaType
Enum generated from inet/routing/ospfv2/Ospfv2Packet.msg:78 by opp_msgtool.
Definition: Ospfv2Packet_m.h:282
MessageHandler * getMessageHandler()
Definition: Ospfv2Router.h:66
@ ROUTERLSA_TYPE
Definition: Ospfv2Packet_m.h:283
#define MAX_AGE
Definition: Ospfv2Common.h:27
@ FLOODED
Definition: Lsa.h:55
bool isLocalAddress(Ipv4Address address) const
Returns true if the input Ipv4 address falls into any of the Router's Areas' configured Ipv4 address ...
Definition: Ospfv2Router.cc:446
const DesignatedRouterId NULL_DESIGNATEDROUTERID
Definition: Ospfv2Common.h:156
@ BAD_LINK_STATE_REQUEST
Definition: Ospfv2Neighbor.h:35
void rebuildRoutingTable()
Rebuilds the routing table from scratch(based on the LSA database).
Definition: Ospfv2Router.cc:663
@ SUMMARYLSA_ASBOUNDARYROUTERS_TYPE
Definition: Ospfv2Packet_m.h:286
Ospfv2Area * getAreaByID(AreaId areaID)
Returns the pointer to the Area identified by the input areaID, if it's on the Area list,...
Definition: Ospfv2Router.cc:63
intscale< b, 1, 8 > B
Definition: Units.h:1168
bool floodLSA(const Ospfv2Lsa *lsa, AreaId areaID=BACKBONE_AREAID, Ospfv2Interface *intf=nullptr, Neighbor *neighbor=nullptr)
Floods out the input lsa on a set of Interfaces.
Definition: Ospfv2Router.cc:408
@ VIRTUAL
Definition: Ospfv2Interface.h:36
@ AS_EXTERNAL_LSA_TYPE
Definition: Ospfv2Packet_m.h:287
static const Ipv4Address ALL_OSPF_DESIGNATED_ROUTERS_MCAST
224.0.0.6 All OSPF Designated Routers
Definition: Ipv4Address.h:100
const B OSPFv2_LSA_HEADER_LENGTH
Definition: Ospfv2Common.h:40
const B OSPFv2_HEADER_LENGTH
Definition: Ospfv2Common.h:39
void sendPacket(Packet *packet, Ipv4Address destination, Ospfv2Interface *outputIf, short ttl=1)
Definition: MessageHandler.cc:303
@ EXCHANGE_STATE
Definition: Ospfv2Neighbor.h:55
Ospfv2Lsa * findLSA(Ospfv2LsaType lsaType, LsaKeyType lsaKey, AreaId areaID)
Find the LSA identified by the input lsaKey in the database.
Definition: Ospfv2Router.cc:226
IMessageHandler(Router *containingRouter)
Definition: IMessageHandler.h:27
RouterId getRouterID() const
Definition: Ospfv2Router.h:60
bool hasAnyNeighborInStates(int states) const
Returns true if any Neighbor on any Interface in any of the Router's Areas is in any of the input sta...
Definition: Ospfv2Router.cc:384
bool operator==(Neighbor::DdPacketId leftID, Neighbor::DdPacketId rightID)
Definition: Ospfv2Neighbor.h:189
@ NETWORKLSA_TYPE
Definition: Ospfv2Packet_m.h:284
#define MIN_LS_ARRIVAL
Definition: Ospfv2Common.h:26
@ LOADING_STATE
Definition: Ospfv2Neighbor.h:56
@ BROADCAST
Definition: Ospfv2Interface.h:33
Ipv4Address AreaId
Definition: Ospfv2Common.h:130
Router * router
Definition: IMessageHandler.h:24
virtual const Ospfv2LsaHeader & getHeader() const
@ BACKUP_STATE
Definition: Ospfv2Interface.h:57
bool validateLSChecksum(const Ospfv2Lsa *lsa)
Definition: LinkStateUpdateHandler.h:31
static const Ipv4Address ALL_OSPF_ROUTERS_MCAST
224.0.0.5 All OSPF routers (DR Others)
Definition: Ipv4Address.h:99