1/* 2 * OSPF ABR functions. 3 * Copyright (C) 1999, 2000 Alex Zinin, Toshiaki Takada 4 * 5 * This file is part of GNU Zebra. 6 * 7 * GNU Zebra is free software; you can redistribute it and/or modify it 8 * under the terms of the GNU General Public License as published by the 9 * Free Software Foundation; either version 2, or (at your option) any 10 * later version. 11 * 12 * GNU Zebra is distributed in the hope that it will be useful, but 13 * WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 * General Public License for more details. 16 * 17 * You should have received a copy of the GNU General Public License 18 * along with GNU Zebra; see the file COPYING. If not, write to the Free 19 * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 20 * 02111-1307, USA. 21 */ 22 23 24#include <zebra.h> 25 26#include "thread.h" 27#include "memory.h" 28#include "linklist.h" 29#include "prefix.h" 30#include "if.h" 31#include "table.h" 32#include "vty.h" 33#include "filter.h" 34#include "plist.h" 35#include "log.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_spf.h" 46#include "ospfd/ospf_route.h" 47#include "ospfd/ospf_ia.h" 48#include "ospfd/ospf_flood.h" 49#include "ospfd/ospf_abr.h" 50#include "ospfd/ospf_ase.h" 51#include "ospfd/ospf_zebra.h" 52#include "ospfd/ospf_dump.h" 53 54 55struct ospf_area_range * 56ospf_area_range_new (struct prefix_ipv4 *p) 57{ 58 struct ospf_area_range *range; 59 60 range = XCALLOC (MTYPE_OSPF_AREA_RANGE, sizeof (struct ospf_area_range)); 61 range->addr = p->prefix; 62 range->masklen = p->prefixlen; 63 range->cost_config = OSPF_AREA_RANGE_COST_UNSPEC; 64 65 return range; 66} 67 68void 69ospf_area_range_free (struct ospf_area_range *range) 70{ 71 XFREE (MTYPE_OSPF_AREA_RANGE, range); 72} 73 74void 75ospf_area_range_add (struct ospf_area *area, struct ospf_area_range *range) 76{ 77 struct route_node *rn; 78 struct prefix_ipv4 p; 79 80 p.family = AF_INET; 81 p.prefixlen = range->masklen; 82 p.prefix = range->addr; 83 84 rn = route_node_get (area->ranges, (struct prefix *)&p); 85 if (rn->info) 86 route_unlock_node (rn); 87 else 88 rn->info = range; 89} 90 91void 92ospf_area_range_delete (struct ospf_area *area, struct ospf_area_range *range) 93{ 94 struct route_node *rn; 95 struct prefix_ipv4 p; 96 97 p.family = AF_INET; 98 p.prefixlen = range->masklen; 99 p.prefix = range->addr; 100 101 rn = route_node_lookup (area->ranges, (struct prefix *)&p); 102 if (rn) 103 { 104 ospf_area_range_free (rn->info); 105 rn->info = NULL; 106 route_unlock_node (rn); 107 route_unlock_node (rn); 108 } 109} 110 111struct ospf_area_range * 112ospf_area_range_lookup (struct ospf_area *area, struct prefix_ipv4 *p) 113{ 114 struct route_node *rn; 115 116 rn = route_node_lookup (area->ranges, (struct prefix *)p); 117 if (rn) 118 { 119 route_unlock_node (rn); 120 return rn->info; 121 } 122 return NULL; 123} 124 125struct ospf_area_range * 126ospf_area_range_lookup_next (struct ospf_area *area, struct in_addr *range_net, 127 int first) 128{ 129 struct route_node *rn; 130 struct prefix_ipv4 p; 131 struct ospf_area_range *find; 132 133 p.family = AF_INET; 134 p.prefixlen = IPV4_MAX_BITLEN; 135 p.prefix = *range_net; 136 137 if (first) 138 rn = route_top (area->ranges); 139 else 140 { 141 rn = route_node_get (area->ranges, (struct prefix *) &p); 142 rn = route_next (rn); 143 } 144 145 for (; rn; rn = route_next (rn)) 146 if (rn->info) 147 break; 148 149 if (rn && rn->info) 150 { 151 find = rn->info; 152 *range_net = rn->p.u.prefix4; 153 route_unlock_node (rn); 154 return find; 155 } 156 return NULL; 157} 158 159struct ospf_area_range * 160ospf_area_range_match (struct ospf_area *area, struct prefix_ipv4 *p) 161{ 162 struct route_node *node; 163 164 node = route_node_match (area->ranges, (struct prefix *) p); 165 if (node) 166 { 167 route_unlock_node (node); 168 return node->info; 169 } 170 return NULL; 171} 172 173struct ospf_area_range * 174ospf_area_range_match_any (struct ospf *ospf, struct prefix_ipv4 *p) 175{ 176 struct ospf_area_range *range; 177 listnode node; 178 179 for (node = listhead (ospf->areas); node; nextnode (node)) 180 if ((range = ospf_area_range_match (node->data, p))) 181 return range; 182 183 return NULL; 184} 185 186int 187ospf_area_range_active (struct ospf_area_range *range) 188{ 189 return range->specifics; 190} 191 192int 193ospf_area_actively_attached (struct ospf_area *area) 194{ 195 return area->act_ints; 196} 197 198int 199ospf_area_range_set (struct ospf *ospf, struct in_addr area_id, 200 struct prefix_ipv4 *p, int advertise) 201{ 202 struct ospf_area *area; 203 struct ospf_area_range *range; 204 int ret = OSPF_AREA_ID_FORMAT_DECIMAL; 205 206 area = ospf_area_get (area_id, ret); 207 if (area == NULL) 208 return 0; 209 210 range = ospf_area_range_lookup (area, p); 211 if (range != NULL) 212 { 213 if ((CHECK_FLAG (range->flags, OSPF_AREA_RANGE_ADVERTISE) 214 && !CHECK_FLAG (advertise, OSPF_AREA_RANGE_ADVERTISE)) 215 || (!CHECK_FLAG (range->flags, OSPF_AREA_RANGE_ADVERTISE) 216 && CHECK_FLAG (advertise, OSPF_AREA_RANGE_ADVERTISE))) 217 ospf_schedule_abr_task (); 218 } 219 else 220 { 221 range = ospf_area_range_new (p); 222 ospf_area_range_add (area, range); 223 ospf_schedule_abr_task (); 224 } 225 226 if (CHECK_FLAG (advertise, OSPF_AREA_RANGE_ADVERTISE)) 227 SET_FLAG (range->flags, OSPF_AREA_RANGE_ADVERTISE); 228 else 229 UNSET_FLAG (range->flags, OSPF_AREA_RANGE_ADVERTISE); 230 231 return 1; 232} 233 234int 235ospf_area_range_cost_set (struct ospf *ospf, struct in_addr area_id, 236 struct prefix_ipv4 *p, u_int32_t cost) 237{ 238 struct ospf_area *area; 239 struct ospf_area_range *range; 240 int ret = OSPF_AREA_ID_FORMAT_DECIMAL; 241 242 area = ospf_area_get (area_id, ret); 243 if (area == NULL) 244 return 0; 245 246 range = ospf_area_range_new (p); 247 if (range == NULL) 248 return 0; 249 250 if (range->cost_config != cost) 251 { 252 range->cost_config = cost; 253 if (ospf_area_range_active (range)) 254 ospf_schedule_abr_task (); 255 } 256 257 return 1; 258} 259 260int 261ospf_area_range_unset (struct ospf *ospf, struct in_addr area_id, 262 struct prefix_ipv4 *p) 263{ 264 struct ospf_area *area; 265 struct ospf_area_range *range; 266 267 area = ospf_area_lookup_by_area_id (area_id); 268 if (area == NULL) 269 return 0; 270 271 range = ospf_area_range_lookup (area, p); 272 if (range == NULL) 273 return 0; 274 275 if (ospf_area_range_active (range)) 276 ospf_schedule_abr_task (); 277 278 ospf_area_range_delete (area, range); 279 280 return 1; 281} 282 283int 284ospf_area_range_substitute_set (struct ospf *ospf, struct in_addr area_id, 285 struct prefix_ipv4 *p, struct prefix_ipv4 *s) 286{ 287 struct ospf_area *area; 288 struct ospf_area_range *range; 289 int ret = OSPF_AREA_ID_FORMAT_DECIMAL; 290 291 area = ospf_area_get (area_id, ret); 292 range = ospf_area_range_lookup (area, p); 293 294 if (range != NULL) 295 { 296 if (!CHECK_FLAG (range->flags, OSPF_AREA_RANGE_ADVERTISE) || 297 !CHECK_FLAG (range->flags, OSPF_AREA_RANGE_SUBSTITUTE)) 298 ospf_schedule_abr_task (); 299 } 300 else 301 { 302 range = ospf_area_range_new (p); 303 ospf_area_range_add (area, range); 304 ospf_schedule_abr_task (); 305 } 306 307 SET_FLAG (range->flags, OSPF_AREA_RANGE_ADVERTISE); 308 SET_FLAG (range->flags, OSPF_AREA_RANGE_SUBSTITUTE); 309 range->subst_addr = s->prefix; 310 range->subst_masklen = s->prefixlen; 311 312 return 1; 313} 314 315int 316ospf_area_range_substitute_unset (struct ospf *ospf, struct in_addr area_id, 317 struct prefix_ipv4 *p) 318{ 319 struct ospf_area *area; 320 struct ospf_area_range *range; 321 322 area = ospf_area_lookup_by_area_id (area_id); 323 if (area == NULL) 324 return 0; 325 326 range = ospf_area_range_lookup (area, p); 327 if (range == NULL) 328 return 0; 329 330 if (CHECK_FLAG (range->flags, OSPF_AREA_RANGE_SUBSTITUTE)) 331 if (ospf_area_range_active (range)) 332 ospf_schedule_abr_task (); 333 334 UNSET_FLAG (range->flags, OSPF_AREA_RANGE_SUBSTITUTE); 335 range->subst_addr.s_addr = 0; 336 range->subst_masklen = 0; 337 338 return 1; 339} 340 341int 342ospf_act_bb_connection () 343{ 344 if (ospf_top->backbone == NULL) 345 return 0; 346 347 return ospf_top->backbone->full_nbrs; 348} 349 350/* Check area border router status. */ 351void 352ospf_check_abr_status () 353{ 354 struct ospf_area *area; 355 listnode node; 356 int bb_configured = 0; 357 int bb_act_attached = 0; 358 int areas_configured = 0; 359 int areas_act_attached = 0; 360 361 u_char new_flags = ospf_top->flags; 362 363 if (IS_DEBUG_OSPF_EVENT) 364 zlog_info ("ospf_check_abr_status(): Start"); 365 366 for (node = listhead (ospf_top->areas); node; nextnode (node)) 367 { 368 area = getdata (node); 369 370 if (listcount (area->oiflist)) 371 { 372 areas_configured++; 373 374 if (OSPF_IS_AREA_BACKBONE (area)) 375 bb_configured = 1; 376 } 377 378 if (ospf_area_actively_attached (area)) 379 { 380 areas_act_attached++; 381 382 if (OSPF_IS_AREA_BACKBONE (area)) 383 bb_act_attached = 1; 384 } 385 } 386 387 if (IS_DEBUG_OSPF_EVENT) 388 { 389 zlog_info ("ospf_check_abr_status(): looked through areas"); 390 zlog_info ("ospf_check_abr_status(): bb_configured: %d", bb_configured); 391 zlog_info ("ospf_check_abr_status(): bb_act_attached: %d", 392 bb_act_attached); 393 zlog_info ("ospf_check_abr_status(): areas_configured: %d", 394 areas_configured); 395 zlog_info ("ospf_check_abr_status(): areas_act_attached: %d", 396 areas_act_attached); 397 } 398 399 switch (ospf_top->abr_type) 400 { 401 case OSPF_ABR_SHORTCUT: 402 case OSPF_ABR_STAND: 403 if (areas_act_attached > 1) 404 SET_FLAG (new_flags, OSPF_FLAG_ABR); 405 else 406 UNSET_FLAG (new_flags, OSPF_FLAG_ABR); 407 break; 408 409 case OSPF_ABR_IBM: 410 if ((areas_act_attached > 1) && bb_configured) 411 SET_FLAG (new_flags, OSPF_FLAG_ABR); 412 else 413 UNSET_FLAG (new_flags, OSPF_FLAG_ABR); 414 break; 415 416 case OSPF_ABR_CISCO: 417 if ((areas_configured > 1) && bb_act_attached) 418 SET_FLAG (new_flags, OSPF_FLAG_ABR); 419 else 420 UNSET_FLAG (new_flags, OSPF_FLAG_ABR); 421 break; 422 default: 423 break; 424 } 425 426 if (new_flags != ospf_top->flags) 427 { 428 ospf_spf_calculate_schedule (); 429 if (IS_DEBUG_OSPF_EVENT) 430 zlog_info ("ospf_check_abr_status(): new router flags: %x",new_flags); 431 ospf_top->flags = new_flags; 432 OSPF_TIMER_ON (ospf_top->t_router_lsa_update, 433 ospf_router_lsa_update_timer, OSPF_LSA_UPDATE_DELAY); 434 } 435} 436 437void 438ospf_abr_update_aggregate (struct ospf_area_range *range, 439 struct ospf_route *or) 440{ 441 if (IS_DEBUG_OSPF_EVENT) 442 zlog_info ("ospf_abr_update_aggregate(): Start"); 443 444 if (range->cost_config != -1) 445 { 446 if (IS_DEBUG_OSPF_EVENT) 447 zlog_info ("ospf_abr_update_aggregate(): use configured cost %d", 448 range->cost_config); 449 450 range->cost = range->cost_config; 451 } 452 else 453 { 454 if (range->specifics == 0) 455 range->cost = or->cost; /* 1st time get 1st cost */ 456 457 if (or->cost < range->cost) 458 { 459 if (IS_DEBUG_OSPF_EVENT) 460 zlog_info ("ospf_abr_update_aggregate(): lowest cost, update"); 461 462 range->cost = or->cost; 463 } 464 } 465 466 range->specifics++; 467} 468 469static void 470set_metric (struct ospf_lsa *lsa, u_int32_t metric) 471{ 472 struct summary_lsa *header; 473 u_char *mp; 474 metric = htonl (metric); 475 mp = (char *) &metric; 476 mp++; 477 header = (struct summary_lsa *) lsa->data; 478 memcpy(header->metric, mp, 3); 479} 480 481#ifdef HAVE_NSSA 482int 483ospf_abr_check_nssa_range (struct prefix_ipv4 *p, u_int32_t cost, 484 struct ospf_area *area) 485{ 486 /* The Type-7 is tested against the aggregated prefix and forwarded 487 for lsa installation and flooding */ 488 return 0; 489} 490 491/* ospf_abr_translate_nssa */ 492int 493ospf_abr_translate_nssa (struct ospf_lsa *lsa, void *p_arg, int int_arg) 494{ 495 /* Incoming Type-7 or later aggregated Type-7 496 497 LSA is skipped if P-bit is off. 498 LSA is aggregated if within range. 499 500 The Type-7 is translated, Installed/Approved as a Type-5 into 501 global LSDB, then Flooded through AS 502 503 Later, any Unapproved Translated Type-5's are flushed/discarded */ 504 505 struct ospf_lsa *dup; 506 507 if (! CHECK_FLAG (lsa->data->options, OSPF_OPTION_NP)) 508 { 509 if (IS_DEBUG_OSPF_NSSA) 510 zlog_info ("ospf_abr_nssa(): P-bit off, NO Translation"); 511 return 0; 512 } 513 514 if (IS_DEBUG_OSPF_NSSA) 515 zlog_info ("ospf_abr_nssa(): TRANSLATING 7 to 5"); 516 517 /* No more P-bit. */ 518 /* UNSET_FLAG (lsa->data->options, OSPF_OPTION_NP); */ 519 520 /* Area where Aggregate testing will be inserted, just like summary 521 advertisements */ 522 /* ospf_abr_check_nssa_range (p_arg, lsa-> cost, lsa -> area); */ 523 524 /* Follow thru here means no aggregation */ 525 dup = ospf_lsa_dup (lsa); /* keep LSDB intact, lock = 1 */ 526 527 SET_FLAG (dup->flags, OSPF_LSA_LOCAL_XLT); /* Translated from 7 */ 528 SET_FLAG (dup->flags, OSPF_LSA_APPROVED); /* So, do not remove it */ 529 530 dup->data->type = OSPF_AS_EXTERNAL_LSA; /* make Type-5 */ 531 532 ospf_lsa_checksum (dup->data); 533 534 ospf_lsa_install (NULL, dup); /* Install this Type-5 into LSDB, Lock = 2. */ 535 536 ospf_flood_through_as (NULL, dup); /* flood non-NSSA/STUB areas */ 537 538 /* This translated Type-5 will go to all non-NSSA areas connected to 539 this ABR; The Type-5 could come from any of the NSSA's connected 540 to this ABR. */ 541 542 return 0; 543} 544 545void 546ospf_abr_translate_nssa_range (struct prefix_ipv4 *p, u_int32_t cost) 547{ 548 /* The Type-7 is created from the aggregated prefix and forwarded 549 for lsa installation and flooding... to be added... */ 550} 551#endif /* HAVE_NSSA */ 552 553void 554ospf_abr_announce_network_to_area (struct prefix_ipv4 *p, u_int32_t cost, 555 struct ospf_area *area) 556{ 557 struct ospf_lsa *lsa, *old = NULL; 558 struct summary_lsa *sl = NULL; 559 560 if (IS_DEBUG_OSPF_EVENT) 561 zlog_info ("ospf_abr_announce_network_to_area(): Start"); 562 563 old = OSPF_SUMMARY_LSA_SELF_FIND_BY_PREFIX (area, p); 564 565 if (old) 566 { 567 if (IS_DEBUG_OSPF_EVENT) 568 zlog_info ("ospf_abr_announce_network_to_area(): old summary found"); 569 sl = (struct summary_lsa *) old->data; 570 571 if (IS_DEBUG_OSPF_EVENT) 572 zlog_info ("ospf_abr_announce_network_to_area(): " 573 "old metric: %d, new metric: %d", 574 GET_METRIC (sl->metric), cost); 575 } 576 577 if (old && (GET_METRIC (sl->metric) == cost)) 578 { 579 if (IS_DEBUG_OSPF_EVENT) 580 zlog_info ("ospf_abr_announce_network_to_area(): " 581 "old summary approved"); 582 SET_FLAG (old->flags, OSPF_LSA_APPROVED); 583 } 584 else 585 { 586 if (IS_DEBUG_OSPF_EVENT) 587 zlog_info ("ospf_abr_announce_network_to_area(): " 588 "creating new summary"); 589 if (old) 590 { 591 592 set_metric (old, cost); 593 lsa = ospf_summary_lsa_refresh (old); 594 /* This will flood through area. */ 595 } 596 else 597 { 598 lsa = ospf_summary_lsa_originate (p, cost, area); 599 /* This will flood through area. */ 600 } 601 602 603 SET_FLAG (lsa->flags, OSPF_LSA_APPROVED); 604 if (IS_DEBUG_OSPF_EVENT) 605 zlog_info ("ospf_abr_announce_network_to_area(): " 606 "flooding new version of summary"); 607 608#ifndef HAVE_NSSA 609 ospf_flood_through_area (area, NULL, lsa); 610#endif /* ! HAVE_NSSA */ 611 } 612 613 if (IS_DEBUG_OSPF_EVENT) 614 zlog_info ("ospf_abr_announce_network_to_area(): Stop"); 615} 616 617int 618ospf_abr_nexthops_belong_to_area (struct ospf_route *or, 619 struct ospf_area *area) 620{ 621 listnode node; 622 623 for (node = listhead (or->path); node; nextnode (node)) 624 { 625 struct ospf_path *path = node->data; 626 struct ospf_interface *oi = path->oi; 627 628 if (oi != NULL) 629 if (oi->area == area) 630 return 1; 631 } 632 633 return 0; 634} 635 636int 637ospf_abr_should_accept (struct prefix *p, struct ospf_area *area) 638{ 639 if (IMPORT_NAME (area)) 640 { 641 if (IMPORT_LIST (area) == NULL) 642 IMPORT_LIST (area) = access_list_lookup (AFI_IP, IMPORT_NAME (area)); 643 644 if (IMPORT_LIST (area)) 645 if (access_list_apply (IMPORT_LIST (area), p) == FILTER_DENY) 646 return 0; 647 } 648 649 return 1; 650} 651 652int 653ospf_abr_plist_in_check (struct ospf_area *area, struct ospf_route *or, 654 struct prefix *p) 655{ 656 if (PREFIX_NAME_IN (area)) 657 { 658 if (PREFIX_LIST_IN (area) == NULL) 659 PREFIX_LIST_IN (area) = prefix_list_lookup (AFI_IP, 660 PREFIX_NAME_IN (area)); 661 if (PREFIX_LIST_IN (area)) 662 if (prefix_list_apply (PREFIX_LIST_IN (area), p) != PREFIX_PERMIT) 663 return 0; 664 } 665 return 1; 666} 667 668int 669ospf_abr_plist_out_check (struct ospf_area *area, struct ospf_route *or, 670 struct prefix *p) 671{ 672 if (PREFIX_NAME_OUT (area)) 673 { 674 if (PREFIX_LIST_OUT (area) == NULL) 675 PREFIX_LIST_OUT (area) = prefix_list_lookup (AFI_IP, 676 PREFIX_NAME_OUT (area)); 677 if (PREFIX_LIST_OUT (area)) 678 if (prefix_list_apply (PREFIX_LIST_OUT (area), p) != PREFIX_PERMIT) 679 return 0; 680 } 681 return 1; 682} 683 684void 685ospf_abr_announce_network (struct route_node *n, struct ospf_route *or) 686{ 687 listnode node; 688 struct ospf_area_range *range; 689 struct prefix_ipv4 *p; 690 struct ospf_area *area, *or_area; 691 692 if (IS_DEBUG_OSPF_EVENT) 693 zlog_info ("ospf_abr_announce_network(): Start"); 694 p = (struct prefix_ipv4 *) &n->p; 695 696 or_area = ospf_area_lookup_by_area_id (or->u.std.area_id); 697 assert (or_area); 698 699 for (node = listhead (ospf_top->areas); node; nextnode (node)) 700 { 701 area = getdata (node); 702 703 if (IS_DEBUG_OSPF_EVENT) 704 zlog_info ("ospf_abr_announce_network(): looking at area %s", 705 inet_ntoa (area->area_id)); 706 707 if (IPV4_ADDR_SAME (&or->u.std.area_id, &area->area_id)) 708 continue; 709 710 if (ospf_abr_nexthops_belong_to_area (or, area)) 711 continue; 712 713 if (!ospf_abr_should_accept (&n->p, area)) 714 { 715 if (IS_DEBUG_OSPF_EVENT) 716 zlog_info ("ospf_abr_announce_network(): " 717 "prefix %s/%d was denied by import-list", 718 inet_ntoa (p->prefix), p->prefixlen); 719 continue; 720 } 721 722 if (!ospf_abr_plist_in_check (area, or, &n->p)) 723 { 724 if (IS_DEBUG_OSPF_EVENT) 725 zlog_info ("ospf_abr_announce_network(): " 726 "prefix %s/%d was denied by prefix-list", 727 inet_ntoa (p->prefix), p->prefixlen); 728 continue; 729 } 730 731 if (area->external_routing != OSPF_AREA_DEFAULT && area->no_summary) 732 { 733 if (IS_DEBUG_OSPF_EVENT) 734 zlog_info ("ospf_abr_announce_network(): " 735 "area %s is stub and no_summary", 736 inet_ntoa (area->area_id)); 737 continue; 738 } 739 740 if (or->path_type == OSPF_PATH_INTER_AREA) 741 { 742 if (IS_DEBUG_OSPF_EVENT) 743 zlog_info ("ospf_abr_announce_network(): this is " 744 "inter-area route to %s/%d", 745 inet_ntoa (p->prefix), p->prefixlen); 746 747 if (!OSPF_IS_AREA_BACKBONE (area)) 748 ospf_abr_announce_network_to_area (p, or->cost, area); 749 } 750 751 if (or->path_type == OSPF_PATH_INTRA_AREA) 752 { 753 if (IS_DEBUG_OSPF_EVENT) 754 zlog_info ("ospf_abr_announce_network(): " 755 "this is intra-area route to %s/%d", 756 inet_ntoa (p->prefix), p->prefixlen); 757 if ((range = ospf_area_range_match (or_area, p)) && 758 !ospf_area_is_transit (area)) 759 ospf_abr_update_aggregate (range, or); 760 else 761 ospf_abr_announce_network_to_area (p, or->cost, area); 762 } 763 } 764} 765 766int 767ospf_abr_should_announce (struct prefix *p, struct ospf_route *or) 768{ 769 struct ospf_area *area = ospf_area_lookup_by_area_id (or->u.std.area_id); 770 771 assert (area); 772 773 if (EXPORT_NAME (area)) 774 { 775 if (EXPORT_LIST (area) == NULL) 776 EXPORT_LIST (area) = access_list_lookup (AFI_IP, EXPORT_NAME (area)); 777 778 if (EXPORT_LIST (area)) 779 if (access_list_apply (EXPORT_LIST (area), p) == FILTER_DENY) 780 return 0; 781 } 782 783 return 1; 784} 785 786#ifdef HAVE_NSSA 787void 788ospf_abr_process_nssa_translates () 789{ 790 /* Scan through all NSSA_LSDB records for all areas; 791 792 If P-bit is on, translate all Type-7's to 5's and aggregate or 793 flood install as approved in Type-5 LSDB with XLATE Flag on 794 later, do same for all aggregates... At end, DISCARD all 795 remaining UNAPPROVED Type-5's (Aggregate is for future ) */ 796 listnode node; 797 struct ospf_area *area; 798 799 if (IS_DEBUG_OSPF_NSSA) 800 zlog_info ("ospf_abr_process_nssa_translates(): Start"); 801 802 for (node = listhead (ospf_top->areas); node; nextnode (node)) 803 { 804 area = getdata (node); 805 806 if (! area->NSSATranslator) 807 continue; /* skip if not translator */ 808 809 if (area->external_routing != OSPF_AREA_NSSA) 810 continue; /* skip if not Nssa Area */ 811 812 if (IS_DEBUG_OSPF_NSSA) 813 zlog_info ("ospf_abr_process_nssa_translates(): " 814 "looking at area %s", inet_ntoa (area->area_id)); 815 816 foreach_lsa (NSSA_LSDB (area), area, 0, ospf_abr_translate_nssa); 817 } 818 819 if (IS_DEBUG_OSPF_NSSA) 820 zlog_info ("ospf_abr_process_nssa_translates(): Stop"); 821 822} 823#endif /* HAVE_NSSA */ 824 825void 826ospf_abr_process_network_rt (struct route_table *rt) 827{ 828 struct route_node *rn; 829 struct ospf_route *or; 830 struct ospf_area *area; 831 832 if (IS_DEBUG_OSPF_EVENT) 833 zlog_info ("ospf_abr_process_network_rt(): Start"); 834 835 for (rn = route_top (rt); rn; rn = route_next (rn)) 836 { 837 if ((or = rn->info) == NULL) 838 continue; 839 840 if (!(area = ospf_area_lookup_by_area_id (or->u.std.area_id))) 841 { 842 if (IS_DEBUG_OSPF_EVENT) 843 zlog_info ("ospf_abr_process_network_rt(): area %s no longer exists", 844 inet_ntoa (or->u.std.area_id)); 845 continue; 846 } 847 848 if (IS_DEBUG_OSPF_EVENT) 849 zlog_info ("ospf_abr_process_network_rt(): this is a route to %s/%d", 850 inet_ntoa (rn->p.u.prefix4), rn->p.prefixlen); 851 if (or->path_type >= OSPF_PATH_TYPE1_EXTERNAL) 852 { 853 if (IS_DEBUG_OSPF_EVENT) 854 zlog_info ("ospf_abr_process_network_rt(): " 855 "this is an External router, skipping"); 856 continue; 857 } 858 859 if (or->cost >= OSPF_LS_INFINITY) 860 { 861 if (IS_DEBUG_OSPF_EVENT) 862 zlog_info ("ospf_abr_process_network_rt():" 863 " this route's cost is infinity, skipping"); 864 continue; 865 } 866 867 if (or->type == OSPF_DESTINATION_DISCARD) 868 { 869 if (IS_DEBUG_OSPF_EVENT) 870 zlog_info ("ospf_abr_process_network_rt():" 871 " this is a discard entry, skipping"); 872 continue; 873 } 874 875 if (or->path_type == OSPF_PATH_INTRA_AREA && 876 !ospf_abr_should_announce (&rn->p, or)) 877 { 878 if (IS_DEBUG_OSPF_EVENT) 879 zlog_info("ospf_abr_process_network_rt(): denied by export-list"); 880 continue; 881 } 882 883 if (or->path_type == OSPF_PATH_INTRA_AREA && 884 !ospf_abr_plist_out_check (area, or, &rn->p)) 885 { 886 if (IS_DEBUG_OSPF_EVENT) 887 zlog_info("ospf_abr_process_network_rt(): denied by prefix-list"); 888 continue; 889 } 890 891 if ((or->path_type == OSPF_PATH_INTER_AREA) && 892 !OSPF_IS_AREA_ID_BACKBONE (or->u.std.area_id)) 893 { 894 if (IS_DEBUG_OSPF_EVENT) 895 zlog_info ("ospf_abr_process_network_rt():" 896 " this is route is not backbone one, skipping"); 897 continue; 898 } 899 900 901 if ((ospf_top->abr_type == OSPF_ABR_CISCO) || 902 (ospf_top->abr_type == OSPF_ABR_IBM)) 903 904 if (!ospf_act_bb_connection () && 905 or->path_type != OSPF_PATH_INTRA_AREA) 906 { 907 if (IS_DEBUG_OSPF_EVENT) 908 zlog_info ("ospf_abr_process_network_rt(): ALT ABR: " 909 "No BB connection, skip not intra-area routes"); 910 continue; 911 } 912 913 if (IS_DEBUG_OSPF_EVENT) 914 zlog_info ("ospf_abr_process_network_rt(): announcing"); 915 ospf_abr_announce_network (rn, or); 916 } 917 918 if (IS_DEBUG_OSPF_EVENT) 919 zlog_info ("ospf_abr_process_network_rt(): Stop"); 920} 921 922void 923ospf_abr_announce_rtr_to_area (struct prefix_ipv4 *p, u_int32_t cost, 924 struct ospf_area *area) 925{ 926 struct ospf_lsa *lsa, *old = NULL; 927 struct summary_lsa *slsa = NULL; 928 929 if (IS_DEBUG_OSPF_EVENT) 930 zlog_info ("ospf_abr_announce_rtr_to_area(): Start"); 931 932 old = OSPF_SUMMARY_ASBR_LSA_SELF_FIND_BY_PREFIX (area, p); 933 /* old = ospf_find_self_summary_asbr_lsa_by_prefix (area, p); */ 934 935 if (old) 936 { 937 if (IS_DEBUG_OSPF_EVENT) 938 zlog_info ("ospf_abr_announce_rtr_to_area(): old summary found"); 939 slsa = (struct summary_lsa *) old->data; 940 941 if (IS_DEBUG_OSPF_EVENT) 942 zlog_info ("ospf_abr_announce_network_to_area(): " 943 "old metric: %d, new metric: %d", 944 GET_METRIC (slsa->metric), cost); 945 } 946 947 if (old && (GET_METRIC (slsa->metric) == cost)) 948 { 949 if (IS_DEBUG_OSPF_EVENT) 950 zlog_info ("ospf_abr_announce_rtr_to_area(): old summary approved"); 951 SET_FLAG (old->flags, OSPF_LSA_APPROVED); 952 } 953 else 954 { 955 if (IS_DEBUG_OSPF_EVENT) 956 zlog_info ("ospf_abr_announce_rtr_to_area(): 2.2"); 957 958 if (old) 959 { 960 set_metric (old, cost); 961 lsa = ospf_summary_asbr_lsa_refresh (old); 962 } 963 else 964 lsa = ospf_summary_asbr_lsa_originate (p, cost, area); 965 966 if (IS_DEBUG_OSPF_EVENT) 967 zlog_info ("ospf_abr_announce_rtr_to_area(): " 968 "flooding new version of summary"); 969 /* 970 zlog_info ("ospf_abr_announce_rtr_to_area(): creating new summary"); 971 lsa = ospf_summary_asbr_lsa (p, cost, area, old); */ 972 973 SET_FLAG (lsa->flags, OSPF_LSA_APPROVED); 974 /* ospf_flood_through_area (area, NULL, lsa);*/ 975 } 976 977 if (IS_DEBUG_OSPF_EVENT) 978 zlog_info ("ospf_abr_announce_rtr_to_area(): Stop"); 979} 980 981 982void 983ospf_abr_announce_rtr (struct prefix_ipv4 *p, struct ospf_route *or) 984{ 985 listnode node; 986 struct ospf_area *area; 987 988 if (IS_DEBUG_OSPF_EVENT) 989 zlog_info ("ospf_abr_announce_rtr(): Start"); 990 991 for (node = listhead (ospf_top->areas); node; nextnode (node)) 992 { 993 area = getdata (node); 994 995 if (IS_DEBUG_OSPF_EVENT) 996 zlog_info ("ospf_abr_announce_rtr(): looking at area %s", 997 inet_ntoa (area->area_id)); 998 999 if (IPV4_ADDR_SAME (&or->u.std.area_id, &area->area_id)) 1000 continue; 1001 1002 if (ospf_abr_nexthops_belong_to_area (or, area)) 1003 continue; 1004 1005 if (area->external_routing != OSPF_AREA_DEFAULT) 1006 { 1007 if (IS_DEBUG_OSPF_EVENT) 1008 zlog_info ("ospf_abr_announce_network(): " 1009 "area %s doesn't support external routing", 1010 inet_ntoa(area->area_id)); 1011 continue; 1012 } 1013 1014 if (or->path_type == OSPF_PATH_INTER_AREA) 1015 { 1016 if (IS_DEBUG_OSPF_EVENT) 1017 zlog_info ("ospf_abr_announce_rtr(): " 1018 "this is inter-area route to %s", inet_ntoa (p->prefix)); 1019 if (!OSPF_IS_AREA_BACKBONE (area)) 1020 ospf_abr_announce_rtr_to_area (p, or->cost, area); 1021 } 1022 1023 if (or->path_type == OSPF_PATH_INTRA_AREA) 1024 { 1025 if (IS_DEBUG_OSPF_EVENT) 1026 zlog_info ("ospf_abr_announce_rtr(): " 1027 "this is intra-area route to %s", inet_ntoa (p->prefix)); 1028 ospf_abr_announce_rtr_to_area (p, or->cost, area); 1029 } 1030 } 1031 1032 if (IS_DEBUG_OSPF_EVENT) 1033 zlog_info ("ospf_abr_announce_rtr(): Stop"); 1034} 1035 1036void 1037ospf_abr_process_router_rt (struct route_table *rt) 1038{ 1039 struct route_node *rn; 1040 struct ospf_route *or; 1041 struct list *l; 1042 1043 if (IS_DEBUG_OSPF_EVENT) 1044 zlog_info ("ospf_abr_process_router_rt(): Start"); 1045 1046 for (rn = route_top (rt); rn; rn = route_next (rn)) 1047 { 1048 listnode node; 1049 char flag = 0; 1050 struct ospf_route *best = NULL; 1051 1052 if (rn->info == NULL) 1053 continue; 1054 1055 l = rn->info; 1056 1057 if (IS_DEBUG_OSPF_EVENT) 1058 zlog_info ("ospf_abr_process_router_rt(): this is a route to %s", 1059 inet_ntoa (rn->p.u.prefix4)); 1060 1061 for (node = listhead (l); node; nextnode (node)) 1062 { 1063 or = getdata (node); 1064 if (or == NULL) 1065 continue; 1066 1067 if (!ospf_area_lookup_by_area_id (or->u.std.area_id)) 1068 { 1069 if (IS_DEBUG_OSPF_EVENT) 1070 zlog_info ("ospf_abr_process_router_rt(): area %s no longer exists", 1071 inet_ntoa (or->u.std.area_id)); 1072 continue; 1073 } 1074 1075 1076 if (!CHECK_FLAG (or->u.std.flags, ROUTER_LSA_EXTERNAL)) 1077 { 1078 if (IS_DEBUG_OSPF_EVENT) 1079 zlog_info ("ospf_abr_process_router_rt(): " 1080 "This is not an ASBR, skipping"); 1081 continue; 1082 } 1083 1084 if (!flag) 1085 { 1086 best = ospf_find_asbr_route (rt, (struct prefix_ipv4 *) &rn->p); 1087 flag = 1; 1088 } 1089 1090 if (best == NULL) 1091 continue; 1092 1093 if (or != best) 1094 { 1095 if (IS_DEBUG_OSPF_EVENT) 1096 zlog_info ("ospf_abr_process_router_rt(): " 1097 "This route is not the best among possible, skipping"); 1098 continue; 1099 } 1100 1101 if (or->path_type == OSPF_PATH_INTER_AREA && 1102 !OSPF_IS_AREA_ID_BACKBONE (or->u.std.area_id)) 1103 { 1104 if (IS_DEBUG_OSPF_EVENT) 1105 zlog_info ("ospf_abr_process_router_rt(): " 1106 "This route is not a backbone one, skipping"); 1107 continue; 1108 } 1109 1110 if (or->cost >= OSPF_LS_INFINITY) 1111 { 1112 if (IS_DEBUG_OSPF_EVENT) 1113 zlog_info ("ospf_abr_process_router_rt(): " 1114 "This route has LS_INFINITY metric, skipping"); 1115 continue; 1116 } 1117 1118 if (ospf_top->abr_type == OSPF_ABR_CISCO || 1119 ospf_top->abr_type == OSPF_ABR_IBM) 1120 if (!ospf_act_bb_connection () && 1121 or->path_type != OSPF_PATH_INTRA_AREA) 1122 { 1123 if (IS_DEBUG_OSPF_EVENT) 1124 zlog_info("ospf_abr_process_network_rt(): ALT ABR: " 1125 "No BB connection, skip not intra-area routes"); 1126 continue; 1127 } 1128 1129 ospf_abr_announce_rtr ((struct prefix_ipv4 *) &rn->p, or); 1130 1131 } 1132 1133 } 1134 1135 if (IS_DEBUG_OSPF_EVENT) 1136 zlog_info ("ospf_abr_process_router_rt(): Stop"); 1137} 1138 1139#ifdef HAVE_NSSA 1140int 1141ospf_abr_unapprove_translates_apply (struct ospf_lsa *lsa, void *p_arg, 1142 int int_arg) 1143{ 1144 /* Could be a mix of Normal Type-5's, self-originated, or Type-7s 1145 that are Locally ABR Translated */ 1146 1147 if (CHECK_FLAG (lsa->flags, OSPF_LSA_LOCAL_XLT)) 1148 UNSET_FLAG (lsa->flags, OSPF_LSA_APPROVED); 1149 1150 return 0; 1151} 1152 1153void 1154ospf_abr_unapprove_translates () /* For NSSA Translations */ 1155{ 1156 if (IS_DEBUG_OSPF_NSSA) 1157 zlog_info ("ospf_abr_unapprove_translates(): Start"); 1158 1159 /* NSSA Translator is not checked, because it may have gone away, 1160 and we would want to flush any residuals anyway */ 1161 1162 foreach_lsa (EXTERNAL_LSDB (ospf_top), NULL, 0, 1163 ospf_abr_unapprove_translates_apply); 1164 1165 if (IS_DEBUG_OSPF_NSSA) 1166 zlog_info ("ospf_abr_unapprove_translates(): Stop"); 1167} 1168#endif /* HAVE_NSSA */ 1169 1170int 1171ospf_abr_unapprove_summaries_apply (struct ospf_lsa *lsa, void *p_arg, 1172 int int_arg) 1173{ 1174 if (ospf_lsa_is_self_originated (lsa)) 1175 UNSET_FLAG (lsa->flags, OSPF_LSA_APPROVED); 1176 1177 return 0; 1178} 1179 1180void 1181ospf_abr_unapprove_summaries () 1182{ 1183 listnode node; 1184 struct ospf_area *area; 1185 1186 if (IS_DEBUG_OSPF_EVENT) 1187 zlog_info ("ospf_abr_unapprove_summaries(): Start"); 1188 1189 for (node = listhead (ospf_top->areas); node; nextnode (node)) 1190 { 1191 area = getdata (node); 1192 foreach_lsa (SUMMARY_LSDB (area), NULL, 0, 1193 ospf_abr_unapprove_summaries_apply); 1194 foreach_lsa (ASBR_SUMMARY_LSDB (area), NULL, 0, 1195 ospf_abr_unapprove_summaries_apply); 1196 } 1197 1198 if (IS_DEBUG_OSPF_EVENT) 1199 zlog_info ("ospf_abr_unapprove_summaries(): Stop"); 1200} 1201 1202void 1203ospf_abr_prepare_aggregates () 1204{ 1205 listnode node; 1206 struct route_node *rn; 1207 struct ospf_area_range *range; 1208 1209 if (IS_DEBUG_OSPF_EVENT) 1210 zlog_info ("ospf_abr_prepare_aggregates(): Start"); 1211 1212 for (node = listhead (ospf_top->areas); node; nextnode (node)) 1213 { 1214 struct ospf_area *area = getdata (node); 1215 1216 for (rn = route_top (area->ranges); rn; rn = route_next (rn)) 1217 if ((range = rn->info) != NULL) 1218 { 1219 range->cost = 0; 1220 range->specifics = 0; 1221 } 1222 } 1223 1224 if (IS_DEBUG_OSPF_EVENT) 1225 zlog_info ("ospf_abr_prepare_aggregates(): Stop"); 1226} 1227 1228void 1229ospf_abr_announce_aggregates () 1230{ 1231 struct ospf_area *area, *ar; 1232 struct ospf_area_range *range; 1233 struct route_node *rn; 1234 struct prefix_ipv4 p; 1235 listnode node, n; 1236 1237 if (IS_DEBUG_OSPF_EVENT) 1238 zlog_info ("ospf_abr_announce_aggregates(): Start"); 1239 1240 for (node = listhead (ospf_top->areas); node; nextnode (node)) 1241 { 1242 area = getdata (node); 1243 1244 if (IS_DEBUG_OSPF_EVENT) 1245 zlog_info ("ospf_abr_announce_aggregates(): looking at area %s", 1246 inet_ntoa (area->area_id)); 1247 1248 for (rn = route_top (area->ranges); rn; rn = route_next (rn)) 1249 if ((range = rn->info)) 1250 { 1251 if (!CHECK_FLAG (range->flags, OSPF_AREA_RANGE_ADVERTISE)) 1252 { 1253 if (IS_DEBUG_OSPF_EVENT) 1254 zlog_info ("ospf_abr_announce_aggregates():" 1255 " discarding suppress-ranges"); 1256 continue; 1257 } 1258 1259 p.family = AF_INET; 1260 p.prefix = range->addr; 1261 p.prefixlen = range->masklen; 1262 1263 if (IS_DEBUG_OSPF_EVENT) 1264 zlog_info ("ospf_abr_announce_aggregates():" 1265 " this is range: %s/%d", 1266 inet_ntoa (p.prefix), p.prefixlen); 1267 1268 if (CHECK_FLAG (range->flags, OSPF_AREA_RANGE_SUBSTITUTE)) 1269 { 1270 p.family = AF_INET; 1271 p.prefix = range->subst_addr; 1272 p.prefixlen = range->subst_masklen; 1273 } 1274 1275 if (range->specifics) 1276 { 1277 if (IS_DEBUG_OSPF_EVENT) 1278 zlog_info ("ospf_abr_announce_aggregates(): active range"); 1279 1280 for (n = listhead (ospf_top->areas); n; nextnode (n)) 1281 { 1282 ar = getdata (n); 1283 if (ar == area) 1284 continue; 1285 1286 /* We do not check nexthops here, because 1287 intra-area routes can be associated with 1288 one area only */ 1289 1290 /* backbone routes are not summarized 1291 when announced into transit areas */ 1292 1293 if (ospf_area_is_transit (ar) && 1294 OSPF_IS_AREA_BACKBONE (area)) 1295 { 1296 if (IS_DEBUG_OSPF_EVENT) 1297 zlog_info ("ospf_abr_announce_aggregates(): Skipping " 1298 "announcement of BB aggregate into" 1299 " a transit area"); 1300 continue; 1301 } 1302 ospf_abr_announce_network_to_area (&p, range->cost, ar); 1303 } 1304 } 1305 } 1306 } 1307 1308 if (IS_DEBUG_OSPF_EVENT) 1309 zlog_info ("ospf_abr_announce_aggregates(): Stop"); 1310} 1311 1312#ifdef HAVE_NSSA 1313void 1314ospf_abr_send_nssa_aggregates () /* temporarily turned off */ 1315{ 1316 listnode node; /*, n; */ 1317 struct ospf_area *area; /*, *ar; */ 1318 struct route_node *rn; 1319 struct ospf_area_range *range; 1320 struct prefix_ipv4 p; 1321 1322 if (IS_DEBUG_OSPF_NSSA) 1323 zlog_info ("ospf_abr_send_nssa_aggregates(): Start"); 1324 1325 for (node = listhead (ospf_top->areas); node; nextnode (node)) 1326 { 1327 area = getdata (node); 1328 1329 if (! area->NSSATranslator) 1330 continue; 1331 1332 if (IS_DEBUG_OSPF_NSSA) 1333 zlog_info ("ospf_abr_send_nssa_aggregates(): looking at area %s", 1334 inet_ntoa (area->area_id)); 1335 1336 for (rn = route_top (area->ranges); rn; rn = route_next (rn)) 1337 { 1338 if (rn->info == NULL) 1339 continue; 1340 1341 range = rn->info; 1342 1343 if (!CHECK_FLAG (range->flags, OSPF_AREA_RANGE_ADVERTISE)) 1344 { 1345 if (IS_DEBUG_OSPF_NSSA) 1346 zlog_info ("ospf_abr_send_nssa_aggregates():" 1347 " discarding suppress-ranges"); 1348 continue; 1349 } 1350 1351 p.family = AF_INET; 1352 p.prefix = range->addr; 1353 p.prefixlen = range->masklen; 1354 1355 if (IS_DEBUG_OSPF_NSSA) 1356 zlog_info ("ospf_abr_send_nssa_aggregates():" 1357 " this is range: %s/%d", 1358 inet_ntoa (p.prefix), p.prefixlen); 1359 1360 if (CHECK_FLAG (range->flags, OSPF_AREA_RANGE_SUBSTITUTE)) 1361 { 1362 p.family = AF_INET; 1363 p.prefix = range->subst_addr; 1364 p.prefixlen = range->subst_masklen; 1365 } 1366 1367 if (range->specifics) 1368 { 1369 if (IS_DEBUG_OSPF_NSSA) 1370 zlog_info ("ospf_abr_send_nssa_aggregates(): active range"); 1371 1372 /* Fetch LSA-Type-7 from aggregate prefix, and then 1373 translate, Install (as Type-5), Approve, and Flood */ 1374 ospf_abr_translate_nssa_range (&p, range->cost); 1375 } /* if (range->specifics)*/ 1376 } /* all area ranges*/ 1377 } /* all areas */ 1378 1379 if (IS_DEBUG_OSPF_NSSA) 1380 zlog_info ("ospf_abr_send_nssa_aggregates(): Stop"); 1381} 1382 1383void 1384ospf_abr_announce_nssa_defaults () /* By ABR-Translator */ 1385{ 1386 listnode node; 1387 struct ospf_area *area; 1388 struct prefix_ipv4 p; 1389 1390 if (! OSPF_IS_ABR) 1391 return; 1392 1393 if (IS_DEBUG_OSPF_NSSA) 1394 zlog_info ("ospf_abr_announce_stub_defaults(): Start"); 1395 1396 p.family = AF_INET; 1397 p.prefix.s_addr = OSPF_DEFAULT_DESTINATION; 1398 p.prefixlen = 0; 1399 1400 for (node = listhead (ospf_top->areas); node; nextnode (node)) 1401 { 1402 area = getdata (node); 1403 if (IS_DEBUG_OSPF_NSSA) 1404 zlog_info ("ospf_abr_announce_nssa_defaults(): looking at area %s", 1405 inet_ntoa (area->area_id)); 1406 1407 if (area->external_routing != OSPF_AREA_NSSA) 1408 continue; 1409 1410 if (OSPF_IS_AREA_BACKBONE (area)) 1411 continue; /* Sanity Check */ 1412 1413 /* if (!TranslatorRole continue V 1.0 look for "always" conf */ 1414 if (area->NSSATranslator) 1415 { 1416 if (IS_DEBUG_OSPF_NSSA) 1417 zlog_info ("ospf_abr_announce_nssa_defaults(): " 1418 "announcing 0.0.0.0/0 to this nssa"); 1419 /* ospf_abr_announce_nssa_asbr_to_as (&p, area->default_cost, area); */ 1420 } 1421 } 1422} 1423#endif /* HAVE_NSSA */ 1424 1425void 1426ospf_abr_announce_stub_defaults () 1427{ 1428 listnode node; 1429 struct ospf_area *area; 1430 struct prefix_ipv4 p; 1431 1432 if (! OSPF_IS_ABR) 1433 return; 1434 1435 if (IS_DEBUG_OSPF_EVENT) 1436 zlog_info ("ospf_abr_announce_stub_defaults(): Start"); 1437 1438 p.family = AF_INET; 1439 p.prefix.s_addr = OSPF_DEFAULT_DESTINATION; 1440 p.prefixlen = 0; 1441 1442 for (node = listhead (ospf_top->areas); node; nextnode (node)) 1443 { 1444 area = getdata (node); 1445 if (IS_DEBUG_OSPF_EVENT) 1446 zlog_info ("ospf_abr_announce_stub_defaults(): looking at area %s", 1447 inet_ntoa (area->area_id)); 1448 1449#ifdef HAVE_NSSA 1450 if (area->external_routing != OSPF_AREA_STUB) 1451#else /* ! HAVE_NSSA */ 1452 if (area->external_routing == OSPF_AREA_DEFAULT) 1453#endif /* HAVE_NSSA */ 1454 continue; 1455 1456 if (OSPF_IS_AREA_BACKBONE (area)) 1457 continue; /* Sanity Check */ 1458 1459 if (IS_DEBUG_OSPF_EVENT) 1460 zlog_info ("ospf_abr_announce_stub_defaults(): " 1461 "announcing 0.0.0.0/0 to this area"); 1462 ospf_abr_announce_network_to_area (&p, area->default_cost, area); 1463 } 1464 1465 if (IS_DEBUG_OSPF_EVENT) 1466 zlog_info ("ospf_abr_announce_stub_defaults(): Stop"); 1467} 1468 1469#ifdef HAVE_NSSA 1470int 1471ospf_abr_remove_unapproved_translates_apply (struct ospf_lsa *lsa, void *p_arg, 1472 int int_arg) 1473{ 1474 if (CHECK_FLAG (lsa->flags, OSPF_LSA_LOCAL_XLT) 1475 && ! CHECK_FLAG (lsa->flags, OSPF_LSA_APPROVED)) 1476 { 1477 zlog_info ("ospf_abr_remove_unapproved_translates(): " 1478 "removing unapproved translates, ID: %s", 1479 inet_ntoa (lsa->data->id)); 1480 1481 /* FLUSH THROUGHOUT AS */ 1482 ospf_lsa_flush_as (lsa); 1483 1484 /* DISCARD from LSDB */ 1485 } 1486 return 0; 1487} 1488 1489void 1490ospf_abr_remove_unapproved_translates () /* For NSSA Translations */ 1491{ 1492 /* All AREA PROCESS should have APPROVED necessary LSAs */ 1493 /* Remove any left over and not APPROVED */ 1494 if (IS_DEBUG_OSPF_NSSA) 1495 zlog_info ("ospf_abr_remove_unapproved_translates(): Start"); 1496 1497 foreach_lsa (EXTERNAL_LSDB (ospf_top), NULL, 0, 1498 ospf_abr_remove_unapproved_translates_apply); 1499 1500 if (IS_DEBUG_OSPF_NSSA) 1501 zlog_info ("ospf_abr_remove_unapproved_translates(): Stop"); 1502} 1503#endif /* HAVE_NSSA */ 1504 1505int 1506ospf_abr_remove_unapproved_summaries_apply (struct ospf_lsa *lsa, void *p_arg, 1507 int int_arg) 1508{ 1509 struct ospf_area *area; 1510 1511 area = (struct ospf_area *) p_arg; 1512 1513 if (ospf_lsa_is_self_originated (lsa) && 1514 !CHECK_FLAG (lsa->flags, OSPF_LSA_APPROVED)) 1515 { 1516 if (IS_DEBUG_OSPF_EVENT) 1517 zlog_info ("ospf_abr_remove_unapproved_summaries(): " 1518 "removing unapproved summary, ID: %s", 1519 inet_ntoa (lsa->data->id)); 1520 ospf_lsa_flush_area (lsa, area); 1521 } 1522 return 0; 1523} 1524 1525void 1526ospf_abr_remove_unapproved_summaries () 1527{ 1528 listnode node; 1529 struct ospf_area *area; 1530 1531 if (IS_DEBUG_OSPF_EVENT) 1532 zlog_info ("ospf_abr_remove_unapproved_summaries(): Start"); 1533 1534 for (node = listhead (ospf_top->areas); node; nextnode (node)) 1535 { 1536 area = getdata (node); 1537 1538 if (IS_DEBUG_OSPF_EVENT) 1539 zlog_info ("ospf_abr_remove_unapproved_summaries(): " 1540 "looking at area %s", inet_ntoa (area->area_id)); 1541 1542 foreach_lsa (SUMMARY_LSDB (area), area, 0, 1543 ospf_abr_remove_unapproved_summaries_apply); 1544 foreach_lsa (ASBR_SUMMARY_LSDB (area), area, 0, 1545 ospf_abr_remove_unapproved_summaries_apply); 1546 } 1547 1548 if (IS_DEBUG_OSPF_EVENT) 1549 zlog_info ("ospf_abr_remove_unapproved_summaries(): Stop"); 1550} 1551 1552void 1553ospf_abr_manage_discard_routes () 1554{ 1555 listnode node; 1556 struct route_node *rn; 1557 struct ospf_area *area; 1558 struct ospf_area_range *range; 1559 1560 for (node = listhead (ospf_top->areas); node; nextnode (node)) 1561 if ((area = node->data) != NULL) 1562 for (rn = route_top (area->ranges); rn; rn = route_next (rn)) 1563 if ((range = rn->info) != NULL) 1564 if (CHECK_FLAG (range->flags, OSPF_AREA_RANGE_ADVERTISE)) 1565 { 1566 if (range->specifics) 1567 ospf_add_discard_route (ospf_top->new_table, area, 1568 (struct prefix_ipv4 *) &rn->p); 1569 else 1570 ospf_delete_discard_route ((struct prefix_ipv4 *) &rn->p); 1571 } 1572} 1573 1574#ifdef HAVE_NSSA 1575/* This is the function taking care about ABR NSSA, i.e. NSSA 1576 Translator, -LSA aggregation and flooding. For all NSSAs 1577 1578 Any SELF-AS-LSA is in the Type-5 LSDB and Type-7 LSDB. These LSA's 1579 are refreshed from the Type-5 LSDB, installed into the Type-7 LSDB 1580 with the P-bit set. 1581 1582 Any received Type-5s are legal for an ABR, else illegal for IR. 1583 Received Type-7s are installed, by area, with incoming P-bit. They 1584 are flooded; if the Elected NSSA Translator, then P-bit off. 1585 1586 Additionally, this ABR will place "translated type-7's" into the 1587 Type-5 LSDB in order to keep track of APPROVAL or not. 1588 1589 It will scan through every area, looking for Type-7 LSAs with P-Bit 1590 SET. The Type-7's are either AS-FLOODED & 5-INSTALLED or 1591 AGGREGATED. Later, the AGGREGATED LSAs are AS-FLOODED & 1592 5-INSTALLED. 1593 1594 5-INSTALLED is into the Type-5 LSDB; Any UNAPPROVED Type-5 LSAs 1595 left over are FLUSHED and DISCARDED. 1596 1597 For External Calculations, any NSSA areas use the Type-7 AREA-LSDB, 1598 any ABR-non-NSSA areas use the Type-5 GLOBAL-LSDB. */ 1599 1600void 1601ospf_abr_nssa_task () /* called only if any_nssa */ 1602{ 1603 if (IS_DEBUG_OSPF_NSSA) 1604 zlog_info ("Check for NSSA-ABR Tasks():"); 1605 1606 if (! OSPF_IS_ABR) 1607 return; 1608 1609 if (! ospf_top->anyNSSA) 1610 return; 1611 1612 /* Each area must confirm TranslatorRole */ 1613 if (IS_DEBUG_OSPF_NSSA) 1614 zlog_info ("ospf_abr_nssa_task(): Start"); 1615 1616 /* For all Global Entries flagged "local-translate", unset APPROVED */ 1617 if (IS_DEBUG_OSPF_NSSA) 1618 zlog_info ("ospf_abr_nssa_task(): unapprove translates"); 1619 1620 ospf_abr_unapprove_translates (); 1621 1622 /* RESET all Ranges in every Area, same as summaries */ 1623 if (IS_DEBUG_OSPF_NSSA) 1624 zlog_info ("ospf_abr_nssa_task(): NSSA initialize aggregates"); 1625 1626 /* ospf_abr_prepare_aggregates (); TURNED OFF just for now */ 1627 1628 /* For all NSSAs, Type-7s, translate to 5's, INSTALL/FLOOD, or 1629 Aggregate as Type-7 */ 1630 /* Install or Approve in Type-5 Global LSDB */ 1631 if (IS_DEBUG_OSPF_NSSA) 1632 zlog_info ("ospf_abr_nssa_task(): process translates"); 1633 1634 ospf_abr_process_nssa_translates (ospf_top->new_table); 1635 1636 /* Translate/Send any "ranged" aggregates, and also 5-Install and 1637 Approve */ 1638 /* Scan Type-7's for aggregates, translate to Type-5's, 1639 Install/Flood/Approve */ 1640 if (IS_DEBUG_OSPF_NSSA) 1641 zlog_info("ospf_abr_nssa_task(): send NSSA aggregates"); 1642 /* ospf_abr_send_nssa_aggregates (); TURNED OFF FOR NOW */ 1643 1644 /* Send any NSSA defaults as Type-5 */ 1645 if (IS_DEBUG_OSPF_NSSA) 1646 zlog_info ("ospf_abr_nssa_task(): announce nssa defaults"); 1647 ospf_abr_announce_nssa_defaults (); 1648 1649 /* Flush any unapproved previous translates from Global Data Base */ 1650 if (IS_DEBUG_OSPF_NSSA) 1651 zlog_info ("ospf_abr_nssa_task(): remove unapproved translates"); 1652 ospf_abr_remove_unapproved_translates (); 1653 1654 ospf_abr_manage_discard_routes (); /* same as normal...discard */ 1655 1656 if (IS_DEBUG_OSPF_NSSA) 1657 zlog_info ("ospf_abr_nssa_task(): Stop"); 1658} 1659#endif /* HAVE_NSSA */ 1660 1661/* This is the function taking care about ABR stuff, i.e. 1662 summary-LSA origination and flooding. */ 1663void 1664ospf_abr_task () 1665{ 1666 if (IS_DEBUG_OSPF_EVENT) 1667 zlog_info ("ospf_abr_task(): Start"); 1668 1669 if (ospf_top->new_table == NULL || ospf_top->new_rtrs == NULL) 1670 { 1671 if (IS_DEBUG_OSPF_EVENT) 1672 zlog_info ("ospf_abr_task(): Routing tables are not yet ready"); 1673 return; 1674 } 1675 1676 if (IS_DEBUG_OSPF_EVENT) 1677 zlog_info ("ospf_abr_task(): unapprove summaries"); 1678 ospf_abr_unapprove_summaries (); 1679 1680 if (IS_DEBUG_OSPF_EVENT) 1681 zlog_info ("ospf_abr_task(): prepare aggregates"); 1682 ospf_abr_prepare_aggregates (); 1683 1684 if (OSPF_IS_ABR) 1685 { 1686 if (IS_DEBUG_OSPF_EVENT) 1687 zlog_info ("ospf_abr_task(): process network RT"); 1688 ospf_abr_process_network_rt (ospf_top->new_table); 1689 1690 if (IS_DEBUG_OSPF_EVENT) 1691 zlog_info ("ospf_abr_task(): process router RT"); 1692 ospf_abr_process_router_rt (ospf_top->new_rtrs); 1693 1694 if (IS_DEBUG_OSPF_EVENT) 1695 zlog_info ("ospf_abr_task(): announce aggregates"); 1696 ospf_abr_announce_aggregates (); 1697 1698 if (IS_DEBUG_OSPF_EVENT) 1699 zlog_info ("ospf_abr_task(): announce stub defaults"); 1700 ospf_abr_announce_stub_defaults (); 1701 } 1702 1703 if (IS_DEBUG_OSPF_EVENT) 1704 zlog_info ("ospf_abr_task(): remove unapproved summaries"); 1705 ospf_abr_remove_unapproved_summaries (); 1706 1707 ospf_abr_manage_discard_routes (); 1708 1709#ifdef HAVE_NSSA 1710 ospf_abr_nssa_task(); /* if nssa-abr, then scan Type-7 LSDB */ 1711#endif /* HAVE_NSSA */ 1712 1713 if (IS_DEBUG_OSPF_EVENT) 1714 zlog_info ("ospf_abr_task(): Stop"); 1715} 1716 1717 1718int 1719ospf_abr_task_timer (struct thread *t) 1720{ 1721 ospf_top->t_abr_task = 0; 1722 1723 if (IS_DEBUG_OSPF_EVENT) 1724 zlog_info ("Running ABR task on timer"); 1725 1726 ospf_check_abr_status (); 1727 1728 ospf_abr_task (); 1729 1730 return 0; 1731} 1732 1733void 1734ospf_schedule_abr_task () 1735{ 1736 if (IS_DEBUG_OSPF_EVENT) 1737 zlog_info ("Scheduling ABR task"); 1738 if (! ospf_top->t_abr_task) 1739 ospf_top->t_abr_task = thread_add_timer (master, ospf_abr_task_timer, 1740 0, OSPF_ABR_TASK_DELAY); 1741} 1742