1
0
mirror of https://gitlab.labs.nic.cz/labs/bird.git synced 2024-05-11 16:54:54 +00:00
This commit is contained in:
Maria Matejka
2024-05-07 00:04:01 +02:00
parent 78d95885ee
commit e10b15d395

View File

@@ -948,43 +948,47 @@ channel_notify_accepted(void *_channel)
rte * rte *
rt_export_merged(struct channel *c, const struct rt_export_feed *feed, linpool *pool, int silent) rt_export_merged(struct channel *c, const struct rt_export_feed *feed, linpool *pool, int silent)
{ {
_Thread_local static rte rloc; _Bool feeding = !silent && rt_net_is_feeding(&c->out_req, feed->ni->addr);
int refeeding = !silent && channel_net_is_refeeding(c, n);
if (refeeding)
channel_net_mark_refed(c, n);
// struct proto *p = c->proto; // struct proto *p = c->proto;
struct nexthop_adata *nhs = NULL; struct nexthop_adata *nhs = NULL;
const rte *best0 = feed[0]; rte *best0 = feed->block[0];
rte *best = NULL; rte *best = NULL;
/* First route is obsolete */
if (best0->flags & REF_OBSOLETE)
return NULL;
/* First route is invalid */
if (!rte_is_valid(best0)) if (!rte_is_valid(best0))
return NULL; return NULL;
/* Already rejected, no need to re-run the filter */ /* 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; return NULL;
rloc = *best0; best = export_filter(c, best0, silent);
best = export_filter(c, &rloc, silent);
/* Best route doesn't pass the filter */
if (!best) if (!best)
/* Best route doesn't pass the filter */
return NULL; return NULL;
/* Unreachable routes can't be merged */
if (!rte_is_reachable(best)) if (!rte_is_reachable(best))
/* Unreachable routes can't be merged */
return best; 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; continue;
rte tmp0 = *feed[i]; rte *tmp = export_filter(c, r, !refeeding);
rte *tmp = export_filter(c, &tmp0, !refeeding);
if (!tmp || !rte_is_reachable(tmp)) if (!tmp || !rte_is_reachable(tmp))
continue; continue;