summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJason Reeder <jasonreeder@gmail.com>2017-03-31 15:40:18 -0500
committerJason Reeder <jasonreeder@gmail.com>2017-03-31 15:40:18 -0500
commit0698ff4184c3652d97c04e15ffac90d0b3aa3529 (patch)
tree216395f95c4bca578058b0920706546db2b8108f /src
parent5e25a13a05b2a3844295ca4a2a7e0f12de203ccb (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.c10
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);