*fp = ' ';
return -1;
}
-- if ((rt = rt_new0(ctx)) == NULL) {
-- *fp = ' ';
++ *fp = ' ';
++ if ((rt = rt_new0(ctx)) == NULL)
return -1;
-- }
sa_in_init(&rt->rt_dest, &addr);
sa_in_init(&rt->rt_netmask, &addr2);
sa_in_init(&rt->rt_gateway, &addr3);
- TAILQ_INSERT_TAIL(&ifo->routes, rt, rt_next);
- *fp = ' ';
- add_environ(&ifo->config, arg, 0);
+ if (rb_tree_insert_node(&ifo->routes, rt) != rt)
+ rt_free(rt);
- *fp = ' ';
++ else
++ add_environ(&ifo->config, arg, 0);
} else if (strncmp(arg, "routers=", strlen("routers=")) == 0) {
if (parse_addr(&addr, NULL, p) == -1)
return -1;
sa_in_init(&rt->rt_dest, &addr2);
sa_in_init(&rt->rt_netmask, &addr2);
sa_in_init(&rt->rt_gateway, &addr);
- TAILQ_INSERT_TAIL(&ifo->routes, rt, rt_next);
- add_environ(&ifo->config, arg, 0);
+ if (rb_tree_insert_node(&ifo->routes, rt) != rt)
+ rt_free(rt);
++ else
++ add_environ(&ifo->config, arg, 0);
} else if (strncmp(arg, "interface_mtu=",
strlen("interface_mtu=")) == 0 ||
strncmp(arg, "mtu=", strlen("mtu=")) == 0)
ifo->options |= DHCPCD_IF_UP | DHCPCD_LINK | DHCPCD_INITIAL_DELAY;
ifo->timeout = DEFAULT_TIMEOUT;
ifo->reboot = DEFAULT_REBOOT;
+ ifo->script = UNCONST(default_script);
ifo->metric = -1;
ifo->auth.options |= DHCPCD_AUTH_REQUIRE;
- TAILQ_INIT(&ifo->routes);
+ rb_tree_init(&ifo->routes, &rt_compare_list_ops);
#ifdef AUTH
TAILQ_INIT(&ifo->auth.tokens);
#endif
return ifr.ifr_mtu;
}
-/* Interface comparer for working out ordering. */
-static int
-if_cmp(const struct interface *si, const struct interface *ti)
-{
-#ifdef INET
- int r;
-#endif
-
- /* Check active first */
- if (si->active > ti->active)
- return -1;
- if (si->active < ti->active)
- return 1;
-
- /* Check carrier status next */
- if (si->carrier > ti->carrier)
- return -1;
- if (si->carrier < ti->carrier)
- return 1;
-#ifdef INET
- if (D_STATE_RUNNING(si) && !D_STATE_RUNNING(ti))
- return -1;
- if (!D_STATE_RUNNING(si) && D_STATE_RUNNING(ti))
- return 1;
-#endif
-#ifdef INET6
- if (RS_STATE_RUNNING(si) && !RS_STATE_RUNNING(ti))
- return -1;
- if (!RS_STATE_RUNNING(si) && RS_STATE_RUNNING(ti))
- return 1;
-#endif
-#ifdef DHCP6
- if (D6_STATE_RUNNING(si) && !D6_STATE_RUNNING(ti))
- return -1;
- if (!D6_STATE_RUNNING(si) && D6_STATE_RUNNING(ti))
- return 1;
-#endif
-
-#ifdef INET
- /* Special attention needed here due to states and IPv4LL. */
- if ((r = ipv4_ifcmp(si, ti)) != 0)
- return r;
-#endif
-
- /* Finally, metric */
- if (si->metric < ti->metric)
- return -1;
- if (si->metric > ti->metric)
- return 1;
- return 0;
-}
-
+ #ifdef ALIAS_ADDR
+ int
+ if_makealias(char *alias, size_t alias_len, const char *ifname, int lun)
+ {
+
+ if (lun == 0)
+ return strlcpy(alias, ifname, alias_len);
+ return snprintf(alias, alias_len, "%s:%u", ifname, lun);
+ }
+ #endif
+
-/* Sort the interfaces into a preferred order - best first, worst last. */
-void
-if_sortinterfaces(struct dhcpcd_ctx *ctx)
-{
- struct if_head sorted;
- struct interface *ifp, *ift;
-
- if (ctx->ifaces == NULL ||
- (ifp = TAILQ_FIRST(ctx->ifaces)) == NULL ||
- TAILQ_NEXT(ifp, next) == NULL)
- return;
-
- TAILQ_INIT(&sorted);
- TAILQ_REMOVE(ctx->ifaces, ifp, next);
- TAILQ_INSERT_HEAD(&sorted, ifp, next);
- while ((ifp = TAILQ_FIRST(ctx->ifaces))) {
- TAILQ_REMOVE(ctx->ifaces, ifp, next);
- TAILQ_FOREACH(ift, &sorted, next) {
- if (if_cmp(ifp, ift) == -1) {
- TAILQ_INSERT_BEFORE(ift, ifp, next);
- break;
- }
- }
- if (ift == NULL)
- TAILQ_INSERT_TAIL(&sorted, ifp, next);
- }
- TAILQ_CONCAT(ctx->ifaces, &sorted, next);
-}
-
struct interface *
if_findifpfromcmsg(struct dhcpcd_ctx *ctx, struct msghdr *msg, int *hoplimit)
{
ipv4_deladdr(state->addr, 1);
state->down = 1;
state->addr = NULL;
- if_initrt(ifp->ctx, AF_INET);
+ rt_build(ifp->ctx, AF_INET);
script_runreason(ifp, "IPV4LL");
}
switch(cmd) {
case RTM_DELETE:
+ f = rb_tree_find_node(&ctx->routes, rt);
if (f != NULL) {
- TAILQ_REMOVE(&ctx->kroutes, f, rt_next);
- rt_free(f);
- }
- if ((f = rt_find(&ctx->routes, rt)) != NULL) {
+ char buf[32];
+
- TAILQ_REMOVE(&ctx->routes, f, rt_next);
+ rb_tree_remove_node(&ctx->routes, f);
- rt_desc("deleted", f);
+ snprintf(buf, sizeof(buf), "pid %d deleted", pid);
+ rt_desc(buf, f);
rt_free(f);
}
break;