Do not remove old static route if it is in new config with different gw.
This commit is contained in:
parent
7ff5803bec
commit
c1cefd7bea
1 changed files with 21 additions and 11 deletions
|
@ -218,15 +218,18 @@ static_init(struct proto_config *c)
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static inline int
|
||||||
static_same_route(struct static_route *x, struct static_route *y)
|
static_same_net(struct static_route *x, struct static_route *y)
|
||||||
{
|
{
|
||||||
return ipa_equal(x->net, y->net)
|
return ipa_equal(x->net, y->net) && (x->masklen == y->masklen);
|
||||||
&& x->masklen == y->masklen
|
}
|
||||||
&& x->dest == y->dest
|
|
||||||
|
static inline int
|
||||||
|
static_same_dest(struct static_route *x, struct static_route *y)
|
||||||
|
{
|
||||||
|
return (x->dest == y->dest)
|
||||||
&& (x->dest != RTD_ROUTER || ipa_equal(x->via, y->via))
|
&& (x->dest != RTD_ROUTER || ipa_equal(x->via, y->via))
|
||||||
&& (x->dest != RTD_DEVICE || !strcmp(x->if_name, y->if_name))
|
&& (x->dest != RTD_DEVICE || !strcmp(x->if_name, y->if_name));
|
||||||
;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -234,18 +237,25 @@ static_match(struct proto *p, struct static_route *r, struct static_config *n)
|
||||||
{
|
{
|
||||||
struct static_route *t;
|
struct static_route *t;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* For given old route *r we find whether a route to the same
|
||||||
|
* network is also in the new route list. In that case, we keep the
|
||||||
|
* route and possibly update the route later if destination changed.
|
||||||
|
* Otherwise, we remove the route.
|
||||||
|
*/
|
||||||
|
|
||||||
if (r->neigh)
|
if (r->neigh)
|
||||||
r->neigh->data = NULL;
|
r->neigh->data = NULL;
|
||||||
WALK_LIST(t, n->iface_routes)
|
WALK_LIST(t, n->iface_routes)
|
||||||
if (static_same_route(r, t))
|
if (static_same_net(r, t))
|
||||||
{
|
{
|
||||||
t->installed = 1;
|
t->installed = static_same_dest(r, t);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
WALK_LIST(t, n->other_routes)
|
WALK_LIST(t, n->other_routes)
|
||||||
if (static_same_route(r, t))
|
if (static_same_net(r, t))
|
||||||
{
|
{
|
||||||
t->installed = 1;
|
t->installed = static_same_dest(r, t);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
static_remove(p, r);
|
static_remove(p, r);
|
||||||
|
|
Loading…
Reference in a new issue