Do not remove old static route if it is in new config with different gw.

This commit is contained in:
Ondrej Zajicek 2010-05-16 11:03:59 +02:00
parent 7ff5803bec
commit c1cefd7bea

View file

@ -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);