mirror of
https://gitlab.labs.nic.cz/labs/bird.git
synced 2024-05-11 16:54:54 +00:00
TMP
This commit is contained in:
@@ -948,43 +948,47 @@ channel_notify_accepted(void *_channel)
|
||||
rte *
|
||||
rt_export_merged(struct channel *c, const struct rt_export_feed *feed, linpool *pool, int silent)
|
||||
{
|
||||
_Thread_local static rte rloc;
|
||||
|
||||
int refeeding = !silent && channel_net_is_refeeding(c, n);
|
||||
|
||||
if (refeeding)
|
||||
channel_net_mark_refed(c, n);
|
||||
_Bool feeding = !silent && rt_net_is_feeding(&c->out_req, feed->ni->addr);
|
||||
|
||||
// struct proto *p = c->proto;
|
||||
struct nexthop_adata *nhs = NULL;
|
||||
const rte *best0 = feed[0];
|
||||
rte *best0 = feed->block[0];
|
||||
rte *best = NULL;
|
||||
|
||||
/* First route is obsolete */
|
||||
if (best0->flags & REF_OBSOLETE)
|
||||
return NULL;
|
||||
|
||||
/* First route is invalid */
|
||||
if (!rte_is_valid(best0))
|
||||
return NULL;
|
||||
|
||||
/* Already rejected, no need to re-run the filter */
|
||||
if (!refeeding && bmap_test(&c->export_reject_map, best0->id))
|
||||
if (!feeding && bmap_test(&c->export_reject_map, best0->id))
|
||||
return NULL;
|
||||
|
||||
rloc = *best0;
|
||||
best = export_filter(c, &rloc, silent);
|
||||
best = export_filter(c, best0, silent);
|
||||
|
||||
/* Best route doesn't pass the filter */
|
||||
if (!best)
|
||||
/* Best route doesn't pass the filter */
|
||||
return NULL;
|
||||
|
||||
/* Unreachable routes can't be merged */
|
||||
if (!rte_is_reachable(best))
|
||||
/* Unreachable routes can't be merged */
|
||||
return best;
|
||||
|
||||
for (uint i = 1; i < count; i++)
|
||||
for (uint i = 1; i < feed->count_routes; i++)
|
||||
{
|
||||
if (!rte_mergable(best0, feed[i]))
|
||||
rte *r = &feed->block[i];
|
||||
|
||||
/* Obsolete routes can't be merged */
|
||||
if (r->flags & REF_OBSOLETE)
|
||||
break;
|
||||
|
||||
if (!rte_mergable(best0, r))
|
||||
continue;
|
||||
|
||||
rte tmp0 = *feed[i];
|
||||
rte *tmp = export_filter(c, &tmp0, !refeeding);
|
||||
rte *tmp = export_filter(c, r, !refeeding);
|
||||
|
||||
if (!tmp || !rte_is_reachable(tmp))
|
||||
continue;
|
||||
|
Reference in New Issue
Block a user