00007 {
00008
00009 OSPF::Neighbor::NeighborStateType oldState = currentState->GetState ();
00010 OSPF::Neighbor::NeighborStateType nextState = newState->GetState ();
00011 bool rebuildRoutingTable = false;
00012
00013 neighbor->ChangeState (newState, currentState);
00014
00015 if ((oldState == OSPF::Neighbor::FullState) || (nextState == OSPF::Neighbor::FullState)) {
00016 OSPF::RouterID routerID = neighbor->GetInterface ()->GetArea ()->GetRouter ()->GetRouterID ();
00017 OSPF::RouterLSA* routerLSA = neighbor->GetInterface ()->GetArea ()->FindRouterLSA (routerID);
00018
00019 if (routerLSA != NULL) {
00020 long sequenceNumber = routerLSA->getHeader ().getLsSequenceNumber ();
00021 if (sequenceNumber == MAX_SEQUENCE_NUMBER) {
00022 routerLSA->getHeader ().setLsAge (MAX_AGE);
00023 neighbor->GetInterface ()->GetArea ()->FloodLSA (routerLSA);
00024 routerLSA->IncrementInstallTime ();
00025 } else {
00026 OSPF::RouterLSA* newLSA = neighbor->GetInterface ()->GetArea ()->OriginateRouterLSA ();
00027
00028 newLSA->getHeader ().setLsSequenceNumber (sequenceNumber + 1);
00029 newLSA->getHeader ().setLsChecksum (0);
00030 rebuildRoutingTable |= routerLSA->Update (newLSA);
00031 delete newLSA;
00032
00033 neighbor->GetInterface ()->GetArea ()->FloodLSA (routerLSA);
00034 }
00035 }
00036
00037 if (neighbor->GetInterface ()->GetState () == OSPF::Interface::DesignatedRouterState) {
00038 OSPF::NetworkLSA* networkLSA = neighbor->GetInterface ()->GetArea ()->FindNetworkLSA (ULongFromIPv4Address (neighbor->GetInterface ()->GetAddressRange ().address));
00039
00040 if (networkLSA != NULL) {
00041 long sequenceNumber = networkLSA->getHeader ().getLsSequenceNumber ();
00042 if (sequenceNumber == MAX_SEQUENCE_NUMBER) {
00043 networkLSA->getHeader ().setLsAge (MAX_AGE);
00044 neighbor->GetInterface ()->GetArea ()->FloodLSA (networkLSA);
00045 networkLSA->IncrementInstallTime ();
00046 } else {
00047 OSPF::NetworkLSA* newLSA = neighbor->GetInterface ()->GetArea ()->OriginateNetworkLSA (neighbor->GetInterface ());
00048
00049 if (newLSA != NULL) {
00050 newLSA->getHeader ().setLsSequenceNumber (sequenceNumber + 1);
00051 newLSA->getHeader ().setLsChecksum (0);
00052 rebuildRoutingTable |= networkLSA->Update (newLSA);
00053 delete newLSA;
00054 } else {
00055 networkLSA->getHeader ().setLsAge (MAX_AGE);
00056 networkLSA->IncrementInstallTime ();
00057 }
00058
00059 neighbor->GetInterface ()->GetArea ()->FloodLSA (networkLSA);
00060 }
00061 }
00062 }
00063 }
00064
00065 if (rebuildRoutingTable) {
00066 neighbor->GetInterface ()->GetArea ()->GetRouter ()->RebuildRoutingTable ();
00067 }
00068 }