summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBeniamino Galvani <bgalvani@redhat.com>2017-12-14 15:29:00 +0100
committerBeniamino Galvani <bgalvani@redhat.com>2017-12-14 15:29:00 +0100
commit08ed6ce9f634a5703940dc5c0d31458f4a4740f1 (patch)
treedbd4a88f4671662d7451438b24c2d544f6452ff2
parenta8bad7aec356e61ff73043c450b98b36fc561c6b (diff)
parentb934596bc899d397a6d1ad5783045b249f0df5a3 (diff)
downloadNetworkManager-bg/n-ipv4ll.tar.gz
Merge commit 'b934596bc899d397a6d1ad5783045b249f0df5a3' into bg/n-ipv4llbg/n-ipv4ll
-rw-r--r--lib/n-acd/src/n-acd.c36
1 files changed, 24 insertions, 12 deletions
diff --git a/lib/n-acd/src/n-acd.c b/lib/n-acd/src/n-acd.c
index e21e996287..47a3200a7a 100644
--- a/lib/n-acd/src/n-acd.c
+++ b/lib/n-acd/src/n-acd.c
@@ -1090,8 +1090,7 @@ _public_ int n_acd_start(NAcd *acd, NAcdConfig *config) {
config->transport != N_ACD_TRANSPORT_ETHERNET ||
config->n_mac != ETH_ALEN ||
!memcmp(config->mac, (uint8_t[ETH_ALEN]){ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }, ETH_ALEN) ||
- !config->ip.s_addr ||
- !config->timeout_msec)
+ !config->ip.s_addr)
return N_ACD_E_INVALID_ARGUMENT;
if (acd->state != N_ACD_STATE_INIT || !c_list_is_empty(&acd->events))
@@ -1106,21 +1105,34 @@ _public_ int n_acd_start(NAcd *acd, NAcdConfig *config) {
if (r < 0)
goto error;
- delay = 0;
- if (acd->last_conflict != TIME_INFINITY) {
- r = n_acd_now(&now);
+ if (acd->timeout_multiplier) {
+ delay = 0;
+ if (acd->last_conflict != TIME_INFINITY) {
+ r = n_acd_now(&now);
+ if (r < 0)
+ goto error;
+
+ if (now < acd->last_conflict + N_ACD_RFC_RATE_LIMIT_INTERVAL_USEC)
+ delay = acd->last_conflict + N_ACD_RFC_RATE_LIMIT_INTERVAL_USEC - now;
+ }
+
+ r = n_acd_schedule(acd, delay, acd->timeout_multiplier * N_ACD_RFC_PROBE_WAIT_USEC);
if (r < 0)
goto error;
- if (now < acd->last_conflict + N_ACD_RFC_RATE_LIMIT_INTERVAL_USEC)
- delay = acd->last_conflict + N_ACD_RFC_RATE_LIMIT_INTERVAL_USEC - now;
- }
+ acd->state = N_ACD_STATE_PROBING;
+ } else {
+ /*
+ * A zero timeout means we drop the probing alltogether, and consider
+ * it successfull immediately.
+ */
+ r = n_acd_push_event(acd, N_ACD_EVENT_READY, NULL, NULL, NULL);
+ if (r)
+ return r;
- r = n_acd_schedule(acd, delay, acd->timeout_multiplier * N_ACD_RFC_PROBE_WAIT_USEC);
- if (r < 0)
- goto error;
+ acd->state = N_ACD_STATE_CONFIGURING;
+ }
- acd->state = N_ACD_STATE_PROBING;
acd->defend = N_ACD_DEFEND_NEVER;
acd->n_iteration = 0;
acd->last_defend = 0;