static void isis_redist_set(struct isis_area *area, int level, int family, int type, uint32_t metric, const char *routemap, int originate_type) { int protocol = redist_protocol(family); struct isis_redist *redist = get_redist_settings(area, family, type, level); int i; struct route_table *ei_table; struct route_node *rn; struct isis_ext_info *info; redist->redist = (type == DEFAULT_ROUTE) ? originate_type : 1; redist->metric = metric; isis_redist_routemap_set(redist, routemap); if (!area->ext_reach[protocol][level-1]) { area->ext_reach[protocol][level-1] = route_table_init_with_delegate(&isis_redist_rt_delegate); } for (i = 0; i < REDIST_PROTOCOL_COUNT; i++) if (!area->isis->ext_info[i]) { area->isis->ext_info[i] = route_table_init_with_delegate(&isis_redist_rt_delegate); } isis_redist_update_zebra_subscriptions(area->isis); if (type == DEFAULT_ROUTE && originate_type == DEFAULT_ORIGINATE_ALWAYS) isis_redist_ensure_default(area->isis, family); ei_table = get_ext_info(area->isis, family); for (rn = route_top(ei_table); rn; rn = route_next(rn)) { if (!rn->info) continue; info = rn->info; if (type == DEFAULT_ROUTE) { if (!is_default(&rn->p)) continue; } else { if (info->origin != type) continue; } isis_redist_update_ext_reach(area, level, redist, &rn->p, info); } }
/* * bgp_table_init */ struct bgp_table * bgp_table_init (afi_t afi, safi_t safi) { struct bgp_table *rt; rt = XCALLOC (MTYPE_BGP_TABLE, sizeof (struct bgp_table)); rt->route_table = route_table_init_with_delegate (&bgp_table_delegate); /* * Set up back pointer to bgp_table. */ rt->route_table->info = rt; bgp_table_lock (rt); rt->type = BGP_TABLE_MAIN; rt->afi = afi; rt->safi = safi; return rt; }
/* * bgp_table_init */ struct bgp_table *bgp_table_init(struct bgp *bgp, afi_t afi, safi_t safi) { struct bgp_table *rt; rt = XCALLOC(MTYPE_BGP_TABLE, sizeof(struct bgp_table)); rt->route_table = route_table_init_with_delegate(&bgp_table_delegate); /* * Set up back pointer to bgp_table. */ rt->route_table->info = rt; /* * pointer to bgp instance allows working back from bgp_info to bgp */ rt->bgp = bgp; bgp_table_lock(rt); rt->afi = afi; rt->safi = safi; return rt; }