]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
networkd: Unify set MTU
authorSusant Sahani <susant@redhat.com>
Thu, 14 Jun 2018 17:19:25 +0000 (22:49 +0530)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Wed, 20 Jun 2018 06:09:30 +0000 (08:09 +0200)
Now the setting MTU is embedded into the link_up message which makes it
incapable of setting MTU if link is up. MTU can be set while Link is up.

Closes #9254

src/network/networkd-link.c

index 562b4759ecf985241c2b365076438b8e96a58417..890784ea2ea6a1746c45cb9b2fd8aed198a40777 100644 (file)
@@ -1307,6 +1307,24 @@ int link_set_mtu(Link *link, uint32_t mtu) {
         if (r < 0)
                 return log_link_error_errno(link, r, "Could not allocate RTM_SETLINK message: %m");
 
+        /* If IPv6 not configured (no static IPv6 address and IPv6LL autoconfiguration is disabled)
+           for this interface, or if it is a bridge slave, then disable IPv6 else enable it. */
+        (void) link_enable_ipv6(link);
+
+        /* IPv6 protocol requires a minimum MTU of IPV6_MTU_MIN(1280) bytes
+           on the interface. Bump up MTU bytes to IPV6_MTU_MIN. */
+        if (link_ipv6_enabled(link) && link->network->mtu < IPV6_MIN_MTU) {
+
+                log_link_warning(link, "Bumping MTU to " STRINGIFY(IPV6_MIN_MTU) ", as "
+                                 "IPv6 is requested and requires a minimum MTU of " STRINGIFY(IPV6_MIN_MTU) " bytes: %m");
+
+                link->network->mtu = IPV6_MIN_MTU;
+        }
+
+        r = sd_netlink_message_append_u32(req, IFLA_MTU, link->network->mtu);
+        if (r < 0)
+                return log_link_error_errno(link, r, "Could not set MTU: %m");
+
         r = sd_netlink_message_append_u32(req, IFLA_MTU, mtu);
         if (r < 0)
                 return log_link_error_errno(link, r, "Could not append MTU: %m");
@@ -1774,26 +1792,6 @@ int link_up(Link *link) {
                         return log_link_error_errno(link, r, "Could not set MAC address: %m");
         }
 
-        /* If IPv6 not configured (no static IPv6 address and IPv6LL autoconfiguration is disabled)
-           for this interface, or if it is a bridge slave, then disable IPv6 else enable it. */
-        (void) link_enable_ipv6(link);
-
-        if (link->network->mtu != 0) {
-                /* IPv6 protocol requires a minimum MTU of IPV6_MTU_MIN(1280) bytes
-                   on the interface. Bump up MTU bytes to IPV6_MTU_MIN. */
-                if (link_ipv6_enabled(link) && link->network->mtu < IPV6_MIN_MTU) {
-
-                        log_link_warning(link, "Bumping MTU to " STRINGIFY(IPV6_MIN_MTU) ", as "
-                                         "IPv6 is requested and requires a minimum MTU of " STRINGIFY(IPV6_MIN_MTU) " bytes: %m");
-
-                        link->network->mtu = IPV6_MIN_MTU;
-                }
-
-                r = sd_netlink_message_append_u32(req, IFLA_MTU, link->network->mtu);
-                if (r < 0)
-                        return log_link_error_errno(link, r, "Could not set MTU: %m");
-        }
-
         r = sd_netlink_message_open_container(req, IFLA_AF_SPEC);
         if (r < 0)
                 return log_link_error_errno(link, r, "Could not open IFLA_AF_SPEC container: %m");
@@ -2867,6 +2865,12 @@ static int link_configure(Link *link) {
                         return r;
         }
 
+        if (link->network->mtu > 0) {
+                r = link_set_mtu(link, link->network->mtu);
+                if (r < 0)
+                        return r;
+        }
+
         if (link_has_carrier(link) || link->network->configure_without_carrier) {
                 r = link_acquire_conf(link);
                 if (r < 0)