Commit d40c2659 authored by Ondrej Zajicek's avatar Ondrej Zajicek
Browse files

Fixes issues with static protocol reconfiguration.

The old static route was not removed when the nexthop changed and the
new one was not viable (no neighbor).

Thanks to Pierluigi Rolando for the original patch.
parent 3216eb03
Loading
Loading
Loading
Loading
+15 −10
Original line number Diff line number Diff line
@@ -62,7 +62,7 @@ static_install(struct proto *p, struct static_route *r, struct iface *ifa)
  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);
@@ -125,7 +125,7 @@ static_remove(struct proto *p, struct static_route *r)
  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;
@@ -420,19 +420,24 @@ static_match(struct proto *p, struct static_route *r, struct static_config *n)

  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 *
+1 −1
Original line number Diff line number Diff line
@@ -31,7 +31,7 @@ struct static_route {
  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