blob: 00a4c644d3d02a3eb3f0d014604628054e299051 [file] [log] [blame]
paul718e3742002-12-13 20:15:29 +00001/*
2 * OSPF Flooding -- RFC2328 Section 13.
3 * Copyright (C) 1999, 2000 Toshiaki Takada
4 *
5 * This file is part of GNU Zebra.
6 *
7 * GNU Zebra is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published
9 * by the Free Software Foundation; either version 2, or (at your
10 * option) any later version.
11 *
12 * GNU Zebra is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with GNU Zebra; see the file COPYING. If not, write to the
19 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 * Boston, MA 02111-1307, USA.
21 */
22
23#include <zebra.h>
24
25#include "linklist.h"
26#include "prefix.h"
27#include "if.h"
28#include "command.h"
29#include "table.h"
30#include "thread.h"
31#include "memory.h"
32#include "log.h"
33#include "zclient.h"
34
35#include "ospfd/ospfd.h"
36#include "ospfd/ospf_interface.h"
37#include "ospfd/ospf_ism.h"
38#include "ospfd/ospf_asbr.h"
39#include "ospfd/ospf_lsa.h"
40#include "ospfd/ospf_lsdb.h"
41#include "ospfd/ospf_neighbor.h"
42#include "ospfd/ospf_nsm.h"
43#include "ospfd/ospf_spf.h"
44#include "ospfd/ospf_flood.h"
45#include "ospfd/ospf_packet.h"
46#include "ospfd/ospf_abr.h"
47#include "ospfd/ospf_route.h"
48#include "ospfd/ospf_zebra.h"
49#include "ospfd/ospf_dump.h"
50
51extern struct zclient *zclient;
52
53/* Do the LSA acking specified in table 19, Section 13.5, row 2
54 * This get called from ospf_flood_out_interface. Declared inline
55 * for speed. */
56static void
57ospf_flood_delayed_lsa_ack (struct ospf_neighbor *inbr, struct ospf_lsa *lsa)
58{
59 /* LSA is more recent than database copy, but was not
60 flooded back out receiving interface. Delayed
61 acknowledgment sent. If interface is in Backup state
62 delayed acknowledgment sent only if advertisement
63 received from Designated Router, otherwise do nothing See
64 RFC 2328 Section 13.5 */
65
66 /* Whether LSA is more recent or not, and whether this is in
67 response to the LSA being sent out recieving interface has been
68 worked out previously */
69
70 /* Deal with router as BDR */
71 if (inbr->oi->state == ISM_Backup && ! NBR_IS_DR (inbr))
72 return;
73
74 /* Schedule a delayed LSA Ack to be sent */
75 listnode_add (inbr->oi->ls_ack, ospf_lsa_lock (lsa));
76}
77
78/* Check LSA is related to external info. */
79struct external_info *
80ospf_external_info_check (struct ospf_lsa *lsa)
81{
82 struct as_external_lsa *al;
83 struct prefix_ipv4 p;
84 struct route_node *rn;
85 int type;
86
87 al = (struct as_external_lsa *) lsa->data;
88
89 p.family = AF_INET;
90 p.prefix = lsa->data->id;
91 p.prefixlen = ip_masklen (al->mask);
92
93 for (type = 0; type <= ZEBRA_ROUTE_MAX; type++)
94 {
95 int redist_type = is_prefix_default (&p) ? DEFAULT_ROUTE : type;
96 if (ospf_is_type_redistributed (redist_type))
97 if (EXTERNAL_INFO (type))
98 {
99 rn = route_node_lookup (EXTERNAL_INFO (type),
100 (struct prefix *) &p);
101 if (rn)
102 {
103 route_unlock_node (rn);
104 if (rn->info != NULL)
105 return (struct external_info *) rn->info;
106 }
107 }
108 }
109
110 return NULL;
111}
112
113void
114ospf_process_self_originated_lsa (struct ospf_lsa *new, struct ospf_area *area)
115{
116 struct ospf_interface *oi;
117 struct external_info *ei;
118 listnode node;
119
120 if (IS_DEBUG_OSPF_EVENT)
121 zlog_info ("LSA[Type%d:%s]: Process self-originated LSA",
122 new->data->type, inet_ntoa (new->data->id));
123
124 /* If we're here, we installed a self-originated LSA that we received
125 from a neighbor, i.e. it's more recent. We must see whether we want
126 to originate it.
127 If yes, we should use this LSA's sequence number and reoriginate
128 a new instance.
129 if not --- we must flush this LSA from the domain. */
130 switch (new->data->type)
131 {
132 case OSPF_ROUTER_LSA:
133 /* Originate a new instance and schedule flooding */
134 /* It shouldn't be necessary, but anyway */
135 ospf_lsa_unlock (area->router_lsa_self);
136 area->router_lsa_self = ospf_lsa_lock (new);
137
138 ospf_router_lsa_timer_add (area);
139 return;
140 case OSPF_NETWORK_LSA:
141#ifdef HAVE_OPAQUE_LSA
142 case OSPF_OPAQUE_LINK_LSA:
143#endif /* HAVE_OPAQUE_LSA */
144 /* We must find the interface the LSA could belong to.
145 If the interface is no more a broadcast type or we are no more
146 the DR, we flush the LSA otherwise -- create the new instance and
147 schedule flooding. */
148
149 /* Look through all interfaces, not just area, since interface
150 could be moved from one area to another. */
151 for (node = listhead (ospf_top->oiflist); node; nextnode (node))
152 /* These are sanity check. */
153 if ((oi = getdata (node)) != NULL)
154 if (IPV4_ADDR_SAME (&oi->address->u.prefix4, &new->data->id))
155 {
156 if (oi->area != area ||
157 oi->type != OSPF_IFTYPE_BROADCAST ||
158 !IPV4_ADDR_SAME (&oi->address->u.prefix4, &DR (oi)))
159 {
160 ospf_schedule_lsa_flush_area (area, new);
161 return;
162 }
163
164#ifdef HAVE_OPAQUE_LSA
165 if (new->data->type == OSPF_OPAQUE_LINK_LSA)
166 {
167 ospf_opaque_lsa_refresh (new);
168 return;
169 }
170#endif /* HAVE_OPAQUE_LSA */
171
172 ospf_lsa_unlock (oi->network_lsa_self);
173 oi->network_lsa_self = ospf_lsa_lock (new);
174
175 /* Schedule network-LSA origination. */
176 ospf_network_lsa_timer_add (oi);
177 return;
178 }
179 break;
180 case OSPF_SUMMARY_LSA:
181 case OSPF_ASBR_SUMMARY_LSA:
182 ospf_schedule_abr_task ();
183 break;
184 case OSPF_AS_EXTERNAL_LSA :
185#ifdef HAVE_NSSA
186 case OSPF_AS_NSSA_LSA:
187#endif /* HAVE_NSSA */
188 ei = ospf_external_info_check (new);
189 if (ei)
190 ospf_external_lsa_refresh (new, ei, LSA_REFRESH_FORCE);
191 else
192 ospf_lsa_flush_as (new);
193 break;
194#ifdef HAVE_OPAQUE_LSA
195 case OSPF_OPAQUE_AREA_LSA:
196 ospf_opaque_lsa_refresh (new);
197 break;
198 case OSPF_OPAQUE_AS_LSA:
199 ospf_opaque_lsa_refresh (new); /* Reconsideration may needed. *//* XXX */
200 break;
201#endif /* HAVE_OPAQUE_LSA */
202 default:
203 break;
204 }
205}
206
207/* OSPF LSA flooding -- RFC2328 Section 13.(5). */
208
209/* Now Updated for NSSA operation, as follows:
210
211
212 Type-5's have no change. Blocked to STUB or NSSA.
213
214 Type-7's can be received, and if a DR
215 they will also flood the local NSSA Area as Type-7's
216
217 If a Self-Originated LSA (now an ASBR),
218 The LSDB will be updated as Type-5's, (for continual re-fresh)
219
220 If an NSSA-IR it is installed/flooded as Type-7, P-bit on.
221 if an NSSA-ABR it is installed/flooded as Type-7, P-bit off.
222
223 Later, during the ABR TASK, if the ABR is the Elected NSSA
224 translator, then All Type-7s (with P-bit ON) are Translated to
225 Type-5's and flooded to all non-NSSA/STUB areas.
226
227 During ASE Calculations,
228 non-ABRs calculate external routes from Type-7's
229 ABRs calculate external routes from Type-5's and non-self Type-7s
230*/
231int
232ospf_flood (struct ospf_neighbor *nbr, struct ospf_lsa *current,
233 struct ospf_lsa *new)
234{
235 struct ospf_interface *oi;
236 struct timeval now;
237 int lsa_ack_flag;
238
239 /* Type-7 LSA's will be flooded throughout their native NSSA area,
240 but will also be flooded as Type-5's into ABR capable links. */
241
242 if (IS_DEBUG_OSPF_EVENT)
243 zlog_info ("LSA[Flooding]: start, NBR %s (%s), cur(%p), New-LSA[%s]",
244 inet_ntoa (nbr->router_id),
245 LOOKUP (ospf_nsm_state_msg, nbr->state),
246 current,
247 dump_lsa_key (new));
248
249 lsa_ack_flag = 0;
250 oi = nbr->oi;
251
252 /* Get current time. */
253 gettimeofday (&now, NULL);
254
255 /* If there is already a database copy, and if the
256 database copy was received via flooding and installed less
257 than MinLSArrival seconds ago, discard the new LSA
258 (without acknowledging it). */
259 if (current != NULL) /* -- endo. */
260 {
261 if (IS_LSA_SELF (current)
262 && (ntohs (current->data->ls_age) == 0
263 && ntohl (current->data->ls_seqnum) == OSPF_INITIAL_SEQUENCE_NUMBER))
264 {
265 if (IS_DEBUG_OSPF_EVENT)
266 zlog_info ("LSA[Flooding]: Got a self-originated LSA, "
267 "while local one is initial instance.");
268 ; /* Accept this LSA for quick LSDB resynchronization. */
269 }
270 else if (tv_cmp (tv_sub (now, current->tv_recv),
271 int2tv (OSPF_MIN_LS_ARRIVAL)) < 0)
272 {
273 if (IS_DEBUG_OSPF_EVENT)
274 zlog_info ("LSA[Flooding]: LSA is received recently.");
275 return -1;
276 }
277 }
278
279 /* Flood the new LSA out some subset of the router's interfaces.
280 In some cases (e.g., the state of the receiving interface is
281 DR and the LSA was received from a router other than the
282 Backup DR) the LSA will be flooded back out the receiving
283 interface. */
284 lsa_ack_flag = ospf_flood_through (nbr, new);
285
286#ifdef HAVE_OPAQUE_LSA
287 /* Remove the current database copy from all neighbors' Link state
288 retransmission lists. AS_EXTERNAL and AS_EXTERNAL_OPAQUE does
289 ^^^^^^^^^^^^^^^^^^^^^^^
290 not have area ID.
291 All other (even NSSA's) do have area ID. */
292#else /* HAVE_OPAQUE_LSA */
293 /* Remove the current database copy from all neighbors' Link state
294 retransmission lists. Only AS_EXTERNAL does not have area ID.
295 All other (even NSSA's) do have area ID. */
296#endif /* HAVE_OPAQUE_LSA */
297 if (current)
298 {
299 switch (current->data->type)
300 {
301 case OSPF_AS_EXTERNAL_LSA:
302#ifdef HAVE_OPAQUE_LSA
303 case OSPF_OPAQUE_AS_LSA:
304#endif /* HAVE_OPAQUE_LSA */
305 ospf_ls_retransmit_delete_nbr_all (NULL, current);
306 break;
307 default:
308 ospf_ls_retransmit_delete_nbr_all (nbr->oi->area, current);
309 break;
310 }
311 }
312
313 /* Do some internal house keeping that is needed here */
314 SET_FLAG (new->flags, OSPF_LSA_RECEIVED);
315 ospf_lsa_is_self_originated (new); /* Let it set the flag */
316
317 /* Install the new LSA in the link state database
318 (replacing the current database copy). This may cause the
319 routing table calculation to be scheduled. In addition,
320 timestamp the new LSA with the current time. The flooding
321 procedure cannot overwrite the newly installed LSA until
322 MinLSArrival seconds have elapsed. */
323
324 new = ospf_lsa_install (nbr->oi, new);
325
326#ifdef HAVE_NSSA
327 if (IS_DEBUG_OSPF_NSSA)
328 zlog_info ("LSA[Flooding]: Type-%d installed", new->data->type);
329
330 /* if (new->data->type == OSPF_AS_NSSA_LSA )
331 return 0; */
332#endif /* HAVE_NSSA */
333
334 /* Acknowledge the receipt of the LSA by sending a Link State
335 Acknowledgment packet back out the receiving interface. */
336 if (lsa_ack_flag)
337 ospf_flood_delayed_lsa_ack (nbr, new);
338
339 /* If this new LSA indicates that it was originated by the
340 receiving router itself, the router must take special action,
341 either updating the LSA or in some cases flushing it from
342 the routing domain. */
343 if (ospf_lsa_is_self_originated (new))
344 ospf_process_self_originated_lsa (new, oi->area);
345 else
346 /* Update statistics value for OSPF-MIB. */
347 ospf_top->rx_lsa_count++;
348
349 return 0;
350}
351
352/* OSPF LSA flooding -- RFC2328 Section 13.3. */
353int
354ospf_flood_through_interface (struct ospf_interface *oi,
355 struct ospf_neighbor *inbr,
356 struct ospf_lsa *lsa)
357{
358 struct ospf_neighbor *onbr;
359 struct route_node *rn;
360 int retx_flag;
361
362 if (IS_DEBUG_OSPF_EVENT)
363 zlog_info ("ospf_flood_through_interface(): "
364 "considering int %s, INBR(%s), LSA[%s]",
365 IF_NAME (oi), inbr ? inet_ntoa (inbr->router_id) : "NULL",
366 dump_lsa_key (lsa));
367
368 if (!ospf_if_is_enable (oi))
369 return 0;
370
371 /* Remember if new LSA is aded to a retransmit list. */
372 retx_flag = 0;
373
374 /* Each of the neighbors attached to this interface are examined,
375 to determine whether they must receive the new LSA. The following
376 steps are executed for each neighbor: */
377 for (rn = route_top (oi->nbrs); rn; rn = route_next (rn))
378 {
379 struct ospf_lsa *ls_req;
380
381 if (rn->info == NULL)
382 continue;
383
384 onbr = rn->info;
385 if (IS_DEBUG_OSPF_EVENT)
386 zlog_info ("ospf_flood_through_interface(): considering nbr %s (%s)",
387 inet_ntoa (onbr->router_id),
388 LOOKUP (ospf_nsm_state_msg, onbr->state));
389
390 /* If the neighbor is in a lesser state than Exchange, it
391 does not participate in flooding, and the next neighbor
392 should be examined. */
393 if (onbr->state < NSM_Exchange)
394 continue;
395
396 /* If the adjacency is not yet full (neighbor state is
397 Exchange or Loading), examine the Link state request
398 list associated with this adjacency. If there is an
399 instance of the new LSA on the list, it indicates that
400 the neighboring router has an instance of the LSA
401 already. Compare the new LSA to the neighbor's copy: */
402 if (onbr->state < NSM_Full)
403 {
404 if (IS_DEBUG_OSPF_EVENT)
405 zlog_info ("ospf_flood_through_interface(): nbr adj is not Full");
406 ls_req = ospf_ls_request_lookup (onbr, lsa);
407 if (ls_req != NULL)
408 {
409 int ret;
410
411 ret = ospf_lsa_more_recent (ls_req, lsa);
412 /* The new LSA is less recent. */
413 if (ret > 0)
414 continue;
415 /* The two copies are the same instance, then delete
416 the LSA from the Link state request list. */
417 else if (ret == 0)
418 {
419 ospf_ls_request_delete (onbr, ls_req);
420 ospf_check_nbr_loading (onbr);
421 continue;
422 }
423 /* The new LSA is more recent. Delete the LSA
424 from the Link state request list. */
425 else
426 {
427 ospf_ls_request_delete (onbr, ls_req);
428 ospf_check_nbr_loading (onbr);
429 }
430 }
431 }
432
433#ifdef HAVE_OPAQUE_LSA
434 if (IS_OPAQUE_LSA (lsa->data->type))
435 {
436 if (! CHECK_FLAG (onbr->options, OSPF_OPTION_O))
437 {
438 if (IS_DEBUG_OSPF (lsa, LSA_FLOODING))
439 zlog_info ("Skip this neighbor: Not Opaque-capable.");
440 continue;
441 }
442
443 if (IS_OPAQUE_LSA_ORIGINATION_BLOCKED (ospf_top->opaque)
444 && IS_LSA_SELF (lsa)
445 && onbr->state == NSM_Full)
446 {
447 /* Small attempt to reduce unnecessary retransmission. */
448 if (IS_DEBUG_OSPF (lsa, LSA_FLOODING))
449 zlog_info ("Skip this neighbor: Initial flushing done.");
450 continue;
451 }
452 }
453#endif /* HAVE_OPAQUE_LSA */
454
455 /* If the new LSA was received from this neighbor,
456 examine the next neighbor. */
457#ifdef ORIGINAL_CODING
458 if (inbr)
459 if (IPV4_ADDR_SAME (&inbr->router_id, &onbr->router_id))
460 continue;
461#else /* ORIGINAL_CODING */
462 if (inbr)
463 {
464 /*
465 * Triggered by LSUpd message parser "ospf_ls_upd ()".
466 * E.g., all LSAs handling here is received via network.
467 */
468 if (IPV4_ADDR_SAME (&inbr->router_id, &onbr->router_id))
469 {
470 if (IS_DEBUG_OSPF (lsa, LSA_FLOODING))
471 zlog_info ("Skip this neighbor: inbr == onbr");
472 continue;
473 }
474 }
475 else
476 {
477 /*
478 * Triggered by MaxAge remover, so far.
479 * NULL "inbr" means flooding starts from this node.
480 */
481 if (IPV4_ADDR_SAME (&lsa->data->adv_router, &onbr->router_id))
482 {
483 if (IS_DEBUG_OSPF (lsa, LSA_FLOODING))
484 zlog_info ("Skip this neighbor: lsah->adv_router == onbr");
485 continue;
486 }
487 }
488#endif /* ORIGINAL_CODING */
489
490 /* Add the new LSA to the Link state retransmission list
491 for the adjacency. The LSA will be retransmitted
492 at intervals until an acknowledgment is seen from
493 the neighbor. */
494 ospf_ls_retransmit_add (onbr, lsa);
495 retx_flag = 1;
496 }
497
498 /* If in the previous step, the LSA was NOT added to any of
499 the Link state retransmission lists, there is no need to
500 flood the LSA out the interface. */
501 if (retx_flag == 0)
502 {
503 return (inbr && inbr->oi == oi);
504 }
505
506 /* if we've received the lsa on this interface we need to perform
507 additional checking */
508 if (inbr && (inbr->oi == oi))
509 {
510 /* If the new LSA was received on this interface, and it was
511 received from either the Designated Router or the Backup
512 Designated Router, chances are that all the neighbors have
513 received the LSA already. */
514 if (NBR_IS_DR (inbr) || NBR_IS_BDR (inbr))
515 {
516#ifdef HAVE_NSSA
517 if (IS_DEBUG_OSPF_NSSA)
518 zlog_info ("ospf_flood_through_interface(): "
519 "DR/BDR NOT SEND to int %s", IF_NAME (oi));
520#endif /* HAVE_NSSA */
521 return 1;
522 }
523
524 /* If the new LSA was received on this interface, and the
525 interface state is Backup, examine the next interface. The
526 Designated Router will do the flooding on this interface.
527 However, if the Designated Router fails the router will
528 end up retransmitting the updates. */
529
530 if (oi->state == ISM_Backup)
531 {
532#ifdef HAVE_NSSA
533 if (IS_DEBUG_OSPF_NSSA)
534 zlog_info ("ospf_flood_through_interface(): "
535 "ISM_Backup NOT SEND to int %s", IF_NAME (oi));
536#endif /* HAVE_NSSA */
537 return 1;
538 }
539 }
540
541 /* The LSA must be flooded out the interface. Send a Link State
542 Update packet (including the new LSA as contents) out the
543 interface. The LSA's LS age must be incremented by InfTransDelay
544 (which must be > 0) when it is copied into the outgoing Link
545 State Update packet (until the LS age field reaches the maximum
546 value of MaxAge). */
547
548#ifdef HAVE_NSSA
549 if (IS_DEBUG_OSPF_NSSA)
550 zlog_info ("ospf_flood_through_interface(): "
551 "DR/BDR sending upd to int %s", IF_NAME (oi));
552#else /* ! HAVE_NSSA */
553
554 if (IS_DEBUG_OSPF_EVENT)
555 zlog_info ("ospf_flood_through_interface(): "
556 "sending upd to int %s", IF_NAME (oi));
557#endif /* HAVE_NSSA */
558
559 /* RFC2328 Section 13.3
560 On non-broadcast networks, separate Link State Update
561 packets must be sent, as unicasts, to each adjacent neighbor
562 (i.e., those in state Exchange or greater). The destination
563 IP addresses for these packets are the neighbors' IP
564 addresses. */
565 if (oi->type == OSPF_IFTYPE_NBMA)
566 {
567 struct route_node *rn;
568 struct ospf_neighbor *nbr;
569
570 for (rn = route_top (oi->nbrs); rn; rn = route_next (rn))
571 if ((nbr = rn->info) != NULL)
572 if (nbr != oi->nbr_self && nbr->state >= NSM_Exchange)
573 ospf_ls_upd_send_lsa (nbr, lsa, OSPF_SEND_PACKET_DIRECT);
574 }
575 else
576 ospf_ls_upd_send_lsa (oi->nbr_self, lsa, OSPF_SEND_PACKET_INDIRECT);
577
578 return 0;
579}
580
581int
582ospf_flood_through_area (struct ospf_area * area,struct ospf_neighbor *inbr,
583 struct ospf_lsa *lsa)
584{
585 listnode node;
586 int lsa_ack_flag = 0;
587
588 /* All other types are specific to a single area (Area A). The
589 eligible interfaces are all those interfaces attaching to the
590 Area A. If Area A is the backbone, this includes all the virtual
591 links. */
592 for (node = listhead (area->oiflist); node; nextnode (node))
593 {
594 struct ospf_interface *oi = getdata (node);
595
596 if (area->area_id.s_addr != OSPF_AREA_BACKBONE &&
597 oi->type == OSPF_IFTYPE_VIRTUALLINK)
598 continue;
599
600#ifdef HAVE_OPAQUE_LSA
601 if ((lsa->data->type == OSPF_OPAQUE_LINK_LSA) && (lsa->oi != oi))
602 {
603 /*
604 * Link local scoped Opaque-LSA should only be flooded
605 * for the link on which the LSA has received.
606 */
607 if (IS_DEBUG_OSPF (lsa, LSA_FLOODING))
608 zlog_info ("Type-9 Opaque-LSA: lsa->oi(%p) != oi(%p)", lsa->oi, oi);
609 continue;
610 }
611#endif /* HAVE_OPAQUE_LSA */
612
613 if (ospf_flood_through_interface (oi, inbr, lsa))
614 lsa_ack_flag = 1;
615 }
616
617 return (lsa_ack_flag);
618}
619
620int
621ospf_flood_through_as (struct ospf_neighbor *inbr, struct ospf_lsa *lsa)
622{
623 listnode node;
624 int lsa_ack_flag;
paulf2c80652002-12-13 21:44:27 +0000625 struct as_external_lsa *extlsa;
paul718e3742002-12-13 20:15:29 +0000626
627 lsa_ack_flag = 0;
628
629 /* The incoming LSA is type 5 or type 7 (AS-EXTERNAL or AS-NSSA )
630
631 Divert the Type-5 LSA's to all non-NSSA/STUB areas
632
633 Divert the Type-7 LSA's to all NSSA areas
634
635 AS-external-LSAs are flooded throughout the entire AS, with the
636 exception of stub areas (see Section 3.6). The eligible
637 interfaces are all the router's interfaces, excluding virtual
638 links and those interfaces attaching to stub areas. */
639
640#ifdef HAVE_NSSA
641 if (CHECK_FLAG (lsa->flags, OSPF_LSA_LOCAL_XLT)) /* Translated from 7 */
642 if (IS_DEBUG_OSPF_NSSA)
643 zlog_info ("Flood/AS: NSSA TRANSLATED LSA");
644#endif /* HAVE_NSSA */
645
646 for (node = listhead (ospf_top->areas); node; nextnode (node))
647 {
648 int continue_flag = 0;
649 struct ospf_area *area = getdata (node);
paulf2c80652002-12-13 21:44:27 +0000650 struct in_addr fwd;
paul718e3742002-12-13 20:15:29 +0000651 listnode if_node;
652
653 switch (area->external_routing)
654 {
655 /* Don't send AS externals into stub areas. Various types
656 of support for partial stub areas can be implemented
657 here. NSSA's will receive Type-7's that have areas
658 matching the originl LSA. */
659 case OSPF_AREA_NSSA: /* Sending Type 5 or 7 into NSSA area */
660#ifdef HAVE_NSSA
661 /* Type-7, flood NSSA area */
paulf2c80652002-12-13 21:44:27 +0000662 if (lsa->data->type == OSPF_AS_NSSA_LSA &&
663 area == lsa->area) {
paul718e3742002-12-13 20:15:29 +0000664 /* We will send it. */
665 continue_flag = 0;
paulf2c80652002-12-13 21:44:27 +0000666 } else {
paul718e3742002-12-13 20:15:29 +0000667 continue_flag = 1; /* Skip this NSSA area for Type-5's et al */
paulf2c80652002-12-13 21:44:27 +0000668 }
paul718e3742002-12-13 20:15:29 +0000669 break;
670#endif /* HAVE_NSSA */
671
672 case OSPF_AREA_TYPE_MAX:
673 case OSPF_AREA_STUB:
674 continue_flag = 1; /* Skip this area. */
675 break;
676
677 case OSPF_AREA_DEFAULT:
678 default:
679#ifdef HAVE_NSSA
680 /* No Type-7 into normal area */
681 if (lsa->data->type == OSPF_AS_NSSA_LSA)
682 continue_flag = 1; /* skip Type-7 */
683 else
684#endif /* HAVE_NSSA */
685 continue_flag = 0; /* Do this area. */
686 break;
687 }
688
689 /* Do continue for above switch. Saves a big if then mess */
690 if (continue_flag)
691 continue; /* main for-loop */
692
693 /* send to every interface in this area */
694
695 for (if_node = listhead (area->oiflist); if_node; nextnode (if_node))
696 {
697 struct ospf_interface *oi = getdata (if_node);
698
699 /* Skip virtual links */
700 if (oi->type != OSPF_IFTYPE_VIRTUALLINK)
701 if (ospf_flood_through_interface (oi, inbr, lsa)) /* lsa */
702 lsa_ack_flag = 1;
703 }
704 } /* main area for-loop */
705
706 return (lsa_ack_flag);
707}
708
709int
710ospf_flood_through (struct ospf_neighbor *inbr, struct ospf_lsa *lsa)
711{
712 int lsa_ack_flag = 0;
713
714 /* Type-7 LSA's for NSSA are flooded throughout the AS here, and
715 upon return are updated in the LSDB for Type-7's. Later,
716 re-fresh will re-send them (and also, if ABR, packet code will
717 translate to Type-5's)
718
719 As usual, Type-5 LSA's (if not DISCARDED because we are STUB or
720 NSSA) are flooded throughout the AS, and are updated in the
721 global table. */
722#ifdef ORIGINAL_CODING
723 switch (lsa->data->type)
724 {
725 case OSPF_ROUTER_LSA:
726 case OSPF_NETWORK_LSA:
727 case OSPF_SUMMARY_LSA:
728 case OSPF_ASBR_SUMMARY_LSA:
729#ifdef HAVE_OPAQUE_LSA
730 case OSPF_OPAQUE_LINK_LSA: /* ospf_flood_through_interface ? */
731 case OSPF_OPAQUE_AREA_LSA:
732#endif /* HAVE_OPAQUE_LSA */
733 lsa_ack_flag = ospf_flood_through_area (inbr->oi->area, inbr, lsa);
734 break;
735 case OSPF_AS_EXTERNAL_LSA: /* Type-5 */
736#ifdef HAVE_OPAQUE_LSA
737 case OSPF_OPAQUE_AS_LSA:
738#endif /* HAVE_OPAQUE_LSA */
739 lsa_ack_flag = ospf_flood_through_as (inbr, lsa);
740 break;
741#ifdef HAVE_NSSA
742 /* Type-7 Only received within NSSA, then flooded */
743 case OSPF_AS_NSSA_LSA:
744 /* Any P-bit was installed with the Type-7. */
745 lsa_ack_flag = ospf_flood_through_area (inbr->oi->area, inbr, lsa);
746
747 if (IS_DEBUG_OSPF_NSSA)
748 zlog_info ("ospf_flood_through: LOCAL NSSA FLOOD of Type-7.");
749 break;
750#endif /* HAVE_NSSA */
751 default:
752 break;
753 }
754#else /* ORIGINAL_CODING */
755 /*
756 * At the common sub-sub-function "ospf_flood_through_interface()",
757 * a parameter "inbr" will be used to distinguish the called context
758 * whether the given LSA was received from the neighbor, or the
759 * flooding for the LSA starts from this node (e.g. the LSA was self-
760 * originated, or the LSA is going to be flushed from routing domain).
761 *
762 * So, for consistency reasons, this function "ospf_flood_through()"
763 * should also allow the usage that the given "inbr" parameter to be
764 * NULL. If we do so, corresponding AREA parameter should be referred
765 * by "lsa->area", instead of "inbr->oi->area".
766 */
767 switch (lsa->data->type)
768 {
769 case OSPF_AS_EXTERNAL_LSA: /* Type-5 */
770#ifdef HAVE_OPAQUE_LSA
771 case OSPF_OPAQUE_AS_LSA:
772#endif /* HAVE_OPAQUE_LSA */
773 lsa_ack_flag = ospf_flood_through_as (inbr, lsa);
774 break;
775#ifdef HAVE_NSSA
776 /* Type-7 Only received within NSSA, then flooded */
777 case OSPF_AS_NSSA_LSA:
778 /* Any P-bit was installed with the Type-7. */
779
780 if (IS_DEBUG_OSPF_NSSA)
781 zlog_info ("ospf_flood_through: LOCAL NSSA FLOOD of Type-7.");
782 /* Fallthrough */
783#endif /* HAVE_NSSA */
784 default:
785 lsa_ack_flag = ospf_flood_through_area (lsa->area, inbr, lsa);
786 break;
787 }
788#endif /* ORIGINAL_CODING */
789
790 return (lsa_ack_flag);
791}
792
793
794
795/* Management functions for neighbor's Link State Request list. */
796void
797ospf_ls_request_add (struct ospf_neighbor *nbr, struct ospf_lsa *lsa)
798{
799 /*
800 * We cannot make use of the newly introduced callback function
801 * "lsdb->new_lsa_hook" to replace debug output below, just because
802 * it seems no simple and smart way to pass neighbor information to
803 * the common function "ospf_lsdb_add()" -- endo.
804 */
805 if (IS_DEBUG_OSPF (lsa, LSA_FLOODING))
806 zlog_info ("RqstL(%lu)++, NBR(%s), LSA[%s]",
807 ospf_ls_request_count (nbr),
808 inet_ntoa (nbr->router_id), dump_lsa_key (lsa));
809
810 ospf_lsdb_add (&nbr->ls_req, lsa);
811}
812
813unsigned long
814ospf_ls_request_count (struct ospf_neighbor *nbr)
815{
816 return ospf_lsdb_count_all (&nbr->ls_req);
817}
818
819int
820ospf_ls_request_isempty (struct ospf_neighbor *nbr)
821{
822 return ospf_lsdb_isempty (&nbr->ls_req);
823}
824
825/* Remove LSA from neighbor's ls-request list. */
826void
827ospf_ls_request_delete (struct ospf_neighbor *nbr, struct ospf_lsa *lsa)
828{
829 if (nbr->ls_req_last == lsa)
830 {
831 ospf_lsa_unlock (nbr->ls_req_last);
832 nbr->ls_req_last = NULL;
833 }
834
835 if (IS_DEBUG_OSPF (lsa, LSA_FLOODING)) /* -- endo. */
836 zlog_info ("RqstL(%lu)--, NBR(%s), LSA[%s]",
837 ospf_ls_request_count (nbr),
838 inet_ntoa (nbr->router_id), dump_lsa_key (lsa));
839
840 ospf_lsdb_delete (&nbr->ls_req, lsa);
841}
842
843/* Remove all LSA from neighbor's ls-requenst list. */
844void
845ospf_ls_request_delete_all (struct ospf_neighbor *nbr)
846{
847 ospf_lsa_unlock (nbr->ls_req_last);
848 nbr->ls_req_last = NULL;
849 ospf_lsdb_delete_all (&nbr->ls_req);
850}
851
852/* Lookup LSA from neighbor's ls-request list. */
853struct ospf_lsa *
854ospf_ls_request_lookup (struct ospf_neighbor *nbr, struct ospf_lsa *lsa)
855{
856 return ospf_lsdb_lookup (&nbr->ls_req, lsa);
857}
858
859struct ospf_lsa *
860ospf_ls_request_new (struct lsa_header *lsah)
861{
862 struct ospf_lsa *new;
863
864 new = ospf_lsa_new ();
865 new->data = ospf_lsa_data_new (OSPF_LSA_HEADER_SIZE);
866 memcpy (new->data, lsah, OSPF_LSA_HEADER_SIZE);
867
868 return new;
869}
870
871
872/* Management functions for neighbor's ls-retransmit list. */
873unsigned long
874ospf_ls_retransmit_count (struct ospf_neighbor *nbr)
875{
876 return ospf_lsdb_count_all (&nbr->ls_rxmt);
877}
878
879unsigned long
880ospf_ls_retransmit_count_self (struct ospf_neighbor *nbr, int lsa_type)
881{
882 return ospf_lsdb_count_self (&nbr->ls_rxmt, lsa_type);
883}
884
885int
886ospf_ls_retransmit_isempty (struct ospf_neighbor *nbr)
887{
888 return ospf_lsdb_isempty (&nbr->ls_rxmt);
889}
890
891/* Add LSA to be retransmitted to neighbor's ls-retransmit list. */
892void
893ospf_ls_retransmit_add (struct ospf_neighbor *nbr, struct ospf_lsa *lsa)
894{
895 struct ospf_lsa *old;
896
897 old = ospf_ls_retransmit_lookup (nbr, lsa);
898
899 if (ospf_lsa_more_recent (old, lsa) < 0)
900 {
901 if (old)
902 {
903 old->retransmit_counter--;
904 ospf_lsdb_delete (&nbr->ls_rxmt, old);
905 }
906 lsa->retransmit_counter++;
907 /*
908 * We cannot make use of the newly introduced callback function
909 * "lsdb->new_lsa_hook" to replace debug output below, just because
910 * it seems no simple and smart way to pass neighbor information to
911 * the common function "ospf_lsdb_add()" -- endo.
912 */
913 if (IS_DEBUG_OSPF (lsa, LSA_FLOODING))
914 zlog_info ("RXmtL(%lu)++, NBR(%s), LSA[%s]",
915 ospf_ls_retransmit_count (nbr),
916 inet_ntoa (nbr->router_id), dump_lsa_key (lsa));
917 ospf_lsdb_add (&nbr->ls_rxmt, lsa);
918 }
919}
920
921/* Remove LSA from neibghbor's ls-retransmit list. */
922void
923ospf_ls_retransmit_delete (struct ospf_neighbor *nbr, struct ospf_lsa *lsa)
924{
925 if (ospf_ls_retransmit_lookup (nbr, lsa))
926 {
927 lsa->retransmit_counter--;
928 if (IS_DEBUG_OSPF (lsa, LSA_FLOODING)) /* -- endo. */
929 zlog_info ("RXmtL(%lu)--, NBR(%s), LSA[%s]",
930 ospf_ls_retransmit_count (nbr),
931 inet_ntoa (nbr->router_id), dump_lsa_key (lsa));
932 ospf_lsdb_delete (&nbr->ls_rxmt, lsa);
933 }
934}
935
936/* Clear neighbor's ls-retransmit list. */
937void
938ospf_ls_retransmit_clear (struct ospf_neighbor *nbr)
939{
940 struct ospf_lsdb *lsdb;
941 int i;
942
943 lsdb = &nbr->ls_rxmt;
944
945 for (i = OSPF_MIN_LSA; i < OSPF_MAX_LSA; i++)
946 {
947 struct route_table *table = lsdb->type[i].db;
948 struct route_node *rn;
949 struct ospf_lsa *lsa;
950
951 for (rn = route_top (table); rn; rn = route_next (rn))
952 if ((lsa = rn->info) != NULL)
953 ospf_ls_retransmit_delete (nbr, lsa);
954 }
955
956 ospf_lsa_unlock (nbr->ls_req_last);
957 nbr->ls_req_last = NULL;
958}
959
960/* Lookup LSA from neighbor's ls-retransmit list. */
961struct ospf_lsa *
962ospf_ls_retransmit_lookup (struct ospf_neighbor *nbr, struct ospf_lsa *lsa)
963{
964 return ospf_lsdb_lookup (&nbr->ls_rxmt, lsa);
965}
966
967/* Remove All neighbor/interface's Link State Retransmit list in area. */
968void
969ospf_ls_retransmit_delete_nbr_all (struct ospf_area *area,
970 struct ospf_lsa *lsa)
971{
972 listnode node;
973 list oiflist = area ? area->oiflist : ospf_top->oiflist;
974
975 for (node = listhead (oiflist); node; nextnode (node))
976 {
977 struct ospf_interface *oi = getdata (node);
978 struct route_node *rn;
979 struct ospf_neighbor *nbr;
980 struct ospf_lsa *lsr;
981
982 if (ospf_if_is_enable (oi))
983 for (rn = route_top (oi->nbrs); rn; rn = route_next (rn))
984 /* If LSA find in LS-retransmit list, then remove it. */
985 if ((nbr = rn->info) != NULL)
986 {
987 lsr = ospf_ls_retransmit_lookup (nbr, lsa);
988
989 /* If LSA find in ls-retransmit list, remove it. */
990 if (lsr != NULL && lsr->data->ls_seqnum == lsa->data->ls_seqnum)
991 ospf_ls_retransmit_delete (nbr, lsr);
992 }
993 }
994}
995
996/* Add LSA to the current database copy of all neighbors'
997 Link state retransmission lists. */
998void
999ospf_ls_retransmit_add_nbr_all (struct ospf_interface *ospfi,
1000 struct ospf_lsa *lsa)
1001{
1002 listnode node;
1003
1004 for (node = listhead (ospf_top->oiflist); node; nextnode (node))
1005 {
1006 struct ospf_interface *oi = getdata (node);
1007 struct route_node *rn;
1008 struct ospf_neighbor *nbr;
1009 struct ospf_lsa *old;
1010
1011 if (ospf_if_is_enable (oi))
1012 if (OSPF_AREA_SAME (&ospfi->area, &oi->area))
1013 for (rn = route_top (oi->nbrs); rn; rn = route_next (rn))
1014 if ((nbr = rn->info) != NULL)
1015 if (nbr->state == NSM_Full)
1016 {
1017 if ((old = ospf_ls_retransmit_lookup (nbr, lsa)))
1018 ospf_ls_retransmit_delete (nbr, old);
1019
1020 ospf_ls_retransmit_add (nbr, lsa);
1021 }
1022 }
1023}
1024
1025
1026/* Sets ls_age to MaxAge and floods throu the area.
1027 When we implement ASE routing, there will be anothe function
1028 flushing an LSA from the whole domain. */
1029void
1030ospf_lsa_flush_area (struct ospf_lsa *lsa, struct ospf_area *area)
1031{
1032 lsa->data->ls_age = htons (OSPF_LSA_MAXAGE);
1033 ospf_flood_through_area (area, NULL, lsa);
1034 ospf_lsa_maxage (lsa);
1035}
1036
1037void
1038ospf_lsa_flush_as (struct ospf_lsa *lsa)
1039{
1040 lsa->data->ls_age = htons (OSPF_LSA_MAXAGE);
1041 ospf_flood_through_as (NULL, lsa);
1042 ospf_lsa_maxage (lsa);
1043}
1044
1045/* Flush LSA through AS -- used for AS-external-LSAs. */
1046void
1047ospf_flush_through_as (struct ospf_lsa *lsa)
1048{
1049 lsa->data->ls_age = htons (OSPF_LSA_MAXAGE);
1050 ospf_flood_through_as (NULL, lsa);
1051 ospf_lsa_maxage (lsa);
1052}