summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sbin/dhcpleased/engine.c35
1 files changed, 19 insertions, 16 deletions
diff --git a/sbin/dhcpleased/engine.c b/sbin/dhcpleased/engine.c
index 092aa45cf4c..58c66de2074 100644
--- a/sbin/dhcpleased/engine.c
+++ b/sbin/dhcpleased/engine.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: engine.c,v 1.2 2021/02/27 10:07:41 florian Exp $ */
+/* $OpenBSD: engine.c,v 1.3 2021/02/28 15:26:26 florian Exp $ */
/*
* Copyright (c) 2017, 2021 Florian Obser <florian@openbsd.org>
@@ -50,7 +50,13 @@
#include "dhcpleased.h"
#include "engine.h"
-#define MINIMUM(a, b) (((a) < (b)) ? (a) : (b))
+/*
+ * RFC 2131 4.1 p23 has "SHOULD be 4 seconds", we are a bit more aggressive,
+ * networks are faster these days.
+ */
+#define START_EXP_BACKOFF 1
+#define MAX_EXP_BACKOFF 64 /* RFC 2131 4.1 p23 */
+#define MINIMUM(a, b) (((a) < (b)) ? (a) : (b))
enum if_state {
IF_DOWN,
@@ -1087,32 +1093,29 @@ state_transition(struct dhcpleased_iface *iface, enum if_state new_state)
sizeof(iface->nameservers));
}
if (old_state == IF_INIT) {
- iface->timo.tv_sec *= 2;
- if (iface->timo.tv_sec > 64)
- iface->timo.tv_sec = 64;
+ if (iface->timo.tv_sec < MAX_EXP_BACKOFF)
+ iface->timo.tv_sec *= 2;
} else
- iface->timo.tv_sec = 1;
+ iface->timo.tv_sec = START_EXP_BACKOFF;
request_dhcp_discover(iface);
break;
case IF_REBOOTING:
if (old_state == IF_REBOOTING) {
- iface->timo.tv_sec *= 2;
- if (iface->timo.tv_sec > 64)
- iface->timo.tv_sec = 64;
+ if (iface->timo.tv_sec < MAX_EXP_BACKOFF)
+ iface->timo.tv_sec *= 2;
} else {
/* make sure we send broadcast */
iface->dhcp_server.s_addr = INADDR_ANY;
- iface->timo.tv_sec = 1;
+ iface->timo.tv_sec = START_EXP_BACKOFF;
}
request_dhcp_request(iface);
break;
case IF_REQUESTING:
if (old_state == IF_REQUESTING) {
- iface->timo.tv_sec *= 2;
- if (iface->timo.tv_sec > 64)
- iface->timo.tv_sec = 64;
+ if (iface->timo.tv_sec < MAX_EXP_BACKOFF)
+ iface->timo.tv_sec *= 2;
} else
- iface->timo.tv_sec = 1;
+ iface->timo.tv_sec = START_EXP_BACKOFF;
request_dhcp_request(iface);
break;
case IF_BOUND:
@@ -1176,13 +1179,13 @@ iface_timeout(int fd, short events, void *arg)
state_transition(iface, IF_INIT);
break;
case IF_REBOOTING:
- if (iface->timo.tv_sec >= 64)
+ if (iface->timo.tv_sec >= MAX_EXP_BACKOFF)
state_transition(iface, IF_INIT);
else
state_transition(iface, IF_REBOOTING);
break;
case IF_REQUESTING:
- if (iface->timo.tv_sec >= 64)
+ if (iface->timo.tv_sec >= MAX_EXP_BACKOFF)
state_transition(iface, IF_INIT);
else
state_transition(iface, IF_REQUESTING);