/** * Delete a prefix from the prefix tree hanging off a lsdb (tc) entry. */ void olsr_delete_routing_table(union olsr_ip_addr *dst, int plen, union olsr_ip_addr *originator) { #ifdef DEBUG struct ipaddr_str dstbuf, origbuf; #endif struct tc_entry *tc; struct rt_path *rtp; struct avl_node *node; struct olsr_ip_prefix prefix; /* * No bogus prefix lengths. */ if (plen > olsr_cnf->maxplen) { return; } tc = olsr_lookup_tc_entry(originator); if (!tc) { return; } /* * Grab the rt_path for the prefix. */ prefix.prefix = *dst; prefix.prefix_len = plen; node = avl_find(&tc->prefix_tree, &prefix); if (node) { rtp = rtp_prefix_tree2rtp(node); olsr_delete_rt_path(rtp); #ifdef DEBUG OLSR_PRINTF(1, "RIB: del prefix %s/%u from %s\n", olsr_ip_to_string(&dstbuf, dst), plen, olsr_ip_to_string(&origbuf, originator)); #endif /* overload the hna change bit for flagging a prefix change */ changes_hna = OLSR_TRUE; } }
OLSR_FOR_ALL_PREFIX_ENTRIES(tc, rtp) { olsr_delete_rt_path(rtp); } OLSR_FOR_ALL_PREFIX_ENTRIES_END(tc, rtp);