25 const auto& helloPacket = packet->peekAtFront<Ospfv2HelloPacket>();
26 bool shouldRebuildRoutingTable =
false;
34 if ((intf->getHelloInterval() == helloPacket->getHelloInterval()) &&
35 (intf->getRouterDeadInterval() == helloPacket->getRouterDeadInterval()))
44 (intf->getAddressRange().mask != helloPacket->getNetworkMask())
51 if (intf->getArea()->getExternalRoutingCapability() == helloPacket->getOptions().E_ExternalRoutingCapability) {
52 Ipv4Address srcAddress = packet->getTag<
L3AddressInd>()->getSrcAddress().toIpv4();
53 bool neighborChanged =
false;
54 bool neighborsDRStateChanged =
false;
55 bool drChanged =
false;
56 bool backupSeen =
false;
67 neighbor = intf->getNeighborByAddress(srcAddress);
73 neighbor = intf->getNeighborById(helloPacket->getRouterID());
76 if (neighbor !=
nullptr) {
79 Ipv4Address designatedAddress = neighbor->getDesignatedRouter().ipInterfaceAddress;
80 Ipv4Address backupAddress = neighbor->getBackupDesignatedRouter().ipInterfaceAddress;
81 char newPriority = helloPacket->getRouterPriority();
82 Ipv4Address source = srcAddress;
83 Ipv4Address newDesignatedRouter = helloPacket->getDesignatedRouter();
84 Ipv4Address newBackupRouter = helloPacket->getBackupDesignatedRouter();
85 DesignatedRouterId dRouterID;
90 neighbor->setPriority(helloPacket->getRouterPriority());
91 neighbor->setRouterDeadInterval(helloPacket->getRouterDeadInterval());
98 if (neighbor->getPriority() != newPriority) {
99 neighborChanged =
true;
109 if ((newDesignatedRouter == source) &&
122 if (((newDesignatedRouter == source) &&
123 (newDesignatedRouter != designatedAddress)) ||
124 ((newDesignatedRouter != source) &&
125 (source == designatedAddress)))
127 neighborChanged =
true;
128 neighborsDRStateChanged =
true;
138 if ((newBackupRouter == source) &&
150 if (((newBackupRouter == source) &&
151 (newBackupRouter != backupAddress)) ||
152 ((newBackupRouter != source) &&
153 (source == backupAddress)))
155 neighborChanged =
true;
159 neighbor->setNeighborID(helloPacket->getRouterID());
160 neighbor->setPriority(newPriority);
161 neighbor->setAddress(srcAddress);
162 dRouterID.routerID = newDesignatedRouter;
163 dRouterID.ipInterfaceAddress = newDesignatedRouter;
164 if (newDesignatedRouter != designatedAddress) {
165 designatedAddress = dRouterID.ipInterfaceAddress;
168 neighbor->setDesignatedRouter(dRouterID);
169 dRouterID.routerID = newBackupRouter;
170 dRouterID.ipInterfaceAddress = newBackupRouter;
171 if (newBackupRouter != backupAddress) {
172 backupAddress = dRouterID.ipInterfaceAddress;
175 neighbor->setBackupDesignatedRouter(dRouterID);
177 neighbor->setupDesignatedRouters(
false);
184 if (!neighbor->designatedRoutersAreSetUp()) {
185 Neighbor *designated = intf->getNeighborByAddress(designatedAddress);
186 Neighbor *backup = intf->getNeighborByAddress(backupAddress);
188 if (designated !=
nullptr) {
189 dRouterID.routerID = designated->getNeighborID();
190 dRouterID.ipInterfaceAddress = designated->getAddress();
191 neighbor->setDesignatedRouter(dRouterID);
193 if (backup !=
nullptr) {
194 dRouterID.routerID = backup->getNeighborID();
195 dRouterID.ipInterfaceAddress = backup->getAddress();
196 neighbor->setBackupDesignatedRouter(dRouterID);
198 if ((designated !=
nullptr) && (backup !=
nullptr)) {
199 neighbor->setupDesignatedRouters(
true);
204 DesignatedRouterId dRouterID;
205 bool designatedSetUp =
false;
206 bool backupSetUp =
false;
208 neighbor =
new Neighbor(helloPacket->getRouterID());
209 neighbor->setPriority(helloPacket->getRouterPriority());
210 neighbor->setAddress(srcAddress);
211 neighbor->setRouterDeadInterval(helloPacket->getRouterDeadInterval());
215 dRouterID.routerID = helloPacket->getDesignatedRouter();
216 dRouterID.ipInterfaceAddress = dRouterID.routerID;
218 Neighbor *designated = intf->getNeighborByAddress(dRouterID.ipInterfaceAddress);
221 if (designated !=
nullptr) {
222 if (designated->getNeighborID() != dRouterID.routerID) {
223 dRouterID.routerID = designated->getNeighborID();
225 designatedSetUp =
true;
227 neighbor->setDesignatedRouter(dRouterID);
229 dRouterID.routerID = helloPacket->getBackupDesignatedRouter();
230 dRouterID.ipInterfaceAddress = dRouterID.routerID;
232 Neighbor *backup = intf->getNeighborByAddress(dRouterID.ipInterfaceAddress);
235 if (backup !=
nullptr) {
236 if (backup->getNeighborID() != dRouterID.routerID) {
237 dRouterID.routerID = backup->getNeighborID();
241 neighbor->setBackupDesignatedRouter(dRouterID);
242 if (designatedSetUp && backupSetUp) {
243 neighbor->setupDesignatedRouters(
true);
245 intf->addNeighbor(neighbor);
250 (intf->getRouterPriority() == 0) &&
253 intf->sendHelloPacket(neighbor->getAddress());
256 Ipv4Address interfaceAddress = intf->getAddressRange().address;
257 unsigned int neighborsNeighborCount = helloPacket->getNeighborArraySize();
263 for (i = 0; i < neighborsNeighborCount; i++) {
264 if (helloPacket->getNeighbor(i) == interfaceAddress) {
273 if (i == neighborsNeighborCount) {
277 if (neighborChanged) {
289 unsigned int neighborCount = intf->getNeighborCount();
290 for (i = 0; i < neighborCount; i++) {
291 Neighbor *stuckNeighbor = intf->getNeighbor(i);
297 if (neighborsDRStateChanged) {
300 if (routerLSA !=
nullptr) {
301 long sequenceNumber = routerLSA->getHeader().getLsSequenceNumber();
303 routerLSA->getHeaderForUpdate().setLsAge(
MAX_AGE);
304 intf->getArea()->floodLSA(routerLSA);
305 routerLSA->incrementInstallTime();
308 RouterLsa *newLSA = intf->getArea()->originateRouterLSA();
310 newLSA->getHeaderForUpdate().setLsSequenceNumber(sequenceNumber + 1);
311 shouldRebuildRoutingTable |= routerLSA->update(newLSA);
314 intf->getArea()->floodLSA(routerLSA);
327 if (shouldRebuildRoutingTable) {