static void ospf6_top_brouter_hook_add (struct ospf6_route *route) { ospf6_abr_examin_brouter (ADV_ROUTER_IN_PREFIX (&route->prefix)); ospf6_asbr_lsentry_add (route); ospf6_abr_originate_summary (route); }
static void ospf6_abr_range_update (struct ospf6_route *range) { u_int32_t cost = 0; struct ospf6_route *ro; assert (range->type == OSPF6_DEST_TYPE_RANGE); /* update range's cost and active flag */ for (ro = ospf6_route_match_head (&range->prefix, ospf6->route_table); ro; ro = ospf6_route_match_next (&range->prefix, ro)) { if (ro->path.area_id == range->path.area_id && ! CHECK_FLAG (ro->flag, OSPF6_ROUTE_REMOVE)) cost = MAX (cost, ro->path.cost); } if (range->path.cost != cost) { range->path.cost = cost; if (range->path.cost) SET_FLAG (range->flag, OSPF6_ROUTE_ACTIVE_SUMMARY); else UNSET_FLAG (range->flag, OSPF6_ROUTE_ACTIVE_SUMMARY); ospf6_abr_originate_summary (range); } }
static void ospf6_top_brouter_hook_add(struct ospf6_route *route) { if (IS_OSPF6_DEBUG_EXAMIN(AS_EXTERNAL) || IS_OSPF6_DEBUG_BROUTER) { uint32_t brouter_id; char brouter_name[16]; brouter_id = ADV_ROUTER_IN_PREFIX(&route->prefix); inet_ntop(AF_INET, &brouter_id, brouter_name, sizeof(brouter_name)); zlog_debug("%s: brouter %s add with adv router %x nh count %u", __PRETTY_FUNCTION__, brouter_name, route->path.origin.adv_router, listcount(route->nh_list)); } ospf6_abr_examin_brouter(ADV_ROUTER_IN_PREFIX(&route->prefix)); ospf6_asbr_lsentry_add(route); ospf6_abr_originate_summary(route); }
static void ospf6_top_route_hook_remove (struct ospf6_route *route) { ospf6_abr_originate_summary (route); ospf6_zebra_route_update_remove (route); }
static int ospf6_spf_calculation_thread (struct thread *t) { struct ospf6_area *oa; struct ospf6 *ospf6; struct timeval start, end, runtime; struct listnode *node; struct ospf6_route *route; int areas_processed = 0; char rbuf[32]; ospf6 = (struct ospf6 *)THREAD_ARG (t); ospf6->t_spf_calc = NULL; /* execute SPF calculation */ quagga_gettime (QUAGGA_CLK_MONOTONIC, &start); for (ALL_LIST_ELEMENTS_RO(ospf6->area_list, node, oa)) { if (oa == ospf6->backbone) continue; if (IS_OSPF6_DEBUG_SPF (PROCESS)) zlog_debug ("SPF calculation for Area %s", oa->name); if (IS_OSPF6_DEBUG_SPF (DATABASE)) ospf6_spf_log_database (oa); ospf6_spf_calculation (ospf6->router_id, oa->spf_table, oa); ospf6_intra_route_calculation (oa); ospf6_intra_brouter_calculation (oa); areas_processed++; } if (ospf6->backbone) { if (IS_OSPF6_DEBUG_SPF (PROCESS)) zlog_debug ("SPF calculation for Backbone area %s", ospf6->backbone->name); if (IS_OSPF6_DEBUG_SPF (DATABASE)) ospf6_spf_log_database(ospf6->backbone); ospf6_spf_calculation(ospf6->router_id, ospf6->backbone->spf_table, ospf6->backbone); ospf6_intra_route_calculation(ospf6->backbone); ospf6_intra_brouter_calculation(ospf6->backbone); areas_processed++; } /* Redo summaries if required */ for (route = ospf6_route_head (ospf6->route_table); route; route = ospf6_route_next (route)) ospf6_abr_originate_summary(route); quagga_gettime (QUAGGA_CLK_MONOTONIC, &end); timersub (&end, &start, &runtime); ospf6->ts_spf_duration = runtime; ospf6_spf_reason_string(ospf6->spf_reason, rbuf, sizeof(rbuf)); if (IS_OSPF6_DEBUG_SPF (PROCESS) || IS_OSPF6_DEBUG_SPF (TIME)) zlog_debug ("SPF runtime: %lld sec %lld usec", (long long)runtime.tv_sec, (long long)runtime.tv_usec); zlog_info("SPF processing: # Areas: %d, SPF runtime: %lld sec %lld usec, " "Reason: %s\n", areas_processed, (long long)runtime.tv_sec, (long long)runtime.tv_usec, rbuf); ospf6->last_spf_reason = ospf6->spf_reason; ospf6_reset_spf_reason(ospf6); return 0; }
static void ospf6_top_route_hook_remove(struct ospf6_route *route) { route->flag |= OSPF6_ROUTE_REMOVE; ospf6_abr_originate_summary(route); ospf6_zebra_route_update_remove(route); }