From: Roy Marples Date: Tue, 16 Apr 2019 19:02:36 +0000 (+0100) Subject: Merge branch 'master' into rbtree X-Git-Tag: v8.0.0~53 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=696dcaa488bc512fbc7a5176829981dc30e47ab4;p=thirdparty%2Fdhcpcd.git Merge branch 'master' into rbtree --- 696dcaa488bc512fbc7a5176829981dc30e47ab4 diff --cc src/if-options.c index 8f6c0372,75718aae..9ca06525 --- a/src/if-options.c +++ b/src/if-options.c @@@ -1104,16 -1122,16 +1123,16 @@@ parse_option(struct dhcpcd_ctx *ctx, co *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; @@@ -1123,8 -1141,8 +1142,10 @@@ 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) @@@ -2290,9 -2266,10 +2279,10 @@@ default_config(struct dhcpcd_ctx *ctx 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 diff --cc src/if.c index d58ecb8a,efc4314c..6a7b38be --- a/src/if.c +++ b/src/if.c @@@ -720,6 -732,98 +732,17 @@@ if_domtu(const struct interface *ifp, s 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) { diff --cc src/ipv4ll.c index e4662ca7,51cd4f5b..c2a99856 --- a/src/ipv4ll.c +++ b/src/ipv4ll.c @@@ -310,6 -305,8 +310,7 @@@ ipv4ll_conflicted(struct arp_state *ast 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"); } diff --cc src/route.c index 9edac1ef,e5546d0a..20e6f679 --- a/src/route.c +++ b/src/route.c @@@ -379,10 -282,17 +379,13 @@@ rt_recvrt(int cmd, const struct rt *rt 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;