platform: use netlink for configuring bridge settings

NMDeviceBridge is currently using sysfs. The plan is to use netlink in
in the future
This commit is contained in:
Sayed Shah 2020-08-20 09:40:17 -04:00
parent f5db085cd3
commit 58847f85a4
7 changed files with 191 additions and 61 deletions

View File

@ -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)

View File

@ -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,

View File

@ -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;
}

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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, &not_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;