network/vxlan: do not try to update several parameters
authorYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 28 Oct 2024 20:30:39 +0000 (05:30 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 30 Oct 2024 16:06:25 +0000 (01:06 +0900)
Currently, netdev->ifindex is always zero when this function is called.
So, this does not change any behavior. Preparation for later commits.

src/network/netdev/vxlan.c

index e928b20d8392d59355c22b75aa77a0734dac1453..2c4aaecbf0c1586e7ae1e13fbc810cad0c6b9362 100644 (file)
@@ -44,12 +44,6 @@ static int netdev_vxlan_fill_message_create(NetDev *netdev, Link *link, sd_netli
         int local_family, r;
         VxLan *v = VXLAN(netdev);
 
-        if (v->vni <= VXLAN_VID_MAX) {
-                r = sd_netlink_message_append_u32(m, IFLA_VXLAN_ID, v->vni);
-                if (r < 0)
-                        return r;
-        }
-
         if (in_addr_is_set(v->group_family, &v->group)) {
                 if (v->group_family == AF_INET)
                         r = sd_netlink_message_append_in_addr(m, IFLA_VXLAN_GROUP, &v->group.in);
@@ -83,12 +77,12 @@ static int netdev_vxlan_fill_message_create(NetDev *netdev, Link *link, sd_netli
         if (r < 0)
                 return r;
 
-        if (v->inherit) {
-                r = sd_netlink_message_append_flag(m, IFLA_VXLAN_TTL_INHERIT);
-                if (r < 0)
-                        return r;
-        } else {
-                r = sd_netlink_message_append_u8(m, IFLA_VXLAN_TTL, v->ttl);
+        r = sd_netlink_message_append_u8(m, IFLA_VXLAN_TTL, v->ttl);
+        if (r < 0)
+                return r;
+
+        if (v->fdb_ageing != 0) {
+                r = sd_netlink_message_append_u32(m, IFLA_VXLAN_AGEING, v->fdb_ageing / USEC_PER_SEC);
                 if (r < 0)
                         return r;
         }
@@ -99,6 +93,34 @@ static int netdev_vxlan_fill_message_create(NetDev *netdev, Link *link, sd_netli
                         return r;
         }
 
+        r = sd_netlink_message_append_u32(m, IFLA_VXLAN_LABEL, htobe32(v->flow_label));
+        if (r < 0)
+                return r;
+
+        if (v->df != _NETDEV_VXLAN_DF_INVALID) {
+                r = sd_netlink_message_append_u8(m, IFLA_VXLAN_DF, v->df);
+                if (r < 0)
+                        return r;
+        }
+
+        if (netdev->ifindex > 0)
+                return 0;
+
+        /* The properties below cannot be updated, and the kernel refuses the whole request if one of the
+         * following attributes is set for an existing interface. */
+
+        if (v->vni <= VXLAN_VID_MAX) {
+                r = sd_netlink_message_append_u32(m, IFLA_VXLAN_ID, v->vni);
+                if (r < 0)
+                        return r;
+        }
+
+        if (v->inherit) {
+                r = sd_netlink_message_append_flag(m, IFLA_VXLAN_TTL_INHERIT);
+                if (r < 0)
+                        return r;
+        }
+
         r = sd_netlink_message_append_u8(m, IFLA_VXLAN_LEARNING, v->learning);
         if (r < 0)
                 return r;
@@ -119,12 +141,6 @@ static int netdev_vxlan_fill_message_create(NetDev *netdev, Link *link, sd_netli
         if (r < 0)
                 return r;
 
-        if (v->fdb_ageing != 0) {
-                r = sd_netlink_message_append_u32(m, IFLA_VXLAN_AGEING, v->fdb_ageing / USEC_PER_SEC);
-                if (r < 0)
-                        return r;
-        }
-
         if (v->max_fdb != 0) {
                 r = sd_netlink_message_append_u32(m, IFLA_VXLAN_LIMIT, v->max_fdb);
                 if (r < 0)
@@ -166,10 +182,6 @@ static int netdev_vxlan_fill_message_create(NetDev *netdev, Link *link, sd_netli
                         return r;
         }
 
-        r = sd_netlink_message_append_u32(m, IFLA_VXLAN_LABEL, htobe32(v->flow_label));
-        if (r < 0)
-                return r;
-
         if (v->group_policy) {
                 r = sd_netlink_message_append_flag(m, IFLA_VXLAN_GBP);
                 if (r < 0)
@@ -182,15 +194,16 @@ static int netdev_vxlan_fill_message_create(NetDev *netdev, Link *link, sd_netli
                         return r;
         }
 
-        if (v->df != _NETDEV_VXLAN_DF_INVALID) {
-                r = sd_netlink_message_append_u8(m, IFLA_VXLAN_DF, v->df);
-                if (r < 0)
-                        return r;
-        }
-
         return 0;
 }
 
+static bool vxlan_can_set_mtu(NetDev *netdev, uint32_t mtu) {
+        assert(netdev);
+
+        /* MTU cannot be updated. Even unchanged, IFLA_MTU attribute cannot be set in the message. */
+        return netdev->ifindex <= 0;
+}
+
 int config_parse_vxlan_address(
                 const char *unit,
                 const char *filename,
@@ -431,6 +444,7 @@ const NetDevVTable vxlan_vtable = {
         .create_type = NETDEV_CREATE_STACKED,
         .is_ready_to_create = netdev_vxlan_is_ready_to_create,
         .config_verify = netdev_vxlan_verify,
+        .can_set_mtu = vxlan_can_set_mtu,
         .iftype = ARPHRD_ETHER,
         .generate_mac = true,
 };