diff options
Diffstat (limited to 'ospfd/ospf_lsa.c')
-rw-r--r-- | ospfd/ospf_lsa.c | 786 |
1 files changed, 364 insertions, 422 deletions
diff --git a/ospfd/ospf_lsa.c b/ospfd/ospf_lsa.c index 9c8cd81d..e01dbd0d 100644 --- a/ospfd/ospf_lsa.c +++ b/ospfd/ospf_lsa.c @@ -394,7 +394,7 @@ lsa_seqnum_increment (struct ospf_lsa *lsa) void lsa_header_set (struct stream *s, u_char options, - u_char type, struct in_addr id) + u_char type, struct in_addr id, struct in_addr router_id) { struct lsa_header *lsah; @@ -404,12 +404,13 @@ lsa_header_set (struct stream *s, u_char options, lsah->options = options; lsah->type = type; lsah->id = id; - lsah->adv_router = ospf_top->router_id; + lsah->adv_router = router_id; lsah->ls_seqnum = htonl (OSPF_INITIAL_SEQUENCE_NUMBER); ospf_output_forward (s, OSPF_LSA_HEADER_SIZE); } + /* router-LSA related functions. */ /* Get router-LSA flags. */ u_char @@ -417,7 +418,7 @@ router_lsa_flags (struct ospf_area *area) { u_char flags; - flags = ospf_top->flags; + flags = area->ospf->flags; /* Set virtual link flag. */ if (ospf_full_virtual_nbrs (area)) @@ -428,10 +429,10 @@ router_lsa_flags (struct ospf_area *area) /* Set Shortcut ABR behabiour flag. */ UNSET_FLAG (flags, ROUTER_LSA_SHORTCUT); - if (ospf_top->abr_type == OSPF_ABR_SHORTCUT) + if (area->ospf->abr_type == OSPF_ABR_SHORTCUT) if (!OSPF_IS_AREA_BACKBONE (area)) if ((area->shortcut_configured == OSPF_SHORTCUT_DEFAULT && - !ospf_top->backbone) || + area->ospf->backbone == NULL) || area->shortcut_configured == OSPF_SHORTCUT_ENABLE) SET_FLAG (flags, ROUTER_LSA_SHORTCUT); @@ -446,21 +447,23 @@ router_lsa_flags (struct ospf_area *area) And check neighbor count, Point-to-Point link must have only 1 neighbor. */ struct ospf_neighbor * -ospf_nbr_lookup_ptop (struct route_table *nbrs, struct in_addr router_id) +ospf_nbr_lookup_ptop (struct ospf_interface *oi) { - struct route_node *rn; struct ospf_neighbor *nbr = NULL; + struct route_node *rn; /* Search neighbor, there must be one of two nbrs. */ - for (rn = route_top (nbrs); rn; rn = route_next (rn)) - if ((nbr = rn->info) != NULL) - /* Ignore myself. */ - if (!IPV4_ADDR_SAME (&nbr->router_id, &ospf_top->router_id)) + for (rn = route_top (oi->nbrs); rn; rn = route_next (rn)) + if ((nbr = rn->info)) + if (!IPV4_ADDR_SAME (&nbr->router_id, &oi->ospf->router_id)) if (nbr->state == NSM_Full) - break; + { + route_unlock_node (rn); + break; + } /* PtoP link must have only 1 neighbor. */ - if (ospf_nbr_count (nbrs, 0) > 1) + if (ospf_nbr_count (oi, 0) > 1) zlog_warn ("Point-to-Point link has more than 1 neighobrs."); return nbr; @@ -490,7 +493,7 @@ lsa_link_ptop_set (struct stream *s, struct ospf_interface *oi) if (IS_DEBUG_OSPF (lsa, LSA_GENERATE)) zlog_info ("LSA[Type1]: Set link Point-to-Point"); - if ((nbr = ospf_nbr_lookup_ptop (oi->nbrs, ospf_top->router_id))) + if ((nbr = ospf_nbr_lookup_ptop (oi))) if (nbr->state == NSM_Full) { /* For unnumbered point-to-point networks, the Link Data field @@ -545,7 +548,7 @@ lsa_link_broadcast_set (struct stream *s, struct ospf_interface *oi) /* Describe Type 2 link. */ if (dr && (dr->state == NSM_Full || IPV4_ADDR_SAME (&oi->address->u.prefix4, &DR (oi))) && - ospf_nbr_count (oi->nbrs, NSM_Full) > 0) + ospf_nbr_count (oi, NSM_Full) > 0) { link_info_set (s, DR (oi), oi->address->u.prefix4, LSA_LINK_TYPE_TRANSIT, 0, oi->output_cost); @@ -581,11 +584,8 @@ lsa_link_virtuallink_set (struct stream *s, struct ospf_interface *oi) { struct ospf_neighbor *nbr; - if (IS_DEBUG_OSPF (lsa, LSA_GENERATE)) - zlog_info ("LSA[Type1]: Set link type VL, state %d", oi->state); - if (oi->state == ISM_PointToPoint) - if ((nbr = ospf_nbr_lookup_ptop (oi->nbrs, ospf_top->router_id))) + if ((nbr = ospf_nbr_lookup_ptop (oi))) if (nbr->state == NSM_Full) { link_info_set (s, nbr->router_id, oi->address->u.prefix4, @@ -602,7 +602,8 @@ lsa_link_virtuallink_set (struct stream *s, struct ospf_interface *oi) 12.4.1.4.*/ /* from "edward rrr" <edward_rrr@hotmail.com> http://marc.theaimsgroup.com/?l=zebra&m=100739222210507&w=2 */ -int lsa_link_ptomultip_set (struct stream *s, struct ospf_interface *oi) +int +lsa_link_ptomp_set (struct stream *s, struct ospf_interface *oi) { int links = 0; struct route_node *rn; @@ -620,11 +621,10 @@ int lsa_link_ptomultip_set (struct stream *s, struct ospf_interface *oi) for (rn = route_top (oi->nbrs); rn; rn = route_next (rn)) if ((nbr = rn->info) != NULL) /* Ignore myself. */ - if (!IPV4_ADDR_SAME (&nbr->router_id, &ospf_top->router_id)) + if (!IPV4_ADDR_SAME (&nbr->router_id, &oi->ospf->router_id)) if (nbr->state == NSM_Full) { - link_info_set (s, nbr->router_id, oi->address->u.prefix4, LSA_LINK_TYPE_POINTOPOINT, 0, oi->output_cost); links++; @@ -633,7 +633,6 @@ int lsa_link_ptomultip_set (struct stream *s, struct ospf_interface *oi) } return links; - } /* Set router-LSA link information. */ @@ -666,7 +665,7 @@ router_lsa_link_set (struct stream *s, struct ospf_area *area) links += lsa_link_nbma_set (s, oi); break; case OSPF_IFTYPE_POINTOMULTIPOINT: - links += lsa_link_ptomultip_set (s, oi); + links += lsa_link_ptomp_set (s, oi); break; case OSPF_IFTYPE_VIRTUALLINK: links += lsa_link_virtuallink_set (s, oi); @@ -711,6 +710,7 @@ ospf_router_lsa_body_set (struct stream *s, struct ospf_area *area) struct ospf_lsa * ospf_router_lsa_new (struct ospf_area *area) { + struct ospf *ospf = area->ospf; struct stream *s; struct lsa_header *lsah; struct ospf_lsa *new; @@ -726,11 +726,11 @@ ospf_router_lsa_new (struct ospf_area *area) #ifdef HAVE_NSSA /* Set LSA common header fields. */ lsa_header_set (s, LSA_OPTIONS_GET (area) | LSA_NSSA_GET (area), - OSPF_ROUTER_LSA, ospf_top->router_id); + OSPF_ROUTER_LSA, ospf->router_id, ospf->router_id); #else /* ! HAVE_NSSA */ /* Set LSA common header fields. */ lsa_header_set (s, LSA_OPTIONS_GET (area), - OSPF_ROUTER_LSA, ospf_top->router_id); + OSPF_ROUTER_LSA, ospf->router_id, ospf->router_id); #endif /* HAVE_NSSA */ /* Set router-LSA body fields. */ @@ -772,10 +772,10 @@ ospf_router_lsa_originate (struct ospf_area *area) } /* Install LSA to LSDB. */ - new = ospf_lsa_install (NULL, new); + new = ospf_lsa_install (area->ospf, NULL, new); /* Update LSA origination count. */ - ospf_top->lsa_originate_count++; + area->ospf->lsa_originate_count++; /* Flooding new LSA through area. */ ospf_flood_through_area (area, NULL, new); @@ -801,13 +801,13 @@ ospf_router_lsa_refresh (struct ospf_lsa *lsa) assert (lsa->data); /* Delete LSA from neighbor retransmit-list. */ - ospf_ls_retransmit_delete_nbr_all (area, lsa); + ospf_ls_retransmit_delete_nbr_area (area, lsa); /* Create new router-LSA instance. */ new = ospf_router_lsa_new (area); new->data->ls_seqnum = lsa_seqnum_increment (lsa); - ospf_lsa_install (NULL, new); + ospf_lsa_install (area->ospf, NULL, new); /* Flood LSA through area. */ ospf_flood_through_area (area, NULL, new); @@ -877,16 +877,17 @@ ospf_router_lsa_timer_add (struct ospf_area *area) } int -ospf_router_lsa_update_timer (struct thread *t) +ospf_router_lsa_update_timer (struct thread *thread) { + struct ospf *ospf = THREAD_ARG (thread); listnode node; if (IS_DEBUG_OSPF (lsa, LSA_GENERATE)) zlog_info ("Timer[router-LSA Update]: (timer expire)"); - ospf_top->t_router_lsa_update = NULL; + ospf->t_router_lsa_update = NULL; - for (node = listhead (ospf_top->areas); node; nextnode (node)) + for (node = listhead (ospf->areas); node; nextnode (node)) { struct ospf_area *area = getdata (node); struct ospf_lsa *lsa = area->router_lsa_self; @@ -906,7 +907,7 @@ ospf_router_lsa_update_timer (struct thread *t) } /* If router-ID is changed, Link ID must change. First flush old LSA, then originate new. */ - else if (!IPV4_ADDR_SAME (&lsa->data->id, &ospf_top->router_id)) + else if (!IPV4_ADDR_SAME (&lsa->data->id, &ospf->router_id)) { if (IS_DEBUG_OSPF (lsa, LSA_GENERATE)) zlog_info("LSA[Type%d:%s]: Refresh router-LSA for Area %s", @@ -922,7 +923,7 @@ ospf_router_lsa_update_timer (struct thread *t) { rl = (struct router_lsa *) lsa->data; /* Refresh router-LSA, (not install) and flood through area. */ - if (rl->flags != ospf_top->flags) + if (rl->flags != ospf->flags) ospf_router_lsa_timer_add (area); } } @@ -975,7 +976,7 @@ ospf_network_lsa_new (struct ospf_interface *oi) lsah = (struct lsa_header *) STREAM_DATA (s); lsa_header_set (s, (OPTIONS (oi) | LSA_OPTIONS_GET (oi->area)), - OSPF_NETWORK_LSA, DR (oi)); + OSPF_NETWORK_LSA, DR (oi), oi->ospf->router_id); /* Set network-LSA body fields. */ ospf_network_lsa_body_set (s, oi); @@ -1009,10 +1010,10 @@ ospf_network_lsa_originate (struct ospf_interface *oi) return NULL; /* Install LSA to LSDB. */ - new = ospf_lsa_install (oi, new); + new = ospf_lsa_install (oi->ospf, oi, new); /* Update LSA origination count. */ - ospf_top->lsa_originate_count++; + oi->ospf->lsa_originate_count++; /* Flooding new LSA through area. */ ospf_flood_through_area (oi->area, NULL, new); @@ -1036,7 +1037,7 @@ ospf_network_lsa_refresh (struct ospf_lsa *lsa, struct ospf_interface *oi) assert (lsa->data); /* Delete LSA from neighbor retransmit-list. */ - ospf_ls_retransmit_delete_nbr_all (area, lsa); + ospf_ls_retransmit_delete_nbr_area (area, lsa); /* Create new network-LSA instance. */ new = ospf_network_lsa_new (oi); @@ -1044,7 +1045,7 @@ ospf_network_lsa_refresh (struct ospf_lsa *lsa, struct ospf_interface *oi) return -1; new->data->ls_seqnum = lsa_seqnum_increment (lsa); - ospf_lsa_install (oi, new); + ospf_lsa_install (area->ospf, oi, new); /* Flood LSA through aera. */ ospf_flood_through_area (area, NULL, new); @@ -1159,7 +1160,8 @@ ospf_summary_lsa_new (struct ospf_area *area, struct prefix *p, s = stream_new (OSPF_MAX_LSA_SIZE); lsah = (struct lsa_header *) STREAM_DATA (s); - lsa_header_set (s, LSA_OPTIONS_GET (area), OSPF_SUMMARY_LSA, id); + lsa_header_set (s, LSA_OPTIONS_GET (area), OSPF_SUMMARY_LSA, + id, area->ospf->router_id); /* Set summary-LSA body fields. */ ospf_summary_lsa_body_set (s, p, metric); @@ -1189,16 +1191,16 @@ ospf_summary_lsa_originate (struct prefix_ipv4 *p, u_int32_t metric, struct ospf_lsa *new; struct in_addr id; - id = ospf_lsa_unique_id (area->lsdb, OSPF_SUMMARY_LSA, p); + id = ospf_lsa_unique_id (area->ospf, area->lsdb, OSPF_SUMMARY_LSA, p); /* Create new summary-LSA instance. */ new = ospf_summary_lsa_new (area, (struct prefix *) p, metric, id); /* Instlal LSA to LSDB. */ - new = ospf_lsa_install (NULL, new); + new = ospf_lsa_install (area->ospf, NULL, new); /* Update LSA origination count. */ - ospf_top->lsa_originate_count++; + area->ospf->lsa_originate_count++; /* Flooding new LSA through area. */ ospf_flood_through_area (area, NULL, new); @@ -1214,7 +1216,7 @@ ospf_summary_lsa_originate (struct prefix_ipv4 *p, u_int32_t metric, } struct ospf_lsa* -ospf_summary_lsa_refresh (struct ospf_lsa *lsa) +ospf_summary_lsa_refresh (struct ospf *ospf, struct ospf_lsa *lsa) { struct ospf_lsa *new; struct summary_lsa *sl; @@ -1233,7 +1235,7 @@ ospf_summary_lsa_refresh (struct ospf_lsa *lsa) /* Re-calculate checksum. */ ospf_lsa_checksum (new->data); - ospf_lsa_install (NULL, new); + ospf_lsa_install (ospf, NULL, new); /* Flood LSA through AS. */ ospf_flood_through_area (new->area, NULL, new); @@ -1285,7 +1287,8 @@ ospf_summary_asbr_lsa_new (struct ospf_area *area, struct prefix *p, s = stream_new (OSPF_MAX_LSA_SIZE); lsah = (struct lsa_header *) STREAM_DATA (s); - lsa_header_set (s, LSA_OPTIONS_GET (area), OSPF_ASBR_SUMMARY_LSA, id); + lsa_header_set (s, LSA_OPTIONS_GET (area), OSPF_ASBR_SUMMARY_LSA, + id, area->ospf->router_id); /* Set summary-LSA body fields. */ ospf_summary_asbr_lsa_body_set (s, p, metric); @@ -1315,16 +1318,16 @@ ospf_summary_asbr_lsa_originate (struct prefix_ipv4 *p, u_int32_t metric, struct ospf_lsa *new; struct in_addr id; - id = ospf_lsa_unique_id (area->lsdb, OSPF_ASBR_SUMMARY_LSA, p); + id = ospf_lsa_unique_id (area->ospf, area->lsdb, OSPF_ASBR_SUMMARY_LSA, p); /* Create new summary-LSA instance. */ new = ospf_summary_asbr_lsa_new (area, (struct prefix *) p, metric, id); /* Install LSA to LSDB. */ - new = ospf_lsa_install (NULL, new); + new = ospf_lsa_install (area->ospf, NULL, new); /* Update LSA origination count. */ - ospf_top->lsa_originate_count++; + area->ospf->lsa_originate_count++; /* Flooding new LSA through area. */ ospf_flood_through_area (area, NULL, new); @@ -1340,7 +1343,7 @@ ospf_summary_asbr_lsa_originate (struct prefix_ipv4 *p, u_int32_t metric, } struct ospf_lsa* -ospf_summary_asbr_lsa_refresh (struct ospf_lsa *lsa) +ospf_summary_asbr_lsa_refresh (struct ospf *ospf, struct ospf_lsa *lsa) { struct ospf_lsa *new; struct summary_lsa *sl; @@ -1359,7 +1362,7 @@ ospf_summary_asbr_lsa_refresh (struct ospf_lsa *lsa) /* Re-calculate checksum. */ ospf_lsa_checksum (new->data); - ospf_lsa_install (NULL, new); + ospf_lsa_install (ospf, NULL, new); /* Flood LSA through area. */ ospf_flood_through_area (new->area, NULL, new); @@ -1379,11 +1382,10 @@ ospf_summary_asbr_lsa_refresh (struct ospf_lsa *lsa) /* Get nexthop for AS-external-LSAs. Return nexthop if its interface is connected, else 0*/ struct in_addr -ospf_external_lsa_nexthop_get (struct in_addr nexthop) +ospf_external_lsa_nexthop_get (struct ospf *ospf, struct in_addr nexthop) { struct in_addr fwd; struct prefix nh; - /* struct route_node *rn; */ listnode n1; fwd.s_addr = 0; @@ -1396,7 +1398,7 @@ ospf_external_lsa_nexthop_get (struct in_addr nexthop) nh.u.prefix4 = nexthop; nh.prefixlen = IPV4_MAX_BITLEN; - for (n1 = listhead (ospf_top->oiflist); n1; nextnode (n1)) + for (n1 = listhead (ospf->oiflist); n1; nextnode (n1)) { struct ospf_interface *oi = getdata (n1); @@ -1438,24 +1440,26 @@ ospf_get_nssa_ip (struct ospf_area *area) fwd.s_addr = 0; best_default.s_addr = 0; - - for (n1 = listhead (ospf_top->oiflist); n1; nextnode (n1)) + for (n1 = listhead (area->ospf->oiflist); n1; nextnode (n1)) { struct ospf_interface *oi = getdata (n1); if (if_is_operative (oi->ifp)) if (oi->area->external_routing == OSPF_AREA_NSSA) - if (oi->address && oi->address->family == AF_INET) { - if (best_default.s_addr == 0) { - best_default = oi->address->u.prefix4; + if (oi->address && oi->address->family == AF_INET) + { + if (best_default.s_addr == 0) + best_default = oi->address->u.prefix4; + if (oi->area == area) + return oi->address->u.prefix4; } - if (oi->area == area) - return (oi->address->u.prefix4); - } } if (best_default.s_addr != 0) return best_default; + if (best_default.s_addr != 0) + return best_default; + return fwd; } #endif /* HAVE_NSSA */ @@ -1467,36 +1471,37 @@ ospf_get_nssa_ip (struct ospf_area *area) #define DEFAULT_METRIC_TYPE EXTERNAL_METRIC_TYPE_2 int -metric_type (u_char src) +metric_type (struct ospf *ospf, u_char src) { - return (ospf_top->dmetric[src].type < 0 ? - DEFAULT_METRIC_TYPE : ospf_top->dmetric[src].type); + return (ospf->dmetric[src].type < 0 ? + DEFAULT_METRIC_TYPE : ospf->dmetric[src].type); } int -metric_value (u_char src) +metric_value (struct ospf *ospf, u_char src) { - if (ospf_top->dmetric[src].value < 0) + if (ospf->dmetric[src].value < 0) { if (src == DEFAULT_ROUTE) { - if (ospf_top->default_originate == DEFAULT_ORIGINATE_ZEBRA) + if (ospf->default_originate == DEFAULT_ORIGINATE_ZEBRA) return DEFAULT_DEFAULT_ORIGINATE_METRIC; else return DEFAULT_DEFAULT_ALWAYS_METRIC; } - else if (ospf_top->default_metric < 0) + else if (ospf->default_metric < 0) return DEFAULT_DEFAULT_METRIC; else - return ospf_top->default_metric; + return ospf->default_metric; } - return ospf_top->dmetric[src].value; + return ospf->dmetric[src].value; } /* Set AS-external-LSA body. */ void -ospf_external_lsa_body_set (struct stream *s, struct external_info *ei) +ospf_external_lsa_body_set (struct stream *s, struct external_info *ei, + struct ospf *ospf) { struct prefix_ipv4 *p = &ei->p; struct in_addr mask, fwd_addr; @@ -1512,10 +1517,10 @@ ospf_external_lsa_body_set (struct stream *s, struct external_info *ei) type = is_prefix_default (&ei->p) ? DEFAULT_ROUTE : ei->type; mtype = (ROUTEMAP_METRIC_TYPE (ei) != -1) ? - ROUTEMAP_METRIC_TYPE (ei) : metric_type (type); + ROUTEMAP_METRIC_TYPE (ei) : metric_type (ospf, type); mvalue = (ROUTEMAP_METRIC (ei) != -1) ? - ROUTEMAP_METRIC (ei) : metric_value (type); + ROUTEMAP_METRIC (ei) : metric_value (ospf, type); /* Put type of external metric. */ stream_putc (s, (mtype == EXTERNAL_METRIC_TYPE_2 ? 0x80 : 0)); @@ -1524,7 +1529,7 @@ ospf_external_lsa_body_set (struct stream *s, struct external_info *ei) stream_put_ospf_metric (s, mvalue); /* Get forwarding address to nexthop if on the Connection List, else 0. */ - fwd_addr = ospf_external_lsa_nexthop_get (ei->nexthop); + fwd_addr = ospf_external_lsa_nexthop_get (ospf, ei->nexthop); /* Put forwarding address. */ stream_put_ipv4 (s, fwd_addr.s_addr); @@ -1535,7 +1540,8 @@ ospf_external_lsa_body_set (struct stream *s, struct external_info *ei) /* Create new external-LSA. */ struct ospf_lsa * -ospf_external_lsa_new (struct external_info *ei, struct in_addr *old_id) +ospf_external_lsa_new (struct ospf *ospf, + struct external_info *ei, struct in_addr *old_id) { struct stream *s; struct lsa_header *lsah; @@ -1559,7 +1565,7 @@ ospf_external_lsa_new (struct external_info *ei, struct in_addr *old_id) /* Get Link State with unique ID. */ else { - id = ospf_lsa_unique_id (ospf_top->lsdb, OSPF_AS_EXTERNAL_LSA, &ei->p); + id = ospf_lsa_unique_id (ospf, ospf->lsdb, OSPF_AS_EXTERNAL_LSA, &ei->p); if (id.s_addr == 0xffffffff) { /* Maybe Link State ID not available. */ @@ -1574,10 +1580,11 @@ ospf_external_lsa_new (struct external_info *ei, struct in_addr *old_id) lsah = (struct lsa_header *) STREAM_DATA (s); /* Set LSA common header fields. */ - lsa_header_set (s, OSPF_OPTION_E, OSPF_AS_EXTERNAL_LSA, id); + lsa_header_set (s, OSPF_OPTION_E, OSPF_AS_EXTERNAL_LSA, + id, ospf->router_id); /* Set AS-external-LSA body fields. */ - ospf_external_lsa_body_set (s, ei); + ospf_external_lsa_body_set (s, ei, ospf); /* Set length. */ length = stream_get_endp (s); @@ -1597,56 +1604,13 @@ ospf_external_lsa_new (struct external_info *ei, struct in_addr *old_id) } #ifdef HAVE_NSSA -/* Set AS-external-LSA body test. */ -void -ospf_external_lsa_body_test (struct stream *s) -{ - struct in_addr mask, fwd_addr; - u_int32_t mvalue = 0; - /* int mtype; - int type; */ - - mask.s_addr = 0; - fwd_addr.s_addr = 0; - - /* Put Network Mask. */ - /* masklen2ip (p->prefixlen, &mask); */ - stream_put_ipv4 (s, mask.s_addr); - - /* If prefix is default, specify DEFAULT_ROUTE. */ - /* type = is_prefix_default (&ei->p) ? DEFAULT_ROUTE : ei->type; - - mtype = (ROUTEMAP_METRIC_TYPE (ei) != -1) ? - ROUTEMAP_METRIC_TYPE (ei) : metric_type (type); - - mvalue = (ROUTEMAP_METRIC (ei) != -1) ? - ROUTEMAP_METRIC (ei) : metric_value (type); */ - - /* Put type of external metric. */ - stream_putc (s, 0); - - /* Put 0 metric. TOS metric is not supported. */ - stream_put_ospf_metric (s, mvalue); - - - /* fwd_addr = ospf_top->router_id; */ - - /* OLD == ospf_external_lsa_nexthop_get (ei->nexthop); */ - - /* Put forwarding address. */ - /* stream_put_ipv4 (s, fwd_addr.s_addr); */ - stream_put_ipv4 (s, ospf_top->router_id.s_addr); - - /* Put route tag -- This value should be introduced from configuration. */ - stream_putl (s, 0); -} - /* As Type-7 */ void -ospf_install_flood_nssa (struct ospf_lsa *lsa, struct external_info *ei) +ospf_install_flood_nssa (struct ospf *ospf, + struct ospf_lsa *lsa, struct external_info *ei) { struct ospf_lsa *new2; - struct as_external_lsa *extlsa, *newextlsa; + struct as_external_lsa *extlsa; listnode node; /* NSSA Originate or Refresh (If anyNSSA) @@ -1664,65 +1628,58 @@ ospf_install_flood_nssa (struct ospf_lsa *lsa, struct external_info *ei) Later, ABR_TASK and P-bit will scan Type-7 LSDB and translate to Type-5's to non-NSSA Areas. (it will also attempt a re-install) */ - for (node = listhead (ospf_top->areas); node; nextnode (node)) { - - struct ospf_area *area = getdata (node); - - /* make lsa duplicate, lock=1 */ - new2 = ospf_lsa_dup(lsa); - - /* make type-7 */ - new2->data->type = OSPF_AS_NSSA_LSA; - - /* set P-bit if not ABR */ - if (! OSPF_IS_ABR) - { - SET_FLAG(new2->data->options, OSPF_OPTION_NP); - - /* set non-zero FWD ADDR - - draft-ietf-ospf-nssa-update-09.txt - - if the network between the NSSA AS boundary router and the - adjacent AS is advertised into OSPF as an internal OSPF route, - the forwarding address should be the next op address as is cu - currently done with type-5 LSAs. If the intervening network is - not adversited into OSPF as an internal OSPF route and the - type-7 LSA's P-bit is set a forwarding address should be - selected from one of the router's active OSPF inteface addresses - which belong to the NSSA. If no such addresses exist, then - no type-7 LSA's with the P-bit set should originate from this - router. */ - - /* not updating lsa anymore, just new2 */ - extlsa = (struct as_external_lsa *)(new2->data); - - if (extlsa->e[0].fwd_addr.s_addr == 0) - /* this NSSA area in ifp */ - extlsa->e[0].fwd_addr = ospf_get_nssa_ip(area); - - if (IS_DEBUG_OSPF_NSSA) - if (extlsa->e[0].fwd_addr.s_addr == 0) - { - zlog_info ("LSA[Type-7]: Could not build FWD-ADDR"); - ospf_lsa_discard(new2); - return; - } - } + for (node = listhead (ospf->areas); node; nextnode (node)) + { + struct ospf_area *area = getdata (node); - /* Re-calculate checksum. */ - ospf_lsa_checksum (new2->data); + /* make lsa duplicate, lock=1 */ + new2 = ospf_lsa_dup (lsa); + new2->area = area; + new2->data->type = OSPF_AS_NSSA_LSA; - /* install also as Type-7 */ - ospf_lsa_install (NULL, new2); /* Remove Old, Lock New = 2 */ + /* set P-bit if not ABR */ + if (! OSPF_IS_ABR) + { + SET_FLAG(new2->data->options, OSPF_OPTION_NP); + + /* set non-zero FWD ADDR + + draft-ietf-ospf-nssa-update-09.txt + + if the network between the NSSA AS boundary router and the + adjacent AS is advertised into OSPF as an internal OSPF route, + the forwarding address should be the next op address as is cu + currently done with type-5 LSAs. If the intervening network is + not adversited into OSPF as an internal OSPF route and the + type-7 LSA's P-bit is set a forwarding address should be + selected from one of the router's active OSPF inteface addresses + which belong to the NSSA. If no such addresses exist, then + no type-7 LSA's with the P-bit set should originate from this + router. */ + + /* kevinm: not updating lsa anymore, just new2 */ + extlsa = (struct as_external_lsa *)(new2->data); + + if (extlsa->e[0].fwd_addr.s_addr == 0) + extlsa->e[0].fwd_addr = ospf_get_nssa_ip(area); /* this NSSA area in ifp */ - /* will send each copy, lock=2+n */ - ospf_flood_through_as (NULL, new2); /* all attached NSSA's, no AS/STUBs */ + if (IS_DEBUG_OSPF_NSSA) + if (extlsa->e[0].fwd_addr.s_addr == 0) + { + zlog_info ("LSA[Type-7]: Could not build FWD-ADDR"); + ospf_lsa_discard(new2); + return; + } } + /* Re-calculate checksum. */ + ospf_lsa_checksum (new2->data); - /* last send, lock=2 LSA is now permanent in Type-7 LSDB */ - /* It has the same ID as it's Type-5 Counter-Part */ - + /* install also as Type-7 */ + ospf_lsa_install (ospf, NULL, new2); /* Remove Old, Lock New = 2 */ + + /* will send each copy, lock=2+n */ + ospf_flood_through_as (ospf, NULL, new2); /* all attached NSSA's, no AS/STUBs */ + } } #endif /* HAVE_NSSA */ @@ -1740,7 +1697,7 @@ is_prefix_default (struct prefix_ipv4 *p) /* Originate an AS-external-LSA, install and flood. */ struct ospf_lsa * -ospf_external_lsa_originate (struct external_info *ei) +ospf_external_lsa_originate (struct ospf *ospf, struct external_info *ei) { struct ospf_lsa *new; @@ -1780,11 +1737,11 @@ ospf_external_lsa_originate (struct external_info *ei) */ /* Check the AS-external-LSA should be originated. */ - if (!ospf_redistribute_check (ei, NULL)) + if (!ospf_redistribute_check (ospf, ei, NULL)) return NULL; /* Create new AS-external-LSA instance. */ - if ((new = ospf_external_lsa_new (ei, NULL)) == NULL) + if ((new = ospf_external_lsa_new (ospf, ei, NULL)) == NULL) { if (IS_DEBUG_OSPF_EVENT) zlog_info ("LSA[Type5:%s]: Could not originate AS-external-LSA", @@ -1793,18 +1750,18 @@ ospf_external_lsa_originate (struct external_info *ei) } /* Install newly created LSA into Type-5 LSDB, lock = 1. */ - ospf_lsa_install (NULL, new); + ospf_lsa_install (ospf, NULL, new); /* Update LSA origination count. */ - ospf_top->lsa_originate_count++; + ospf->lsa_originate_count++; /* Flooding new LSA. only to AS (non-NSSA/STUB) */ - ospf_flood_through_as (NULL, new); + ospf_flood_through_as (ospf, NULL, new); #ifdef HAVE_NSSA /* If there is any attached NSSA, do special handling */ - if (ospf_top->anyNSSA) - ospf_install_flood_nssa (new, ei); /* Install/Flood Type-7 to all NSSAs */ + if (ospf->anyNSSA) + ospf_install_flood_nssa (ospf, new, ei); /* Install/Flood Type-7 to all NSSAs */ #endif /* HAVE_NSSA */ /* Debug logging. */ @@ -1820,22 +1777,22 @@ ospf_external_lsa_originate (struct external_info *ei) /* Originate AS-external-LSA from external info with initial flag. */ int -ospf_external_lsa_originate_timer (struct thread *t) +ospf_external_lsa_originate_timer (struct thread *thread) { + struct ospf *ospf = THREAD_ARG (thread); struct route_node *rn; struct external_info *ei; struct route_table *rt; - int type; + int type = THREAD_VAL (thread); - ospf_top->t_external_lsa = NULL; - type = THREAD_VAL (t); + ospf->t_external_lsa = NULL; /* Originate As-external-LSA from all type of distribute source. */ if ((rt = EXTERNAL_INFO (type))) for (rn = route_top (rt); rn; rn = route_next (rn)) if ((ei = rn->info) != NULL) if (!is_prefix_default ((struct prefix_ipv4 *)&ei->p)) - if (!ospf_external_lsa_originate (ei)) + if (!ospf_external_lsa_originate (ospf, ei)) zlog_warn ("LSA: AS-external-LSA was not originated."); return 0; @@ -1847,6 +1804,7 @@ ospf_default_external_info () int type; struct route_node *rn; struct prefix_ipv4 p; + struct ospf *ospf = ospf_top; p.family = AF_INET; p.prefix.s_addr = 0; @@ -1861,7 +1819,7 @@ ospf_default_external_info () { route_unlock_node (rn); assert (rn->info); - if (ospf_redistribute_check (rn->info, NULL)) + if (ospf_redistribute_check (ospf, rn->info, NULL)) return rn->info; } } @@ -1870,15 +1828,16 @@ ospf_default_external_info () } int -ospf_default_originate_timer (struct thread *t) +ospf_default_originate_timer (struct thread *thread) { int *origin; struct prefix_ipv4 p; struct in_addr nexthop; struct external_info *ei; + struct ospf *ospf = ospf_top; /* Get originate flags. */ - origin = THREAD_ARG (t); + origin = THREAD_ARG (thread); p.family = AF_INET; p.prefix.s_addr = 0; @@ -1893,14 +1852,15 @@ ospf_default_originate_timer (struct thread *t) } if ((ei = ospf_default_external_info ())) - ospf_external_lsa_originate (ei); + ospf_external_lsa_originate (ospf, ei); return 0; } /* Flush an AS-external-LSA from LSDB and routing domain. */ void -ospf_external_lsa_flush (u_char type, struct prefix_ipv4 *p, +ospf_external_lsa_flush (struct ospf *ospf, + u_char type, struct prefix_ipv4 *p, unsigned int ifindex, struct in_addr nexthop) { struct ospf_lsa *lsa; @@ -1910,7 +1870,7 @@ ospf_external_lsa_flush (u_char type, struct prefix_ipv4 *p, inet_ntoa (p->prefix), p->prefixlen); /* First lookup LSA from LSDB. */ - if (!(lsa = ospf_external_info_find_lsa (p))) + if (!(lsa = ospf_external_info_find_lsa (ospf, p))) { if (IS_DEBUG_OSPF (lsa, LSA_FLOODING)) zlog_warn ("LSA: There is no such AS-external-LSA %s/%d in LSDB", @@ -1919,7 +1879,7 @@ ospf_external_lsa_flush (u_char type, struct prefix_ipv4 *p, } /* Sweep LSA from Link State Retransmit List. */ - ospf_ls_retransmit_delete_nbr_all (NULL, lsa); + ospf_ls_retransmit_delete_nbr_as (ospf, lsa); /* There must be no self-originated LSA in rtrs_external. */ #if 0 @@ -1930,10 +1890,10 @@ ospf_external_lsa_flush (u_char type, struct prefix_ipv4 *p, if (!IS_LSA_MAXAGE (lsa)) { /* Unregister LSA from Refresh queue. */ - ospf_refresher_unregister_lsa (ospf_top, lsa); + ospf_refresher_unregister_lsa (ospf, lsa); /* Flush AS-external-LSA through AS. */ - ospf_flush_through_as (lsa); + ospf_lsa_flush_as (ospf, lsa); } if (IS_DEBUG_OSPF (lsa, LSA_FLOODING)) @@ -1941,7 +1901,7 @@ ospf_external_lsa_flush (u_char type, struct prefix_ipv4 *p, } void -ospf_external_lsa_refresh_default () +ospf_external_lsa_refresh_default (struct ospf *ospf) { struct prefix_ipv4 p; struct external_info *ei; @@ -1952,7 +1912,7 @@ ospf_external_lsa_refresh_default () p.prefix.s_addr = 0; ei = ospf_default_external_info (); - lsa = ospf_external_info_find_lsa (&p); + lsa = ospf_external_info_find_lsa (ospf, &p); if (ei) { @@ -1960,13 +1920,13 @@ ospf_external_lsa_refresh_default () { if (IS_DEBUG_OSPF_EVENT) zlog_info ("LSA[Type5:0.0.0.0]: Refresh AS-external-LSA %p", lsa); - ospf_external_lsa_refresh (lsa, ei, LSA_REFRESH_FORCE); + ospf_external_lsa_refresh (ospf, lsa, ei, LSA_REFRESH_FORCE); } else { if (IS_DEBUG_OSPF_EVENT) zlog_info ("LSA[Type5:0.0.0.0]: Originate AS-external-LSA"); - ospf_external_lsa_originate (ei); + ospf_external_lsa_originate (ospf, ei); } } else @@ -1975,13 +1935,13 @@ ospf_external_lsa_refresh_default () { if (IS_DEBUG_OSPF_EVENT) zlog_info ("LSA[Type5:0.0.0.0]: Flush AS-external-LSA"); - ospf_lsa_flush_as (lsa); + ospf_lsa_flush_as (ospf, lsa); } } } void -ospf_external_lsa_refresh_type (u_char type, int force) +ospf_external_lsa_refresh_type (struct ospf *ospf, u_char type, int force) { struct route_node *rn; struct external_info *ei; @@ -1995,25 +1955,26 @@ ospf_external_lsa_refresh_type (u_char type, int force) { struct ospf_lsa *lsa; - if ((lsa = ospf_external_info_find_lsa (&ei->p))) - ospf_external_lsa_refresh (lsa, ei, force); + if ((lsa = ospf_external_info_find_lsa (ospf, &ei->p))) + ospf_external_lsa_refresh (ospf, lsa, ei, force); else - ospf_external_lsa_originate (ei); + ospf_external_lsa_originate (ospf, ei); } } /* Refresh AS-external-LSA. */ void -ospf_external_lsa_refresh (struct ospf_lsa *lsa, +ospf_external_lsa_refresh (struct ospf *ospf, struct ospf_lsa *lsa, struct external_info *ei, int force) { struct ospf_lsa *new; int changed; /* Check the AS-external-LSA should be originated. */ - if (!ospf_redistribute_check (ei, &changed)) + if (!ospf_redistribute_check (ospf, ei, &changed)) { - ospf_external_lsa_flush (ei->type, &ei->p, ei->ifindex, ei->nexthop); + ospf_external_lsa_flush (ospf, ei->type, &ei->p, + ei->ifindex, ei->nexthop); return; } @@ -2021,12 +1982,12 @@ ospf_external_lsa_refresh (struct ospf_lsa *lsa, return; /* Delete LSA from neighbor retransmit-list. */ - ospf_ls_retransmit_delete_nbr_all (NULL, lsa); + ospf_ls_retransmit_delete_nbr_as (ospf, lsa); /* Unregister AS-external-LSA from refresh-list. */ - ospf_refresher_unregister_lsa (ospf_top, lsa); + ospf_refresher_unregister_lsa (ospf, lsa); - new = ospf_external_lsa_new (ei, &lsa->data->id); + new = ospf_external_lsa_new (ospf, ei, &lsa->data->id); if (new == NULL) { @@ -2044,19 +2005,19 @@ ospf_external_lsa_refresh (struct ospf_lsa *lsa, /* Re-calculate checksum. */ ospf_lsa_checksum (new->data); - ospf_lsa_install (NULL, new); /* As type-5. */ + ospf_lsa_install (ospf, NULL, new); /* As type-5. */ /* Flood LSA through AS. */ - ospf_flood_through_as (NULL, new); + ospf_flood_through_as (ospf, NULL, new); #ifdef HAVE_NSSA /* If any attached NSSA, install as Type-7, flood to all NSSA Areas */ - if (ospf_top->anyNSSA) - ospf_install_flood_nssa (new, ei); /* Install/Flood per new rules */ + if (ospf->anyNSSA) + ospf_install_flood_nssa (ospf, new, ei); /* Install/Flood per new rules */ #endif /* HAVE_NSSA */ /* Register slef-originated LSA to refresh queue. */ - ospf_refresher_register_lsa (ospf_top, new); + ospf_refresher_register_lsa (ospf, new); /* Debug logging. */ if (IS_DEBUG_OSPF (lsa, LSA_GENERATE)) @@ -2074,7 +2035,8 @@ ospf_external_lsa_refresh (struct ospf_lsa *lsa, /* Install router-LSA to an area. */ struct ospf_lsa * -ospf_router_lsa_install (struct ospf_lsa *new, int rt_recalc) +ospf_router_lsa_install (struct ospf *ospf, + struct ospf_lsa *new, int rt_recalc) { struct ospf_area *area = new->area; @@ -2084,7 +2046,7 @@ ospf_router_lsa_install (struct ospf_lsa *new, int rt_recalc) area whose link-state database has changed). */ if (rt_recalc) - ospf_spf_calculate_schedule(); + ospf_spf_calculate_schedule (ospf); if (IS_LSA_SELF (new)) { @@ -2111,7 +2073,8 @@ ospf_router_lsa_install (struct ospf_lsa *new, int rt_recalc) /* Install network-LSA to an area. */ struct ospf_lsa * -ospf_network_lsa_install (struct ospf_interface *oi, +ospf_network_lsa_install (struct ospf *ospf, + struct ospf_interface *oi, struct ospf_lsa *new, int rt_recalc) { @@ -2122,7 +2085,7 @@ ospf_network_lsa_install (struct ospf_interface *oi, area whose link-state database has changed). */ if (rt_recalc) - ospf_spf_calculate_schedule(); + ospf_spf_calculate_schedule (ospf); /* We supposed that when LSA is originated by us, we pass the int for which it was originated. If LSA was received by flooding, @@ -2145,9 +2108,9 @@ ospf_network_lsa_install (struct ospf_interface *oi, /* Install summary-LSA to an area. */ struct ospf_lsa * -ospf_summary_lsa_install (struct ospf_lsa *new, int rt_recalc) +ospf_summary_lsa_install (struct ospf *ospf, struct ospf_lsa *new, + int rt_recalc) { - if (rt_recalc && !IS_LSA_SELF (new)) { /* RFC 2328 Section 13.2 Summary-LSAs @@ -2161,7 +2124,7 @@ ospf_summary_lsa_install (struct ospf_lsa *new, int rt_recalc) /* This doesn't exist yet... */ ospf_summary_incremental_update(new); */ #else /* #if 0 */ - ospf_spf_calculate_schedule(); + ospf_spf_calculate_schedule (ospf); #endif /* #if 0 */ if (IS_DEBUG_OSPF (lsa, LSA_INSTALL)) @@ -2169,14 +2132,15 @@ ospf_summary_lsa_install (struct ospf_lsa *new, int rt_recalc) } if (IS_LSA_SELF (new)) - ospf_refresher_register_lsa (ospf_top, new); + ospf_refresher_register_lsa (ospf, new); return new; } /* Install ASBR-summary-LSA to an area. */ struct ospf_lsa * -ospf_summary_asbr_lsa_install (struct ospf_lsa *new, int rt_recalc) +ospf_summary_asbr_lsa_install (struct ospf *ospf, struct ospf_lsa *new, + int rt_recalc) { if (rt_recalc && !IS_LSA_SELF (new)) { @@ -2193,22 +2157,23 @@ ospf_summary_asbr_lsa_install (struct ospf_lsa *new, int rt_recalc) - RFC 2328 Section 16.5 implies it should be */ /* ospf_ase_calculate_schedule(); */ #else /* #if 0 */ - ospf_spf_calculate_schedule(); + ospf_spf_calculate_schedule (ospf); #endif /* #if 0 */ } /* register LSA to refresh-list. */ if (IS_LSA_SELF (new)) - ospf_refresher_register_lsa (ospf_top, new); + ospf_refresher_register_lsa (ospf, new); return new; } /* Install AS-external-LSA. */ struct ospf_lsa * -ospf_external_lsa_install (struct ospf_lsa *new, int rt_recalc) +ospf_external_lsa_install (struct ospf *ospf, struct ospf_lsa *new, + int rt_recalc) { - ospf_ase_register_external_lsa (new, ospf_top); + ospf_ase_register_external_lsa (new, ospf); /* If LSA is not self-originated, calculate an external route. */ if (rt_recalc) { @@ -2218,18 +2183,19 @@ ospf_external_lsa_install (struct ospf_lsa *new, int rt_recalc) */ if (!IS_LSA_SELF (new)) - ospf_ase_incremental_update (new, ospf_top); + ospf_ase_incremental_update (ospf, new); } /* Register self-originated LSA to refresh queue. */ if (IS_LSA_SELF (new)) - ospf_refresher_register_lsa (ospf_top, new); + ospf_refresher_register_lsa (ospf, new); return new; } void -ospf_discard_from_db (struct ospf_lsdb *lsdb, struct ospf_lsa *lsa) +ospf_discard_from_db (struct ospf *ospf, + struct ospf_lsdb *lsdb, struct ospf_lsa *lsa) { struct ospf_lsa *old; @@ -2239,9 +2205,7 @@ ospf_discard_from_db (struct ospf_lsdb *lsdb, struct ospf_lsa *lsa) return; if (old->refresh_list >= 0) - ospf_refresher_unregister_lsa (ospf_top, old); - - ospf_ls_retransmit_delete_nbr_all (old->area, old); + ospf_refresher_unregister_lsa (ospf, old); switch (old->data->type) { @@ -2249,31 +2213,21 @@ ospf_discard_from_db (struct ospf_lsdb *lsdb, struct ospf_lsa *lsa) #ifdef HAVE_OPAQUE_LSA case OSPF_OPAQUE_AS_LSA: #endif /* HAVE_OPAQUE_LSA */ - ospf_ase_unregister_external_lsa (old, ospf_top); + ospf_ls_retransmit_delete_nbr_as (ospf, old); + ospf_ase_unregister_external_lsa (old, ospf); break; default: + ospf_ls_retransmit_delete_nbr_area (old->area, old); break; } - ospf_lsa_maxage_delete (old); + ospf_lsa_maxage_delete (ospf, old); ospf_lsa_discard (old); } -/* callback for foreach_lsa */ -int -ospf_lsa_discard_callback (struct ospf_lsa *lsa, void *p, int i) -{ -#ifdef HAVE_NSSA - /* Removed: Stay away from any Local Translated Type-7 LSAs */ - /* if (CHECK_FLAG (lsa->flags, OSPF_LSA_LOCAL_XLT)) - return 0; */ -#endif /* HAVE_NSSA */ - ospf_discard_from_db ((struct ospf_lsdb *)p, lsa); - return 0; -} - struct ospf_lsa * -ospf_lsa_install (struct ospf_interface *oi, struct ospf_lsa *lsa) +ospf_lsa_install (struct ospf *ospf, struct ospf_interface *oi, + struct ospf_lsa *lsa) { struct ospf_lsa *new = NULL; struct ospf_lsa *old = NULL; @@ -2283,34 +2237,26 @@ ospf_lsa_install (struct ospf_interface *oi, struct ospf_lsa *lsa) /* Set LSDB. */ switch (lsa->data->type) { +#ifdef HAVE_NSSA /* kevinm */ case OSPF_AS_NSSA_LSA: if (lsa->area) lsdb = lsa->area->lsdb; else - lsdb = ospf_top->lsdb; + lsdb = ospf->lsdb; break; +#endif /* HAVE_NSSA */ case OSPF_AS_EXTERNAL_LSA: #ifdef HAVE_OPAQUE_LSA case OSPF_OPAQUE_AS_LSA: #endif /* HAVE_OPAQUE_LSA */ - lsdb = ospf_top->lsdb; + lsdb = ospf->lsdb; break; default: lsdb = lsa->area->lsdb; break; } -#ifdef HAVE_NSSA - if (IS_DEBUG_OSPF_NSSA) - { - zlog_info ("LSA[Installing]: Type-%d ", lsa->data->type); - - if (lsa->data->type == OSPF_AS_NSSA_LSA ) - zlog_info ("NSSA LSA AREA = %s", inet_ntoa (lsa->area->area_id)); - } -#endif /* HAVE_NSSA */ - assert (lsdb); /* RFC 2328 13.2. Installing LSAs in the database @@ -2346,7 +2292,7 @@ ospf_lsa_install (struct ospf_interface *oi, struct ospf_lsa *lsa) /* discard old LSA from LSDB */ if (old != NULL) - ospf_discard_from_db (lsdb, lsa); + ospf_discard_from_db (ospf, lsdb, lsa); /* Insert LSA to LSDB. */ ospf_lsdb_add (lsdb, lsa); @@ -2360,27 +2306,27 @@ ospf_lsa_install (struct ospf_interface *oi, struct ospf_lsa *lsa) switch (lsa->data->type) { case OSPF_ROUTER_LSA: - new = ospf_router_lsa_install (lsa, rt_recalc); + new = ospf_router_lsa_install (ospf, lsa, rt_recalc); break; case OSPF_NETWORK_LSA: assert (oi); - new = ospf_network_lsa_install (oi, lsa, rt_recalc); + new = ospf_network_lsa_install (ospf, oi, lsa, rt_recalc); break; case OSPF_SUMMARY_LSA: - new = ospf_summary_lsa_install (lsa, rt_recalc); + new = ospf_summary_lsa_install (ospf, lsa, rt_recalc); break; case OSPF_ASBR_SUMMARY_LSA: - new = ospf_summary_asbr_lsa_install (lsa, rt_recalc); + new = ospf_summary_asbr_lsa_install (ospf, lsa, rt_recalc); break; case OSPF_AS_EXTERNAL_LSA: - new = ospf_external_lsa_install (lsa, rt_recalc); + new = ospf_external_lsa_install (ospf, lsa, rt_recalc); break; #ifdef HAVE_OPAQUE_LSA case OSPF_OPAQUE_LINK_LSA: if (IS_LSA_SELF (lsa)) - lsa->oi = oi; /* Specify outgoing ospf-interface for this LSA. */ + lsa->oi = oi; /* Specify outgoing ospf-interface for this LSA. */ else - ; /* Incoming "oi" for this LSA has set at LSUpd reception. */ + ; /* Incoming "oi" for this LSA has set at LSUpd reception. */ /* Fallthrough */ case OSPF_OPAQUE_AREA_LSA: case OSPF_OPAQUE_AS_LSA: @@ -2389,7 +2335,7 @@ ospf_lsa_install (struct ospf_interface *oi, struct ospf_lsa *lsa) #endif /* HAVE_OPAQUE_LSA */ default: /* NSSA, or type-6,8,9....nothing special */ #ifdef HAVE_NSSA - new = ospf_external_lsa_install (lsa, rt_recalc); + new = ospf_external_lsa_install (ospf, lsa, rt_recalc); #endif /* HAVE_NSSA */ break; } @@ -2410,7 +2356,7 @@ ospf_lsa_install (struct ospf_interface *oi, struct ospf_lsa *lsa) #endif /* HAVE_OPAQUE_LSA */ #ifdef HAVE_NSSA case OSPF_AS_NSSA_LSA: -#endif +#endif /* HAVE_NSSA */ zlog_info ("LSA[%s]: Install %s", dump_lsa_key (new), LOOKUP (ospf_lsa_type_msg, new->data->type)); @@ -2430,7 +2376,7 @@ ospf_lsa_install (struct ospf_interface *oi, struct ospf_lsa *lsa) if (IS_DEBUG_OSPF (lsa, LSA_FLOODING)) zlog_info ("LSA[Type%d:%s]: Install LSA, MaxAge", new->data->type, inet_ntoa (new->data->id)); - ospf_lsa_maxage (lsa); + ospf_lsa_maxage (ospf, lsa); } return new; @@ -2438,11 +2384,11 @@ ospf_lsa_install (struct ospf_interface *oi, struct ospf_lsa *lsa) int -ospf_check_nbr_status () +ospf_check_nbr_status (struct ospf *ospf) { listnode node; - for (node = listhead (ospf_top->oiflist); node; node = nextnode (node)) + for (node = listhead (ospf->oiflist); node; node = nextnode (node)) { struct ospf_interface *oi = getdata (node); struct route_node *rn; @@ -2497,19 +2443,20 @@ ospf_maxage_flood (struct ospf_lsa *lsa) int ospf_maxage_lsa_remover (struct thread *thread) { + struct ospf *ospf = THREAD_ARG (thread); listnode node; listnode next; int reschedule = 0; - ospf_top->t_maxage = NULL; + ospf->t_maxage = NULL; if (IS_DEBUG_OSPF (lsa, LSA_FLOODING)) zlog_info ("LSA[MaxAge]: remover Start"); - reschedule = !ospf_check_nbr_status (); + reschedule = !ospf_check_nbr_status (ospf); if (!reschedule) - for (node = listhead (ospf_top->maxage_lsa); node; node = next) + for (node = listhead (ospf->maxage_lsa); node; node = next) { struct ospf_lsa *lsa = getdata (node); next = node->next; @@ -2534,11 +2481,11 @@ ospf_maxage_lsa_remover (struct thread *thread) #ifdef ORIGINAL_CODING ospf_maxage_flood (lsa); #else /* ORIGINAL_CODING */ - ospf_flood_through (NULL, lsa); + ospf_flood_through (ospf, NULL, lsa); #endif /* ORIGINAL_CODING */ /* Remove from lsdb. */ - ospf_discard_from_db (lsa->lsdb, lsa); + ospf_discard_from_db (ospf, lsa->lsdb, lsa); ospf_lsdb_delete (lsa->lsdb, lsa); } @@ -2547,17 +2494,17 @@ ospf_maxage_lsa_remover (struct thread *thread) neighbor Link state retransmission lists and b) none of the router's neighbors are in states Exchange or Loading. */ if (reschedule) - OSPF_SCHEDULE_MAXAGE (ospf_top->t_maxage, ospf_maxage_lsa_remover); + OSPF_TIMER_ON (ospf->t_maxage, ospf_maxage_lsa_remover, 2); return 0; } int -ospf_lsa_maxage_exist (struct ospf_lsa *new) +ospf_lsa_maxage_exist (struct ospf *ospf, struct ospf_lsa *new) { listnode node; - for (node = listhead (ospf_top->maxage_lsa); node; nextnode (node)) + for (node = listhead (ospf->maxage_lsa); node; nextnode (node)) if (((struct ospf_lsa *) node->data) == new) return 1; @@ -2565,23 +2512,23 @@ ospf_lsa_maxage_exist (struct ospf_lsa *new) } void -ospf_lsa_maxage_delete (struct ospf_lsa *lsa) +ospf_lsa_maxage_delete (struct ospf *ospf, struct ospf_lsa *lsa) { listnode n; - if ((n = listnode_lookup (ospf_top->maxage_lsa, lsa))) + if ((n = listnode_lookup (ospf->maxage_lsa, lsa))) { - list_delete_node (ospf_top->maxage_lsa, n); + list_delete_node (ospf->maxage_lsa, n); ospf_lsa_unlock (lsa); } } void -ospf_lsa_maxage (struct ospf_lsa *lsa) +ospf_lsa_maxage (struct ospf *ospf, struct ospf_lsa *lsa) { /* When we saw a MaxAge LSA flooded to us, we put it on the list and schedule the MaxAge LSA remover. */ - if (ospf_lsa_maxage_exist (lsa)) + if (ospf_lsa_maxage_exist (ospf, lsa)) { if (IS_DEBUG_OSPF (lsa, LSA_FLOODING)) zlog_info ("LSA[Type%d:%s]: %p already exists on MaxAge LSA list", @@ -2589,16 +2536,16 @@ ospf_lsa_maxage (struct ospf_lsa *lsa) return; } - listnode_add (ospf_top->maxage_lsa, ospf_lsa_lock (lsa)); + listnode_add (ospf->maxage_lsa, ospf_lsa_lock (lsa)); if (IS_DEBUG_OSPF (lsa, LSA_FLOODING)) zlog_info ("LSA[%s]: MaxAge LSA remover scheduled.", dump_lsa_key (lsa)); - OSPF_SCHEDULE_MAXAGE (ospf_top->t_maxage, ospf_maxage_lsa_remover); + OSPF_TIMER_ON (ospf->t_maxage, ospf_maxage_lsa_remover, 2); } int -ospf_lsa_maxage_walker_remover (struct ospf_lsa *lsa, void *p_arg, int int_arg) +ospf_lsa_maxage_walker_remover (struct ospf *ospf, struct ospf_lsa *lsa) { #ifdef HAVE_NSSA /* Stay away from any Local Translated Type-7 LSAs */ @@ -2609,7 +2556,7 @@ ospf_lsa_maxage_walker_remover (struct ospf_lsa *lsa, void *p_arg, int int_arg) if (IS_LSA_MAXAGE (lsa)) /* Self-originated LSAs should NOT time-out instead, they're flushed and submitted to the max_age list explicitly. */ - if (!ospf_lsa_is_self_originated (lsa)) + if (!ospf_lsa_is_self_originated (ospf, lsa)) { if (IS_DEBUG_OSPF (lsa, LSA_FLOODING)) zlog_info("LSA[%s]: is MaxAge", dump_lsa_key (lsa)); @@ -2630,18 +2577,17 @@ ospf_lsa_maxage_walker_remover (struct ospf_lsa *lsa, void *p_arg, int int_arg) */ break; #endif /* HAVE_OPAQUE_LSA */ -#ifdef HAVE_NSSA - case OSPF_AS_NSSA_LSA: -#endif case OSPF_AS_EXTERNAL_LSA: - ospf_ase_incremental_update (lsa, ospf_top); - break; +#ifdef HAVE_NSSA + case OSPF_AS_NSSA_LSA: +#endif /* HAVE_NSSA */ + ospf_ase_incremental_update (ospf, lsa); + break; default: - ospf_spf_calculate_schedule (); - break; + ospf_spf_calculate_schedule (ospf); + break; } - - ospf_lsa_maxage (lsa); + ospf_lsa_maxage (ospf, lsa); } return 0; @@ -2649,90 +2595,80 @@ ospf_lsa_maxage_walker_remover (struct ospf_lsa *lsa, void *p_arg, int int_arg) /* Periodical check of MaxAge LSA. */ int -ospf_lsa_maxage_walker (struct thread *t) +ospf_lsa_maxage_walker (struct thread *thread) { + struct ospf *ospf = THREAD_ARG (thread); + struct route_node *rn; + struct ospf_lsa *lsa; listnode node; - ospf_top->t_maxage_walker = NULL; + ospf->t_maxage_walker = NULL; - for (node = listhead (ospf_top->areas); node; nextnode (node)) + for (node = listhead (ospf->areas); node; nextnode (node)) { struct ospf_area *area = node->data; - foreach_lsa (ROUTER_LSDB (area), NULL, 0, - ospf_lsa_maxage_walker_remover); - foreach_lsa (NETWORK_LSDB (area), NULL, 0, - ospf_lsa_maxage_walker_remover); - foreach_lsa (SUMMARY_LSDB (area), NULL, 0, - ospf_lsa_maxage_walker_remover); - foreach_lsa (ASBR_SUMMARY_LSDB (area), NULL, 0, - ospf_lsa_maxage_walker_remover); + LSDB_LOOP (ROUTER_LSDB (area), rn, lsa) + ospf_lsa_maxage_walker_remover (ospf, lsa); + LSDB_LOOP (NETWORK_LSDB (area), rn, lsa) + ospf_lsa_maxage_walker_remover (ospf, lsa); + LSDB_LOOP (SUMMARY_LSDB (area), rn, lsa) + ospf_lsa_maxage_walker_remover (ospf, lsa); + LSDB_LOOP (ASBR_SUMMARY_LSDB (area), rn, lsa) + ospf_lsa_maxage_walker_remover (ospf, lsa); #ifdef HAVE_OPAQUE_LSA - foreach_lsa (OPAQUE_LINK_LSDB (area), NULL, 0, - ospf_lsa_maxage_walker_remover); - foreach_lsa (OPAQUE_AREA_LSDB (area), NULL, 0, - ospf_lsa_maxage_walker_remover); + LSDB_LOOP (OPAQUE_AREA_LSDB (area), rn, lsa) + ospf_lsa_maxage_walker_remover (ospf, lsa); + LSDB_LOOP (OPAQUE_LINK_LSDB (area), rn, lsa) + ospf_lsa_maxage_walker_remover (ospf, lsa); #endif /* HAVE_OPAQUE_LSA */ } /* for AS-eternal-LSAs. */ - if (ospf_top->lsdb) - foreach_lsa (EXTERNAL_LSDB (ospf_top), NULL, 0, - ospf_lsa_maxage_walker_remover); - + if (ospf->lsdb) + { + LSDB_LOOP (EXTERNAL_LSDB (ospf), rn, lsa) + ospf_lsa_maxage_walker_remover (ospf, lsa); #ifdef HAVE_OPAQUE_LSA - if (ospf_top->lsdb) - foreach_lsa (OPAQUE_AS_LSDB (ospf_top), NULL, 0, - ospf_lsa_maxage_walker_remover); + LSDB_LOOP (OPAQUE_AS_LSDB (ospf), rn, lsa) + ospf_lsa_maxage_walker_remover (ospf, lsa); #endif /* HAVE_OPAQUE_LSA */ + } - ospf_top->t_maxage_walker = - thread_add_timer (master, ospf_lsa_maxage_walker, NULL, - OSPF_LSA_MAXAGE_CHECK_INTERVAL); + OSPF_TIMER_ON (ospf->t_maxage_walker, ospf_lsa_maxage_walker, + OSPF_LSA_MAXAGE_CHECK_INTERVAL); return 0; } -int -find_summary (struct ospf_lsa *lsa, void * v, int i) +struct ospf_lsa * +ospf_lsa_lookup_by_prefix (struct ospf_lsdb *lsdb, u_char type, + struct prefix_ipv4 *p, struct in_addr router_id) { - struct prefix_ipv4 *p, pr; - - if ((p = (struct prefix_ipv4 *) v) != NULL) - if (lsa != NULL) - /* We're looking for self-originated one */ - if (ospf_lsa_is_self_originated (lsa)) - { - struct summary_lsa *sl = (struct summary_lsa *) lsa->data; - - pr.family = AF_INET; - pr.prefix = sl->header.id; - pr.prefixlen = ip_masklen (sl->mask); - apply_mask_ipv4 (&pr); - - if (prefix_same ((struct prefix*) &pr, (struct prefix*) p)) - return 1; - } + struct ospf_lsa *lsa; + struct in_addr mask, id; + struct lsa_header_mask + { + struct lsa_header header; + struct in_addr mask; + } *hmask; - return 0; -} + lsa = ospf_lsdb_lookup_by_id (lsdb, type, p->prefix, router_id); + if (lsa == NULL) + return NULL; -int -find_asbr_summary (struct ospf_lsa *lsa, void * v, int i) -{ - struct prefix_ipv4 *p; + masklen2ip (p->prefixlen, &mask); - if ((p = (struct prefix_ipv4 *) v) != NULL) - if (lsa != NULL) - /* We're looking for self-originated one */ - if (ospf_lsa_is_self_originated (lsa)) - { - struct summary_lsa *sl = (struct summary_lsa *) lsa->data; + hmask = (struct lsa_header_mask *) lsa->data; - if (IPV4_ADDR_SAME (&p->prefix, &sl->header.id)) - return 1; - } + if (mask.s_addr != hmask->mask.s_addr) + { + id.s_addr = p->prefix.s_addr | (~mask.s_addr); + lsa = ospf_lsdb_lookup_by_id (lsdb, type, id, router_id); + if (!lsa) + return NULL; + } - return 0; + return lsa; } struct ospf_lsa * @@ -2956,7 +2892,7 @@ ospf_lsa_flush_self_originated (struct ospf_neighbor *nbr, } #else /* ORIGINAL_CODING */ static int -ospf_lsa_flush_schedule (struct ospf_lsa *lsa, void *v, int i) +ospf_lsa_flush_schedule (struct ospf *ospf, struct ospf_lsa *lsa) { if (lsa == NULL || !IS_LSA_SELF (lsa)) return 0; @@ -2977,7 +2913,7 @@ ospf_lsa_flush_schedule (struct ospf_lsa *lsa, void *v, int i) break; #endif /* HAVE_OPAQUE_LSA */ default: - ospf_lsa_maxage (lsa); + ospf_lsa_maxage (ospf, lsa); break; } @@ -2985,15 +2921,16 @@ ospf_lsa_flush_schedule (struct ospf_lsa *lsa, void *v, int i) } void -ospf_flush_self_originated_lsas_now (struct ospf *top) +ospf_flush_self_originated_lsas_now (struct ospf *ospf) { listnode n1, n2; struct ospf_area *area; struct ospf_interface *oi; struct ospf_lsa *lsa; + struct route_node *rn; int need_to_flush_ase = 0; - for (n1 = listhead (top->areas); n1; nextnode (n1)) + for (n1 = listhead (ospf->areas); n1; nextnode (n1)) { if ((area = getdata (n1)) == NULL) continue; @@ -3032,22 +2969,25 @@ ospf_flush_self_originated_lsas_now (struct ospf *top) need_to_flush_ase = 1; } - foreach_lsa (SUMMARY_LSDB (area), NULL, 0, ospf_lsa_flush_schedule); - foreach_lsa (ASBR_SUMMARY_LSDB (area), NULL, 0, ospf_lsa_flush_schedule); + LSDB_LOOP (SUMMARY_LSDB (area), rn, lsa) + ospf_lsa_flush_schedule (ospf, lsa); + LSDB_LOOP (ASBR_SUMMARY_LSDB (area), rn, lsa) + ospf_lsa_flush_schedule (ospf, lsa); #ifdef HAVE_OPAQUE_LSA - foreach_lsa (OPAQUE_LINK_LSDB (area), - NULL, 0, ospf_lsa_flush_schedule); - foreach_lsa (OPAQUE_AREA_LSDB (area), - NULL, 0, ospf_lsa_flush_schedule); + LSDB_LOOP (OPAQUE_LINK_LSDB (area), rn, lsa) + ospf_lsa_flush_schedule (ospf, lsa); + LSDB_LOOP (OPAQUE_AREA_LSDB (area), rn, lsa) + ospf_lsa_flush_schedule (ospf, lsa); #endif /* HAVE_OPAQUE_LSA */ } if (need_to_flush_ase) { - foreach_lsa (EXTERNAL_LSDB (top), NULL, 0, ospf_lsa_flush_schedule); + LSDB_LOOP (EXTERNAL_LSDB (ospf), rn, lsa) + ospf_lsa_flush_schedule (ospf, lsa); #ifdef HAVE_OPAQUE_LSA - foreach_lsa (OPAQUE_AS_LSDB (top), - NULL, 0, ospf_lsa_flush_schedule); + LSDB_LOOP (OPAQUE_AS_LSDB (ospf), rn, lsa) + ospf_lsa_flush_schedule (ospf, lsa); #endif /* HAVE_OPAQUE_LSA */ } @@ -3055,10 +2995,10 @@ ospf_flush_self_originated_lsas_now (struct ospf *top) * Make sure that the MaxAge LSA remover is executed immediately, * without conflicting to other threads. */ - if (top->t_maxage != NULL) + if (ospf->t_maxage != NULL) { - OSPF_TIMER_OFF (top->t_maxage); - thread_execute (master, ospf_maxage_lsa_remover, top, 0); + OSPF_TIMER_OFF (ospf->t_maxage); + thread_execute (master, ospf_maxage_lsa_remover, ospf, 0); } return; @@ -3068,7 +3008,7 @@ ospf_flush_self_originated_lsas_now (struct ospf *top) /* If there is self-originated LSA, then return 1, otherwise return 0. */ /* An interface-independent version of ospf_lsa_is_self_originated */ int -ospf_lsa_is_self_originated (struct ospf_lsa *lsa) +ospf_lsa_is_self_originated (struct ospf *ospf, struct ospf_lsa *lsa) { listnode node; @@ -3080,17 +3020,17 @@ ospf_lsa_is_self_originated (struct ospf_lsa *lsa) SET_FLAG (lsa->flags, OSPF_LSA_SELF_CHECKED); /* AdvRouter and Router ID is the same. */ - if (IPV4_ADDR_SAME (&lsa->data->adv_router, &ospf_top->router_id)) + if (IPV4_ADDR_SAME (&lsa->data->adv_router, &ospf->router_id)) SET_FLAG (lsa->flags, OSPF_LSA_SELF); /* LSA is router-LSA. */ else if (lsa->data->type == OSPF_ROUTER_LSA && - IPV4_ADDR_SAME (&lsa->data->id, &ospf_top->router_id)) + IPV4_ADDR_SAME (&lsa->data->id, &ospf->router_id)) SET_FLAG (lsa->flags, OSPF_LSA_SELF); /* LSA is network-LSA. Compare Link ID with all interfaces. */ else if (lsa->data->type == OSPF_NETWORK_LSA) - for (node = listhead (ospf_top->oiflist); node; nextnode (node)) + for (node = listhead (ospf->oiflist); node; nextnode (node)) { struct ospf_interface *oi = getdata (node); @@ -3110,7 +3050,8 @@ ospf_lsa_is_self_originated (struct ospf_lsa *lsa) /* Get unique Link State ID. */ struct in_addr -ospf_lsa_unique_id (struct ospf_lsdb *lsdb, u_char type, struct prefix_ipv4 *p) +ospf_lsa_unique_id (struct ospf *ospf, + struct ospf_lsdb *lsdb, u_char type, struct prefix_ipv4 *p) { struct ospf_lsa *lsa; struct in_addr mask, id; @@ -3118,7 +3059,7 @@ ospf_lsa_unique_id (struct ospf_lsdb *lsdb, u_char type, struct prefix_ipv4 *p) id = p->prefix; /* Check existence of LSA instance. */ - lsa = ospf_lsdb_lookup_by_id (lsdb, type, id, ospf_top->router_id); + lsa = ospf_lsdb_lookup_by_id (lsdb, type, id, ospf->router_id); if (lsa) { struct as_external_lsa *al = (struct as_external_lsa *) lsa->data; @@ -3138,8 +3079,8 @@ ospf_lsa_unique_id (struct ospf_lsdb *lsdb, u_char type, struct prefix_ipv4 *p) masklen2ip (p->prefixlen, &mask); id.s_addr = p->prefix.s_addr | (~mask.s_addr); - lsa = ospf_lsdb_lookup_by_id (ospf_top->lsdb, type, - id, ospf_top->router_id); + lsa = ospf_lsdb_lookup_by_id (ospf->lsdb, type, + id, ospf->router_id); if (lsa) { if (IS_DEBUG_OSPF (lsa, LSA_GENERATE)) @@ -3176,6 +3117,7 @@ int ospf_lsa_action (struct thread *t) { struct lsa_action *data; + struct ospf *ospf = ospf_top; data = THREAD_ARG (t); @@ -3195,13 +3137,13 @@ ospf_lsa_action (struct thread *t) ospf_flood_through_area (data->area, NULL, data->lsa); break; case LSA_ACTION_FLOOD_AS: - ospf_flood_through_as (NULL, data->lsa); + ospf_flood_through_as (ospf, NULL, data->lsa); break; case LSA_ACTION_FLUSH_AREA: ospf_lsa_flush_area (data->lsa, data->area); break; case LSA_ACTION_FLUSH_AS: - ospf_lsa_flush_as (data->lsa); + ospf_lsa_flush_as (ospf, data->lsa); break; } @@ -3243,7 +3185,7 @@ ospf_schedule_lsa_flush_area (struct ospf_area *area, struct ospf_lsa *lsa) /* LSA Refreshment functions. */ void -ospf_lsa_refresh (struct ospf_lsa *lsa) +ospf_lsa_refresh (struct ospf *ospf, struct ospf_lsa *lsa) { struct external_info *ei; assert (CHECK_FLAG (lsa->flags, OSPF_LSA_SELF)); @@ -3255,17 +3197,17 @@ ospf_lsa_refresh (struct ospf_lsa *lsa) case OSPF_NETWORK_LSA: break; case OSPF_SUMMARY_LSA: - ospf_summary_lsa_refresh (lsa); + ospf_summary_lsa_refresh (ospf, lsa); break; case OSPF_ASBR_SUMMARY_LSA: - ospf_summary_asbr_lsa_refresh (lsa); + ospf_summary_asbr_lsa_refresh (ospf, lsa); break; case OSPF_AS_EXTERNAL_LSA: ei = ospf_external_info_check (lsa); if (ei) - ospf_external_lsa_refresh (lsa, ei, LSA_REFRESH_FORCE); + ospf_external_lsa_refresh (ospf, lsa, ei, LSA_REFRESH_FORCE); else - ospf_lsa_flush_as (lsa); + ospf_lsa_flush_as (ospf, lsa); break; #ifdef HAVE_OPAQUE_LSA case OSPF_OPAQUE_LINK_LSA: @@ -3280,7 +3222,7 @@ ospf_lsa_refresh (struct ospf_lsa *lsa) } void -ospf_refresher_register_lsa (struct ospf *top, struct ospf_lsa *lsa) +ospf_refresher_register_lsa (struct ospf *ospf, struct ospf_lsa *lsa) { u_int16_t index, current_index; @@ -3302,8 +3244,8 @@ ospf_refresher_register_lsa (struct ospf *top, struct ospf_lsa *lsa) if (delay < 0) delay = 0; - current_index = top->lsa_refresh_queue.index + - (time (NULL) - top->lsa_refresher_started)/OSPF_LSA_REFRESHER_GRANULARITY; + current_index = ospf->lsa_refresh_queue.index + + (time (NULL) - ospf->lsa_refresher_started)/OSPF_LSA_REFRESHER_GRANULARITY; index = (current_index + delay/OSPF_LSA_REFRESHER_GRANULARITY) % (OSPF_LSA_REFRESHER_SLOTS); @@ -3311,9 +3253,9 @@ ospf_refresher_register_lsa (struct ospf *top, struct ospf_lsa *lsa) if (IS_DEBUG_OSPF (lsa, LSA_REFRESH)) zlog_info ("LSA[Refresh]: lsa with age %d added to index %d", LS_AGE (lsa), index); - if (!top->lsa_refresh_queue.qs[index]) - top->lsa_refresh_queue.qs[index] = list_new (); - listnode_add (top->lsa_refresh_queue.qs[index], ospf_lsa_lock (lsa)); + if (!ospf->lsa_refresh_queue.qs[index]) + ospf->lsa_refresh_queue.qs[index] = list_new (); + listnode_add (ospf->lsa_refresh_queue.qs[index], ospf_lsa_lock (lsa)); lsa->refresh_list = index; if (IS_DEBUG_OSPF (lsa, LSA_REFRESH)) zlog_info ("LSA[Refresh]: ospf_refresher_register_lsa(): setting refresh_list on lsa %p (slod %d)", lsa, index); @@ -3321,17 +3263,17 @@ ospf_refresher_register_lsa (struct ospf *top, struct ospf_lsa *lsa) } void -ospf_refresher_unregister_lsa (struct ospf *top, struct ospf_lsa *lsa) +ospf_refresher_unregister_lsa (struct ospf *ospf, struct ospf_lsa *lsa) { assert (CHECK_FLAG (lsa->flags, OSPF_LSA_SELF)); if (lsa->refresh_list >= 0) { - list refresh_list = top->lsa_refresh_queue.qs[lsa->refresh_list]; + list refresh_list = ospf->lsa_refresh_queue.qs[lsa->refresh_list]; listnode_delete (refresh_list, lsa); if (!listcount (refresh_list)) { list_free (refresh_list); - top->lsa_refresh_queue.qs[lsa->refresh_list] = NULL; + ospf->lsa_refresh_queue.qs[lsa->refresh_list] = NULL; } ospf_lsa_unlock (lsa); lsa->refresh_list = -1; @@ -3343,7 +3285,7 @@ ospf_lsa_refresh_walker (struct thread *t) { list refresh_list; listnode node; - struct ospf *top = THREAD_ARG (t); + struct ospf *ospf = THREAD_ARG (t); int i; list lsa_to_refresh = list_new (); @@ -3351,27 +3293,27 @@ ospf_lsa_refresh_walker (struct thread *t) zlog_info ("LSA[Refresh]:ospf_lsa_refresh_walker(): start"); - i = top->lsa_refresh_queue.index; + i = ospf->lsa_refresh_queue.index; - top->lsa_refresh_queue.index = - (top->lsa_refresh_queue.index + - (time (NULL) - top->lsa_refresher_started) / OSPF_LSA_REFRESHER_GRANULARITY) + ospf->lsa_refresh_queue.index = + (ospf->lsa_refresh_queue.index + + (time (NULL) - ospf->lsa_refresher_started) / OSPF_LSA_REFRESHER_GRANULARITY) % OSPF_LSA_REFRESHER_SLOTS; if (IS_DEBUG_OSPF (lsa, LSA_REFRESH)) zlog_info ("LSA[Refresh]: ospf_lsa_refresh_walker(): next index %d", - top->lsa_refresh_queue.index); + ospf->lsa_refresh_queue.index); - for (;i != top->lsa_refresh_queue.index; + for (;i != ospf->lsa_refresh_queue.index; i = (i + 1) % OSPF_LSA_REFRESHER_SLOTS) { if (IS_DEBUG_OSPF (lsa, LSA_REFRESH)) zlog_info ("LSA[Refresh]: ospf_lsa_refresh_walker(): refresh index %d", i); - refresh_list = top->lsa_refresh_queue.qs [i]; - - top->lsa_refresh_queue.qs [i] = NULL; + refresh_list = ospf->lsa_refresh_queue.qs [i]; + ospf->lsa_refresh_queue.qs [i] = NULL; + if (refresh_list) { for (node = listhead (refresh_list); node;) @@ -3393,12 +3335,12 @@ ospf_lsa_refresh_walker (struct thread *t) } } - top->t_lsa_refresher = thread_add_timer (master, ospf_lsa_refresh_walker, - top, top->lsa_refresh_interval); - top->lsa_refresher_started = time (NULL); + ospf->t_lsa_refresher = thread_add_timer (master, ospf_lsa_refresh_walker, + ospf, ospf->lsa_refresh_interval); + ospf->lsa_refresher_started = time (NULL); for (node = listhead (lsa_to_refresh); node; nextnode (node)) - ospf_lsa_refresh (getdata (node)); + ospf_lsa_refresh (ospf, getdata (node)); list_delete (lsa_to_refresh); |