From 49639363ab189c7bf0dc57ed108717f8ddf054cb Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Tue, 29 Oct 2024 05:30:39 +0900 Subject: [PATCH] network/vxlan: do not try to update several parameters 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 | 70 +++++++++++++++++++++++--------------- 1 file changed, 42 insertions(+), 28 deletions(-) diff --git a/src/network/netdev/vxlan.c b/src/network/netdev/vxlan.c index e928b20d83..2c4aaecbf0 100644 --- a/src/network/netdev/vxlan.c +++ b/src/network/netdev/vxlan.c @@ -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, }; -- 2.25.1