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 *
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;