From 6af9144f5ff65cb9f6ae9999e7e0a9edc4841b2b Mon Sep 17 00:00:00 2001 From: Tom Gundersen Date: Fri, 21 Aug 2015 01:02:59 +0200 Subject: sd-ipv4ll: simplify conflict handling Use stop() and start() to drop some pulicate code. --- src/libsystemd-network/sd-ipv4ll.c | 35 ++++++++++++++++------------------- 1 file changed, 16 insertions(+), 19 deletions(-) (limited to 'src/libsystemd-network/sd-ipv4ll.c') diff --git a/src/libsystemd-network/sd-ipv4ll.c b/src/libsystemd-network/sd-ipv4ll.c index 05ce5c073a..03a9b3f4f4 100644 --- a/src/libsystemd-network/sd-ipv4ll.c +++ b/src/libsystemd-network/sd-ipv4ll.c @@ -276,10 +276,19 @@ static int ipv4ll_on_timeout(sd_event_source *s, uint64_t usec, void *userdata) case IPV4LL_STATE_INIT: log_ipv4ll(ll, "PROBE"); + ipv4ll_set_state(ll, IPV4LL_STATE_WAITING_PROBE, true); - r = ipv4ll_set_next_wakeup(ll, 0, PROBE_WAIT); - if (r < 0) - goto out; + + if (ll->conflict >= MAX_CONFLICTS) { + log_ipv4ll(ll, "MAX_CONFLICTS"); + r = ipv4ll_set_next_wakeup(ll, RATE_LIMIT_INTERVAL, PROBE_WAIT); + if (r < 0) + return r; + } else { + r = ipv4ll_set_next_wakeup(ll, 0, PROBE_WAIT); + if (r < 0) + return r; + } break; case IPV4LL_STATE_WAITING_PROBE: @@ -354,33 +363,21 @@ static int ipv4ll_on_conflict(sd_ipv4ll *ll) { log_ipv4ll(ll, "CONFLICT"); + ll->conflict++; + ipv4ll_client_notify(ll, IPV4LL_EVENT_CONFLICT); - ll->claimed_address = 0; + sd_ipv4ll_stop(ll); /* Pick a new address */ r = ipv4ll_pick_address(ll, &ll->address); if (r < 0) return r; - ll->fd = safe_close(ll->fd); - - r = arp_network_bind_raw_socket(ll->index, ll->address, &ll->mac_addr); + r = sd_ipv4ll_start(ll); if (r < 0) return r; - ll->fd = r; - - ll->conflict++; - ll->defend_window = 0; - ipv4ll_set_state(ll, IPV4LL_STATE_WAITING_PROBE, true); - - if (ll->conflict >= MAX_CONFLICTS) { - log_ipv4ll(ll, "MAX_CONFLICTS"); - ipv4ll_set_next_wakeup(ll, RATE_LIMIT_INTERVAL, PROBE_WAIT); - } else - ipv4ll_set_next_wakeup(ll, 0, PROBE_WAIT); - return 0; } -- cgit v1.2.3-54-g00ecf