1 /*
2  * OSPF ABR functions.
3  * Copyright (C) 1999, 2000 Alex Zinin, 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 it
8  * under the terms of the GNU General Public License as published by the
9  * Free Software Foundation; either version 2, or (at your option) any
10  * 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 Free
19  * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
20  * 02111-1307, USA.
21  */
22 
23 
24 #include <zebra.h>
25 
26 #include "thread.h"
27 #include "memory.h"
28 #include "linklist.h"
29 #include "prefix.h"
30 #include "if.h"
31 #include "table.h"
32 #include "vty.h"
33 #include "filter.h"
34 #include "plist.h"
35 #include "log.h"
36 
37 #include "ospfd/ospfd.h"
38 #include "ospfd/ospf_interface.h"
39 #include "ospfd/ospf_ism.h"
40 #include "ospfd/ospf_asbr.h"
41 #include "ospfd/ospf_lsa.h"
42 #include "ospfd/ospf_lsdb.h"
43 #include "ospfd/ospf_neighbor.h"
44 #include "ospfd/ospf_nsm.h"
45 #include "ospfd/ospf_spf.h"
46 #include "ospfd/ospf_route.h"
47 #include "ospfd/ospf_ia.h"
48 #include "ospfd/ospf_flood.h"
49 #include "ospfd/ospf_abr.h"
50 #include "ospfd/ospf_ase.h"
51 #include "ospfd/ospf_zebra.h"
52 #include "ospfd/ospf_dump.h"
53 
54 static struct ospf_area_range *
ospf_area_range_new(struct prefix_ipv4 * p)55 ospf_area_range_new (struct prefix_ipv4 *p)
56 {
57   struct ospf_area_range *range;
58 
59   range = XCALLOC (MTYPE_OSPF_AREA_RANGE, sizeof (struct ospf_area_range));
60   range->addr = p->prefix;
61   range->masklen = p->prefixlen;
62   range->cost_config = OSPF_AREA_RANGE_COST_UNSPEC;
63 
64   return range;
65 }
66 
67 static void
ospf_area_range_free(struct ospf_area_range * range)68 ospf_area_range_free (struct ospf_area_range *range)
69 {
70   XFREE (MTYPE_OSPF_AREA_RANGE, range);
71 }
72 
73 static void
ospf_area_range_add(struct ospf_area * area,struct ospf_area_range * range)74 ospf_area_range_add (struct ospf_area *area, struct ospf_area_range *range)
75 {
76   struct route_node *rn;
77   struct prefix_ipv4 p;
78 
79   p.family = AF_INET;
80   p.prefixlen = range->masklen;
81   p.prefix = range->addr;
82 
83   rn = route_node_get (area->ranges, (struct prefix *)&p);
84   if (rn->info)
85     route_unlock_node (rn);
86   else
87     rn->info = range;
88 }
89 
90 static void
ospf_area_range_delete(struct ospf_area * area,struct route_node * rn)91 ospf_area_range_delete (struct ospf_area *area, struct route_node *rn)
92 {
93   struct ospf_area_range *range = rn->info;
94 
95   if (range->specifics != 0)
96     ospf_delete_discard_route (area->ospf->new_table,
97 			       (struct prefix_ipv4 *) &rn->p);
98 
99   ospf_area_range_free (range);
100   rn->info = NULL;
101   route_unlock_node (rn);
102   route_unlock_node (rn);
103 }
104 
105 struct ospf_area_range *
ospf_area_range_lookup(struct ospf_area * area,struct prefix_ipv4 * p)106 ospf_area_range_lookup (struct ospf_area *area, struct prefix_ipv4 *p)
107 {
108   struct route_node *rn;
109 
110   rn = route_node_lookup (area->ranges, (struct prefix *)p);
111   if (rn)
112     {
113       route_unlock_node (rn);
114       return rn->info;
115     }
116   return NULL;
117 }
118 
119 struct ospf_area_range *
ospf_area_range_lookup_next(struct ospf_area * area,struct in_addr * range_net,int first)120 ospf_area_range_lookup_next (struct ospf_area *area,
121                              struct in_addr *range_net,
122                              int first)
123 {
124   struct route_node *rn;
125   struct prefix_ipv4 p;
126   struct ospf_area_range *find;
127 
128   p.family = AF_INET;
129   p.prefixlen = IPV4_MAX_BITLEN;
130   p.prefix = *range_net;
131 
132   if (first)
133     rn = route_top (area->ranges);
134   else
135     {
136       rn = route_node_get (area->ranges, (struct prefix *) &p);
137       rn = route_next (rn);
138     }
139 
140   for (; rn; rn = route_next (rn))
141     if (rn->info)
142       break;
143 
144   if (rn && rn->info)
145     {
146       find = rn->info;
147       *range_net = rn->p.u.prefix4;
148       route_unlock_node (rn);
149       return find;
150     }
151   return NULL;
152 }
153 
154 static struct ospf_area_range *
ospf_area_range_match(struct ospf_area * area,struct prefix_ipv4 * p)155 ospf_area_range_match (struct ospf_area *area, struct prefix_ipv4 *p)
156 {
157   struct route_node *node;
158 
159   node = route_node_match (area->ranges, (struct prefix *) p);
160   if (node)
161     {
162       route_unlock_node (node);
163       return node->info;
164     }
165   return NULL;
166 }
167 
168 struct ospf_area_range *
ospf_area_range_match_any(struct ospf * ospf,struct prefix_ipv4 * p)169 ospf_area_range_match_any (struct ospf *ospf, struct prefix_ipv4 *p)
170 {
171   struct ospf_area_range *range;
172   struct ospf_area *area;
173   struct listnode *node;
174 
175   for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area))
176     if ((range = ospf_area_range_match (area, p)))
177       return range;
178 
179   return NULL;
180 }
181 
182 int
ospf_area_range_active(struct ospf_area_range * range)183 ospf_area_range_active (struct ospf_area_range *range)
184 {
185   return range->specifics;
186 }
187 
188 static int
ospf_area_actively_attached(struct ospf_area * area)189 ospf_area_actively_attached (struct ospf_area *area)
190 {
191   return area->act_ints;
192 }
193 
194 int
ospf_area_range_set(struct ospf * ospf,struct in_addr area_id,struct prefix_ipv4 * p,int advertise)195 ospf_area_range_set (struct ospf *ospf, struct in_addr area_id,
196 		     struct prefix_ipv4 *p, int advertise)
197 {
198   struct ospf_area *area;
199   struct ospf_area_range *range;
200   int ret = OSPF_AREA_ID_FORMAT_ADDRESS;
201 
202   area = ospf_area_get (ospf, area_id, ret);
203   if (area == NULL)
204     return 0;
205 
206   range = ospf_area_range_lookup (area, p);
207   if (range != NULL)
208     {
209       if ((CHECK_FLAG (range->flags, OSPF_AREA_RANGE_ADVERTISE)
210 	   && !CHECK_FLAG (advertise, OSPF_AREA_RANGE_ADVERTISE))
211 	  || (!CHECK_FLAG (range->flags, OSPF_AREA_RANGE_ADVERTISE)
212 	      && CHECK_FLAG (advertise, OSPF_AREA_RANGE_ADVERTISE)))
213 	ospf_schedule_abr_task (ospf);
214     }
215   else
216     {
217       range = ospf_area_range_new (p);
218       ospf_area_range_add (area, range);
219       ospf_schedule_abr_task (ospf);
220     }
221 
222   if (CHECK_FLAG (advertise, OSPF_AREA_RANGE_ADVERTISE))
223     SET_FLAG (range->flags, OSPF_AREA_RANGE_ADVERTISE);
224   else
225     UNSET_FLAG (range->flags, OSPF_AREA_RANGE_ADVERTISE);
226 
227   return 1;
228 }
229 
230 int
ospf_area_range_cost_set(struct ospf * ospf,struct in_addr area_id,struct prefix_ipv4 * p,u_int32_t cost)231 ospf_area_range_cost_set (struct ospf *ospf, struct in_addr area_id,
232 			  struct prefix_ipv4 *p, u_int32_t cost)
233 {
234   struct ospf_area *area;
235   struct ospf_area_range *range;
236   int ret = OSPF_AREA_ID_FORMAT_ADDRESS;
237 
238   area = ospf_area_get (ospf, area_id, ret);
239   if (area == NULL)
240     return 0;
241 
242   range = ospf_area_range_lookup (area, p);
243   if (range == NULL)
244     return 0;
245 
246   if (range->cost_config != cost)
247     {
248       range->cost_config = cost;
249       if (ospf_area_range_active (range))
250 	ospf_schedule_abr_task (ospf);
251     }
252 
253   return 1;
254 }
255 
256 int
ospf_area_range_unset(struct ospf * ospf,struct in_addr area_id,struct prefix_ipv4 * p)257 ospf_area_range_unset (struct ospf *ospf, struct in_addr area_id,
258 		       struct prefix_ipv4 *p)
259 {
260   struct ospf_area *area;
261   struct route_node *rn;
262 
263   area = ospf_area_lookup_by_area_id (ospf, area_id);
264   if (area == NULL)
265     return 0;
266 
267   rn = route_node_lookup (area->ranges, (struct prefix*)p);
268   if (rn == NULL)
269     return 0;
270 
271   if (ospf_area_range_active (rn->info))
272     ospf_schedule_abr_task (ospf);
273 
274   ospf_area_range_delete (area, rn);
275 
276   return 1;
277 }
278 
279 int
ospf_area_range_substitute_set(struct ospf * ospf,struct in_addr area_id,struct prefix_ipv4 * p,struct prefix_ipv4 * s)280 ospf_area_range_substitute_set (struct ospf *ospf, struct in_addr area_id,
281 				struct prefix_ipv4 *p, struct prefix_ipv4 *s)
282 {
283   struct ospf_area *area;
284   struct ospf_area_range *range;
285   int ret = OSPF_AREA_ID_FORMAT_ADDRESS;
286 
287   area = ospf_area_get (ospf, area_id, ret);
288   range = ospf_area_range_lookup (area, p);
289 
290   if (range != NULL)
291     {
292       if (!CHECK_FLAG (range->flags, OSPF_AREA_RANGE_ADVERTISE) ||
293 	  !CHECK_FLAG (range->flags, OSPF_AREA_RANGE_SUBSTITUTE))
294 	ospf_schedule_abr_task (ospf);
295     }
296   else
297     {
298       range = ospf_area_range_new (p);
299       ospf_area_range_add (area, range);
300       ospf_schedule_abr_task (ospf);
301     }
302 
303   SET_FLAG (range->flags, OSPF_AREA_RANGE_ADVERTISE);
304   SET_FLAG (range->flags, OSPF_AREA_RANGE_SUBSTITUTE);
305   range->subst_addr = s->prefix;
306   range->subst_masklen = s->prefixlen;
307 
308   return 1;
309 }
310 
311 int
ospf_area_range_substitute_unset(struct ospf * ospf,struct in_addr area_id,struct prefix_ipv4 * p)312 ospf_area_range_substitute_unset (struct ospf *ospf, struct in_addr area_id,
313 				  struct prefix_ipv4 *p)
314 {
315   struct ospf_area *area;
316   struct ospf_area_range *range;
317 
318   area = ospf_area_lookup_by_area_id (ospf, area_id);
319   if (area == NULL)
320     return 0;
321 
322   range = ospf_area_range_lookup (area, p);
323   if (range == NULL)
324     return 0;
325 
326   if (CHECK_FLAG (range->flags, OSPF_AREA_RANGE_SUBSTITUTE))
327     if (ospf_area_range_active (range))
328       ospf_schedule_abr_task (ospf);
329 
330   UNSET_FLAG (range->flags, OSPF_AREA_RANGE_SUBSTITUTE);
331   range->subst_addr.s_addr = 0;
332   range->subst_masklen = 0;
333 
334   return 1;
335 }
336 
337 int
ospf_act_bb_connection(struct ospf * ospf)338 ospf_act_bb_connection (struct ospf *ospf)
339 {
340   if (ospf->backbone == NULL)
341     return 0;
342 
343   return ospf->backbone->full_nbrs;
344 }
345 
346 /* Determine whether this router is elected translator or not for area */
347 static int
ospf_abr_nssa_am_elected(struct ospf_area * area)348 ospf_abr_nssa_am_elected (struct ospf_area *area)
349 {
350   struct route_node *rn;
351   struct ospf_lsa *lsa;
352   struct router_lsa *rlsa;
353   struct in_addr *best = NULL;
354 
355   LSDB_LOOP ( ROUTER_LSDB (area), rn, lsa)
356     {
357       /* sanity checks */
358       if (!lsa
359           || (lsa->data->type != OSPF_ROUTER_LSA)
360           || IS_LSA_SELF (lsa))
361         continue;
362 
363       rlsa = (struct router_lsa *) lsa->data;
364 
365       /* ignore non-ABR routers */
366       if (!IS_ROUTER_LSA_BORDER (rlsa))
367         continue;
368 
369       /* Router has Nt flag - always translate */
370       if (IS_ROUTER_LSA_NT (rlsa))
371         {
372           if (IS_DEBUG_OSPF_NSSA)
373             zlog_debug ("ospf_abr_nssa_am_elected: "
374                        "router %s asserts Nt",
375                        inet_ntoa (lsa->data->id) );
376           return 0;
377         }
378 
379       if (best == NULL)
380       	best = &lsa->data->id;
381       else
382         if (IPV4_ADDR_CMP (&best->s_addr, &lsa->data->id.s_addr) < 0)
383           best = &lsa->data->id;
384     }
385 
386     if (IS_DEBUG_OSPF_NSSA)
387       zlog_debug ("ospf_abr_nssa_am_elected: best electable ABR is: %s",
388                   (best) ? inet_ntoa (*best) : "<none>" );
389 
390     if (best == NULL)
391       return 1;
392 
393     if (IPV4_ADDR_CMP (&best->s_addr, &area->ospf->router_id.s_addr) < 0)
394       return 1;
395     else
396       return 0;
397 }
398 
399 /* Check NSSA ABR status
400  * assumes there are nssa areas
401  */
402 static void
ospf_abr_nssa_check_status(struct ospf * ospf)403 ospf_abr_nssa_check_status (struct ospf *ospf)
404 {
405   struct ospf_area *area;
406   struct listnode *lnode, *nnode;
407 
408   for (ALL_LIST_ELEMENTS (ospf->areas, lnode, nnode, area))
409     {
410       u_char old_state = area->NSSATranslatorState;
411 
412       if (area->external_routing != OSPF_AREA_NSSA)
413         continue;
414 
415       if (IS_DEBUG_OSPF (nssa, NSSA))
416         zlog_debug ("ospf_abr_nssa_check_status: "
417                     "checking area %s",
418                     inet_ntoa (area->area_id));
419 
420       if (!IS_OSPF_ABR (area->ospf))
421         {
422           if (IS_DEBUG_OSPF (nssa, NSSA))
423             zlog_debug ("ospf_abr_nssa_check_status: "
424                         "not ABR");
425           area->NSSATranslatorState = OSPF_NSSA_TRANSLATE_DISABLED;
426         }
427       else
428         {
429           switch (area->NSSATranslatorRole)
430             {
431             case OSPF_NSSA_ROLE_NEVER:
432               /* We never Translate Type-7 LSA. */
433               /* TODO: check previous state and flush? */
434               if (IS_DEBUG_OSPF (nssa, NSSA))
435                 zlog_debug ("ospf_abr_nssa_check_status: "
436 			    "never translate");
437               area->NSSATranslatorState = OSPF_NSSA_TRANSLATE_DISABLED;
438               break;
439 
440             case OSPF_NSSA_ROLE_ALWAYS:
441               /* We always translate if we are an ABR
442                * TODO: originate new LSAs if state change?
443                * or let the nssa abr task take care of it?
444                */
445               if (IS_DEBUG_OSPF (nssa, NSSA))
446                 zlog_debug ("ospf_abr_nssa_check_status: "
447                             "translate always");
448               area->NSSATranslatorState = OSPF_NSSA_TRANSLATE_ENABLED;
449               break;
450 
451             case OSPF_NSSA_ROLE_CANDIDATE:
452               /* We are a candidate for Translation */
453               if (ospf_abr_nssa_am_elected (area) > 0)
454                 {
455                   area->NSSATranslatorState = OSPF_NSSA_TRANSLATE_ENABLED;
456                   if (IS_DEBUG_OSPF (nssa, NSSA))
457                     zlog_debug ("ospf_abr_nssa_check_status: "
458                                 "elected translator");
459                 }
460               else
461                 {
462                   area->NSSATranslatorState = OSPF_NSSA_TRANSLATE_DISABLED;
463                   if (IS_DEBUG_OSPF (nssa, NSSA))
464                     zlog_debug ("ospf_abr_nssa_check_status: " "not elected");
465                 }
466               break;
467             }
468         }
469       /* RFC3101, 3.1:
470        * All NSSA border routers must set the E-bit in the Type-1 router-LSAs
471        * of their directly attached non-stub areas, even when they are not
472        * translating.
473        */
474       if (old_state != area->NSSATranslatorState)
475       	{
476           if (old_state == OSPF_NSSA_TRANSLATE_DISABLED)
477 	    ospf_asbr_status_update (ospf, ++ospf->redistribute);
478 	  else if (area->NSSATranslatorState == OSPF_NSSA_TRANSLATE_DISABLED)
479 	    ospf_asbr_status_update (ospf, --ospf->redistribute);
480 	}
481     }
482 }
483 
484 /* Check area border router status. */
485 void
ospf_check_abr_status(struct ospf * ospf)486 ospf_check_abr_status (struct ospf *ospf)
487 {
488   struct ospf_area *area;
489   struct listnode *node, *nnode;
490   int bb_configured = 0;
491   int bb_act_attached = 0;
492   int areas_configured = 0;
493   int areas_act_attached = 0;
494   u_char new_flags = ospf->flags;
495 
496   if (IS_DEBUG_OSPF_EVENT)
497     zlog_debug ("ospf_check_abr_status(): Start");
498 
499   for (ALL_LIST_ELEMENTS (ospf->areas, node, nnode, area))
500     {
501       if (listcount (area->oiflist))
502 	{
503 	  areas_configured++;
504 
505 	  if (OSPF_IS_AREA_BACKBONE (area))
506  	    bb_configured = 1;
507 	}
508 
509       if (ospf_area_actively_attached (area))
510 	{
511 	  areas_act_attached++;
512 
513 	  if (OSPF_IS_AREA_BACKBONE (area))
514             bb_act_attached = 1;
515 	}
516     }
517 
518   if (IS_DEBUG_OSPF_EVENT)
519     {
520       zlog_debug ("ospf_check_abr_status(): looked through areas");
521       zlog_debug ("ospf_check_abr_status(): bb_configured: %d", bb_configured);
522       zlog_debug ("ospf_check_abr_status(): bb_act_attached: %d",
523 		 bb_act_attached);
524       zlog_debug ("ospf_check_abr_status(): areas_configured: %d",
525 		 areas_configured);
526       zlog_debug ("ospf_check_abr_status(): areas_act_attached: %d",
527 		 areas_act_attached);
528     }
529 
530   switch (ospf->abr_type)
531     {
532     case OSPF_ABR_SHORTCUT:
533     case OSPF_ABR_STAND:
534       if (areas_act_attached > 1)
535 	SET_FLAG (new_flags, OSPF_FLAG_ABR);
536       else
537 	UNSET_FLAG (new_flags, OSPF_FLAG_ABR);
538       break;
539 
540     case OSPF_ABR_IBM:
541       if ((areas_act_attached > 1) && bb_configured)
542 	SET_FLAG (new_flags, OSPF_FLAG_ABR);
543       else
544 	UNSET_FLAG (new_flags, OSPF_FLAG_ABR);
545       break;
546 
547     case OSPF_ABR_CISCO:
548       if ((areas_configured > 1) && bb_act_attached)
549 	SET_FLAG (new_flags, OSPF_FLAG_ABR);
550       else
551 	UNSET_FLAG (new_flags, OSPF_FLAG_ABR);
552       break;
553     default:
554       break;
555     }
556 
557   if (new_flags != ospf->flags)
558     {
559       ospf_spf_calculate_schedule (ospf, SPF_FLAG_ABR_STATUS_CHANGE);
560       if (IS_DEBUG_OSPF_EVENT)
561 	zlog_debug ("ospf_check_abr_status(): new router flags: %x",new_flags);
562       ospf->flags = new_flags;
563       ospf_router_lsa_update (ospf);
564     }
565 }
566 
567 static void
ospf_abr_update_aggregate(struct ospf_area_range * range,struct ospf_route * or,struct ospf_area * area)568 ospf_abr_update_aggregate (struct ospf_area_range *range,
569                            struct ospf_route *or, struct ospf_area *area)
570 {
571   if (IS_DEBUG_OSPF_EVENT)
572     zlog_debug ("ospf_abr_update_aggregate(): Start");
573 
574   if (CHECK_FLAG (area->stub_router_state, OSPF_AREA_IS_STUB_ROUTED) &&
575       (range->cost != OSPF_STUB_MAX_METRIC_SUMMARY_COST))
576     {
577       range->cost = OSPF_STUB_MAX_METRIC_SUMMARY_COST;
578       if (IS_DEBUG_OSPF_EVENT)
579         zlog_debug ("ospf_abr_update_aggregate(): use summary max-metric 0x%08x",
580                    range->cost);
581     }
582   else if (range->cost_config != OSPF_AREA_RANGE_COST_UNSPEC)
583     {
584       if (IS_DEBUG_OSPF_EVENT)
585         zlog_debug ("ospf_abr_update_aggregate(): use configured cost %d",
586                    range->cost_config);
587 
588       range->cost = range->cost_config;
589     }
590   else
591     {
592       if (range->specifics == 0)
593 	{
594 	  if (IS_DEBUG_OSPF_EVENT)
595 	    zlog_debug ("ospf_abr_update_aggregate(): use or->cost %d",
596 			or->cost);
597 
598 	  range->cost = or->cost; /* 1st time get 1st cost */
599 	}
600 
601       if (or->cost > range->cost)
602         {
603           if (IS_DEBUG_OSPF_EVENT)
604             zlog_debug ("ospf_abr_update_aggregate(): update to %d", or->cost);
605 
606           range->cost = or->cost;
607         }
608     }
609 
610   range->specifics++;
611 }
612 
613 static void
set_metric(struct ospf_lsa * lsa,u_int32_t metric)614 set_metric (struct ospf_lsa *lsa, u_int32_t metric)
615 {
616   struct summary_lsa *header;
617   u_char *mp;
618   metric = htonl (metric);
619   mp = (u_char *) &metric;
620   mp++;
621   header = (struct summary_lsa *) lsa->data;
622   memcpy(header->metric, mp, 3);
623 }
624 
625 /* ospf_abr_translate_nssa */
626 static int
ospf_abr_translate_nssa(struct ospf_area * area,struct ospf_lsa * lsa)627 ospf_abr_translate_nssa (struct ospf_area *area, struct ospf_lsa *lsa)
628 {
629   /* Incoming Type-7 or later aggregated Type-7
630    *
631    * LSA is skipped if P-bit is off.
632    * LSA is aggregated if within range.
633    *
634    * The Type-7 is translated, Installed/Approved as a Type-5 into
635    * global LSDB, then Flooded through AS
636    *
637    *  Later, any Unapproved Translated Type-5's are flushed/discarded
638    */
639 
640   struct ospf_lsa *old = NULL,
641                   *new = NULL;
642   struct as_external_lsa *ext7;
643   struct prefix_ipv4 p;
644 
645   if (! CHECK_FLAG (lsa->data->options, OSPF_OPTION_NP))
646     {
647       if (IS_DEBUG_OSPF_NSSA)
648         zlog_debug ("ospf_abr_translate_nssa(): LSA Id %s, P-bit off, NO Translation",
649                    inet_ntoa (lsa->data->id));
650       return 1;
651     }
652 
653   if (IS_DEBUG_OSPF_NSSA)
654     zlog_debug ("ospf_abr_translate_nssa(): LSA Id %s, TRANSLATING 7 to 5",
655                inet_ntoa (lsa->data->id));
656 
657   ext7 = (struct as_external_lsa *)(lsa->data);
658   p.prefix = lsa->data->id;
659   p.prefixlen = ip_masklen (ext7->mask);
660 
661   if (ext7->e[0].fwd_addr.s_addr == OSPF_DEFAULT_DESTINATION)
662     {
663       if (IS_DEBUG_OSPF_NSSA)
664         zlog_debug ("ospf_abr_translate_nssa(): LSA Id %s, "
665                    "Forward address is 0, NO Translation",
666                    inet_ntoa (lsa->data->id));
667       return 1;
668     }
669 
670   /* try find existing AS-External LSA for this prefix */
671 
672   old = ospf_external_info_find_lsa (area->ospf, &p);
673 
674   if (old)
675     {
676       if (IS_DEBUG_OSPF_NSSA)
677         zlog_debug ("ospf_abr_translate_nssa(): "
678                    "found old translated LSA Id %s, refreshing",
679                    inet_ntoa (old->data->id));
680 
681       /* refresh */
682       new = ospf_translated_nssa_refresh (area->ospf, lsa, old);
683       if (!new)
684         {
685           if (IS_DEBUG_OSPF_NSSA)
686             zlog_debug ("ospf_abr_translate_nssa(): "
687               "could not refresh translated LSA Id %s",
688               inet_ntoa (old->data->id));
689         }
690     }
691   else
692     {
693       /* no existing external route for this LSA Id
694        * originate translated LSA
695        */
696 
697 	  if ((new = ospf_translated_nssa_originate (area->ospf, lsa))
698 	       == NULL)
699 	    {
700 	      if (IS_DEBUG_OSPF_NSSA)
701 	        zlog_debug ("ospf_abr_translate_nssa(): Could not translate "
702 	                   "Type-7 for %s to Type-5",
703 	                   inet_ntoa (lsa->data->id));
704               return 1;
705 	    }
706     }
707 
708   /* Area where Aggregate testing will be inserted, just like summary
709      advertisements */
710   /* ospf_abr_check_nssa_range (p_arg, lsa-> cost, lsa -> area); */
711 
712   return 0;
713 }
714 
715 static void
ospf_abr_translate_nssa_range(struct prefix_ipv4 * p,u_int32_t cost)716 ospf_abr_translate_nssa_range (struct prefix_ipv4 *p, u_int32_t cost)
717 {
718   /* The Type-7 is created from the aggregated prefix and forwarded
719      for lsa installation and flooding... to be added... */
720 }
721 
722 void
ospf_abr_announce_network_to_area(struct prefix_ipv4 * p,u_int32_t cost,struct ospf_area * area)723 ospf_abr_announce_network_to_area (struct prefix_ipv4 *p, u_int32_t cost,
724 				   struct ospf_area *area)
725 {
726   struct ospf_lsa *lsa, *old = NULL;
727   struct summary_lsa *sl = NULL;
728   u_int32_t full_cost;
729 
730   if (IS_DEBUG_OSPF_EVENT)
731     zlog_debug ("ospf_abr_announce_network_to_area(): Start");
732 
733   if (CHECK_FLAG (area->stub_router_state, OSPF_AREA_IS_STUB_ROUTED))
734     full_cost = OSPF_STUB_MAX_METRIC_SUMMARY_COST;
735   else
736     full_cost = cost;
737 
738   old = ospf_lsa_lookup_by_prefix (area->lsdb, OSPF_SUMMARY_LSA,
739                                    (struct prefix_ipv4 *) p,
740                                    area->ospf->router_id);
741   if (old)
742     {
743       if (IS_DEBUG_OSPF_EVENT)
744         zlog_debug ("ospf_abr_announce_network_to_area(): old summary found");
745 
746       sl = (struct summary_lsa *) old->data;
747 
748       if (IS_DEBUG_OSPF_EVENT)
749         zlog_debug ("ospf_abr_announce_network_to_area(): "
750         	   "old metric: %d, new metric: %d",
751                GET_METRIC (sl->metric), cost);
752 
753       if ((GET_METRIC (sl->metric) == full_cost) &&
754 	  ((old->flags & OSPF_LSA_IN_MAXAGE) == 0))
755         {
756           /* unchanged. simply reapprove it */
757           if (IS_DEBUG_OSPF_EVENT)
758             zlog_debug ("ospf_abr_announce_network_to_area(): "
759                        "old summary approved");
760           SET_FLAG (old->flags, OSPF_LSA_APPROVED);
761         }
762       else
763         {
764           /* LSA is changed, refresh it */
765           if (IS_DEBUG_OSPF_EVENT)
766             zlog_debug ("ospf_abr_announce_network_to_area(): "
767                        "refreshing summary");
768           set_metric (old, full_cost);
769           lsa = ospf_lsa_refresh (area->ospf, old);
770 
771           if (!lsa)
772             {
773 	      char buf[INET_ADDRSTRLEN + 3]; /* ipv4 and /XX */
774 
775 	      prefix2str ((struct prefix *) p, buf, sizeof(buf));
776 	      zlog_warn ("%s: Could not refresh %s to %s",
777 	                 __func__,
778 	                 buf,
779 	                 inet_ntoa (area->area_id));
780 	      return;
781 	    }
782 
783           SET_FLAG (lsa->flags, OSPF_LSA_APPROVED);
784           /* This will flood through area. */
785         }
786     }
787   else
788     {
789       if (IS_DEBUG_OSPF_EVENT)
790         zlog_debug ("ospf_abr_announce_network_to_area(): "
791         	   "creating new summary");
792       lsa = ospf_summary_lsa_originate ( (struct prefix_ipv4 *)p, full_cost, area);
793           /* This will flood through area. */
794 
795       if (!lsa)
796       	{
797       	  char buf[INET_ADDRSTRLEN + 3]; /* ipv4 and /XX */
798 
799       	  prefix2str ((struct prefix *)p, buf, sizeof(buf));
800 	  zlog_warn ("%s: Could not originate %s to %s",
801 	             __func__,
802 	             buf,
803 		     inet_ntoa (area->area_id));
804 	  return;
805 	}
806 
807       SET_FLAG (lsa->flags, OSPF_LSA_APPROVED);
808       if (IS_DEBUG_OSPF_EVENT)
809         zlog_debug ("ospf_abr_announce_network_to_area(): "
810         	   "flooding new version of summary");
811     }
812 
813   if (IS_DEBUG_OSPF_EVENT)
814     zlog_debug ("ospf_abr_announce_network_to_area(): Stop");
815 }
816 
817 static int
ospf_abr_nexthops_belong_to_area(struct ospf_route * or,struct ospf_area * area)818 ospf_abr_nexthops_belong_to_area (struct ospf_route *or,
819 				  struct ospf_area *area)
820 {
821   struct listnode *node, *nnode;
822   struct ospf_path *path;
823   struct ospf_interface *oi;
824 
825   for (ALL_LIST_ELEMENTS_RO (or->paths, node, path))
826     for (ALL_LIST_ELEMENTS_RO (area->oiflist, nnode, oi))
827       if (oi->ifp && oi->ifp->ifindex == path->ifindex)
828 	return 1;
829 
830   return 0;
831 }
832 
833 static int
ospf_abr_should_accept(struct prefix_ipv4 * p,struct ospf_area * area)834 ospf_abr_should_accept (struct prefix_ipv4 *p, struct ospf_area *area)
835 {
836   if (IMPORT_NAME (area))
837     {
838       if (IMPORT_LIST (area) == NULL)
839 	IMPORT_LIST (area) = access_list_lookup (AFI_IP, IMPORT_NAME (area));
840 
841       if (IMPORT_LIST (area))
842         if (access_list_apply (IMPORT_LIST (area), p) == FILTER_DENY)
843            return 0;
844     }
845 
846  return 1;
847 }
848 
849 static int
ospf_abr_plist_in_check(struct ospf_area * area,struct ospf_route * or,struct prefix_ipv4 * p)850 ospf_abr_plist_in_check (struct ospf_area *area, struct ospf_route *or,
851 			 struct prefix_ipv4 *p)
852 {
853   if (PREFIX_NAME_IN (area))
854     {
855       if (PREFIX_LIST_IN (area) == NULL)
856 	PREFIX_LIST_IN (area) = prefix_list_lookup (AFI_IP,
857 						    PREFIX_NAME_IN (area));
858       if (PREFIX_LIST_IN (area))
859 	if (prefix_list_apply (PREFIX_LIST_IN (area), p) != PREFIX_PERMIT)
860 	  return 0;
861     }
862   return 1;
863 }
864 
865 static int
ospf_abr_plist_out_check(struct ospf_area * area,struct ospf_route * or,struct prefix_ipv4 * p)866 ospf_abr_plist_out_check (struct ospf_area *area, struct ospf_route *or,
867 			  struct prefix_ipv4 *p)
868 {
869   if (PREFIX_NAME_OUT (area))
870     {
871       if (PREFIX_LIST_OUT (area) == NULL)
872 	PREFIX_LIST_OUT (area) = prefix_list_lookup (AFI_IP,
873 						     PREFIX_NAME_OUT (area));
874       if (PREFIX_LIST_OUT (area))
875 	if (prefix_list_apply (PREFIX_LIST_OUT (area), p) != PREFIX_PERMIT)
876 	  return 0;
877     }
878   return 1;
879 }
880 
881 static void
ospf_abr_announce_network(struct ospf * ospf,struct prefix_ipv4 * p,struct ospf_route * or)882 ospf_abr_announce_network (struct ospf *ospf,
883 			   struct prefix_ipv4 *p, struct ospf_route *or)
884 {
885   struct ospf_area_range *range;
886   struct ospf_area *area, *or_area;
887   struct listnode *node;
888 
889   if (IS_DEBUG_OSPF_EVENT)
890     zlog_debug ("ospf_abr_announce_network(): Start");
891 
892   or_area = ospf_area_lookup_by_area_id (ospf, or->u.std.area_id);
893   assert (or_area);
894 
895   for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area))
896     {
897       if (IS_DEBUG_OSPF_EVENT)
898 	zlog_debug ("ospf_abr_announce_network(): looking at area %s",
899 		   inet_ntoa (area->area_id));
900 
901       if (IPV4_ADDR_SAME (&or->u.std.area_id, &area->area_id))
902 	continue;
903 
904       if (ospf_abr_nexthops_belong_to_area (or, area))
905 	continue;
906 
907       if (!ospf_abr_should_accept (p, area))
908 	{
909 	  if (IS_DEBUG_OSPF_EVENT)
910 	    zlog_debug ("ospf_abr_announce_network(): "
911 		       "prefix %s/%d was denied by import-list",
912 		       inet_ntoa (p->prefix), p->prefixlen);
913 	  continue;
914 	}
915 
916       if (!ospf_abr_plist_in_check (area, or, p))
917 	{
918 	  if (IS_DEBUG_OSPF_EVENT)
919 	    zlog_debug ("ospf_abr_announce_network(): "
920 		       "prefix %s/%d was denied by prefix-list",
921 		       inet_ntoa (p->prefix), p->prefixlen);
922 	  continue;
923 	}
924 
925       if (area->external_routing != OSPF_AREA_DEFAULT && area->no_summary)
926 	{
927 	  if (IS_DEBUG_OSPF_EVENT)
928 	    zlog_debug ("ospf_abr_announce_network(): "
929 		       "area %s is stub and no_summary",
930 		       inet_ntoa (area->area_id));
931           continue;
932 	}
933 
934       if (or->path_type == OSPF_PATH_INTER_AREA)
935 	{
936 	  if (IS_DEBUG_OSPF_EVENT)
937 	    zlog_debug ("ospf_abr_announce_network(): this is "
938 		       "inter-area route to %s/%d",
939 		       inet_ntoa (p->prefix), p->prefixlen);
940 
941           if (!OSPF_IS_AREA_BACKBONE (area))
942 	    ospf_abr_announce_network_to_area (p, or->cost, area);
943 	}
944 
945       if (or->path_type == OSPF_PATH_INTRA_AREA)
946         {
947           if (IS_DEBUG_OSPF_EVENT)
948             zlog_debug ("ospf_abr_announce_network(): "
949                        "this is intra-area route to %s/%d",
950                        inet_ntoa (p->prefix), p->prefixlen);
951           if ((range = ospf_area_range_match (or_area, p))
952                && !ospf_area_is_transit (area))
953             ospf_abr_update_aggregate (range, or, area);
954           else
955             ospf_abr_announce_network_to_area (p, or->cost, area);
956         }
957     }
958 }
959 
960 static int
ospf_abr_should_announce(struct ospf * ospf,struct prefix_ipv4 * p,struct ospf_route * or)961 ospf_abr_should_announce (struct ospf *ospf,
962 			  struct prefix_ipv4 *p, struct ospf_route *or)
963 {
964   struct ospf_area *area;
965 
966   area = ospf_area_lookup_by_area_id (ospf, or->u.std.area_id);
967 
968   assert (area);
969 
970   if (EXPORT_NAME (area))
971     {
972       if (EXPORT_LIST (area) == NULL)
973 	EXPORT_LIST (area) = access_list_lookup (AFI_IP, EXPORT_NAME (area));
974 
975       if (EXPORT_LIST (area))
976         if (access_list_apply (EXPORT_LIST (area), p) == FILTER_DENY)
977            return 0;
978     }
979 
980   return 1;
981 }
982 
983 static void
ospf_abr_process_nssa_translates(struct ospf * ospf)984 ospf_abr_process_nssa_translates (struct ospf *ospf)
985 {
986   /* Scan through all NSSA_LSDB records for all areas;
987 
988      If P-bit is on, translate all Type-7's to 5's and aggregate or
989      flood install as approved in Type-5 LSDB with XLATE Flag on
990      later, do same for all aggregates...  At end, DISCARD all
991      remaining UNAPPROVED Type-5's (Aggregate is for future ) */
992   struct listnode *node;
993   struct ospf_area *area;
994   struct route_node *rn;
995   struct ospf_lsa *lsa;
996 
997   if (IS_DEBUG_OSPF_NSSA)
998     zlog_debug ("ospf_abr_process_nssa_translates(): Start");
999 
1000   for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area))
1001     {
1002       if (! area->NSSATranslatorState)
1003         continue; /* skip if not translator */
1004 
1005       if (area->external_routing != OSPF_AREA_NSSA)
1006         continue;  /* skip if not Nssa Area */
1007 
1008       if (IS_DEBUG_OSPF_NSSA)
1009         zlog_debug ("ospf_abr_process_nssa_translates(): "
1010                    "looking at area %s", inet_ntoa (area->area_id));
1011 
1012       LSDB_LOOP (NSSA_LSDB (area), rn, lsa)
1013         ospf_abr_translate_nssa (area, lsa);
1014     }
1015 
1016   if (IS_DEBUG_OSPF_NSSA)
1017     zlog_debug ("ospf_abr_process_nssa_translates(): Stop");
1018 
1019 }
1020 
1021 static void
ospf_abr_process_network_rt(struct ospf * ospf,struct route_table * rt)1022 ospf_abr_process_network_rt (struct ospf *ospf,
1023 			     struct route_table *rt)
1024 {
1025   struct ospf_area *area;
1026   struct ospf_route *or;
1027   struct route_node *rn;
1028 
1029   if (IS_DEBUG_OSPF_EVENT)
1030     zlog_debug ("ospf_abr_process_network_rt(): Start");
1031 
1032   for (rn = route_top (rt); rn; rn = route_next (rn))
1033     {
1034       if ((or = rn->info) == NULL)
1035 	continue;
1036 
1037       if (!(area = ospf_area_lookup_by_area_id (ospf, or->u.std.area_id)))
1038 	{
1039 	  if (IS_DEBUG_OSPF_EVENT)
1040 	    zlog_debug ("ospf_abr_process_network_rt(): area %s no longer exists",
1041 		       inet_ntoa (or->u.std.area_id));
1042 	  continue;
1043 	}
1044 
1045       if (IS_DEBUG_OSPF_EVENT)
1046 	zlog_debug ("ospf_abr_process_network_rt(): this is a route to %s/%d",
1047 		   inet_ntoa (rn->p.u.prefix4), rn->p.prefixlen);
1048       if (or->path_type >= OSPF_PATH_TYPE1_EXTERNAL)
1049 	{
1050 	  if (IS_DEBUG_OSPF_EVENT)
1051 	    zlog_debug ("ospf_abr_process_network_rt(): "
1052 		       "this is an External router, skipping");
1053 	  continue;
1054 	}
1055 
1056       if (or->cost >= OSPF_LS_INFINITY)
1057 	{
1058 	  if (IS_DEBUG_OSPF_EVENT)
1059 	    zlog_debug ("ospf_abr_process_network_rt():"
1060 		       " this route's cost is infinity, skipping");
1061 	  continue;
1062 	}
1063 
1064       if (or->type == OSPF_DESTINATION_DISCARD)
1065 	{
1066 	  if (IS_DEBUG_OSPF_EVENT)
1067 	    zlog_debug ("ospf_abr_process_network_rt():"
1068 		       " this is a discard entry, skipping");
1069 	  continue;
1070 	}
1071 
1072       if (or->path_type == OSPF_PATH_INTRA_AREA &&
1073 	  !ospf_abr_should_announce (ospf, (struct prefix_ipv4 *) &rn->p, or))
1074 	{
1075 	  if (IS_DEBUG_OSPF_EVENT)
1076 	    zlog_debug("ospf_abr_process_network_rt(): denied by export-list");
1077 	  continue;
1078 	}
1079 
1080       if (or->path_type == OSPF_PATH_INTRA_AREA &&
1081 	  !ospf_abr_plist_out_check (area, or, (struct prefix_ipv4 *) &rn->p))
1082 	{
1083 	  if (IS_DEBUG_OSPF_EVENT)
1084 	    zlog_debug("ospf_abr_process_network_rt(): denied by prefix-list");
1085 	  continue;
1086 	}
1087 
1088       if ((or->path_type == OSPF_PATH_INTER_AREA) &&
1089           !OSPF_IS_AREA_ID_BACKBONE (or->u.std.area_id))
1090 	{
1091 	  if (IS_DEBUG_OSPF_EVENT)
1092 	    zlog_debug ("ospf_abr_process_network_rt():"
1093 		       " this is route is not backbone one, skipping");
1094 	  continue;
1095 	}
1096 
1097 
1098       if ((ospf->abr_type == OSPF_ABR_CISCO) ||
1099           (ospf->abr_type == OSPF_ABR_IBM))
1100 
1101           if (!ospf_act_bb_connection (ospf) &&
1102               or->path_type != OSPF_PATH_INTRA_AREA)
1103 	     {
1104 	       if (IS_DEBUG_OSPF_EVENT)
1105 		 zlog_debug ("ospf_abr_process_network_rt(): ALT ABR: "
1106 			    "No BB connection, skip not intra-area routes");
1107 	       continue;
1108 	     }
1109 
1110       if (IS_DEBUG_OSPF_EVENT)
1111 	zlog_debug ("ospf_abr_process_network_rt(): announcing");
1112       ospf_abr_announce_network (ospf, (struct prefix_ipv4 *)&rn->p, or);
1113     }
1114 
1115   if (IS_DEBUG_OSPF_EVENT)
1116     zlog_debug ("ospf_abr_process_network_rt(): Stop");
1117 }
1118 
1119 static void
ospf_abr_announce_rtr_to_area(struct prefix_ipv4 * p,u_int32_t cost,struct ospf_area * area)1120 ospf_abr_announce_rtr_to_area (struct prefix_ipv4 *p, u_int32_t cost,
1121 			       struct ospf_area *area)
1122 {
1123   struct ospf_lsa *lsa, *old = NULL;
1124   struct summary_lsa *slsa = NULL;
1125 
1126   if (IS_DEBUG_OSPF_EVENT)
1127     zlog_debug ("ospf_abr_announce_rtr_to_area(): Start");
1128 
1129   old = ospf_lsa_lookup_by_prefix (area->lsdb, OSPF_ASBR_SUMMARY_LSA,
1130 				   p, area->ospf->router_id);
1131   if (old)
1132     {
1133       if (IS_DEBUG_OSPF_EVENT)
1134 	zlog_debug ("ospf_abr_announce_rtr_to_area(): old summary found");
1135       slsa = (struct summary_lsa *) old->data;
1136 
1137       if (IS_DEBUG_OSPF_EVENT)
1138 	zlog_debug ("ospf_abr_announce_network_to_area(): "
1139 		   "old metric: %d, new metric: %d",
1140 		   GET_METRIC (slsa->metric), cost);
1141     }
1142 
1143   if (old && (GET_METRIC (slsa->metric) == cost) &&
1144       ((old->flags & OSPF_LSA_IN_MAXAGE) == 0))
1145     {
1146       if (IS_DEBUG_OSPF_EVENT)
1147 	zlog_debug ("ospf_abr_announce_rtr_to_area(): old summary approved");
1148       SET_FLAG (old->flags, OSPF_LSA_APPROVED);
1149     }
1150   else
1151     {
1152       if (IS_DEBUG_OSPF_EVENT)
1153 	zlog_debug ("ospf_abr_announce_rtr_to_area(): 2.2");
1154 
1155       if (old)
1156 	{
1157 	  set_metric (old, cost);
1158 	  lsa = ospf_lsa_refresh (area->ospf, old);
1159 	}
1160       else
1161 	lsa = ospf_summary_asbr_lsa_originate (p, cost, area);
1162       if (!lsa)
1163         {
1164           char buf[INET_ADDRSTRLEN + 3]; /* ipv4 and /XX */
1165 
1166           prefix2str ((struct prefix *)p, buf, sizeof(buf));
1167           zlog_warn ("%s: Could not refresh/originate %s to %s",
1168                      __func__,
1169                      buf,
1170                      inet_ntoa (area->area_id));
1171           return;
1172         }
1173 
1174       if (IS_DEBUG_OSPF_EVENT)
1175 	zlog_debug ("ospf_abr_announce_rtr_to_area(): "
1176 		   "flooding new version of summary");
1177 
1178       /*
1179       zlog_info ("ospf_abr_announce_rtr_to_area(): creating new summary");
1180       lsa = ospf_summary_asbr_lsa (p, cost, area, old); */
1181 
1182       SET_FLAG (lsa->flags, OSPF_LSA_APPROVED);
1183       /* ospf_flood_through_area (area, NULL, lsa);*/
1184     }
1185 
1186   if (IS_DEBUG_OSPF_EVENT)
1187     zlog_debug ("ospf_abr_announce_rtr_to_area(): Stop");
1188 }
1189 
1190 
1191 static void
ospf_abr_announce_rtr(struct ospf * ospf,struct prefix_ipv4 * p,struct ospf_route * or)1192 ospf_abr_announce_rtr (struct ospf *ospf,
1193 		       struct prefix_ipv4 *p, struct ospf_route *or)
1194 {
1195   struct listnode *node;
1196   struct ospf_area *area;
1197 
1198   if (IS_DEBUG_OSPF_EVENT)
1199     zlog_debug ("ospf_abr_announce_rtr(): Start");
1200 
1201   for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area))
1202     {
1203       if (IS_DEBUG_OSPF_EVENT)
1204 	zlog_debug ("ospf_abr_announce_rtr(): looking at area %s",
1205 		   inet_ntoa (area->area_id));
1206 
1207       if (IPV4_ADDR_SAME (&or->u.std.area_id, &area->area_id))
1208 	continue;
1209 
1210       if (ospf_abr_nexthops_belong_to_area (or, area))
1211 	continue;
1212 
1213       if (area->external_routing != OSPF_AREA_DEFAULT)
1214 	{
1215 	  if (IS_DEBUG_OSPF_EVENT)
1216 	    zlog_debug ("ospf_abr_announce_rtr(): "
1217 		       "area %s doesn't support external routing",
1218 		       inet_ntoa(area->area_id));
1219           continue;
1220 	}
1221 
1222       if (or->path_type == OSPF_PATH_INTER_AREA)
1223 	{
1224 	  if (IS_DEBUG_OSPF_EVENT)
1225 	    zlog_debug ("ospf_abr_announce_rtr(): "
1226 		       "this is inter-area route to %s", inet_ntoa (p->prefix));
1227           if (!OSPF_IS_AREA_BACKBONE (area))
1228 	    ospf_abr_announce_rtr_to_area (p, or->cost, area);
1229 	}
1230 
1231       if (or->path_type == OSPF_PATH_INTRA_AREA)
1232 	{
1233 	  if (IS_DEBUG_OSPF_EVENT)
1234 	    zlog_debug ("ospf_abr_announce_rtr(): "
1235 		       "this is intra-area route to %s", inet_ntoa (p->prefix));
1236           ospf_abr_announce_rtr_to_area (p, or->cost, area);
1237 	}
1238     }
1239 
1240   if (IS_DEBUG_OSPF_EVENT)
1241     zlog_debug ("ospf_abr_announce_rtr(): Stop");
1242 }
1243 
1244 static void
ospf_abr_process_router_rt(struct ospf * ospf,struct route_table * rt)1245 ospf_abr_process_router_rt (struct ospf *ospf, struct route_table *rt)
1246 {
1247   struct ospf_route *or;
1248   struct route_node *rn;
1249   struct list *l;
1250 
1251   if (IS_DEBUG_OSPF_EVENT)
1252     zlog_debug ("ospf_abr_process_router_rt(): Start");
1253 
1254   for (rn = route_top (rt); rn; rn = route_next (rn))
1255     {
1256       struct listnode *node, *nnode;
1257       char flag = 0;
1258       struct ospf_route *best = NULL;
1259 
1260       if (rn->info == NULL)
1261 	continue;
1262 
1263       l = rn->info;
1264 
1265       if (IS_DEBUG_OSPF_EVENT)
1266 	zlog_debug ("ospf_abr_process_router_rt(): this is a route to %s",
1267 		   inet_ntoa (rn->p.u.prefix4));
1268 
1269       for (ALL_LIST_ELEMENTS (l, node, nnode, or))
1270 	{
1271 	  if (!ospf_area_lookup_by_area_id (ospf, or->u.std.area_id))
1272 	    {
1273 	      if (IS_DEBUG_OSPF_EVENT)
1274 		zlog_debug ("ospf_abr_process_router_rt(): area %s no longer exists",
1275 			 inet_ntoa (or->u.std.area_id));
1276 	      continue;
1277 	    }
1278 
1279 
1280 	  if (!CHECK_FLAG (or->u.std.flags, ROUTER_LSA_EXTERNAL))
1281 	    {
1282 	      if (IS_DEBUG_OSPF_EVENT)
1283 		zlog_debug ("ospf_abr_process_router_rt(): "
1284 			   "This is not an ASBR, skipping");
1285 	      continue;
1286 	    }
1287 
1288 	  if (!flag)
1289 	    {
1290 	      best = ospf_find_asbr_route (ospf, rt,
1291 					   (struct prefix_ipv4 *) &rn->p);
1292 	      flag = 1;
1293 	    }
1294 
1295         if (best == NULL)
1296 	  continue;
1297 
1298         if (or != best)
1299 	  {
1300 	    if (IS_DEBUG_OSPF_EVENT)
1301 	      zlog_debug ("ospf_abr_process_router_rt(): "
1302 			 "This route is not the best among possible, skipping");
1303 	    continue;
1304 	  }
1305 
1306         if (or->path_type == OSPF_PATH_INTER_AREA &&
1307             !OSPF_IS_AREA_ID_BACKBONE (or->u.std.area_id))
1308 	  {
1309 	    if (IS_DEBUG_OSPF_EVENT)
1310 	      zlog_debug ("ospf_abr_process_router_rt(): "
1311 			 "This route is not a backbone one, skipping");
1312 	    continue;
1313 	  }
1314 
1315         if (or->cost >= OSPF_LS_INFINITY)
1316 	  {
1317 	    if (IS_DEBUG_OSPF_EVENT)
1318 	      zlog_debug ("ospf_abr_process_router_rt(): "
1319 			 "This route has LS_INFINITY metric, skipping");
1320 	    continue;
1321 	  }
1322 
1323         if (ospf->abr_type == OSPF_ABR_CISCO
1324 	    || ospf->abr_type == OSPF_ABR_IBM)
1325 	  if (!ospf_act_bb_connection (ospf)
1326 	      && or->path_type != OSPF_PATH_INTRA_AREA)
1327 	    {
1328 	      if (IS_DEBUG_OSPF_EVENT)
1329 		zlog_debug("ospf_abr_process_network_rt(): ALT ABR: "
1330 			  "No BB connection, skip not intra-area routes");
1331 	      continue;
1332 	    }
1333 
1334         ospf_abr_announce_rtr (ospf, (struct prefix_ipv4 *) &rn->p, or);
1335 
1336 	}
1337 
1338     }
1339 
1340   if (IS_DEBUG_OSPF_EVENT)
1341     zlog_debug ("ospf_abr_process_router_rt(): Stop");
1342 }
1343 
1344 static void
ospf_abr_unapprove_translates(struct ospf * ospf)1345 ospf_abr_unapprove_translates (struct ospf *ospf) /* For NSSA Translations */
1346 {
1347   struct ospf_lsa *lsa;
1348   struct route_node *rn;
1349 
1350   if (IS_DEBUG_OSPF_NSSA)
1351     zlog_debug ("ospf_abr_unapprove_translates(): Start");
1352 
1353   /* NSSA Translator is not checked, because it may have gone away,
1354     and we would want to flush any residuals anyway */
1355 
1356   LSDB_LOOP (EXTERNAL_LSDB (ospf), rn, lsa)
1357     if (CHECK_FLAG (lsa->flags, OSPF_LSA_LOCAL_XLT))
1358       {
1359         UNSET_FLAG (lsa->flags, OSPF_LSA_APPROVED);
1360         if (IS_DEBUG_OSPF_NSSA)
1361           zlog_debug ("ospf_abr_unapprove_translates(): "
1362                      "approved unset on link id %s",
1363                      inet_ntoa (lsa->data->id));
1364       }
1365 
1366   if (IS_DEBUG_OSPF_NSSA)
1367     zlog_debug ("ospf_abr_unapprove_translates(): Stop");
1368 }
1369 
1370 static void
ospf_abr_unapprove_summaries(struct ospf * ospf)1371 ospf_abr_unapprove_summaries (struct ospf *ospf)
1372 {
1373   struct listnode *node;
1374   struct ospf_area *area;
1375   struct route_node *rn;
1376   struct ospf_lsa *lsa;
1377 
1378   if (IS_DEBUG_OSPF_EVENT)
1379     zlog_debug ("ospf_abr_unapprove_summaries(): Start");
1380 
1381   for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area))
1382     {
1383       if (IS_DEBUG_OSPF_EVENT)
1384         zlog_debug ("ospf_abr_unapprove_summaries(): "
1385                    "considering area %s",
1386                    inet_ntoa (area->area_id));
1387       LSDB_LOOP (SUMMARY_LSDB (area), rn, lsa)
1388       if (ospf_lsa_is_self_originated (ospf, lsa))
1389         {
1390           if (IS_DEBUG_OSPF_EVENT)
1391             zlog_debug ("ospf_abr_unapprove_summaries(): "
1392                        "approved unset on summary link id %s",
1393                        inet_ntoa (lsa->data->id));
1394           UNSET_FLAG (lsa->flags, OSPF_LSA_APPROVED);
1395         }
1396 
1397       LSDB_LOOP (ASBR_SUMMARY_LSDB (area), rn, lsa)
1398       if (ospf_lsa_is_self_originated (ospf, lsa))
1399         {
1400           if (IS_DEBUG_OSPF_EVENT)
1401             zlog_debug ("ospf_abr_unapprove_summaries(): "
1402                        "approved unset on asbr-summary link id %s",
1403                        inet_ntoa (lsa->data->id));
1404           UNSET_FLAG (lsa->flags, OSPF_LSA_APPROVED);
1405         }
1406     }
1407 
1408   if (IS_DEBUG_OSPF_EVENT)
1409     zlog_debug ("ospf_abr_unapprove_summaries(): Stop");
1410 }
1411 
1412 static void
ospf_abr_prepare_aggregates(struct ospf * ospf)1413 ospf_abr_prepare_aggregates (struct ospf *ospf)
1414 {
1415   struct listnode *node;
1416   struct route_node *rn;
1417   struct ospf_area_range *range;
1418   struct ospf_area *area;
1419 
1420   if (IS_DEBUG_OSPF_EVENT)
1421     zlog_debug ("ospf_abr_prepare_aggregates(): Start");
1422 
1423   for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area))
1424     {
1425       for (rn = route_top (area->ranges); rn; rn = route_next (rn))
1426 	if ((range = rn->info) != NULL)
1427 	  {
1428 	    range->cost = 0;
1429 	    range->specifics = 0;
1430 	  }
1431     }
1432 
1433   if (IS_DEBUG_OSPF_EVENT)
1434     zlog_debug ("ospf_abr_prepare_aggregates(): Stop");
1435 }
1436 
1437 static void
ospf_abr_announce_aggregates(struct ospf * ospf)1438 ospf_abr_announce_aggregates (struct ospf *ospf)
1439 {
1440   struct ospf_area *area, *ar;
1441   struct ospf_area_range *range;
1442   struct route_node *rn;
1443   struct prefix p;
1444   struct listnode *node, *n;
1445 
1446   if (IS_DEBUG_OSPF_EVENT)
1447     zlog_debug ("ospf_abr_announce_aggregates(): Start");
1448 
1449   for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area))
1450     {
1451       if (IS_DEBUG_OSPF_EVENT)
1452 	zlog_debug ("ospf_abr_announce_aggregates(): looking at area %s",
1453 		   inet_ntoa (area->area_id));
1454 
1455       for (rn = route_top (area->ranges); rn; rn = route_next (rn))
1456 	if ((range =  rn->info))
1457 	  {
1458 	    if (!CHECK_FLAG (range->flags, OSPF_AREA_RANGE_ADVERTISE))
1459 	      {
1460 		if (IS_DEBUG_OSPF_EVENT)
1461 		  zlog_debug ("ospf_abr_announce_aggregates():"
1462 			     " discarding suppress-ranges");
1463 		continue;
1464 	      }
1465 
1466 	    p.family = AF_INET;
1467 	    p.u.prefix4 = range->addr;
1468 	    p.prefixlen = range->masklen;
1469 
1470 	    if (IS_DEBUG_OSPF_EVENT)
1471 	      zlog_debug ("ospf_abr_announce_aggregates():"
1472 			 " this is range: %s/%d",
1473 			 inet_ntoa (p.u.prefix4), p.prefixlen);
1474 
1475 	    if (CHECK_FLAG (range->flags, OSPF_AREA_RANGE_SUBSTITUTE))
1476 	      {
1477 		p.family = AF_INET;
1478 		p.u.prefix4 = range->subst_addr;
1479 		p.prefixlen = range->subst_masklen;
1480 	      }
1481 
1482 	    if (range->specifics)
1483 	      {
1484 		if (IS_DEBUG_OSPF_EVENT)
1485 		  zlog_debug ("ospf_abr_announce_aggregates(): active range");
1486 
1487 		for (ALL_LIST_ELEMENTS_RO (ospf->areas, n, ar))
1488 		  {
1489 		    if (ar == area)
1490 		      continue;
1491 
1492 		    /* We do not check nexthops here, because
1493 		       intra-area routes can be associated with
1494 		       one area only */
1495 
1496 		    /* backbone routes are not summarized
1497 		       when announced into transit areas */
1498 
1499 		    if (ospf_area_is_transit (ar) &&
1500 			OSPF_IS_AREA_BACKBONE (area))
1501 		      {
1502 			if (IS_DEBUG_OSPF_EVENT)
1503 			  zlog_debug ("ospf_abr_announce_aggregates(): Skipping "
1504 				     "announcement of BB aggregate into"
1505 				     " a transit area");
1506 			continue;
1507 		      }
1508 		    ospf_abr_announce_network_to_area ((struct prefix_ipv4 *)&p, range->cost, ar);
1509 		  }
1510 	      }
1511 	  }
1512     }
1513 
1514   if (IS_DEBUG_OSPF_EVENT)
1515     zlog_debug ("ospf_abr_announce_aggregates(): Stop");
1516 }
1517 
1518 static void
ospf_abr_send_nssa_aggregates(struct ospf * ospf)1519 ospf_abr_send_nssa_aggregates (struct ospf *ospf) /* temporarily turned off */
1520 {
1521   struct listnode *node; /*, n; */
1522   struct ospf_area *area; /*, *ar; */
1523   struct route_node *rn;
1524   struct ospf_area_range *range;
1525   struct prefix_ipv4 p;
1526 
1527   if (IS_DEBUG_OSPF_NSSA)
1528     zlog_debug ("ospf_abr_send_nssa_aggregates(): Start");
1529 
1530   for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area))
1531     {
1532       if (! area->NSSATranslatorState)
1533 	continue;
1534 
1535       if (IS_DEBUG_OSPF_NSSA)
1536 	zlog_debug ("ospf_abr_send_nssa_aggregates(): looking at area %s",
1537 		   inet_ntoa (area->area_id));
1538 
1539       for (rn = route_top (area->ranges); rn; rn = route_next (rn))
1540 	{
1541           if (rn->info == NULL)
1542 	    continue;
1543 
1544 	  range = rn->info;
1545 
1546           if (!CHECK_FLAG (range->flags, OSPF_AREA_RANGE_ADVERTISE))
1547 	    {
1548 	      if (IS_DEBUG_OSPF_NSSA)
1549 		zlog_debug ("ospf_abr_send_nssa_aggregates():"
1550 			   " discarding suppress-ranges");
1551 	      continue;
1552 	    }
1553 
1554           p.family = AF_INET;
1555           p.prefix = range->addr;
1556           p.prefixlen = range->masklen;
1557 
1558 	  if (IS_DEBUG_OSPF_NSSA)
1559 	    zlog_debug ("ospf_abr_send_nssa_aggregates():"
1560 		       " this is range: %s/%d",
1561 		       inet_ntoa (p.prefix), p.prefixlen);
1562 
1563           if (CHECK_FLAG (range->flags, OSPF_AREA_RANGE_SUBSTITUTE))
1564 	    {
1565 	      p.family = AF_INET;
1566 	      p.prefix = range->subst_addr;
1567 	      p.prefixlen = range->subst_masklen;
1568 	    }
1569 
1570           if (range->specifics)
1571             {
1572               if (IS_DEBUG_OSPF_NSSA)
1573                 zlog_debug ("ospf_abr_send_nssa_aggregates(): active range");
1574 
1575               /* Fetch LSA-Type-7 from aggregate prefix, and then
1576                *  translate, Install (as Type-5), Approve, and Flood
1577                */
1578               ospf_abr_translate_nssa_range (&p, range->cost);
1579             }
1580         } /* all area ranges*/
1581     } /* all areas */
1582 
1583   if (IS_DEBUG_OSPF_NSSA)
1584     zlog_debug ("ospf_abr_send_nssa_aggregates(): Stop");
1585 }
1586 
1587 static void
ospf_abr_announce_stub_defaults(struct ospf * ospf)1588 ospf_abr_announce_stub_defaults (struct ospf *ospf)
1589 {
1590   struct listnode *node;
1591   struct ospf_area *area;
1592   struct prefix_ipv4 p;
1593 
1594   if (! IS_OSPF_ABR (ospf))
1595     return;
1596 
1597   if (IS_DEBUG_OSPF_EVENT)
1598     zlog_debug ("ospf_abr_announce_stub_defaults(): Start");
1599 
1600   p.family = AF_INET;
1601   p.prefix.s_addr = OSPF_DEFAULT_DESTINATION;
1602   p.prefixlen = 0;
1603 
1604   for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area))
1605     {
1606       if (IS_DEBUG_OSPF_EVENT)
1607         zlog_debug ("ospf_abr_announce_stub_defaults(): looking at area %s",
1608 		    inet_ntoa (area->area_id));
1609 
1610      if ( (area->external_routing != OSPF_AREA_STUB)
1611           && (area->external_routing != OSPF_AREA_NSSA)
1612         )
1613        continue;
1614 
1615       if (OSPF_IS_AREA_BACKBONE (area))
1616         continue; /* Sanity Check */
1617 
1618       if (IS_DEBUG_OSPF_EVENT)
1619         zlog_debug ("ospf_abr_announce_stub_defaults(): "
1620 		    "announcing 0.0.0.0/0 to area %s",
1621                  inet_ntoa (area->area_id));
1622       ospf_abr_announce_network_to_area (&p, area->default_cost, area);
1623     }
1624 
1625   if (IS_DEBUG_OSPF_EVENT)
1626     zlog_debug ("ospf_abr_announce_stub_defaults(): Stop");
1627 }
1628 
1629 static int
ospf_abr_remove_unapproved_translates_apply(struct ospf * ospf,struct ospf_lsa * lsa)1630 ospf_abr_remove_unapproved_translates_apply (struct ospf *ospf,
1631 					     struct ospf_lsa *lsa)
1632 {
1633   if (CHECK_FLAG (lsa->flags, OSPF_LSA_LOCAL_XLT)
1634       && ! CHECK_FLAG (lsa->flags, OSPF_LSA_APPROVED))
1635     {
1636       zlog_info ("ospf_abr_remove_unapproved_translates(): "
1637 		 "removing unapproved translates, ID: %s",
1638 		 inet_ntoa (lsa->data->id));
1639 
1640       /* FLUSH THROUGHOUT AS */
1641       ospf_lsa_flush_as (ospf, lsa);
1642 
1643       /* DISCARD from LSDB  */
1644     }
1645   return 0;
1646 }
1647 
1648 static void
ospf_abr_remove_unapproved_translates(struct ospf * ospf)1649 ospf_abr_remove_unapproved_translates (struct ospf *ospf)
1650 {
1651   struct route_node *rn;
1652   struct ospf_lsa *lsa;
1653 
1654   /* All AREA PROCESS should have APPROVED necessary LSAs */
1655   /* Remove any left over and not APPROVED */
1656   if (IS_DEBUG_OSPF_NSSA)
1657     zlog_debug ("ospf_abr_remove_unapproved_translates(): Start");
1658 
1659   LSDB_LOOP (EXTERNAL_LSDB (ospf), rn, lsa)
1660     ospf_abr_remove_unapproved_translates_apply (ospf, lsa);
1661 
1662   if (IS_DEBUG_OSPF_NSSA)
1663     zlog_debug ("ospf_abr_remove_unapproved_translates(): Stop");
1664 }
1665 
1666 static void
ospf_abr_remove_unapproved_summaries(struct ospf * ospf)1667 ospf_abr_remove_unapproved_summaries (struct ospf *ospf)
1668 {
1669   struct listnode *node;
1670   struct ospf_area *area;
1671   struct route_node *rn;
1672   struct ospf_lsa *lsa;
1673 
1674   if (IS_DEBUG_OSPF_EVENT)
1675     zlog_debug ("ospf_abr_remove_unapproved_summaries(): Start");
1676 
1677   for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area))
1678     {
1679       if (IS_DEBUG_OSPF_EVENT)
1680 	zlog_debug ("ospf_abr_remove_unapproved_summaries(): "
1681 		   "looking at area %s", inet_ntoa (area->area_id));
1682 
1683       LSDB_LOOP (SUMMARY_LSDB (area), rn, lsa)
1684 	if (ospf_lsa_is_self_originated (ospf, lsa))
1685 	  if (!CHECK_FLAG (lsa->flags, OSPF_LSA_APPROVED))
1686 	    ospf_lsa_flush_area (lsa, area);
1687 
1688       LSDB_LOOP (ASBR_SUMMARY_LSDB (area), rn, lsa)
1689 	if (ospf_lsa_is_self_originated (ospf, lsa))
1690 	  if (!CHECK_FLAG (lsa->flags, OSPF_LSA_APPROVED))
1691 	    ospf_lsa_flush_area (lsa, area);
1692     }
1693 
1694   if (IS_DEBUG_OSPF_EVENT)
1695     zlog_debug ("ospf_abr_remove_unapproved_summaries(): Stop");
1696 }
1697 
1698 static void
ospf_abr_manage_discard_routes(struct ospf * ospf)1699 ospf_abr_manage_discard_routes (struct ospf *ospf)
1700 {
1701   struct listnode *node, *nnode;
1702   struct route_node *rn;
1703   struct ospf_area *area;
1704   struct ospf_area_range *range;
1705 
1706   for (ALL_LIST_ELEMENTS (ospf->areas, node, nnode, area))
1707     for (rn = route_top (area->ranges); rn; rn = route_next (rn))
1708       if ((range = rn->info) != NULL)
1709 	if (CHECK_FLAG (range->flags, OSPF_AREA_RANGE_ADVERTISE))
1710 	  {
1711 	    if (range->specifics)
1712 	      ospf_add_discard_route (ospf->new_table, area,
1713 				      (struct prefix_ipv4 *) &rn->p);
1714 	    else
1715 	      ospf_delete_discard_route (ospf->new_table,
1716 					 (struct prefix_ipv4 *) &rn->p);
1717 	  }
1718 }
1719 
1720 /* This is the function taking care about ABR NSSA, i.e.  NSSA
1721    Translator, -LSA aggregation and flooding. For all NSSAs
1722 
1723    Any SELF-AS-LSA is in the Type-5 LSDB and Type-7 LSDB.  These LSA's
1724    are refreshed from the Type-5 LSDB, installed into the Type-7 LSDB
1725    with the P-bit set.
1726 
1727    Any received Type-5s are legal for an ABR, else illegal for IR.
1728    Received Type-7s are installed, by area, with incoming P-bit.  They
1729    are flooded; if the Elected NSSA Translator, then P-bit off.
1730 
1731    Additionally, this ABR will place "translated type-7's" into the
1732    Type-5 LSDB in order to keep track of APPROVAL or not.
1733 
1734    It will scan through every area, looking for Type-7 LSAs with P-Bit
1735    SET. The Type-7's are either AS-FLOODED & 5-INSTALLED or
1736    AGGREGATED.  Later, the AGGREGATED LSAs are AS-FLOODED &
1737    5-INSTALLED.
1738 
1739    5-INSTALLED is into the Type-5 LSDB; Any UNAPPROVED Type-5 LSAs
1740    left over are FLUSHED and DISCARDED.
1741 
1742    For External Calculations, any NSSA areas use the Type-7 AREA-LSDB,
1743    any ABR-non-NSSA areas use the Type-5 GLOBAL-LSDB. */
1744 
1745 static void
ospf_abr_nssa_task(struct ospf * ospf)1746 ospf_abr_nssa_task (struct ospf *ospf) /* called only if any_nssa */
1747 {
1748   if (IS_DEBUG_OSPF_NSSA)
1749     zlog_debug ("Check for NSSA-ABR Tasks():");
1750 
1751   if (! IS_OSPF_ABR (ospf))
1752     return;
1753 
1754   if (! ospf->anyNSSA)
1755     return;
1756 
1757   /* Each area must confirm TranslatorRole */
1758   if (IS_DEBUG_OSPF_NSSA)
1759     zlog_debug ("ospf_abr_nssa_task(): Start");
1760 
1761   /* For all Global Entries flagged "local-translate", unset APPROVED */
1762   if (IS_DEBUG_OSPF_NSSA)
1763     zlog_debug ("ospf_abr_nssa_task(): unapprove translates");
1764 
1765   ospf_abr_unapprove_translates (ospf);
1766 
1767   /* RESET all Ranges in every Area, same as summaries */
1768   if (IS_DEBUG_OSPF_NSSA)
1769     zlog_debug ("ospf_abr_nssa_task(): NSSA initialize aggregates");
1770   ospf_abr_prepare_aggregates (ospf);  /*TURNED OFF just for now */
1771 
1772   /* For all NSSAs, Type-7s, translate to 5's, INSTALL/FLOOD, or
1773    *  Aggregate as Type-7
1774    * Install or Approve in Type-5 Global LSDB
1775    */
1776   if (IS_DEBUG_OSPF_NSSA)
1777     zlog_debug ("ospf_abr_nssa_task(): process translates");
1778   ospf_abr_process_nssa_translates (ospf);
1779 
1780   /* Translate/Send any "ranged" aggregates, and also 5-Install and
1781    *  Approve
1782    * Scan Type-7's for aggregates, translate to Type-5's,
1783    *  Install/Flood/Approve
1784    */
1785   if (IS_DEBUG_OSPF_NSSA)
1786     zlog_debug("ospf_abr_nssa_task(): send NSSA aggregates");
1787   ospf_abr_send_nssa_aggregates (ospf);  /*TURNED OFF FOR NOW */
1788 
1789   /* Send any NSSA defaults as Type-5
1790    *if (IS_DEBUG_OSPF_NSSA)
1791    * zlog_debug ("ospf_abr_nssa_task(): announce nssa defaults");
1792    *ospf_abr_announce_nssa_defaults (ospf);
1793    * havnt a clue what above is supposed to do.
1794    */
1795 
1796   /* Flush any unapproved previous translates from Global Data Base */
1797   if (IS_DEBUG_OSPF_NSSA)
1798     zlog_debug ("ospf_abr_nssa_task(): remove unapproved translates");
1799   ospf_abr_remove_unapproved_translates (ospf);
1800 
1801   ospf_abr_manage_discard_routes (ospf); /* same as normal...discard */
1802 
1803   if (IS_DEBUG_OSPF_NSSA)
1804     zlog_debug ("ospf_abr_nssa_task(): Stop");
1805 }
1806 
1807 /* This is the function taking care about ABR stuff, i.e.
1808    summary-LSA origination and flooding. */
1809 void
ospf_abr_task(struct ospf * ospf)1810 ospf_abr_task (struct ospf *ospf)
1811 {
1812   if (IS_DEBUG_OSPF_EVENT)
1813     zlog_debug ("ospf_abr_task(): Start");
1814 
1815   if (ospf->new_table == NULL || ospf->new_rtrs == NULL)
1816     {
1817       if (IS_DEBUG_OSPF_EVENT)
1818 	zlog_debug ("ospf_abr_task(): Routing tables are not yet ready");
1819       return;
1820     }
1821 
1822   if (IS_DEBUG_OSPF_EVENT)
1823     zlog_debug ("ospf_abr_task(): unapprove summaries");
1824   ospf_abr_unapprove_summaries (ospf);
1825 
1826   if (IS_DEBUG_OSPF_EVENT)
1827     zlog_debug ("ospf_abr_task(): prepare aggregates");
1828   ospf_abr_prepare_aggregates (ospf);
1829 
1830   if (IS_OSPF_ABR (ospf))
1831     {
1832       if (IS_DEBUG_OSPF_EVENT)
1833 	zlog_debug ("ospf_abr_task(): process network RT");
1834       ospf_abr_process_network_rt (ospf, ospf->new_table);
1835 
1836       if (IS_DEBUG_OSPF_EVENT)
1837 	zlog_debug ("ospf_abr_task(): process router RT");
1838       ospf_abr_process_router_rt (ospf, ospf->new_rtrs);
1839 
1840       if (IS_DEBUG_OSPF_EVENT)
1841 	zlog_debug ("ospf_abr_task(): announce aggregates");
1842       ospf_abr_announce_aggregates (ospf);
1843 
1844       if (IS_DEBUG_OSPF_EVENT)
1845 	zlog_debug ("ospf_abr_task(): announce stub defaults");
1846       ospf_abr_announce_stub_defaults (ospf);
1847     }
1848 
1849   if (IS_DEBUG_OSPF_EVENT)
1850     zlog_debug ("ospf_abr_task(): remove unapproved summaries");
1851   ospf_abr_remove_unapproved_summaries (ospf);
1852 
1853   ospf_abr_manage_discard_routes (ospf);
1854 
1855   if (IS_DEBUG_OSPF_EVENT)
1856     zlog_debug ("ospf_abr_task(): Stop");
1857 }
1858 
1859 static int
ospf_abr_task_timer(struct thread * thread)1860 ospf_abr_task_timer (struct thread *thread)
1861 {
1862   struct ospf *ospf = THREAD_ARG (thread);
1863 
1864   ospf->t_abr_task = 0;
1865 
1866   if (IS_DEBUG_OSPF_EVENT)
1867     zlog_debug ("Running ABR task on timer");
1868 
1869   ospf_check_abr_status (ospf);
1870   ospf_abr_nssa_check_status (ospf);
1871 
1872   ospf_abr_task (ospf);
1873   ospf_abr_nssa_task (ospf); /* if nssa-abr, then scan Type-7 LSDB */
1874 
1875   return 0;
1876 }
1877 
1878 void
ospf_schedule_abr_task(struct ospf * ospf)1879 ospf_schedule_abr_task (struct ospf *ospf)
1880 {
1881   if (IS_DEBUG_OSPF_EVENT)
1882     zlog_debug ("Scheduling ABR task");
1883 
1884   if (ospf->t_abr_task == NULL)
1885     ospf->t_abr_task = thread_add_timer (master, ospf_abr_task_timer,
1886 					 ospf, OSPF_ABR_TASK_DELAY);
1887 }
1888