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

网络

开发平台:

Unix_Linux

  1. /*
  2.  * OSPF Link State Advertisement
  3.  * Copyright (C) 1999, 2000 Toshiaki Takada
  4.  *
  5.  * This file is part of GNU Zebra.
  6.  *
  7.  * GNU Zebra is free software; you can redistribute it and/or modify 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 "linklist.h"
  24. #include "prefix.h"
  25. #include "if.h"
  26. #include "table.h"
  27. #include "memory.h"
  28. #include "stream.h"
  29. #include "log.h"
  30. #include "thread.h"
  31. #include "hash.h"
  32. #include "sockunion.h" /* for inet_aton() */
  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_flood.h"
  42. #include "ospfd/ospf_packet.h"
  43. #include "ospfd/ospf_spf.h"
  44. #include "ospfd/ospf_dump.h"
  45. #include "ospfd/ospf_route.h"
  46. #include "ospfd/ospf_ase.h"
  47. #include "ospfd/ospf_zebra.h"
  48. u_int32_t
  49. get_metric (u_char *metric)
  50. {
  51.   u_int32_t m;
  52.   m = metric[0];
  53.   m = (m << 8) + metric[1];
  54.   m = (m << 8) + metric[2];
  55.   return m;
  56. }
  57. struct timeval
  58. tv_adjust (struct timeval a)
  59. {
  60.   while (a.tv_usec >= 1000000)
  61.     {
  62.       a.tv_usec -= 1000000;
  63.       a.tv_sec++;
  64.     }
  65.   while (a.tv_usec < 0)
  66.     {
  67.       a.tv_usec += 1000000;
  68.       a.tv_sec--;
  69.     }
  70.   return a;
  71. }
  72. int
  73. tv_ceil (struct timeval a)
  74. {
  75.   a = tv_adjust (a);
  76.   return (a.tv_usec ? a.tv_sec + 1 : a.tv_sec);
  77. }
  78. int
  79. tv_floor (struct timeval a)
  80. {
  81.   a = tv_adjust (a);
  82.   return a.tv_sec;
  83. }
  84. struct timeval
  85. int2tv (int a)
  86. {
  87.   struct timeval ret;
  88.   ret.tv_sec = a;
  89.   ret.tv_usec = 0;
  90.   return ret;
  91. }
  92. struct timeval
  93. tv_add (struct timeval a, struct timeval b)
  94. {
  95.   struct timeval ret;
  96.   ret.tv_sec = a.tv_sec + b.tv_sec;
  97.   ret.tv_usec = a.tv_usec + b.tv_usec;
  98.   return tv_adjust (ret);
  99. }
  100. struct timeval
  101. tv_sub (struct timeval a, struct timeval b)
  102. {
  103.   struct timeval ret;
  104.   ret.tv_sec = a.tv_sec - b.tv_sec;
  105.   ret.tv_usec = a.tv_usec - b.tv_usec;
  106.   return tv_adjust (ret);
  107. }
  108. int
  109. tv_cmp (struct timeval a, struct timeval b)
  110. {
  111.   return (a.tv_sec == b.tv_sec ?
  112.   a.tv_usec - b.tv_usec : a.tv_sec - b.tv_sec);
  113. }
  114. int
  115. ospf_lsa_refresh_delay (struct ospf_lsa *lsa)
  116. {
  117.   struct timeval delta, now;
  118.   int delay = 0;
  119.   gettimeofday (&now, NULL);
  120.   delta = tv_sub (now, lsa->tv_orig);
  121.   if (tv_cmp (delta, int2tv (OSPF_MIN_LS_INTERVAL)) < 0)
  122.     {
  123.       delay = tv_ceil (tv_sub (int2tv (OSPF_MIN_LS_INTERVAL), delta));
  124.       if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
  125.         zlog_info ("LSA[Type%d:%s]: Refresh timer delay %d seconds",
  126.            lsa->data->type, inet_ntoa (lsa->data->id), delay);
  127.       assert (delay > 0);
  128.     }
  129.   return delay;
  130. }
  131. int
  132. get_age (struct ospf_lsa *lsa)
  133. {
  134.   int age;
  135.   struct timeval now;
  136.   gettimeofday (&now, NULL);
  137.   age = ntohs (lsa->data->ls_age) + tv_floor (tv_sub (now, lsa->tv_recv));
  138.   return age;
  139. }
  140. /* Fletcher Checksum -- Refer to RFC1008. */
  141. #define MODX                 4102
  142. #define LSA_CHECKSUM_OFFSET    15
  143. u_int16_t
  144. ospf_lsa_checksum (struct lsa_header *lsa)
  145. {
  146.   u_char *sp, *ep, *p, *q;
  147.   int c0 = 0, c1 = 0;
  148.   int x, y;
  149.   u_int16_t length;
  150.   lsa->checksum = 0;
  151.   length = ntohs (lsa->length) - 2;
  152.   sp = (char *) &lsa->options;
  153.   for (ep = sp + length; sp < ep; sp = q)
  154.     {
  155.       q = sp + MODX;
  156.       if (q > ep)
  157.         q = ep;
  158.       for (p = sp; p < q; p++)
  159.         {
  160.           c0 += *p;
  161.           c1 += c0;
  162.         }
  163.       c0 %= 255;
  164.       c1 %= 255;
  165.     }
  166.   x = ((length - LSA_CHECKSUM_OFFSET) * c0 - c1) % 255;
  167.   if (x <= 0)
  168.     x += 255;
  169.   y = 510 - c0 - x;
  170.   if (y > 255)
  171.     y -= 255;
  172.   /* take care endian issue. */
  173.   lsa->checksum = htons ((x << 8) + y);
  174.   return (lsa->checksum);
  175. }
  176. /* Create OSPF LSA. */
  177. struct ospf_lsa *
  178. ospf_lsa_new ()
  179. {
  180.   struct ospf_lsa *new;
  181.   new = XCALLOC (MTYPE_OSPF_LSA, sizeof (struct ospf_lsa));
  182.   memset (new, 0, sizeof (struct ospf_lsa));
  183.   new->flags = 0;
  184.   new->lock = 1;
  185.   new->retransmit_counter = 0;
  186.   gettimeofday (&new->tv_recv, NULL);
  187.   new->tv_orig = new->tv_recv;
  188.   new->refresh_list = -1;
  189.   
  190.   return new;
  191. }
  192. /* Duplicate OSPF LSA. */
  193. struct ospf_lsa *
  194. ospf_lsa_dup (struct ospf_lsa *lsa)
  195. {
  196.   struct ospf_lsa *new;
  197.   if (lsa == NULL)
  198.     return NULL;
  199.   new = XCALLOC (MTYPE_OSPF_LSA, sizeof (struct ospf_lsa));
  200.   memcpy (new, lsa, sizeof (struct ospf_lsa));
  201.   UNSET_FLAG (new->flags, OSPF_LSA_DISCARD);
  202.   new->lock = 1;
  203.   new->retransmit_counter = 0;
  204.   new->data = ospf_lsa_data_dup (lsa->data);
  205.   /* kevinm: Clear the refresh_list, otherwise there are going
  206.      to be problems when we try to remove the LSA from the
  207.      queue (which it's not a member of.)
  208.      XXX: Should we add the LSA to the refresh_list queue? */
  209.   new->refresh_list = -1;
  210.   if (IS_DEBUG_OSPF (lsa, LSA))
  211.     zlog_info ("LSA: duplicated %p (new: %p)", lsa, new);
  212.   return new;
  213. }
  214. /* Free OSPF LSA. */
  215. void
  216. ospf_lsa_free (struct ospf_lsa *lsa)
  217. {
  218.   assert (lsa->lock == 0);
  219.   
  220.   if (IS_DEBUG_OSPF (lsa, LSA))
  221.     zlog_info ("LSA: freed %p", lsa);
  222.   /* Delete LSA data. */
  223.   if (lsa->data != NULL)
  224.     ospf_lsa_data_free (lsa->data);
  225.   assert (lsa->refresh_list < 0);
  226.   memset (lsa, 0, sizeof (struct ospf_lsa)); 
  227.   XFREE (MTYPE_OSPF_LSA, lsa);
  228. }
  229. /* Lock LSA. */
  230. struct ospf_lsa *
  231. ospf_lsa_lock (struct ospf_lsa *lsa)
  232. {
  233.   lsa->lock++;
  234.   return lsa;
  235. }
  236. /* Unlock LSA. */
  237. void
  238. ospf_lsa_unlock (struct ospf_lsa *lsa)
  239. {
  240.   /* This is sanity check. */
  241.   if (!lsa)
  242.     return;
  243.   
  244.   lsa->lock--;
  245.   assert (lsa->lock >= 0);
  246.   if (lsa->lock == 0)
  247.     {
  248.       assert (CHECK_FLAG (lsa->flags, OSPF_LSA_DISCARD));
  249.       ospf_lsa_free (lsa);
  250.     }
  251. }
  252. /* Check discard flag. */
  253. void
  254. ospf_lsa_discard (struct ospf_lsa *lsa)
  255. {
  256.   if (!CHECK_FLAG (lsa->flags, OSPF_LSA_DISCARD))
  257.     {
  258.       SET_FLAG (lsa->flags, OSPF_LSA_DISCARD);
  259.       ospf_lsa_unlock (lsa);
  260.     }
  261. }
  262. /* Create LSA data. */
  263. struct lsa_header *
  264. ospf_lsa_data_new (size_t size)
  265. {
  266.   struct lsa_header *new;
  267.   new = (struct lsa_header *) XMALLOC (MTYPE_OSPF_LSA_DATA, size);
  268.   memset (new, 0, size);
  269.   return new;
  270. }
  271. /* Duplicate LSA data. */
  272. struct lsa_header *
  273. ospf_lsa_data_dup (struct lsa_header *lsah)
  274. {
  275.   struct lsa_header *new;
  276.   new = ospf_lsa_data_new (ntohs (lsah->length));
  277.   memcpy (new, lsah, ntohs (lsah->length));
  278.   return new;
  279. }
  280. /* Free LSA data. */
  281. void
  282. ospf_lsa_data_free (struct lsa_header *lsah)
  283. {
  284.   if (IS_DEBUG_OSPF (lsa, LSA))
  285.     zlog_info ("LSA[Type%d:%s]: data freed %p",
  286.        lsah->type, inet_ntoa (lsah->id), lsah);
  287.   XFREE (MTYPE_OSPF_LSA_DATA, lsah);
  288. }
  289. /* LSA general functions. */
  290. const char *
  291. dump_lsa_key (struct ospf_lsa *lsa)
  292. {
  293.   static char buf[] = {
  294.     "Type255,id(255.255.255.255),ar(255.255.255.255)",
  295.   };
  296.   struct lsa_header *lsah;
  297.   if (lsa != NULL && (lsah = lsa->data) != NULL)
  298.     {
  299.       char id[INET_ADDRSTRLEN], ar[INET_ADDRSTRLEN];
  300.       strcpy (id, inet_ntoa (lsah->id));
  301.       strcpy (ar, inet_ntoa (lsah->adv_router));
  302.       sprintf (buf, "Type%d,id(%s),ar(%s)", lsah->type, id, ar);
  303.     }
  304.   else
  305.     strcpy (buf, "NULL");
  306.   return buf;
  307. }
  308. u_int32_t
  309. lsa_seqnum_increment (struct ospf_lsa *lsa)
  310. {
  311.   u_int32_t seqnum;
  312.   seqnum = ntohl (lsa->data->ls_seqnum) + 1;
  313.   return htonl (seqnum);
  314. }
  315. void
  316. lsa_header_set (struct stream *s, u_char options,
  317. u_char type, struct in_addr id, struct in_addr router_id)
  318. {
  319.   struct lsa_header *lsah;
  320.   lsah = (struct lsa_header *) STREAM_DATA (s);
  321.   lsah->ls_age = htons (0);
  322.   lsah->options = options;
  323.   lsah->type = type;
  324.   lsah->id = id;
  325.   lsah->adv_router = router_id;
  326.   lsah->ls_seqnum = htonl (OSPF_INITIAL_SEQUENCE_NUMBER);
  327.   ospf_output_forward (s, OSPF_LSA_HEADER_SIZE);
  328. }
  329. /* router-LSA related functions. */
  330. /* Get router-LSA flags. */
  331. u_char
  332. router_lsa_flags (struct ospf_area *area)
  333. {
  334.   u_char flags;
  335.   flags = area->ospf->flags;
  336.   /* Set virtual link flag. */
  337.   if (ospf_full_virtual_nbrs (area))
  338.     SET_FLAG (flags, ROUTER_LSA_VIRTUAL);
  339.   else
  340.     /* Just sanity check */
  341.     UNSET_FLAG (flags, ROUTER_LSA_VIRTUAL);
  342.   /* Set Shortcut ABR behabiour flag. */
  343.   UNSET_FLAG (flags, ROUTER_LSA_SHORTCUT);
  344.   if (area->ospf->abr_type == OSPF_ABR_SHORTCUT)
  345.     if (!OSPF_IS_AREA_BACKBONE (area))
  346.       if ((area->shortcut_configured == OSPF_SHORTCUT_DEFAULT &&
  347.    area->ospf->backbone == NULL) ||
  348.   area->shortcut_configured == OSPF_SHORTCUT_ENABLE)
  349. SET_FLAG (flags, ROUTER_LSA_SHORTCUT);
  350.   /* ASBR can't exit in stub area. */
  351.   if (area->external_routing == OSPF_AREA_STUB)
  352.     UNSET_FLAG (flags, OSPF_FLAG_ASBR);
  353.   return flags;
  354. }
  355. /* Lookup neighbor other than myself.
  356.    And check neighbor count,
  357.    Point-to-Point link must have only 1 neighbor. */
  358. struct ospf_neighbor *
  359. ospf_nbr_lookup_ptop (struct ospf_interface *oi)
  360. {
  361.   struct ospf_neighbor *nbr = NULL;
  362.   struct route_node *rn;
  363.   /* Search neighbor, there must be one of two nbrs. */
  364.   for (rn = route_top (oi->nbrs); rn; rn = route_next (rn))
  365.     if ((nbr = rn->info))
  366.       if (!IPV4_ADDR_SAME (&nbr->router_id, &oi->ospf->router_id))
  367. if (nbr->state == NSM_Full)
  368.   {
  369.     route_unlock_node (rn);
  370.     break;
  371.   }
  372.   /* PtoP link must have only 1 neighbor. */
  373.   if (ospf_nbr_count (oi, 0) > 1)
  374.     zlog_warn ("Point-to-Point link has more than 1 neighobrs.");
  375.   return nbr;
  376. }
  377. /* Set a link information. */
  378. void
  379. link_info_set (struct stream *s, struct in_addr id,
  380.        struct in_addr data, u_char type, u_char tos, u_int16_t cost)
  381. {
  382.   /* TOS based routing is not supported. */
  383.   stream_put_ipv4 (s, id.s_addr); /* Link ID. */
  384.   stream_put_ipv4 (s, data.s_addr); /* Link Data. */
  385.   stream_putc (s, type); /* Link Type. */
  386.   stream_putc (s, tos); /* TOS = 0. */
  387.   stream_putw (s, cost); /* Link Cost. */
  388. }
  389. /* Describe Point-to-Point link. */
  390. int
  391. lsa_link_ptop_set (struct stream *s, struct ospf_interface *oi)
  392. {
  393.   int links = 0;
  394.   struct ospf_neighbor *nbr;
  395.   struct in_addr id, mask;
  396.   if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
  397.     zlog_info ("LSA[Type1]: Set link Point-to-Point");
  398.   if ((nbr = ospf_nbr_lookup_ptop (oi)))
  399.     if (nbr->state == NSM_Full)
  400.       {
  401. /* For unnumbered point-to-point networks, the Link Data field
  402.    should specify the interface's MIB-II ifIndex value. */
  403. link_info_set (s, nbr->router_id, oi->address->u.prefix4,
  404.        LSA_LINK_TYPE_POINTOPOINT, 0, oi->output_cost);
  405. links++;
  406.       }
  407.   if (oi->connected->destination != NULL)
  408.     {
  409.       /* Option 1:
  410.  link_type = LSA_LINK_TYPE_STUB;
  411.  link_id = nbr->address.u.prefix4;
  412.  link_data.s_addr = 0xffffffff;
  413.  link_cost = o->output_cost; */
  414.       
  415.       id.s_addr = oi->connected->destination->u.prefix4.s_addr;
  416.       mask.s_addr = 0xffffffff;
  417.       link_info_set (s, id, mask, LSA_LINK_TYPE_STUB, 0, oi->output_cost);
  418.     }
  419.   else
  420.     {
  421.        /* Option 2:  We need to include link to a stub
  422.  network regardless of the state of the neighbor */
  423.       masklen2ip (oi->address->prefixlen, &mask);
  424.       id.s_addr = oi->address->u.prefix4.s_addr & mask.s_addr;
  425.       link_info_set (s, id, mask, LSA_LINK_TYPE_STUB, 0, oi->output_cost);
  426.     }
  427.   links++;
  428.   return links;
  429. }
  430. /* Describe Broadcast Link. */
  431. int
  432. lsa_link_broadcast_set (struct stream *s, struct ospf_interface *oi)
  433. {
  434.   struct ospf_neighbor *dr;
  435.   struct in_addr id, mask;
  436.   /* Describe Type 3 Link. */
  437.   if (oi->state == ISM_Waiting)
  438.     {
  439.       masklen2ip (oi->address->prefixlen, &mask);
  440.       id.s_addr = oi->address->u.prefix4.s_addr & mask.s_addr;
  441.       link_info_set (s, id, mask, LSA_LINK_TYPE_STUB, 0, oi->output_cost);
  442.       return 1;
  443.     }
  444.   dr = ospf_nbr_lookup_by_addr (oi->nbrs, &DR (oi));
  445.   /* Describe Type 2 link. */
  446.   if (dr && (dr->state == NSM_Full ||
  447.      IPV4_ADDR_SAME (&oi->address->u.prefix4, &DR (oi))) &&
  448.       ospf_nbr_count (oi, NSM_Full) > 0)
  449.     {
  450.       link_info_set (s, DR (oi), oi->address->u.prefix4,
  451.      LSA_LINK_TYPE_TRANSIT, 0, oi->output_cost);
  452.     }
  453.   /* Describe type 3 link. */
  454.   else
  455.     {
  456.       masklen2ip (oi->address->prefixlen, &mask);
  457.       id.s_addr = oi->address->u.prefix4.s_addr & mask.s_addr;
  458.       link_info_set (s, id, mask, LSA_LINK_TYPE_STUB, 0, oi->output_cost);
  459.     }
  460.   return 1;
  461. }
  462. int
  463. lsa_link_loopback_set (struct stream *s, struct ospf_interface *oi)
  464. {
  465.   struct in_addr id, mask;
  466.   /* Describe Type 3 Link. */
  467.   if (oi->state != ISM_Loopback)
  468.     return 0;
  469.   mask.s_addr = 0xffffffff;
  470.   id.s_addr = oi->address->u.prefix4.s_addr;
  471.   link_info_set (s, id, mask, LSA_LINK_TYPE_STUB, 0, oi->output_cost);
  472.   return 1;
  473. }
  474. /* Describe Virtual Link. */
  475. int
  476. lsa_link_virtuallink_set (struct stream *s, struct ospf_interface *oi)
  477. {
  478.   struct ospf_neighbor *nbr;
  479.   if (oi->state == ISM_PointToPoint)
  480.     if ((nbr = ospf_nbr_lookup_ptop (oi)))
  481.       if (nbr->state == NSM_Full)
  482. {
  483.   link_info_set (s, nbr->router_id, oi->address->u.prefix4,
  484.  LSA_LINK_TYPE_VIRTUALLINK, 0, oi->output_cost);
  485.   return 1;
  486. }
  487.   return 0;
  488. }
  489. #define lsa_link_nbma_set(S,O)  lsa_link_broadcast_set (S, O)
  490. /* This function add for support point-to-multipoint ,see RFC2328
  491.    12.4.1.4.*/
  492. int
  493. lsa_link_ptomp_set (struct stream *s, struct ospf_interface *oi)
  494. {
  495.   int links = 0;
  496.   struct route_node *rn;
  497.   struct ospf_neighbor *nbr = NULL;
  498.   struct in_addr id, mask;
  499.   mask.s_addr = 0xffffffff;
  500.   id.s_addr = oi->address->u.prefix4.s_addr;
  501.   link_info_set (s, id, mask, LSA_LINK_TYPE_STUB, 0, 0);
  502.   links++;
  503.   zlog_info ("PointToMultipoint: running ptomultip_set");
  504.   /* Search neighbor, */
  505.   for (rn = route_top (oi->nbrs); rn; rn = route_next (rn))
  506.     if ((nbr = rn->info) != NULL)
  507.       /* Ignore myself. */
  508.       if (!IPV4_ADDR_SAME (&nbr->router_id, &oi->ospf->router_id))
  509. if (nbr->state == NSM_Full)
  510.   {
  511.     link_info_set (s, nbr->router_id, oi->address->u.prefix4,
  512.    LSA_LINK_TYPE_POINTOPOINT, 0, oi->output_cost);
  513.     links++;
  514.     zlog_info ("PointToMultipoint: set link to %s",
  515.        inet_ntoa(oi->address->u.prefix4));
  516.   }
  517.   
  518.   return links;
  519. }
  520. /* Set router-LSA link information. */
  521. int
  522. router_lsa_link_set (struct stream *s, struct ospf_area *area)
  523. {
  524.   listnode node;
  525.   int links = 0;
  526.   for (node = listhead (area->oiflist); node; node = nextnode (node))
  527.     {
  528.       struct ospf_interface *oi = node->data;
  529.       struct interface *ifp = oi->ifp;
  530.       /* Check interface is up, OSPF is enable. */
  531.       if (if_is_up (ifp))
  532. {
  533.   if (oi->state != ISM_Down)
  534.     {
  535.       /* Describe each link. */
  536.       switch (oi->type)
  537. {
  538. case OSPF_IFTYPE_POINTOPOINT:
  539.   links += lsa_link_ptop_set (s, oi);
  540.   break;
  541. case OSPF_IFTYPE_BROADCAST:
  542.   links += lsa_link_broadcast_set (s, oi);
  543.   break;
  544. case OSPF_IFTYPE_NBMA:
  545.   links += lsa_link_nbma_set (s, oi);
  546.   break;
  547. case OSPF_IFTYPE_POINTOMULTIPOINT:
  548.   links += lsa_link_ptomp_set (s, oi);
  549.   break;
  550. case OSPF_IFTYPE_VIRTUALLINK:
  551.   links += lsa_link_virtuallink_set (s, oi);
  552.   break;
  553. case OSPF_IFTYPE_LOOPBACK:
  554.   links += lsa_link_loopback_set (s, oi); 
  555. }
  556.     }
  557. }
  558.     }
  559.   return links;
  560. }
  561. /* Set router-LSA body. */
  562. void
  563. ospf_router_lsa_body_set (struct stream *s, struct ospf_area *area)
  564. {
  565.   unsigned long putp;
  566.   u_int16_t cnt;
  567.   /* Set flags. */
  568.   stream_putc (s, router_lsa_flags (area));
  569.   /* Set Zero fields. */
  570.   stream_putc (s, 0);
  571.   /* Keep pointer to # links. */
  572.   putp = s->putp;
  573.   /* Forward word */
  574.   stream_putw(s, 0);
  575.   /* Set all link information. */
  576.   cnt = router_lsa_link_set (s, area);
  577.   /* Set # of links here. */
  578.   stream_putw_at (s, putp, cnt);
  579. }
  580. /* Create new router-LSA. */
  581. struct ospf_lsa *
  582. ospf_router_lsa_new (struct ospf_area *area)
  583. {
  584.   struct ospf *ospf = area->ospf;
  585.   struct stream *s;
  586.   struct lsa_header *lsah;
  587.   struct ospf_lsa *new;
  588.   int length;
  589.   if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
  590.     zlog_info ("LSA[Type1]: Create router-LSA instance");
  591.   /* Create a stream for LSA. */
  592.   s = stream_new (OSPF_MAX_LSA_SIZE);
  593.   lsah = (struct lsa_header *) STREAM_DATA (s);
  594. #ifdef HAVE_NSSA
  595.   /* Set LSA common header fields. */
  596.   lsa_header_set (s, LSA_OPTIONS_GET (area) | LSA_NSSA_GET (area),
  597.   OSPF_ROUTER_LSA, ospf->router_id, ospf->router_id);
  598. #else /* ! HAVE_NSSA */
  599.   /* Set LSA common header fields. */
  600.   lsa_header_set (s, LSA_OPTIONS_GET (area),
  601.   OSPF_ROUTER_LSA, ospf->router_id, ospf->router_id);
  602. #endif /* HAVE_NSSA */
  603.   /* Set router-LSA body fields. */
  604.   ospf_router_lsa_body_set (s, area);
  605.   /* Set length. */
  606.   length = stream_get_endp (s);
  607.   lsah->length = htons (length);
  608.   /* Now, create OSPF LSA instance. */
  609.   new = ospf_lsa_new ();
  610.   new->area = area;
  611.   SET_FLAG (new->flags, OSPF_LSA_SELF);
  612.   /* Copy LSA data to store, discard stream. */
  613.   new->data = ospf_lsa_data_new (length);
  614.   memcpy (new->data, lsah, length);
  615.   stream_free (s);
  616.   return new;
  617. }
  618. /* Originate Router-LSA. */
  619. struct ospf_lsa *
  620. ospf_router_lsa_originate (struct ospf_area *area)
  621. {
  622.   struct ospf_lsa *new;
  623.   /* Create new router-LSA instance. */
  624.   new = ospf_router_lsa_new (area);
  625.   /* Sanity check. */
  626.   if (new->data->adv_router.s_addr == 0)
  627.     {
  628.       if (IS_DEBUG_OSPF_EVENT)
  629. zlog_info ("LSA[Type1]: AdvRouter is 0, discard");
  630.       ospf_lsa_discard (new);
  631.       return NULL;
  632.     }
  633.   /* Install LSA to LSDB. */
  634.   new = ospf_lsa_install (area->ospf, NULL, new);
  635.   /* Update LSA origination count. */
  636.   area->ospf->lsa_originate_count++;
  637.   /* Flooding new LSA through area. */
  638.   ospf_flood_through_area (area, NULL, new);
  639.   if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
  640.     {
  641.       zlog_info ("LSA[Type%d:%s]: Originate router-LSA %p",
  642.  new->data->type, inet_ntoa (new->data->id), new);
  643.       ospf_lsa_header_dump (new->data);
  644.     }
  645.   return new;
  646. }
  647. /* Refresh router-LSA. */
  648. struct ospf_lsa *
  649. ospf_router_lsa_refresh (struct ospf_lsa *lsa)
  650. {
  651.   struct ospf_area *area = lsa->area;
  652.   struct ospf_lsa *new;
  653.   /* Sanity check. */
  654.   assert (lsa->data);
  655.   /* Delete LSA from neighbor retransmit-list. */
  656.   ospf_ls_retransmit_delete_nbr_area (area, lsa);
  657.   /* Create new router-LSA instance. */
  658.   new = ospf_router_lsa_new (area);
  659.   new->data->ls_seqnum = lsa_seqnum_increment (lsa);
  660.   ospf_lsa_install (area->ospf, NULL, new);
  661.   /* Flood LSA through area. */
  662.   ospf_flood_through_area (area, NULL, new);
  663.   /* Debug logging. */
  664.   if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
  665.     {
  666.       zlog_info ("LSA[Type%d:%s]: router-LSA refresh",
  667.  new->data->type, inet_ntoa (new->data->id));
  668.       ospf_lsa_header_dump (new->data);
  669.     }
  670.   return NULL;
  671. }
  672. int
  673. ospf_router_lsa_timer (struct thread *t)
  674. {
  675.   struct ospf_area *area;
  676.   if (IS_DEBUG_OSPF_EVENT)
  677.     zlog_info ("Timer[router-LSA]: (router-LSA Refresh expire)");
  678.   area = THREAD_ARG (t);
  679.   area->t_router_lsa_self = NULL;
  680.   /* Now refresh router-LSA. */
  681.   if (area->router_lsa_self)
  682.     ospf_router_lsa_refresh (area->router_lsa_self);
  683.   /* Newly originate router-LSA. */
  684.   else
  685.     ospf_router_lsa_originate (area);
  686.   return 0;
  687. }
  688. void
  689. ospf_router_lsa_timer_add (struct ospf_area *area)
  690. {
  691.   /* Keep area's self-originated router-LSA. */
  692.   struct ospf_lsa *lsa = area->router_lsa_self;
  693.   /* Cancel previously scheduled router-LSA timer. */
  694.   if (area->t_router_lsa_self)
  695.     if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
  696.       zlog_info ("LSA[Type1]: Cancel previous router-LSA timer");
  697.   OSPF_TIMER_OFF (area->t_router_lsa_self);
  698.   /* If router-LSA is originated previously, check the interval time. */
  699.   if (lsa)
  700.     {
  701.       int delay;
  702.       if ((delay = ospf_lsa_refresh_delay (lsa)) > 0)
  703.         {
  704.   OSPF_AREA_TIMER_ON (area->t_router_lsa_self,
  705.       ospf_router_lsa_timer, delay);
  706.   return;
  707.         }
  708.     }
  709.   if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
  710.     zlog_info ("LSA[Type1]: Scheduling router-LSA origination right away");
  711.   /* Immediately refresh router-LSA. */
  712.   OSPF_AREA_TIMER_ON (area->t_router_lsa_self, ospf_router_lsa_timer, 0);
  713. }
  714. int
  715. ospf_router_lsa_update_timer (struct thread *thread)
  716. {
  717.   struct ospf *ospf = THREAD_ARG (thread);
  718.   listnode node;
  719.   if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
  720.     zlog_info ("Timer[router-LSA Update]: (timer expire)");
  721.   ospf->t_router_lsa_update = NULL;
  722.   for (node = listhead (ospf->areas); node; nextnode (node))
  723.     {
  724.       struct ospf_area *area = getdata (node);
  725.       struct ospf_lsa *lsa = area->router_lsa_self;
  726.       struct router_lsa *rl;
  727.       char *area_str;
  728.       /* Keep Area ID string. */
  729.       area_str = AREA_NAME (area);
  730.       /* If LSA not exist in this Area, originate new. */
  731.       if (lsa == NULL)
  732.         {
  733.   if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
  734.     zlog_info("LSA[Type1]: Create router-LSA for Area %s", area_str);
  735.   ospf_router_lsa_originate (area);
  736.         }
  737.       /* If router-ID is changed, Link ID must change.
  738.  First flush old LSA, then originate new. */
  739.       else if (!IPV4_ADDR_SAME (&lsa->data->id, &ospf->router_id))
  740. {
  741.   if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
  742.     zlog_info("LSA[Type%d:%s]: Refresh router-LSA for Area %s",
  743.       lsa->data->type, inet_ntoa (lsa->data->id), area_str);
  744.   ospf_lsa_flush_area (lsa, area);
  745.   ospf_lsa_unlock (area->router_lsa_self);
  746.   area->router_lsa_self = NULL;
  747.   /* Refresh router-LSA, (not install) and flood through area. */
  748.   ospf_router_lsa_timer_add (area);
  749. }
  750.       else
  751. {
  752.   rl = (struct router_lsa *) lsa->data;
  753.   /* Refresh router-LSA, (not install) and flood through area. */
  754.   if (rl->flags != ospf->flags)
  755.     ospf_router_lsa_timer_add (area);
  756. }
  757.     }
  758.   return 0;
  759. }
  760. /* network-LSA related functions. */
  761. /* Originate Network-LSA. */
  762. void
  763. ospf_network_lsa_body_set (struct stream *s, struct ospf_interface *oi)
  764. {
  765.   struct in_addr mask;
  766.   struct route_node *rn;
  767.   struct ospf_neighbor *nbr;
  768.   masklen2ip (oi->address->prefixlen, &mask);
  769.   stream_put_ipv4 (s, mask.s_addr);
  770.   /* The network-LSA lists those routers that are fully adjacent to
  771.     the Designated Router; each fully adjacent router is identified by
  772.     its OSPF Router ID.  The Designated Router includes itself in this
  773.     list. RFC2328, Section 12.4.2 */
  774.   for (rn = route_top (oi->nbrs); rn; rn = route_next (rn))
  775.     if ((nbr = rn->info) != NULL)
  776.       if (nbr->state == NSM_Full || nbr == oi->nbr_self)
  777. stream_put_ipv4 (s, nbr->router_id.s_addr);
  778. }
  779. struct ospf_lsa *
  780. ospf_network_lsa_new (struct ospf_interface *oi)
  781. {
  782.   struct stream *s;
  783.   struct ospf_lsa *new;
  784.   struct lsa_header *lsah;
  785.   int length;
  786.   /* If there are no neighbours on this network (the net is stub),
  787.      the router does not originate network-LSA (see RFC 12.4.2) */
  788.   if (oi->full_nbrs == 0)
  789.     return NULL;
  790.   
  791.   if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
  792.     zlog_info ("LSA[Type2]: Create network-LSA instance");
  793.   /* Create new stream for LSA. */
  794.   s = stream_new (OSPF_MAX_LSA_SIZE);
  795.   lsah = (struct lsa_header *) STREAM_DATA (s);
  796.   lsa_header_set (s, (OPTIONS (oi) | LSA_OPTIONS_GET (oi->area)),
  797.   OSPF_NETWORK_LSA, DR (oi), oi->ospf->router_id);
  798.   /* Set network-LSA body fields. */
  799.   ospf_network_lsa_body_set (s, oi);
  800.   /* Set length. */
  801.   length = stream_get_endp (s);
  802.   lsah->length = htons (length);
  803.   /* Create OSPF LSA instance. */
  804.   new = ospf_lsa_new ();
  805.   new->area = oi->area;
  806.   SET_FLAG (new->flags, OSPF_LSA_SELF);
  807.   /* Copy LSA to store. */
  808.   new->data = ospf_lsa_data_new (length);
  809.   memcpy (new->data, lsah, length);
  810.   stream_free (s);
  811.   return new;
  812. }
  813. /* Originate network-LSA. */
  814. struct ospf_lsa *
  815. ospf_network_lsa_originate (struct ospf_interface *oi)
  816. {
  817.   struct ospf_lsa *new;
  818.   /* Create new network-LSA instance. */
  819.   new = ospf_network_lsa_new (oi);
  820.   if (new == NULL)
  821.     return NULL;
  822.   /* Install LSA to LSDB. */
  823.   new = ospf_lsa_install (oi->ospf, oi, new);
  824.   /* Update LSA origination count. */
  825.   oi->ospf->lsa_originate_count++;
  826.   /* Flooding new LSA through area. */
  827.   ospf_flood_through_area (oi->area, NULL, new);
  828.   if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
  829.     {
  830.       zlog_info ("LSA[Type%d:%s]: Originate network-LSA %p",
  831.  new->data->type, inet_ntoa (new->data->id), new);
  832.       ospf_lsa_header_dump (new->data);
  833.     }
  834.   return new;
  835. }
  836. int
  837. ospf_network_lsa_refresh (struct ospf_lsa *lsa, struct ospf_interface *oi)
  838. {
  839.   struct ospf_area *area = lsa->area;
  840.   struct ospf_lsa *new;
  841.   assert (lsa->data);
  842.   /* Delete LSA from neighbor retransmit-list. */
  843.   ospf_ls_retransmit_delete_nbr_area (area, lsa);
  844.   /* Create new network-LSA instance. */
  845.   new = ospf_network_lsa_new (oi);
  846.   if (new == NULL)
  847.     return -1;
  848.   new->data->ls_seqnum = lsa_seqnum_increment (lsa);
  849.   ospf_lsa_install (area->ospf, oi, new);
  850.   /* Flood LSA through aera. */
  851.   ospf_flood_through_area (area, NULL, new);
  852.   if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
  853.     {
  854.       zlog_info ("LSA[Type%d:%s]: network-LSA refresh",
  855.  new->data->type, inet_ntoa (new->data->id));
  856.       ospf_lsa_header_dump (new->data);
  857.     }
  858.   return 0;
  859. }
  860. int
  861. ospf_network_lsa_refresh_timer (struct thread *t)
  862. {
  863.   struct ospf_interface *oi;
  864.   oi = THREAD_ARG (t);
  865.   oi->t_network_lsa_self = NULL;
  866.   if (oi->network_lsa_self)
  867.     /* Now refresh network-LSA. */
  868.     ospf_network_lsa_refresh (oi->network_lsa_self, oi);
  869.   else
  870.     /* Newly create network-LSA. */
  871.     ospf_network_lsa_originate (oi);
  872.   return 0;
  873. }
  874. void
  875. ospf_network_lsa_timer_add (struct ospf_interface *oi)
  876. {
  877.   /* Keep interface's self-originated network-LSA. */
  878.   struct ospf_lsa *lsa = oi->network_lsa_self;
  879.   /* Cancel previously schedules network-LSA timer. */
  880.   if (oi->t_network_lsa_self)
  881.     if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
  882.       zlog_info ("LSA[Type2]: Cancel previous network-LSA timer");
  883.   OSPF_TIMER_OFF (oi->t_network_lsa_self);
  884.   /* If network-LSA is originated previously, check the interval time. */
  885.   if (lsa)
  886.     {
  887.       int delay;
  888.       if ((delay = ospf_lsa_refresh_delay (lsa)) > 0)
  889.         {
  890.           oi->t_network_lsa_self =
  891.             thread_add_timer (master, ospf_network_lsa_refresh_timer,
  892.       oi, delay);
  893.           return;
  894.         }
  895.     }
  896.   if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
  897.     zlog_info ("Scheduling network-LSA origination right away");
  898.   /* Immediately refresh network-LSA. */
  899.   oi->t_network_lsa_self =
  900.     thread_add_event (master, ospf_network_lsa_refresh_timer, oi, 0);
  901. }
  902. void
  903. stream_put_ospf_metric (struct stream *s, u_int32_t metric_value)
  904. {
  905.   u_int32_t metric;
  906.   char *mp;
  907.   /* Put 0 metric. TOS metric is not supported. */
  908.   metric = htonl (metric_value);
  909.   mp = (char *) &metric;
  910.   mp++;
  911.   stream_put (s, mp, 3);
  912. }
  913. /* summary-LSA related functions. */
  914. void
  915. ospf_summary_lsa_body_set (struct stream *s, struct prefix *p,
  916.    u_int32_t metric)
  917. {
  918.   struct in_addr mask;
  919.   masklen2ip (p->prefixlen, &mask);
  920.   /* Put Network Mask. */
  921.   stream_put_ipv4 (s, mask.s_addr);
  922.   /* Set # TOS. */
  923.   stream_putc (s, (u_char) 0);
  924.   /* Set metric. */
  925.   stream_put_ospf_metric (s, metric);
  926. }
  927. struct ospf_lsa *
  928. ospf_summary_lsa_new (struct ospf_area *area, struct prefix *p,
  929.       u_int32_t metric, struct in_addr id)
  930. {
  931.   struct stream *s;
  932.   struct ospf_lsa *new;
  933.   struct lsa_header *lsah;
  934.   int length;
  935.   if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
  936.     zlog_info ("LSA[Type3]: Create summary-LSA instance");
  937.   /* Create new stream for LSA. */
  938.   s = stream_new (OSPF_MAX_LSA_SIZE);
  939.   lsah = (struct lsa_header *) STREAM_DATA (s);
  940.   lsa_header_set (s, LSA_OPTIONS_GET (area), OSPF_SUMMARY_LSA,
  941.   id, area->ospf->router_id);
  942.   /* Set summary-LSA body fields. */
  943.   ospf_summary_lsa_body_set (s, p, metric);
  944.   /* Set length. */
  945.   length = stream_get_endp (s);
  946.   lsah->length = htons (length);
  947.   /* Create OSPF LSA instance. */
  948.   new = ospf_lsa_new ();
  949.   new->area = area;
  950.   SET_FLAG (new->flags, OSPF_LSA_SELF);
  951.   /* Copy LSA to store. */
  952.   new->data = ospf_lsa_data_new (length);
  953.   memcpy (new->data, lsah, length);
  954.   stream_free (s);
  955.   return new;
  956. }
  957. /* Originate Summary-LSA. */
  958. struct ospf_lsa *
  959. ospf_summary_lsa_originate (struct prefix_ipv4 *p, u_int32_t metric, 
  960.     struct ospf_area *area)
  961. {
  962.   struct ospf_lsa *new;
  963.   struct in_addr id;
  964.   
  965.   id = ospf_lsa_unique_id (area->ospf, area->lsdb, OSPF_SUMMARY_LSA, p);
  966.   /* Create new summary-LSA instance. */
  967.   new = ospf_summary_lsa_new (area, (struct prefix *) p, metric, id);
  968.   /* Instlal LSA to LSDB. */
  969.   new = ospf_lsa_install (area->ospf, NULL, new);
  970.   /* Update LSA origination count. */
  971.   area->ospf->lsa_originate_count++;
  972.   /* Flooding new LSA through area. */
  973.   ospf_flood_through_area (area, NULL, new);
  974.   if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
  975.     {
  976.       zlog_info ("LSA[Type%d:%s]: Originate summary-LSA %p",
  977.  new->data->type, inet_ntoa (new->data->id), new);
  978.       ospf_lsa_header_dump (new->data);
  979.     }
  980.   return new;
  981. }
  982. struct ospf_lsa*
  983. ospf_summary_lsa_refresh (struct ospf *ospf, struct ospf_lsa *lsa)
  984. {
  985.   struct ospf_lsa *new;
  986.   struct summary_lsa *sl;
  987.   struct prefix p;
  988.   
  989.   /* Sanity check. */
  990.   assert (lsa->data);
  991.   sl = (struct summary_lsa *)lsa->data;
  992.   p.prefixlen = ip_masklen (sl->mask);
  993.   new = ospf_summary_lsa_new (lsa->area, &p, GET_METRIC (sl->metric),
  994.       sl->header.id);
  995.   new->data->ls_seqnum = lsa_seqnum_increment (lsa);
  996.   
  997.   /* Re-calculate checksum. */
  998.   ospf_lsa_checksum (new->data);
  999.   ospf_lsa_install (ospf, NULL, new);
  1000.   
  1001.   /* Flood LSA through AS. */
  1002.   ospf_flood_through_area (new->area, NULL, new);
  1003.   /* Debug logging. */
  1004.   if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
  1005.     {
  1006.       zlog_info ("LSA[Type%d:%s]: summary-LSA refresh",
  1007.  new->data->type, inet_ntoa (new->data->id));
  1008.       ospf_lsa_header_dump (new->data);
  1009.     }
  1010.   
  1011.   return new;
  1012. }
  1013. /* summary-ASBR-LSA related functions. */
  1014. void
  1015. ospf_summary_asbr_lsa_body_set (struct stream *s, struct prefix *p,
  1016. u_int32_t metric)
  1017. {
  1018.   struct in_addr mask;
  1019.   masklen2ip (p->prefixlen, &mask);
  1020.   /* Put Network Mask. */
  1021.   stream_put_ipv4 (s, mask.s_addr);
  1022.   /* Set # TOS. */
  1023.   stream_putc (s, (u_char) 0);
  1024.   /* Set metric. */
  1025.   stream_put_ospf_metric (s, metric);
  1026. }
  1027. struct ospf_lsa *
  1028. ospf_summary_asbr_lsa_new (struct ospf_area *area, struct prefix *p,
  1029.    u_int32_t metric, struct in_addr id)
  1030. {
  1031.   struct stream *s;
  1032.   struct ospf_lsa *new;
  1033.   struct lsa_header *lsah;
  1034.   int length;
  1035.   if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
  1036.     zlog_info ("LSA[Type3]: Create summary-LSA instance");
  1037.   /* Create new stream for LSA. */
  1038.   s = stream_new (OSPF_MAX_LSA_SIZE);
  1039.   lsah = (struct lsa_header *) STREAM_DATA (s);
  1040.   lsa_header_set (s, LSA_OPTIONS_GET (area), OSPF_ASBR_SUMMARY_LSA,
  1041.   id, area->ospf->router_id);
  1042.   /* Set summary-LSA body fields. */
  1043.   ospf_summary_asbr_lsa_body_set (s, p, metric);
  1044.   /* Set length. */
  1045.   length = stream_get_endp (s);
  1046.   lsah->length = htons (length);
  1047.   /* Create OSPF LSA instance. */
  1048.   new = ospf_lsa_new ();
  1049.   new->area = area;
  1050.   SET_FLAG (new->flags, OSPF_LSA_SELF);
  1051.   /* Copy LSA to store. */
  1052.   new->data = ospf_lsa_data_new (length);
  1053.   memcpy (new->data, lsah, length);
  1054.   stream_free (s);
  1055.   return new;
  1056. }
  1057. /* Originate summary-ASBR-LSA. */
  1058. struct ospf_lsa *
  1059. ospf_summary_asbr_lsa_originate (struct prefix_ipv4 *p, u_int32_t metric, 
  1060.  struct ospf_area *area)
  1061. {
  1062.   struct ospf_lsa *new;
  1063.   struct in_addr id;
  1064.   
  1065.   id = ospf_lsa_unique_id (area->ospf, area->lsdb, OSPF_ASBR_SUMMARY_LSA, p);
  1066.   /* Create new summary-LSA instance. */
  1067.   new = ospf_summary_asbr_lsa_new (area, (struct prefix *) p, metric, id);
  1068.   /* Install LSA to LSDB. */
  1069.   new = ospf_lsa_install (area->ospf, NULL, new);
  1070.   
  1071.   /* Update LSA origination count. */
  1072.   area->ospf->lsa_originate_count++;
  1073.   /* Flooding new LSA through area. */
  1074.   ospf_flood_through_area (area, NULL, new);
  1075.   if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
  1076.     {
  1077.       zlog_info ("LSA[Type%d:%s]: Originate summary-ASBR-LSA %p",
  1078.  new->data->type, inet_ntoa (new->data->id), new);
  1079.       ospf_lsa_header_dump (new->data);
  1080.     }
  1081.   return new;
  1082. }
  1083. struct ospf_lsa*
  1084. ospf_summary_asbr_lsa_refresh (struct ospf *ospf, struct ospf_lsa *lsa)
  1085. {
  1086.   struct ospf_lsa *new;
  1087.   struct summary_lsa *sl;
  1088.   struct prefix p;
  1089.   /* Sanity check. */
  1090.   assert (lsa->data);
  1091.   sl = (struct summary_lsa *)lsa->data;
  1092.   p.prefixlen = ip_masklen (sl->mask);
  1093.   new = ospf_summary_asbr_lsa_new (lsa->area, &p, GET_METRIC (sl->metric),
  1094.    sl->header.id);
  1095.   
  1096.   new->data->ls_seqnum = lsa_seqnum_increment (lsa);
  1097.   
  1098.   /* Re-calculate checksum. */
  1099.   ospf_lsa_checksum (new->data);
  1100.   ospf_lsa_install (ospf, NULL, new);
  1101.   
  1102.   /* Flood LSA through area. */
  1103.   ospf_flood_through_area (new->area, NULL, new);
  1104.   if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
  1105.     {
  1106.       zlog_info ("LSA[Type%d:%s]: summary-ASBR-LSA refresh",
  1107.  new->data->type, inet_ntoa (new->data->id));
  1108.       ospf_lsa_header_dump (new->data);
  1109.     }
  1110.   return new;
  1111. }
  1112. /* AS-external-LSA related functions. */
  1113. /* Get nexthop for AS-external-LSAs.  Return nexthop if its interface
  1114.    is connected, else 0*/
  1115. struct in_addr
  1116. ospf_external_lsa_nexthop_get (struct ospf *ospf, struct in_addr nexthop)
  1117. {
  1118.   struct in_addr fwd;
  1119.   struct prefix nh;
  1120.   listnode n1;
  1121.   fwd.s_addr = 0;
  1122.   if (!nexthop.s_addr)
  1123.     return fwd;
  1124.   /* Check whether nexthop is covered by OSPF network. */
  1125.   nh.family = AF_INET;
  1126.   nh.u.prefix4 = nexthop;
  1127.   nh.prefixlen = IPV4_MAX_BITLEN;
  1128.   for (n1 = listhead (ospf->oiflist); n1; nextnode (n1))
  1129.     {
  1130.       struct ospf_interface *oi = getdata (n1);
  1131.       if (if_is_up (oi->ifp))
  1132. if (oi->address->family == AF_INET)
  1133.   if (prefix_match (oi->address, &nh))
  1134.     return nexthop;
  1135.     }
  1136.   return fwd;
  1137. }
  1138. #ifdef HAVE_NSSA
  1139. /* NSSA-external-LSA related functions. */
  1140. /* Get 1st IP connection for Forward Addr */
  1141.           
  1142. struct in_addr
  1143. ospf_get_ip_from_ifp (struct ospf_interface *oi)
  1144. {
  1145.   struct in_addr fwd;
  1146.   fwd.s_addr = 0;
  1147.   if (if_is_up (oi->ifp))
  1148.     return oi->address->u.prefix4;
  1149.   
  1150.   return fwd;
  1151. }
  1152. /* Get 1st IP connection for Forward Addr */
  1153. struct in_addr
  1154. ospf_get_nssa_ip (struct ospf_area *area)
  1155. {
  1156.   struct in_addr fwd;
  1157.   struct in_addr best_default;
  1158.   listnode n1;
  1159.   fwd.s_addr = 0;
  1160.   best_default.s_addr = 0;
  1161.   for (n1 = listhead (area->ospf->oiflist); n1; nextnode (n1))
  1162.     {
  1163.       struct ospf_interface *oi = getdata (n1);
  1164.       if (if_is_up (oi->ifp))
  1165. if (oi->area->external_routing == OSPF_AREA_NSSA)
  1166.   if (oi->address && oi->address->family == AF_INET)
  1167.     {
  1168.       if (best_default.s_addr == 0)
  1169. best_default = oi->address->u.prefix4;
  1170.       if (oi->area == area)
  1171. return oi->address->u.prefix4;
  1172.     }
  1173.     }
  1174.   if (best_default.s_addr != 0)
  1175.     return best_default;
  1176.   return fwd;
  1177. }
  1178. #endif /* HAVE_NSSA */
  1179. #define DEFAULT_DEFAULT_METRIC              20
  1180. #define DEFAULT_DEFAULT_ORIGINATE_METRIC     10
  1181. #define DEFAULT_DEFAULT_ALWAYS_METRIC       1
  1182. #define DEFAULT_METRIC_TYPE      EXTERNAL_METRIC_TYPE_2
  1183. int
  1184. metric_type (struct ospf *ospf, u_char src)
  1185. {
  1186.   return (ospf->dmetric[src].type < 0 ?
  1187.   DEFAULT_METRIC_TYPE : ospf->dmetric[src].type);
  1188. }
  1189. int
  1190. metric_value (struct ospf *ospf, u_char src)
  1191. {
  1192.   if (ospf->dmetric[src].value < 0)
  1193.     {
  1194.       if (src == DEFAULT_ROUTE)
  1195. {
  1196.   if (ospf->default_originate == DEFAULT_ORIGINATE_ZEBRA)
  1197.     return DEFAULT_DEFAULT_ORIGINATE_METRIC;
  1198.   else
  1199.     return DEFAULT_DEFAULT_ALWAYS_METRIC;
  1200. }
  1201.       else if (ospf->default_metric < 0)
  1202. return DEFAULT_DEFAULT_METRIC;
  1203.       else
  1204. return ospf->default_metric;
  1205.     }
  1206.   return ospf->dmetric[src].value;
  1207. }
  1208. /* Set AS-external-LSA body. */
  1209. void
  1210. ospf_external_lsa_body_set (struct stream *s, struct external_info *ei,
  1211.     struct ospf *ospf)
  1212. {
  1213.   struct prefix_ipv4 *p = &ei->p;
  1214.   struct in_addr mask, fwd_addr;
  1215.   u_int32_t mvalue;
  1216.   int mtype;
  1217.   int type;
  1218.   /* Put Network Mask. */
  1219.   masklen2ip (p->prefixlen, &mask);
  1220.   stream_put_ipv4 (s, mask.s_addr);
  1221.   /* If prefix is default, specify DEFAULT_ROUTE. */
  1222.   type = is_prefix_default (&ei->p) ? DEFAULT_ROUTE : ei->type;
  1223.   
  1224.   mtype = (ROUTEMAP_METRIC_TYPE (ei) != -1) ?
  1225.     ROUTEMAP_METRIC_TYPE (ei) : metric_type (ospf, type);
  1226.   mvalue = (ROUTEMAP_METRIC (ei) != -1) ?
  1227.     ROUTEMAP_METRIC (ei) : metric_value (ospf, type);
  1228.   /* Put type of external metric. */
  1229.   stream_putc (s, (mtype == EXTERNAL_METRIC_TYPE_2 ? 0x80 : 0));
  1230.   /* Put 0 metric. TOS metric is not supported. */
  1231.   stream_put_ospf_metric (s, mvalue);
  1232.   
  1233.   /* Get forwarding address to nexthop if on the Connection List, else 0. */
  1234.   fwd_addr = ospf_external_lsa_nexthop_get (ospf, ei->nexthop);
  1235.   /* Put forwarding address. */
  1236.   stream_put_ipv4 (s, fwd_addr.s_addr);
  1237.   
  1238.   /* Put route tag -- This value should be introduced from configuration. */
  1239.   stream_putl (s, 0);
  1240. }
  1241. /* Create new external-LSA. */
  1242. struct ospf_lsa *
  1243. ospf_external_lsa_new (struct ospf *ospf,
  1244.        struct external_info *ei, struct in_addr *old_id)
  1245. {
  1246.   struct stream *s;
  1247.   struct lsa_header *lsah;
  1248.   struct ospf_lsa *new;
  1249.   struct in_addr id;
  1250.   int length;
  1251.   if (ei == NULL)
  1252.     {
  1253.       if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
  1254. zlog_warn ("LSA[Type5]: External info is NULL, could not originated");
  1255.       return NULL;
  1256.     }
  1257.   if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
  1258.     zlog_info ("LSA[Type5]: Originate AS-external-LSA instance");
  1259.   /* If old Link State ID is specified, refresh LSA with same ID. */
  1260.   if (old_id)
  1261.     id = *old_id;
  1262.   /* Get Link State with unique ID. */
  1263.   else
  1264.     {
  1265.       id = ospf_lsa_unique_id (ospf, ospf->lsdb, OSPF_AS_EXTERNAL_LSA, &ei->p);
  1266.       if (id.s_addr == 0xffffffff)
  1267. {
  1268.   /* Maybe Link State ID not available. */
  1269.   if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
  1270.     zlog_info ("LSA[Type5]: Link ID not available, can't originate");
  1271.   return NULL;
  1272. }
  1273.     }
  1274.   /* Create new stream for LSA. */
  1275.   s = stream_new (OSPF_MAX_LSA_SIZE);
  1276.   lsah = (struct lsa_header *) STREAM_DATA (s);
  1277.   /* Set LSA common header fields. */
  1278.   lsa_header_set (s, OSPF_OPTION_E, OSPF_AS_EXTERNAL_LSA,
  1279.   id, ospf->router_id);
  1280.   /* Set AS-external-LSA body fields. */
  1281.   ospf_external_lsa_body_set (s, ei, ospf);
  1282.   /* Set length. */
  1283.   length = stream_get_endp (s);
  1284.   lsah->length = htons (length);
  1285.   /* Now, create OSPF LSA instance. */
  1286.   new = ospf_lsa_new ();
  1287.   new->area = NULL;
  1288.   SET_FLAG (new->flags, OSPF_LSA_SELF|OSPF_LSA_APPROVED);
  1289.   /* Copy LSA data to store, discard stream. */
  1290.   new->data = ospf_lsa_data_new (length);
  1291.   memcpy (new->data, lsah, length);
  1292.   stream_free (s);
  1293.   return new;
  1294. }
  1295. #ifdef HAVE_NSSA
  1296. /* As Type-7 */
  1297. void
  1298. ospf_install_flood_nssa (struct ospf *ospf, 
  1299.  struct ospf_lsa *lsa, struct external_info *ei)
  1300. {
  1301.   struct ospf_lsa *new2;
  1302.   struct as_external_lsa *extlsa;
  1303.   listnode node;
  1304.   /* NSSA Originate or Refresh (If anyNSSA)
  1305.   LSA is self-originated. And just installed as Type-5.
  1306.   Additionally, install as Type-7 LSDB for every attached NSSA.
  1307.   P-Bit controls which ABR performs translation to outside world; If
  1308.   we are an ABR....do not set the P-bit, because we send the Type-5,
  1309.   not as the ABR Translator, but as the ASBR owner within the AS!
  1310.   If we are NOT ABR, Flood through NSSA as Type-7 w/P-bit set.  The
  1311.   elected ABR Translator will see the P-bit, Translate, and re-flood.
  1312.   Later, ABR_TASK and P-bit will scan Type-7 LSDB and translate to
  1313.   Type-5's to non-NSSA Areas.  (it will also attempt a re-install) */
  1314.   for (node = listhead (ospf->areas); node; nextnode (node))
  1315.     {
  1316.       struct ospf_area *area = getdata (node);
  1317.       /* make lsa duplicate, lock=1 */
  1318.       new2 = ospf_lsa_dup (lsa);
  1319.       new2->area = area;
  1320.       new2->data->type = OSPF_AS_NSSA_LSA;
  1321.       /* set P-bit if not ABR */
  1322.       if (! IS_OSPF_ABR (ospf))
  1323.         {
  1324.   SET_FLAG(new2->data->options, OSPF_OPTION_NP);
  1325.        
  1326.   /* set non-zero FWD ADDR
  1327.        
  1328.   draft-ietf-ospf-nssa-update-09.txt
  1329.        
  1330.   if the network between the NSSA AS boundary router and the
  1331.   adjacent AS is advertised into OSPF as an internal OSPF route,
  1332.   the forwarding address should be the next op address as is cu
  1333.   currently done with type-5 LSAs.  If the intervening network is
  1334.   not adversited into OSPF as an internal OSPF route and the
  1335.   type-7 LSA's P-bit is set a forwarding address should be
  1336.   selected from one of the router's active OSPF inteface addresses
  1337.   which belong to the NSSA.  If no such addresses exist, then
  1338.   no type-7 LSA's with the P-bit set should originate from this
  1339.   router.   */
  1340.        
  1341.   /* kevinm: not updating lsa anymore, just new2 */
  1342.   extlsa = (struct as_external_lsa *)(new2->data);
  1343.        
  1344.   if (extlsa->e[0].fwd_addr.s_addr == 0)
  1345.     extlsa->e[0].fwd_addr = ospf_get_nssa_ip(area); /* this NSSA area in ifp */
  1346.   if (extlsa->e[0].fwd_addr.s_addr == 0) 
  1347.   {
  1348.     if (IS_DEBUG_OSPF_NSSA)
  1349.       zlog_info ("LSA[Type-7]: Could not build FWD-ADDR");
  1350.     ospf_lsa_discard(new2);
  1351.     return;
  1352.   }
  1353. }
  1354.       /* Re-calculate checksum. */
  1355.       ospf_lsa_checksum (new2->data);
  1356.       /* install also as Type-7 */
  1357.       ospf_lsa_install (ospf, NULL, new2);   /* Remove Old, Lock New = 2 */
  1358.       /* will send each copy, lock=2+n */
  1359.       ospf_flood_through_as (ospf, NULL, new2); /* all attached NSSA's, no AS/STUBs */
  1360.     }
  1361. }
  1362. #endif /* HAVE_NSSA */
  1363. int
  1364. is_prefix_default (struct prefix_ipv4 *p)
  1365. {
  1366.   struct prefix_ipv4 q;
  1367.   q.family = AF_INET;
  1368.   q.prefix.s_addr = 0;
  1369.   q.prefixlen = 0;
  1370.   return prefix_same ((struct prefix *) p, (struct prefix *) &q);
  1371. }
  1372. /* Originate an AS-external-LSA, install and flood. */
  1373. struct ospf_lsa *
  1374. ospf_external_lsa_originate (struct ospf *ospf, struct external_info *ei)
  1375. {
  1376.   struct ospf_lsa *new;
  1377.   /* Added for NSSA project....
  1378.        External LSAs are originated in ASBRs as usual, but for NSSA systems.
  1379.      there is the global Type-5 LSDB and a Type-7 LSDB installed for
  1380.      every area.  The Type-7's are flooded to every IR and every ABR; We
  1381.      install the Type-5 LSDB so that the normal "refresh" code operates
  1382.      as usual, and flag them as not used during ASE calculations.  The
  1383.      Type-7 LSDB is used for calculations.  Each Type-7 has a Forwarding
  1384.      Address of non-zero.
  1385.      If an ABR is the elected NSSA translator, following SPF and during
  1386.      the ABR task it will translate all the scanned Type-7's, with P-bit
  1387.      ON and not-self generated, and translate to Type-5's throughout the
  1388.      non-NSSA/STUB AS.
  1389.      A difference in operation depends whether this ASBR is an ABR
  1390.      or not.  If not an ABR, the P-bit is ON, to indicate that any
  1391.      elected NSSA-ABR can perform its translation.
  1392.      If an ABR, the P-bit is OFF;  No ABR will perform translation and
  1393.      this ASBR will flood the Type-5 LSA as usual.
  1394.      For the case where this ASBR is not an ABR, the ASE calculations
  1395.      are based on the Type-5 LSDB;  The Type-7 LSDB exists just to
  1396.      demonstrate to the user that there are LSA's that belong to any
  1397.      attached NSSA.
  1398.      Finally, it just so happens that when the ABR is translating every
  1399.      Type-7 into Type-5, it installs it into the Type-5 LSDB as an
  1400.      approved Type-5 (translated from Type-7);  at the end of translation
  1401.      if any Translated Type-5's remain unapproved, then they must be
  1402.      flushed from the AS.
  1403.      */
  1404.   
  1405.   /* Check the AS-external-LSA should be originated. */
  1406.   if (!ospf_redistribute_check (ospf, ei, NULL))
  1407.     return NULL;
  1408.   
  1409.   /* Create new AS-external-LSA instance. */
  1410.   if ((new = ospf_external_lsa_new (ospf, ei, NULL)) == NULL)
  1411.     {
  1412.       if (IS_DEBUG_OSPF_EVENT)
  1413. zlog_info ("LSA[Type5:%s]: Could not originate AS-external-LSA",
  1414.    inet_ntoa (ei->p.prefix));
  1415.       return NULL;
  1416.     }
  1417.   /* Install newly created LSA into Type-5 LSDB, lock = 1. */
  1418.   ospf_lsa_install (ospf, NULL, new);
  1419.   /* Update LSA origination count. */
  1420.   ospf->lsa_originate_count++;
  1421.   /* Flooding new LSA. only to AS (non-NSSA/STUB) */
  1422.   ospf_flood_through_as (ospf, NULL, new);
  1423. #ifdef HAVE_NSSA
  1424.   /* If there is any attached NSSA, do special handling */
  1425.   if (ospf->anyNSSA)
  1426.     ospf_install_flood_nssa (ospf, new, ei); /* Install/Flood Type-7 to all NSSAs */
  1427. #endif /* HAVE_NSSA */
  1428.   /* Debug logging. */
  1429.   if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
  1430.     {
  1431.       zlog_info ("LSA[Type%d:%s]: Originate AS-external-LSA %p",
  1432.  new->data->type, inet_ntoa (new->data->id), new);
  1433.       ospf_lsa_header_dump (new->data);
  1434.     }
  1435.   return new;
  1436. }
  1437. /* Originate AS-external-LSA from external info with initial flag. */
  1438. int
  1439. ospf_external_lsa_originate_timer (struct thread *thread)
  1440. {
  1441.   struct ospf *ospf = THREAD_ARG (thread);
  1442.   struct route_node *rn;
  1443.   struct external_info *ei;
  1444.   struct route_table *rt;
  1445.   int type = THREAD_VAL (thread);
  1446.   ospf->t_external_lsa = NULL;
  1447.   /* Originate As-external-LSA from all type of distribute source. */
  1448.   if ((rt = EXTERNAL_INFO (type)))
  1449.     for (rn = route_top (rt); rn; rn = route_next (rn))
  1450.       if ((ei = rn->info) != NULL)
  1451. if (!is_prefix_default ((struct prefix_ipv4 *)&ei->p))
  1452.   if (!ospf_external_lsa_originate (ospf, ei))
  1453.     zlog_warn ("LSA: AS-external-LSA was not originated.");
  1454.   
  1455.   return 0;
  1456. }
  1457. struct external_info *
  1458. ospf_default_external_info (struct ospf *ospf)
  1459. {
  1460.   int type;
  1461.   struct route_node *rn;
  1462.   struct prefix_ipv4 p;
  1463.   
  1464.   p.family = AF_INET;
  1465.   p.prefix.s_addr = 0;
  1466.   p.prefixlen = 0;
  1467.   /* First, lookup redistributed default route. */
  1468.   for (type = 0; type <= ZEBRA_ROUTE_MAX; type++)
  1469.     if (EXTERNAL_INFO (type) && type != ZEBRA_ROUTE_OSPF)
  1470.       {
  1471. rn = route_node_lookup (EXTERNAL_INFO (type), (struct prefix *) &p);
  1472. if (rn != NULL)
  1473.   {
  1474.     route_unlock_node (rn);
  1475.     assert (rn->info);
  1476.     if (ospf_redistribute_check (ospf, rn->info, NULL))
  1477.       return rn->info;
  1478.   }
  1479.       }
  1480.   return NULL;
  1481. }
  1482. int
  1483. ospf_default_originate_timer (struct thread *thread)
  1484. {
  1485.   int *origin;
  1486.   struct prefix_ipv4 p;
  1487.   struct in_addr nexthop;
  1488.   struct external_info *ei;
  1489.   struct ospf *ospf;
  1490.   
  1491.   ospf = ospf_lookup ();
  1492.   /* Get originate flags. */
  1493.   origin = THREAD_ARG (thread);
  1494.   p.family = AF_INET;
  1495.   p.prefix.s_addr = 0;
  1496.   p.prefixlen = 0;
  1497.   if (*origin == DEFAULT_ORIGINATE_ALWAYS)
  1498.     {
  1499.       /* If there is no default route via redistribute,
  1500.  then originate AS-external-LSA with nexthop 0 (self). */
  1501.       nexthop.s_addr = 0;
  1502.       ospf_external_info_add (DEFAULT_ROUTE, p, 0, nexthop);
  1503.     }
  1504.   if ((ei = ospf_default_external_info (ospf)))
  1505.     ospf_external_lsa_originate (ospf, ei);
  1506.   
  1507.   return 0;
  1508. }
  1509. #ifdef HAVE_NSSA
  1510. /* Flush any NSSA LSAs for given prefix */
  1511. void
  1512. ospf_nssa_lsa_flush (struct ospf *ospf, struct prefix_ipv4 *p)
  1513. {
  1514.   struct listnode *node;
  1515.   struct ospf_lsa *lsa;
  1516.   struct ospf_area *area;
  1517.   for (node = listhead (ospf->areas); node; nextnode (node)) 
  1518.   {
  1519.     if (((area = getdata (node)) != NULL) 
  1520.           && (area->external_routing == OSPF_AREA_NSSA)) 
  1521.     {
  1522.       if (!(lsa = ospf_lsa_lookup (area, OSPF_AS_NSSA_LSA, p->prefix,
  1523.                                 ospf->router_id))) 
  1524.       {
  1525.         if (IS_DEBUG_OSPF (lsa, LSA_FLOODING)) 
  1526.           zlog_warn ("LSA: There is no such AS-NSSA-LSA %s/%d in LSDB",
  1527.                     inet_ntoa (p->prefix), p->prefixlen);
  1528.         continue;
  1529.       }
  1530.       ospf_ls_retransmit_delete_nbr_area (area, lsa);
  1531.       if (!IS_LSA_MAXAGE (lsa)) 
  1532.       {
  1533.         ospf_refresher_unregister_lsa (ospf, lsa);
  1534.         ospf_lsa_flush_area (lsa, area);
  1535.       }
  1536.     }
  1537.   }
  1538. }
  1539. #endif /* HAVE_NSSA */
  1540. /* Flush an AS-external-LSA from LSDB and routing domain. */
  1541. void
  1542. ospf_external_lsa_flush (struct ospf *ospf,
  1543.  u_char type, struct prefix_ipv4 *p,
  1544.  unsigned int ifindex, struct in_addr nexthop)
  1545. {
  1546.   struct ospf_lsa *lsa;
  1547.   if (IS_DEBUG_OSPF (lsa, LSA_FLOODING))
  1548.     zlog_info ("LSA: Flushing AS-external-LSA %s/%d",
  1549.        inet_ntoa (p->prefix), p->prefixlen);
  1550.   /* First lookup LSA from LSDB. */
  1551.   if (!(lsa = ospf_external_info_find_lsa (ospf, p)))
  1552.     {
  1553.       if (IS_DEBUG_OSPF (lsa, LSA_FLOODING))
  1554. zlog_warn ("LSA: There is no such AS-external-LSA %s/%d in LSDB",
  1555.    inet_ntoa (p->prefix), p->prefixlen);
  1556.       return;
  1557.     }
  1558. #ifdef HAVE_NSSA
  1559.   /* If LSA is selforiginated and there is NSSA area, flush
  1560.    * Type-7 LSA's at first. */
  1561.   if (IS_LSA_SELF(lsa) && (ospf->anyNSSA))
  1562.     ospf_nssa_lsa_flush (ospf, p);
  1563. #endif /* HAVE_NSSA */
  1564.   /* Sweep LSA from Link State Retransmit List. */
  1565.   ospf_ls_retransmit_delete_nbr_as (ospf, lsa);
  1566.   if (!IS_LSA_MAXAGE (lsa))
  1567.     {
  1568.       /* Unregister LSA from Refresh queue. */
  1569.       ospf_refresher_unregister_lsa (ospf, lsa);
  1570.       /* Flush AS-external-LSA through AS. */
  1571.       ospf_lsa_flush_as (ospf, lsa);
  1572.     }
  1573.   if (IS_DEBUG_OSPF (lsa, LSA_FLOODING))
  1574.     zlog_info ("ospf_external_lsa_flush(): stop");
  1575. }
  1576. void
  1577. ospf_external_lsa_refresh_default (struct ospf *ospf)
  1578. {
  1579.   struct prefix_ipv4 p;
  1580.   struct external_info *ei;
  1581.   struct ospf_lsa *lsa;
  1582.   p.family = AF_INET;
  1583.   p.prefixlen = 0;
  1584.   p.prefix.s_addr = 0;
  1585.   ei = ospf_default_external_info (ospf);
  1586.   lsa = ospf_external_info_find_lsa (ospf, &p);
  1587.   if (ei)
  1588.     {
  1589.       if (lsa)
  1590. {
  1591.   if (IS_DEBUG_OSPF_EVENT)
  1592.     zlog_info ("LSA[Type5:0.0.0.0]: Refresh AS-external-LSA %p", lsa);
  1593.   ospf_external_lsa_refresh (ospf, lsa, ei, LSA_REFRESH_FORCE);
  1594. }
  1595.       else
  1596. {
  1597.   if (IS_DEBUG_OSPF_EVENT)
  1598.     zlog_info ("LSA[Type5:0.0.0.0]: Originate AS-external-LSA");
  1599.   ospf_external_lsa_originate (ospf, ei);
  1600. }
  1601.     }
  1602.   else
  1603.     {
  1604.       if (lsa)
  1605. {
  1606.   if (IS_DEBUG_OSPF_EVENT)
  1607.     zlog_info ("LSA[Type5:0.0.0.0]: Flush AS-external-LSA");
  1608.   ospf_lsa_flush_as (ospf, lsa);
  1609. }
  1610.     }
  1611. }
  1612. void
  1613. ospf_external_lsa_refresh_type (struct ospf *ospf, u_char type, int force)
  1614. {
  1615.   struct route_node *rn;
  1616.   struct external_info *ei;
  1617.   if (type != DEFAULT_ROUTE)
  1618.     if (EXTERNAL_INFO(type))
  1619.       /* Refresh each redistributed AS-external-LSAs. */
  1620.       for (rn = route_top (EXTERNAL_INFO (type)); rn; rn = route_next (rn))
  1621. if ((ei = rn->info))
  1622.   if (!is_prefix_default (&ei->p))
  1623.     {
  1624.       struct ospf_lsa *lsa;
  1625.       if ((lsa = ospf_external_info_find_lsa (ospf, &ei->p)))
  1626. ospf_external_lsa_refresh (ospf, lsa, ei, force);
  1627.       else
  1628. ospf_external_lsa_originate (ospf, ei);
  1629.     }
  1630. }
  1631. /* Refresh AS-external-LSA. */
  1632. void
  1633. ospf_external_lsa_refresh (struct ospf *ospf, struct ospf_lsa *lsa,
  1634.    struct external_info *ei, int force)
  1635. {
  1636.   struct ospf_lsa *new;
  1637.   int changed;
  1638.   
  1639.   /* Check the AS-external-LSA should be originated. */
  1640.   if (!ospf_redistribute_check (ospf, ei, &changed))
  1641.     {
  1642.       ospf_external_lsa_flush (ospf, ei->type, &ei->p,
  1643.        ei->ifindex, ei->nexthop);
  1644.       return;
  1645.     }
  1646.   if (!changed && !force)
  1647.     return;
  1648.   /* Delete LSA from neighbor retransmit-list. */
  1649.   ospf_ls_retransmit_delete_nbr_as (ospf, lsa);
  1650.   /* Unregister AS-external-LSA from refresh-list. */
  1651.   ospf_refresher_unregister_lsa (ospf, lsa);
  1652.   new = ospf_external_lsa_new (ospf, ei, &lsa->data->id);
  1653.   
  1654.   if (new == NULL)
  1655.     {
  1656.       if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
  1657. zlog_warn ("LSA[Type%d:%s]: Could not be refreshed", lsa->data->type,
  1658.    inet_ntoa (lsa->data->id));
  1659.       return;
  1660.     }
  1661.   
  1662.   new->data->ls_seqnum = lsa_seqnum_increment (lsa);
  1663.   /* Record timestamp. */
  1664.   gettimeofday (&new->tv_orig, NULL);
  1665.   /* Re-calculate checksum. */
  1666.   ospf_lsa_checksum (new->data);
  1667.   ospf_lsa_install (ospf, NULL, new); /* As type-5. */
  1668.   /* Flood LSA through AS. */
  1669.   ospf_flood_through_as (ospf, NULL, new);
  1670. #ifdef HAVE_NSSA
  1671.   /* If any attached NSSA, install as Type-7, flood to all NSSA Areas */
  1672.   if (ospf->anyNSSA)
  1673.     ospf_install_flood_nssa (ospf, new, ei); /* Install/Flood per new rules */
  1674. #endif /* HAVE_NSSA */
  1675.   /* Register slef-originated LSA to refresh queue. */
  1676.   ospf_refresher_register_lsa (ospf, new);
  1677.   /* Debug logging. */
  1678.   if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
  1679.     {
  1680.       zlog_info ("LSA[Type%d:%s]: AS-external-LSA refresh",
  1681.  new->data->type, inet_ntoa (new->data->id));
  1682.       ospf_lsa_header_dump (new->data);
  1683.     }
  1684.   return;
  1685. }
  1686. /* LSA installation functions. */
  1687. /* Install router-LSA to an area. */
  1688. struct ospf_lsa *
  1689. ospf_router_lsa_install (struct ospf *ospf,
  1690.  struct ospf_lsa *new, int rt_recalc)
  1691. {
  1692.   struct ospf_area *area = new->area;
  1693.   /* RFC 2328 Section 13.2 Router-LSAs and network-LSAs
  1694.      The entire routing table must be recalculated, starting with
  1695.      the shortest path calculations for each area (not just the
  1696.      area whose link-state database has changed). 
  1697.   */
  1698.   if (rt_recalc)
  1699.     ospf_spf_calculate_schedule (ospf);
  1700.   if (IS_LSA_SELF (new))
  1701.     {
  1702.       /* Set router-LSA refresh timer. */
  1703.       OSPF_TIMER_OFF (area->t_router_lsa_self);
  1704.       OSPF_AREA_TIMER_ON (area->t_router_lsa_self,
  1705.   ospf_router_lsa_timer, OSPF_LS_REFRESH_TIME);
  1706.       
  1707.       /* Set self-originated router-LSA. */
  1708.       ospf_lsa_unlock (area->router_lsa_self);
  1709.       area->router_lsa_self = ospf_lsa_lock (new);
  1710.       if (IS_DEBUG_OSPF (lsa, LSA_INSTALL))
  1711. zlog_info("LSA[Type%d]: ID %s is self-originated",
  1712.   new->data->type, inet_ntoa (new->data->id));
  1713.     }
  1714.   return new;
  1715. }
  1716. #define OSPF_INTERFACE_TIMER_ON(T,F,V) 
  1717. if (!(T)) 
  1718.   (T) = thread_add_timer (master, (F), oi, (V))
  1719. /* Install network-LSA to an area. */
  1720. struct ospf_lsa *
  1721. ospf_network_lsa_install (struct ospf *ospf,
  1722.   struct ospf_interface *oi, 
  1723.   struct ospf_lsa *new,
  1724.   int rt_recalc)
  1725. {
  1726.   /* RFC 2328 Section 13.2 Router-LSAs and network-LSAs
  1727.      The entire routing table must be recalculated, starting with
  1728.      the shortest path calculations for each area (not just the
  1729.      area whose link-state database has changed). 
  1730.   */
  1731.   if (rt_recalc)
  1732.     ospf_spf_calculate_schedule (ospf);
  1733.   /* We supposed that when LSA is originated by us, we pass the int
  1734.      for which it was originated. If LSA was received by flooding,
  1735.      the RECEIVED flag is set, so we do not link the LSA to the int. */
  1736.   if (IS_LSA_SELF (new) && !CHECK_FLAG (new->flags, OSPF_LSA_RECEIVED))
  1737.     {
  1738.       /* Set LSRefresh timer. */
  1739.       OSPF_TIMER_OFF (oi->t_network_lsa_self);
  1740.       OSPF_INTERFACE_TIMER_ON (oi->t_network_lsa_self,
  1741.        ospf_network_lsa_refresh_timer,
  1742.        OSPF_LS_REFRESH_TIME);
  1743.       ospf_lsa_unlock (oi->network_lsa_self);
  1744.       oi->network_lsa_self = ospf_lsa_lock (new);
  1745.     }
  1746.   return new;
  1747. }
  1748. /* Install summary-LSA to an area. */
  1749. struct ospf_lsa *
  1750. ospf_summary_lsa_install (struct ospf *ospf, struct ospf_lsa *new,
  1751.   int rt_recalc)
  1752. {
  1753.   if (rt_recalc && !IS_LSA_SELF (new))
  1754.     {
  1755.       /* RFC 2328 Section 13.2 Summary-LSAs
  1756.  The best route to the destination described by the summary-
  1757.  LSA must be recalculated (see Section 16.5).  If this
  1758.  destination is an AS boundary router, it may also be
  1759.  necessary to re-examine all the AS-external-LSAs.
  1760.       */
  1761.       ospf_spf_calculate_schedule (ospf);
  1762.  
  1763.       if (IS_DEBUG_OSPF (lsa, LSA_INSTALL))
  1764. zlog_info ("ospf_summary_lsa_install(): SPF scheduled");
  1765.     }
  1766.   if (IS_LSA_SELF (new))
  1767.     ospf_refresher_register_lsa (ospf, new);
  1768.   return new;
  1769. }
  1770. /* Install ASBR-summary-LSA to an area. */
  1771. struct ospf_lsa *
  1772. ospf_summary_asbr_lsa_install (struct ospf *ospf, struct ospf_lsa *new,
  1773.        int rt_recalc)
  1774. {
  1775.   if (rt_recalc && !IS_LSA_SELF (new))
  1776.     {
  1777.       /* RFC 2328 Section 13.2 Summary-LSAs
  1778.  The best route to the destination described by the summary-
  1779.  LSA must be recalculated (see Section 16.5).  If this
  1780.  destination is an AS boundary router, it may also be
  1781.  necessary to re-examine all the AS-external-LSAs.
  1782.       */
  1783.       ospf_spf_calculate_schedule (ospf);
  1784.     }
  1785.   /* register LSA to refresh-list. */
  1786.   if (IS_LSA_SELF (new))
  1787.     ospf_refresher_register_lsa (ospf, new);
  1788.   return new;
  1789. }
  1790. /* Install AS-external-LSA. */
  1791. struct ospf_lsa *
  1792. ospf_external_lsa_install (struct ospf *ospf, struct ospf_lsa *new,
  1793.    int rt_recalc)
  1794. {
  1795.   ospf_ase_register_external_lsa (new, ospf);
  1796.   /* If LSA is not self-originated, calculate an external route. */
  1797.   if (rt_recalc)
  1798.     {
  1799.       /* RFC 2328 Section 13.2 AS-external-LSAs
  1800.             The best route to the destination described by the AS-
  1801.             external-LSA must be recalculated (see Section 16.6).
  1802.       */
  1803.       if (!IS_LSA_SELF (new))
  1804. ospf_ase_incremental_update (ospf, new);
  1805.     }
  1806. #ifdef HAVE_NSSA
  1807.   /* There is no point to register selforiginate Type-7 LSA for
  1808.    * refreshing. We rely on refreshing Type-5 LSA's */
  1809.   if (IS_LSA_SELF (new) && (new->data->type == OSPF_AS_NSSA_LSA))
  1810.     return new;
  1811. #endif /* HAVE_NSSA */
  1812.   /* Register self-originated LSA to refresh queue. */
  1813.   if (IS_LSA_SELF (new))
  1814.     ospf_refresher_register_lsa (ospf, new);
  1815.   return new;
  1816. }
  1817. void
  1818. ospf_discard_from_db (struct ospf *ospf,
  1819.       struct ospf_lsdb *lsdb, struct ospf_lsa *lsa)
  1820. {
  1821.   struct ospf_lsa *old;
  1822.   
  1823.   old = ospf_lsdb_lookup (lsdb, lsa);
  1824.   if (!old)
  1825.     return;
  1826.   if (old->refresh_list >= 0)
  1827.     ospf_refresher_unregister_lsa (ospf, old);
  1828.   switch (old->data->type)
  1829.     {
  1830.     case OSPF_AS_EXTERNAL_LSA:
  1831. #ifdef HAVE_OPAQUE_LSA
  1832.     case OSPF_OPAQUE_AS_LSA:
  1833. #endif /* HAVE_OPAQUE_LSA */
  1834.       ospf_ls_retransmit_delete_nbr_as (ospf, old);
  1835.       ospf_ase_unregister_external_lsa (old, ospf);
  1836.       break;
  1837. #ifdef HAVE_NSSA
  1838.     case OSPF_AS_NSSA_LSA:
  1839.       ospf_ls_retransmit_delete_nbr_area (old->area, old);
  1840.       ospf_ase_unregister_external_lsa (old, ospf);
  1841.     break;
  1842. #endif /* HAVE_NSSA */
  1843.     default:
  1844.       ospf_ls_retransmit_delete_nbr_area (old->area, old);
  1845.       break;
  1846.     }
  1847.   ospf_lsa_maxage_delete (ospf, old);
  1848.   ospf_lsa_discard (old);
  1849. }
  1850. struct ospf_lsa *
  1851. ospf_lsa_install (struct ospf *ospf, struct ospf_interface *oi,
  1852.   struct ospf_lsa *lsa)
  1853. {
  1854.   struct ospf_lsa *new = NULL;
  1855.   struct ospf_lsa *old = NULL;
  1856.   struct ospf_lsdb *lsdb = NULL;
  1857.   int rt_recalc;
  1858.   /* Set LSDB. */
  1859.   switch (lsa->data->type)
  1860.     {
  1861. #ifdef HAVE_NSSA
  1862.       /* kevinm */
  1863.     case OSPF_AS_NSSA_LSA:
  1864.       if (lsa->area)
  1865. lsdb = lsa->area->lsdb;
  1866.       else
  1867. lsdb = ospf->lsdb;
  1868.       break;
  1869. #endif /* HAVE_NSSA */
  1870.     case OSPF_AS_EXTERNAL_LSA:
  1871. #ifdef HAVE_OPAQUE_LSA
  1872.     case OSPF_OPAQUE_AS_LSA:
  1873. #endif /* HAVE_OPAQUE_LSA */
  1874.       lsdb = ospf->lsdb;
  1875.       break;
  1876.     default:
  1877.       lsdb = lsa->area->lsdb;
  1878.       break;
  1879.     }
  1880.   assert (lsdb);
  1881.   /*  RFC 2328 13.2.  Installing LSAs in the database
  1882.         Installing a new LSA in the database, either as the result of
  1883.         flooding or a newly self-originated LSA, may cause the OSPF
  1884.         routing table structure to be recalculated.  The contents of the
  1885.         new LSA should be compared to the old instance, if present.  If
  1886.         there is no difference, there is no need to recalculate the
  1887.         routing table. When comparing an LSA to its previous instance,
  1888.         the following are all considered to be differences in contents:
  1889.             o   The LSA's Options field has changed.
  1890.             o   One of the LSA instances has LS age set to MaxAge, and
  1891.                 the other does not.
  1892.             o   The length field in the LSA header has changed.
  1893.             o   The body of the LSA (i.e., anything outside the 20-byte
  1894.                 LSA header) has changed. Note that this excludes changes
  1895.                 in LS Sequence Number and LS Checksum.
  1896.   */
  1897.   /* Look up old LSA and determine if any SPF calculation or incremental
  1898.      update is needed */
  1899.   old = ospf_lsdb_lookup (lsdb, lsa);
  1900.   /* Do comparision and record if recalc needed. */
  1901.   rt_recalc = 0;
  1902.   if (  old == NULL || ospf_lsa_different(old, lsa))
  1903.     rt_recalc = 1;
  1904.   /* discard old LSA from LSDB */
  1905.   if (old != NULL)
  1906.     ospf_discard_from_db (ospf, lsdb, lsa);
  1907.   /* Insert LSA to LSDB. */
  1908.   ospf_lsdb_add (lsdb, lsa);
  1909.   lsa->lsdb = lsdb;
  1910.   /* Calculate Checksum if self-originated?. */
  1911.   if (IS_LSA_SELF (lsa))
  1912.     ospf_lsa_checksum (lsa->data);
  1913.   /* Do LSA specific installation process. */
  1914.   switch (lsa->data->type)
  1915.     {
  1916.     case OSPF_ROUTER_LSA:
  1917.       new = ospf_router_lsa_install (ospf, lsa, rt_recalc);
  1918.       break;
  1919.     case OSPF_NETWORK_LSA:
  1920.       assert (oi);
  1921.       new = ospf_network_lsa_install (ospf, oi, lsa, rt_recalc);
  1922.       break;
  1923.     case OSPF_SUMMARY_LSA:
  1924.       new = ospf_summary_lsa_install (ospf, lsa, rt_recalc);
  1925.       break;
  1926.     case OSPF_ASBR_SUMMARY_LSA:
  1927.       new = ospf_summary_asbr_lsa_install (ospf, lsa, rt_recalc);
  1928.       break;
  1929.     case OSPF_AS_EXTERNAL_LSA:
  1930.       new = ospf_external_lsa_install (ospf, lsa, rt_recalc);
  1931.       break;
  1932. #ifdef HAVE_OPAQUE_LSA
  1933.     case OSPF_OPAQUE_LINK_LSA:
  1934.       if (IS_LSA_SELF (lsa))
  1935. lsa->oi = oi; /* Specify outgoing ospf-interface for this LSA. */
  1936.       else
  1937. ; /* Incoming "oi" for this LSA has set at LSUpd reception. */
  1938.       /* Fallthrough */
  1939.     case OSPF_OPAQUE_AREA_LSA:
  1940.     case OSPF_OPAQUE_AS_LSA:
  1941.       new = ospf_opaque_lsa_install (lsa, rt_recalc);
  1942.       break;
  1943. #endif /* HAVE_OPAQUE_LSA */
  1944.     default: /* NSSA, or type-6,8,9....nothing special */
  1945. #ifdef HAVE_NSSA
  1946.       new = ospf_external_lsa_install (ospf, lsa, rt_recalc);
  1947. #endif /* HAVE_NSSA */
  1948.       break;
  1949.     }
  1950.   if (new == NULL)
  1951.     return new;  /* Installation failed, cannot proceed further -- endo. */
  1952.   /* Debug logs. */
  1953.   if (IS_DEBUG_OSPF (lsa, LSA_INSTALL))
  1954.     {
  1955.       char area_str[INET_ADDRSTRLEN];
  1956.       switch (lsa->data->type)
  1957.         {
  1958.         case OSPF_AS_EXTERNAL_LSA:
  1959. #ifdef HAVE_OPAQUE_LSA
  1960.         case OSPF_OPAQUE_AS_LSA:
  1961. #endif /* HAVE_OPAQUE_LSA */
  1962. #ifdef HAVE_NSSA
  1963. case OSPF_AS_NSSA_LSA:
  1964. #endif /* HAVE_NSSA */
  1965.           zlog_info ("LSA[%s]: Install %s",
  1966.                  dump_lsa_key (new),
  1967.                  LOOKUP (ospf_lsa_type_msg, new->data->type));
  1968.           break;
  1969.         default:
  1970.   strcpy (area_str, inet_ntoa (new->area->area_id));
  1971.           zlog_info ("LSA[%s]: Install %s to Area %s",
  1972.                  dump_lsa_key (new),
  1973.                  LOOKUP (ospf_lsa_type_msg, new->data->type), area_str);
  1974.           break;
  1975.         }
  1976.     }
  1977.   /* If received LSA' ls_age is MaxAge, set LSA on MaxAge LSA list. */
  1978.   if (IS_LSA_MAXAGE (new) && !IS_LSA_SELF (new))
  1979.     {
  1980.       if (IS_DEBUG_OSPF (lsa, LSA_FLOODING))
  1981. zlog_info ("LSA[Type%d:%s]: Install LSA, MaxAge",
  1982.    new->data->type, inet_ntoa (new->data->id));
  1983.       ospf_lsa_maxage (ospf, lsa);
  1984.     }
  1985.   return new;
  1986. }
  1987. int
  1988. ospf_check_nbr_status (struct ospf *ospf)
  1989. {
  1990.   listnode node;
  1991.   for (node = listhead (ospf->oiflist); node; node = nextnode (node))
  1992.     {
  1993.       struct ospf_interface *oi = getdata (node);
  1994.       struct route_node *rn;
  1995.       struct ospf_neighbor *nbr;
  1996.       if (ospf_if_is_enable (oi))
  1997. for (rn = route_top (oi->nbrs); rn; rn = route_next (rn))
  1998.           if ((nbr = rn->info) != NULL)
  1999.     if (nbr->state == NSM_Exchange || nbr->state == NSM_Loading)
  2000.       {
  2001. route_unlock_node (rn);
  2002. return 0;
  2003.       }
  2004.     }
  2005.   return 1;
  2006. }
  2007. int
  2008. ospf_maxage_lsa_remover (struct thread *thread)
  2009. {
  2010.   struct ospf *ospf = THREAD_ARG (thread);
  2011.   listnode node;
  2012.   listnode next;
  2013.   int reschedule = 0;
  2014.   ospf->t_maxage = NULL;
  2015.   if (IS_DEBUG_OSPF (lsa, LSA_FLOODING))
  2016.     zlog_info ("LSA[MaxAge]: remover Start");
  2017.   reschedule = !ospf_check_nbr_status (ospf);
  2018.   if (!reschedule)
  2019.     for (node = listhead (ospf->maxage_lsa); node; node = next)
  2020.       {
  2021.         struct ospf_lsa *lsa = getdata (node);
  2022.         next = node->next;
  2023.         if (lsa->retransmit_counter > 0)
  2024.           {
  2025.             reschedule = 1;
  2026.             continue;
  2027.           }
  2028.         /* Remove LSA from the LSDB */
  2029.         if (CHECK_FLAG (lsa->flags, OSPF_LSA_SELF))
  2030.           if (IS_DEBUG_OSPF (lsa, LSA_FLOODING))
  2031.             zlog_info ("LSA[Type%d:%s]: This LSA is self-originated: ",
  2032.                        lsa->data->type, inet_ntoa (lsa->data->id));
  2033.         if (IS_DEBUG_OSPF (lsa, LSA_FLOODING))
  2034.           zlog_info ("LSA[Type%d:%s]: MaxAge LSA removed from list",
  2035.                      lsa->data->type, inet_ntoa (lsa->data->id));
  2036. /* Flood max age LSA. */
  2037.         ospf_flood_through (ospf, NULL, lsa);
  2038. /* Remove from lsdb. */
  2039.         ospf_discard_from_db (ospf, lsa->lsdb, lsa);
  2040.         ospf_lsdb_delete (lsa->lsdb, lsa);
  2041.       }
  2042.   /*    A MaxAge LSA must be removed immediately from the router's link
  2043.         state database as soon as both a) it is no longer contained on any
  2044.         neighbor Link state retransmission lists and b) none of the router's
  2045.         neighbors are in states Exchange or Loading. */
  2046.   if (reschedule)
  2047.     OSPF_TIMER_ON (ospf->t_maxage, ospf_maxage_lsa_remover, 2);
  2048.   return 0;
  2049. }
  2050. int
  2051. ospf_lsa_maxage_exist (struct ospf *ospf, struct ospf_lsa *new)
  2052. {
  2053.   listnode node;
  2054.   for (node = listhead (ospf->maxage_lsa); node; nextnode (node))
  2055.     if (((struct ospf_lsa *) node->data) == new)
  2056.       return 1;
  2057.   return 0;
  2058. }
  2059. void
  2060. ospf_lsa_maxage_delete (struct ospf *ospf, struct ospf_lsa *lsa)
  2061. {
  2062.   listnode n;
  2063.   if ((n = listnode_lookup (ospf->maxage_lsa, lsa)))
  2064.     {
  2065.       list_delete_node (ospf->maxage_lsa, n);
  2066.       ospf_lsa_unlock (lsa);
  2067.     }
  2068. }
  2069. void
  2070. ospf_lsa_maxage (struct ospf *ospf, struct ospf_lsa *lsa)
  2071. {
  2072.   /* When we saw a MaxAge LSA flooded to us, we put it on the list
  2073.      and schedule the MaxAge LSA remover. */
  2074.   if (ospf_lsa_maxage_exist (ospf, lsa))
  2075.     {
  2076.       if (IS_DEBUG_OSPF (lsa, LSA_FLOODING))
  2077. zlog_info ("LSA[Type%d:%s]: %p already exists on MaxAge LSA list",
  2078.    lsa->data->type, inet_ntoa (lsa->data->id), lsa);
  2079.       return;
  2080.     }
  2081.   listnode_add (ospf->maxage_lsa, ospf_lsa_lock (lsa));
  2082.   if (IS_DEBUG_OSPF (lsa, LSA_FLOODING))
  2083.     zlog_info ("LSA[%s]: MaxAge LSA remover scheduled.", dump_lsa_key (lsa));
  2084.   OSPF_TIMER_ON (ospf->t_maxage, ospf_maxage_lsa_remover, 2);
  2085. }
  2086. int
  2087. ospf_lsa_maxage_walker_remover (struct ospf *ospf, struct ospf_lsa *lsa)
  2088. {
  2089. #ifdef HAVE_NSSA
  2090.   /* Stay away from any Local Translated Type-7 LSAs */
  2091.   if (CHECK_FLAG (lsa->flags, OSPF_LSA_LOCAL_XLT))
  2092.     return 0;
  2093. #endif /* HAVE_NSSA */
  2094.   if (IS_LSA_MAXAGE (lsa))
  2095.     /* Self-originated LSAs should NOT time-out instead,
  2096.        they're flushed and submitted to the max_age list explicitly. */
  2097.     if (!ospf_lsa_is_self_originated (ospf, lsa))
  2098.       {
  2099. if (IS_DEBUG_OSPF (lsa, LSA_FLOODING))
  2100.   zlog_info("LSA[%s]: is MaxAge", dump_lsa_key (lsa));
  2101.         switch (lsa->data->type)
  2102.           {
  2103. #ifdef HAVE_OPAQUE_LSA
  2104.           case OSPF_OPAQUE_LINK_LSA:
  2105.           case OSPF_OPAQUE_AREA_LSA:
  2106.           case OSPF_OPAQUE_AS_LSA:
  2107.             /*
  2108.              * As a general rule, whenever network topology has changed
  2109.              * (due to an LSA removal in this case), routing recalculation
  2110.              * should be triggered. However, this is not true for opaque
  2111.              * LSAs. Even if an opaque LSA instance is going to be removed
  2112.              * from the routing domain, it does not mean a change in network
  2113.              * topology, and thus, routing recalculation is not needed here.
  2114.              */
  2115.             break;
  2116. #endif /* HAVE_OPAQUE_LSA */
  2117.           case OSPF_AS_EXTERNAL_LSA:
  2118. #ifdef HAVE_NSSA
  2119.   case OSPF_AS_NSSA_LSA:
  2120. #endif /* HAVE_NSSA */
  2121.     ospf_ase_incremental_update (ospf, lsa);
  2122.             break;
  2123.           default:
  2124.     ospf_spf_calculate_schedule (ospf);
  2125.             break;
  2126.           }
  2127. ospf_lsa_maxage (ospf, lsa);
  2128.       }
  2129.   return 0;
  2130. }
  2131. /* Periodical check of MaxAge LSA. */
  2132. int
  2133. ospf_lsa_maxage_walker (struct thread *thread)
  2134. {
  2135.   struct ospf *ospf = THREAD_ARG (thread);
  2136.   struct route_node *rn;
  2137.   struct ospf_lsa *lsa;
  2138.   listnode node;
  2139.   ospf->t_maxage_walker = NULL;
  2140.   for (node = listhead (ospf->areas); node; nextnode (node))
  2141.     {
  2142.       struct ospf_area *area = node->data;
  2143.       LSDB_LOOP (ROUTER_LSDB (area), rn, lsa)
  2144. ospf_lsa_maxage_walker_remover (ospf, lsa);
  2145.       LSDB_LOOP (NETWORK_LSDB (area), rn, lsa)
  2146. ospf_lsa_maxage_walker_remover (ospf, lsa);
  2147.       LSDB_LOOP (SUMMARY_LSDB (area), rn, lsa)
  2148. ospf_lsa_maxage_walker_remover (ospf, lsa);
  2149.       LSDB_LOOP (ASBR_SUMMARY_LSDB (area), rn, lsa)
  2150. ospf_lsa_maxage_walker_remover (ospf, lsa);
  2151. #ifdef HAVE_OPAQUE_LSA
  2152.       LSDB_LOOP (OPAQUE_AREA_LSDB (area), rn, lsa)
  2153. ospf_lsa_maxage_walker_remover (ospf, lsa);
  2154.       LSDB_LOOP (OPAQUE_LINK_LSDB (area), rn, lsa)
  2155. ospf_lsa_maxage_walker_remover (ospf, lsa);
  2156. #endif /* HAVE_OPAQUE_LSA */
  2157. #ifdef HAVE_NSSA
  2158.       LSDB_LOOP (NSSA_LSDB (area), rn, lsa)
  2159.    ospf_lsa_maxage_walker_remover (ospf, lsa);
  2160. #endif /* HAVE_NSSA */
  2161.     }
  2162.   /* for AS-eternal-LSAs. */
  2163.   if (ospf->lsdb)
  2164.     {
  2165.       LSDB_LOOP (EXTERNAL_LSDB (ospf), rn, lsa)
  2166. ospf_lsa_maxage_walker_remover (ospf, lsa);
  2167. #ifdef HAVE_OPAQUE_LSA
  2168.       LSDB_LOOP (OPAQUE_AS_LSDB (ospf), rn, lsa)
  2169. ospf_lsa_maxage_walker_remover (ospf, lsa);
  2170. #endif /* HAVE_OPAQUE_LSA */
  2171.     }
  2172.   OSPF_TIMER_ON (ospf->t_maxage_walker, ospf_lsa_maxage_walker,
  2173.  OSPF_LSA_MAXAGE_CHECK_INTERVAL);
  2174.   return 0;
  2175. }
  2176. struct ospf_lsa *
  2177. ospf_lsa_lookup_by_prefix (struct ospf_lsdb *lsdb, u_char type,
  2178.    struct prefix_ipv4 *p, struct in_addr router_id)
  2179. {
  2180.   struct ospf_lsa *lsa;
  2181.   struct in_addr mask, id;
  2182.   struct lsa_header_mask
  2183.   {
  2184.     struct lsa_header header;
  2185.     struct in_addr mask;
  2186.   } *hmask;
  2187.   lsa = ospf_lsdb_lookup_by_id (lsdb, type, p->prefix, router_id);
  2188.   if (lsa == NULL)
  2189.     return NULL;
  2190.   masklen2ip (p->prefixlen, &mask);
  2191.   hmask = (struct lsa_header_mask *) lsa->data;
  2192.   if (mask.s_addr != hmask->mask.s_addr)
  2193.     {
  2194.       id.s_addr = p->prefix.s_addr | (~mask.s_addr);
  2195.       lsa = ospf_lsdb_lookup_by_id (lsdb, type, id, router_id);
  2196.       if (!lsa)
  2197.         return NULL;
  2198.     }
  2199.   return lsa;
  2200. }
  2201. struct ospf_lsa *
  2202. ospf_lsa_lookup (struct ospf_area *area, u_int32_t type,
  2203.                  struct in_addr id, struct in_addr adv_router)
  2204. {
  2205.   switch (type)
  2206.     {
  2207.     case OSPF_ROUTER_LSA:
  2208.     case OSPF_NETWORK_LSA:
  2209.     case OSPF_SUMMARY_LSA:
  2210.     case OSPF_ASBR_SUMMARY_LSA:
  2211. #ifdef HAVE_NSSA
  2212.     case OSPF_AS_NSSA_LSA:
  2213. #endif /* HAVE_NSSA */
  2214. #ifdef HAVE_OPAQUE_LSA
  2215.     case OSPF_OPAQUE_LINK_LSA:
  2216.     case OSPF_OPAQUE_AREA_LSA:
  2217. #endif /* HAVE_OPAQUE_LSA */
  2218.       return ospf_lsdb_lookup_by_id (area->lsdb, type, id, adv_router);
  2219.       break;
  2220.     case OSPF_AS_EXTERNAL_LSA:
  2221. #ifdef HAVE_OPAQUE_LSA
  2222.     case OSPF_OPAQUE_AS_LSA:
  2223. #endif /* HAVE_OPAQUE_LSA */
  2224.       return ospf_lsdb_lookup_by_id (area->ospf->lsdb, type, id, adv_router);
  2225.       break;
  2226.     default:
  2227.       break;
  2228.     }
  2229.   return NULL;
  2230. }
  2231. struct ospf_lsa *
  2232. ospf_lsa_lookup_by_id (struct ospf_area *area, u_int32_t type, 
  2233.                        struct in_addr id)
  2234. {
  2235.   struct ospf_lsa *lsa;
  2236.   struct route_node *rn;
  2237.   switch (type)
  2238.     {
  2239.     case OSPF_ROUTER_LSA:
  2240.       return ospf_lsdb_lookup_by_id (area->lsdb, type, id, id);
  2241.       break;
  2242.     case OSPF_NETWORK_LSA:
  2243.       for (rn = route_top (NETWORK_LSDB (area)); rn; rn = route_next (rn))
  2244. if ((lsa = rn->info))
  2245.   if (IPV4_ADDR_SAME (&lsa->data->id, &id))
  2246.     {
  2247.       route_unlock_node (rn);
  2248.       return lsa;
  2249.     }
  2250.       break;
  2251.     case OSPF_SUMMARY_LSA:
  2252.     case OSPF_ASBR_SUMMARY_LSA:
  2253.       /* Currently not used. */
  2254.       assert (1);
  2255.       return ospf_lsdb_lookup_by_id (area->lsdb, type, id, id);
  2256.       break;
  2257.     case OSPF_AS_EXTERNAL_LSA:
  2258. #ifdef HAVE_OPAQUE_LSA
  2259.     case OSPF_OPAQUE_LINK_LSA:
  2260.     case OSPF_OPAQUE_AREA_LSA:
  2261.     case OSPF_OPAQUE_AS_LSA:
  2262.       /* Currently not used. */
  2263.       break;
  2264. #endif /* HAVE_OPAQUE_LSA */
  2265.     default:
  2266.       break;
  2267.     }
  2268.   return NULL;
  2269. }
  2270. struct ospf_lsa *
  2271. ospf_lsa_lookup_by_header (struct ospf_area *area, struct lsa_header *lsah)
  2272. {
  2273.   struct ospf_lsa *match;
  2274. #ifdef HAVE_OPAQUE_LSA
  2275.   /*
  2276.    * Strictly speaking, the LSA-ID field for Opaque-LSAs (type-9/10/11)
  2277.    * is redefined to have two subfields; opaque-type and opaque-id.
  2278.    * However, it is harmless to treat the two sub fields together, as if
  2279.    * they two were forming a unique LSA-ID.
  2280.    */
  2281. #endif /* HAVE_OPAQUE_LSA */
  2282.   match = ospf_lsa_lookup (area, lsah->type, lsah->id, lsah->adv_router);
  2283.   if (match == NULL)
  2284.     if (IS_DEBUG_OSPF (lsa, LSA) == OSPF_DEBUG_LSA)
  2285.       zlog_info ("LSA[Type%d:%s]: Lookup by header, NO MATCH",
  2286.  lsah->type, inet_ntoa (lsah->id));
  2287.   return match;
  2288. }
  2289. /* return +n, l1 is more recent.
  2290.    return -n, l2 is more recent.
  2291.    return 0, l1 and l2 is identical. */
  2292. int
  2293. ospf_lsa_more_recent (struct ospf_lsa *l1, struct ospf_lsa *l2)
  2294. {
  2295.   int r;
  2296.   int x, y;
  2297.   if (l1 == NULL && l2 == NULL)
  2298.     return 0;
  2299.   if (l1 == NULL)
  2300.     return -1;
  2301.   if (l2 == NULL)
  2302.     return 1;
  2303.   /* compare LS sequence number. */
  2304.   x = (int) ntohl (l1->data->ls_seqnum);
  2305.   y = (int) ntohl (l2->data->ls_seqnum);
  2306.   if (x > y)
  2307.     return 1;
  2308.   if (x < y)
  2309.     return -1;
  2310.   /* compare LS checksum. */
  2311.   r = ntohs (l1->data->checksum) - ntohs (l2->data->checksum);
  2312.   if (r)
  2313.     return r;
  2314.   /* compare LS age. */
  2315.   if (IS_LSA_MAXAGE (l1) && !IS_LSA_MAXAGE (l2))
  2316.     return 1;
  2317.   else if (!IS_LSA_MAXAGE (l1) && IS_LSA_MAXAGE (l2))
  2318.     return -1;
  2319.   /* compare LS age with MaxAgeDiff. */
  2320.   if (LS_AGE (l1) - LS_AGE (l2) > OSPF_LSA_MAXAGE_DIFF)
  2321.     return -1;
  2322.   else if (LS_AGE (l2) - LS_AGE (l1) > OSPF_LSA_MAXAGE_DIFF)
  2323.     return 1;
  2324.   /* LSAs are identical. */
  2325.   return 0;
  2326. }
  2327. /* If two LSAs are different, return 1, otherwise return 0. */
  2328. int
  2329. ospf_lsa_different (struct ospf_lsa *l1, struct ospf_lsa *l2)
  2330. {
  2331.   char *p1, *p2;
  2332.   assert (l1);
  2333.   assert (l2);
  2334.   assert (l1->data);
  2335.   assert (l2->data);
  2336.   if (l1->data->options != l2->data->options)
  2337.     return 1;
  2338.   if (IS_LSA_MAXAGE (l1) && !IS_LSA_MAXAGE (l2))
  2339.     return 1;
  2340.   if (IS_LSA_MAXAGE (l2) && !IS_LSA_MAXAGE (l1))
  2341.     return 1;
  2342.   if (l1->data->length != l2->data->length)
  2343.     return 1;
  2344.   if (l1->data->length == 0)
  2345.     return 1;
  2346.   assert (ntohs (l1->data->length) > OSPF_LSA_HEADER_SIZE);
  2347.   p1 = (char *) l1->data;
  2348.   p2 = (char *) l2->data;
  2349.   if (memcmp (p1 + OSPF_LSA_HEADER_SIZE, p2 + OSPF_LSA_HEADER_SIZE,
  2350.               ntohs (l1->data->length) - OSPF_LSA_HEADER_SIZE) != 0)
  2351.     return 1;
  2352.   return 0;
  2353. }
  2354. static int
  2355. ospf_lsa_flush_schedule (struct ospf *ospf, struct ospf_lsa *lsa)
  2356. {
  2357.   if (lsa == NULL || !IS_LSA_SELF (lsa))
  2358.     return 0;
  2359.   if (IS_DEBUG_OSPF_EVENT)
  2360.     zlog_info ("LSA[Type%d:%s]: Schedule self-originated LSA to FLUSH", lsa->data->type, inet_ntoa (lsa->data->id));
  2361.   /* Force given lsa's age to MaxAge. */
  2362.   lsa->data->ls_age = htons (OSPF_LSA_MAXAGE);
  2363.   switch (lsa->data->type)
  2364.     {
  2365. #ifdef HAVE_OPAQUE_LSA
  2366.     case OSPF_OPAQUE_LINK_LSA:
  2367.     case OSPF_OPAQUE_AREA_LSA:
  2368.     case OSPF_OPAQUE_AS_LSA:
  2369.       ospf_opaque_lsa_refresh (lsa);
  2370.       break;
  2371. #endif /* HAVE_OPAQUE_LSA */
  2372.     default:
  2373.       ospf_lsa_maxage (ospf, lsa);
  2374.       break;
  2375.     }
  2376.   return 0;
  2377. }
  2378. void
  2379. ospf_flush_self_originated_lsas_now (struct ospf *ospf)
  2380. {
  2381.   listnode n1, n2;
  2382.   struct ospf_area *area;
  2383.   struct ospf_interface *oi;
  2384.   struct ospf_lsa *lsa;
  2385.   struct route_node *rn;
  2386.   int need_to_flush_ase = 0;
  2387.   for (n1 = listhead (ospf->areas); n1; nextnode (n1))
  2388.     {
  2389.       if ((area = getdata (n1)) == NULL)
  2390.         continue;
  2391.       if ((lsa = area->router_lsa_self) != NULL)
  2392.         {
  2393.           if (IS_DEBUG_OSPF_EVENT)
  2394.             zlog_info ("LSA[Type%d:%s]: Schedule self-originated LSA to FLUSH", lsa->data->type, inet_ntoa (lsa->data->id));
  2395.           ospf_lsa_flush_area (lsa, area);
  2396.           ospf_lsa_unlock (area->router_lsa_self);
  2397.           area->router_lsa_self = NULL;
  2398.           OSPF_TIMER_OFF (area->t_router_lsa_self);
  2399.         }
  2400.       for (n2 = listhead (area->oiflist); n2; nextnode (n2))
  2401.         {
  2402.           if ((oi = getdata (n2)) == NULL)
  2403.             continue;
  2404.           if ((lsa = oi->network_lsa_self) != NULL
  2405.           &&   oi->state == ISM_DR
  2406.           &&   oi->full_nbrs > 0)
  2407.             {
  2408.               if (IS_DEBUG_OSPF_EVENT)
  2409.                 zlog_info ("LSA[Type%d:%s]: Schedule self-originated LSA to FLUSH", lsa->data->type, inet_ntoa (lsa->data->id));
  2410.               ospf_lsa_flush_area (oi->network_lsa_self, area);
  2411.               ospf_lsa_unlock (oi->network_lsa_self);
  2412.               oi->network_lsa_self = NULL;
  2413.               OSPF_TIMER_OFF (oi->t_network_lsa_self);
  2414.             }
  2415.           if (oi->type != OSPF_IFTYPE_VIRTUALLINK
  2416.           &&  area->external_routing == OSPF_AREA_DEFAULT)
  2417.             need_to_flush_ase = 1;
  2418.         }
  2419.       LSDB_LOOP (SUMMARY_LSDB (area), rn, lsa)
  2420. ospf_lsa_flush_schedule (ospf, lsa);
  2421.       LSDB_LOOP (ASBR_SUMMARY_LSDB (area), rn, lsa)
  2422. ospf_lsa_flush_schedule (ospf, lsa);
  2423. #ifdef HAVE_OPAQUE_LSA
  2424.       LSDB_LOOP (OPAQUE_LINK_LSDB (area), rn, lsa)
  2425. ospf_lsa_flush_schedule (ospf, lsa);
  2426.       LSDB_LOOP (OPAQUE_AREA_LSDB (area), rn, lsa)
  2427. ospf_lsa_flush_schedule (ospf, lsa);
  2428. #endif /* HAVE_OPAQUE_LSA */
  2429.     }
  2430.   if (need_to_flush_ase)
  2431.     {
  2432.       LSDB_LOOP (EXTERNAL_LSDB (ospf), rn, lsa)
  2433. ospf_lsa_flush_schedule (ospf, lsa);
  2434. #ifdef HAVE_OPAQUE_LSA
  2435.       LSDB_LOOP (OPAQUE_AS_LSDB (ospf), rn, lsa)
  2436. ospf_lsa_flush_schedule (ospf, lsa);
  2437. #endif /* HAVE_OPAQUE_LSA */
  2438.     }
  2439.   /*
  2440.    * Make sure that the MaxAge LSA remover is executed immediately,
  2441.    * without conflicting to other threads.
  2442.    */
  2443.   if (ospf->t_maxage != NULL)
  2444.     {
  2445.       OSPF_TIMER_OFF (ospf->t_maxage);
  2446.       thread_execute (master, ospf_maxage_lsa_remover, ospf, 0);
  2447.     }
  2448.   return;
  2449. }
  2450. /* If there is self-originated LSA, then return 1, otherwise return 0. */
  2451. /* An interface-independent version of ospf_lsa_is_self_originated */
  2452. int 
  2453. ospf_lsa_is_self_originated (struct ospf *ospf, struct ospf_lsa *lsa)
  2454. {
  2455.   listnode node;
  2456.   /* This LSA is already checked. */
  2457.   if (CHECK_FLAG (lsa->flags, OSPF_LSA_SELF_CHECKED))
  2458.     return CHECK_FLAG (lsa->flags, OSPF_LSA_SELF);
  2459.   /* Make sure LSA is self-checked. */
  2460.   SET_FLAG (lsa->flags, OSPF_LSA_SELF_CHECKED);
  2461.   /* AdvRouter and Router ID is the same. */
  2462.   if (IPV4_ADDR_SAME (&lsa->data->adv_router, &ospf->router_id))
  2463.     SET_FLAG (lsa->flags, OSPF_LSA_SELF);
  2464.   /* LSA is router-LSA. */
  2465.   else if (lsa->data->type == OSPF_ROUTER_LSA &&
  2466.       IPV4_ADDR_SAME (&lsa->data->id, &ospf->router_id))
  2467.     SET_FLAG (lsa->flags, OSPF_LSA_SELF);
  2468.   /* LSA is network-LSA.  Compare Link ID with all interfaces. */
  2469.   else if (lsa->data->type == OSPF_NETWORK_LSA)
  2470.     for (node = listhead (ospf->oiflist); node; nextnode (node))
  2471.       {
  2472. struct ospf_interface *oi = getdata (node);
  2473. /* Ignore virtual link. */
  2474.         if (oi->type != OSPF_IFTYPE_VIRTUALLINK)
  2475.   if (oi->address->family == AF_INET)
  2476.     if (IPV4_ADDR_SAME (&lsa->data->id, &oi->address->u.prefix4))
  2477.       {
  2478. /* to make it easier later */
  2479. SET_FLAG (lsa->flags, OSPF_LSA_SELF);
  2480. return CHECK_FLAG (lsa->flags, OSPF_LSA_SELF);
  2481.       }
  2482.       }
  2483.   return CHECK_FLAG (lsa->flags, OSPF_LSA_SELF);
  2484. }
  2485. /* Get unique Link State ID. */
  2486. struct in_addr
  2487. ospf_lsa_unique_id (struct ospf *ospf,
  2488.     struct ospf_lsdb *lsdb, u_char type, struct prefix_ipv4 *p)
  2489. {
  2490.   struct ospf_lsa *lsa;
  2491.   struct in_addr mask, id;
  2492.   id = p->prefix;
  2493.   /* Check existence of LSA instance. */
  2494.   lsa = ospf_lsdb_lookup_by_id (lsdb, type, id, ospf->router_id);
  2495.   if (lsa)
  2496.     {
  2497.       struct as_external_lsa *al = (struct as_external_lsa *) lsa->data;
  2498.       if (ip_masklen (al->mask) == p->prefixlen)
  2499. {
  2500.   if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
  2501.     zlog_warn ("ospf_lsa_unique_id(): "
  2502.        "Can't get Link State ID for %s/%d",
  2503.        inet_ntoa (p->prefix), p->prefixlen);
  2504.   /*   id.s_addr = 0; */
  2505.   id.s_addr = 0xffffffff;
  2506.   return id;
  2507. }
  2508.       /* Masklen differs, then apply wildcard mask to Link State ID. */
  2509.       else
  2510. {
  2511.   masklen2ip (p->prefixlen, &mask);
  2512.   id.s_addr = p->prefix.s_addr | (~mask.s_addr);
  2513.   lsa = ospf_lsdb_lookup_by_id (ospf->lsdb, type,
  2514.        id, ospf->router_id);
  2515.   if (lsa)
  2516.     {
  2517.       if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
  2518. zlog_warn ("ospf_lsa_unique_id(): "
  2519.    "Can't get Link State ID for %s/%d",
  2520.    inet_ntoa (p->prefix), p->prefixlen);
  2521.       /*        id.s_addr = 0; */
  2522.       id.s_addr = 0xffffffff;
  2523.       return id;
  2524.     }
  2525. }
  2526.     }
  2527.   return id;
  2528. }
  2529. #define LSA_ACTION_ORIGN_RTR  1
  2530. #define LSA_ACTION_ORIGN_NET  2
  2531. #define LSA_ACTION_FLOOD_AREA 3
  2532. #define LSA_ACTION_FLOOD_AS   4
  2533. #define LSA_ACTION_FLUSH_AREA 5
  2534. #define LSA_ACTION_FLUSH_AS   6
  2535. struct lsa_action
  2536. {
  2537.   u_char action;
  2538.   struct ospf_area *area;
  2539.   struct ospf_interface *oi; 
  2540.   struct ospf_lsa *lsa;
  2541. };
  2542. int
  2543. ospf_lsa_action (struct thread *t)
  2544. {
  2545.   struct lsa_action *data;
  2546.   struct ospf *ospf;
  2547.   ospf = ospf_lookup ();
  2548.   data = THREAD_ARG (t);
  2549.   if (IS_DEBUG_OSPF (lsa, LSA) == OSPF_DEBUG_LSA)
  2550.     zlog_info ("LSA[Action]: Performing scheduled LSA action: %d",
  2551.        data->action);
  2552.   switch (data->action)
  2553.     {
  2554.     case LSA_ACTION_ORIGN_RTR:
  2555.       ospf_router_lsa_refresh (data->area->router_lsa_self);
  2556.       break;
  2557.     case LSA_ACTION_ORIGN_NET:
  2558.       ospf_network_lsa_originate (data->oi);
  2559.       break;
  2560.     case LSA_ACTION_FLOOD_AREA:
  2561.       ospf_flood_through_area (data->area, NULL, data->lsa);
  2562.       break;
  2563.     case LSA_ACTION_FLOOD_AS:
  2564.       ospf_flood_through_as (ospf, NULL, data->lsa);
  2565.       break;
  2566.     case LSA_ACTION_FLUSH_AREA:
  2567.       ospf_lsa_flush_area (data->lsa, data->area);
  2568.       break;
  2569.     case LSA_ACTION_FLUSH_AS:
  2570.       ospf_lsa_flush_as (ospf, data->lsa);
  2571.       break;
  2572.     }
  2573.   ospf_lsa_unlock (data->lsa);
  2574.   XFREE (MTYPE_OSPF_MESSAGE, data);
  2575.   return 0;
  2576. }
  2577. void
  2578. ospf_schedule_lsa_flood_area (struct ospf_area *area, struct ospf_lsa *lsa)
  2579. {
  2580.   struct lsa_action *data;
  2581.   data = XMALLOC (MTYPE_OSPF_MESSAGE, sizeof (struct lsa_action));
  2582.   memset (data, 0, sizeof (struct lsa_action));
  2583.   data->action = LSA_ACTION_FLOOD_AREA;
  2584.   data->area = area;
  2585.   data->lsa  = ospf_lsa_lock (lsa);
  2586.   thread_add_event (master, ospf_lsa_action, data, 0);
  2587. }
  2588. void
  2589. ospf_schedule_lsa_flush_area (struct ospf_area *area, struct ospf_lsa *lsa)
  2590. {
  2591.   struct lsa_action *data;
  2592.   data = XMALLOC (MTYPE_OSPF_MESSAGE, sizeof (struct lsa_action));
  2593.   memset (data, 0, sizeof (struct lsa_action));
  2594.   data->action = LSA_ACTION_FLUSH_AREA;
  2595.   data->area = area;
  2596.   data->lsa  = ospf_lsa_lock (lsa);
  2597.   thread_add_event (master, ospf_lsa_action, data, 0);
  2598. }
  2599. /* LSA Refreshment functions. */
  2600. void
  2601. ospf_lsa_refresh (struct ospf *ospf, struct ospf_lsa *lsa)
  2602. {
  2603.   struct external_info *ei;
  2604.   assert (CHECK_FLAG (lsa->flags, OSPF_LSA_SELF));
  2605.   switch (lsa->data->type)
  2606.     {
  2607.       /* Router and Network LSAs are processed differently. */
  2608.     case OSPF_ROUTER_LSA:
  2609.     case OSPF_NETWORK_LSA: 
  2610.       break;
  2611.     case OSPF_SUMMARY_LSA:
  2612.       ospf_summary_lsa_refresh (ospf, lsa);
  2613.       break;
  2614.     case OSPF_ASBR_SUMMARY_LSA:
  2615.       ospf_summary_asbr_lsa_refresh (ospf, lsa);
  2616.       break;
  2617.     case OSPF_AS_EXTERNAL_LSA:
  2618.       ei = ospf_external_info_check (lsa);
  2619.       if (ei)
  2620. ospf_external_lsa_refresh (ospf, lsa, ei, LSA_REFRESH_FORCE);
  2621.       else
  2622. ospf_lsa_flush_as (ospf, lsa);
  2623.       break;
  2624. #ifdef HAVE_OPAQUE_LSA
  2625.     case OSPF_OPAQUE_LINK_LSA:
  2626.     case OSPF_OPAQUE_AREA_LSA:
  2627.     case OSPF_OPAQUE_AS_LSA:
  2628.       ospf_opaque_lsa_refresh (lsa);
  2629.       break;
  2630. #endif /* HAVE_OPAQUE_LSA */
  2631.     default:
  2632.       break;
  2633.     }
  2634. }
  2635. void
  2636. ospf_refresher_register_lsa (struct ospf *ospf, struct ospf_lsa *lsa)
  2637. {
  2638.   u_int16_t index, current_index;
  2639.   
  2640.   assert (CHECK_FLAG (lsa->flags, OSPF_LSA_SELF));
  2641.   if (lsa->refresh_list < 0)
  2642.     {
  2643.       int delay;
  2644.       if (LS_AGE (lsa) == 0 &&
  2645.   ntohl (lsa->data->ls_seqnum) == OSPF_INITIAL_SEQUENCE_NUMBER)
  2646. /* Randomize first update by  OSPF_LS_REFRESH_SHIFT factor */ 
  2647. delay = OSPF_LS_REFRESH_SHIFT + (random () % OSPF_LS_REFRESH_TIME);
  2648.       else
  2649. /* Randomize another updates by +-OSPF_LS_REFRESH_JITTER factor */
  2650. delay = OSPF_LS_REFRESH_TIME - LS_AGE (lsa) - OSPF_LS_REFRESH_JITTER
  2651.   + (random () % (2*OSPF_LS_REFRESH_JITTER)); 
  2652.       if (delay < 0)
  2653. delay = 0;
  2654.       current_index = ospf->lsa_refresh_queue.index +
  2655. (time (NULL) - ospf->lsa_refresher_started)/OSPF_LSA_REFRESHER_GRANULARITY;
  2656.       
  2657.       index = (current_index + delay/OSPF_LSA_REFRESHER_GRANULARITY)
  2658. % (OSPF_LSA_REFRESHER_SLOTS);
  2659.       if (IS_DEBUG_OSPF (lsa, LSA_REFRESH))
  2660. zlog_info ("LSA[Refresh]: lsa with age %d added to index %d",
  2661.    LS_AGE (lsa), index);
  2662.       if (!ospf->lsa_refresh_queue.qs[index])
  2663. ospf->lsa_refresh_queue.qs[index] = list_new ();
  2664.       listnode_add (ospf->lsa_refresh_queue.qs[index], ospf_lsa_lock (lsa));
  2665.       lsa->refresh_list = index;
  2666.     }
  2667. }
  2668. void
  2669. ospf_refresher_unregister_lsa (struct ospf *ospf, struct ospf_lsa *lsa)
  2670. {
  2671.   assert (CHECK_FLAG (lsa->flags, OSPF_LSA_SELF));
  2672.   if (lsa->refresh_list >= 0)
  2673.     {
  2674.       list refresh_list = ospf->lsa_refresh_queue.qs[lsa->refresh_list];
  2675.       listnode_delete (refresh_list, lsa);
  2676.       if (!listcount (refresh_list))
  2677. {
  2678.   list_free (refresh_list);
  2679.   ospf->lsa_refresh_queue.qs[lsa->refresh_list] = NULL;
  2680. }
  2681.       ospf_lsa_unlock (lsa);
  2682.       lsa->refresh_list = -1;
  2683.     }
  2684. }
  2685. int
  2686. ospf_lsa_refresh_walker (struct thread *t)
  2687. {
  2688.   list refresh_list;
  2689.   listnode node;
  2690.   struct ospf *ospf = THREAD_ARG (t);
  2691.   int i;
  2692.   list lsa_to_refresh = list_new ();
  2693.   if (IS_DEBUG_OSPF (lsa, LSA_REFRESH))
  2694.     zlog_info ("LSA[Refresh]:ospf_lsa_refresh_walker(): start");
  2695.   
  2696.   i = ospf->lsa_refresh_queue.index;
  2697.   
  2698.   ospf->lsa_refresh_queue.index =
  2699.     (ospf->lsa_refresh_queue.index +
  2700.      (time (NULL) - ospf->lsa_refresher_started) / OSPF_LSA_REFRESHER_GRANULARITY)
  2701.     % OSPF_LSA_REFRESHER_SLOTS;
  2702.   if (IS_DEBUG_OSPF (lsa, LSA_REFRESH))
  2703.     zlog_info ("LSA[Refresh]: ospf_lsa_refresh_walker(): next index %d",
  2704.        ospf->lsa_refresh_queue.index);
  2705.   for (;i != ospf->lsa_refresh_queue.index;
  2706.        i = (i + 1) % OSPF_LSA_REFRESHER_SLOTS)
  2707.     {
  2708.       if (IS_DEBUG_OSPF (lsa, LSA_REFRESH))
  2709. zlog_info ("LSA[Refresh]: ospf_lsa_refresh_walker(): refresh index %d", i);
  2710.       refresh_list = ospf->lsa_refresh_queue.qs [i];
  2711.       
  2712.       ospf->lsa_refresh_queue.qs [i] = NULL;
  2713.       if (refresh_list)
  2714. {
  2715.   for (node = listhead (refresh_list); node;)
  2716.     {
  2717.       listnode next;
  2718.       struct ospf_lsa *lsa = getdata (node);
  2719.       next = node->next;
  2720.       
  2721.       if (IS_DEBUG_OSPF (lsa, LSA_REFRESH))
  2722. zlog_info ("LSA[Refresh]: ospf_lsa_refresh_walker(): refresh lsa %p", lsa);
  2723.       
  2724.       list_delete_node (refresh_list, node);
  2725.       ospf_lsa_unlock (lsa);
  2726.       lsa->refresh_list = -1;
  2727.       listnode_add (lsa_to_refresh, lsa);
  2728.       node = next;
  2729.     }
  2730.   list_free (refresh_list);
  2731. }
  2732.     }
  2733.   ospf->t_lsa_refresher = thread_add_timer (master, ospf_lsa_refresh_walker,
  2734.    ospf, ospf->lsa_refresh_interval);
  2735.   ospf->lsa_refresher_started = time (NULL);
  2736.   for (node = listhead (lsa_to_refresh); node; nextnode (node))
  2737.     ospf_lsa_refresh (ospf, getdata (node));
  2738.   
  2739.   list_delete (lsa_to_refresh);
  2740.   
  2741.   if (IS_DEBUG_OSPF (lsa, LSA_REFRESH))
  2742.     zlog_info ("LSA[Refresh]: ospf_lsa_refresh_walker(): end");
  2743.   
  2744.   return 0;
  2745. }