18 bool shouldRebuildRoutingTable =
false;
20 EV_DEBUG <<
"Changing neighbor state from " << currentState->getNeighborStateString() <<
" to " << newState->getNeighborStateString() <<
"\n";
22 neighbor->changeState(newState, currentState);
25 Ipv4Address routerID = neighbor->getInterface()->getArea()->getInstance()->getProcess()->getRouterID();
26 RouterLSA *routerLSA = neighbor->getInterface()->getArea()->findRouterLSA(routerID);
28 if (routerLSA !=
nullptr) {
29 long sequenceNumber = routerLSA->getHeader().getLsaSequenceNumber();
31 routerLSA->getHeaderForUpdate().setLsaAge(
MAX_AGE);
32 neighbor->getInterface()->getArea()->floodLSA(routerLSA);
33 routerLSA->incrementInstallTime();
36 RouterLSA *newLSA = neighbor->getInterface()->getArea()->originateRouterLSA();
38 newLSA->getHeaderForUpdate().setLsaSequenceNumber(sequenceNumber + 1);
39 shouldRebuildRoutingTable |= neighbor->getInterface()->getArea()->updateRouterLSA(routerLSA, newLSA);
40 if (shouldRebuildRoutingTable)
41 neighbor->getInterface()->getArea()->setSpfTreeRoot(routerLSA);
44 neighbor->getInterface()->getArea()->floodLSA(routerLSA);
49 NetworkLSA *networkLSA = neighbor->getInterface()->getArea()->findNetworkLSAByLSID(
50 Ipv4Address(neighbor->getInterface()->getInterfaceId()));
52 if (networkLSA !=
nullptr) {
53 long sequenceNumber = networkLSA->getHeader().getLsaSequenceNumber();
55 networkLSA->getHeaderForUpdate().setLsaAge(
MAX_AGE);
56 neighbor->getInterface()->getArea()->floodLSA(networkLSA);
57 networkLSA->incrementInstallTime();
60 NetworkLSA *newLSA = neighbor->getInterface()->getArea()->originateNetworkLSA(neighbor->getInterface());
62 if (newLSA !=
nullptr) {
63 newLSA->getHeaderForUpdate().setLsaSequenceNumber(sequenceNumber + 1);
64 shouldRebuildRoutingTable |= neighbor->getInterface()->getArea()->updateNetworkLSA(networkLSA, newLSA);
68 networkLSA->getHeaderForUpdate().setLsaAge(
MAX_AGE);
69 networkLSA->incrementInstallTime();
71 neighbor->getInterface()->getArea()->floodLSA(networkLSA);
77 Ospfv3Area *thisArea = neighbor->getInterface()->getArea();
81 if (thisArea->getInstance()->getAreaCount() > 1) {
82 for (
int ar = 0; ar < thisArea->getInstance()->getAreaCount(); ar++) {
83 Ospfv3Area *area = thisArea->getInstance()->getArea(ar);
84 if (area->getAreaID() == thisArea->getAreaID())
89 for (
int i = 0; i < thisArea->getIntraAreaPrefixLSACount(); i++) {
90 IntraAreaPrefixLSA *iapLSA = thisArea->getIntraAreaPrefixLSA(i);
91 if (neighbor->getNeighborID() == iapLSA->getHeader().getAdvertisingRouter()) {
92 for (
size_t k = 0;
k < iapLSA->getPrefixesArraySize();
k++) {
94 for (
int j = 0; j < area->getInterAreaPrefixLSACount(); j++) {
95 InterAreaPrefixLSA *interLSA = area->getInterAreaPrefixLSA(j);
96 if ((interLSA->getHeader().getAdvertisingRouter() == thisArea->getInstance()->getProcess()->getRouterID()) &&
97 (interLSA->getPrefix().addressPrefix == iapLSA->getPrefixes(
k).addressPrefix) &&
98 (interLSA->getPrefix().prefixLen == iapLSA->getPrefixes(
k).prefixLen))
100 interLSA->getHeaderForUpdate().setLsaAge(
MAX_AGE);
101 area->floodLSA(interLSA);
106 iapLSA->getHeaderForUpdate().setLsaAge(
MAX_AGE);
113 for (
int i = 0; i < thisArea->getIntraAreaPrefixLSACount(); i++) {
114 IntraAreaPrefixLSA *iapLSA = thisArea->getIntraAreaPrefixLSA(i);
115 if (neighbor->getNeighborID() == iapLSA->getHeader().getAdvertisingRouter()) {
117 iapLSA->getHeaderForUpdate().setLsaAge(
MAX_AGE);
118 thisArea->floodLSA(iapLSA);
124 if (shouldRebuildRoutingTable) {
125 neighbor->getInterface()->getArea()->getInstance()->getProcess()->rebuildRoutingTable();