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