ospf_abr.c
上传用户:xiaozhuqw
上传日期:2009-11-15
资源大小:1338k
文件大小:43k
源码类别:

网络

开发平台:

Unix_Linux

  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. #include <zebra.h>
  23. #include "thread.h"
  24. #include "memory.h"
  25. #include "linklist.h"
  26. #include "prefix.h"
  27. #include "if.h"
  28. #include "table.h"
  29. #include "vty.h"
  30. #include "filter.h"
  31. #include "plist.h"
  32. #include "log.h"
  33. #include "ospfd/ospfd.h"
  34. #include "ospfd/ospf_interface.h"
  35. #include "ospfd/ospf_ism.h"
  36. #include "ospfd/ospf_asbr.h"
  37. #include "ospfd/ospf_lsa.h"
  38. #include "ospfd/ospf_lsdb.h"
  39. #include "ospfd/ospf_neighbor.h"
  40. #include "ospfd/ospf_nsm.h"
  41. #include "ospfd/ospf_spf.h"
  42. #include "ospfd/ospf_route.h"
  43. #include "ospfd/ospf_ia.h"
  44. #include "ospfd/ospf_flood.h"
  45. #include "ospfd/ospf_abr.h"
  46. #include "ospfd/ospf_ase.h"
  47. #include "ospfd/ospf_zebra.h"
  48. #include "ospfd/ospf_dump.h"
  49. struct ospf_area_range *
  50. ospf_area_range_new (struct prefix_ipv4 *p)
  51. {
  52.   struct ospf_area_range *range;
  53.   range = XCALLOC (MTYPE_OSPF_AREA_RANGE, sizeof (struct ospf_area_range));
  54.   range->addr = p->prefix;
  55.   range->masklen = p->prefixlen;
  56.   range->cost_config = OSPF_AREA_RANGE_COST_UNSPEC;
  57.   return range;
  58. }
  59. void
  60. ospf_area_range_free (struct ospf_area_range *range)
  61. {
  62.   XFREE (MTYPE_OSPF_AREA_RANGE, range);
  63. }
  64. void
  65. ospf_area_range_add (struct ospf_area *area, struct ospf_area_range *range)
  66. {
  67.   struct route_node *rn;
  68.   struct prefix_ipv4 p;
  69.   p.family = AF_INET;
  70.   p.prefixlen = range->masklen;
  71.   p.prefix = range->addr;
  72.   rn = route_node_get (area->ranges, (struct prefix *)&p);
  73.   if (rn->info)
  74.     route_unlock_node (rn);
  75.   else
  76.     rn->info = range;
  77. }
  78. void
  79. ospf_area_range_delete (struct ospf_area *area, struct ospf_area_range *range)
  80. {
  81.   struct route_node *rn;
  82.   struct prefix_ipv4 p;
  83.   p.family = AF_INET;
  84.   p.prefixlen = range->masklen;
  85.   p.prefix = range->addr;
  86.   rn = route_node_lookup (area->ranges, (struct prefix *)&p);
  87.   if (rn)
  88.     {
  89.       ospf_area_range_free (rn->info);
  90.       rn->info = NULL;
  91.       route_unlock_node (rn);
  92.       route_unlock_node (rn);
  93.     }
  94. }
  95. struct ospf_area_range *
  96. ospf_area_range_lookup (struct ospf_area *area, struct prefix_ipv4 *p)
  97. {
  98.   struct route_node *rn;
  99.   rn = route_node_lookup (area->ranges, (struct prefix *)p);
  100.   if (rn)
  101.     {
  102.       route_unlock_node (rn);
  103.       return rn->info;
  104.     }
  105.   return NULL;
  106. }
  107. struct ospf_area_range *
  108. ospf_area_range_lookup_next (struct ospf_area *area, struct in_addr *range_net,
  109.      int first)
  110. {
  111.   struct route_node *rn;
  112.   struct prefix_ipv4 p;
  113.   struct ospf_area_range *find;
  114.   p.family = AF_INET;
  115.   p.prefixlen = IPV4_MAX_BITLEN;
  116.   p.prefix = *range_net;
  117.   if (first)
  118.     rn = route_top (area->ranges);
  119.   else
  120.     {
  121.       rn = route_node_get (area->ranges, (struct prefix *) &p);
  122.       rn = route_next (rn);
  123.     }
  124.   for (; rn; rn = route_next (rn))
  125.     if (rn->info)
  126.       break;
  127.   if (rn && rn->info)
  128.     {
  129.       find = rn->info;
  130.       *range_net = rn->p.u.prefix4;
  131.       route_unlock_node (rn);
  132.       return find;
  133.     }
  134.   return NULL;
  135. }
  136. struct ospf_area_range *
  137. ospf_area_range_match (struct ospf_area *area, struct prefix_ipv4 *p)
  138. {
  139.   struct route_node *node;
  140.   node = route_node_match (area->ranges, (struct prefix *) p);
  141.   if (node)
  142.     {
  143.       route_unlock_node (node);
  144.       return node->info;
  145.     }
  146.   return NULL;
  147. }
  148. struct ospf_area_range *
  149. ospf_area_range_match_any (struct ospf *ospf, struct prefix_ipv4 *p)
  150. {
  151.   struct ospf_area_range *range;
  152.   listnode node;
  153.   for (node = listhead (ospf->areas); node; nextnode (node))
  154.     if ((range = ospf_area_range_match (node->data, p)))
  155.       return range;
  156.   return NULL;
  157. }
  158. int
  159. ospf_area_range_active (struct ospf_area_range *range)
  160. {
  161.   return range->specifics;
  162. }
  163. int
  164. ospf_area_actively_attached (struct ospf_area *area)
  165. {
  166.   return area->act_ints;
  167. }
  168. int
  169. ospf_area_range_set (struct ospf *ospf, struct in_addr area_id,
  170.      struct prefix_ipv4 *p, int advertise)
  171. {
  172.   struct ospf_area *area;
  173.   struct ospf_area_range *range;
  174.   int ret = OSPF_AREA_ID_FORMAT_ADDRESS;
  175.   area = ospf_area_get (ospf, area_id, ret);
  176.   if (area == NULL)
  177.     return 0;
  178.   range = ospf_area_range_lookup (area, p);
  179.   if (range != NULL)
  180.     {
  181.       if ((CHECK_FLAG (range->flags, OSPF_AREA_RANGE_ADVERTISE)
  182.    && !CHECK_FLAG (advertise, OSPF_AREA_RANGE_ADVERTISE))
  183.   || (!CHECK_FLAG (range->flags, OSPF_AREA_RANGE_ADVERTISE)
  184.       && CHECK_FLAG (advertise, OSPF_AREA_RANGE_ADVERTISE)))
  185. ospf_schedule_abr_task (ospf);
  186.     }
  187.   else
  188.     {
  189.       range = ospf_area_range_new (p);
  190.       ospf_area_range_add (area, range);
  191.       ospf_schedule_abr_task (ospf);
  192.     }
  193.   if (CHECK_FLAG (advertise, OSPF_AREA_RANGE_ADVERTISE))
  194.     SET_FLAG (range->flags, OSPF_AREA_RANGE_ADVERTISE);
  195.   else
  196.     UNSET_FLAG (range->flags, OSPF_AREA_RANGE_ADVERTISE);
  197.   return 1;
  198. }
  199. int
  200. ospf_area_range_cost_set (struct ospf *ospf, struct in_addr area_id,
  201.   struct prefix_ipv4 *p, u_int32_t cost)
  202. {
  203.   struct ospf_area *area;
  204.   struct ospf_area_range *range;
  205.   int ret = OSPF_AREA_ID_FORMAT_ADDRESS;
  206.   area = ospf_area_get (ospf, area_id, ret);
  207.   if (area == NULL)
  208.     return 0;
  209.   range = ospf_area_range_new (p);
  210.   if (range == NULL)
  211.     return 0;
  212.   if (range->cost_config != cost)
  213.     {
  214.       range->cost_config = cost;
  215.       if (ospf_area_range_active (range))
  216. ospf_schedule_abr_task (ospf);
  217.     }
  218.   return 1;
  219. }
  220. int
  221. ospf_area_range_unset (struct ospf *ospf, struct in_addr area_id,
  222.        struct prefix_ipv4 *p)
  223. {
  224.   struct ospf_area *area;
  225.   struct ospf_area_range *range;
  226.   area = ospf_area_lookup_by_area_id (ospf, area_id);
  227.   if (area == NULL)
  228.     return 0;
  229.   range = ospf_area_range_lookup (area, p);
  230.   if (range == NULL)
  231.     return 0;
  232.   if (ospf_area_range_active (range))
  233.     ospf_schedule_abr_task (ospf);
  234.   ospf_area_range_delete (area, range);
  235.   return 1;
  236. }
  237. int
  238. ospf_area_range_substitute_set (struct ospf *ospf, struct in_addr area_id,
  239. struct prefix_ipv4 *p, struct prefix_ipv4 *s)
  240. {
  241.   struct ospf_area *area;
  242.   struct ospf_area_range *range;
  243.   int ret = OSPF_AREA_ID_FORMAT_ADDRESS;
  244.   area = ospf_area_get (ospf, area_id, ret);
  245.   range = ospf_area_range_lookup (area, p);
  246.   if (range != NULL)
  247.     {
  248.       if (!CHECK_FLAG (range->flags, OSPF_AREA_RANGE_ADVERTISE) ||
  249.   !CHECK_FLAG (range->flags, OSPF_AREA_RANGE_SUBSTITUTE))
  250. ospf_schedule_abr_task (ospf);
  251.     }
  252.   else
  253.     {
  254.       range = ospf_area_range_new (p);
  255.       ospf_area_range_add (area, range);
  256.       ospf_schedule_abr_task (ospf);
  257.     }
  258.   SET_FLAG (range->flags, OSPF_AREA_RANGE_ADVERTISE);
  259.   SET_FLAG (range->flags, OSPF_AREA_RANGE_SUBSTITUTE);
  260.   range->subst_addr = s->prefix;
  261.   range->subst_masklen = s->prefixlen;
  262.   return 1;
  263. }
  264. int
  265. ospf_area_range_substitute_unset (struct ospf *ospf, struct in_addr area_id,
  266.   struct prefix_ipv4 *p)
  267. {
  268.   struct ospf_area *area;
  269.   struct ospf_area_range *range;
  270.   area = ospf_area_lookup_by_area_id (ospf, area_id);
  271.   if (area == NULL)
  272.     return 0;
  273.   range = ospf_area_range_lookup (area, p);
  274.   if (range == NULL)
  275.     return 0;
  276.   if (CHECK_FLAG (range->flags, OSPF_AREA_RANGE_SUBSTITUTE))
  277.     if (ospf_area_range_active (range))
  278.       ospf_schedule_abr_task (ospf);
  279.   UNSET_FLAG (range->flags, OSPF_AREA_RANGE_SUBSTITUTE);
  280.   range->subst_addr.s_addr = 0;
  281.   range->subst_masklen = 0;
  282.   return 1;
  283. }
  284. int
  285. ospf_act_bb_connection (struct ospf *ospf)
  286. {
  287.   if (ospf->backbone == NULL)
  288.     return 0;
  289.   return ospf->backbone->full_nbrs;
  290. }
  291. /* Check area border router status. */
  292. void
  293. ospf_check_abr_status (struct ospf *ospf)
  294. {
  295.   struct ospf_area *area;
  296.   listnode node;
  297.   int bb_configured = 0;
  298.   int bb_act_attached = 0;
  299.   int areas_configured = 0;
  300.   int areas_act_attached = 0;
  301.   u_char new_flags = ospf->flags;
  302.   if (IS_DEBUG_OSPF_EVENT)
  303.     zlog_info ("ospf_check_abr_status(): Start");
  304.   for (node = listhead (ospf->areas); node; nextnode (node))
  305.     {
  306.       area = getdata (node);
  307.       if (listcount (area->oiflist)) 
  308. {
  309.   areas_configured++;
  310.   
  311.   if (OSPF_IS_AREA_BACKBONE (area))
  312.       bb_configured = 1;
  313. }
  314.       if (ospf_area_actively_attached (area))
  315. {
  316.   areas_act_attached++;
  317.   
  318.   if (OSPF_IS_AREA_BACKBONE (area))
  319.             bb_act_attached = 1;
  320. }
  321.     }
  322.   if (IS_DEBUG_OSPF_EVENT)
  323.     {
  324.       zlog_info ("ospf_check_abr_status(): looked through areas");
  325.       zlog_info ("ospf_check_abr_status(): bb_configured: %d", bb_configured);
  326.       zlog_info ("ospf_check_abr_status(): bb_act_attached: %d",
  327.  bb_act_attached);
  328.       zlog_info ("ospf_check_abr_status(): areas_configured: %d",
  329.  areas_configured);
  330.       zlog_info ("ospf_check_abr_status(): areas_act_attached: %d",
  331.  areas_act_attached);
  332.     }
  333.   switch (ospf->abr_type)
  334.     {
  335.     case OSPF_ABR_SHORTCUT:
  336.     case OSPF_ABR_STAND:
  337.       if (areas_act_attached > 1)
  338. SET_FLAG (new_flags, OSPF_FLAG_ABR);
  339.       else
  340. UNSET_FLAG (new_flags, OSPF_FLAG_ABR);
  341.       break;
  342.     case OSPF_ABR_IBM:
  343.       if ((areas_act_attached > 1) && bb_configured)
  344. SET_FLAG (new_flags, OSPF_FLAG_ABR);
  345.       else
  346. UNSET_FLAG (new_flags, OSPF_FLAG_ABR);
  347.       break;
  348.     case OSPF_ABR_CISCO:
  349.       if ((areas_configured > 1) && bb_act_attached)
  350. SET_FLAG (new_flags, OSPF_FLAG_ABR);
  351.       else
  352. UNSET_FLAG (new_flags, OSPF_FLAG_ABR);
  353.       break;
  354.     default:
  355.       break;
  356.     }
  357.   if (new_flags != ospf->flags)
  358.     {
  359.       ospf_spf_calculate_schedule (ospf);
  360.       if (IS_DEBUG_OSPF_EVENT)
  361. zlog_info ("ospf_check_abr_status(): new router flags: %x",new_flags);
  362.       ospf->flags = new_flags;
  363.       OSPF_TIMER_ON (ospf->t_router_lsa_update,
  364.      ospf_router_lsa_update_timer, OSPF_LSA_UPDATE_DELAY);
  365.     }
  366. }
  367. void
  368. ospf_abr_update_aggregate (struct ospf_area_range *range,
  369.    struct ospf_route *or)
  370. {
  371.   if (IS_DEBUG_OSPF_EVENT)
  372.     zlog_info ("ospf_abr_update_aggregate(): Start");
  373.   if (range->cost_config != -1)
  374.     {
  375.       if (IS_DEBUG_OSPF_EVENT)
  376. zlog_info ("ospf_abr_update_aggregate(): use configured cost %d",
  377.    range->cost_config);
  378.       range->cost = range->cost_config;
  379.     }
  380.   else
  381.     {
  382.       if (range->specifics == 0)
  383. range->cost = or->cost; /* 1st time get 1st cost */
  384.       if (or->cost > range->cost)
  385. {
  386.   if (IS_DEBUG_OSPF_EVENT)
  387.     zlog_info ("ospf_abr_update_aggregate(): largest cost, update");
  388.   range->cost = or->cost;
  389. }
  390.     }
  391.   range->specifics++;
  392. }
  393. static void
  394. set_metric (struct ospf_lsa *lsa, u_int32_t metric)
  395. {
  396.   struct summary_lsa *header;
  397.   u_char *mp;
  398.   metric = htonl (metric);
  399.   mp = (char *) &metric;
  400.   mp++;
  401.   header = (struct summary_lsa *) lsa->data;
  402.   memcpy(header->metric, mp, 3);
  403. }
  404. #ifdef HAVE_NSSA
  405. int
  406. ospf_abr_check_nssa_range (struct prefix_ipv4 *p, u_int32_t cost,
  407.    struct ospf_area *area)
  408. {
  409.   /* The Type-7 is tested against the aggregated prefix and forwarded
  410.      for lsa installation and flooding */
  411.   return 0;
  412. }
  413. /* ospf_abr_translate_nssa */
  414. int
  415. ospf_abr_translate_nssa (struct ospf_area *area, struct ospf_lsa *lsa)
  416. {
  417.   /* Incoming Type-7 or later aggregated Type-7 
  418.   LSA is skipped if P-bit is off.
  419.   LSA is aggregated if within range.
  420.   The Type-7 is translated, Installed/Approved as a Type-5 into
  421.   global LSDB, then Flooded through AS
  422.   Later, any Unapproved Translated Type-5's are flushed/discarded */
  423.   struct ospf_lsa *dup;
  424.   if (! CHECK_FLAG (lsa->data->options, OSPF_OPTION_NP))
  425.     {
  426.       if (IS_DEBUG_OSPF_NSSA)
  427. zlog_info ("ospf_abr_nssa(): P-bit off, NO Translation");
  428.       return 0; 
  429.     }
  430.   if (IS_DEBUG_OSPF_NSSA)
  431.     zlog_info ("ospf_abr_nssa(): TRANSLATING 7 to 5");
  432.   /* No more P-bit. */
  433.   /* UNSET_FLAG (lsa->data->options, OSPF_OPTION_NP); */
  434.   /* Area where Aggregate testing will be inserted, just like summary
  435.      advertisements */
  436.   /* ospf_abr_check_nssa_range (p_arg, lsa-> cost, lsa -> area); */
  437.   /* Follow thru here means no aggregation */
  438.   dup = ospf_lsa_dup (lsa); /* keep LSDB intact, lock = 1 */
  439.   SET_FLAG (dup->flags, OSPF_LSA_LOCAL_XLT); /* Translated from 7  */
  440.   SET_FLAG (dup->flags, OSPF_LSA_APPROVED); /* So, do not remove it */
  441.   dup->data->type = OSPF_AS_EXTERNAL_LSA;  /* make Type-5 */
  442.   ospf_lsa_checksum (dup->data);
  443.   ospf_lsa_install (area->ospf, NULL, dup);  /* Install this Type-5 into LSDB, Lock = 2. */
  444.   ospf_flood_through_as (area->ospf, NULL, dup); /* flood non-NSSA/STUB areas */
  445.   
  446.   /* This translated Type-5 will go to all non-NSSA areas connected to
  447.      this ABR; The Type-5 could come from any of the NSSA's connected
  448.      to this ABR.  */
  449.   return 0;
  450. }
  451. void
  452. ospf_abr_translate_nssa_range (struct prefix_ipv4 *p, u_int32_t cost)
  453. {
  454.   /* The Type-7 is created from the aggregated prefix and forwarded
  455.      for lsa installation and flooding... to be added... */
  456. }
  457. #endif /* HAVE_NSSA */
  458. void
  459. ospf_abr_announce_network_to_area (struct prefix_ipv4 *p, u_int32_t cost,
  460.    struct ospf_area *area)
  461. {
  462.   struct ospf_lsa *lsa, *old = NULL;
  463.   struct summary_lsa *sl = NULL;
  464.   if (IS_DEBUG_OSPF_EVENT)
  465.     zlog_info ("ospf_abr_announce_network_to_area(): Start");
  466.   old = ospf_lsa_lookup_by_prefix (area->lsdb, OSPF_SUMMARY_LSA, p,
  467.    area->ospf->router_id);
  468.   if (old)
  469.     {
  470.       if (IS_DEBUG_OSPF_EVENT)
  471. zlog_info ("ospf_abr_announce_network_to_area(): old summary found");
  472.       sl = (struct summary_lsa *) old->data;
  473.       if (IS_DEBUG_OSPF_EVENT)
  474. zlog_info ("ospf_abr_announce_network_to_area(): "
  475.    "old metric: %d, new metric: %d",
  476.    GET_METRIC (sl->metric), cost);
  477.     }
  478.   if (old && (GET_METRIC (sl->metric) == cost))
  479.     {
  480.       if (IS_DEBUG_OSPF_EVENT)
  481. zlog_info ("ospf_abr_announce_network_to_area(): "
  482.    "old summary approved"); 
  483.       SET_FLAG (old->flags, OSPF_LSA_APPROVED);
  484.     }
  485.   else
  486.     {
  487.       if (IS_DEBUG_OSPF_EVENT)
  488. zlog_info ("ospf_abr_announce_network_to_area(): "
  489.    "creating new summary");
  490.       if (old)
  491. {
  492.   set_metric (old, cost);
  493.   lsa = ospf_summary_lsa_refresh (area->ospf, old);
  494.   /* This will flood through area. */
  495. }
  496.       else
  497. {
  498.   lsa = ospf_summary_lsa_originate (p, cost, area);
  499.   /* This will flood through area. */
  500. }
  501.       
  502.       SET_FLAG (lsa->flags, OSPF_LSA_APPROVED);
  503.       if (IS_DEBUG_OSPF_EVENT)
  504. zlog_info ("ospf_abr_announce_network_to_area(): "
  505.    "flooding new version of summary");
  506. #ifndef HAVE_NSSA      
  507.       ospf_flood_through_area (area, NULL, lsa);
  508. #endif /* ! HAVE_NSSA */
  509.     }
  510.   if (IS_DEBUG_OSPF_EVENT)
  511.     zlog_info ("ospf_abr_announce_network_to_area(): Stop");
  512. }
  513. int
  514. ospf_abr_nexthops_belong_to_area (struct ospf_route *or,
  515.   struct ospf_area *area)
  516. {
  517.   listnode node;
  518.   for (node = listhead (or->path); node; nextnode (node))
  519.     {
  520.       struct ospf_path *path = node->data;
  521.       struct ospf_interface *oi = path->oi;
  522.       if (oi != NULL)
  523. if (oi->area == area)
  524.   return 1;
  525.     }
  526.   return 0;
  527. }
  528. int
  529. ospf_abr_should_accept (struct prefix *p, struct ospf_area *area)
  530. {
  531.   if (IMPORT_NAME (area))
  532.     {
  533.       if (IMPORT_LIST (area) == NULL)
  534. IMPORT_LIST (area) = access_list_lookup (AFI_IP, IMPORT_NAME (area));
  535.       if (IMPORT_LIST (area))
  536.         if (access_list_apply (IMPORT_LIST (area), p) == FILTER_DENY)
  537.   return 0;
  538.     }
  539.   return 1;
  540. }
  541. int
  542. ospf_abr_plist_in_check (struct ospf_area *area, struct ospf_route *or,
  543.  struct prefix *p)
  544. {
  545.   if (PREFIX_NAME_IN (area))
  546.     {
  547.       if (PREFIX_LIST_IN (area) == NULL)
  548. PREFIX_LIST_IN (area) = prefix_list_lookup (AFI_IP,
  549.     PREFIX_NAME_IN (area));
  550.       if (PREFIX_LIST_IN (area))
  551. if (prefix_list_apply (PREFIX_LIST_IN (area), p) != PREFIX_PERMIT)
  552.   return 0;
  553.     }
  554.   return 1;
  555. }
  556. int
  557. ospf_abr_plist_out_check (struct ospf_area *area, struct ospf_route *or,
  558.   struct prefix *p)
  559. {
  560.   if (PREFIX_NAME_OUT (area))
  561.     {
  562.       if (PREFIX_LIST_OUT (area) == NULL)
  563. PREFIX_LIST_OUT (area) = prefix_list_lookup (AFI_IP,
  564.      PREFIX_NAME_OUT (area));
  565.       if (PREFIX_LIST_OUT (area))
  566. if (prefix_list_apply (PREFIX_LIST_OUT (area), p) != PREFIX_PERMIT)
  567.   return 0;
  568.     }
  569.   return 1;
  570. }
  571. void
  572. ospf_abr_announce_network (struct ospf *ospf,
  573.    struct route_node *n, struct ospf_route *or)
  574. {
  575.   struct ospf_area_range *range;
  576.   struct ospf_area *area, *or_area;
  577.   struct prefix_ipv4 *p;
  578.   listnode node;
  579.   if (IS_DEBUG_OSPF_EVENT)
  580.     zlog_info ("ospf_abr_announce_network(): Start");
  581.   p = (struct prefix_ipv4 *) &n->p;
  582.   or_area = ospf_area_lookup_by_area_id (ospf, or->u.std.area_id); 
  583.   assert (or_area);
  584.   for (node = listhead (ospf->areas); node; nextnode (node))
  585.     {
  586.       area = getdata (node);
  587.       if (IS_DEBUG_OSPF_EVENT)
  588. zlog_info ("ospf_abr_announce_network(): looking at area %s",
  589.    inet_ntoa (area->area_id));
  590.       if (IPV4_ADDR_SAME (&or->u.std.area_id, &area->area_id))
  591. continue;
  592.       if (ospf_abr_nexthops_belong_to_area (or, area))
  593. continue;
  594.       if (!ospf_abr_should_accept (&n->p, area))
  595. {
  596.   if (IS_DEBUG_OSPF_EVENT)
  597.     zlog_info ("ospf_abr_announce_network(): "
  598.        "prefix %s/%d was denied by import-list",
  599.        inet_ntoa (p->prefix), p->prefixlen);
  600.   continue; 
  601. }
  602.       if (!ospf_abr_plist_in_check (area, or, &n->p))
  603. {
  604.   if (IS_DEBUG_OSPF_EVENT)
  605.     zlog_info ("ospf_abr_announce_network(): "
  606.        "prefix %s/%d was denied by prefix-list",
  607.        inet_ntoa (p->prefix), p->prefixlen);
  608.   continue; 
  609. }
  610.       if (area->external_routing != OSPF_AREA_DEFAULT && area->no_summary)
  611. {
  612.   if (IS_DEBUG_OSPF_EVENT)
  613.     zlog_info ("ospf_abr_announce_network(): "
  614.        "area %s is stub and no_summary",
  615.        inet_ntoa (area->area_id));
  616.           continue;
  617. }
  618.       if (or->path_type == OSPF_PATH_INTER_AREA)
  619. {
  620.   if (IS_DEBUG_OSPF_EVENT)
  621.     zlog_info ("ospf_abr_announce_network(): this is "
  622.        "inter-area route to %s/%d",
  623.        inet_ntoa (p->prefix), p->prefixlen);
  624.           if (!OSPF_IS_AREA_BACKBONE (area))
  625.     ospf_abr_announce_network_to_area (p, or->cost, area);
  626. }
  627.       if (or->path_type == OSPF_PATH_INTRA_AREA)
  628. {
  629.   if (IS_DEBUG_OSPF_EVENT)
  630.     zlog_info ("ospf_abr_announce_network(): "
  631.        "this is intra-area route to %s/%d",
  632.        inet_ntoa (p->prefix), p->prefixlen);
  633.   if ((range = ospf_area_range_match (or_area, p)) &&
  634.               !ospf_area_is_transit (area))
  635.     ospf_abr_update_aggregate (range, or);
  636.   else
  637.     ospf_abr_announce_network_to_area (p, or->cost, area);
  638. }
  639.     }
  640. }
  641. int
  642. ospf_abr_should_announce (struct ospf *ospf,
  643.   struct prefix *p, struct ospf_route *or)
  644. {
  645.   struct ospf_area *area;
  646.   area = ospf_area_lookup_by_area_id (ospf, or->u.std.area_id);
  647.   assert (area);
  648.   
  649.   if (EXPORT_NAME (area))
  650.     {
  651.       if (EXPORT_LIST (area) == NULL)
  652. EXPORT_LIST (area) = access_list_lookup (AFI_IP, EXPORT_NAME (area));
  653.       if (EXPORT_LIST (area))
  654.         if (access_list_apply (EXPORT_LIST (area), p) == FILTER_DENY)
  655.   return 0;
  656.     }
  657.   return 1;
  658. }
  659. #ifdef HAVE_NSSA
  660. void
  661. ospf_abr_process_nssa_translates (struct ospf *ospf)
  662. {
  663.   /* Scan through all NSSA_LSDB records for all areas;
  664.   If P-bit is on, translate all Type-7's to 5's and aggregate or
  665.   flood install as approved in Type-5 LSDB with XLATE Flag on
  666.   later, do same for all aggregates...  At end, DISCARD all
  667.   remaining UNAPPROVED Type-5's (Aggregate is for future ) */
  668.   listnode node;
  669.   struct ospf_area *area;
  670.   struct route_node *rn;
  671.   struct ospf_lsa *lsa;
  672.   if (IS_DEBUG_OSPF_NSSA)
  673.     zlog_info ("ospf_abr_process_nssa_translates(): Start");
  674.   for (node = listhead (ospf->areas); node; nextnode (node))
  675.     {
  676.       area = getdata (node);
  677.       if (! area->NSSATranslator)
  678. continue; /* skip if not translator */
  679.       
  680.       if (area->external_routing != OSPF_AREA_NSSA)
  681. continue;  /* skip if not Nssa Area */
  682.       if (IS_DEBUG_OSPF_NSSA)
  683. zlog_info ("ospf_abr_process_nssa_translates(): "
  684.    "looking at area %s", inet_ntoa (area->area_id));
  685.       
  686.       LSDB_LOOP (NSSA_LSDB (area), rn, lsa)
  687. ospf_abr_translate_nssa (area, lsa);
  688.     }
  689.  
  690.   if (IS_DEBUG_OSPF_NSSA)
  691.     zlog_info ("ospf_abr_process_nssa_translates(): Stop");
  692. }
  693. #endif /* HAVE_NSSA */
  694. void
  695. ospf_abr_process_network_rt (struct ospf *ospf,
  696.      struct route_table *rt)
  697. {
  698.   struct ospf_area *area;
  699.   struct ospf_route *or;
  700.   struct route_node *rn;
  701.   if (IS_DEBUG_OSPF_EVENT)
  702.     zlog_info ("ospf_abr_process_network_rt(): Start");
  703.   for (rn = route_top (rt); rn; rn = route_next (rn))
  704.     {
  705.       if ((or = rn->info) == NULL)
  706. continue;
  707.       if (!(area = ospf_area_lookup_by_area_id (ospf, or->u.std.area_id)))
  708. {
  709.   if (IS_DEBUG_OSPF_EVENT)
  710.     zlog_info ("ospf_abr_process_network_rt(): area %s no longer exists",
  711.        inet_ntoa (or->u.std.area_id));
  712.   continue;
  713. }
  714.       if (IS_DEBUG_OSPF_EVENT)
  715. zlog_info ("ospf_abr_process_network_rt(): this is a route to %s/%d",
  716.    inet_ntoa (rn->p.u.prefix4), rn->p.prefixlen);
  717.       if (or->path_type >= OSPF_PATH_TYPE1_EXTERNAL)
  718. {
  719.   if (IS_DEBUG_OSPF_EVENT)
  720.     zlog_info ("ospf_abr_process_network_rt(): "
  721.        "this is an External router, skipping");
  722.   continue;
  723. }
  724.       if (or->cost >= OSPF_LS_INFINITY)
  725. {
  726.   if (IS_DEBUG_OSPF_EVENT)
  727.     zlog_info ("ospf_abr_process_network_rt():"
  728.        " this route's cost is infinity, skipping");
  729.   continue;
  730. }
  731.       if (or->type == OSPF_DESTINATION_DISCARD)
  732. {
  733.   if (IS_DEBUG_OSPF_EVENT)
  734.     zlog_info ("ospf_abr_process_network_rt():"
  735.        " this is a discard entry, skipping");
  736.   continue;
  737. }
  738.       if (or->path_type == OSPF_PATH_INTRA_AREA &&
  739.   !ospf_abr_should_announce (ospf, &rn->p, or))
  740. {
  741.   if (IS_DEBUG_OSPF_EVENT)
  742.     zlog_info("ospf_abr_process_network_rt(): denied by export-list");
  743.   continue;
  744. }
  745.       if (or->path_type == OSPF_PATH_INTRA_AREA &&
  746.   !ospf_abr_plist_out_check (area, or, &rn->p))
  747. {
  748.   if (IS_DEBUG_OSPF_EVENT)
  749.     zlog_info("ospf_abr_process_network_rt(): denied by prefix-list");
  750.   continue;
  751. }
  752.       if ((or->path_type == OSPF_PATH_INTER_AREA) &&
  753.           !OSPF_IS_AREA_ID_BACKBONE (or->u.std.area_id))
  754. {
  755.   if (IS_DEBUG_OSPF_EVENT)
  756.     zlog_info ("ospf_abr_process_network_rt():"
  757.        " this is route is not backbone one, skipping");
  758.   continue;
  759. }
  760.       if ((ospf->abr_type == OSPF_ABR_CISCO) ||
  761.           (ospf->abr_type == OSPF_ABR_IBM))
  762. if (!ospf_act_bb_connection (ospf) &&
  763.     or->path_type != OSPF_PATH_INTRA_AREA)
  764.   {
  765.     if (IS_DEBUG_OSPF_EVENT)
  766.       zlog_info ("ospf_abr_process_network_rt(): ALT ABR: "
  767.  "No BB connection, skip not intra-area routes");
  768.     continue;
  769.   }
  770.       if (IS_DEBUG_OSPF_EVENT)
  771. zlog_info ("ospf_abr_process_network_rt(): announcing");
  772.       ospf_abr_announce_network (ospf, rn, or);
  773.     }
  774.   if (IS_DEBUG_OSPF_EVENT)
  775.     zlog_info ("ospf_abr_process_network_rt(): Stop");
  776. }
  777. void
  778. ospf_abr_announce_rtr_to_area (struct prefix_ipv4 *p, u_int32_t cost,
  779.        struct ospf_area *area)
  780. {
  781.   struct ospf_lsa *lsa, *old = NULL;
  782.   struct summary_lsa *slsa = NULL;
  783.   if (IS_DEBUG_OSPF_EVENT)
  784.     zlog_info ("ospf_abr_announce_rtr_to_area(): Start");
  785.   old = ospf_lsa_lookup_by_prefix (area->lsdb, OSPF_ASBR_SUMMARY_LSA,
  786.    p, area->ospf->router_id);
  787.   if (old)
  788.     {
  789.       if (IS_DEBUG_OSPF_EVENT)
  790. zlog_info ("ospf_abr_announce_rtr_to_area(): old summary found");
  791.       slsa = (struct summary_lsa *) old->data;
  792.       if (IS_DEBUG_OSPF_EVENT)
  793. zlog_info ("ospf_abr_announce_network_to_area(): "
  794.    "old metric: %d, new metric: %d",
  795.    GET_METRIC (slsa->metric), cost);
  796.     }
  797.   if (old && (GET_METRIC (slsa->metric) == cost))
  798.     {
  799.       if (IS_DEBUG_OSPF_EVENT)
  800. zlog_info ("ospf_abr_announce_rtr_to_area(): old summary approved");
  801.       SET_FLAG (old->flags, OSPF_LSA_APPROVED);
  802.     }
  803.   else
  804.     {
  805.       if (IS_DEBUG_OSPF_EVENT)
  806. zlog_info ("ospf_abr_announce_rtr_to_area(): 2.2");
  807.        
  808.       if (old) 
  809.   set_metric (old, cost);
  810.   lsa = ospf_summary_asbr_lsa_refresh (area->ospf, old);
  811. }
  812.       else
  813. lsa = ospf_summary_asbr_lsa_originate (p, cost, area);
  814.       if (IS_DEBUG_OSPF_EVENT)
  815. zlog_info ("ospf_abr_announce_rtr_to_area(): "
  816.    "flooding new version of summary");
  817.       /*
  818. zlog_info ("ospf_abr_announce_rtr_to_area(): creating new summary");
  819. lsa = ospf_summary_asbr_lsa (p, cost, area, old); */
  820.       SET_FLAG (lsa->flags, OSPF_LSA_APPROVED);
  821.       /* ospf_flood_through_area (area, NULL, lsa);*/
  822.     }
  823.   if (IS_DEBUG_OSPF_EVENT)
  824.     zlog_info ("ospf_abr_announce_rtr_to_area(): Stop");
  825. }
  826. void
  827. ospf_abr_announce_rtr (struct ospf *ospf,
  828.        struct prefix_ipv4 *p, struct ospf_route *or)
  829. {
  830.   listnode node;
  831.   struct ospf_area *area;
  832.   if (IS_DEBUG_OSPF_EVENT)
  833.     zlog_info ("ospf_abr_announce_rtr(): Start");
  834.   for (node = listhead (ospf->areas); node; nextnode (node))
  835.     {
  836.       area = getdata (node);
  837.       if (IS_DEBUG_OSPF_EVENT)
  838. zlog_info ("ospf_abr_announce_rtr(): looking at area %s",
  839.    inet_ntoa (area->area_id));
  840.       if (IPV4_ADDR_SAME (&or->u.std.area_id, &area->area_id))
  841. continue;
  842.       if (ospf_abr_nexthops_belong_to_area (or, area))
  843. continue;
  844.       if (area->external_routing != OSPF_AREA_DEFAULT)
  845. {
  846.   if (IS_DEBUG_OSPF_EVENT)
  847.     zlog_info ("ospf_abr_announce_network(): "
  848.        "area %s doesn't support external routing",
  849.        inet_ntoa(area->area_id));
  850.           continue;
  851. }
  852.       if (or->path_type == OSPF_PATH_INTER_AREA)
  853. {
  854.   if (IS_DEBUG_OSPF_EVENT)
  855.     zlog_info ("ospf_abr_announce_rtr(): "
  856.        "this is inter-area route to %s", inet_ntoa (p->prefix));
  857.           if (!OSPF_IS_AREA_BACKBONE (area))
  858.     ospf_abr_announce_rtr_to_area (p, or->cost, area);
  859. }
  860.       if (or->path_type == OSPF_PATH_INTRA_AREA)
  861. {
  862.   if (IS_DEBUG_OSPF_EVENT)
  863.     zlog_info ("ospf_abr_announce_rtr(): "
  864.        "this is intra-area route to %s", inet_ntoa (p->prefix));
  865.           ospf_abr_announce_rtr_to_area (p, or->cost, area);
  866. }
  867.     }
  868.   if (IS_DEBUG_OSPF_EVENT)
  869.     zlog_info ("ospf_abr_announce_rtr(): Stop");
  870. }
  871. void
  872. ospf_abr_process_router_rt (struct ospf *ospf, struct route_table *rt)
  873. {
  874.   struct ospf_route *or;
  875.   struct route_node *rn;
  876.   struct list *l;
  877.   if (IS_DEBUG_OSPF_EVENT)
  878.     zlog_info ("ospf_abr_process_router_rt(): Start");
  879.   for (rn = route_top (rt); rn; rn = route_next (rn))
  880.     {
  881.       listnode node;
  882.       char flag = 0;
  883.       struct ospf_route *best = NULL;
  884.       if (rn->info == NULL)
  885. continue;
  886.       l = rn->info;
  887.       if (IS_DEBUG_OSPF_EVENT)
  888. zlog_info ("ospf_abr_process_router_rt(): this is a route to %s",
  889.    inet_ntoa (rn->p.u.prefix4));
  890.       for (node = listhead (l); node; nextnode (node))
  891. {
  892.   or = getdata (node);
  893.   if (or == NULL)
  894.     continue;
  895.   if (!ospf_area_lookup_by_area_id (ospf, or->u.std.area_id))
  896.     {
  897.       if (IS_DEBUG_OSPF_EVENT)
  898. zlog_info ("ospf_abr_process_router_rt(): area %s no longer exists",
  899.    inet_ntoa (or->u.std.area_id));
  900.       continue;
  901.     }
  902.   if (!CHECK_FLAG (or->u.std.flags, ROUTER_LSA_EXTERNAL))
  903.     {
  904.       if (IS_DEBUG_OSPF_EVENT)
  905. zlog_info ("ospf_abr_process_router_rt(): "
  906.    "This is not an ASBR, skipping");
  907.       continue;
  908.     }
  909.   if (!flag)
  910.     {
  911.       best = ospf_find_asbr_route (ospf, rt,
  912.    (struct prefix_ipv4 *) &rn->p);
  913.       flag = 1;
  914.     }
  915.   
  916.   if (best == NULL)
  917.     continue;
  918.   if (or != best)
  919.     {
  920.       if (IS_DEBUG_OSPF_EVENT)
  921. zlog_info ("ospf_abr_process_router_rt(): "
  922.    "This route is not the best among possible, skipping");
  923.       continue;
  924.     }
  925.   if (or->path_type == OSPF_PATH_INTER_AREA &&
  926.       !OSPF_IS_AREA_ID_BACKBONE (or->u.std.area_id))
  927.     {
  928.       if (IS_DEBUG_OSPF_EVENT)
  929. zlog_info ("ospf_abr_process_router_rt(): "
  930.    "This route is not a backbone one, skipping");
  931.       continue;
  932.     }
  933.   if (or->cost >= OSPF_LS_INFINITY)
  934.     {
  935.       if (IS_DEBUG_OSPF_EVENT)
  936. zlog_info ("ospf_abr_process_router_rt(): "
  937.    "This route has LS_INFINITY metric, skipping");
  938.       continue;
  939.     }
  940.   if (ospf->abr_type == OSPF_ABR_CISCO
  941.       || ospf->abr_type == OSPF_ABR_IBM)
  942.     if (!ospf_act_bb_connection (ospf)
  943. && or->path_type != OSPF_PATH_INTRA_AREA)
  944.       {
  945. if (IS_DEBUG_OSPF_EVENT)
  946.   zlog_info("ospf_abr_process_network_rt(): ALT ABR: "
  947.     "No BB connection, skip not intra-area routes");
  948. continue;
  949.       }
  950.   ospf_abr_announce_rtr (ospf, (struct prefix_ipv4 *) &rn->p, or);
  951. }
  952.     }
  953.   if (IS_DEBUG_OSPF_EVENT)
  954.     zlog_info ("ospf_abr_process_router_rt(): Stop");
  955. }
  956. #ifdef HAVE_NSSA
  957. void
  958. ospf_abr_unapprove_translates (struct ospf *ospf) /* For NSSA Translations */
  959. {
  960.   struct ospf_lsa *lsa;
  961.   struct route_node *rn;
  962.   if (IS_DEBUG_OSPF_NSSA)
  963.     zlog_info ("ospf_abr_unapprove_translates(): Start");
  964.   /* NSSA Translator is not checked, because it may have gone away,
  965.      and we would want to flush any residuals anyway */
  966.   LSDB_LOOP (EXTERNAL_LSDB (ospf), rn, lsa)
  967.     if (CHECK_FLAG (lsa->flags, OSPF_LSA_LOCAL_XLT))
  968.       UNSET_FLAG (lsa->flags, OSPF_LSA_APPROVED);
  969.   if (IS_DEBUG_OSPF_NSSA)
  970.     zlog_info ("ospf_abr_unapprove_translates(): Stop");
  971. }
  972. #endif /* HAVE_NSSA */
  973. void
  974. ospf_abr_unapprove_summaries (struct ospf *ospf)
  975. {
  976.   listnode node;
  977.   struct ospf_area *area;
  978.   struct route_node *rn;
  979.   struct ospf_lsa *lsa;
  980.   if (IS_DEBUG_OSPF_EVENT)
  981.     zlog_info ("ospf_abr_unapprove_summaries(): Start");
  982.   for (node = listhead (ospf->areas); node; nextnode (node))
  983.     {
  984.       area = getdata (node);
  985.       LSDB_LOOP (SUMMARY_LSDB (area), rn, lsa)
  986. if (ospf_lsa_is_self_originated (ospf, lsa))
  987.   UNSET_FLAG (lsa->flags, OSPF_LSA_APPROVED);
  988.       LSDB_LOOP (ASBR_SUMMARY_LSDB (area), rn, lsa)
  989. if (ospf_lsa_is_self_originated (ospf, lsa))
  990.   UNSET_FLAG (lsa->flags, OSPF_LSA_APPROVED);
  991.     }
  992.   if (IS_DEBUG_OSPF_EVENT)
  993.     zlog_info ("ospf_abr_unapprove_summaries(): Stop");
  994. }
  995. void
  996. ospf_abr_prepare_aggregates (struct ospf *ospf)
  997. {
  998.   listnode node;
  999.   struct route_node *rn;
  1000.   struct ospf_area_range *range;
  1001.   if (IS_DEBUG_OSPF_EVENT)
  1002.     zlog_info ("ospf_abr_prepare_aggregates(): Start");
  1003.   for (node = listhead (ospf->areas); node; nextnode (node))
  1004.     {
  1005.       struct ospf_area *area = getdata (node);
  1006.       for (rn = route_top (area->ranges); rn; rn = route_next (rn))
  1007. if ((range = rn->info) != NULL)
  1008.   {
  1009.     range->cost = 0;
  1010.     range->specifics = 0;
  1011.   }
  1012.     }
  1013.   if (IS_DEBUG_OSPF_EVENT)
  1014.     zlog_info ("ospf_abr_prepare_aggregates(): Stop");
  1015. }
  1016. void
  1017. ospf_abr_announce_aggregates (struct ospf *ospf)
  1018. {
  1019.   struct ospf_area *area, *ar;
  1020.   struct ospf_area_range *range;
  1021.   struct route_node *rn;
  1022.   struct prefix_ipv4 p;
  1023.   listnode node, n;
  1024.   if (IS_DEBUG_OSPF_EVENT)
  1025.     zlog_info ("ospf_abr_announce_aggregates(): Start");
  1026.   for (node = listhead (ospf->areas); node; nextnode (node))
  1027.     {
  1028.       area = getdata (node);
  1029.       if (IS_DEBUG_OSPF_EVENT)
  1030. zlog_info ("ospf_abr_announce_aggregates(): looking at area %s",
  1031.    inet_ntoa (area->area_id));
  1032.       for (rn = route_top (area->ranges); rn; rn = route_next (rn))
  1033. if ((range =  rn->info))
  1034.   {
  1035.     if (!CHECK_FLAG (range->flags, OSPF_AREA_RANGE_ADVERTISE))
  1036.       {
  1037. if (IS_DEBUG_OSPF_EVENT)
  1038.   zlog_info ("ospf_abr_announce_aggregates():"
  1039.      " discarding suppress-ranges");
  1040. continue;
  1041.       }
  1042.     p.family = AF_INET;
  1043.     p.prefix = range->addr;
  1044.     p.prefixlen = range->masklen;
  1045.     if (IS_DEBUG_OSPF_EVENT)
  1046.       zlog_info ("ospf_abr_announce_aggregates():"
  1047.  " this is range: %s/%d",
  1048.  inet_ntoa (p.prefix), p.prefixlen);
  1049.     if (CHECK_FLAG (range->flags, OSPF_AREA_RANGE_SUBSTITUTE))
  1050.       {
  1051. p.family = AF_INET;
  1052. p.prefix = range->subst_addr;
  1053. p.prefixlen = range->subst_masklen;
  1054.       }
  1055.     if (range->specifics)
  1056.       {
  1057. if (IS_DEBUG_OSPF_EVENT)
  1058.   zlog_info ("ospf_abr_announce_aggregates(): active range");
  1059. for (n = listhead (ospf->areas); n; nextnode (n))
  1060.   {
  1061.     ar = getdata (n);
  1062.     if (ar == area)
  1063.       continue;
  1064.     /* We do not check nexthops here, because
  1065.        intra-area routes can be associated with
  1066.        one area only */
  1067.     /* backbone routes are not summarized
  1068.        when announced into transit areas */
  1069.     if (ospf_area_is_transit (ar) &&
  1070. OSPF_IS_AREA_BACKBONE (area))
  1071.       {
  1072. if (IS_DEBUG_OSPF_EVENT)
  1073.   zlog_info ("ospf_abr_announce_aggregates(): Skipping "
  1074.      "announcement of BB aggregate into"
  1075.      " a transit area");
  1076. continue; 
  1077.       }
  1078.     ospf_abr_announce_network_to_area (&p, range->cost, ar);
  1079.   }
  1080.       }
  1081.   }
  1082.     }
  1083.   if (IS_DEBUG_OSPF_EVENT)
  1084.     zlog_info ("ospf_abr_announce_aggregates(): Stop");
  1085. }
  1086. #ifdef HAVE_NSSA
  1087. void
  1088. ospf_abr_send_nssa_aggregates (struct ospf *ospf) /* temporarily turned off */
  1089. {
  1090.   listnode node; /*, n; */
  1091.   struct ospf_area *area; /*, *ar; */
  1092.   struct route_node *rn;
  1093.   struct ospf_area_range *range;
  1094.   struct prefix_ipv4 p;
  1095.   if (IS_DEBUG_OSPF_NSSA)
  1096.     zlog_info ("ospf_abr_send_nssa_aggregates(): Start");
  1097.   for (node = listhead (ospf->areas); node; nextnode (node))
  1098.     {
  1099.       area = getdata (node);
  1100.       if (! area->NSSATranslator)
  1101. continue;
  1102.       if (IS_DEBUG_OSPF_NSSA)
  1103. zlog_info ("ospf_abr_send_nssa_aggregates(): looking at area %s",
  1104.    inet_ntoa (area->area_id));
  1105.       for (rn = route_top (area->ranges); rn; rn = route_next (rn))
  1106. {
  1107.           if (rn->info == NULL)
  1108.     continue;
  1109.   range = rn->info;
  1110.           if (!CHECK_FLAG (range->flags, OSPF_AREA_RANGE_ADVERTISE))
  1111.     {
  1112.       if (IS_DEBUG_OSPF_NSSA)
  1113. zlog_info ("ospf_abr_send_nssa_aggregates():"
  1114.    " discarding suppress-ranges");
  1115.       continue;
  1116.     }
  1117.           p.family = AF_INET;
  1118.           p.prefix = range->addr;
  1119.           p.prefixlen = range->masklen;
  1120.   if (IS_DEBUG_OSPF_NSSA)
  1121.     zlog_info ("ospf_abr_send_nssa_aggregates():"
  1122.        " this is range: %s/%d",
  1123.        inet_ntoa (p.prefix), p.prefixlen);
  1124.           if (CHECK_FLAG (range->flags, OSPF_AREA_RANGE_SUBSTITUTE))
  1125.     {
  1126.       p.family = AF_INET;
  1127.       p.prefix = range->subst_addr;
  1128.       p.prefixlen = range->subst_masklen;
  1129.     }
  1130.           if (range->specifics)
  1131.     {
  1132.       if (IS_DEBUG_OSPF_NSSA)
  1133. zlog_info ("ospf_abr_send_nssa_aggregates(): active range");
  1134.       /* Fetch LSA-Type-7 from aggregate prefix, and then
  1135.                  translate, Install (as Type-5), Approve, and Flood */
  1136.       ospf_abr_translate_nssa_range (&p, range->cost);
  1137.     } /* if (range->specifics)*/
  1138. } /* all area ranges*/
  1139.     } /* all areas */
  1140.   if (IS_DEBUG_OSPF_NSSA)
  1141.     zlog_info ("ospf_abr_send_nssa_aggregates(): Stop");
  1142. }
  1143. void
  1144. ospf_abr_announce_nssa_defaults (struct ospf *ospf) /* By ABR-Translator */
  1145. {
  1146.   listnode node;
  1147.   struct ospf_area *area;
  1148.   struct prefix_ipv4 p;
  1149.   if (! IS_OSPF_ABR (ospf))
  1150.     return;
  1151.   if (IS_DEBUG_OSPF_NSSA)
  1152.     zlog_info ("ospf_abr_announce_stub_defaults(): Start");
  1153.   p.family = AF_INET;
  1154.   p.prefix.s_addr = OSPF_DEFAULT_DESTINATION;
  1155.   p.prefixlen = 0;
  1156.   for (node = listhead (ospf->areas); node; nextnode (node))
  1157.     {
  1158.       area = getdata (node);
  1159.       if (IS_DEBUG_OSPF_NSSA)
  1160. zlog_info ("ospf_abr_announce_nssa_defaults(): looking at area %s",
  1161.    inet_ntoa (area->area_id));
  1162.       if (area->external_routing != OSPF_AREA_NSSA)
  1163. continue;
  1164.       if (OSPF_IS_AREA_BACKBONE (area))
  1165. continue; /* Sanity Check */
  1166.       /* if (!TranslatorRole continue V 1.0 look for "always" conf */
  1167.       if (area->NSSATranslator)
  1168. {
  1169.   if (IS_DEBUG_OSPF_NSSA)
  1170.     zlog_info ("ospf_abr_announce_nssa_defaults(): "
  1171.        "announcing 0.0.0.0/0 to this nssa");
  1172.   /* ospf_abr_announce_nssa_asbr_to_as (&p, area->default_cost, area); */
  1173. }
  1174.     }
  1175. }
  1176. #endif /* HAVE_NSSA */
  1177. void
  1178. ospf_abr_announce_stub_defaults (struct ospf *ospf)
  1179. {
  1180.   listnode node;
  1181.   struct ospf_area *area;
  1182.   struct prefix_ipv4 p;
  1183.   if (! IS_OSPF_ABR (ospf))
  1184.     return;
  1185.   if (IS_DEBUG_OSPF_EVENT)
  1186.     zlog_info ("ospf_abr_announce_stub_defaults(): Start");
  1187.   p.family = AF_INET;
  1188.   p.prefix.s_addr = OSPF_DEFAULT_DESTINATION;
  1189.   p.prefixlen = 0;
  1190.   for (node = listhead (ospf->areas); node; nextnode (node))
  1191.     {
  1192.       area = getdata (node);
  1193.       if (IS_DEBUG_OSPF_EVENT)
  1194. zlog_info ("ospf_abr_announce_stub_defaults(): looking at area %s",
  1195.    inet_ntoa (area->area_id));
  1196. #ifdef HAVE_NSSA
  1197.       if (area->external_routing != OSPF_AREA_STUB)
  1198. #else /* ! HAVE_NSSA */
  1199. if (area->external_routing == OSPF_AREA_DEFAULT)
  1200. #endif /* HAVE_NSSA */
  1201.   continue;
  1202.       if (OSPF_IS_AREA_BACKBONE (area))
  1203. continue; /* Sanity Check */
  1204.       if (IS_DEBUG_OSPF_EVENT)
  1205. zlog_info ("ospf_abr_announce_stub_defaults(): "
  1206.    "announcing 0.0.0.0/0 to this area");
  1207.       ospf_abr_announce_network_to_area (&p, area->default_cost, area);
  1208.     }
  1209.   if (IS_DEBUG_OSPF_EVENT)
  1210.     zlog_info ("ospf_abr_announce_stub_defaults(): Stop");
  1211. }
  1212. #ifdef HAVE_NSSA
  1213. int
  1214. ospf_abr_remove_unapproved_translates_apply (struct ospf *ospf,
  1215.      struct ospf_lsa *lsa)
  1216. {
  1217.   if (CHECK_FLAG (lsa->flags, OSPF_LSA_LOCAL_XLT)
  1218.       && ! CHECK_FLAG (lsa->flags, OSPF_LSA_APPROVED))
  1219.     {
  1220.       zlog_info ("ospf_abr_remove_unapproved_translates(): "
  1221.  "removing unapproved translates, ID: %s",
  1222.  inet_ntoa (lsa->data->id));
  1223.       /* FLUSH THROUGHOUT AS */
  1224.       ospf_lsa_flush_as (ospf, lsa);
  1225.       /* DISCARD from LSDB  */
  1226.     }
  1227.   return 0;
  1228. }
  1229. void
  1230. ospf_abr_remove_unapproved_translates (struct ospf *ospf)
  1231. {
  1232.   struct route_node *rn;
  1233.   struct ospf_lsa *lsa;
  1234.   /* All AREA PROCESS should have APPROVED necessary LSAs */
  1235.   /* Remove any left over and not APPROVED */
  1236.   if (IS_DEBUG_OSPF_NSSA)
  1237.     zlog_info ("ospf_abr_remove_unapproved_translates(): Start");
  1238.   LSDB_LOOP (EXTERNAL_LSDB (ospf), rn, lsa)
  1239.     ospf_abr_remove_unapproved_translates_apply (ospf, lsa);
  1240.  
  1241.   if (IS_DEBUG_OSPF_NSSA)
  1242.     zlog_info ("ospf_abr_remove_unapproved_translates(): Stop");
  1243. }
  1244. #endif /* HAVE_NSSA */
  1245. void
  1246. ospf_abr_remove_unapproved_summaries (struct ospf *ospf)
  1247. {
  1248.   listnode node;
  1249.   struct ospf_area *area;
  1250.   struct route_node *rn;
  1251.   struct ospf_lsa *lsa;
  1252.   if (IS_DEBUG_OSPF_EVENT)
  1253.     zlog_info ("ospf_abr_remove_unapproved_summaries(): Start");
  1254.   for (node = listhead (ospf->areas); node; nextnode (node))
  1255.     {
  1256.       area = getdata (node);
  1257.       if (IS_DEBUG_OSPF_EVENT)
  1258. zlog_info ("ospf_abr_remove_unapproved_summaries(): "
  1259.    "looking at area %s", inet_ntoa (area->area_id));
  1260.       LSDB_LOOP (SUMMARY_LSDB (area), rn, lsa)
  1261. if (ospf_lsa_is_self_originated (ospf, lsa))
  1262.   if (!CHECK_FLAG (lsa->flags, OSPF_LSA_APPROVED))
  1263.     ospf_lsa_flush_area (lsa, area);
  1264.       LSDB_LOOP (ASBR_SUMMARY_LSDB (area), rn, lsa)
  1265. if (ospf_lsa_is_self_originated (ospf, lsa))
  1266.   if (!CHECK_FLAG (lsa->flags, OSPF_LSA_APPROVED))
  1267.     ospf_lsa_flush_area (lsa, area);
  1268.     }
  1269.  
  1270.   if (IS_DEBUG_OSPF_EVENT)
  1271.     zlog_info ("ospf_abr_remove_unapproved_summaries(): Stop");
  1272. }
  1273. void
  1274. ospf_abr_manage_discard_routes (struct ospf *ospf)
  1275. {
  1276.   listnode node;
  1277.   struct route_node *rn;
  1278.   struct ospf_area *area;
  1279.   struct ospf_area_range *range;
  1280.   for (node = listhead (ospf->areas); node; nextnode (node))
  1281.     if ((area = node->data) != NULL)
  1282.       for (rn = route_top (area->ranges); rn; rn = route_next (rn))
  1283. if ((range = rn->info) != NULL)
  1284.   if (CHECK_FLAG (range->flags, OSPF_AREA_RANGE_ADVERTISE))
  1285.     {
  1286.       if (range->specifics)
  1287. ospf_add_discard_route (ospf->new_table, area,
  1288. (struct prefix_ipv4 *) &rn->p);
  1289.       else
  1290. ospf_delete_discard_route ((struct prefix_ipv4 *) &rn->p);
  1291.     }
  1292. }
  1293. #ifdef HAVE_NSSA
  1294. /* This is the function taking care about ABR NSSA, i.e.  NSSA
  1295.    Translator, -LSA aggregation and flooding. For all NSSAs
  1296.    Any SELF-AS-LSA is in the Type-5 LSDB and Type-7 LSDB.  These LSA's
  1297.    are refreshed from the Type-5 LSDB, installed into the Type-7 LSDB
  1298.    with the P-bit set.
  1299.    Any received Type-5s are legal for an ABR, else illegal for IR.
  1300.    Received Type-7s are installed, by area, with incoming P-bit.  They
  1301.    are flooded; if the Elected NSSA Translator, then P-bit off.
  1302.    Additionally, this ABR will place "translated type-7's" into the
  1303.    Type-5 LSDB in order to keep track of APPROVAL or not.
  1304.    It will scan through every area, looking for Type-7 LSAs with P-Bit
  1305.    SET. The Type-7's are either AS-FLOODED & 5-INSTALLED or
  1306.    AGGREGATED.  Later, the AGGREGATED LSAs are AS-FLOODED &
  1307.    5-INSTALLED.
  1308.    5-INSTALLED is into the Type-5 LSDB; Any UNAPPROVED Type-5 LSAs
  1309.    left over are FLUSHED and DISCARDED.
  1310.    For External Calculations, any NSSA areas use the Type-7 AREA-LSDB,
  1311.    any ABR-non-NSSA areas use the Type-5 GLOBAL-LSDB. */
  1312. void
  1313. ospf_abr_nssa_task (struct ospf *ospf) /* called only if any_nssa */
  1314. {
  1315.   if (IS_DEBUG_OSPF_NSSA)
  1316.     zlog_info ("Check for NSSA-ABR Tasks():");
  1317.   if (! IS_OSPF_ABR (ospf))
  1318.     return;
  1319.   if (! ospf->anyNSSA)
  1320.     return;
  1321.   /* Each area must confirm TranslatorRole */
  1322.   if (IS_DEBUG_OSPF_NSSA)
  1323.     zlog_info ("ospf_abr_nssa_task(): Start");
  1324.   /* For all Global Entries flagged "local-translate", unset APPROVED */
  1325.   if (IS_DEBUG_OSPF_NSSA)
  1326.     zlog_info ("ospf_abr_nssa_task(): unapprove translates");
  1327.   ospf_abr_unapprove_translates (ospf);
  1328.   /* RESET all Ranges in every Area, same as summaries */
  1329.   if (IS_DEBUG_OSPF_NSSA)
  1330.     zlog_info ("ospf_abr_nssa_task(): NSSA initialize aggregates");
  1331.   /*    ospf_abr_prepare_aggregates ();  TURNED OFF just for now */
  1332.   /* For all NSSAs, Type-7s, translate to 5's, INSTALL/FLOOD, or
  1333.      Aggregate as Type-7 */
  1334.   /* Install or Approve in Type-5 Global LSDB */
  1335.   if (IS_DEBUG_OSPF_NSSA)
  1336.     zlog_info ("ospf_abr_nssa_task(): process translates");
  1337.   ospf_abr_process_nssa_translates (ospf);
  1338.   /* Translate/Send any "ranged" aggregates, and also 5-Install and
  1339.      Approve */
  1340.   /* Scan Type-7's for aggregates, translate to Type-5's,
  1341.      Install/Flood/Approve */
  1342.   if (IS_DEBUG_OSPF_NSSA)
  1343.     zlog_info("ospf_abr_nssa_task(): send NSSA aggregates");
  1344.   /*       ospf_abr_send_nssa_aggregates ();  TURNED OFF FOR NOW */
  1345.   /* Send any NSSA defaults as Type-5 */
  1346.   if (IS_DEBUG_OSPF_NSSA)
  1347.     zlog_info ("ospf_abr_nssa_task(): announce nssa defaults");
  1348.   ospf_abr_announce_nssa_defaults (ospf);
  1349.    
  1350.   /* Flush any unapproved previous translates from Global Data Base */
  1351.   if (IS_DEBUG_OSPF_NSSA)
  1352.     zlog_info ("ospf_abr_nssa_task(): remove unapproved translates");
  1353.   ospf_abr_remove_unapproved_translates (ospf);
  1354.   ospf_abr_manage_discard_routes (ospf); /* same as normal...discard */
  1355.   if (IS_DEBUG_OSPF_NSSA)
  1356.     zlog_info ("ospf_abr_nssa_task(): Stop");
  1357. }
  1358. #endif /* HAVE_NSSA */
  1359. /* This is the function taking care about ABR stuff, i.e.
  1360.    summary-LSA origination and flooding. */
  1361. void
  1362. ospf_abr_task (struct ospf *ospf)
  1363. {
  1364.   if (IS_DEBUG_OSPF_EVENT)
  1365.     zlog_info ("ospf_abr_task(): Start");
  1366.   if (ospf->new_table == NULL || ospf->new_rtrs == NULL)
  1367.     {
  1368.       if (IS_DEBUG_OSPF_EVENT)
  1369. zlog_info ("ospf_abr_task(): Routing tables are not yet ready");
  1370.       return;
  1371.     }
  1372.   if (IS_DEBUG_OSPF_EVENT)
  1373.     zlog_info ("ospf_abr_task(): unapprove summaries");
  1374.   ospf_abr_unapprove_summaries (ospf);
  1375.   if (IS_DEBUG_OSPF_EVENT)
  1376.     zlog_info ("ospf_abr_task(): prepare aggregates");
  1377.   ospf_abr_prepare_aggregates (ospf);
  1378.   if (IS_OSPF_ABR (ospf))
  1379.     {
  1380.       if (IS_DEBUG_OSPF_EVENT)
  1381. zlog_info ("ospf_abr_task(): process network RT");
  1382.       ospf_abr_process_network_rt (ospf, ospf->new_table);
  1383.       if (IS_DEBUG_OSPF_EVENT)
  1384. zlog_info ("ospf_abr_task(): process router RT");
  1385.       ospf_abr_process_router_rt (ospf, ospf->new_rtrs);
  1386.       if (IS_DEBUG_OSPF_EVENT)
  1387. zlog_info ("ospf_abr_task(): announce aggregates");
  1388.       ospf_abr_announce_aggregates (ospf);
  1389.       if (IS_DEBUG_OSPF_EVENT)
  1390. zlog_info ("ospf_abr_task(): announce stub defaults");
  1391.       ospf_abr_announce_stub_defaults (ospf);
  1392.     }
  1393.   if (IS_DEBUG_OSPF_EVENT)
  1394.     zlog_info ("ospf_abr_task(): remove unapproved summaries");
  1395.   ospf_abr_remove_unapproved_summaries (ospf);
  1396.   ospf_abr_manage_discard_routes (ospf);
  1397. #ifdef HAVE_NSSA
  1398.   ospf_abr_nssa_task (ospf); /* if nssa-abr, then scan Type-7 LSDB */
  1399. #endif /* HAVE_NSSA */
  1400.   if (IS_DEBUG_OSPF_EVENT)
  1401.     zlog_info ("ospf_abr_task(): Stop");
  1402. }
  1403. int
  1404. ospf_abr_task_timer (struct thread *thread)
  1405. {
  1406.   struct ospf *ospf = THREAD_ARG (thread);
  1407.   ospf->t_abr_task = 0;
  1408.   if (IS_DEBUG_OSPF_EVENT)
  1409.     zlog_info ("Running ABR task on timer");
  1410.   ospf_check_abr_status (ospf);
  1411.   ospf_abr_task (ospf);
  1412.   return 0;
  1413. }
  1414. void
  1415. ospf_schedule_abr_task (struct ospf *ospf)
  1416. {
  1417.   if (IS_DEBUG_OSPF_EVENT)
  1418.     zlog_info ("Scheduling ABR task");
  1419.   if (ospf->t_abr_task == NULL)
  1420.     ospf->t_abr_task = thread_add_timer (master, ospf_abr_task_timer,
  1421.  ospf, OSPF_ABR_TASK_DELAY);
  1422. }