diff --git a/libnm-core/nm-core-internal.h b/libnm-core/nm-core-internal.h index 416dca13a7..b31f6ba6e7 100644 --- a/libnm-core/nm-core-internal.h +++ b/libnm-core/nm-core-internal.h @@ -113,6 +113,9 @@ #define NM_BRIDGE_STP_DEF TRUE +#define NM_BRIDGE_GROUP_ADDRESS_DEF_BIN 0x01, 0x80, 0xC2, 0x00, 0x00, 0x00 +#define NM_BRIDGE_GROUP_ADDRESS_DEF_STR "01:80:C2:00:00:00" + #define NM_BRIDGE_PRIORITY_MIN 0u #define NM_BRIDGE_PRIORITY_DEF 0x8000u #define NM_BRIDGE_PRIORITY_MAX ((guint) G_MAXUINT16) diff --git a/src/devices/nm-device-bridge.c b/src/devices/nm-device-bridge.c index 4f5a68e6ab..c26609b17d 100644 --- a/src/devices/nm-device-bridge.c +++ b/src/devices/nm-device-bridge.c @@ -158,6 +158,17 @@ complete_connection (NMDevice *device, return TRUE; } +static void +to_sysfs_group_address_sys (const char *group_address, NMEtherAddr *out_addr) +{ + if ( group_address == NULL){ + *out_addr = (NMEtherAddr) NM_ETHER_ADDR_INIT (NM_BRIDGE_GROUP_ADDRESS_DEF_BIN); + return; + } + if (!nm_utils_hwaddr_aton (group_address, out_addr, ETH_ALEN)) + nm_assert_not_reached(); +} + static void from_sysfs_group_address (const char *value, GValue *out) { @@ -171,6 +182,15 @@ to_sysfs_group_address (GValue *value) return g_value_get_string (value) ?: "01:80:C2:00:00:00"; } +static int +to_sysfs_vlan_protocol_sys (const char *value) +{ + if (nm_streq0 (value, "802.1ad")) + return ETH_P_8021AD; + + return 0x8100; +} + static void from_sysfs_vlan_protocol (const char *value, GValue *out) { @@ -198,6 +218,19 @@ to_sysfs_vlan_protocol (GValue *value) return "0x8100"; } +static int +to_sysfs_multicast_router_sys (const char *value) +{ + if (nm_streq0 (value, "disabled")) + return 0; + if (nm_streq0 (value, "auto")) + return 1; + if (nm_streq0 (value, "enabled")) + return 2; + + return 1; +} + static const char * to_sysfs_multicast_router (GValue *value) { @@ -231,7 +264,6 @@ from_sysfs_multicast_router (const char *value, GValue *out) } /*****************************************************************************/ - #define _DEFAULT_IF_ZERO(val, def_val) \ ({ \ typeof (val) _val = (val); \ @@ -1027,23 +1059,31 @@ create_and_realize (NMDevice *device, } props = (NMPlatformLnkBridge) { - .stp_state = nm_setting_bridge_get_stp (s_bridge), .forward_delay = _DEFAULT_IF_ZERO (nm_setting_bridge_get_forward_delay (s_bridge) * 100u, NM_BRIDGE_FORWARD_DELAY_DEF_SYS), .hello_time = _DEFAULT_IF_ZERO (nm_setting_bridge_get_hello_time (s_bridge) * 100u, NM_BRIDGE_HELLO_TIME_DEF_SYS), .max_age = _DEFAULT_IF_ZERO (nm_setting_bridge_get_max_age (s_bridge) * 100u, NM_BRIDGE_MAX_AGE_DEF_SYS), .ageing_time = _DEFAULT_IF_ZERO (nm_setting_bridge_get_ageing_time (s_bridge) * 100u, NM_BRIDGE_AGEING_TIME_DEF_SYS), + .stp_state = nm_setting_bridge_get_stp (s_bridge), .priority = nm_setting_bridge_get_priority (s_bridge), + .vlan_protocol = to_sysfs_vlan_protocol_sys (nm_setting_bridge_get_vlan_protocol (s_bridge)), + .vlan_stats_enabled = nm_setting_bridge_get_vlan_stats_enabled (s_bridge), .group_fwd_mask = nm_setting_bridge_get_group_forward_mask (s_bridge), + .mcast_snooping = nm_setting_bridge_get_multicast_snooping (s_bridge), + .mcast_router = to_sysfs_multicast_router_sys (nm_setting_bridge_get_multicast_router (s_bridge)), + .mcast_query_use_ifaddr = nm_setting_bridge_get_multicast_query_use_ifaddr (s_bridge), + .mcast_querier = nm_setting_bridge_get_multicast_querier (s_bridge), .mcast_last_member_count = nm_setting_bridge_get_multicast_last_member_count (s_bridge), + .mcast_startup_query_count = nm_setting_bridge_get_multicast_startup_query_count (s_bridge), .mcast_last_member_interval = nm_setting_bridge_get_multicast_last_member_interval (s_bridge), .mcast_membership_interval = nm_setting_bridge_get_multicast_membership_interval (s_bridge), .mcast_querier_interval = nm_setting_bridge_get_multicast_querier_interval (s_bridge), .mcast_query_interval = nm_setting_bridge_get_multicast_query_interval (s_bridge), .mcast_query_response_interval = nm_setting_bridge_get_multicast_query_response_interval (s_bridge), - .mcast_startup_query_count = nm_setting_bridge_get_multicast_startup_query_count (s_bridge), .mcast_startup_query_interval = nm_setting_bridge_get_multicast_startup_query_interval (s_bridge), }; + to_sysfs_group_address_sys (nm_setting_bridge_get_group_address (s_bridge), &props.group_addr); + r = nm_platform_link_bridge_add (nm_device_get_platform (device), iface, hwaddr ? mac_address : NULL, diff --git a/src/platform/nm-linux-platform.c b/src/platform/nm-linux-platform.c index 6fd92ac9d6..ba2c9b0096 100644 --- a/src/platform/nm-linux-platform.c +++ b/src/platform/nm-linux-platform.c @@ -1301,20 +1301,27 @@ static NMPObject * _parse_lnk_bridge (const char *kind, struct nlattr *info_data) { static const struct nla_policy policy[] = { - [IFLA_BR_STP_STATE] = { .type = NLA_U32 }, [IFLA_BR_FORWARD_DELAY] = { .type = NLA_U32 }, [IFLA_BR_HELLO_TIME] = { .type = NLA_U32 }, [IFLA_BR_MAX_AGE] = { .type = NLA_U32 }, [IFLA_BR_AGEING_TIME] = { .type = NLA_U32 }, + [IFLA_BR_STP_STATE] = { .type = NLA_U32 }, [IFLA_BR_PRIORITY] = { .type = NLA_U16 }, + [IFLA_BR_VLAN_PROTOCOL] = { .type = NLA_U16 }, + [IFLA_BR_VLAN_STATS_ENABLED] = { .type = NLA_U8 }, [IFLA_BR_GROUP_FWD_MASK] = { .type = NLA_U16 }, + [IFLA_BR_GROUP_ADDR] = { .minlen = sizeof (NMEtherAddr) }, + [IFLA_BR_MCAST_SNOOPING] = { .type = NLA_U8 }, + [IFLA_BR_MCAST_ROUTER] = { .type = NLA_U8 }, + [IFLA_BR_MCAST_QUERY_USE_IFADDR] = { .type = NLA_U8 }, + [IFLA_BR_MCAST_QUERIER] = { .type = NLA_U8 }, [IFLA_BR_MCAST_LAST_MEMBER_CNT] = { .type = NLA_U32 }, + [IFLA_BR_MCAST_STARTUP_QUERY_CNT] = { .type = NLA_U32 }, [IFLA_BR_MCAST_LAST_MEMBER_INTVL] = { .type = NLA_U64 }, [IFLA_BR_MCAST_MEMBERSHIP_INTVL] = { .type = NLA_U64 }, [IFLA_BR_MCAST_QUERIER_INTVL] = { .type = NLA_U64 }, [IFLA_BR_MCAST_QUERY_INTVL] = { .type = NLA_U64 }, [IFLA_BR_MCAST_QUERY_RESPONSE_INTVL] = { .type = NLA_U64 }, - [IFLA_BR_MCAST_STARTUP_QUERY_CNT] = { .type = NLA_U32 }, [IFLA_BR_MCAST_STARTUP_QUERY_INTVL] = { .type = NLA_U64 }, }; NMPlatformLnkBridge *props; @@ -1331,9 +1338,8 @@ _parse_lnk_bridge (const char *kind, struct nlattr *info_data) obj = nmp_object_new (NMP_OBJECT_TYPE_LNK_BRIDGE, NULL); props = &obj->lnk_bridge; + *props = nm_platform_lnk_bridge_default; - if (tb[IFLA_BR_STP_STATE]) - props->stp_state = !!nla_get_u32 (tb[IFLA_BR_STP_STATE]); if (tb[IFLA_BR_FORWARD_DELAY]) props->forward_delay = nla_get_u32 (tb[IFLA_BR_FORWARD_DELAY]); if (tb[IFLA_BR_HELLO_TIME]) @@ -1342,44 +1348,42 @@ _parse_lnk_bridge (const char *kind, struct nlattr *info_data) props->max_age = nla_get_u32 (tb[IFLA_BR_MAX_AGE]); if (tb[IFLA_BR_AGEING_TIME]) props->ageing_time = nla_get_u32 (tb[IFLA_BR_AGEING_TIME]); + if (tb[IFLA_BR_STP_STATE]) + props->stp_state = !!nla_get_u32 (tb[IFLA_BR_STP_STATE]); if (tb[IFLA_BR_PRIORITY]) props->priority = nla_get_u16 (tb[IFLA_BR_PRIORITY]); + if (tb[IFLA_BR_VLAN_PROTOCOL]) + props->vlan_protocol = ntohs (nla_get_u16 (tb[IFLA_BR_VLAN_PROTOCOL])); + if (tb[IFLA_BR_VLAN_STATS_ENABLED]) + props->vlan_stats_enabled = nla_get_u8 (tb[IFLA_BR_VLAN_STATS_ENABLED]); if (tb[IFLA_BR_GROUP_FWD_MASK]) props->group_fwd_mask = nla_get_u16 (tb[IFLA_BR_GROUP_FWD_MASK]); - else - props->group_fwd_mask = 0; + if (tb[IFLA_BR_GROUP_ADDR]) + props->group_addr = *nla_data_as (NMEtherAddr, tb[IFLA_BR_GROUP_ADDR]); + if (tb[IFLA_BR_MCAST_SNOOPING]) + props->mcast_snooping = !!nla_get_u8 (tb[IFLA_BR_MCAST_SNOOPING]); + if (tb[IFLA_BR_MCAST_ROUTER]) + props->mcast_router = nla_get_u8 (tb[IFLA_BR_MCAST_ROUTER]); + if (tb[IFLA_BR_MCAST_QUERY_USE_IFADDR]) + props->mcast_query_use_ifaddr = !!nla_get_u8 (tb[IFLA_BR_MCAST_QUERY_USE_IFADDR]); + if (tb[IFLA_BR_MCAST_QUERIER]) + props->mcast_querier = nla_get_u8 (tb[IFLA_BR_MCAST_QUERIER]); if (tb[IFLA_BR_MCAST_LAST_MEMBER_CNT]) props->mcast_last_member_count = nla_get_u32 (tb[IFLA_BR_MCAST_LAST_MEMBER_CNT]); - else - props->mcast_last_member_count = NM_BRIDGE_MULTICAST_LAST_MEMBER_COUNT_DEF; - if (tb[IFLA_BR_MCAST_LAST_MEMBER_INTVL]) - props->mcast_last_member_interval = nla_get_u64 (tb[IFLA_BR_MCAST_LAST_MEMBER_INTVL]); - else - props->mcast_last_member_interval = NM_BRIDGE_MULTICAST_LAST_MEMBER_INTERVAL_DEF; - if (tb[IFLA_BR_MCAST_MEMBERSHIP_INTVL]) - props->mcast_membership_interval = nla_get_u64 (tb[IFLA_BR_MCAST_MEMBERSHIP_INTVL]); - else - props->mcast_membership_interval = NM_BRIDGE_MULTICAST_MEMBERSHIP_INTERVAL_DEF; - if (tb[IFLA_BR_MCAST_QUERIER_INTVL]) - props->mcast_querier_interval = nla_get_u64 (tb[IFLA_BR_MCAST_QUERIER_INTVL]); - else - props->mcast_querier_interval = NM_BRIDGE_MULTICAST_QUERIER_INTERVAL_DEF; - if (tb[IFLA_BR_MCAST_QUERY_INTVL]) - props->mcast_query_interval = nla_get_u64 (tb[IFLA_BR_MCAST_QUERY_INTVL]); - else - props->mcast_query_interval = NM_BRIDGE_MULTICAST_QUERY_INTERVAL_DEF; - if (tb[IFLA_BR_MCAST_QUERY_RESPONSE_INTVL]) - props->mcast_query_response_interval = nla_get_u64 (tb[IFLA_BR_MCAST_QUERY_RESPONSE_INTVL]); - else - props->mcast_query_response_interval = NM_BRIDGE_MULTICAST_QUERY_RESPONSE_INTERVAL_DEF; if (tb[IFLA_BR_MCAST_STARTUP_QUERY_CNT]) props->mcast_startup_query_count = nla_get_u32 (tb[IFLA_BR_MCAST_STARTUP_QUERY_CNT]); - else - props->mcast_startup_query_count = NM_BRIDGE_MULTICAST_STARTUP_QUERY_COUNT_DEF; + if (tb[IFLA_BR_MCAST_LAST_MEMBER_INTVL]) + props->mcast_last_member_interval = nla_get_u64 (tb[IFLA_BR_MCAST_LAST_MEMBER_INTVL]); + if (tb[IFLA_BR_MCAST_MEMBERSHIP_INTVL]) + props->mcast_membership_interval = nla_get_u64 (tb[IFLA_BR_MCAST_MEMBERSHIP_INTVL]); + if (tb[IFLA_BR_MCAST_QUERIER_INTVL]) + props->mcast_querier_interval = nla_get_u64 (tb[IFLA_BR_MCAST_QUERIER_INTVL]); + if (tb[IFLA_BR_MCAST_QUERY_INTVL]) + props->mcast_query_interval = nla_get_u64 (tb[IFLA_BR_MCAST_QUERY_INTVL]); + if (tb[IFLA_BR_MCAST_QUERY_RESPONSE_INTVL]) + props->mcast_query_response_interval = nla_get_u64 (tb[IFLA_BR_MCAST_QUERY_RESPONSE_INTVL]); if (tb[IFLA_BR_MCAST_STARTUP_QUERY_INTVL]) props->mcast_startup_query_interval = nla_get_u64 (tb[IFLA_BR_MCAST_STARTUP_QUERY_INTVL]); - else - props->mcast_startup_query_interval = NM_BRIDGE_MULTICAST_STARTUP_QUERY_INTERVAL_DEF; return obj; } @@ -4054,20 +4058,27 @@ _nl_msg_new_link_set_linkinfo (struct nl_msg *msg, if (!(data = nla_nest_start (msg, IFLA_INFO_DATA))) goto nla_put_failure; - NLA_PUT_U32 (msg, IFLA_BR_STP_STATE, !!props->stp_state); NLA_PUT_U32 (msg, IFLA_BR_FORWARD_DELAY, props->forward_delay); NLA_PUT_U32 (msg, IFLA_BR_HELLO_TIME, props->hello_time); NLA_PUT_U32 (msg, IFLA_BR_MAX_AGE, props->max_age); NLA_PUT_U32 (msg, IFLA_BR_AGEING_TIME, props->ageing_time); + NLA_PUT_U32 (msg, IFLA_BR_STP_STATE, !!props->stp_state); NLA_PUT_U16 (msg, IFLA_BR_PRIORITY, props->priority); + NLA_PUT_U16 (msg, IFLA_BR_VLAN_PROTOCOL, htons (props->vlan_protocol)); + NLA_PUT_U8 (msg, IFLA_BR_VLAN_STATS_ENABLED, !!props->vlan_stats_enabled); NLA_PUT_U16 (msg, IFLA_BR_GROUP_FWD_MASK, props->group_fwd_mask); + NLA_PUT (msg, IFLA_BR_GROUP_ADDR, sizeof (props->group_addr), &props->group_addr); + NLA_PUT_U8 (msg, IFLA_BR_MCAST_SNOOPING, !!props->mcast_snooping); + NLA_PUT_U8 (msg, IFLA_BR_MCAST_ROUTER, props->mcast_router); + NLA_PUT_U8 (msg, IFLA_BR_MCAST_QUERY_USE_IFADDR, !!props->mcast_query_use_ifaddr); + NLA_PUT_U8 (msg, IFLA_BR_MCAST_QUERIER, !!props->mcast_querier); NLA_PUT_U32 (msg, IFLA_BR_MCAST_LAST_MEMBER_CNT, props->mcast_last_member_count); + NLA_PUT_U32 (msg, IFLA_BR_MCAST_STARTUP_QUERY_CNT, props->mcast_startup_query_count); NLA_PUT_U64 (msg, IFLA_BR_MCAST_LAST_MEMBER_INTVL, props->mcast_last_member_interval); NLA_PUT_U64 (msg, IFLA_BR_MCAST_MEMBERSHIP_INTVL, props->mcast_membership_interval); NLA_PUT_U64 (msg, IFLA_BR_MCAST_QUERIER_INTVL, props->mcast_querier_interval); NLA_PUT_U64 (msg, IFLA_BR_MCAST_QUERY_INTVL, props->mcast_query_interval); NLA_PUT_U64 (msg, IFLA_BR_MCAST_QUERY_RESPONSE_INTVL, props->mcast_query_response_interval); - NLA_PUT_U32 (msg, IFLA_BR_MCAST_STARTUP_QUERY_CNT, props->mcast_startup_query_count); NLA_PUT_U64 (msg, IFLA_BR_MCAST_STARTUP_QUERY_INTVL, props->mcast_startup_query_interval); break; } diff --git a/src/platform/nm-platform.c b/src/platform/nm-platform.c index be2b5b7407..1f54fad8cd 100644 --- a/src/platform/nm-platform.c +++ b/src/platform/nm-platform.c @@ -5383,20 +5383,27 @@ nm_platform_link_to_string (const NMPlatformLink *link, char *buf, gsize len) } const NMPlatformLnkBridge nm_platform_lnk_bridge_default = { - .stp_state = FALSE, .forward_delay = NM_BRIDGE_FORWARD_DELAY_DEF_SYS, .hello_time = NM_BRIDGE_HELLO_TIME_DEF_SYS, .max_age = NM_BRIDGE_MAX_AGE_DEF_SYS, .ageing_time = NM_BRIDGE_AGEING_TIME_DEF_SYS, + .stp_state = FALSE, .priority = NM_BRIDGE_PRIORITY_DEF, + .vlan_protocol = 0x8100, + .vlan_stats_enabled = FALSE, .group_fwd_mask = 0, + .group_addr = NM_ETHER_ADDR_INIT (NM_BRIDGE_GROUP_ADDRESS_DEF_BIN), + .mcast_snooping = FALSE, + .mcast_router = 1, + .mcast_query_use_ifaddr = FALSE, + .mcast_querier = FALSE, .mcast_last_member_count = NM_BRIDGE_MULTICAST_LAST_MEMBER_COUNT_DEF, + .mcast_startup_query_count = NM_BRIDGE_MULTICAST_STARTUP_QUERY_COUNT_DEF, .mcast_last_member_interval = NM_BRIDGE_MULTICAST_LAST_MEMBER_INTERVAL_DEF, .mcast_membership_interval = NM_BRIDGE_MULTICAST_MEMBERSHIP_INTERVAL_DEF, .mcast_querier_interval = NM_BRIDGE_MULTICAST_QUERIER_INTERVAL_DEF, .mcast_query_interval = NM_BRIDGE_MULTICAST_QUERY_INTERVAL_DEF, .mcast_query_response_interval = NM_BRIDGE_MULTICAST_QUERY_RESPONSE_INTERVAL_DEF, - .mcast_startup_query_count = NM_BRIDGE_MULTICAST_STARTUP_QUERY_COUNT_DEF, .mcast_startup_query_interval = NM_BRIDGE_MULTICAST_STARTUP_QUERY_INTERVAL_DEF, }; @@ -5413,15 +5420,22 @@ nm_platform_lnk_bridge_to_string (const NMPlatformLnkBridge *lnk, char *buf, gsi " ageing_time %u" " stp_state %d" " priority %u" + " vlan_protocol %u" + " vlan_stats_enabled %d" " group_fwd_mask %#x" + " group_address "NM_ETHER_ADDR_FORMAT_STR + " mcast_snooping %d" + " mcast_router %u" + " mcast_query_use_ifaddr %d" + " mcast_querier %d" " mcast_last_member_count %u" " mcast_startup_query_count %u" - " mcast_last_member_interval %"G_GUINT64_FORMAT"" - " mcast_membership_interval %"G_GUINT64_FORMAT"" - " mcast_querier_interval %"G_GUINT64_FORMAT"" - " mcast_query_interval %"G_GUINT64_FORMAT"" - " mcast_query_response_interval %"G_GUINT64_FORMAT"" - " mcast_startup_query_interval %"G_GUINT64_FORMAT"" + " mcast_last_member_interval %"G_GUINT64_FORMAT + " mcast_membership_interval %"G_GUINT64_FORMAT + " mcast_querier_interval %"G_GUINT64_FORMAT + " mcast_query_interval %"G_GUINT64_FORMAT + " mcast_query_response_interval %"G_GUINT64_FORMAT + " mcast_startup_query_interval %"G_GUINT64_FORMAT "", lnk->forward_delay, lnk->hello_time, @@ -5429,7 +5443,14 @@ nm_platform_lnk_bridge_to_string (const NMPlatformLnkBridge *lnk, char *buf, gsi lnk->ageing_time, (int) lnk->stp_state, lnk->priority, + lnk->vlan_protocol, + (int) lnk->vlan_stats_enabled, lnk->group_fwd_mask, + NM_ETHER_ADDR_FORMAT_VAL (lnk->group_addr), + (int) lnk->mcast_snooping, + lnk->mcast_router, + (int) lnk->mcast_query_use_ifaddr, + (int) lnk->mcast_querier, lnk->mcast_last_member_count, lnk->mcast_startup_query_count, lnk->mcast_last_member_interval, @@ -6934,41 +6955,56 @@ void nm_platform_lnk_bridge_hash_update (const NMPlatformLnkBridge *obj, NMHashState *h) { nm_hash_update_vals (h, - (bool) obj->stp_state, obj->forward_delay, obj->hello_time, obj->max_age, obj->ageing_time, obj->priority, + obj->vlan_protocol, obj->group_fwd_mask, + obj->group_addr, obj->mcast_last_member_count, + obj->mcast_startup_query_count, obj->mcast_last_member_interval, obj->mcast_membership_interval, obj->mcast_querier_interval, obj->mcast_query_interval, + obj->mcast_router, obj->mcast_query_response_interval, - obj->mcast_startup_query_count, - obj->mcast_startup_query_interval); + obj->mcast_startup_query_interval, + NM_HASH_COMBINE_BOOLS (guint8, + obj->stp_state, + obj->mcast_querier, + obj->mcast_query_use_ifaddr, + obj->mcast_snooping, + obj->vlan_stats_enabled)); } int nm_platform_lnk_bridge_cmp (const NMPlatformLnkBridge *a, const NMPlatformLnkBridge *b) { NM_CMP_SELF (a, b); - NM_CMP_FIELD_BOOL (a, b, stp_state); NM_CMP_FIELD (a, b, forward_delay); NM_CMP_FIELD (a, b, hello_time); NM_CMP_FIELD (a, b, max_age); NM_CMP_FIELD (a, b, ageing_time); + NM_CMP_FIELD_BOOL (a, b, stp_state); NM_CMP_FIELD (a, b, priority); + NM_CMP_FIELD (a, b, vlan_protocol); + NM_CMP_FIELD_BOOL (a, b, vlan_stats_enabled); NM_CMP_FIELD (a, b, group_fwd_mask); + NM_CMP_FIELD_MEMCMP (a, b, group_addr); + NM_CMP_FIELD_BOOL (a, b, mcast_snooping); + NM_CMP_FIELD (a, b, mcast_router); + NM_CMP_FIELD_BOOL (a, b, mcast_query_use_ifaddr); + NM_CMP_FIELD_BOOL (a, b, mcast_querier); NM_CMP_FIELD (a, b, mcast_last_member_count); + NM_CMP_FIELD (a, b, mcast_startup_query_count); NM_CMP_FIELD (a, b, mcast_last_member_interval); NM_CMP_FIELD (a, b, mcast_membership_interval); NM_CMP_FIELD (a, b, mcast_querier_interval); NM_CMP_FIELD (a, b, mcast_query_interval); NM_CMP_FIELD (a, b, mcast_query_response_interval); - NM_CMP_FIELD (a, b, mcast_startup_query_count); NM_CMP_FIELD (a, b, mcast_startup_query_interval); return 0; diff --git a/src/platform/nm-platform.h b/src/platform/nm-platform.h index a3bde1b7f8..f089a72783 100644 --- a/src/platform/nm-platform.h +++ b/src/platform/nm-platform.h @@ -763,21 +763,28 @@ typedef struct { } NMPlatformBridgeVlan; typedef struct { + NMEtherAddr group_addr; + bool mcast_querier:1; + bool mcast_query_use_ifaddr:1; + bool mcast_snooping:1; bool stp_state:1; + bool vlan_stats_enabled:1; + guint16 group_fwd_mask; + guint16 priority; + guint16 vlan_protocol; + guint32 ageing_time; guint32 forward_delay; guint32 hello_time; guint32 max_age; - guint32 ageing_time; - guint16 priority; - guint16 group_fwd_mask; guint32 mcast_last_member_count; + guint32 mcast_startup_query_count; guint64 mcast_last_member_interval; guint64 mcast_membership_interval; guint64 mcast_querier_interval; guint64 mcast_query_interval; guint64 mcast_query_response_interval; - guint32 mcast_startup_query_count; guint64 mcast_startup_query_interval; + guint8 mcast_router; } NMPlatformLnkBridge; extern const NMPlatformLnkBridge nm_platform_lnk_bridge_default; diff --git a/src/platform/tests/test-common.c b/src/platform/tests/test-common.c index cfe7cdd275..34ec2e1506 100644 --- a/src/platform/tests/test-common.c +++ b/src/platform/tests/test-common.c @@ -1208,7 +1208,14 @@ nmtstp_link_bridge_add (NMPlatform *platform, "ageing_time %u " "stp_state %d " "priority %u " + "vlan_protocol %u " + "vlan_stats_enabled %d " "%s" /* group_fwd_mask */ + "group_address "NM_ETHER_ADDR_FORMAT_STR" " + "mcast_snooping %d " + "mcast_router %u " + "mcast_query_use_ifaddr %d " + "mcast_querier %d " "%s" /* mcast_last_member_count */ "%s" /* mcast_startup_query_count */ "%s" /* mcast_last_member_interval */ @@ -1225,9 +1232,16 @@ nmtstp_link_bridge_add (NMPlatform *platform, lnk->ageing_time, (int) lnk->stp_state, lnk->priority, + lnk->vlan_protocol, + (int) lnk->vlan_stats_enabled, lnk->group_fwd_mask != 0 ? nm_sprintf_buf (sbuf_gfw, "group_fwd_mask %#x ", lnk->group_fwd_mask) : "", + NM_ETHER_ADDR_FORMAT_VAL (lnk->group_addr), + (int) lnk->mcast_snooping, + lnk->mcast_router, + (int) lnk->mcast_query_use_ifaddr, + (int) lnk->mcast_querier, lnk->mcast_last_member_count != NM_BRIDGE_MULTICAST_LAST_MEMBER_COUNT_DEF ? nm_sprintf_buf (sbuf_mlmc, "mcast_last_member_count %u ",lnk->mcast_last_member_count) : "", @@ -1266,20 +1280,25 @@ nmtstp_link_bridge_add (NMPlatform *platform, ll = NMP_OBJECT_CAST_LNK_BRIDGE (NMP_OBJECT_UP_CAST (pllink)->_link.netlink.lnk); - g_assert_cmpint (lnk->stp_state, ==, ll->stp_state); g_assert_cmpint (lnk->forward_delay, ==, ll->forward_delay); g_assert_cmpint (lnk->hello_time, ==, ll->hello_time); g_assert_cmpint (lnk->max_age, ==, ll->max_age); g_assert_cmpint (lnk->ageing_time, ==, ll->ageing_time); + g_assert_cmpint (lnk->stp_state, ==, ll->stp_state); g_assert_cmpint (lnk->priority, ==, ll->priority); + g_assert_cmpint (lnk->vlan_stats_enabled, ==, ll->vlan_stats_enabled); g_assert_cmpint (lnk->group_fwd_mask, ==, ll->group_fwd_mask); + g_assert_cmpint (lnk->mcast_snooping, ==, ll->mcast_snooping); + g_assert_cmpint (lnk->mcast_router, ==, ll->mcast_router); + g_assert_cmpint (lnk->mcast_query_use_ifaddr, ==, ll->mcast_query_use_ifaddr); + g_assert_cmpint (lnk->mcast_querier, ==, ll->mcast_querier); g_assert_cmpint (lnk->mcast_last_member_count, ==, ll->mcast_last_member_count); + g_assert_cmpint (lnk->mcast_startup_query_count, ==, ll->mcast_startup_query_count); g_assert_cmpint (lnk->mcast_last_member_interval, ==, ll->mcast_last_member_interval); g_assert_cmpint (lnk->mcast_membership_interval, ==, ll->mcast_membership_interval); g_assert_cmpint (lnk->mcast_querier_interval, ==, ll->mcast_querier_interval); g_assert_cmpint (lnk->mcast_query_interval, ==, ll->mcast_query_interval); g_assert_cmpint (lnk->mcast_query_response_interval, ==, ll->mcast_query_response_interval); - g_assert_cmpint (lnk->mcast_startup_query_count, ==, ll->mcast_startup_query_count); g_assert_cmpint (lnk->mcast_startup_query_interval, ==, ll->mcast_startup_query_interval); return pllink; diff --git a/src/platform/tests/test-link.c b/src/platform/tests/test-link.c index 3927a3043e..a2f981606f 100644 --- a/src/platform/tests/test-link.c +++ b/src/platform/tests/test-link.c @@ -953,6 +953,7 @@ test_software_detect (gconstpointer user_data) int r; guint i_step; const gboolean ext = test_data->external_command; + NMPlatformLnkBridge lnk_bridge = { }; NMPlatformLnkTun lnk_tun; NMPlatformLnkGre lnk_gre = { }; nm_auto_close int tun_fd = -1; @@ -962,23 +963,29 @@ test_software_detect (gconstpointer user_data) switch (test_data->link_type) { case NM_LINK_TYPE_BRIDGE: { - NMPlatformLnkBridge lnk_bridge = { }; gboolean not_supported; - lnk_bridge.stp_state = TRUE; lnk_bridge.forward_delay = 1560; lnk_bridge.hello_time = 150; lnk_bridge.max_age = 2100; lnk_bridge.ageing_time = 2200; + lnk_bridge.stp_state = TRUE; lnk_bridge.priority = 22; + lnk_bridge.vlan_protocol = 0x8100; + lnk_bridge.vlan_stats_enabled = TRUE; lnk_bridge.group_fwd_mask = 8; + lnk_bridge.group_addr = (NMEtherAddr) { { 0x01, 0x80, 0xC2, 0x00, 0x00, 0x08 } }; + lnk_bridge.mcast_snooping = TRUE; + lnk_bridge.mcast_router = 1; + lnk_bridge.mcast_query_use_ifaddr = TRUE; + lnk_bridge.mcast_querier = TRUE; lnk_bridge.mcast_last_member_count = 2; + lnk_bridge.mcast_startup_query_count = 3; lnk_bridge.mcast_last_member_interval = 5000; lnk_bridge.mcast_membership_interval = 25000; lnk_bridge.mcast_querier_interval = 26000; lnk_bridge.mcast_query_interval = 12000; lnk_bridge.mcast_query_response_interval = 5200; - lnk_bridge.mcast_startup_query_count = 3; lnk_bridge.mcast_startup_query_interval = 3000; if (!nmtstp_link_bridge_add (NULL, ext, DEVICE_NAME, &lnk_bridge, ¬_supported)) { @@ -1359,20 +1366,27 @@ test_software_detect (gconstpointer user_data) const NMPlatformLnkBridge *plnk = &lnk->lnk_bridge; g_assert (plnk == nm_platform_link_get_lnk_bridge (NM_PLATFORM_GET, ifindex, NULL)); - g_assert_cmpint (plnk->stp_state , ==, TRUE); + g_assert_cmpint (nm_platform_lnk_bridge_cmp (&lnk_bridge, plnk), ==, 0); g_assert_cmpint (plnk->forward_delay , ==, 1560); g_assert_cmpint (plnk->hello_time , ==, 150); g_assert_cmpint (plnk->max_age , ==, 2100); g_assert_cmpint (plnk->ageing_time , ==, 2200); + g_assert_cmpint (plnk->stp_state , ==, TRUE); g_assert_cmpint (plnk->priority , ==, 22); + g_assert_cmpint (plnk->vlan_protocol , ==, 0x8100); + g_assert_cmpint (plnk->vlan_stats_enabled , ==, TRUE); g_assert_cmpint (plnk->group_fwd_mask , ==, 8); + g_assert_cmpint (plnk->mcast_snooping , ==, TRUE); + g_assert_cmpint (plnk->mcast_router , ==, 1); + g_assert_cmpint (plnk->mcast_query_use_ifaddr , ==, TRUE); + g_assert_cmpint (plnk->mcast_querier , ==, TRUE); g_assert_cmpint (plnk->mcast_last_member_count , ==, 2); + g_assert_cmpint (plnk->mcast_startup_query_count , ==, 3); g_assert_cmpint (plnk->mcast_last_member_interval , ==, 5000); g_assert_cmpint (plnk->mcast_membership_interval , ==, 25000); g_assert_cmpint (plnk->mcast_querier_interval , ==, 26000); g_assert_cmpint (plnk->mcast_query_interval , ==, 12000); g_assert_cmpint (plnk->mcast_query_response_interval , ==, 5200); - g_assert_cmpint (plnk->mcast_startup_query_count , ==, 3); g_assert_cmpint (plnk->mcast_startup_query_interval , ==, 3000); break;