changeset 2447:e21f40456cd0 draft

Sorting interfaces is an IPv4 specific task, so move it into ipv4.c
author Roy Marples <roy@marples.name>
date Mon, 28 Apr 2014 12:47:33 +0000
parents 6cde5389810b
children b366513667c5
files Makefile dhcpcd.c if-pref.c if-pref.h ipv4.c ipv4.h script.c
diffstat 7 files changed, 79 insertions(+), 146 deletions(-) [+]
line wrap: on
line diff
--- a/Makefile	Mon Apr 28 12:02:12 2014 +0000
+++ b/Makefile	Mon Apr 28 12:47:33 2014 +0000
@@ -2,7 +2,7 @@
 
 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
--- a/dhcpcd.c	Mon Apr 28 12:02:12 2014 +0000
+++ b/dhcpcd.c	Mon Apr 28 12:47:33 2014 +0000
@@ -62,7 +62,6 @@
 #include "eloop.h"
 #include "if.h"
 #include "if-options.h"
-#include "if-pref.h"
 #include "ipv4.h"
 #include "ipv6.h"
 #include "ipv6nd.h"
@@ -821,7 +820,7 @@
 	}
 	free(ifs);
 
-	sort_interfaces(ctx);
+	ipv4_sortinterfaces(ctx);
 }
 
 static void
@@ -1519,7 +1518,7 @@
 	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);
 	}
--- a/if-pref.c	Mon Apr 28 12:02:12 2014 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,105 +0,0 @@
-/*
- * 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);
-}
--- a/if-pref.h	Mon Apr 28 12:02:12 2014 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,34 +0,0 @@
-/*
- * 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
--- a/ipv4.c	Mon Apr 28 12:02:12 2014 +0000
+++ b/ipv4.c	Mon Apr 28 12:47:33 2014 +0000
@@ -51,7 +51,6 @@
 #include "dhcp.h"
 #include "if.h"
 #include "if-options.h"
-#include "if-pref.h"
 #include "ipv4.h"
 #include "script.h"
 
@@ -180,6 +179,79 @@
 	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)
 {
@@ -633,7 +705,7 @@
 
 	/* 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;
--- a/ipv4.h	Mon Apr 28 12:02:12 2014 +0000
+++ b/ipv4.h	Mon Apr 28 12:47:33 2014 +0000
@@ -60,6 +60,7 @@
 
 #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);
@@ -80,6 +81,7 @@
 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) {}
--- a/script.c	Mon Apr 28 12:02:12 2014 +0000
+++ b/script.c	Mon Apr 28 12:47:33 2014 +0000
@@ -48,7 +48,6 @@
 #include "dhcp6.h"
 #include "if.h"
 #include "if-options.h"
-#include "if-pref.h"
 #include "ipv6nd.h"
 #include "script.h"