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 
23 #include <zebra.h>
24 
25 #include "linklist.h"
26 #include "prefix.h"
27 #include "if.h"
28 #include "table.h"
29 #include "memory.h"
30 #include "stream.h"
31 #include "log.h"
32 #include "thread.h"
33 #include "hash.h"
34 #include "sockunion.h"		/* for inet_aton() */
35 #include "checksum.h"
36 
37 #include "ospfd/ospfd.h"
38 #include "ospfd/ospf_interface.h"
39 #include "ospfd/ospf_ism.h"
40 #include "ospfd/ospf_asbr.h"
41 #include "ospfd/ospf_lsa.h"
42 #include "ospfd/ospf_lsdb.h"
43 #include "ospfd/ospf_neighbor.h"
44 #include "ospfd/ospf_nsm.h"
45 #include "ospfd/ospf_flood.h"
46 #include "ospfd/ospf_packet.h"
47 #include "ospfd/ospf_spf.h"
48 #include "ospfd/ospf_dump.h"
49 #include "ospfd/ospf_route.h"
50 #include "ospfd/ospf_ase.h"
51 #include "ospfd/ospf_zebra.h"
52 #include "ospfd/ospf_abr.h"
53 
54 
55 u_int32_t
get_metric(u_char * metric)56 get_metric (u_char *metric)
57 {
58   u_int32_t m;
59   m = metric[0];
60   m = (m << 8) + metric[1];
61   m = (m << 8) + metric[2];
62   return m;
63 }
64 
65 
66 struct timeval
tv_adjust(struct timeval a)67 tv_adjust (struct timeval a)
68 {
69   while (a.tv_usec >= 1000000)
70     {
71       a.tv_usec -= 1000000;
72       a.tv_sec++;
73     }
74 
75   while (a.tv_usec < 0)
76     {
77       a.tv_usec += 1000000;
78       a.tv_sec--;
79     }
80 
81   return a;
82 }
83 
84 int
tv_ceil(struct timeval a)85 tv_ceil (struct timeval a)
86 {
87   a = tv_adjust (a);
88 
89   return (a.tv_usec ? a.tv_sec + 1 : a.tv_sec);
90 }
91 
92 int
tv_floor(struct timeval a)93 tv_floor (struct timeval a)
94 {
95   a = tv_adjust (a);
96 
97   return a.tv_sec;
98 }
99 
100 struct timeval
int2tv(int a)101 int2tv (int a)
102 {
103   struct timeval ret;
104 
105   ret.tv_sec = a;
106   ret.tv_usec = 0;
107 
108   return ret;
109 }
110 
111 struct timeval
msec2tv(int a)112 msec2tv (int a)
113 {
114   struct timeval ret;
115 
116   ret.tv_sec = 0;
117   ret.tv_usec = a * 1000;
118 
119   return tv_adjust (ret);
120 }
121 
122 struct timeval
tv_add(struct timeval a,struct timeval b)123 tv_add (struct timeval a, struct timeval b)
124 {
125   struct timeval ret;
126 
127   ret.tv_sec = a.tv_sec + b.tv_sec;
128   ret.tv_usec = a.tv_usec + b.tv_usec;
129 
130   return tv_adjust (ret);
131 }
132 
133 struct timeval
tv_sub(struct timeval a,struct timeval b)134 tv_sub (struct timeval a, struct timeval b)
135 {
136   struct timeval ret;
137 
138   ret.tv_sec = a.tv_sec - b.tv_sec;
139   ret.tv_usec = a.tv_usec - b.tv_usec;
140 
141   return tv_adjust (ret);
142 }
143 
144 int
tv_cmp(struct timeval a,struct timeval b)145 tv_cmp (struct timeval a, struct timeval b)
146 {
147   return (a.tv_sec == b.tv_sec ?
148 	  a.tv_usec - b.tv_usec : a.tv_sec - b.tv_sec);
149 }
150 
151 int
ospf_lsa_refresh_delay(struct ospf_lsa * lsa)152 ospf_lsa_refresh_delay (struct ospf_lsa *lsa)
153 {
154   struct timeval delta, now;
155   int delay = 0;
156 
157   quagga_gettime (QUAGGA_CLK_MONOTONIC, &now);
158   delta = tv_sub (now, lsa->tv_orig);
159 
160   if (tv_cmp (delta, msec2tv (OSPF_MIN_LS_INTERVAL)) < 0)
161     {
162       delay = tv_ceil (tv_sub (msec2tv (OSPF_MIN_LS_INTERVAL), delta));
163 
164       if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
165         zlog_debug ("LSA[Type%d:%s]: Refresh timer delay %d seconds",
166 	           lsa->data->type, inet_ntoa (lsa->data->id), delay);
167 
168       assert (delay > 0);
169     }
170 
171   return delay;
172 }
173 
174 
175 int
get_age(struct ospf_lsa * lsa)176 get_age (struct ospf_lsa *lsa)
177 {
178   int age;
179 
180   age = ntohs (lsa->data->ls_age)
181         + tv_floor (tv_sub (recent_relative_time (), lsa->tv_recv));
182 
183   return age;
184 }
185 
186 
187 /* Fletcher Checksum -- Refer to RFC1008. */
188 
189 /* All the offsets are zero-based. The offsets in the RFC1008 are
190    one-based. */
191 u_int16_t
ospf_lsa_checksum(struct lsa_header * lsa)192 ospf_lsa_checksum (struct lsa_header *lsa)
193 {
194   u_char *buffer = (u_char *) &lsa->options;
195   int options_offset = buffer - (u_char *) &lsa->ls_age; /* should be 2 */
196 
197   /* Skip the AGE field */
198   u_int16_t len = ntohs(lsa->length) - options_offset;
199 
200   /* Checksum offset starts from "options" field, not the beginning of the
201      lsa_header struct. The offset is 14, rather than 16. */
202   int checksum_offset = (u_char *) &lsa->checksum - buffer;
203 
204   return fletcher_checksum(buffer, len, checksum_offset);
205 }
206 
207 int
ospf_lsa_checksum_valid(struct lsa_header * lsa)208 ospf_lsa_checksum_valid (struct lsa_header *lsa)
209 {
210   u_char *buffer = (u_char *) &lsa->options;
211   int options_offset = buffer - (u_char *) &lsa->ls_age; /* should be 2 */
212 
213   /* Skip the AGE field */
214   u_int16_t len = ntohs(lsa->length) - options_offset;
215 
216   return(fletcher_checksum(buffer, len, FLETCHER_CHECKSUM_VALIDATE) == 0);
217 }
218 
219 
220 
221 /* Create OSPF LSA. */
222 struct ospf_lsa *
ospf_lsa_new()223 ospf_lsa_new ()
224 {
225   struct ospf_lsa *new;
226 
227   new = XCALLOC (MTYPE_OSPF_LSA, sizeof (struct ospf_lsa));
228 
229   new->flags = 0;
230   new->lock = 1;
231   new->retransmit_counter = 0;
232   new->tv_recv = recent_relative_time ();
233   new->tv_orig = new->tv_recv;
234   new->refresh_list = -1;
235 
236   return new;
237 }
238 
239 /* Duplicate OSPF LSA. */
240 struct ospf_lsa *
ospf_lsa_dup(struct ospf_lsa * lsa)241 ospf_lsa_dup (struct ospf_lsa *lsa)
242 {
243   struct ospf_lsa *new;
244 
245   if (lsa == NULL)
246     return NULL;
247 
248   new = XCALLOC (MTYPE_OSPF_LSA, sizeof (struct ospf_lsa));
249 
250   memcpy (new, lsa, sizeof (struct ospf_lsa));
251   UNSET_FLAG (new->flags, OSPF_LSA_DISCARD);
252   new->lock = 1;
253   new->retransmit_counter = 0;
254   new->data = ospf_lsa_data_dup (lsa->data);
255 
256   /* kevinm: Clear the refresh_list, otherwise there are going
257      to be problems when we try to remove the LSA from the
258      queue (which it's not a member of.)
259      XXX: Should we add the LSA to the refresh_list queue? */
260   new->refresh_list = -1;
261 
262   if (IS_DEBUG_OSPF (lsa, LSA))
263     zlog_debug ("LSA: duplicated %p (new: %p)", (void *)lsa, (void *)new);
264 
265   return new;
266 }
267 
268 /* Free OSPF LSA. */
269 void
ospf_lsa_free(struct ospf_lsa * lsa)270 ospf_lsa_free (struct ospf_lsa *lsa)
271 {
272   assert (lsa->lock == 0);
273 
274   if (IS_DEBUG_OSPF (lsa, LSA))
275     zlog_debug ("LSA: freed %p", (void *)lsa);
276 
277   /* Delete LSA data. */
278   if (lsa->data != NULL)
279     ospf_lsa_data_free (lsa->data);
280 
281   assert (lsa->refresh_list < 0);
282 
283   memset (lsa, 0, sizeof (struct ospf_lsa));
284   XFREE (MTYPE_OSPF_LSA, lsa);
285 }
286 
287 /* Lock LSA. */
288 struct ospf_lsa *
ospf_lsa_lock(struct ospf_lsa * lsa)289 ospf_lsa_lock (struct ospf_lsa *lsa)
290 {
291   lsa->lock++;
292   return lsa;
293 }
294 
295 /* Unlock LSA. */
296 void
ospf_lsa_unlock(struct ospf_lsa ** lsa)297 ospf_lsa_unlock (struct ospf_lsa **lsa)
298 {
299   /* This is sanity check. */
300   if (!lsa || !*lsa)
301     return;
302 
303   (*lsa)->lock--;
304 
305   assert ((*lsa)->lock >= 0);
306 
307   if ((*lsa)->lock == 0)
308     {
309       assert (CHECK_FLAG ((*lsa)->flags, OSPF_LSA_DISCARD));
310       ospf_lsa_free (*lsa);
311       *lsa = NULL;
312     }
313 }
314 
315 /* Check discard flag. */
316 void
ospf_lsa_discard(struct ospf_lsa * lsa)317 ospf_lsa_discard (struct ospf_lsa *lsa)
318 {
319   if (!CHECK_FLAG (lsa->flags, OSPF_LSA_DISCARD))
320     {
321       SET_FLAG (lsa->flags, OSPF_LSA_DISCARD);
322       ospf_lsa_unlock (&lsa);
323     }
324 }
325 
326 /* Create LSA data. */
327 struct lsa_header *
ospf_lsa_data_new(size_t size)328 ospf_lsa_data_new (size_t size)
329 {
330   return XCALLOC (MTYPE_OSPF_LSA_DATA, size);
331 }
332 
333 /* Duplicate LSA data. */
334 struct lsa_header *
ospf_lsa_data_dup(struct lsa_header * lsah)335 ospf_lsa_data_dup (struct lsa_header *lsah)
336 {
337   struct lsa_header *new;
338 
339   new = ospf_lsa_data_new (ntohs (lsah->length));
340   memcpy (new, lsah, ntohs (lsah->length));
341 
342   return new;
343 }
344 
345 /* Free LSA data. */
346 void
ospf_lsa_data_free(struct lsa_header * lsah)347 ospf_lsa_data_free (struct lsa_header *lsah)
348 {
349   if (IS_DEBUG_OSPF (lsa, LSA))
350     zlog_debug ("LSA[Type%d:%s]: data freed %p",
351 	       lsah->type, inet_ntoa (lsah->id), (void *)lsah);
352 
353   XFREE (MTYPE_OSPF_LSA_DATA, lsah);
354 }
355 
356 
357 /* LSA general functions. */
358 
359 const char *
dump_lsa_key(struct ospf_lsa * lsa)360 dump_lsa_key (struct ospf_lsa *lsa)
361 {
362   static char buf[] = {
363     "Type255,id(255.255.255.255),ar(255.255.255.255)"
364   };
365   struct lsa_header *lsah;
366 
367   if (lsa != NULL && (lsah = lsa->data) != NULL)
368     {
369       char id[INET_ADDRSTRLEN], ar[INET_ADDRSTRLEN];
370       strcpy (id, inet_ntoa (lsah->id));
371       strcpy (ar, inet_ntoa (lsah->adv_router));
372 
373       sprintf (buf, "Type%d,id(%s),ar(%s)", lsah->type, id, ar);
374     }
375   else
376     strcpy (buf, "NULL");
377 
378   return buf;
379 }
380 
381 u_int32_t
lsa_seqnum_increment(struct ospf_lsa * lsa)382 lsa_seqnum_increment (struct ospf_lsa *lsa)
383 {
384   u_int32_t seqnum;
385 
386   seqnum = ntohl (lsa->data->ls_seqnum) + 1;
387 
388   return htonl (seqnum);
389 }
390 
391 void
lsa_header_set(struct stream * s,u_char options,u_char type,struct in_addr id,struct in_addr router_id)392 lsa_header_set (struct stream *s, u_char options,
393 		u_char type, struct in_addr id, struct in_addr router_id)
394 {
395   struct lsa_header *lsah;
396 
397   lsah = (struct lsa_header *) STREAM_DATA (s);
398 
399   lsah->ls_age = htons (OSPF_LSA_INITIAL_AGE);
400   lsah->options = options;
401   lsah->type = type;
402   lsah->id = id;
403   lsah->adv_router = router_id;
404   lsah->ls_seqnum = htonl (OSPF_INITIAL_SEQUENCE_NUMBER);
405 
406   stream_forward_endp (s, OSPF_LSA_HEADER_SIZE);
407 }
408 
409 
410 /* router-LSA related functions. */
411 /* Get router-LSA flags. */
412 static u_char
router_lsa_flags(struct ospf_area * area)413 router_lsa_flags (struct ospf_area *area)
414 {
415   u_char flags;
416 
417   flags = area->ospf->flags;
418 
419   /* Set virtual link flag. */
420   if (ospf_full_virtual_nbrs (area))
421     SET_FLAG (flags, ROUTER_LSA_VIRTUAL);
422   else
423     /* Just sanity check */
424     UNSET_FLAG (flags, ROUTER_LSA_VIRTUAL);
425 
426   /* Set Shortcut ABR behabiour flag. */
427   UNSET_FLAG (flags, ROUTER_LSA_SHORTCUT);
428   if (area->ospf->abr_type == OSPF_ABR_SHORTCUT)
429     if (!OSPF_IS_AREA_BACKBONE (area))
430       if ((area->shortcut_configured == OSPF_SHORTCUT_DEFAULT &&
431 	   area->ospf->backbone == NULL) ||
432 	  area->shortcut_configured == OSPF_SHORTCUT_ENABLE)
433 	SET_FLAG (flags, ROUTER_LSA_SHORTCUT);
434 
435   /* ASBR can't exit in stub area. */
436   if (area->external_routing == OSPF_AREA_STUB)
437     UNSET_FLAG (flags, ROUTER_LSA_EXTERNAL);
438   /* If ASBR set External flag */
439   else if (IS_OSPF_ASBR (area->ospf))
440     SET_FLAG (flags, ROUTER_LSA_EXTERNAL);
441 
442   /* Set ABR dependent flags */
443   if (IS_OSPF_ABR (area->ospf))
444     {
445       SET_FLAG (flags,  ROUTER_LSA_BORDER);
446       /* If Area is NSSA and we are both ABR and unconditional translator,
447        * set Nt bit to inform other routers.
448        */
449       if ( (area->external_routing == OSPF_AREA_NSSA)
450            && (area->NSSATranslatorRole == OSPF_NSSA_ROLE_ALWAYS))
451         SET_FLAG (flags, ROUTER_LSA_NT);
452     }
453   return flags;
454 }
455 
456 /* Lookup neighbor other than myself.
457    And check neighbor count,
458    Point-to-Point link must have only 1 neighbor. */
459 struct ospf_neighbor *
ospf_nbr_lookup_ptop(struct ospf_interface * oi)460 ospf_nbr_lookup_ptop (struct ospf_interface *oi)
461 {
462   struct ospf_neighbor *nbr = NULL;
463   struct route_node *rn;
464 
465   /* Search neighbor, there must be one of two nbrs. */
466   for (rn = route_top (oi->nbrs); rn; rn = route_next (rn))
467     if ((nbr = rn->info))
468       if (!IPV4_ADDR_SAME (&nbr->router_id, &oi->ospf->router_id))
469 	if (nbr->state == NSM_Full)
470 	  {
471 	    route_unlock_node (rn);
472 	    break;
473 	  }
474 
475   /* PtoP link must have only 1 neighbor. */
476   if (ospf_nbr_count (oi, 0) > 1)
477     zlog_warn ("Point-to-Point link has more than 1 neighobrs.");
478 
479   return nbr;
480 }
481 
482 /* Determine cost of link, taking RFC3137 stub-router support into
483  * consideration
484  */
485 static u_int16_t
ospf_link_cost(struct ospf_interface * oi)486 ospf_link_cost (struct ospf_interface *oi)
487 {
488   /* RFC3137 stub router support */
489   if (!CHECK_FLAG (oi->area->stub_router_state, OSPF_AREA_IS_STUB_ROUTED))
490     return oi->output_cost;
491   else
492     return OSPF_OUTPUT_COST_INFINITE;
493 }
494 
495 /* Set a link information. */
496 static char
link_info_set(struct stream * s,struct in_addr id,struct in_addr data,u_char type,u_char tos,u_int16_t cost)497 link_info_set (struct stream *s, struct in_addr id,
498 	       struct in_addr data, u_char type, u_char tos, u_int16_t cost)
499 {
500   /* LSA stream is initially allocated to OSPF_MAX_LSA_SIZE, suits
501    * vast majority of cases. Some rare routers with lots of links need more.
502    * we try accomodate those here.
503    */
504   if (STREAM_WRITEABLE(s) < OSPF_ROUTER_LSA_LINK_SIZE)
505     {
506       size_t ret = OSPF_MAX_LSA_SIZE;
507 
508       /* Can we enlarge the stream still? */
509       if (STREAM_SIZE(s) == OSPF_MAX_LSA_SIZE)
510         {
511           /* we futz the size here for simplicity, really we need to account
512            * for just:
513            * IP Header - (sizeof (struct ip))
514            * OSPF Header - OSPF_HEADER_SIZE
515            * LSA Header - OSPF_LSA_HEADER_SIZE
516            * MD5 auth data, if MD5 is configured - OSPF_AUTH_MD5_SIZE.
517            *
518            * Simpler just to subtract OSPF_MAX_LSA_SIZE though.
519            */
520           ret = stream_resize (s, OSPF_MAX_PACKET_SIZE - OSPF_MAX_LSA_SIZE);
521         }
522 
523       if (ret == OSPF_MAX_LSA_SIZE)
524         {
525           zlog_warn ("%s: Out of space in LSA stream, left %zd, size %zd",
526                      __func__, STREAM_REMAIN (s), STREAM_SIZE (s));
527           return 0;
528         }
529     }
530 
531   /* TOS based routing is not supported. */
532   stream_put_ipv4 (s, id.s_addr);		/* Link ID. */
533   stream_put_ipv4 (s, data.s_addr);		/* Link Data. */
534   stream_putc (s, type);			/* Link Type. */
535   stream_putc (s, tos);				/* TOS = 0. */
536   stream_putw (s, cost);			/* Link Cost. */
537 
538   return 1;
539 }
540 
541 /* Describe Point-to-Point link (Section 12.4.1.1). */
542 static int
lsa_link_ptop_set(struct stream * s,struct ospf_interface * oi)543 lsa_link_ptop_set (struct stream *s, struct ospf_interface *oi)
544 {
545   int links = 0;
546   struct ospf_neighbor *nbr;
547   struct in_addr id, mask;
548   u_int16_t cost = ospf_link_cost (oi);
549 
550   if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
551     zlog_debug ("LSA[Type1]: Set link Point-to-Point");
552 
553   if ((nbr = ospf_nbr_lookup_ptop (oi)))
554     if (nbr->state == NSM_Full)
555       {
556 	/* For unnumbered point-to-point networks, the Link Data field
557 	   should specify the interface's MIB-II ifIndex value. */
558 	links += link_info_set (s, nbr->router_id, oi->address->u.prefix4,
559 		                LSA_LINK_TYPE_POINTOPOINT, 0, cost);
560       }
561 
562   /* Regardless of the state of the neighboring router, we must
563      add a Type 3 link (stub network).
564      N.B. Options 1 & 2 share basically the same logic. */
565   masklen2ip (oi->address->prefixlen, &mask);
566   id.s_addr = CONNECTED_PREFIX(oi->connected)->u.prefix4.s_addr & mask.s_addr;
567   links += link_info_set (s, id, mask, LSA_LINK_TYPE_STUB, 0,
568 			  oi->output_cost);
569   return links;
570 }
571 
572 /* Describe Broadcast Link. */
573 static int
lsa_link_broadcast_set(struct stream * s,struct ospf_interface * oi)574 lsa_link_broadcast_set (struct stream *s, struct ospf_interface *oi)
575 {
576   struct ospf_neighbor *dr;
577   struct in_addr id, mask;
578   u_int16_t cost = ospf_link_cost (oi);
579 
580   /* Describe Type 3 Link. */
581   if (oi->state == ISM_Waiting)
582     {
583       if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
584         zlog_debug ("LSA[Type1]: Interface %s is in state Waiting. "
585                     "Adding stub interface", oi->ifp->name);
586       masklen2ip (oi->address->prefixlen, &mask);
587       id.s_addr = oi->address->u.prefix4.s_addr & mask.s_addr;
588       return link_info_set (s, id, mask, LSA_LINK_TYPE_STUB, 0,
589                             oi->output_cost);
590     }
591 
592   dr = ospf_nbr_lookup_by_addr (oi->nbrs, &DR (oi));
593   /* Describe Type 2 link. */
594   if (dr && (dr->state == NSM_Full ||
595 	     IPV4_ADDR_SAME (&oi->address->u.prefix4, &DR (oi))) &&
596       ospf_nbr_count (oi, NSM_Full) > 0)
597     {
598       if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
599         zlog_debug ("LSA[Type1]: Interface %s has a DR. "
600                     "Adding transit interface", oi->ifp->name);
601       return link_info_set (s, DR (oi), oi->address->u.prefix4,
602                             LSA_LINK_TYPE_TRANSIT, 0, cost);
603     }
604   /* Describe type 3 link. */
605   else
606     {
607       if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
608         zlog_debug ("LSA[Type1]: Interface %s has no DR. "
609                     "Adding stub interface", oi->ifp->name);
610       masklen2ip (oi->address->prefixlen, &mask);
611       id.s_addr = oi->address->u.prefix4.s_addr & mask.s_addr;
612       return link_info_set (s, id, mask, LSA_LINK_TYPE_STUB, 0,
613                             oi->output_cost);
614     }
615 }
616 
617 static int
lsa_link_loopback_set(struct stream * s,struct ospf_interface * oi)618 lsa_link_loopback_set (struct stream *s, struct ospf_interface *oi)
619 {
620   struct in_addr id, mask;
621 
622   /* Describe Type 3 Link. */
623   if (oi->state != ISM_Loopback)
624     return 0;
625 
626   mask.s_addr = 0xffffffff;
627   id.s_addr = oi->address->u.prefix4.s_addr;
628   return link_info_set (s, id, mask, LSA_LINK_TYPE_STUB, 0, 0);
629 }
630 
631 /* Describe Virtual Link. */
632 static int
lsa_link_virtuallink_set(struct stream * s,struct ospf_interface * oi)633 lsa_link_virtuallink_set (struct stream *s, struct ospf_interface *oi)
634 {
635   struct ospf_neighbor *nbr;
636   u_int16_t cost = ospf_link_cost (oi);
637 
638   if (oi->state == ISM_PointToPoint)
639     if ((nbr = ospf_nbr_lookup_ptop (oi)))
640       if (nbr->state == NSM_Full)
641 	{
642 	  return link_info_set (s, nbr->router_id, oi->address->u.prefix4,
643 			        LSA_LINK_TYPE_VIRTUALLINK, 0, cost);
644 	}
645 
646   return 0;
647 }
648 
649 #define lsa_link_nbma_set(S,O)  lsa_link_broadcast_set (S, O)
650 
651 /* this function add for support point-to-multipoint ,see rfc2328
652 12.4.1.4.*/
653 /* from "edward rrr" <edward_rrr@hotmail.com>
654    http://marc.theaimsgroup.com/?l=zebra&m=100739222210507&w=2 */
655 static int
lsa_link_ptomp_set(struct stream * s,struct ospf_interface * oi)656 lsa_link_ptomp_set (struct stream *s, struct ospf_interface *oi)
657 {
658   int links = 0;
659   struct route_node *rn;
660   struct ospf_neighbor *nbr = NULL;
661   struct in_addr id, mask;
662   u_int16_t cost = ospf_link_cost (oi);
663 
664   mask.s_addr = 0xffffffff;
665   id.s_addr = oi->address->u.prefix4.s_addr;
666   links += link_info_set (s, id, mask, LSA_LINK_TYPE_STUB, 0, 0);
667 
668   if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
669     zlog_debug ("PointToMultipoint: running ptomultip_set");
670 
671   /* Search neighbor, */
672   for (rn = route_top (oi->nbrs); rn; rn = route_next (rn))
673     if ((nbr = rn->info) != NULL)
674       /* Ignore myself. */
675       if (!IPV4_ADDR_SAME (&nbr->router_id, &oi->ospf->router_id))
676 	if (nbr->state == NSM_Full)
677 
678 	  {
679 	    links += link_info_set (s, nbr->router_id, oi->address->u.prefix4,
680 			            LSA_LINK_TYPE_POINTOPOINT, 0, cost);
681             if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
682  	      zlog_debug ("PointToMultipoint: set link to %s",
683 		         inet_ntoa(oi->address->u.prefix4));
684 	  }
685 
686   return links;
687 }
688 
689 /* Set router-LSA link information. */
690 static int
router_lsa_link_set(struct stream * s,struct ospf_area * area)691 router_lsa_link_set (struct stream *s, struct ospf_area *area)
692 {
693   struct listnode *node;
694   struct ospf_interface *oi;
695   int links = 0;
696 
697   for (ALL_LIST_ELEMENTS_RO (area->oiflist, node, oi))
698     {
699       struct interface *ifp = oi->ifp;
700 
701       /* Check interface is up, OSPF is enable. */
702       if (if_is_operative (ifp))
703 	{
704 	  if (oi->state != ISM_Down)
705 	    {
706 	      oi->lsa_pos_beg = links;
707 	      /* Describe each link. */
708 	      switch (oi->type)
709 		{
710 		case OSPF_IFTYPE_POINTOPOINT:
711 		  links += lsa_link_ptop_set (s, oi);
712 		  break;
713 		case OSPF_IFTYPE_BROADCAST:
714 		  links += lsa_link_broadcast_set (s, oi);
715 		  break;
716 		case OSPF_IFTYPE_NBMA:
717 		  links += lsa_link_nbma_set (s, oi);
718 		  break;
719 		case OSPF_IFTYPE_POINTOMULTIPOINT:
720 		  links += lsa_link_ptomp_set (s, oi);
721 		  break;
722 		case OSPF_IFTYPE_VIRTUALLINK:
723 		  links += lsa_link_virtuallink_set (s, oi);
724 		  break;
725 		case OSPF_IFTYPE_LOOPBACK:
726 		  links += lsa_link_loopback_set (s, oi);
727 		}
728 	      oi->lsa_pos_end = links;
729 	    }
730 	}
731     }
732 
733   return links;
734 }
735 
736 /* Set router-LSA body. */
737 static void
ospf_router_lsa_body_set(struct stream * s,struct ospf_area * area)738 ospf_router_lsa_body_set (struct stream *s, struct ospf_area *area)
739 {
740   unsigned long putp;
741   u_int16_t cnt;
742 
743   /* Set flags. */
744   stream_putc (s, router_lsa_flags (area));
745 
746   /* Set Zero fields. */
747   stream_putc (s, 0);
748 
749   /* Keep pointer to # links. */
750   putp = stream_get_endp(s);
751 
752   /* Forward word */
753   stream_putw(s, 0);
754 
755   /* Set all link information. */
756   cnt = router_lsa_link_set (s, area);
757 
758   /* Set # of links here. */
759   stream_putw_at (s, putp, cnt);
760 }
761 
762 static int
ospf_stub_router_timer(struct thread * t)763 ospf_stub_router_timer (struct thread *t)
764 {
765   struct ospf_area *area = THREAD_ARG (t);
766 
767   area->t_stub_router = NULL;
768 
769   SET_FLAG (area->stub_router_state, OSPF_AREA_WAS_START_STUB_ROUTED);
770 
771   /* clear stub route state and generate router-lsa refresh, don't
772    * clobber an administratively set stub-router state though.
773    */
774   if (CHECK_FLAG (area->stub_router_state, OSPF_AREA_ADMIN_STUB_ROUTED))
775     return 0;
776 
777   UNSET_FLAG (area->stub_router_state, OSPF_AREA_IS_STUB_ROUTED);
778 
779   ospf_router_lsa_update_area (area);
780 
781   return 0;
782 }
783 
784 static void
ospf_stub_router_check(struct ospf_area * area)785 ospf_stub_router_check (struct ospf_area *area)
786 {
787   /* area must either be administratively configured to be stub
788    * or startup-time stub-router must be configured and we must in a pre-stub
789    * state.
790    */
791   if (CHECK_FLAG (area->stub_router_state, OSPF_AREA_ADMIN_STUB_ROUTED))
792     {
793       SET_FLAG (area->stub_router_state, OSPF_AREA_IS_STUB_ROUTED);
794       return;
795     }
796 
797   /* not admin-stubbed, check whether startup stubbing is configured and
798    * whether it's not been done yet
799    */
800   if (CHECK_FLAG (area->stub_router_state, OSPF_AREA_WAS_START_STUB_ROUTED))
801     return;
802 
803   if (area->ospf->stub_router_startup_time == OSPF_STUB_ROUTER_UNCONFIGURED)
804     {
805       /* stub-router is hence done forever for this area, even if someone
806        * tries configure it (take effect next restart).
807        */
808       SET_FLAG (area->stub_router_state, OSPF_AREA_WAS_START_STUB_ROUTED);
809       return;
810     }
811 
812   /* startup stub-router configured and not yet done */
813   SET_FLAG (area->stub_router_state, OSPF_AREA_IS_STUB_ROUTED);
814 
815   OSPF_AREA_TIMER_ON (area->t_stub_router, ospf_stub_router_timer,
816                       area->ospf->stub_router_startup_time);
817 }
818 
819 /* Create new router-LSA. */
820 static struct ospf_lsa *
ospf_router_lsa_new(struct ospf_area * area)821 ospf_router_lsa_new (struct ospf_area *area)
822 {
823   struct ospf *ospf = area->ospf;
824   struct stream *s;
825   struct lsa_header *lsah;
826   struct ospf_lsa *new;
827   int length;
828 
829   if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
830     zlog_debug ("LSA[Type1]: Create router-LSA instance");
831 
832   /* check whether stub-router is desired, and if this is the first
833    * router LSA.
834    */
835   ospf_stub_router_check (area);
836 
837   /* Create a stream for LSA. */
838   s = stream_new (OSPF_MAX_LSA_SIZE);
839   /* Set LSA common header fields. */
840   lsa_header_set (s, LSA_OPTIONS_GET (area) | LSA_OPTIONS_NSSA_GET (area),
841 		  OSPF_ROUTER_LSA, ospf->router_id, ospf->router_id);
842 
843   /* Set router-LSA body fields. */
844   ospf_router_lsa_body_set (s, area);
845 
846   /* Set length. */
847   length = stream_get_endp (s);
848   lsah = (struct lsa_header *) STREAM_DATA (s);
849   lsah->length = htons (length);
850 
851   /* Now, create OSPF LSA instance. */
852   if ( (new = ospf_lsa_new ()) == NULL)
853     {
854       zlog_err ("%s: Unable to create new lsa", __func__);
855       return NULL;
856     }
857 
858   new->area = area;
859   SET_FLAG (new->flags, OSPF_LSA_SELF | OSPF_LSA_SELF_CHECKED);
860 
861   /* Copy LSA data to store, discard stream. */
862   new->data = ospf_lsa_data_new (length);
863   memcpy (new->data, lsah, length);
864   stream_free (s);
865 
866   return new;
867 }
868 
869 /* Originate Router-LSA. */
870 static struct ospf_lsa *
ospf_router_lsa_originate(struct ospf_area * area)871 ospf_router_lsa_originate (struct ospf_area *area)
872 {
873   struct ospf_lsa *new;
874 
875   /* Create new router-LSA instance. */
876   if ( (new = ospf_router_lsa_new (area)) == NULL)
877     {
878       zlog_err ("%s: ospf_router_lsa_new returned NULL", __func__);
879       return NULL;
880     }
881 
882   /* Sanity check. */
883   if (new->data->adv_router.s_addr == 0)
884     {
885       if (IS_DEBUG_OSPF_EVENT)
886 	zlog_debug ("LSA[Type1]: AdvRouter is 0, discard");
887       ospf_lsa_discard (new);
888       return NULL;
889     }
890 
891   /* Install LSA to LSDB. */
892   new = ospf_lsa_install (area->ospf, NULL, new);
893 
894   /* Update LSA origination count. */
895   area->ospf->lsa_originate_count++;
896 
897   /* Flooding new LSA through area. */
898   ospf_flood_through_area (area, NULL, new);
899 
900   if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
901     {
902       zlog_debug ("LSA[Type%d:%s]: Originate router-LSA %p",
903 		 new->data->type, inet_ntoa (new->data->id), (void *)new);
904       ospf_lsa_header_dump (new->data);
905     }
906 
907   return new;
908 }
909 
910 /* Refresh router-LSA. */
911 static struct ospf_lsa *
ospf_router_lsa_refresh(struct ospf_lsa * lsa)912 ospf_router_lsa_refresh (struct ospf_lsa *lsa)
913 {
914   struct ospf_area *area = lsa->area;
915   struct ospf_lsa *new;
916 
917   /* Sanity check. */
918   assert (lsa->data);
919 
920   /* Delete LSA from neighbor retransmit-list. */
921   ospf_ls_retransmit_delete_nbr_area (area, lsa);
922 
923   /* Unregister LSA from refresh-list */
924   ospf_refresher_unregister_lsa (area->ospf, lsa);
925 
926   /* Create new router-LSA instance. */
927   if ( (new = ospf_router_lsa_new (area)) == NULL)
928     {
929       zlog_err ("%s: ospf_router_lsa_new returned NULL", __func__);
930       return NULL;
931     }
932 
933   new->data->ls_seqnum = lsa_seqnum_increment (lsa);
934 
935   ospf_lsa_install (area->ospf, NULL, new);
936 
937   /* Flood LSA through area. */
938   ospf_flood_through_area (area, NULL, new);
939 
940   /* Debug logging. */
941   if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
942     {
943       zlog_debug ("LSA[Type%d:%s]: router-LSA refresh",
944 		 new->data->type, inet_ntoa (new->data->id));
945       ospf_lsa_header_dump (new->data);
946     }
947 
948   return NULL;
949 }
950 
951 int
ospf_router_lsa_update_area(struct ospf_area * area)952 ospf_router_lsa_update_area (struct ospf_area *area)
953 {
954   if (IS_DEBUG_OSPF_EVENT)
955     zlog_debug ("[router-LSA]: (router-LSA area update)");
956 
957   /* Now refresh router-LSA. */
958   if (area->router_lsa_self)
959     ospf_lsa_refresh (area->ospf, area->router_lsa_self);
960   /* Newly originate router-LSA. */
961   else
962     ospf_router_lsa_originate (area);
963 
964   return 0;
965 }
966 
967 int
ospf_router_lsa_update(struct ospf * ospf)968 ospf_router_lsa_update (struct ospf *ospf)
969 {
970   struct listnode *node, *nnode;
971   struct ospf_area *area;
972 
973   if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
974     zlog_debug ("Timer[router-LSA Update]: (timer expire)");
975 
976   for (ALL_LIST_ELEMENTS (ospf->areas, node, nnode, area))
977     {
978       struct ospf_lsa *lsa = area->router_lsa_self;
979       struct router_lsa *rl;
980       const char *area_str;
981 
982       /* Keep Area ID string. */
983       area_str = AREA_NAME (area);
984 
985       /* If LSA not exist in this Area, originate new. */
986       if (lsa == NULL)
987         {
988 	  if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
989 	    zlog_debug("LSA[Type1]: Create router-LSA for Area %s", area_str);
990 
991 	  ospf_router_lsa_originate (area);
992         }
993       /* If router-ID is changed, Link ID must change.
994 	 First flush old LSA, then originate new. */
995       else if (!IPV4_ADDR_SAME (&lsa->data->id, &ospf->router_id))
996 	{
997 	  if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
998 	    zlog_debug("LSA[Type%d:%s]: Refresh router-LSA for Area %s",
999 		      lsa->data->type, inet_ntoa (lsa->data->id), area_str);
1000           ospf_refresher_unregister_lsa (ospf, lsa);
1001 	  ospf_lsa_flush_area (lsa, area);
1002 	  ospf_lsa_unlock (&area->router_lsa_self);
1003 	  area->router_lsa_self = NULL;
1004 
1005 	  /* Refresh router-LSA, (not install) and flood through area. */
1006 	  ospf_router_lsa_update_area (area);
1007 	}
1008       else
1009 	{
1010 	  rl = (struct router_lsa *) lsa->data;
1011 	  /* Refresh router-LSA, (not install) and flood through area. */
1012 	  if (rl->flags != ospf->flags)
1013 	    ospf_router_lsa_update_area (area);
1014 	}
1015     }
1016 
1017   return 0;
1018 }
1019 
1020 
1021 /* network-LSA related functions. */
1022 /* Originate Network-LSA. */
1023 static void
ospf_network_lsa_body_set(struct stream * s,struct ospf_interface * oi)1024 ospf_network_lsa_body_set (struct stream *s, struct ospf_interface *oi)
1025 {
1026   struct in_addr mask;
1027   struct route_node *rn;
1028   struct ospf_neighbor *nbr;
1029 
1030   masklen2ip (oi->address->prefixlen, &mask);
1031   stream_put_ipv4 (s, mask.s_addr);
1032 
1033   /* The network-LSA lists those routers that are fully adjacent to
1034     the Designated Router; each fully adjacent router is identified by
1035     its OSPF Router ID.  The Designated Router includes itself in this
1036     list. RFC2328, Section 12.4.2 */
1037 
1038   for (rn = route_top (oi->nbrs); rn; rn = route_next (rn))
1039     if ((nbr = rn->info) != NULL)
1040       if (nbr->state == NSM_Full || nbr == oi->nbr_self)
1041 	stream_put_ipv4 (s, nbr->router_id.s_addr);
1042 }
1043 
1044 static struct ospf_lsa *
ospf_network_lsa_new(struct ospf_interface * oi)1045 ospf_network_lsa_new (struct ospf_interface *oi)
1046 {
1047   struct stream *s;
1048   struct ospf_lsa *new;
1049   struct lsa_header *lsah;
1050   struct ospf_if_params *oip;
1051   int length;
1052 
1053   /* If there are no neighbours on this network (the net is stub),
1054      the router does not originate network-LSA (see RFC 12.4.2) */
1055   if (oi->full_nbrs == 0)
1056     return NULL;
1057 
1058   if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
1059     zlog_debug ("LSA[Type2]: Create network-LSA instance");
1060 
1061   /* Create new stream for LSA. */
1062   s = stream_new (OSPF_MAX_LSA_SIZE);
1063   lsah = (struct lsa_header *) STREAM_DATA (s);
1064 
1065   lsa_header_set (s, (OPTIONS (oi) | LSA_OPTIONS_GET (oi->area)),
1066 		  OSPF_NETWORK_LSA, DR (oi), oi->ospf->router_id);
1067 
1068   /* Set network-LSA body fields. */
1069   ospf_network_lsa_body_set (s, oi);
1070 
1071   /* Set length. */
1072   length = stream_get_endp (s);
1073   lsah->length = htons (length);
1074 
1075   /* Create OSPF LSA instance. */
1076   if ( (new = ospf_lsa_new ()) == NULL)
1077     {
1078       zlog_err ("%s: ospf_lsa_new returned NULL", __func__);
1079       return NULL;
1080     }
1081 
1082   new->area = oi->area;
1083   SET_FLAG (new->flags, OSPF_LSA_SELF | OSPF_LSA_SELF_CHECKED);
1084 
1085   /* Copy LSA to store. */
1086   new->data = ospf_lsa_data_new (length);
1087   memcpy (new->data, lsah, length);
1088   stream_free (s);
1089 
1090   /* Remember prior network LSA sequence numbers, even if we stop
1091    * originating one for this oi, to try avoid re-originating LSAs with a
1092    * prior sequence number, and thus speed up adjency forming & convergence.
1093    */
1094   if ((oip = ospf_lookup_if_params (oi->ifp, oi->address->u.prefix4)))
1095     {
1096       new->data->ls_seqnum = oip->network_lsa_seqnum;
1097       new->data->ls_seqnum = lsa_seqnum_increment (new);
1098     }
1099   else
1100     {
1101       oip = ospf_get_if_params (oi->ifp, oi->address->u.prefix4);
1102       ospf_if_update_params (oi->ifp, oi->address->u.prefix4);
1103     }
1104   oip->network_lsa_seqnum = new->data->ls_seqnum;
1105 
1106   return new;
1107 }
1108 
1109 /* Originate network-LSA. */
1110 void
ospf_network_lsa_update(struct ospf_interface * oi)1111 ospf_network_lsa_update (struct ospf_interface *oi)
1112 {
1113   struct ospf_lsa *new;
1114 
1115   if (oi->network_lsa_self != NULL)
1116     {
1117       ospf_lsa_refresh (oi->ospf, oi->network_lsa_self);
1118       return;
1119     }
1120 
1121   /* Create new network-LSA instance. */
1122   new = ospf_network_lsa_new (oi);
1123   if (new == NULL)
1124     return;
1125 
1126   /* Install LSA to LSDB. */
1127   new = ospf_lsa_install (oi->ospf, oi, new);
1128 
1129   /* Update LSA origination count. */
1130   oi->ospf->lsa_originate_count++;
1131 
1132   /* Flooding new LSA through area. */
1133   ospf_flood_through_area (oi->area, NULL, new);
1134 
1135   if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
1136     {
1137       zlog_debug ("LSA[Type%d:%s]: Originate network-LSA %p",
1138 		 new->data->type, inet_ntoa (new->data->id), (void *)new);
1139       ospf_lsa_header_dump (new->data);
1140     }
1141 
1142   return;
1143 }
1144 
1145 static struct ospf_lsa *
ospf_network_lsa_refresh(struct ospf_lsa * lsa)1146 ospf_network_lsa_refresh (struct ospf_lsa *lsa)
1147 {
1148   struct ospf_area *area = lsa->area;
1149   struct ospf_lsa *new, *new2;
1150   struct ospf_if_params *oip;
1151   struct ospf_interface *oi;
1152 
1153   assert (lsa->data);
1154 
1155   /* Retrieve the oi for the network LSA */
1156   oi = ospf_if_lookup_by_local_addr (area->ospf, NULL, lsa->data->id);
1157   if (oi == NULL)
1158     {
1159       if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
1160         {
1161           zlog_debug ("LSA[Type%d:%s]: network-LSA refresh: "
1162                       "no oi found, ick, ignoring.",
1163 		      lsa->data->type, inet_ntoa (lsa->data->id));
1164           ospf_lsa_header_dump (lsa->data);
1165         }
1166       return NULL;
1167     }
1168   /* Delete LSA from neighbor retransmit-list. */
1169   ospf_ls_retransmit_delete_nbr_area (area, lsa);
1170 
1171   /* Unregister LSA from refresh-list */
1172   ospf_refresher_unregister_lsa (area->ospf, lsa);
1173 
1174   /* Create new network-LSA instance. */
1175   new = ospf_network_lsa_new (oi);
1176   if (new == NULL)
1177     return NULL;
1178 
1179   oip = ospf_lookup_if_params (oi->ifp, oi->address->u.prefix4);
1180   assert (oip != NULL);
1181   oip->network_lsa_seqnum = new->data->ls_seqnum = lsa_seqnum_increment (lsa);
1182 
1183   new2 = ospf_lsa_install (area->ospf, oi, new);
1184 
1185   assert (new2 == new);
1186 
1187   /* Flood LSA through aera. */
1188   ospf_flood_through_area (area, NULL, new);
1189 
1190   if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
1191     {
1192       zlog_debug ("LSA[Type%d:%s]: network-LSA refresh",
1193 		 new->data->type, inet_ntoa (new->data->id));
1194       ospf_lsa_header_dump (new->data);
1195     }
1196 
1197   return new;
1198 }
1199 
1200 static void
stream_put_ospf_metric(struct stream * s,u_int32_t metric_value)1201 stream_put_ospf_metric (struct stream *s, u_int32_t metric_value)
1202 {
1203   u_int32_t metric;
1204   char *mp;
1205 
1206   /* Put 0 metric. TOS metric is not supported. */
1207   metric = htonl (metric_value);
1208   mp = (char *) &metric;
1209   mp++;
1210   stream_put (s, mp, 3);
1211 }
1212 
1213 /* summary-LSA related functions. */
1214 static void
ospf_summary_lsa_body_set(struct stream * s,struct prefix * p,u_int32_t metric)1215 ospf_summary_lsa_body_set (struct stream *s, struct prefix *p,
1216 			   u_int32_t metric)
1217 {
1218   struct in_addr mask;
1219 
1220   masklen2ip (p->prefixlen, &mask);
1221 
1222   /* Put Network Mask. */
1223   stream_put_ipv4 (s, mask.s_addr);
1224 
1225   /* Set # TOS. */
1226   stream_putc (s, (u_char) 0);
1227 
1228   /* Set metric. */
1229   stream_put_ospf_metric (s, metric);
1230 }
1231 
1232 static struct ospf_lsa *
ospf_summary_lsa_new(struct ospf_area * area,struct prefix * p,u_int32_t metric,struct in_addr id)1233 ospf_summary_lsa_new (struct ospf_area *area, struct prefix *p,
1234 		      u_int32_t metric, struct in_addr id)
1235 {
1236   struct stream *s;
1237   struct ospf_lsa *new;
1238   struct lsa_header *lsah;
1239   int length;
1240 
1241   if (id.s_addr == 0xffffffff)
1242     {
1243       /* Maybe Link State ID not available. */
1244       if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
1245         zlog_debug ("LSA[Type%d]: Link ID not available, can't originate",
1246                     OSPF_SUMMARY_LSA);
1247       return NULL;
1248     }
1249 
1250   if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
1251     zlog_debug ("LSA[Type3]: Create summary-LSA instance");
1252 
1253   /* Create new stream for LSA. */
1254   s = stream_new (OSPF_MAX_LSA_SIZE);
1255   lsah = (struct lsa_header *) STREAM_DATA (s);
1256 
1257   lsa_header_set (s, LSA_OPTIONS_GET (area), OSPF_SUMMARY_LSA,
1258 		  id, area->ospf->router_id);
1259 
1260   /* Set summary-LSA body fields. */
1261   ospf_summary_lsa_body_set (s, p, metric);
1262 
1263   /* Set length. */
1264   length = stream_get_endp (s);
1265   lsah->length = htons (length);
1266 
1267   /* Create OSPF LSA instance. */
1268   new = ospf_lsa_new ();
1269   new->area = area;
1270   SET_FLAG (new->flags, OSPF_LSA_SELF | OSPF_LSA_SELF_CHECKED);
1271 
1272   /* Copy LSA to store. */
1273   new->data = ospf_lsa_data_new (length);
1274   memcpy (new->data, lsah, length);
1275   stream_free (s);
1276 
1277   return new;
1278 }
1279 
1280 /* Originate Summary-LSA. */
1281 struct ospf_lsa *
ospf_summary_lsa_originate(struct prefix_ipv4 * p,u_int32_t metric,struct ospf_area * area)1282 ospf_summary_lsa_originate (struct prefix_ipv4 *p, u_int32_t metric,
1283 			    struct ospf_area *area)
1284 {
1285   struct ospf_lsa *new;
1286   struct in_addr id;
1287 
1288   id = ospf_lsa_unique_id (area->ospf, area->lsdb, OSPF_SUMMARY_LSA, p);
1289 
1290   if (id.s_addr == 0xffffffff)
1291     {
1292       /* Maybe Link State ID not available. */
1293       if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
1294         zlog_debug ("LSA[Type%d]: Link ID not available, can't originate",
1295                     OSPF_SUMMARY_LSA);
1296       return NULL;
1297     }
1298 
1299   /* Create new summary-LSA instance. */
1300   if ( !(new = ospf_summary_lsa_new (area, (struct prefix *) p, metric, id)))
1301     return NULL;
1302 
1303   /* Instlal LSA to LSDB. */
1304   new = ospf_lsa_install (area->ospf, NULL, new);
1305 
1306   /* Update LSA origination count. */
1307   area->ospf->lsa_originate_count++;
1308 
1309   /* Flooding new LSA through area. */
1310   ospf_flood_through_area (area, NULL, new);
1311 
1312   if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
1313     {
1314       zlog_debug ("LSA[Type%d:%s]: Originate summary-LSA %p",
1315 		 new->data->type, inet_ntoa (new->data->id), (void *)new);
1316       ospf_lsa_header_dump (new->data);
1317     }
1318 
1319   return new;
1320 }
1321 
1322 static struct ospf_lsa*
ospf_summary_lsa_refresh(struct ospf * ospf,struct ospf_lsa * lsa)1323 ospf_summary_lsa_refresh (struct ospf *ospf, struct ospf_lsa *lsa)
1324 {
1325   struct ospf_lsa *new;
1326   struct summary_lsa *sl;
1327   struct prefix p;
1328 
1329   /* Sanity check. */
1330   assert (lsa->data);
1331 
1332   sl = (struct summary_lsa *)lsa->data;
1333   p.prefixlen = ip_masklen (sl->mask);
1334   new = ospf_summary_lsa_new (lsa->area, &p, GET_METRIC (sl->metric),
1335 			      sl->header.id);
1336 
1337   if (!new)
1338     return NULL;
1339 
1340   new->data->ls_seqnum = lsa_seqnum_increment (lsa);
1341 
1342   ospf_lsa_install (ospf, NULL, new);
1343 
1344   /* Flood LSA through AS. */
1345   ospf_flood_through_area (new->area, NULL, new);
1346 
1347   /* Debug logging. */
1348   if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
1349     {
1350       zlog_debug ("LSA[Type%d:%s]: summary-LSA refresh",
1351 		 new->data->type, inet_ntoa (new->data->id));
1352       ospf_lsa_header_dump (new->data);
1353     }
1354 
1355   return new;
1356 }
1357 
1358 
1359 /* summary-ASBR-LSA related functions. */
1360 static void
ospf_summary_asbr_lsa_body_set(struct stream * s,struct prefix * p,u_int32_t metric)1361 ospf_summary_asbr_lsa_body_set (struct stream *s, struct prefix *p,
1362 				u_int32_t metric)
1363 {
1364   /* Put Network Mask. */
1365   stream_put_ipv4 (s, (u_int32_t) 0);
1366 
1367   /* Set # TOS. */
1368   stream_putc (s, (u_char) 0);
1369 
1370   /* Set metric. */
1371   stream_put_ospf_metric (s, metric);
1372 }
1373 
1374 static struct ospf_lsa *
ospf_summary_asbr_lsa_new(struct ospf_area * area,struct prefix * p,u_int32_t metric,struct in_addr id)1375 ospf_summary_asbr_lsa_new (struct ospf_area *area, struct prefix *p,
1376 			   u_int32_t metric, struct in_addr id)
1377 {
1378   struct stream *s;
1379   struct ospf_lsa *new;
1380   struct lsa_header *lsah;
1381   int length;
1382 
1383   if (id.s_addr == 0xffffffff)
1384     {
1385       /* Maybe Link State ID not available. */
1386       if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
1387         zlog_debug ("LSA[Type%d]: Link ID not available, can't originate",
1388                     OSPF_ASBR_SUMMARY_LSA);
1389       return NULL;
1390     }
1391 
1392   if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
1393     zlog_debug ("LSA[Type3]: Create summary-LSA instance");
1394 
1395   /* Create new stream for LSA. */
1396   s = stream_new (OSPF_MAX_LSA_SIZE);
1397   lsah = (struct lsa_header *) STREAM_DATA (s);
1398 
1399   lsa_header_set (s, LSA_OPTIONS_GET (area), OSPF_ASBR_SUMMARY_LSA,
1400 		  id, area->ospf->router_id);
1401 
1402   /* Set summary-LSA body fields. */
1403   ospf_summary_asbr_lsa_body_set (s, p, metric);
1404 
1405   /* Set length. */
1406   length = stream_get_endp (s);
1407   lsah->length = htons (length);
1408 
1409   /* Create OSPF LSA instance. */
1410   new = ospf_lsa_new ();
1411   new->area = area;
1412   SET_FLAG (new->flags, OSPF_LSA_SELF | OSPF_LSA_SELF_CHECKED);
1413 
1414   /* Copy LSA to store. */
1415   new->data = ospf_lsa_data_new (length);
1416   memcpy (new->data, lsah, length);
1417   stream_free (s);
1418 
1419   return new;
1420 }
1421 
1422 /* Originate summary-ASBR-LSA. */
1423 struct ospf_lsa *
ospf_summary_asbr_lsa_originate(struct prefix_ipv4 * p,u_int32_t metric,struct ospf_area * area)1424 ospf_summary_asbr_lsa_originate (struct prefix_ipv4 *p, u_int32_t metric,
1425 				 struct ospf_area *area)
1426 {
1427   struct ospf_lsa *new;
1428   struct in_addr id;
1429 
1430   id = ospf_lsa_unique_id (area->ospf, area->lsdb, OSPF_ASBR_SUMMARY_LSA, p);
1431 
1432   if (id.s_addr == 0xffffffff)
1433     {
1434       /* Maybe Link State ID not available. */
1435       if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
1436         zlog_debug ("LSA[Type%d]: Link ID not available, can't originate",
1437                     OSPF_ASBR_SUMMARY_LSA);
1438       return NULL;
1439     }
1440 
1441   /* Create new summary-LSA instance. */
1442   new = ospf_summary_asbr_lsa_new (area, (struct prefix *) p, metric, id);
1443   if (!new)
1444     return NULL;
1445 
1446   /* Install LSA to LSDB. */
1447   new = ospf_lsa_install (area->ospf, NULL, new);
1448 
1449   /* Update LSA origination count. */
1450   area->ospf->lsa_originate_count++;
1451 
1452   /* Flooding new LSA through area. */
1453   ospf_flood_through_area (area, NULL, new);
1454 
1455   if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
1456     {
1457       zlog_debug ("LSA[Type%d:%s]: Originate summary-ASBR-LSA %p",
1458 		 new->data->type, inet_ntoa (new->data->id), (void *)new);
1459       ospf_lsa_header_dump (new->data);
1460     }
1461 
1462   return new;
1463 }
1464 
1465 static struct ospf_lsa*
ospf_summary_asbr_lsa_refresh(struct ospf * ospf,struct ospf_lsa * lsa)1466 ospf_summary_asbr_lsa_refresh (struct ospf *ospf, struct ospf_lsa *lsa)
1467 {
1468   struct ospf_lsa *new;
1469   struct summary_lsa *sl;
1470   struct prefix p;
1471 
1472   /* Sanity check. */
1473   assert (lsa->data);
1474 
1475   sl = (struct summary_lsa *)lsa->data;
1476   p.prefixlen = ip_masklen (sl->mask);
1477   new = ospf_summary_asbr_lsa_new (lsa->area, &p, GET_METRIC (sl->metric),
1478 				   sl->header.id);
1479   if (!new)
1480     return NULL;
1481 
1482   new->data->ls_seqnum = lsa_seqnum_increment (lsa);
1483 
1484   ospf_lsa_install (ospf, NULL, new);
1485 
1486   /* Flood LSA through area. */
1487   ospf_flood_through_area (new->area, NULL, new);
1488 
1489   if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
1490     {
1491       zlog_debug ("LSA[Type%d:%s]: summary-ASBR-LSA refresh",
1492 		 new->data->type, inet_ntoa (new->data->id));
1493       ospf_lsa_header_dump (new->data);
1494     }
1495 
1496   return new;
1497 }
1498 
1499 /* AS-external-LSA related functions. */
1500 
1501 /* Get nexthop for AS-external-LSAs.  Return nexthop if its interface
1502    is connected, else 0*/
1503 static struct in_addr
ospf_external_lsa_nexthop_get(struct ospf * ospf,struct in_addr nexthop)1504 ospf_external_lsa_nexthop_get (struct ospf *ospf, struct in_addr nexthop)
1505 {
1506   struct in_addr fwd;
1507   struct prefix nh;
1508   struct listnode *node;
1509   struct ospf_interface *oi;
1510 
1511   fwd.s_addr = 0;
1512 
1513   if (!nexthop.s_addr)
1514     return fwd;
1515 
1516   /* Check whether nexthop is covered by OSPF network. */
1517   nh.family = AF_INET;
1518   nh.u.prefix4 = nexthop;
1519   nh.prefixlen = IPV4_MAX_BITLEN;
1520 
1521   /* XXX/SCALE: If there were a lot of oi's on an ifp, then it'd be
1522    * better to make use of the per-ifp table of ois.
1523    */
1524   for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi))
1525     if (if_is_operative (oi->ifp))
1526       if (oi->address->family == AF_INET)
1527         if (prefix_match (oi->address, &nh))
1528           return nexthop;
1529 
1530   return fwd;
1531 }
1532 
1533 /* NSSA-external-LSA related functions. */
1534 
1535 /* Get 1st IP connection for Forward Addr */
1536 
1537 struct in_addr
ospf_get_ip_from_ifp(struct ospf_interface * oi)1538 ospf_get_ip_from_ifp (struct ospf_interface *oi)
1539 {
1540   struct in_addr fwd;
1541 
1542   fwd.s_addr = 0;
1543 
1544   if (if_is_operative (oi->ifp))
1545     return oi->address->u.prefix4;
1546 
1547   return fwd;
1548 }
1549 
1550 /* Get 1st IP connection for Forward Addr */
1551 struct in_addr
ospf_get_nssa_ip(struct ospf_area * area)1552 ospf_get_nssa_ip (struct ospf_area *area)
1553 {
1554   struct in_addr fwd;
1555   struct in_addr best_default;
1556   struct listnode *node;
1557   struct ospf_interface *oi;
1558 
1559   fwd.s_addr = 0;
1560   best_default.s_addr = 0;
1561 
1562   for (ALL_LIST_ELEMENTS_RO (area->ospf->oiflist, node, oi))
1563     {
1564       if (if_is_operative (oi->ifp))
1565 	if (oi->area->external_routing == OSPF_AREA_NSSA)
1566 	  if (oi->address && oi->address->family == AF_INET)
1567 	    {
1568 	      if (best_default.s_addr == 0)
1569 		best_default = oi->address->u.prefix4;
1570 	      if (oi->area == area)
1571 		return oi->address->u.prefix4;
1572 	    }
1573     }
1574   if (best_default.s_addr != 0)
1575     return best_default;
1576 
1577   if (best_default.s_addr != 0)
1578     return best_default;
1579 
1580   return fwd;
1581 }
1582 
1583 #define DEFAULT_DEFAULT_METRIC	             20
1584 #define DEFAULT_DEFAULT_ORIGINATE_METRIC     10
1585 #define DEFAULT_DEFAULT_ALWAYS_METRIC	      1
1586 
1587 #define DEFAULT_METRIC_TYPE		     EXTERNAL_METRIC_TYPE_2
1588 
1589 int
metric_type(struct ospf * ospf,u_char src)1590 metric_type (struct ospf *ospf, u_char src)
1591 {
1592   return (ospf->dmetric[src].type < 0 ?
1593 	  DEFAULT_METRIC_TYPE : ospf->dmetric[src].type);
1594 }
1595 
1596 int
metric_value(struct ospf * ospf,u_char src)1597 metric_value (struct ospf *ospf, u_char src)
1598 {
1599   if (ospf->dmetric[src].value < 0)
1600     {
1601       if (src == DEFAULT_ROUTE)
1602 	{
1603 	  if (ospf->default_originate == DEFAULT_ORIGINATE_ZEBRA)
1604 	    return DEFAULT_DEFAULT_ORIGINATE_METRIC;
1605 	  else
1606 	    return DEFAULT_DEFAULT_ALWAYS_METRIC;
1607 	}
1608       else if (ospf->default_metric < 0)
1609 	return DEFAULT_DEFAULT_METRIC;
1610       else
1611 	return ospf->default_metric;
1612     }
1613 
1614   return ospf->dmetric[src].value;
1615 }
1616 
1617 /* Set AS-external-LSA body. */
1618 static void
ospf_external_lsa_body_set(struct stream * s,struct external_info * ei,struct ospf * ospf)1619 ospf_external_lsa_body_set (struct stream *s, struct external_info *ei,
1620 			    struct ospf *ospf)
1621 {
1622   struct prefix_ipv4 *p = &ei->p;
1623   struct in_addr mask, fwd_addr;
1624   u_int32_t mvalue;
1625   int mtype;
1626   int type;
1627 
1628   /* Put Network Mask. */
1629   masklen2ip (p->prefixlen, &mask);
1630   stream_put_ipv4 (s, mask.s_addr);
1631 
1632   /* If prefix is default, specify DEFAULT_ROUTE. */
1633   type = is_prefix_default (&ei->p) ? DEFAULT_ROUTE : ei->type;
1634 
1635   mtype = (ROUTEMAP_METRIC_TYPE (ei) != -1) ?
1636     ROUTEMAP_METRIC_TYPE (ei) : metric_type (ospf, type);
1637 
1638   mvalue = (ROUTEMAP_METRIC (ei) != -1) ?
1639     ROUTEMAP_METRIC (ei) : metric_value (ospf, type);
1640 
1641   /* Put type of external metric. */
1642   stream_putc (s, (mtype == EXTERNAL_METRIC_TYPE_2 ? 0x80 : 0));
1643 
1644   /* Put 0 metric. TOS metric is not supported. */
1645   stream_put_ospf_metric (s, mvalue);
1646 
1647   /* Get forwarding address to nexthop if on the Connection List, else 0. */
1648   fwd_addr = ospf_external_lsa_nexthop_get (ospf, ei->nexthop);
1649 
1650   /* Put forwarding address. */
1651   stream_put_ipv4 (s, fwd_addr.s_addr);
1652 
1653   /* Put route tag */
1654   stream_putl (s, ei->tag);
1655 }
1656 
1657 /* Create new external-LSA. */
1658 static struct ospf_lsa *
ospf_external_lsa_new(struct ospf * ospf,struct external_info * ei,struct in_addr * old_id)1659 ospf_external_lsa_new (struct ospf *ospf,
1660 		       struct external_info *ei, struct in_addr *old_id)
1661 {
1662   struct stream *s;
1663   struct lsa_header *lsah;
1664   struct ospf_lsa *new;
1665   struct in_addr id;
1666   int length;
1667 
1668   if (ei == NULL)
1669     {
1670       if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
1671 	zlog_debug ("LSA[Type5]: External info is NULL, can't originate");
1672       return NULL;
1673     }
1674 
1675   if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
1676     zlog_debug ("LSA[Type5]: Originate AS-external-LSA instance");
1677 
1678   /* If old Link State ID is specified, refresh LSA with same ID. */
1679   if (old_id)
1680     id = *old_id;
1681   /* Get Link State with unique ID. */
1682   else
1683     {
1684       id = ospf_lsa_unique_id (ospf, ospf->lsdb, OSPF_AS_EXTERNAL_LSA, &ei->p);
1685       if (id.s_addr == 0xffffffff)
1686 	{
1687 	  /* Maybe Link State ID not available. */
1688 	  if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
1689 	    zlog_debug ("LSA[Type5]: Link ID not available, can't originate");
1690 	  return NULL;
1691 	}
1692     }
1693 
1694   /* Create new stream for LSA. */
1695   s = stream_new (OSPF_MAX_LSA_SIZE);
1696   lsah = (struct lsa_header *) STREAM_DATA (s);
1697 
1698   /* Set LSA common header fields. */
1699   lsa_header_set (s, OSPF_OPTION_E, OSPF_AS_EXTERNAL_LSA,
1700 		  id, ospf->router_id);
1701 
1702   /* Set AS-external-LSA body fields. */
1703   ospf_external_lsa_body_set (s, ei, ospf);
1704 
1705   /* Set length. */
1706   length = stream_get_endp (s);
1707   lsah->length = htons (length);
1708 
1709   /* Now, create OSPF LSA instance. */
1710   new = ospf_lsa_new ();
1711   new->area = NULL;
1712   SET_FLAG (new->flags, OSPF_LSA_SELF | OSPF_LSA_APPROVED | OSPF_LSA_SELF_CHECKED);
1713 
1714   /* Copy LSA data to store, discard stream. */
1715   new->data = ospf_lsa_data_new (length);
1716   memcpy (new->data, lsah, length);
1717   stream_free (s);
1718 
1719   return new;
1720 }
1721 
1722 /* As Type-7 */
1723 static void
ospf_install_flood_nssa(struct ospf * ospf,struct ospf_lsa * lsa,struct external_info * ei)1724 ospf_install_flood_nssa (struct ospf *ospf,
1725 			 struct ospf_lsa *lsa, struct external_info *ei)
1726 {
1727   struct ospf_lsa *new;
1728   struct as_external_lsa *extlsa;
1729   struct ospf_area *area;
1730   struct listnode *node, *nnode;
1731 
1732   /* LSA may be a Type-5 originated via translation of a Type-7 LSA
1733    * which originated from an NSSA area. In which case it should not be
1734    * flooded back to NSSA areas.
1735    */
1736   if (CHECK_FLAG (lsa->flags, OSPF_LSA_LOCAL_XLT))
1737     return;
1738 
1739   /* NSSA Originate or Refresh (If anyNSSA)
1740 
1741   LSA is self-originated. And just installed as Type-5.
1742   Additionally, install as Type-7 LSDB for every attached NSSA.
1743 
1744   P-Bit controls which ABR performs translation to outside world; If
1745   we are an ABR....do not set the P-bit, because we send the Type-5,
1746   not as the ABR Translator, but as the ASBR owner within the AS!
1747 
1748   If we are NOT ABR, Flood through NSSA as Type-7 w/P-bit set.  The
1749   elected ABR Translator will see the P-bit, Translate, and re-flood.
1750 
1751   Later, ABR_TASK and P-bit will scan Type-7 LSDB and translate to
1752   Type-5's to non-NSSA Areas.  (it will also attempt a re-install) */
1753 
1754   for (ALL_LIST_ELEMENTS (ospf->areas, node, nnode, area))
1755     {
1756       /* Don't install Type-7 LSA's into nonNSSA area */
1757       if (area->external_routing != OSPF_AREA_NSSA)
1758         continue;
1759 
1760       /* make lsa duplicate, lock=1 */
1761       new = ospf_lsa_dup (lsa);
1762       new->area = area;
1763       new->data->type = OSPF_AS_NSSA_LSA;
1764 
1765       /* set P-bit if not ABR */
1766       if (! IS_OSPF_ABR (ospf))
1767         {
1768 	  SET_FLAG(new->data->options, OSPF_OPTION_NP);
1769 
1770 	  /* set non-zero FWD ADDR
1771 
1772 	  draft-ietf-ospf-nssa-update-09.txt
1773 
1774 	  if the network between the NSSA AS boundary router and the
1775 	  adjacent AS is advertised into OSPF as an internal OSPF route,
1776 	  the forwarding address should be the next op address as is cu
1777 	  currently done with type-5 LSAs.  If the intervening network is
1778 	  not adversited into OSPF as an internal OSPF route and the
1779 	  type-7 LSA's P-bit is set a forwarding address should be
1780 	  selected from one of the router's active OSPF inteface addresses
1781 	  which belong to the NSSA.  If no such addresses exist, then
1782 	  no type-7 LSA's with the P-bit set should originate from this
1783 	  router.   */
1784 
1785 	  /* kevinm: not updating lsa anymore, just new */
1786 	  extlsa = (struct as_external_lsa *)(new->data);
1787 
1788 	  if (extlsa->e[0].fwd_addr.s_addr == 0)
1789 	    extlsa->e[0].fwd_addr = ospf_get_nssa_ip(area); /* this NSSA area in ifp */
1790 
1791 	  if (extlsa->e[0].fwd_addr.s_addr == 0)
1792 	  {
1793 	    if (IS_DEBUG_OSPF_NSSA)
1794 	      zlog_debug ("LSA[Type-7]: Could not build FWD-ADDR");
1795 	    ospf_lsa_discard (new);
1796 	    return;
1797 	  }
1798 	}
1799 
1800       /* install also as Type-7 */
1801       ospf_lsa_install (ospf, NULL, new);   /* Remove Old, Lock New = 2 */
1802 
1803       /* will send each copy, lock=2+n */
1804       ospf_flood_through_as (ospf, NULL, new); /* all attached NSSA's, no AS/STUBs */
1805     }
1806 }
1807 
1808 static struct ospf_lsa *
ospf_lsa_translated_nssa_new(struct ospf * ospf,struct ospf_lsa * type7)1809 ospf_lsa_translated_nssa_new (struct ospf *ospf,
1810                              struct ospf_lsa *type7)
1811 {
1812 
1813   struct ospf_lsa *new;
1814   struct as_external_lsa *ext, *extnew;
1815   struct external_info ei;
1816 
1817   ext = (struct as_external_lsa *)(type7->data);
1818 
1819   /* need external_info struct, fill in bare minimum */
1820   ei.p.family = AF_INET;
1821   ei.p.prefix = type7->data->id;
1822   ei.p.prefixlen = ip_masklen (ext->mask);
1823   ei.type = ZEBRA_ROUTE_OSPF;
1824   ei.nexthop = ext->header.adv_router;
1825   ei.route_map_set.metric = -1;
1826   ei.route_map_set.metric_type = -1;
1827   ei.tag = 0;
1828 
1829   if ( (new = ospf_external_lsa_new (ospf, &ei, &type7->data->id)) == NULL)
1830   {
1831     if (IS_DEBUG_OSPF_NSSA)
1832       zlog_debug ("ospf_nssa_translate_originate(): Could not originate "
1833                  "Translated Type-5 for %s",
1834                  inet_ntoa (ei.p.prefix));
1835     return NULL;
1836   }
1837 
1838   extnew = (struct as_external_lsa *)(new->data);
1839 
1840   /* copy over Type-7 data to new */
1841   extnew->e[0].tos = ext->e[0].tos;
1842   extnew->e[0].route_tag = ext->e[0].route_tag;
1843   extnew->e[0].fwd_addr.s_addr = ext->e[0].fwd_addr.s_addr;
1844   new->data->ls_seqnum = type7->data->ls_seqnum;
1845 
1846   /* add translated flag, checksum and lock new lsa */
1847   SET_FLAG (new->flags, OSPF_LSA_LOCAL_XLT); /* Translated from 7  */
1848   new = ospf_lsa_lock (new);
1849 
1850   return new;
1851 }
1852 
1853 /* Originate Translated Type-5 for supplied Type-7 NSSA LSA */
1854 struct ospf_lsa *
ospf_translated_nssa_originate(struct ospf * ospf,struct ospf_lsa * type7)1855 ospf_translated_nssa_originate (struct ospf *ospf, struct ospf_lsa *type7)
1856 {
1857   struct ospf_lsa *new;
1858   struct as_external_lsa *extnew;
1859 
1860   /* we cant use ospf_external_lsa_originate() as we need to set
1861    * the OSPF_LSA_LOCAL_XLT flag, must originate by hand
1862    */
1863 
1864   if ( (new = ospf_lsa_translated_nssa_new (ospf, type7)) == NULL)
1865     {
1866       if (IS_DEBUG_OSPF_NSSA)
1867         zlog_debug ("ospf_translated_nssa_originate(): Could not translate "
1868                  "Type-7, Id %s, to Type-5",
1869                  inet_ntoa (type7->data->id));
1870       return NULL;
1871     }
1872 
1873   extnew = (struct as_external_lsa *)new;
1874 
1875   if (IS_DEBUG_OSPF_NSSA)
1876     {
1877       zlog_debug ("ospf_translated_nssa_originate(): "
1878                  "translated Type 7, installed:");
1879       ospf_lsa_header_dump (new->data);
1880       zlog_debug ("   Network mask: %d",ip_masklen (extnew->mask));
1881       zlog_debug ("   Forward addr: %s", inet_ntoa (extnew->e[0].fwd_addr));
1882     }
1883 
1884   if ( (new = ospf_lsa_install (ospf, NULL, new)) == NULL)
1885     {
1886       if (IS_DEBUG_OSPF_NSSA)
1887         zlog_debug ("ospf_lsa_translated_nssa_originate(): "
1888                    "Could not install LSA "
1889                    "id %s", inet_ntoa (type7->data->id));
1890       return NULL;
1891     }
1892 
1893   ospf->lsa_originate_count++;
1894   ospf_flood_through_as (ospf, NULL, new);
1895 
1896   return new;
1897 }
1898 
1899 /* Refresh Translated from NSSA AS-external-LSA. */
1900 struct ospf_lsa *
ospf_translated_nssa_refresh(struct ospf * ospf,struct ospf_lsa * type7,struct ospf_lsa * type5)1901 ospf_translated_nssa_refresh (struct ospf *ospf, struct ospf_lsa *type7,
1902                               struct ospf_lsa *type5)
1903 {
1904   struct ospf_lsa *new = NULL;
1905 
1906   /* Sanity checks. */
1907   assert (type7 || type5);
1908   if (!(type7 || type5))
1909     return NULL;
1910   if (type7)
1911     assert (type7->data);
1912   if (type5)
1913     assert (type5->data);
1914   assert (ospf->anyNSSA);
1915 
1916   /* get required data according to what has been given */
1917   if (type7 && type5 == NULL)
1918     {
1919       /* find the translated Type-5 for this Type-7 */
1920       struct as_external_lsa *ext = (struct as_external_lsa *)(type7->data);
1921       struct prefix_ipv4 p =
1922         {
1923           .prefix = type7->data->id,
1924           .prefixlen = ip_masklen (ext->mask),
1925           .family = AF_INET,
1926         };
1927 
1928       type5 = ospf_external_info_find_lsa (ospf, &p);
1929     }
1930   else if (type5 && type7 == NULL)
1931     {
1932       /* find the type-7 from which supplied type-5 was translated,
1933        * ie find first type-7 with same LSA Id.
1934        */
1935       struct listnode *ln, *lnn;
1936       struct route_node *rn;
1937       struct ospf_lsa *lsa;
1938       struct ospf_area *area;
1939 
1940       for (ALL_LIST_ELEMENTS (ospf->areas, ln, lnn, area))
1941         {
1942           if (area->external_routing != OSPF_AREA_NSSA
1943               && !type7)
1944             continue;
1945 
1946           LSDB_LOOP (NSSA_LSDB(area), rn, lsa)
1947             {
1948               if (lsa->data->id.s_addr == type5->data->id.s_addr)
1949                 {
1950                   type7 = lsa;
1951                   break;
1952                 }
1953             }
1954         }
1955     }
1956 
1957   /* do we have type7? */
1958   if (!type7)
1959     {
1960       if (IS_DEBUG_OSPF_NSSA)
1961         zlog_debug ("ospf_translated_nssa_refresh(): no Type-7 found for "
1962                    "Type-5 LSA Id %s",
1963                    inet_ntoa (type5->data->id));
1964       return NULL;
1965     }
1966 
1967   /* do we have valid translated type5? */
1968   if (type5 == NULL || !CHECK_FLAG (type5->flags, OSPF_LSA_LOCAL_XLT) )
1969     {
1970       if (IS_DEBUG_OSPF_NSSA)
1971         zlog_debug ("ospf_translated_nssa_refresh(): No translated Type-5 "
1972                    "found for Type-7 with Id %s",
1973                    inet_ntoa (type7->data->id));
1974       return NULL;
1975     }
1976 
1977   /* Delete LSA from neighbor retransmit-list. */
1978   ospf_ls_retransmit_delete_nbr_as (ospf, type5);
1979 
1980   /* create new translated LSA */
1981   if ( (new = ospf_lsa_translated_nssa_new (ospf, type7)) == NULL)
1982     {
1983       if (IS_DEBUG_OSPF_NSSA)
1984         zlog_debug ("ospf_translated_nssa_refresh(): Could not translate "
1985                    "Type-7 for %s to Type-5",
1986                    inet_ntoa (type7->data->id));
1987       return NULL;
1988     }
1989 
1990   if ( !(new = ospf_lsa_install (ospf, NULL, new)) )
1991     {
1992       if (IS_DEBUG_OSPF_NSSA)
1993         zlog_debug ("ospf_translated_nssa_refresh(): Could not install "
1994                    "translated LSA, Id %s",
1995                    inet_ntoa (type7->data->id));
1996       return NULL;
1997     }
1998 
1999   /* Flood LSA through area. */
2000   ospf_flood_through_as (ospf, NULL, new);
2001 
2002   return new;
2003 }
2004 
2005 int
is_prefix_default(struct prefix_ipv4 * p)2006 is_prefix_default (struct prefix_ipv4 *p)
2007 {
2008   struct prefix_ipv4 q;
2009 
2010   q.family = AF_INET;
2011   q.prefix.s_addr = 0;
2012   q.prefixlen = 0;
2013 
2014   return prefix_same ((struct prefix *) p, (struct prefix *) &q);
2015 }
2016 
2017 /* Originate an AS-external-LSA, install and flood. */
2018 struct ospf_lsa *
ospf_external_lsa_originate(struct ospf * ospf,struct external_info * ei)2019 ospf_external_lsa_originate (struct ospf *ospf, struct external_info *ei)
2020 {
2021   struct ospf_lsa *new;
2022 
2023   /* Added for NSSA project....
2024 
2025        External LSAs are originated in ASBRs as usual, but for NSSA systems.
2026      there is the global Type-5 LSDB and a Type-7 LSDB installed for
2027      every area.  The Type-7's are flooded to every IR and every ABR; We
2028      install the Type-5 LSDB so that the normal "refresh" code operates
2029      as usual, and flag them as not used during ASE calculations.  The
2030      Type-7 LSDB is used for calculations.  Each Type-7 has a Forwarding
2031      Address of non-zero.
2032 
2033      If an ABR is the elected NSSA translator, following SPF and during
2034      the ABR task it will translate all the scanned Type-7's, with P-bit
2035      ON and not-self generated, and translate to Type-5's throughout the
2036      non-NSSA/STUB AS.
2037 
2038      A difference in operation depends whether this ASBR is an ABR
2039      or not.  If not an ABR, the P-bit is ON, to indicate that any
2040      elected NSSA-ABR can perform its translation.
2041 
2042      If an ABR, the P-bit is OFF;  No ABR will perform translation and
2043      this ASBR will flood the Type-5 LSA as usual.
2044 
2045      For the case where this ASBR is not an ABR, the ASE calculations
2046      are based on the Type-5 LSDB;  The Type-7 LSDB exists just to
2047      demonstrate to the user that there are LSA's that belong to any
2048      attached NSSA.
2049 
2050      Finally, it just so happens that when the ABR is translating every
2051      Type-7 into Type-5, it installs it into the Type-5 LSDB as an
2052      approved Type-5 (translated from Type-7);  at the end of translation
2053      if any Translated Type-5's remain unapproved, then they must be
2054      flushed from the AS.
2055 
2056      */
2057 
2058   /* Check the AS-external-LSA should be originated. */
2059   if (!ospf_redistribute_check (ospf, ei, NULL))
2060     return NULL;
2061 
2062   /* Create new AS-external-LSA instance. */
2063   if ((new = ospf_external_lsa_new (ospf, ei, NULL)) == NULL)
2064     {
2065       if (IS_DEBUG_OSPF_EVENT)
2066 	zlog_debug ("LSA[Type5:%s]: Could not originate AS-external-LSA",
2067 		   inet_ntoa (ei->p.prefix));
2068       return NULL;
2069     }
2070 
2071   /* Install newly created LSA into Type-5 LSDB, lock = 1. */
2072   ospf_lsa_install (ospf, NULL, new);
2073 
2074   /* Update LSA origination count. */
2075   ospf->lsa_originate_count++;
2076 
2077   /* Flooding new LSA. only to AS (non-NSSA/STUB) */
2078   ospf_flood_through_as (ospf, NULL, new);
2079 
2080   /* If there is any attached NSSA, do special handling */
2081   if (ospf->anyNSSA &&
2082       /* stay away from translated LSAs! */
2083       !(CHECK_FLAG (new->flags, OSPF_LSA_LOCAL_XLT)))
2084     ospf_install_flood_nssa (ospf, new, ei); /* Install/Flood Type-7 to all NSSAs */
2085 
2086   /* Debug logging. */
2087   if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
2088     {
2089       zlog_debug ("LSA[Type%d:%s]: Originate AS-external-LSA %p",
2090 		 new->data->type, inet_ntoa (new->data->id), (void *)new);
2091       ospf_lsa_header_dump (new->data);
2092     }
2093 
2094   return new;
2095 }
2096 
2097 /* Originate AS-external-LSA from external info with initial flag. */
2098 int
ospf_external_lsa_originate_timer(struct thread * thread)2099 ospf_external_lsa_originate_timer (struct thread *thread)
2100 {
2101   struct ospf *ospf = THREAD_ARG (thread);
2102   struct route_node *rn;
2103   struct external_info *ei;
2104   struct route_table *rt;
2105   int type = THREAD_VAL (thread);
2106 
2107   ospf->t_external_lsa = NULL;
2108 
2109   /* Originate As-external-LSA from all type of distribute source. */
2110   if ((rt = EXTERNAL_INFO (type)))
2111     for (rn = route_top (rt); rn; rn = route_next (rn))
2112       if ((ei = rn->info) != NULL)
2113 	if (!is_prefix_default ((struct prefix_ipv4 *)&ei->p))
2114 	  if (!ospf_external_lsa_originate (ospf, ei))
2115 	    zlog_warn ("LSA: AS-external-LSA was not originated.");
2116 
2117   return 0;
2118 }
2119 
2120 static struct external_info *
ospf_default_external_info(struct ospf * ospf)2121 ospf_default_external_info (struct ospf *ospf)
2122 {
2123   int type;
2124   struct route_node *rn;
2125   struct prefix_ipv4 p;
2126 
2127   p.family = AF_INET;
2128   p.prefix.s_addr = 0;
2129   p.prefixlen = 0;
2130 
2131   /* First, lookup redistributed default route. */
2132   for (type = 0; type <= ZEBRA_ROUTE_MAX; type++)
2133     if (EXTERNAL_INFO (type) && type != ZEBRA_ROUTE_OSPF)
2134       {
2135 	rn = route_node_lookup (EXTERNAL_INFO (type), (struct prefix *) &p);
2136 	if (rn != NULL)
2137 	  {
2138 	    route_unlock_node (rn);
2139 	    assert (rn->info);
2140 	    if (ospf_redistribute_check (ospf, rn->info, NULL))
2141 	      return rn->info;
2142 	  }
2143       }
2144 
2145   return NULL;
2146 }
2147 
2148 int
ospf_default_originate_timer(struct thread * thread)2149 ospf_default_originate_timer (struct thread *thread)
2150 {
2151   struct prefix_ipv4 p;
2152   struct in_addr nexthop;
2153   struct external_info *ei;
2154   struct ospf *ospf;
2155 
2156   ospf = THREAD_ARG (thread);
2157 
2158   p.family = AF_INET;
2159   p.prefix.s_addr = 0;
2160   p.prefixlen = 0;
2161 
2162   if (ospf->default_originate == DEFAULT_ORIGINATE_ALWAYS)
2163     {
2164       /* If there is no default route via redistribute,
2165 	 then originate AS-external-LSA with nexthop 0 (self). */
2166       nexthop.s_addr = 0;
2167       ospf_external_info_add (DEFAULT_ROUTE, p, 0, nexthop, 0);
2168     }
2169 
2170   if ((ei = ospf_default_external_info (ospf)))
2171     ospf_external_lsa_originate (ospf, ei);
2172 
2173   return 0;
2174 }
2175 
2176 /* Flush any NSSA LSAs for given prefix */
2177 void
ospf_nssa_lsa_flush(struct ospf * ospf,struct prefix_ipv4 * p)2178 ospf_nssa_lsa_flush (struct ospf *ospf, struct prefix_ipv4 *p)
2179 {
2180   struct listnode *node, *nnode;
2181   struct ospf_lsa *lsa;
2182   struct ospf_area *area;
2183 
2184   for (ALL_LIST_ELEMENTS (ospf->areas, node, nnode, area))
2185   {
2186     if (area->external_routing == OSPF_AREA_NSSA)
2187     {
2188       if (!(lsa = ospf_lsa_lookup (area, OSPF_AS_NSSA_LSA, p->prefix,
2189                                 ospf->router_id)))
2190       {
2191         if (IS_DEBUG_OSPF (lsa, LSA_FLOODING))
2192           zlog_debug ("LSA: There is no such AS-NSSA-LSA %s/%d in LSDB",
2193                     inet_ntoa (p->prefix), p->prefixlen);
2194         continue;
2195       }
2196       ospf_ls_retransmit_delete_nbr_area (area, lsa);
2197       if (!IS_LSA_MAXAGE (lsa))
2198       {
2199         ospf_refresher_unregister_lsa (ospf, lsa);
2200         ospf_lsa_flush_area (lsa, area);
2201       }
2202     }
2203   }
2204 }
2205 
2206 /* Flush an AS-external-LSA from LSDB and routing domain. */
2207 void
ospf_external_lsa_flush(struct ospf * ospf,u_char type,struct prefix_ipv4 * p,ifindex_t ifindex)2208 ospf_external_lsa_flush (struct ospf *ospf,
2209 			 u_char type, struct prefix_ipv4 *p,
2210 			 ifindex_t ifindex /*, struct in_addr nexthop */)
2211 {
2212   struct ospf_lsa *lsa;
2213 
2214   if (IS_DEBUG_OSPF (lsa, LSA_FLOODING))
2215     zlog_debug ("LSA: Flushing AS-external-LSA %s/%d",
2216 	       inet_ntoa (p->prefix), p->prefixlen);
2217 
2218   /* First lookup LSA from LSDB. */
2219   if (!(lsa = ospf_external_info_find_lsa (ospf, p)))
2220     {
2221       if (IS_DEBUG_OSPF (lsa, LSA_FLOODING))
2222 	zlog_debug ("LSA: There is no such AS-external-LSA %s/%d in LSDB",
2223 		   inet_ntoa (p->prefix), p->prefixlen);
2224       return;
2225     }
2226 
2227   /* If LSA is selforiginated, not a translated LSA, and there is
2228    * NSSA area, flush Type-7 LSA's at first.
2229    */
2230   if (IS_LSA_SELF(lsa) && (ospf->anyNSSA)
2231       && !(CHECK_FLAG (lsa->flags, OSPF_LSA_LOCAL_XLT)))
2232     ospf_nssa_lsa_flush (ospf, p);
2233 
2234   /* Sweep LSA from Link State Retransmit List. */
2235   ospf_ls_retransmit_delete_nbr_as (ospf, lsa);
2236 
2237   /* There must be no self-originated LSA in rtrs_external. */
2238 #if 0
2239   /* Remove External route from Zebra. */
2240   ospf_zebra_delete ((struct prefix_ipv4 *) p, &nexthop);
2241 #endif
2242 
2243   if (!IS_LSA_MAXAGE (lsa))
2244     {
2245       /* Unregister LSA from Refresh queue. */
2246       ospf_refresher_unregister_lsa (ospf, lsa);
2247 
2248       /* Flush AS-external-LSA through AS. */
2249       ospf_lsa_flush_as (ospf, lsa);
2250     }
2251 
2252   if (IS_DEBUG_OSPF (lsa, LSA_FLOODING))
2253     zlog_debug ("ospf_external_lsa_flush(): stop");
2254 }
2255 
2256 void
ospf_external_lsa_refresh_default(struct ospf * ospf)2257 ospf_external_lsa_refresh_default (struct ospf *ospf)
2258 {
2259   struct prefix_ipv4 p;
2260   struct external_info *ei;
2261   struct ospf_lsa *lsa;
2262 
2263   p.family = AF_INET;
2264   p.prefixlen = 0;
2265   p.prefix.s_addr = 0;
2266 
2267   ei = ospf_default_external_info (ospf);
2268   lsa = ospf_external_info_find_lsa (ospf, &p);
2269 
2270   if (ei)
2271     {
2272       if (lsa)
2273 	{
2274 	  if (IS_DEBUG_OSPF_EVENT)
2275 	    zlog_debug ("LSA[Type5:0.0.0.0]: Refresh AS-external-LSA %p",
2276 		       (void *)lsa);
2277 	  ospf_external_lsa_refresh (ospf, lsa, ei, LSA_REFRESH_FORCE);
2278 	}
2279       else
2280 	{
2281 	  if (IS_DEBUG_OSPF_EVENT)
2282 	    zlog_debug ("LSA[Type5:0.0.0.0]: Originate AS-external-LSA");
2283 	  ospf_external_lsa_originate (ospf, ei);
2284 	}
2285     }
2286   else
2287     {
2288       if (lsa)
2289 	{
2290 	  if (IS_DEBUG_OSPF_EVENT)
2291 	    zlog_debug ("LSA[Type5:0.0.0.0]: Flush AS-external-LSA");
2292           ospf_refresher_unregister_lsa (ospf, lsa);
2293 	  ospf_lsa_flush_as (ospf, lsa);
2294 	}
2295     }
2296 }
2297 
2298 void
ospf_external_lsa_refresh_type(struct ospf * ospf,u_char type,int force)2299 ospf_external_lsa_refresh_type (struct ospf *ospf, u_char type, int force)
2300 {
2301   struct route_node *rn;
2302   struct external_info *ei;
2303 
2304   if (type != DEFAULT_ROUTE)
2305     if (EXTERNAL_INFO(type))
2306       /* Refresh each redistributed AS-external-LSAs. */
2307       for (rn = route_top (EXTERNAL_INFO (type)); rn; rn = route_next (rn))
2308 	if ((ei = rn->info))
2309 	  if (!is_prefix_default (&ei->p))
2310 	    {
2311 	      struct ospf_lsa *lsa;
2312 
2313 	      if ((lsa = ospf_external_info_find_lsa (ospf, &ei->p)))
2314 		ospf_external_lsa_refresh (ospf, lsa, ei, force);
2315 	      else
2316 		ospf_external_lsa_originate (ospf, ei);
2317 	    }
2318 }
2319 
2320 /* Refresh AS-external-LSA. */
2321 struct ospf_lsa *
ospf_external_lsa_refresh(struct ospf * ospf,struct ospf_lsa * lsa,struct external_info * ei,int force)2322 ospf_external_lsa_refresh (struct ospf *ospf, struct ospf_lsa *lsa,
2323 			   struct external_info *ei, int force)
2324 {
2325   struct ospf_lsa *new;
2326   int changed;
2327 
2328   /* Check the AS-external-LSA should be originated. */
2329   if (!ospf_redistribute_check (ospf, ei, &changed))
2330     {
2331       if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
2332         zlog_debug ("LSA[Type%d:%s]: Could not be refreshed, "
2333                    "redist check fail",
2334                    lsa->data->type, inet_ntoa (lsa->data->id));
2335       ospf_external_lsa_flush (ospf, ei->type, &ei->p,
2336 			       ei->ifindex /*, ei->nexthop */);
2337       return NULL;
2338     }
2339 
2340   if (!changed && !force)
2341     {
2342       if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
2343         zlog_debug ("LSA[Type%d:%s]: Not refreshed, not changed/forced",
2344                    lsa->data->type, inet_ntoa (lsa->data->id));
2345       return NULL;
2346     }
2347 
2348   /* Delete LSA from neighbor retransmit-list. */
2349   ospf_ls_retransmit_delete_nbr_as (ospf, lsa);
2350 
2351   /* Unregister AS-external-LSA from refresh-list. */
2352   ospf_refresher_unregister_lsa (ospf, lsa);
2353 
2354   new = ospf_external_lsa_new (ospf, ei, &lsa->data->id);
2355 
2356   if (new == NULL)
2357     {
2358       if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
2359 	zlog_debug ("LSA[Type%d:%s]: Could not be refreshed", lsa->data->type,
2360 		   inet_ntoa (lsa->data->id));
2361       return NULL;
2362     }
2363 
2364   new->data->ls_seqnum = lsa_seqnum_increment (lsa);
2365 
2366   ospf_lsa_install (ospf, NULL, new);	/* As type-5. */
2367 
2368   /* Flood LSA through AS. */
2369   ospf_flood_through_as (ospf, NULL, new);
2370 
2371   /* If any attached NSSA, install as Type-7, flood to all NSSA Areas */
2372   if (ospf->anyNSSA && !(CHECK_FLAG (new->flags, OSPF_LSA_LOCAL_XLT)))
2373     ospf_install_flood_nssa (ospf, new, ei); /* Install/Flood per new rules */
2374 
2375   /* Register self-originated LSA to refresh queue.
2376    * Translated LSAs should not be registered, but refreshed upon
2377    * refresh of the Type-7
2378    */
2379   if ( !CHECK_FLAG (new->flags, OSPF_LSA_LOCAL_XLT) )
2380     ospf_refresher_register_lsa (ospf, new);
2381 
2382   /* Debug logging. */
2383   if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
2384     {
2385       zlog_debug ("LSA[Type%d:%s]: AS-external-LSA refresh",
2386                  new->data->type, inet_ntoa (new->data->id));
2387       ospf_lsa_header_dump (new->data);
2388     }
2389 
2390   return new;
2391 }
2392 
2393 
2394 /* LSA installation functions. */
2395 
2396 /* Install router-LSA to an area. */
2397 static struct ospf_lsa *
ospf_router_lsa_install(struct ospf * ospf,struct ospf_lsa * new,int rt_recalc)2398 ospf_router_lsa_install (struct ospf *ospf, struct ospf_lsa *new,
2399                          int rt_recalc)
2400 {
2401   struct ospf_area *area = new->area;
2402 
2403   /* RFC 2328 Section 13.2 Router-LSAs and network-LSAs
2404      The entire routing table must be recalculated, starting with
2405      the shortest path calculations for each area (not just the
2406      area whose link-state database has changed).
2407   */
2408 
2409   if (IS_LSA_SELF (new))
2410     {
2411 
2412       /* Only install LSA if it is originated/refreshed by us.
2413        * If LSA was received by flooding, the RECEIVED flag is set so do
2414        * not link the LSA */
2415       if (CHECK_FLAG (new->flags, OSPF_LSA_RECEIVED))
2416 	return new; /* ignore stale LSA */
2417 
2418       /* Set self-originated router-LSA. */
2419       ospf_lsa_unlock (&area->router_lsa_self);
2420       area->router_lsa_self = ospf_lsa_lock (new);
2421 
2422       ospf_refresher_register_lsa (ospf, new);
2423     }
2424   if (rt_recalc)
2425     ospf_spf_calculate_schedule (ospf, SPF_FLAG_ROUTER_LSA_INSTALL);
2426   return new;
2427 }
2428 
2429 #define OSPF_INTERFACE_TIMER_ON(T,F,V) \
2430 	if (!(T)) \
2431 	  (T) = thread_add_timer (master, (F), oi, (V))
2432 
2433 /* Install network-LSA to an area. */
2434 static struct ospf_lsa *
ospf_network_lsa_install(struct ospf * ospf,struct ospf_interface * oi,struct ospf_lsa * new,int rt_recalc)2435 ospf_network_lsa_install (struct ospf *ospf,
2436 			  struct ospf_interface *oi,
2437 			  struct ospf_lsa *new,
2438 			  int rt_recalc)
2439 {
2440 
2441   /* RFC 2328 Section 13.2 Router-LSAs and network-LSAs
2442      The entire routing table must be recalculated, starting with
2443      the shortest path calculations for each area (not just the
2444      area whose link-state database has changed).
2445   */
2446   if (IS_LSA_SELF (new))
2447     {
2448       /* We supposed that when LSA is originated by us, we pass the int
2449 	 for which it was originated. If LSA was received by flooding,
2450 	 the RECEIVED flag is set, so we do not link the LSA to the int. */
2451       if (CHECK_FLAG (new->flags, OSPF_LSA_RECEIVED))
2452 	return new; /* ignore stale LSA */
2453 
2454       ospf_lsa_unlock (&oi->network_lsa_self);
2455       oi->network_lsa_self = ospf_lsa_lock (new);
2456       ospf_refresher_register_lsa (ospf, new);
2457     }
2458   if (rt_recalc)
2459     ospf_spf_calculate_schedule (ospf, SPF_FLAG_NETWORK_LSA_INSTALL);
2460 
2461   return new;
2462 }
2463 
2464 /* Install summary-LSA to an area. */
2465 static struct ospf_lsa *
ospf_summary_lsa_install(struct ospf * ospf,struct ospf_lsa * new,int rt_recalc)2466 ospf_summary_lsa_install (struct ospf *ospf, struct ospf_lsa *new,
2467 			  int rt_recalc)
2468 {
2469   if (rt_recalc && !IS_LSA_SELF (new))
2470     {
2471       /* RFC 2328 Section 13.2 Summary-LSAs
2472 	 The best route to the destination described by the summary-
2473 	 LSA must be recalculated (see Section 16.5).  If this
2474 	 destination is an AS boundary router, it may also be
2475 	 necessary to re-examine all the AS-external-LSAs.
2476       */
2477 
2478 #if 0
2479       /* This doesn't exist yet... */
2480       ospf_summary_incremental_update(new); */
2481 #else /* #if 0 */
2482       ospf_spf_calculate_schedule (ospf, SPF_FLAG_SUMMARY_LSA_INSTALL);
2483 #endif /* #if 0 */
2484 
2485     }
2486 
2487   if (IS_LSA_SELF (new))
2488     ospf_refresher_register_lsa (ospf, new);
2489 
2490   return new;
2491 }
2492 
2493 /* Install ASBR-summary-LSA to an area. */
2494 static struct ospf_lsa *
ospf_summary_asbr_lsa_install(struct ospf * ospf,struct ospf_lsa * new,int rt_recalc)2495 ospf_summary_asbr_lsa_install (struct ospf *ospf, struct ospf_lsa *new,
2496 			       int rt_recalc)
2497 {
2498   if (rt_recalc && !IS_LSA_SELF (new))
2499     {
2500       /* RFC 2328 Section 13.2 Summary-LSAs
2501 	 The best route to the destination described by the summary-
2502 	 LSA must be recalculated (see Section 16.5).  If this
2503 	 destination is an AS boundary router, it may also be
2504 	 necessary to re-examine all the AS-external-LSAs.
2505       */
2506 #if 0
2507       /* These don't exist yet... */
2508       ospf_summary_incremental_update(new);
2509       /* Isn't this done by the above call?
2510 	 - RFC 2328 Section 16.5 implies it should be */
2511       /* ospf_ase_calculate_schedule(); */
2512 #else  /* #if 0 */
2513       ospf_spf_calculate_schedule (ospf, SPF_FLAG_ASBR_SUMMARY_LSA_INSTALL);
2514 #endif /* #if 0 */
2515     }
2516 
2517   /* register LSA to refresh-list. */
2518   if (IS_LSA_SELF (new))
2519     ospf_refresher_register_lsa (ospf, new);
2520 
2521   return new;
2522 }
2523 
2524 /* Install AS-external-LSA. */
2525 static struct ospf_lsa *
ospf_external_lsa_install(struct ospf * ospf,struct ospf_lsa * new,int rt_recalc)2526 ospf_external_lsa_install (struct ospf *ospf, struct ospf_lsa *new,
2527 			   int rt_recalc)
2528 {
2529   ospf_ase_register_external_lsa (new, ospf);
2530   /* If LSA is not self-originated, calculate an external route. */
2531   if (rt_recalc)
2532     {
2533       /* RFC 2328 Section 13.2 AS-external-LSAs
2534             The best route to the destination described by the AS-
2535             external-LSA must be recalculated (see Section 16.6).
2536       */
2537 
2538       if (!IS_LSA_SELF (new))
2539         ospf_ase_incremental_update (ospf, new);
2540     }
2541 
2542   if (new->data->type == OSPF_AS_NSSA_LSA)
2543     {
2544       /* There is no point to register selforiginate Type-7 LSA for
2545        * refreshing. We rely on refreshing Type-5 LSA's
2546        */
2547       if (IS_LSA_SELF (new))
2548         return new;
2549       else
2550         {
2551           /* Try refresh type-5 translated LSA for this LSA, if one exists.
2552            * New translations will be taken care of by the abr_task.
2553            */
2554           ospf_translated_nssa_refresh (ospf, new, NULL);
2555           ospf_schedule_abr_task(ospf);
2556         }
2557     }
2558 
2559   /* Register self-originated LSA to refresh queue.
2560    * Leave Translated LSAs alone if NSSA is enabled
2561    */
2562   if (IS_LSA_SELF (new) && !CHECK_FLAG (new->flags, OSPF_LSA_LOCAL_XLT ) )
2563     ospf_refresher_register_lsa (ospf, new);
2564 
2565   return new;
2566 }
2567 
2568 void
ospf_discard_from_db(struct ospf * ospf,struct ospf_lsdb * lsdb,struct ospf_lsa * lsa)2569 ospf_discard_from_db (struct ospf *ospf,
2570 		      struct ospf_lsdb *lsdb, struct ospf_lsa *lsa)
2571 {
2572   struct ospf_lsa *old;
2573 
2574   if (!lsdb)
2575     {
2576       zlog_warn ("%s: Called with NULL lsdb!", __func__);
2577       if (!lsa)
2578         zlog_warn ("%s: and NULL LSA!", __func__);
2579       else
2580         zlog_warn ("LSA[Type%d:%s]: not associated with LSDB!",
2581                    lsa->data->type, inet_ntoa (lsa->data->id));
2582       return;
2583     }
2584 
2585   old = ospf_lsdb_lookup (lsdb, lsa);
2586 
2587   if (!old)
2588     return;
2589 
2590   if (old->refresh_list >= 0)
2591     ospf_refresher_unregister_lsa (ospf, old);
2592 
2593   switch (old->data->type)
2594     {
2595     case OSPF_AS_EXTERNAL_LSA:
2596       ospf_ase_unregister_external_lsa (old, ospf);
2597       ospf_ls_retransmit_delete_nbr_as (ospf, old);
2598       break;
2599     case OSPF_OPAQUE_AS_LSA:
2600       ospf_ls_retransmit_delete_nbr_as (ospf, old);
2601       break;
2602     case OSPF_AS_NSSA_LSA:
2603       ospf_ls_retransmit_delete_nbr_area (old->area, old);
2604       ospf_ase_unregister_external_lsa (old, ospf);
2605       break;
2606     default:
2607       ospf_ls_retransmit_delete_nbr_area (old->area, old);
2608       break;
2609     }
2610 
2611   ospf_lsa_maxage_delete (ospf, old);
2612   ospf_lsa_discard (old);
2613 }
2614 
2615 struct ospf_lsa *
ospf_lsa_install(struct ospf * ospf,struct ospf_interface * oi,struct ospf_lsa * lsa)2616 ospf_lsa_install (struct ospf *ospf, struct ospf_interface *oi,
2617 		  struct ospf_lsa *lsa)
2618 {
2619   struct ospf_lsa *new = NULL;
2620   struct ospf_lsa *old = NULL;
2621   struct ospf_lsdb *lsdb = NULL;
2622   int rt_recalc;
2623 
2624   /* Set LSDB. */
2625   switch (lsa->data->type)
2626     {
2627       /* kevinm */
2628     case OSPF_AS_NSSA_LSA:
2629       if (lsa->area)
2630 	lsdb = lsa->area->lsdb;
2631       else
2632 	lsdb = ospf->lsdb;
2633       break;
2634     case OSPF_AS_EXTERNAL_LSA:
2635     case OSPF_OPAQUE_AS_LSA:
2636       lsdb = ospf->lsdb;
2637       break;
2638     default:
2639       lsdb = lsa->area->lsdb;
2640       break;
2641     }
2642 
2643   assert (lsdb);
2644 
2645   /*  RFC 2328 13.2.  Installing LSAs in the database
2646 
2647         Installing a new LSA in the database, either as the result of
2648         flooding or a newly self-originated LSA, may cause the OSPF
2649         routing table structure to be recalculated.  The contents of the
2650         new LSA should be compared to the old instance, if present.  If
2651         there is no difference, there is no need to recalculate the
2652         routing table. When comparing an LSA to its previous instance,
2653         the following are all considered to be differences in contents:
2654 
2655             o   The LSA's Options field has changed.
2656 
2657             o   One of the LSA instances has LS age set to MaxAge, and
2658                 the other does not.
2659 
2660             o   The length field in the LSA header has changed.
2661 
2662             o   The body of the LSA (i.e., anything outside the 20-byte
2663                 LSA header) has changed. Note that this excludes changes
2664                 in LS Sequence Number and LS Checksum.
2665 
2666   */
2667   /* Look up old LSA and determine if any SPF calculation or incremental
2668      update is needed */
2669   old = ospf_lsdb_lookup (lsdb, lsa);
2670 
2671   /* Do comparision and record if recalc needed. */
2672   rt_recalc = 0;
2673   if (  old == NULL || ospf_lsa_different(old, lsa))
2674     rt_recalc = 1;
2675 
2676   /*
2677      Sequence number check (Section 14.1 of rfc 2328)
2678      "Premature aging is used when it is time for a self-originated
2679       LSA's sequence number field to wrap.  At this point, the current
2680       LSA instance (having LS sequence number MaxSequenceNumber) must
2681       be prematurely aged and flushed from the routing domain before a
2682       new instance with sequence number equal to InitialSequenceNumber
2683       can be originated. "
2684    */
2685 
2686   if (ntohl(lsa->data->ls_seqnum) - 1 == OSPF_MAX_SEQUENCE_NUMBER)
2687     {
2688       if (ospf_lsa_is_self_originated(ospf, lsa))
2689         {
2690           lsa->data->ls_seqnum = htonl(OSPF_MAX_SEQUENCE_NUMBER);
2691 
2692           if (!IS_LSA_MAXAGE(lsa))
2693             lsa->flags |= OSPF_LSA_PREMATURE_AGE;
2694           lsa->data->ls_age = htons (OSPF_LSA_MAXAGE);
2695 
2696           if (IS_DEBUG_OSPF (lsa, LSA_REFRESH))
2697             {
2698       	      zlog_debug ("ospf_lsa_install() Premature Aging "
2699 		         "lsa 0x%p, seqnum 0x%x",
2700 		         (void *)lsa, ntohl(lsa->data->ls_seqnum));
2701       	      ospf_lsa_header_dump (lsa->data);
2702             }
2703         }
2704       else
2705         {
2706           if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
2707             {
2708       	      zlog_debug ("ospf_lsa_install() got an lsa with seq 0x80000000 "
2709 		         "that was not self originated. Ignoring\n");
2710       	      ospf_lsa_header_dump (lsa->data);
2711             }
2712 	  return old;
2713         }
2714     }
2715 
2716   /* discard old LSA from LSDB */
2717   if (old != NULL)
2718     ospf_discard_from_db (ospf, lsdb, lsa);
2719 
2720   /* Calculate Checksum if self-originated?. */
2721   if (IS_LSA_SELF (lsa))
2722     ospf_lsa_checksum (lsa->data);
2723 
2724   /* Insert LSA to LSDB. */
2725   ospf_lsdb_add (lsdb, lsa);
2726   lsa->lsdb = lsdb;
2727 
2728   /* Do LSA specific installation process. */
2729   switch (lsa->data->type)
2730     {
2731     case OSPF_ROUTER_LSA:
2732       new = ospf_router_lsa_install (ospf, lsa, rt_recalc);
2733       break;
2734     case OSPF_NETWORK_LSA:
2735       assert (oi);
2736       new = ospf_network_lsa_install (ospf, oi, lsa, rt_recalc);
2737       break;
2738     case OSPF_SUMMARY_LSA:
2739       new = ospf_summary_lsa_install (ospf, lsa, rt_recalc);
2740       break;
2741     case OSPF_ASBR_SUMMARY_LSA:
2742       new = ospf_summary_asbr_lsa_install (ospf, lsa, rt_recalc);
2743       break;
2744     case OSPF_AS_EXTERNAL_LSA:
2745       new = ospf_external_lsa_install (ospf, lsa, rt_recalc);
2746       break;
2747     case OSPF_OPAQUE_LINK_LSA:
2748       if (IS_LSA_SELF (lsa))
2749 	lsa->oi = oi; /* Specify outgoing ospf-interface for this LSA. */
2750       else
2751         {
2752           /* Incoming "oi" for this LSA has set at LSUpd reception. */
2753         }
2754       /* Fallthrough */
2755     case OSPF_OPAQUE_AREA_LSA:
2756     case OSPF_OPAQUE_AS_LSA:
2757       new = ospf_opaque_lsa_install (lsa, rt_recalc);
2758       break;
2759     case OSPF_AS_NSSA_LSA:
2760       new = ospf_external_lsa_install (ospf, lsa, rt_recalc);
2761     default: /* type-6,8,9....nothing special */
2762       break;
2763     }
2764 
2765   if (new == NULL)
2766     return new;  /* Installation failed, cannot proceed further -- endo. */
2767 
2768   /* Debug logs. */
2769   if (IS_DEBUG_OSPF (lsa, LSA_INSTALL))
2770     {
2771       char area_str[INET_ADDRSTRLEN];
2772 
2773       switch (lsa->data->type)
2774         {
2775         case OSPF_AS_EXTERNAL_LSA:
2776         case OSPF_OPAQUE_AS_LSA:
2777         case OSPF_AS_NSSA_LSA:
2778           zlog_debug ("LSA[%s]: Install %s",
2779                  dump_lsa_key (new),
2780                  LOOKUP (ospf_lsa_type_msg, new->data->type));
2781           break;
2782         default:
2783 	  strcpy (area_str, inet_ntoa (new->area->area_id));
2784           zlog_debug ("LSA[%s]: Install %s to Area %s",
2785                  dump_lsa_key (new),
2786                  LOOKUP (ospf_lsa_type_msg, new->data->type), area_str);
2787           break;
2788         }
2789     }
2790 
2791   /*
2792      If received LSA' ls_age is MaxAge, or lsa is being prematurely aged
2793      (it's getting flushed out of the area), set LSA on MaxAge LSA list.
2794    */
2795   if (IS_LSA_MAXAGE (new))
2796     {
2797       if (IS_DEBUG_OSPF (lsa, LSA_INSTALL))
2798         zlog_debug ("LSA[Type%d:%s]: Install LSA 0x%p, MaxAge",
2799                    new->data->type,
2800                    inet_ntoa (new->data->id),
2801                    (void *)lsa);
2802       ospf_lsa_maxage (ospf, lsa);
2803     }
2804 
2805   return new;
2806 }
2807 
2808 
2809 int
ospf_check_nbr_status(struct ospf * ospf)2810 ospf_check_nbr_status (struct ospf *ospf)
2811 {
2812   struct listnode *node, *nnode;
2813   struct ospf_interface *oi;
2814 
2815   for (ALL_LIST_ELEMENTS (ospf->oiflist, node, nnode, oi))
2816     {
2817       struct route_node *rn;
2818       struct ospf_neighbor *nbr;
2819 
2820       if (ospf_if_is_enable (oi))
2821 	for (rn = route_top (oi->nbrs); rn; rn = route_next (rn))
2822           if ((nbr = rn->info) != NULL)
2823 	    if (nbr->state == NSM_Exchange || nbr->state == NSM_Loading)
2824 	      {
2825 		route_unlock_node (rn);
2826 		return 0;
2827 	      }
2828     }
2829 
2830   return 1;
2831 }
2832 
2833 
2834 
2835 static int
ospf_maxage_lsa_remover(struct thread * thread)2836 ospf_maxage_lsa_remover (struct thread *thread)
2837 {
2838   struct ospf *ospf = THREAD_ARG (thread);
2839   struct ospf_lsa *lsa;
2840   struct route_node *rn;
2841   int reschedule = 0;
2842 
2843   ospf->t_maxage = NULL;
2844 
2845   if (IS_DEBUG_OSPF (lsa, LSA_FLOODING))
2846     zlog_debug ("LSA[MaxAge]: remover Start");
2847 
2848   reschedule = !ospf_check_nbr_status (ospf);
2849 
2850   if (!reschedule)
2851     for (rn = route_top(ospf->maxage_lsa); rn; rn = route_next(rn))
2852       {
2853 	if ((lsa = rn->info) == NULL)
2854 	  {
2855 	    continue;
2856 	  }
2857 
2858         /* There is at least one neighbor from which we still await an ack
2859          * for that LSA, so we are not allowed to remove it from our lsdb yet
2860          * as per RFC 2328 section 14 para 4 a) */
2861         if (lsa->retransmit_counter > 0)
2862           {
2863             reschedule = 1;
2864             continue;
2865           }
2866 
2867         /* TODO: maybe convert this function to a work-queue */
2868         if (thread_should_yield (thread))
2869           {
2870             OSPF_TIMER_ON (ospf->t_maxage, ospf_maxage_lsa_remover, 0);
2871             route_unlock_node(rn); /* route_top/route_next */
2872             return 0;
2873           }
2874 
2875         /* Remove LSA from the LSDB */
2876         if (IS_LSA_SELF (lsa))
2877           if (IS_DEBUG_OSPF (lsa, LSA_FLOODING))
2878             zlog_debug ("LSA[Type%d:%s]: LSA 0x%lx is self-originated: ",
2879                        lsa->data->type, inet_ntoa (lsa->data->id), (u_long)lsa);
2880 
2881         if (IS_DEBUG_OSPF (lsa, LSA_FLOODING))
2882           zlog_debug ("LSA[Type%d:%s]: MaxAge LSA removed from list",
2883                      lsa->data->type, inet_ntoa (lsa->data->id));
2884 
2885 	if (CHECK_FLAG (lsa->flags, OSPF_LSA_PREMATURE_AGE))
2886           {
2887             if (IS_DEBUG_OSPF (lsa, LSA_FLOODING))
2888               zlog_debug ("originating new lsa for lsa 0x%p\n", (void *)lsa);
2889             ospf_lsa_refresh (ospf, lsa);
2890           }
2891 
2892 	/* Remove from lsdb. */
2893 	if (lsa->lsdb)
2894 	  {
2895 	    ospf_discard_from_db (ospf, lsa->lsdb, lsa);
2896 	    ospf_lsdb_delete (lsa->lsdb, lsa);
2897           }
2898         else
2899           zlog_warn ("%s: LSA[Type%d:%s]: No associated LSDB!", __func__,
2900                      lsa->data->type, inet_ntoa (lsa->data->id));
2901       }
2902 
2903   /*    A MaxAge LSA must be removed immediately from the router's link
2904         state database as soon as both a) it is no longer contained on any
2905         neighbor Link state retransmission lists and b) none of the router's
2906         neighbors are in states Exchange or Loading. */
2907   if (reschedule)
2908     OSPF_TIMER_ON (ospf->t_maxage, ospf_maxage_lsa_remover,
2909                    ospf->maxage_delay);
2910 
2911   return 0;
2912 }
2913 
2914 void
ospf_lsa_maxage_delete(struct ospf * ospf,struct ospf_lsa * lsa)2915 ospf_lsa_maxage_delete (struct ospf *ospf, struct ospf_lsa *lsa)
2916 {
2917   struct route_node *rn;
2918   struct prefix_ptr lsa_prefix;
2919 
2920   lsa_prefix.family = 0;
2921   lsa_prefix.prefixlen = sizeof(lsa_prefix.prefix) * CHAR_BIT;
2922   lsa_prefix.prefix = (uintptr_t) lsa;
2923 
2924   if ((rn = route_node_lookup(ospf->maxage_lsa,
2925 			      (struct prefix *)&lsa_prefix)))
2926     {
2927       if (rn->info == lsa)
2928 	{
2929 	  UNSET_FLAG(lsa->flags, OSPF_LSA_IN_MAXAGE);
2930 	  ospf_lsa_unlock (&lsa); /* maxage_lsa */
2931 	  rn->info = NULL;
2932 	  route_unlock_node (rn); /* unlock node because lsa is deleted */
2933 	}
2934       route_unlock_node (rn); /* route_node_lookup */
2935     }
2936 }
2937 
2938 /* Add LSA onto the MaxAge list, and schedule for removal.
2939  * This does *not* lead to the LSA being flooded, that must be taken
2940  * care of elsewhere, see, e.g., ospf_lsa_flush* (which are callers of this
2941  * function).
2942  */
2943 void
ospf_lsa_maxage(struct ospf * ospf,struct ospf_lsa * lsa)2944 ospf_lsa_maxage (struct ospf *ospf, struct ospf_lsa *lsa)
2945 {
2946   struct prefix_ptr lsa_prefix;
2947   struct route_node *rn;
2948 
2949   /* When we saw a MaxAge LSA flooded to us, we put it on the list
2950      and schedule the MaxAge LSA remover. */
2951   if (CHECK_FLAG(lsa->flags, OSPF_LSA_IN_MAXAGE))
2952     {
2953       if (IS_DEBUG_OSPF (lsa, LSA_FLOODING))
2954 	zlog_debug ("LSA[Type%d:%s]: %p already exists on MaxAge LSA list",
2955 		   lsa->data->type, inet_ntoa (lsa->data->id), (void *)lsa);
2956       return;
2957     }
2958 
2959   lsa_prefix.family = 0;
2960   lsa_prefix.prefixlen = sizeof(lsa_prefix.prefix) * CHAR_BIT;
2961   lsa_prefix.prefix = (uintptr_t) lsa;
2962 
2963   if ((rn = route_node_get (ospf->maxage_lsa,
2964 			    (struct prefix *)&lsa_prefix)) != NULL)
2965     {
2966       if (rn->info != NULL)
2967 	{
2968 	  if (IS_DEBUG_OSPF (lsa, LSA_FLOODING))
2969 	    zlog_debug ("LSA[%s]: found LSA (%p) in table for LSA %p %d",
2970 			dump_lsa_key (lsa), rn->info, (void *)lsa,
2971 			lsa_prefix.prefixlen);
2972 	  route_unlock_node (rn);
2973 	}
2974       else
2975 	{
2976 	  rn->info = ospf_lsa_lock(lsa);
2977 	  SET_FLAG(lsa->flags, OSPF_LSA_IN_MAXAGE);
2978 	}
2979     }
2980   else
2981     {
2982       zlog_err("Unable to allocate memory for maxage lsa\n");
2983       assert(0);
2984     }
2985 
2986   if (IS_DEBUG_OSPF (lsa, LSA_FLOODING))
2987     zlog_debug ("LSA[%s]: MaxAge LSA remover scheduled.", dump_lsa_key (lsa));
2988 
2989   OSPF_TIMER_ON (ospf->t_maxage, ospf_maxage_lsa_remover,
2990                  ospf->maxage_delay);
2991 }
2992 
2993 static int
ospf_lsa_maxage_walker_remover(struct ospf * ospf,struct ospf_lsa * lsa)2994 ospf_lsa_maxage_walker_remover (struct ospf *ospf, struct ospf_lsa *lsa)
2995 {
2996   /* Stay away from any Local Translated Type-7 LSAs */
2997   if (CHECK_FLAG (lsa->flags, OSPF_LSA_LOCAL_XLT))
2998     return 0;
2999 
3000   if (IS_LSA_MAXAGE (lsa))
3001     /* Self-originated LSAs should NOT time-out instead,
3002        they're flushed and submitted to the max_age list explicitly. */
3003     if (!ospf_lsa_is_self_originated (ospf, lsa))
3004       {
3005 	if (IS_DEBUG_OSPF (lsa, LSA_FLOODING))
3006 	  zlog_debug("LSA[%s]: is MaxAge", dump_lsa_key (lsa));
3007 
3008         switch (lsa->data->type)
3009           {
3010           case OSPF_OPAQUE_LINK_LSA:
3011           case OSPF_OPAQUE_AREA_LSA:
3012           case OSPF_OPAQUE_AS_LSA:
3013             /*
3014              * As a general rule, whenever network topology has changed
3015              * (due to an LSA removal in this case), routing recalculation
3016              * should be triggered. However, this is not true for opaque
3017              * LSAs. Even if an opaque LSA instance is going to be removed
3018              * from the routing domain, it does not mean a change in network
3019              * topology, and thus, routing recalculation is not needed here.
3020              */
3021             break;
3022           case OSPF_AS_EXTERNAL_LSA:
3023           case OSPF_AS_NSSA_LSA:
3024 	    ospf_ase_incremental_update (ospf, lsa);
3025             break;
3026           default:
3027 	    ospf_spf_calculate_schedule (ospf, SPF_FLAG_MAXAGE);
3028             break;
3029           }
3030 	ospf_lsa_maxage (ospf, lsa);
3031       }
3032 
3033   if (IS_LSA_MAXAGE (lsa) && !ospf_lsa_is_self_originated (ospf, lsa))
3034     if (LS_AGE (lsa) > OSPF_LSA_MAXAGE + 30)
3035       printf ("Eek! Shouldn't happen!\n");
3036 
3037   return 0;
3038 }
3039 
3040 /* Periodical check of MaxAge LSA. */
3041 int
ospf_lsa_maxage_walker(struct thread * thread)3042 ospf_lsa_maxage_walker (struct thread *thread)
3043 {
3044   struct ospf *ospf = THREAD_ARG (thread);
3045   struct route_node *rn;
3046   struct ospf_lsa *lsa;
3047   struct ospf_area *area;
3048   struct listnode *node, *nnode;
3049 
3050   ospf->t_maxage_walker = NULL;
3051 
3052   for (ALL_LIST_ELEMENTS (ospf->areas, node, nnode, area))
3053     {
3054       LSDB_LOOP (ROUTER_LSDB (area), rn, lsa)
3055 	ospf_lsa_maxage_walker_remover (ospf, lsa);
3056       LSDB_LOOP (NETWORK_LSDB (area), rn, lsa)
3057 	ospf_lsa_maxage_walker_remover (ospf, lsa);
3058       LSDB_LOOP (SUMMARY_LSDB (area), rn, lsa)
3059 	ospf_lsa_maxage_walker_remover (ospf, lsa);
3060       LSDB_LOOP (ASBR_SUMMARY_LSDB (area), rn, lsa)
3061 	ospf_lsa_maxage_walker_remover (ospf, lsa);
3062       LSDB_LOOP (OPAQUE_AREA_LSDB (area), rn, lsa)
3063 	ospf_lsa_maxage_walker_remover (ospf, lsa);
3064       LSDB_LOOP (OPAQUE_LINK_LSDB (area), rn, lsa)
3065 	ospf_lsa_maxage_walker_remover (ospf, lsa);
3066       LSDB_LOOP (NSSA_LSDB (area), rn, lsa)
3067         ospf_lsa_maxage_walker_remover (ospf, lsa);
3068     }
3069 
3070   /* for AS-external-LSAs. */
3071   if (ospf->lsdb)
3072     {
3073       LSDB_LOOP (EXTERNAL_LSDB (ospf), rn, lsa)
3074 	ospf_lsa_maxage_walker_remover (ospf, lsa);
3075       LSDB_LOOP (OPAQUE_AS_LSDB (ospf), rn, lsa)
3076 	ospf_lsa_maxage_walker_remover (ospf, lsa);
3077     }
3078 
3079   OSPF_TIMER_ON (ospf->t_maxage_walker, ospf_lsa_maxage_walker,
3080 		 OSPF_LSA_MAXAGE_CHECK_INTERVAL);
3081   return 0;
3082 }
3083 
3084 struct ospf_lsa *
ospf_lsa_lookup_by_prefix(struct ospf_lsdb * lsdb,u_char type,struct prefix_ipv4 * p,struct in_addr router_id)3085 ospf_lsa_lookup_by_prefix (struct ospf_lsdb *lsdb, u_char type,
3086 			   struct prefix_ipv4 *p, struct in_addr router_id)
3087 {
3088   struct ospf_lsa *lsa;
3089   struct in_addr mask, id;
3090   struct lsa_header_mask
3091   {
3092     struct lsa_header header;
3093     struct in_addr mask;
3094   } *hmask;
3095 
3096   lsa = ospf_lsdb_lookup_by_id (lsdb, type, p->prefix, router_id);
3097   if (lsa == NULL)
3098     return NULL;
3099 
3100   masklen2ip (p->prefixlen, &mask);
3101 
3102   hmask = (struct lsa_header_mask *) lsa->data;
3103 
3104   if (mask.s_addr != hmask->mask.s_addr)
3105     {
3106       id.s_addr = p->prefix.s_addr | (~mask.s_addr);
3107       lsa = ospf_lsdb_lookup_by_id (lsdb, type, id, router_id);
3108       if (!lsa)
3109         return NULL;
3110     }
3111 
3112   return lsa;
3113 }
3114 
3115 struct ospf_lsa *
ospf_lsa_lookup(struct ospf_area * area,u_int32_t type,struct in_addr id,struct in_addr adv_router)3116 ospf_lsa_lookup (struct ospf_area *area, u_int32_t type,
3117                  struct in_addr id, struct in_addr adv_router)
3118 {
3119   struct ospf *ospf = ospf_lookup();
3120   assert(ospf);
3121 
3122   switch (type)
3123     {
3124     case OSPF_ROUTER_LSA:
3125     case OSPF_NETWORK_LSA:
3126     case OSPF_SUMMARY_LSA:
3127     case OSPF_ASBR_SUMMARY_LSA:
3128     case OSPF_AS_NSSA_LSA:
3129     case OSPF_OPAQUE_LINK_LSA:
3130     case OSPF_OPAQUE_AREA_LSA:
3131       return ospf_lsdb_lookup_by_id (area->lsdb, type, id, adv_router);
3132     case OSPF_AS_EXTERNAL_LSA:
3133     case OSPF_OPAQUE_AS_LSA:
3134       return ospf_lsdb_lookup_by_id (ospf->lsdb, type, id, adv_router);
3135     default:
3136       break;
3137     }
3138 
3139   return NULL;
3140 }
3141 
3142 struct ospf_lsa *
ospf_lsa_lookup_by_id(struct ospf_area * area,u_int32_t type,struct in_addr id)3143 ospf_lsa_lookup_by_id (struct ospf_area *area, u_int32_t type,
3144                        struct in_addr id)
3145 {
3146   struct ospf_lsa *lsa;
3147   struct route_node *rn;
3148 
3149   switch (type)
3150     {
3151     case OSPF_ROUTER_LSA:
3152       return ospf_lsdb_lookup_by_id (area->lsdb, type, id, id);
3153     case OSPF_NETWORK_LSA:
3154       for (rn = route_top (NETWORK_LSDB (area)); rn; rn = route_next (rn))
3155 	if ((lsa = rn->info))
3156 	  if (IPV4_ADDR_SAME (&lsa->data->id, &id))
3157 	    {
3158 	      route_unlock_node (rn);
3159 	      return lsa;
3160 	    }
3161       break;
3162     case OSPF_SUMMARY_LSA:
3163     case OSPF_ASBR_SUMMARY_LSA:
3164       /* Currently not used. */
3165       assert (1);
3166       return ospf_lsdb_lookup_by_id (area->lsdb, type, id, id);
3167     case OSPF_AS_EXTERNAL_LSA:
3168     case OSPF_AS_NSSA_LSA:
3169     case OSPF_OPAQUE_LINK_LSA:
3170     case OSPF_OPAQUE_AREA_LSA:
3171     case OSPF_OPAQUE_AS_LSA:
3172       /* Currently not used. */
3173       break;
3174     default:
3175       break;
3176     }
3177 
3178   return NULL;
3179 }
3180 
3181 struct ospf_lsa *
ospf_lsa_lookup_by_header(struct ospf_area * area,struct lsa_header * lsah)3182 ospf_lsa_lookup_by_header (struct ospf_area *area, struct lsa_header *lsah)
3183 {
3184   struct ospf_lsa *match;
3185 
3186   /*
3187    * Strictly speaking, the LSA-ID field for Opaque-LSAs (type-9/10/11)
3188    * is redefined to have two subfields; opaque-type and opaque-id.
3189    * However, it is harmless to treat the two sub fields together, as if
3190    * they two were forming a unique LSA-ID.
3191    */
3192 
3193   match = ospf_lsa_lookup (area, lsah->type, lsah->id, lsah->adv_router);
3194 
3195   if (match == NULL)
3196     if (IS_DEBUG_OSPF (lsa, LSA) == OSPF_DEBUG_LSA)
3197       zlog_debug ("LSA[Type%d:%s]: Lookup by header, NO MATCH",
3198 		 lsah->type, inet_ntoa (lsah->id));
3199 
3200   return match;
3201 }
3202 
3203 /* return +n, l1 is more recent.
3204    return -n, l2 is more recent.
3205    return 0, l1 and l2 is identical. */
3206 int
ospf_lsa_more_recent(struct ospf_lsa * l1,struct ospf_lsa * l2)3207 ospf_lsa_more_recent (struct ospf_lsa *l1, struct ospf_lsa *l2)
3208 {
3209   int r;
3210   int x, y;
3211 
3212   if (l1 == NULL && l2 == NULL)
3213     return 0;
3214   if (l1 == NULL)
3215     return -1;
3216   if (l2 == NULL)
3217     return 1;
3218 
3219   /* compare LS sequence number. */
3220   x = (int) ntohl (l1->data->ls_seqnum);
3221   y = (int) ntohl (l2->data->ls_seqnum);
3222   if (x > y)
3223     return 1;
3224   if (x < y)
3225     return -1;
3226 
3227   /* compare LS checksum. */
3228   r = ntohs (l1->data->checksum) - ntohs (l2->data->checksum);
3229   if (r)
3230     return r;
3231 
3232   /* compare LS age. */
3233   if (IS_LSA_MAXAGE (l1) && !IS_LSA_MAXAGE (l2))
3234     return 1;
3235   else if (!IS_LSA_MAXAGE (l1) && IS_LSA_MAXAGE (l2))
3236     return -1;
3237 
3238   /* compare LS age with MaxAgeDiff. */
3239   if (LS_AGE (l1) - LS_AGE (l2) > OSPF_LSA_MAXAGE_DIFF)
3240     return -1;
3241   else if (LS_AGE (l2) - LS_AGE (l1) > OSPF_LSA_MAXAGE_DIFF)
3242     return 1;
3243 
3244   /* LSAs are identical. */
3245   return 0;
3246 }
3247 
3248 /* If two LSAs are different, return 1, otherwise return 0. */
3249 int
ospf_lsa_different(struct ospf_lsa * l1,struct ospf_lsa * l2)3250 ospf_lsa_different (struct ospf_lsa *l1, struct ospf_lsa *l2)
3251 {
3252   char *p1, *p2;
3253   assert (l1);
3254   assert (l2);
3255   assert (l1->data);
3256   assert (l2->data);
3257 
3258   if (l1->data->options != l2->data->options)
3259     return 1;
3260 
3261   if (IS_LSA_MAXAGE (l1) && !IS_LSA_MAXAGE (l2))
3262     return 1;
3263 
3264   if (IS_LSA_MAXAGE (l2) && !IS_LSA_MAXAGE (l1))
3265     return 1;
3266 
3267   if (l1->data->length != l2->data->length)
3268     return 1;
3269 
3270   if (l1->data->length ==  0)
3271     return 1;
3272 
3273   if (CHECK_FLAG ((l1->flags ^ l2->flags), OSPF_LSA_RECEIVED))
3274     return 1; /* May be a stale LSA in the LSBD */
3275 
3276   assert ( ntohs(l1->data->length) > OSPF_LSA_HEADER_SIZE);
3277 
3278   p1 = (char *) l1->data;
3279   p2 = (char *) l2->data;
3280 
3281   if (memcmp (p1 + OSPF_LSA_HEADER_SIZE, p2 + OSPF_LSA_HEADER_SIZE,
3282               ntohs( l1->data->length ) - OSPF_LSA_HEADER_SIZE) != 0)
3283     return 1;
3284 
3285   return 0;
3286 }
3287 
3288 #ifdef ORIGINAL_CODING
3289 void
ospf_lsa_flush_self_originated(struct ospf_neighbor * nbr,struct ospf_lsa * self,struct ospf_lsa * new)3290 ospf_lsa_flush_self_originated (struct ospf_neighbor *nbr,
3291                                 struct ospf_lsa *self,
3292                                 struct ospf_lsa *new)
3293 {
3294   u_int32_t seqnum;
3295 
3296   /* Adjust LS Sequence Number. */
3297   seqnum = ntohl (new->data->ls_seqnum) + 1;
3298   self->data->ls_seqnum = htonl (seqnum);
3299 
3300   /* Recalculate LSA checksum. */
3301   ospf_lsa_checksum (self->data);
3302 
3303   /* Reflooding LSA. */
3304   /*  RFC2328  Section 13.3
3305 	    On non-broadcast networks, separate	Link State Update
3306 	    packets must be sent, as unicasts, to each adjacent	neighbor
3307 	    (i.e., those in state Exchange or greater).	 The destination
3308 	    IP addresses for these packets are the neighbors' IP
3309 	    addresses.   */
3310   if (nbr->oi->type == OSPF_IFTYPE_NBMA)
3311     {
3312       struct route_node *rn;
3313       struct ospf_neighbor *onbr;
3314 
3315       for (rn = route_top (nbr->oi->nbrs); rn; rn = route_next (rn))
3316 	if ((onbr = rn->info) != NULL)
3317 	  if (onbr != nbr->oi->nbr_self && onbr->status >= NSM_Exchange)
3318 	    ospf_ls_upd_send_lsa (onbr, self, OSPF_SEND_PACKET_DIRECT);
3319     }
3320   else
3321   ospf_ls_upd_send_lsa (nbr, self, OSPF_SEND_PACKET_INDIRECT);
3322 
3323   if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
3324     zlog_debug ("LSA[Type%d:%s]: Flush self-originated LSA",
3325 	       self->data->type, inet_ntoa (self->data->id));
3326 }
3327 #else /* ORIGINAL_CODING */
3328 static int
ospf_lsa_flush_schedule(struct ospf * ospf,struct ospf_lsa * lsa)3329 ospf_lsa_flush_schedule (struct ospf *ospf, struct ospf_lsa *lsa)
3330 {
3331   if (lsa == NULL || !IS_LSA_SELF (lsa))
3332     return 0;
3333 
3334   if (IS_DEBUG_OSPF_EVENT)
3335     zlog_debug ("LSA[Type%d:%s]: Schedule self-originated LSA to FLUSH", lsa->data->type, inet_ntoa (lsa->data->id));
3336 
3337   /* Force given lsa's age to MaxAge. */
3338   lsa->data->ls_age = htons (OSPF_LSA_MAXAGE);
3339 
3340   switch (lsa->data->type)
3341     {
3342     /* Opaque wants to be notified of flushes */
3343     case OSPF_OPAQUE_LINK_LSA:
3344     case OSPF_OPAQUE_AREA_LSA:
3345     case OSPF_OPAQUE_AS_LSA:
3346       ospf_opaque_lsa_refresh (lsa);
3347       break;
3348     default:
3349       ospf_refresher_unregister_lsa (ospf, lsa);
3350       ospf_lsa_flush (ospf, lsa);
3351       break;
3352     }
3353 
3354   return 0;
3355 }
3356 
3357 void
ospf_flush_self_originated_lsas_now(struct ospf * ospf)3358 ospf_flush_self_originated_lsas_now (struct ospf *ospf)
3359 {
3360   struct listnode *node, *nnode;
3361   struct listnode *node2, *nnode2;
3362   struct ospf_area *area;
3363   struct ospf_interface *oi;
3364   struct ospf_lsa *lsa;
3365   struct route_node *rn;
3366   int need_to_flush_ase = 0;
3367 
3368   for (ALL_LIST_ELEMENTS (ospf->areas, node, nnode, area))
3369     {
3370       if ((lsa = area->router_lsa_self) != NULL)
3371         {
3372           if (IS_DEBUG_OSPF_EVENT)
3373             zlog_debug ("LSA[Type%d:%s]: Schedule self-originated LSA to FLUSH",
3374                         lsa->data->type, inet_ntoa (lsa->data->id));
3375 
3376           ospf_refresher_unregister_lsa (ospf, lsa);
3377           ospf_lsa_flush_area (lsa, area);
3378           ospf_lsa_unlock (&area->router_lsa_self);
3379           area->router_lsa_self = NULL;
3380         }
3381 
3382       for (ALL_LIST_ELEMENTS (area->oiflist, node2, nnode2, oi))
3383         {
3384           if ((lsa = oi->network_lsa_self) != NULL
3385                &&   oi->state == ISM_DR
3386                &&   oi->full_nbrs > 0)
3387             {
3388               if (IS_DEBUG_OSPF_EVENT)
3389                 zlog_debug ("LSA[Type%d:%s]: Schedule self-originated LSA to FLUSH",
3390                             lsa->data->type, inet_ntoa (lsa->data->id));
3391 
3392               ospf_refresher_unregister_lsa (ospf, oi->network_lsa_self);
3393               ospf_lsa_flush_area (oi->network_lsa_self, area);
3394               ospf_lsa_unlock (&oi->network_lsa_self);
3395               oi->network_lsa_self = NULL;
3396             }
3397 
3398           if (oi->type != OSPF_IFTYPE_VIRTUALLINK
3399           &&  area->external_routing == OSPF_AREA_DEFAULT)
3400             need_to_flush_ase = 1;
3401         }
3402 
3403       LSDB_LOOP (SUMMARY_LSDB (area), rn, lsa)
3404 	ospf_lsa_flush_schedule (ospf, lsa);
3405       LSDB_LOOP (ASBR_SUMMARY_LSDB (area), rn, lsa)
3406 	ospf_lsa_flush_schedule (ospf, lsa);
3407       LSDB_LOOP (OPAQUE_LINK_LSDB (area), rn, lsa)
3408 	ospf_lsa_flush_schedule (ospf, lsa);
3409       LSDB_LOOP (OPAQUE_AREA_LSDB (area), rn, lsa)
3410 	ospf_lsa_flush_schedule (ospf, lsa);
3411     }
3412 
3413   if (need_to_flush_ase)
3414     {
3415       LSDB_LOOP (EXTERNAL_LSDB (ospf), rn, lsa)
3416 	ospf_lsa_flush_schedule (ospf, lsa);
3417       LSDB_LOOP (OPAQUE_AS_LSDB (ospf), rn, lsa)
3418 	ospf_lsa_flush_schedule (ospf, lsa);
3419     }
3420 
3421   /*
3422    * Make sure that the MaxAge LSA remover is executed immediately,
3423    * without conflicting to other threads.
3424    */
3425   if (ospf->t_maxage != NULL)
3426     {
3427       OSPF_TIMER_OFF (ospf->t_maxage);
3428       thread_execute (master, ospf_maxage_lsa_remover, ospf, 0);
3429     }
3430 
3431   return;
3432 }
3433 #endif /* ORIGINAL_CODING */
3434 
3435 /* If there is self-originated LSA, then return 1, otherwise return 0. */
3436 /* An interface-independent version of ospf_lsa_is_self_originated */
3437 int
ospf_lsa_is_self_originated(struct ospf * ospf,struct ospf_lsa * lsa)3438 ospf_lsa_is_self_originated (struct ospf *ospf, struct ospf_lsa *lsa)
3439 {
3440   struct listnode *node;
3441   struct ospf_interface *oi;
3442 
3443   /* This LSA is already checked. */
3444   if (CHECK_FLAG (lsa->flags, OSPF_LSA_SELF_CHECKED))
3445     return IS_LSA_SELF (lsa);
3446 
3447   /* Make sure LSA is self-checked. */
3448   SET_FLAG (lsa->flags, OSPF_LSA_SELF_CHECKED);
3449 
3450   /* AdvRouter and Router ID is the same. */
3451   if (IPV4_ADDR_SAME (&lsa->data->adv_router, &ospf->router_id))
3452     SET_FLAG (lsa->flags, OSPF_LSA_SELF);
3453 
3454   /* LSA is router-LSA. */
3455   else if (lsa->data->type == OSPF_ROUTER_LSA &&
3456       IPV4_ADDR_SAME (&lsa->data->id, &ospf->router_id))
3457     SET_FLAG (lsa->flags, OSPF_LSA_SELF);
3458 
3459   /* LSA is network-LSA.  Compare Link ID with all interfaces. */
3460   else if (lsa->data->type == OSPF_NETWORK_LSA)
3461     for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi))
3462       {
3463 	/* Ignore virtual link. */
3464         if (oi->type != OSPF_IFTYPE_VIRTUALLINK)
3465 	  if (oi->address->family == AF_INET)
3466 	    if (IPV4_ADDR_SAME (&lsa->data->id, &oi->address->u.prefix4))
3467 	      {
3468 		/* to make it easier later */
3469 		SET_FLAG (lsa->flags, OSPF_LSA_SELF);
3470 		return IS_LSA_SELF (lsa);
3471 	      }
3472       }
3473 
3474   return IS_LSA_SELF (lsa);
3475 }
3476 
3477 /* Get unique Link State ID. */
3478 struct in_addr
ospf_lsa_unique_id(struct ospf * ospf,struct ospf_lsdb * lsdb,u_char type,struct prefix_ipv4 * p)3479 ospf_lsa_unique_id (struct ospf *ospf,
3480 		    struct ospf_lsdb *lsdb, u_char type, struct prefix_ipv4 *p)
3481 {
3482   struct ospf_lsa *lsa;
3483   struct in_addr mask, id;
3484 
3485   id = p->prefix;
3486 
3487   /* Check existence of LSA instance. */
3488   lsa = ospf_lsdb_lookup_by_id (lsdb, type, id, ospf->router_id);
3489   if (lsa)
3490     {
3491       struct as_external_lsa *al = (struct as_external_lsa *) lsa->data;
3492       if (ip_masklen (al->mask) == p->prefixlen)
3493 	{
3494 	  if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
3495 	    zlog_debug ("ospf_lsa_unique_id(): "
3496 		       "Can't get Link State ID for %s/%d",
3497 		       inet_ntoa (p->prefix), p->prefixlen);
3498 	  /*	  id.s_addr = 0; */
3499 	  id.s_addr = 0xffffffff;
3500 	  return id;
3501 	}
3502       /* Masklen differs, then apply wildcard mask to Link State ID. */
3503       else
3504 	{
3505 	  masklen2ip (p->prefixlen, &mask);
3506 
3507 	  id.s_addr = p->prefix.s_addr | (~mask.s_addr);
3508 	  lsa = ospf_lsdb_lookup_by_id (ospf->lsdb, type,
3509 				       id, ospf->router_id);
3510 	  if (lsa)
3511 	    {
3512 	      if (IS_DEBUG_OSPF (lsa, LSA_GENERATE))
3513 		zlog_debug ("ospf_lsa_unique_id(): "
3514 			   "Can't get Link State ID for %s/%d",
3515 			   inet_ntoa (p->prefix), p->prefixlen);
3516 	      /* 	      id.s_addr = 0; */
3517 	      id.s_addr = 0xffffffff;
3518 	      return id;
3519 	    }
3520 	}
3521     }
3522 
3523   return id;
3524 }
3525 
3526 
3527 #define LSA_ACTION_FLOOD_AREA 1
3528 #define LSA_ACTION_FLUSH_AREA 2
3529 
3530 struct lsa_action
3531 {
3532   u_char action;
3533   struct ospf_area *area;
3534   struct ospf_lsa *lsa;
3535 };
3536 
3537 static int
ospf_lsa_action(struct thread * t)3538 ospf_lsa_action (struct thread *t)
3539 {
3540   struct lsa_action *data;
3541 
3542   data = THREAD_ARG (t);
3543 
3544   if (IS_DEBUG_OSPF (lsa, LSA) == OSPF_DEBUG_LSA)
3545     zlog_debug ("LSA[Action]: Performing scheduled LSA action: %d",
3546 	       data->action);
3547 
3548   switch (data->action)
3549     {
3550     case LSA_ACTION_FLOOD_AREA:
3551       ospf_flood_through_area (data->area, NULL, data->lsa);
3552       break;
3553     case LSA_ACTION_FLUSH_AREA:
3554       ospf_lsa_flush_area (data->lsa, data->area);
3555       break;
3556     }
3557 
3558   ospf_lsa_unlock (&data->lsa); /* Message */
3559   XFREE (MTYPE_OSPF_MESSAGE, data);
3560   return 0;
3561 }
3562 
3563 void
ospf_schedule_lsa_flood_area(struct ospf_area * area,struct ospf_lsa * lsa)3564 ospf_schedule_lsa_flood_area (struct ospf_area *area, struct ospf_lsa *lsa)
3565 {
3566   struct lsa_action *data;
3567 
3568   data = XCALLOC (MTYPE_OSPF_MESSAGE, sizeof (struct lsa_action));
3569   data->action = LSA_ACTION_FLOOD_AREA;
3570   data->area = area;
3571   data->lsa  = ospf_lsa_lock (lsa); /* Message / Flood area */
3572 
3573   thread_add_event (master, ospf_lsa_action, data, 0);
3574 }
3575 
3576 void
ospf_schedule_lsa_flush_area(struct ospf_area * area,struct ospf_lsa * lsa)3577 ospf_schedule_lsa_flush_area (struct ospf_area *area, struct ospf_lsa *lsa)
3578 {
3579   struct lsa_action *data;
3580 
3581   data = XCALLOC (MTYPE_OSPF_MESSAGE, sizeof (struct lsa_action));
3582   data->action = LSA_ACTION_FLUSH_AREA;
3583   data->area = area;
3584   data->lsa  = ospf_lsa_lock (lsa); /* Message / Flush area */
3585 
3586   thread_add_event (master, ospf_lsa_action, data, 0);
3587 }
3588 
3589 
3590 /* LSA Refreshment functions. */
3591 struct ospf_lsa *
ospf_lsa_refresh(struct ospf * ospf,struct ospf_lsa * lsa)3592 ospf_lsa_refresh (struct ospf *ospf, struct ospf_lsa *lsa)
3593 {
3594   struct external_info *ei;
3595   struct ospf_lsa *new = NULL;
3596   assert (CHECK_FLAG (lsa->flags, OSPF_LSA_SELF));
3597   assert (IS_LSA_SELF (lsa));
3598   assert (lsa->lock > 0);
3599 
3600   switch (lsa->data->type)
3601     {
3602       /* Router and Network LSAs are processed differently. */
3603     case OSPF_ROUTER_LSA:
3604       new = ospf_router_lsa_refresh (lsa);
3605       break;
3606     case OSPF_NETWORK_LSA:
3607       new = ospf_network_lsa_refresh (lsa);
3608       break;
3609     case OSPF_SUMMARY_LSA:
3610       new = ospf_summary_lsa_refresh (ospf, lsa);
3611       break;
3612     case OSPF_ASBR_SUMMARY_LSA:
3613       new = ospf_summary_asbr_lsa_refresh (ospf, lsa);
3614       break;
3615     case OSPF_AS_EXTERNAL_LSA:
3616       /* Translated from NSSA Type-5s are refreshed when
3617        * from refresh of Type-7 - do not refresh these directly.
3618        */
3619       if (CHECK_FLAG (lsa->flags, OSPF_LSA_LOCAL_XLT))
3620         break;
3621       ei = ospf_external_info_check (lsa);
3622       if (ei)
3623         new = ospf_external_lsa_refresh (ospf, lsa, ei, LSA_REFRESH_FORCE);
3624       else
3625         ospf_lsa_flush_as (ospf, lsa);
3626       break;
3627     case OSPF_OPAQUE_LINK_LSA:
3628     case OSPF_OPAQUE_AREA_LSA:
3629     case OSPF_OPAQUE_AS_LSA:
3630       new = ospf_opaque_lsa_refresh (lsa);
3631       break;
3632     default:
3633       break;
3634     }
3635   return new;
3636 }
3637 
3638 void
ospf_refresher_register_lsa(struct ospf * ospf,struct ospf_lsa * lsa)3639 ospf_refresher_register_lsa (struct ospf *ospf, struct ospf_lsa *lsa)
3640 {
3641   u_int16_t index, current_index;
3642 
3643   assert (lsa->lock > 0);
3644   assert (IS_LSA_SELF (lsa));
3645 
3646   if (lsa->refresh_list < 0)
3647     {
3648       int delay;
3649 
3650       if (LS_AGE (lsa) == 0 &&
3651 	  ntohl (lsa->data->ls_seqnum) == OSPF_INITIAL_SEQUENCE_NUMBER)
3652 	/* Randomize first update by  OSPF_LS_REFRESH_SHIFT factor */
3653 	delay = OSPF_LS_REFRESH_SHIFT + (random () % OSPF_LS_REFRESH_TIME);
3654       else
3655 	/* Randomize another updates by +-OSPF_LS_REFRESH_JITTER factor */
3656 	delay = OSPF_LS_REFRESH_TIME - LS_AGE (lsa) - OSPF_LS_REFRESH_JITTER
3657 	  + (random () % (2*OSPF_LS_REFRESH_JITTER));
3658 
3659       if (delay < 0)
3660 	delay = 0;
3661 
3662       current_index = ospf->lsa_refresh_queue.index + (quagga_time (NULL)
3663                 - ospf->lsa_refresher_started)/OSPF_LSA_REFRESHER_GRANULARITY;
3664 
3665       index = (current_index + delay/OSPF_LSA_REFRESHER_GRANULARITY)
3666 	      % (OSPF_LSA_REFRESHER_SLOTS);
3667 
3668       if (IS_DEBUG_OSPF (lsa, LSA_REFRESH))
3669 	zlog_debug ("LSA[Refresh]: lsa %s with age %d added to index %d",
3670 		   inet_ntoa (lsa->data->id), LS_AGE (lsa), index);
3671       if (!ospf->lsa_refresh_queue.qs[index])
3672 	ospf->lsa_refresh_queue.qs[index] = list_new ();
3673       listnode_add (ospf->lsa_refresh_queue.qs[index],
3674                     ospf_lsa_lock (lsa)); /* lsa_refresh_queue */
3675       lsa->refresh_list = index;
3676       if (IS_DEBUG_OSPF (lsa, LSA_REFRESH))
3677         zlog_debug ("LSA[Refresh:%s]: ospf_refresher_register_lsa(): "
3678                    "setting refresh_list on lsa %p (slod %d)",
3679                    inet_ntoa (lsa->data->id), (void *)lsa, index);
3680     }
3681 }
3682 
3683 void
ospf_refresher_unregister_lsa(struct ospf * ospf,struct ospf_lsa * lsa)3684 ospf_refresher_unregister_lsa (struct ospf *ospf, struct ospf_lsa *lsa)
3685 {
3686   assert (lsa->lock > 0);
3687   assert (IS_LSA_SELF (lsa));
3688   if (lsa->refresh_list >= 0)
3689     {
3690       struct list *refresh_list = ospf->lsa_refresh_queue.qs[lsa->refresh_list];
3691       listnode_delete (refresh_list, lsa);
3692       if (!listcount (refresh_list))
3693 	{
3694 	  list_free (refresh_list);
3695 	  ospf->lsa_refresh_queue.qs[lsa->refresh_list] = NULL;
3696 	}
3697       ospf_lsa_unlock (&lsa); /* lsa_refresh_queue */
3698       lsa->refresh_list = -1;
3699     }
3700 }
3701 
3702 int
ospf_lsa_refresh_walker(struct thread * t)3703 ospf_lsa_refresh_walker (struct thread *t)
3704 {
3705   struct list *refresh_list;
3706   struct listnode *node, *nnode;
3707   struct ospf *ospf = THREAD_ARG (t);
3708   struct ospf_lsa *lsa;
3709   int i;
3710   struct list *lsa_to_refresh = list_new ();
3711 
3712   if (IS_DEBUG_OSPF (lsa, LSA_REFRESH))
3713     zlog_debug ("LSA[Refresh]:ospf_lsa_refresh_walker(): start");
3714 
3715 
3716   i = ospf->lsa_refresh_queue.index;
3717 
3718   /* Note: if clock has jumped backwards, then time change could be negative,
3719      so we are careful to cast the expression to unsigned before taking
3720      modulus. */
3721   ospf->lsa_refresh_queue.index =
3722    ((unsigned long)(ospf->lsa_refresh_queue.index +
3723 		    (quagga_time (NULL) - ospf->lsa_refresher_started)
3724 		    / OSPF_LSA_REFRESHER_GRANULARITY))
3725 		    % OSPF_LSA_REFRESHER_SLOTS;
3726 
3727   if (IS_DEBUG_OSPF (lsa, LSA_REFRESH))
3728     zlog_debug ("LSA[Refresh]: ospf_lsa_refresh_walker(): next index %d",
3729 	       ospf->lsa_refresh_queue.index);
3730 
3731   for (;i != ospf->lsa_refresh_queue.index;
3732        i = (i + 1) % OSPF_LSA_REFRESHER_SLOTS)
3733     {
3734       if (IS_DEBUG_OSPF (lsa, LSA_REFRESH))
3735 	zlog_debug ("LSA[Refresh]: ospf_lsa_refresh_walker(): "
3736 	           "refresh index %d", i);
3737 
3738       refresh_list = ospf->lsa_refresh_queue.qs [i];
3739 
3740       assert (i >= 0);
3741 
3742       ospf->lsa_refresh_queue.qs [i] = NULL;
3743 
3744       if (refresh_list)
3745 	{
3746 	  for (ALL_LIST_ELEMENTS (refresh_list, node, nnode, lsa))
3747 	    {
3748 	      if (IS_DEBUG_OSPF (lsa, LSA_REFRESH))
3749 		zlog_debug ("LSA[Refresh:%s]: ospf_lsa_refresh_walker(): "
3750 		           "refresh lsa %p (slot %d)",
3751 		           inet_ntoa (lsa->data->id), (void *)lsa, i);
3752 
3753 	      assert (lsa->lock > 0);
3754 	      list_delete_node (refresh_list, node);
3755 	      lsa->refresh_list = -1;
3756 	      listnode_add (lsa_to_refresh, lsa);
3757 	    }
3758 	  list_free (refresh_list);
3759 	}
3760     }
3761 
3762   ospf->t_lsa_refresher = thread_add_timer (master, ospf_lsa_refresh_walker,
3763 					   ospf, ospf->lsa_refresh_interval);
3764   ospf->lsa_refresher_started = quagga_time (NULL);
3765 
3766   for (ALL_LIST_ELEMENTS (lsa_to_refresh, node, nnode, lsa))
3767     {
3768       ospf_lsa_refresh (ospf, lsa);
3769       assert (lsa->lock > 0);
3770       ospf_lsa_unlock (&lsa); /* lsa_refresh_queue & temp for lsa_to_refresh*/
3771     }
3772 
3773   list_delete (lsa_to_refresh);
3774 
3775   if (IS_DEBUG_OSPF (lsa, LSA_REFRESH))
3776     zlog_debug ("LSA[Refresh]: ospf_lsa_refresh_walker(): end");
3777 
3778   return 0;
3779 }
3780 
3781