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