rta a, *aa;
rte *e;
- if (r->installed)
+ if (r->installed > 0)
return;
DBG("Installing static route %I/%d, rtd=%d\n", r->net, r->masklen, r->dest);
if (!r->installed)
return;
- DBG("Removing static route %I/%d\n", r->net, r->masklen);
+ DBG("Removing static route %I/%d via %I\n", r->net, r->masklen, r->via);
n = net_find(p->table, r->net, r->masklen);
rte_update(p, n, NULL);
r->installed = 0;
if (r->neigh)
r->neigh->data = NULL;
+
WALK_LIST(t, n->iface_routes)
if (static_same_net(r, t))
- {
- t->installed = r->installed && static_same_dest(r, t);
- return;
- }
+ goto found;
+
WALK_LIST(t, n->other_routes)
if (static_same_net(r, t))
- {
- t->installed = r->installed && static_same_dest(r, t);
- return;
- }
+ goto found;
+
static_remove(p, r);
+ return;
+
+ found:
+ /* If destination is different, force reinstall */
+ if ((r->installed > 0) && !static_same_dest(r, t))
+ t->installed = -1;
+ else
+ t->installed = r->installed;
}
static inline rtable *
struct neighbor *neigh;
byte *if_name; /* Name for RTD_DEVICE routes */
struct static_route *mp_next; /* Nexthops for RTD_MULTIPATH routes */
- int installed; /* Installed in master table */
+ int installed; /* Installed in rt table, -1 for reinstall */
};
/* Dummy nodes (parts of multipath route) abuses masklen field for weight