From cd3d4926188fc328ed38768e1891242b9dfc1ed9 Mon Sep 17 00:00:00 2001 From: Jan Vaclav Date: Tue, 9 Sep 2025 01:20:19 +0200 Subject: [PATCH] platform: configure HSR protocol version from property Uses the `hsr.protocol-version` property defined in the previous commit to configure the property in the kernel. (cherry picked from commit 0b9962927816ed545dd029cba71042430b1b72f6) --- src/core/devices/nm-device-hsr.c | 8 ++++++-- src/libnm-platform/nm-linux-platform.c | 5 +++++ src/libnm-platform/nm-platform.c | 10 +++++++--- src/libnm-platform/nm-platform.h | 1 + 4 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/core/devices/nm-device-hsr.c b/src/core/devices/nm-device-hsr.c index 59454ee341..5bc685729d 100644 --- a/src/core/devices/nm-device-hsr.c +++ b/src/core/devices/nm-device-hsr.c @@ -128,9 +128,13 @@ create_and_realize(NMDevice *device, lnk.port1 = nm_platform_link_get_ifindex(NM_PLATFORM_GET, nm_setting_hsr_get_port1(s_hsr)); if (nm_setting_hsr_get_port2(s_hsr) != NULL) lnk.port2 = nm_platform_link_get_ifindex(NM_PLATFORM_GET, nm_setting_hsr_get_port2(s_hsr)); - lnk.multicast_spec = nm_setting_hsr_get_multicast_spec(s_hsr); - lnk.prp = nm_setting_hsr_get_prp(s_hsr); + + lnk.multicast_spec = nm_setting_hsr_get_multicast_spec(s_hsr); + lnk.prp = nm_setting_hsr_get_prp(s_hsr); + lnk.protocol_version = nm_setting_hsr_get_protocol_version(s_hsr); + r = nm_platform_link_hsr_add(nm_device_get_platform(device), iface, &lnk, out_plink); + if (r < 0) { g_set_error(error, NM_DEVICE_ERROR, diff --git a/src/libnm-platform/nm-linux-platform.c b/src/libnm-platform/nm-linux-platform.c index d45893fe98..8c3bf28db4 100644 --- a/src/libnm-platform/nm-linux-platform.c +++ b/src/libnm-platform/nm-linux-platform.c @@ -5196,6 +5196,11 @@ _nl_msg_new_link_set_linkinfo(struct nl_msg *msg, NMLinkType link_type, gconstpo NLA_PUT_U8(msg, IFLA_HSR_MULTICAST_SPEC, props->multicast_spec); NLA_PUT_U8(msg, IFLA_HSR_PROTOCOL, props->prp); + + if (!props->prp && props->protocol_version >= 0) { + NLA_PUT_U8(msg, IFLA_HSR_VERSION, props->protocol_version); + } + break; } case NM_LINK_TYPE_SIT: diff --git a/src/libnm-platform/nm-platform.c b/src/libnm-platform/nm-platform.c index fd966d2ce7..3a35a8b5cd 100644 --- a/src/libnm-platform/nm-platform.c +++ b/src/libnm-platform/nm-platform.c @@ -6569,12 +6569,14 @@ nm_platform_lnk_hsr_to_string(const NMPlatformLnkHsr *lnk, char *buf, gsize len) "port1 %d " "port2 %d " "supervision_address " NM_ETHER_ADDR_FORMAT_STR " multicast_spec %u " - "prp %s", + "prp %s " + "protocol_version %d", lnk->port1, lnk->port2, NM_ETHER_ADDR_FORMAT_VAL(&lnk->supervision_address), lnk->multicast_spec, - lnk->prp ? "on" : "off"); + lnk->prp ? "on" : "off", + lnk->protocol_version); return buf; } @@ -8488,7 +8490,8 @@ nm_platform_lnk_hsr_hash_update(const NMPlatformLnkHsr *obj, NMHashState *h) obj->port2, obj->supervision_address, obj->multicast_spec, - NM_HASH_COMBINE_BOOLS(guint8, obj->prp)); + NM_HASH_COMBINE_BOOLS(guint8, obj->prp), + obj->protocol_version); } int @@ -8500,6 +8503,7 @@ nm_platform_lnk_hsr_cmp(const NMPlatformLnkHsr *a, const NMPlatformLnkHsr *b) NM_CMP_FIELD_MEMCMP(a, b, supervision_address); NM_CMP_FIELD(a, b, multicast_spec); NM_CMP_FIELD_BOOL(a, b, prp); + NM_CMP_FIELD(a, b, protocol_version); return 0; } diff --git a/src/libnm-platform/nm-platform.h b/src/libnm-platform/nm-platform.h index e4ccb9b1cb..f960d8f0af 100644 --- a/src/libnm-platform/nm-platform.h +++ b/src/libnm-platform/nm-platform.h @@ -846,6 +846,7 @@ typedef struct { int port1; int port2; NMEtherAddr supervision_address; + gint8 protocol_version; guint8 multicast_spec; bool prp : 1; } _nm_alignas(NMPlatformObject) NMPlatformLnkHsr;