]> git.ipfire.org Git - thirdparty/dhcpcd.git/commitdiff
Sorting interfaces is an IPv4 specific task, so move it into ipv4.c
authorRoy Marples <roy@marples.name>
Mon, 28 Apr 2014 12:47:33 +0000 (12:47 +0000)
committerRoy Marples <roy@marples.name>
Mon, 28 Apr 2014 12:47:33 +0000 (12:47 +0000)
Makefile
dhcpcd.c
if-pref.c [deleted file]
if-pref.h [deleted file]
ipv4.c
ipv4.h
script.c

index f9dadfe25e7110f1bb9542036ff53e6e970b8ab7..082dd3146fb213337e7654b0a1e4ddf2b17ac48c 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -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
index 4da9ab44a0941c1b1c021d0d4f97004daa08b885..2927dfc08f1a0ea919f7bef13009ac97222aa501 100644 (file)
--- a/dhcpcd.c
+++ b/dhcpcd.c
@@ -62,7 +62,6 @@ const char dhcpcd_copyright[] = "Copyright (c) 2006-2014 Roy Marples";
 #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 @@ reconf_reboot(struct dhcpcd_ctx *ctx, int action, int argc, char **argv, int oi)
        }
        free(ifs);
 
-       sort_interfaces(ctx);
+       ipv4_sortinterfaces(ctx);
 }
 
 static void
@@ -1519,7 +1518,7 @@ main(int argc, char **argv)
        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);
        }
diff --git a/if-pref.c b/if-pref.c
deleted file mode 100644 (file)
index ce0752f..0000000
--- a/if-pref.c
+++ /dev/null
@@ -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);
-}
diff --git a/if-pref.h b/if-pref.h
deleted file mode 100644 (file)
index 43c84bc..0000000
--- a/if-pref.h
+++ /dev/null
@@ -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
diff --git a/ipv4.c b/ipv4.c
index 7e8f5eaabc788ed818cec18f8f6400ecc53481aa..23074e89c3afe5164c192dd566c9e4d347c7b3ee 100644 (file)
--- a/ipv4.c
+++ b/ipv4.c
@@ -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 @@ ipv4_init(struct dhcpcd_ctx *ctx)
        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 @@ ipv4_applyaddr(void *arg)
 
        /* 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;
diff --git a/ipv4.h b/ipv4.h
index 12f47c681ccfb3fff8c2dd4bdee034aead31c541..4c831f3f904716827880861ccfb3c2b1cbe1bc29 100644 (file)
--- a/ipv4.h
+++ b/ipv4.h
@@ -60,6 +60,7 @@ struct ipv4_state {
 
 #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_free(struct interface *);
 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) {}
index 8ac4dd984c89b9bbef7b8fdc3f5852bc139a2b16..4fefd63f635a0878b752a6004c00a62c9587e5c3 100644 (file)
--- a/script.c
+++ b/script.c
@@ -48,7 +48,6 @@
 #include "dhcp6.h"
 #include "if.h"
 #include "if-options.h"
-#include "if-pref.h"
 #include "ipv6nd.h"
 #include "script.h"