state->addr = state->lease.addr;
state->net = state->lease.net;
state->added |= STATE_ADDED | STATE_FAKE;
+ ipv4_sortinterfaces(ifp->ctx);
ipv4_buildroutes(ifp->ctx);
} else
syslog(LOG_ERR, "%s: %m", __func__);
return -1;
if (!sis->new && tis->new)
return 1;
+ /* Always prefer proper leases */
+ if (!(sis->added & STATE_FAKE) && (sis->added & STATE_FAKE))
+ return -1;
+ if ((sis->added & STATE_FAKE) && !(sis->added & STATE_FAKE))
+ return 1;
/* If we are either, they neither have a lease, or they both have.
* We need to check for IPv4LL and make it non-preferred. */
if (sis->new && tis->new) {
if ((or = find_route(ctx->ipv4_routes, rt, NULL))) {
if (state->added & STATE_FAKE)
continue;
- ostate = D_CSTATE(or->iface);
- if (ostate->added & STATE_FAKE)
- goto remroute;
- if (or->iface != ifp ||
+ if (or->flags & STATE_FAKE ||
+ or->iface != ifp ||
or->src.s_addr != state->addr.s_addr ||
rt->gate.s_addr != or->gate.s_addr ||
rt->metric != or->metric)
if (c_route(or, rt) != 0)
continue;
}
-remroute:
TAILQ_REMOVE(ctx->ipv4_routes, or, next);
free(or);
} else {
n_route(rt) != 0)
continue;
}
+ rt->flags = STATE_ADDED;
+ if (state->added & STATE_FAKE)
+ rt->flags |= STATE_FAKE;
TAILQ_REMOVE(dnr, rt, next);
TAILQ_INSERT_TAIL(nrs, rt, next);
}