/* Check LSA is related to external info. */ struct external_info * ospf_external_info_check (struct ospf_lsa *lsa) { struct as_external_lsa *al; struct prefix_ipv4 p; struct route_node *rn; int type; al = (struct as_external_lsa *) lsa->data; p.family = AF_INET; p.prefix = lsa->data->id; p.prefixlen = ip_masklen (al->mask); for (type = 0; type <= ZEBRA_ROUTE_MAX; type++) { int redist_type = is_prefix_default (&p) ? DEFAULT_ROUTE : type; if (ospf_is_type_redistributed (redist_type)) if (EXTERNAL_INFO (type)) { rn = route_node_lookup (EXTERNAL_INFO (type), (struct prefix *) &p); if (rn) { route_unlock_node (rn); if (rn->info != NULL) return (struct external_info *) rn->info; } } } return NULL; }
/* Check LSA is related to external info. */ struct external_info *ospf_external_info_check(struct ospf *ospf, struct ospf_lsa *lsa) { struct as_external_lsa *al; struct prefix_ipv4 p; struct route_node *rn; int type; al = (struct as_external_lsa *)lsa->data; p.family = AF_INET; p.prefix = lsa->data->id; p.prefixlen = ip_masklen(al->mask); for (type = 0; type < ZEBRA_ROUTE_MAX; type++) { int redist_on = 0; redist_on = is_prefix_default(&p) ? vrf_bitmap_check(zclient->default_information, ospf->vrf_id) : (zclient->mi_redist[AFI_IP][type].enabled || vrf_bitmap_check( zclient->redist[AFI_IP][type], ospf->vrf_id)); // Pending: check for MI above. if (redist_on) { struct list *ext_list; struct listnode *node; struct ospf_external *ext; ext_list = ospf->external[type]; if (!ext_list) continue; for (ALL_LIST_ELEMENTS_RO(ext_list, node, ext)) { rn = NULL; if (ext->external_info) rn = route_node_lookup( ext->external_info, (struct prefix *)&p); if (rn) { route_unlock_node(rn); if (rn->info != NULL) return (struct external_info *) rn->info; } } } } return NULL; }