KRT: Remove KRF_INSTALLED flag
The same information is stored in export_map of kernel protocol.
This commit is contained in:
parent
d3aa4f2aed
commit
c132acae36
2 changed files with 23 additions and 27 deletions
|
@ -453,7 +453,6 @@ typedef struct rta {
|
||||||
#define RTD_MAX 5
|
#define RTD_MAX 5
|
||||||
|
|
||||||
/* Flags for net->n.flags, used by kernel syncer */
|
/* Flags for net->n.flags, used by kernel syncer */
|
||||||
#define KRF_INSTALLED 0x80 /* This route should be installed in the kernel */
|
|
||||||
#define KRF_SYNC_ERROR 0x40 /* Error during kernel table synchronization */
|
#define KRF_SYNC_ERROR 0x40 /* Error during kernel table synchronization */
|
||||||
|
|
||||||
#define RTAF_CACHED 1 /* This is a cached rta */
|
#define RTAF_CACHED 1 /* This is a cached rta */
|
||||||
|
|
|
@ -539,6 +539,12 @@ krt_dump_attrs(rte *e)
|
||||||
* Routes
|
* Routes
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
krt_is_installed(struct krt_proto *p, rte *e)
|
||||||
|
{
|
||||||
|
return bmap_test(&p->p.main_channel->export_map, e->id);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
krt_flush_routes(struct krt_proto *p)
|
krt_flush_routes(struct krt_proto *p)
|
||||||
{
|
{
|
||||||
|
@ -548,11 +554,10 @@ krt_flush_routes(struct krt_proto *p)
|
||||||
FIB_WALK(&t->fib, net, n)
|
FIB_WALK(&t->fib, net, n)
|
||||||
{
|
{
|
||||||
rte *e = n->routes;
|
rte *e = n->routes;
|
||||||
if (rte_is_valid(e) && (n->n.flags & KRF_INSTALLED))
|
if (rte_is_valid(e) && krt_is_installed(p, e))
|
||||||
{
|
{
|
||||||
/* FIXME: this does not work if gw is changed in export filter */
|
/* FIXME: this does not work if gw is changed in export filter */
|
||||||
krt_replace_rte(p, e->net, NULL, e);
|
krt_replace_rte(p, e->net, NULL, e);
|
||||||
n->n.flags &= ~KRF_INSTALLED;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
FIB_WALK_END;
|
FIB_WALK_END;
|
||||||
|
@ -579,7 +584,7 @@ krt_export_net(struct krt_proto *p, net *net, rte **rt_free)
|
||||||
|
|
||||||
rte_make_tmp_attrs(&rt, krt_filter_lp, NULL);
|
rte_make_tmp_attrs(&rt, krt_filter_lp, NULL);
|
||||||
|
|
||||||
/* We could run krt_preexport() here, but it is already handled by KRF_INSTALLED */
|
/* We could run krt_preexport() here, but it is already handled by krt_is_installed() */
|
||||||
|
|
||||||
if (filter == FILTER_ACCEPT)
|
if (filter == FILTER_ACCEPT)
|
||||||
goto accept;
|
goto accept;
|
||||||
|
@ -658,12 +663,12 @@ krt_got_route(struct krt_proto *p, rte *e)
|
||||||
|
|
||||||
if (!p->ready)
|
if (!p->ready)
|
||||||
{
|
{
|
||||||
/* We wait for the initial feed to have correct KRF_INSTALLED flag */
|
/* We wait for the initial feed to have correct installed state */
|
||||||
verdict = KRF_IGNORE;
|
verdict = KRF_IGNORE;
|
||||||
goto sentenced;
|
goto sentenced;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (net->n.flags & KRF_INSTALLED)
|
if (krt_is_installed(p, e))
|
||||||
{
|
{
|
||||||
rte *new, *rt_free;
|
rte *new, *rt_free;
|
||||||
|
|
||||||
|
@ -930,22 +935,7 @@ krt_preexport(struct proto *P, rte **new, struct linpool *pool UNUSED)
|
||||||
rte *e = *new;
|
rte *e = *new;
|
||||||
|
|
||||||
if (e->attrs->src->proto == P)
|
if (e->attrs->src->proto == P)
|
||||||
{
|
|
||||||
#ifdef CONFIG_SINGLE_ROUTE
|
|
||||||
/*
|
|
||||||
* Implicit withdraw - when the imported kernel route becomes the best one,
|
|
||||||
* we know that the previous one exported to the kernel was already removed,
|
|
||||||
* but if we processed the update as usual, we would send withdraw to the
|
|
||||||
* kernel, which would remove the new imported route instead.
|
|
||||||
*
|
|
||||||
* We will remove KRT_INSTALLED flag, which stops such withdraw to be
|
|
||||||
* processed in krt_rt_notify() and krt_replace_rte().
|
|
||||||
*/
|
|
||||||
if (e == e->net->routes)
|
|
||||||
e->net->n.flags &= ~KRF_INSTALLED;
|
|
||||||
#endif
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
|
||||||
|
|
||||||
if (!krt_capable(e))
|
if (!krt_capable(e))
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -961,12 +951,19 @@ krt_rt_notify(struct proto *P, struct channel *ch UNUSED, net *net,
|
||||||
|
|
||||||
if (config->shutdown)
|
if (config->shutdown)
|
||||||
return;
|
return;
|
||||||
if (!(net->n.flags & KRF_INSTALLED))
|
|
||||||
old = NULL;
|
#ifdef CONFIG_SINGLE_ROUTE
|
||||||
if (new)
|
/*
|
||||||
net->n.flags |= KRF_INSTALLED;
|
* Implicit withdraw - when the imported kernel route becomes the best one,
|
||||||
else
|
* we know that the previous one exported to the kernel was already removed,
|
||||||
net->n.flags &= ~KRF_INSTALLED;
|
* but if we processed the update as usual, we would send withdraw to the
|
||||||
|
* kernel, which would remove the new imported route instead.
|
||||||
|
*/
|
||||||
|
rte *best = net->routes;
|
||||||
|
if (!new && best && (best->attrs->src->proto == P))
|
||||||
|
return;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (p->initialized) /* Before first scan we don't touch the routes */
|
if (p->initialized) /* Before first scan we don't touch the routes */
|
||||||
krt_replace_rte(p, net, new, old);
|
krt_replace_rte(p, net, new, old);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue