]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
ipv4ll: do not reset seed generation counter on restart
authorYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 29 Mar 2019 22:33:03 +0000 (07:33 +0900)
committerLennart Poettering <lennart@poettering.net>
Tue, 2 Apr 2019 08:27:30 +0000 (10:27 +0200)
Fixes #12145.

src/libsystemd-network/sd-ipv4ll.c

index e451dff744dc76f61d071a6f0c78b586ac3bf7e9..a59a95232656bc8d1c85a14690b593264a95c161 100644 (file)
@@ -218,28 +218,21 @@ static int ipv4ll_pick_address(sd_ipv4ll *ll) {
         return sd_ipv4ll_set_address(ll, &(struct in_addr) { addr });
 }
 
-int sd_ipv4ll_restart(sd_ipv4ll *ll) {
-        ll->address = 0;
-
-        return sd_ipv4ll_start(ll);
-}
-
 #define MAC_HASH_KEY SD_ID128_MAKE(df,04,22,98,3f,ad,14,52,f9,87,2e,d1,9c,70,e2,f2)
 
-int sd_ipv4ll_start(sd_ipv4ll *ll) {
+static int ipv4ll_start_internal(sd_ipv4ll *ll, bool reset_generation) {
         int r;
         bool picked_address = false;
 
         assert_return(ll, -EINVAL);
         assert_return(!ether_addr_is_null(&ll->mac), -EINVAL);
-        assert_return(sd_ipv4ll_is_running(ll) == 0, -EBUSY);
 
         /* If no random seed is set, generate some from the MAC address */
         if (!ll->seed_set)
                 ll->seed.value = htole64(siphash24(ll->mac.ether_addr_octet, ETH_ALEN, MAC_HASH_KEY.bytes));
 
-        /* Restart the generation counter. */
-        ll->seed.generation = 0;
+        if (reset_generation)
+                ll->seed.generation = 0;
 
         if (ll->address == 0) {
                 r = ipv4ll_pick_address(ll);
@@ -263,6 +256,19 @@ int sd_ipv4ll_start(sd_ipv4ll *ll) {
         return 0;
 }
 
+int sd_ipv4ll_start(sd_ipv4ll *ll) {
+        assert_return(ll, -EINVAL);
+        assert_return(sd_ipv4ll_is_running(ll) == 0, -EBUSY);
+
+        return ipv4ll_start_internal(ll, true);
+}
+
+int sd_ipv4ll_restart(sd_ipv4ll *ll) {
+        ll->address = 0;
+
+        return ipv4ll_start_internal(ll, false);
+}
+
 static void ipv4ll_client_notify(sd_ipv4ll *ll, int event) {
         assert(ll);
 
@@ -298,11 +304,7 @@ void ipv4ll_on_acd(sd_ipv4acd *acd, int event, void *userdata) {
 
                         ll->claimed_address = 0;
                 } else {
-                        r = ipv4ll_pick_address(ll);
-                        if (r < 0)
-                                goto error;
-
-                        r = sd_ipv4acd_start(ll->acd);
+                        r = sd_ipv4ll_restart(ll);
                         if (r < 0)
                                 goto error;
                 }