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);
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;
}
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;
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)
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)
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,
.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,
};