]> git.ipfire.org Git - thirdparty/dhcp.git/commitdiff
[45364] Replaced --enable-secs-byteorder with runtime check-secs-byte-order
authorThomas Markwalder <tmark@isc.org>
Wed, 29 Nov 2017 12:51:50 +0000 (07:51 -0500)
committerThomas Markwalder <tmark@isc.org>
Wed, 29 Nov 2017 12:51:50 +0000 (07:51 -0500)
configure.ac
   removed --enable-secs-byteorder support

includes/dhcpd.h
    added SV_CHECK_SECS_BYTE_ORDER

includes/failover.h
    added extern int check_secs_byte_order

server/dhcpd.c
    postconf_initialization() - added logic to
    set check_secs_byte_order

server/failover.c
    load_balance_mine() - replaced conditional comp
    directives with runtime test of check_secs_byte_order

Added release note and updated man page.

RELNOTES
configure.ac
includes/dhcpd.h
includes/failover.h
server/dhcpd.c
server/dhcpd.conf.5
server/failover.c
server/stables.c
server/tests/load_bal_unittest.c

index 33a466923801b47eb5623421705b8c84dd780f66..c0df4795a9b76ff44dcd85b9074a656551a9f95c 100644 (file)
--- a/RELNOTES
+++ b/RELNOTES
@@ -203,6 +203,16 @@ dhcp-users@lists.isc.org.
   even valid values to fail as invalid on some environments.
   [ISC-Bugs #46535]
 
+- Replaced compilation option, enable-secs-byteorder, with a run-time, server
+  configuration parameter, check-secs-byte-order.  When enabled, the
+  server will check for clients that do the byte ordering on the secs field
+  incorrectly.  This field should be in network byte order but some clients
+  get it wrong.  When this parameter is enabled the server will examine the
+  secs field and if it looks wrong (high byte non zero and low byte zero) swap
+  the bytes.  The default is disabled.  This parameter is only useful when
+  doing load balancing within failover.
+  [ISC-Bugs #45364]
+
                        Changes since 4.3.0 (bug fixes)
 
 - Tidy up several small tickets.
index 6162d261faf7a01e138914c9fd1c32f95dfb80c8..0cec4d223ccdc8f784f399e7ccc1a46492ba7e7b 100644 (file)
@@ -216,16 +216,6 @@ if test "$enable_use_sockets" = "yes"; then
                [Define to 1 to use the standard BSD socket API.])
 fi
 
-# Try to hnadle incorrect byte order for secs field
-# This is off by default
-AC_ARG_ENABLE(secs_byteorder,
-       AS_HELP_STRING([--enable-secs-byteorder],[Correct bad byteorders in the secs field (default is no).]))
-
-if test "$enable_secs_byteorder" = "yes" ; then
-       AC_DEFINE([SECS_BYTEORDER], [1],
-               [Define to correct bad byteorders in secs field.])
-fi
-
 # Include the PID in the log messages.  This is useful when there may
 # be multiple instances of a program.
 # This is off by default
index aac2c108b72b7f0c35dc9717f2a6141f4a8990b1..80593656c6e5a3e08e167338cd64c89836ca759e 100644 (file)
@@ -802,6 +802,9 @@ struct lease_state {
 #ifdef EUI_64
 #define SV_USE_EUI_64                  90
 #endif
+#if defined (FAILOVER_PROTOCOL)
+#define SV_CHECK_SECS_BYTE_ORDER       91
+#endif
 
 #if !defined (DEFAULT_PING_TIMEOUT)
 # define DEFAULT_PING_TIMEOUT 1
index f6655f46ec66da23175d34d9034556a369d13de3..135b969fb04fdd30bccf11733f30d25c7db08aad 100644 (file)
@@ -392,5 +392,7 @@ typedef struct _dhcp_failover_state {
        u_int32_t updxid;               /* XID of UPDREQ* message in action. */
 } dhcp_failover_state_t;
 
+extern int check_secs_byte_order; /* check byte order of secs field when true */
+
 #define DHCP_FAILOVER_VERSION          1
 #endif /* FAILOVER_PROTOCOL */
index 19c6a6879a9c33a101a3a0675d127ed8b7f03b6c..669447171d09a923b5df955f7c05312155ecf7da 100644 (file)
@@ -1378,6 +1378,15 @@ void postconf_initialization (int quiet)
                data_string_forget (&db, MDL);
         }
 
+#if defined (FAILOVER_PROTOCOL)
+       oc = lookup_option(&server_universe, options, SV_CHECK_SECS_BYTE_ORDER);
+       if ((oc != NULL) &&
+          evaluate_boolean_option_cache(NULL, NULL, NULL, NULL, options, NULL,
+                                        &global_scope, oc, MDL)) {
+               check_secs_byte_order = 1;
+       }
+#endif
+
 #if defined (BINARY_LEASES)
        if (local_family == AF_INET) {
                log_info("Source compiled to use binary-leases");
index 02f854a932566d9fa61aa7ce228fa30ef3eb6149..42b23894fb4edfb88675005b2935cc1b40864338 100644 (file)
@@ -2021,6 +2021,20 @@ addresses, as long as those addresses are not restricted by
 and \fIdeny\fR statements within their \fIpool\fR declarations.
 .RE
 .PP
+The \fIcheck-secs-byte-order\fR statement
+.RS 0.25i
+.PP
+.B check-secs-byte-order \fIflag\fB;\fR
+.PP
+When \fIcheck-secs-byte-order\fR is enabled, the server will check for DHPCv4
+clients that do the byte ordering on the secs field incorrectly. This field
+should be in network byte order but some clients get it wrong. When this
+parameter is enabled the server will examine the secs field and if it looks
+wrong (high byte non zero and low byte zero) swap the bytes.  The default
+is disabled. This parameter is only useful when doing load balancing within
+failover. (Formerly, this behavior had to be enabled during compilation
+configuration via --enable-secs-byteorder).
+.PP
 The \fIdb-time-format\fR statement
 .RS 0.25i
 .PP
index 25e1b72b5ed1705981fa7867d7c6172daa27f5a0..72f7b00ee660e66ec820b18725e7507f0a50967b 100644 (file)
@@ -50,6 +50,7 @@ static inline int secondary_not_hoarding(dhcp_failover_state_t *state,
                                         struct pool *p);
 static void scrub_lease(struct lease* lease, const char *file, int line);
 
+int check_secs_byte_order = 0; /* enables byte order check of secs field if 1 */
 
 /*!
  * \brief Performs a "pre-flight" sanity check of failover configuration
@@ -5964,17 +5965,16 @@ int load_balance_mine (struct packet *packet, dhcp_failover_state_t *state)
 
        ec = ntohs(packet->raw->secs);
 
-#if defined(SECS_BYTEORDER)
        /*
         * If desired check to see if the secs field may have been byte
         * swapped.  We assume it has if the high order byte isn't cleared
         * while the low order byte is cleared.  In this case we swap the
         * bytes and continue processing.
         */
-       if ((ec > 255) && ((ec & 0xff) == 0)) {
+       if ((check_secs_byte_order == 1) &&
+           ((ec > 255) && ((ec & 0xff) == 0))) {
                ec = (ec >> 8) | (ec << 8);
        }
-#endif
 
        if ((state->load_balance_max_secs == 0) ||
            (state->load_balance_max_secs < ec)) {
index b6df9befd7072c247b8284a4a0fb03b811ccd5a9..59df5e83d5b03b5a340c0ea493abd1fe6caf19d2 100644 (file)
@@ -279,6 +279,9 @@ static struct option server_options[] = {
        { "abandon-lease-time", "T",            &server_universe,  SV_ABANDON_LEASE_TIME, 1 },
 #ifdef EUI_64
        { "use-eui-64", "f",            &server_universe,  SV_USE_EUI_64, 1 },
+#endif
+#if defined (FAILOVER_PROTOCOL)
+       { "check-secs-byte-order", "f", &server_universe, SV_CHECK_SECS_BYTE_ORDER, 1 },
 #endif
        { NULL, NULL, NULL, 0, 0 }
 };
index a1be9761e4487e9ac00e2dbc278a2be99e293a45..b15268f4b94f1af0518504d46822d061de27c481 100644 (file)
@@ -134,12 +134,13 @@ ATF_TC_HEAD(load_balance_swap, tc)
 ATF_TC_BODY(load_balance_swap, tc)
 {
 #if defined(FAILOVER_PROTOCOL) 
-#if defined(SECS_BYTEORDER)
        struct packet packet;
        struct dhcp_packet raw;
        dhcp_failover_state_t pstate, sstate;
        u_int8_t hba[256];
 
+    check_secs_byte_order = 1;
+
        memset(&packet, 0, sizeof(struct packet));
        memset(&raw, 0, sizeof(struct dhcp_packet));
        packet.raw = &raw;
@@ -179,10 +180,6 @@ ATF_TC_BODY(load_balance_swap, tc)
        if (load_balance_mine(&packet, &sstate) != 1) {
                atf_tc_fail("ERROR: secondary not accepted %s:%d", MDL);
        }
-       
-#else
-       atf_tc_skip("SECS_BYTEORDER not defined");
-#endif
 #else
        atf_tc_skip("failover is disabled");
 #endif