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