File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / quagga / ospfd / ospf_abr.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 17:26:12 2012 UTC (12 years, 5 months ago) by misho
Branches: quagga, MAIN
CVS tags: v0_99_20_1, v0_99_20, HEAD
quagga

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

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>