PROG= dhcpcd
SRCS= common.c control.c dhcpcd.c duid.c eloop.c
-SRCS+= if.c if-options.c if-pref.c script.c
+SRCS+= if.c if-options.c script.c
SRCS+= dhcp-common.c
CFLAGS?= -O2
#include "eloop.h"
#include "if.h"
#include "if-options.h"
-#include "if-pref.h"
#include "ipv4.h"
#include "ipv6.h"
#include "ipv6nd.h"
}
free(ifs);
- sort_interfaces(ctx);
+ ipv4_sortinterfaces(ctx);
}
static void
free_options(ifo);
ifo = NULL;
- sort_interfaces(&ctx);
+ ipv4_sortinterfaces(&ctx);
TAILQ_FOREACH(ifp, ctx.ifaces, next) {
eloop_timeout_add_sec(ctx.eloop, 0, dhcpcd_startinterface, ifp);
}
+++ /dev/null
-/*
- * dhcpcd - DHCP client daemon
- * Copyright (c) 2006-2014 Roy Marples <roy@marples.name>
- * All rights reserved
-
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include <sys/types.h>
-
-#include "config.h"
-#include "dhcp.h"
-#include "dhcpcd.h"
-#include "if-pref.h"
-
-/* Interface comparer for working out ordering. */
-static int
-ifcmp(const struct interface *si, const struct interface *ti)
-{
- int sill, till;
- const struct dhcp_state *sis, *tis;
-
- sis = D_CSTATE(si);
- tis = D_CSTATE(ti);
- if (sis && !tis)
- return -1;
- if (!sis && tis)
- return 1;
- if (!sis && !tis)
- return 0;
- /* If one has a lease and the other not, it takes precedence. */
- if (sis->new && !tis->new)
- return -1;
- if (!sis->new && tis->new)
- 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) {
- sill = (sis->new->cookie == htonl(MAGIC_COOKIE));
- till = (tis->new->cookie == htonl(MAGIC_COOKIE));
- if (!sill && till)
- return 1;
- if (sill && !till)
- return -1;
- }
- /* Then carrier status. */
- if (si->carrier > ti->carrier)
- return -1;
- if (si->carrier < ti->carrier)
- return 1;
- /* Finally, metric */
- if (si->metric < ti->metric)
- return -1;
- if (si->metric > ti->metric)
- return 1;
- return 0;
-}
-
-/* Sort the interfaces into a preferred order - best first, worst last. */
-void
-sort_interfaces(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 (ifcmp(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);
-}
+++ /dev/null
-/*
- * dhcpcd - DHCP client daemon
- * Copyright (c) 2006-2008 Roy Marples <roy@marples.name>
- * All rights reserved
-
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#ifndef IF_PREF_H
-#define IF_PREF_H
-
-#include "dhcpcd.h"
-
-void sort_interfaces(struct dhcpcd_ctx *);
-#endif
#include "dhcp.h"
#include "if.h"
#include "if-options.h"
-#include "if-pref.h"
#include "ipv4.h"
#include "script.h"
return 0;
}
+
+/* Interface comparer for working out ordering. */
+static int
+ipv4_ifcmp(const struct interface *si, const struct interface *ti)
+{
+ int sill, till;
+ const struct dhcp_state *sis, *tis;
+
+ sis = D_CSTATE(si);
+ tis = D_CSTATE(ti);
+ if (sis && !tis)
+ return -1;
+ if (!sis && tis)
+ return 1;
+ if (!sis && !tis)
+ return 0;
+ /* If one has a lease and the other not, it takes precedence. */
+ if (sis->new && !tis->new)
+ return -1;
+ if (!sis->new && tis->new)
+ 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) {
+ sill = (sis->new->cookie == htonl(MAGIC_COOKIE));
+ till = (tis->new->cookie == htonl(MAGIC_COOKIE));
+ if (!sill && till)
+ return 1;
+ if (sill && !till)
+ return -1;
+ }
+ /* Then carrier status. */
+ if (si->carrier > ti->carrier)
+ return -1;
+ if (si->carrier < ti->carrier)
+ return 1;
+ /* Finally, metric */
+ if (si->metric < ti->metric)
+ return -1;
+ if (si->metric > ti->metric)
+ return 1;
+ return 0;
+}
+
+/* Sort the interfaces into a preferred order - best first, worst last. */
+void
+ipv4_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 (ipv4_ifcmp(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);
+}
+
static struct rt *
find_route(struct rt_head *rts, const struct rt *r, const struct rt *srt)
{
/* As we are now adjusting an interface, we need to ensure
* we have them in the right order for routing and configuration. */
- sort_interfaces(ifp->ctx);
+ ipv4_sortinterfaces(ifp->ctx);
if (state == NULL)
return;
#ifdef INET
int ipv4_init(struct dhcpcd_ctx *);
+void ipv4_sortinterfaces(struct dhcpcd_ctx *);
uint8_t inet_ntocidr(struct in_addr);
int inet_cidrtoaddr(int, struct in_addr *);
uint32_t ipv4_getnetmask(uint32_t);
void ipv4_ctxfree(struct dhcpcd_ctx *);
#else
#define ipv4_init(a) (-1)
+#define ipv4_sortinterfaces(a) {}
#define ipv4_applyaddr(a) {}
#define ipv4_freeroutes(a) {}
#define ipv4_free(a) {}
#include "dhcp6.h"
#include "if.h"
#include "if-options.h"
-#include "if-pref.h"
#include "ipv6nd.h"
#include "script.h"