diff options
author | Jason Reeder <jasonreeder@gmail.com> | 2017-03-31 15:40:18 -0500 |
---|---|---|
committer | Jason Reeder <jasonreeder@gmail.com> | 2017-03-31 15:40:18 -0500 |
commit | 0698ff4184c3652d97c04e15ffac90d0b3aa3529 (patch) | |
tree | 216395f95c4bca578058b0920706546db2b8108f /src | |
parent | 5e25a13a05b2a3844295ca4a2a7e0f12de203ccb (diff) |
libsystemd-network: sd-ipv4ll: acquire new address after claimed address conflict
If a conflict occurs on a claimed ipv4ll address, the device releases
the address and then does not attempt to acquire a new ipv4ll
address. According to RFC3927, releasing the address in this
situation is correct. However, this should be followed by an attempt
to configure a new ipv4ll address.
This commit restarts the ipv4ll address acquisition state machine
after releasing the conflicting address.
From RFC3927 Section 2.5 conflict defense method (b):
...
However, if this is not the first conflicting ARP packet the host has
seen, and the time recorded for the previous conflicting ARP packet is
recent, within DEFEND_INTERVAL seconds, then the host MUST immediately
cease using this address and configure a new IPv4 Link-Local address
as described above.
...
Signed-off-by: Jason Reeder <jasonreeder@gmail.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/network/networkd-ipv4ll.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/src/network/networkd-ipv4ll.c b/src/network/networkd-ipv4ll.c index 7ba05dbec3..e2578a298b 100644 --- a/src/network/networkd-ipv4ll.c +++ b/src/network/networkd-ipv4ll.c @@ -179,12 +179,22 @@ static void ipv4ll_handler(sd_ipv4ll *ll, int event, void *userdata) { switch(event) { case SD_IPV4LL_EVENT_STOP: + r = ipv4ll_address_lost(link); + if (r < 0) { + link_enter_failed(link); + return; + } + break; case SD_IPV4LL_EVENT_CONFLICT: r = ipv4ll_address_lost(link); if (r < 0) { link_enter_failed(link); return; } + + r = sd_ipv4ll_restart(ll); + if (r < 0) + log_link_warning(link, "Could not acquire IPv4 link-local address"); break; case SD_IPV4LL_EVENT_BIND: r = ipv4ll_address_claimed(ll, link); |