#include <LinkStateRequestHandler.h>
Inheritance diagram for OSPF::LinkStateRequestHandler:

Public Member Functions | |
| LinkStateRequestHandler (Router *containingRouter) | |
| void | ProcessPacket (OSPFPacket *packet, Interface *intf, Neighbor *neighbor) |
|
|
00006 : 00007 OSPF::IMessageHandler (containingRouter) 00008 { 00009 }
|
|
||||||||||||||||
|
00012 {
00013 router->GetMessageHandler ()->PrintEvent ("Link State Request packet received", intf, neighbor);
00014
00015 OSPF::Neighbor::NeighborStateType neighborState = neighbor->GetState ();
00016
00017 if ((neighborState == OSPF::Neighbor::ExchangeState) ||
00018 (neighborState == OSPF::Neighbor::LoadingState) ||
00019 (neighborState == OSPF::Neighbor::FullState))
00020 {
00021 OSPFLinkStateRequestPacket* lsRequestPacket = check_and_cast<OSPFLinkStateRequestPacket*> (packet);
00022
00023 unsigned long requestCount = lsRequestPacket->getRequestsArraySize ();
00024 bool error = false;
00025 std::vector<OSPFLSA*> lsas;
00026
00027 EV << " Processing packet contents:\n";
00028
00029 for (unsigned long i = 0; i < requestCount; i++) {
00030 LSARequest& request = lsRequestPacket->getRequests (i);
00031 OSPF::LSAKeyType lsaKey;
00032 char addressString[16];
00033
00034 EV << " LSARequest: type="
00035 << request.lsType
00036 << ", LSID="
00037 << AddressStringFromULong (addressString, sizeof (addressString), request.linkStateID)
00038 << ", advertisingRouter="
00039 << AddressStringFromULong (addressString, sizeof (addressString), request.advertisingRouter.getInt ())
00040 << "\n";
00041
00042 lsaKey.linkStateID = request.linkStateID;
00043 lsaKey.advertisingRouter = request.advertisingRouter.getInt ();
00044
00045 OSPFLSA* lsaInDatabase = router->FindLSA (static_cast<LSAType> (request.lsType), lsaKey, intf->GetArea ()->GetAreaID ());
00046
00047 if (lsaInDatabase != NULL) {
00048 lsas.push_back (lsaInDatabase);
00049 } else {
00050 error = true;
00051 neighbor->ProcessEvent (OSPF::Neighbor::BadLinkStateRequest);
00052 break;
00053 }
00054 }
00055
00056 if (!error) {
00057 int updatesCount = lsas.size ();
00058 int ttl = (intf->GetType () == OSPF::Interface::Virtual) ? VIRTUAL_LINK_TTL : 1;
00059 OSPF::MessageHandler* messageHandler = router->GetMessageHandler ();
00060
00061 for (int j = 0; j < updatesCount; j++) {
00062 OSPFLinkStateUpdatePacket* updatePacket = intf->CreateUpdatePacket (lsas[j]);
00063 if (updatePacket != NULL) {
00064 if (intf->GetType () == OSPF::Interface::Broadcast) {
00065 if ((intf->GetState () == OSPF::Interface::DesignatedRouterState) ||
00066 (intf->GetState () == OSPF::Interface::BackupState) ||
00067 (intf->GetDesignatedRouter () == OSPF::NullDesignatedRouterID))
00068 {
00069 messageHandler->SendPacket (updatePacket, OSPF::AllSPFRouters, intf->GetIfIndex (), ttl);
00070 } else {
00071 messageHandler->SendPacket (updatePacket, OSPF::AllDRouters, intf->GetIfIndex (), ttl);
00072 }
00073 } else {
00074 if (intf->GetType () == OSPF::Interface::PointToPoint) {
00075 messageHandler->SendPacket (updatePacket, OSPF::AllSPFRouters, intf->GetIfIndex (), ttl);
00076 } else {
00077 messageHandler->SendPacket (updatePacket, neighbor->GetAddress (), intf->GetIfIndex (), ttl);
00078 }
00079 }
00080
00081 }
00082 }
00083 // These update packets should not be placed on retransmission lists
00084 }
00085 }
00086 }
|
1.4.1