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