diff --git a/clients/common/nm-meta-setting-desc.c b/clients/common/nm-meta-setting-desc.c index 1a782b489d..cad4a80f2b 100644 --- a/clients/common/nm-meta-setting-desc.c +++ b/clients/common/nm-meta-setting-desc.c @@ -4947,6 +4947,10 @@ static const NMMetaPropertyInfo *const property_infos_BRIDGE[] = { .property_type = &_pt_gobject_int, .hide_if_default = TRUE, ), + PROPERTY_INFO_WITH_DESC (NM_SETTING_BRIDGE_MULTICAST_LAST_MEMBER_INTERVAL, + .property_type = &_pt_gobject_int, + .hide_if_default = TRUE, + ), PROPERTY_INFO_WITH_DESC (NM_SETTING_BRIDGE_MULTICAST_QUERIER, .property_type = &_pt_gobject_bool, .hide_if_default = TRUE, diff --git a/clients/common/settings-docs.h.in b/clients/common/settings-docs.h.in index c186bc40d2..c00f0f8123 100644 --- a/clients/common/settings-docs.h.in +++ b/clients/common/settings-docs.h.in @@ -121,6 +121,7 @@ #define DESCRIBE_DOC_NM_SETTING_BRIDGE_MAX_AGE N_("The Spanning Tree Protocol (STP) maximum message age, in seconds.") #define DESCRIBE_DOC_NM_SETTING_BRIDGE_MULTICAST_HASH_MAX N_("Set maximum size of multicast hash table (value must be a power of 2).") #define DESCRIBE_DOC_NM_SETTING_BRIDGE_MULTICAST_LAST_MEMBER_COUNT N_("Set the number of queries the bridge will send before stopping forwarding a multicast group after a \"leave\" message has been received.") +#define DESCRIBE_DOC_NM_SETTING_BRIDGE_MULTICAST_LAST_MEMBER_INTERVAL N_("Set interval (in deciseconds) between queries to find remaining members of a group, after a \"leave\" message is received.") #define DESCRIBE_DOC_NM_SETTING_BRIDGE_MULTICAST_QUERIER N_("Enable or disable sending of multicast queries by the bridge. If not specified the option is disabled.") #define DESCRIBE_DOC_NM_SETTING_BRIDGE_MULTICAST_QUERY_USE_IFADDR N_("If enabled the bridge's own IP address is used as the source address for IGMP queries otherwise the default of 0.0.0.0 is used.") #define DESCRIBE_DOC_NM_SETTING_BRIDGE_MULTICAST_ROUTER N_("Sets bridge's multicast router. multicast-snooping must be enabled for this option to work. Supported values are: 'auto', 'disabled', 'enabled'. If not specified the default value is 'auto'.") diff --git a/libnm-core/nm-setting-bridge.c b/libnm-core/nm-setting-bridge.c index 8cd8809f70..4fd8984354 100644 --- a/libnm-core/nm-setting-bridge.c +++ b/libnm-core/nm-setting-bridge.c @@ -27,6 +27,7 @@ #define BRIDGE_HELLO_TIME_DEFAULT 2 #define BRIDGE_MAX_AGE_DEFAULT 20 #define BRIDGE_MULTICAST_LAST_MEMBER_COUNT_DEFAULT 2 +#define BRIDGE_MULTICAST_LAST_MEMBER_INTERVAL_DEFAULT 100 #define BRIDGE_MULTICAST_HASH_MAX_DEFAULT 4096 #define BRIDGE_MULTICAST_QUERIER_DEFAULT FALSE #define BRIDGE_MULTICAST_QUERY_USE_IFADDR_DEFAULT FALSE @@ -50,6 +51,7 @@ NM_GOBJECT_PROPERTIES_DEFINE (NMSettingBridge, PROP_GROUP_FORWARD_MASK, PROP_MULTICAST_HASH_MAX, PROP_MULTICAST_LAST_MEMBER_COUNT, + PROP_MULTICAST_LAST_MEMBER_INTERVAL, PROP_MULTICAST_ROUTER, PROP_MULTICAST_QUERIER, PROP_MULTICAST_QUERY_USE_IFADDR, @@ -67,6 +69,7 @@ typedef struct { char * multicast_router; char * group_address; char * vlan_protocol; + guint64 multicast_last_member_interval; guint32 ageing_time; guint32 multicast_hash_max; guint32 multicast_last_member_count; @@ -1048,6 +1051,22 @@ nm_setting_bridge_get_multicast_last_member_count (const NMSettingBridge *settin return NM_SETTING_BRIDGE_GET_PRIVATE (setting)->multicast_last_member_count; } +/** + * nm_setting_bridge_get_multicast_last_member_interval: + * @setting: the #NMSettingBridge + * + * Returns: the #NMSettingBridge:multicast-last-member-interval property of the setting + * + * Since 1.26 + **/ +guint64 +nm_setting_bridge_get_multicast_last_member_interval (const NMSettingBridge *setting) +{ + g_return_val_if_fail (NM_IS_SETTING_BRIDGE (setting), 0); + + return NM_SETTING_BRIDGE_GET_PRIVATE (setting)->multicast_last_member_interval; +} + /*****************************************************************************/ static gboolean @@ -1289,6 +1308,9 @@ get_property (GObject *object, guint prop_id, case PROP_MULTICAST_LAST_MEMBER_COUNT: g_value_set_uint (value, priv->multicast_last_member_count); break; + case PROP_MULTICAST_LAST_MEMBER_INTERVAL: + g_value_set_uint64 (value, priv->multicast_last_member_interval); + break; case PROP_MULTICAST_SNOOPING: g_value_set_boolean (value, priv->multicast_snooping); break; @@ -1368,6 +1390,9 @@ set_property (GObject *object, guint prop_id, case PROP_MULTICAST_LAST_MEMBER_COUNT: priv->multicast_last_member_count = g_value_get_uint (value); break; + case PROP_MULTICAST_LAST_MEMBER_INTERVAL: + priv->multicast_last_member_interval = g_value_get_uint64 (value); + break; case PROP_MULTICAST_SNOOPING: priv->multicast_snooping = g_value_get_boolean (value); break; @@ -1415,19 +1440,20 @@ nm_setting_bridge_init (NMSettingBridge *setting) priv->vlans = g_ptr_array_new_with_free_func ((GDestroyNotify) nm_bridge_vlan_unref); - priv->ageing_time = BRIDGE_AGEING_TIME_DEFAULT; - priv->forward_delay = BRIDGE_FORWARD_DELAY_DEFAULT; - priv->hello_time = BRIDGE_HELLO_TIME_DEFAULT; - priv->max_age = BRIDGE_MAX_AGE_DEFAULT; - priv->multicast_last_member_count = BRIDGE_MULTICAST_LAST_MEMBER_COUNT_DEFAULT; - priv->multicast_hash_max = BRIDGE_MULTICAST_HASH_MAX_DEFAULT; - priv->multicast_snooping = BRIDGE_MULTICAST_SNOOPING_DEFAULT; - priv->priority = BRIDGE_PRIORITY_DEFAULT; - priv->stp = BRIDGE_STP_DEFAULT; - priv->vlan_default_pvid = BRIDGE_VLAN_DEFAULT_PVID_DEFAULT; - priv->vlan_stats_enabled = BRIDGE_VLAN_STATS_ENABLED_DEFAULT; - priv->multicast_query_use_ifaddr = BRIDGE_MULTICAST_QUERY_USE_IFADDR_DEFAULT; - priv->multicast_querier = BRIDGE_MULTICAST_QUERIER_DEFAULT; + priv->ageing_time = BRIDGE_AGEING_TIME_DEFAULT; + priv->forward_delay = BRIDGE_FORWARD_DELAY_DEFAULT; + priv->hello_time = BRIDGE_HELLO_TIME_DEFAULT; + priv->max_age = BRIDGE_MAX_AGE_DEFAULT; + priv->multicast_last_member_count = BRIDGE_MULTICAST_LAST_MEMBER_COUNT_DEFAULT; + priv->multicast_last_member_interval = BRIDGE_MULTICAST_LAST_MEMBER_INTERVAL_DEFAULT; + priv->multicast_hash_max = BRIDGE_MULTICAST_HASH_MAX_DEFAULT; + priv->multicast_snooping = BRIDGE_MULTICAST_SNOOPING_DEFAULT; + priv->priority = BRIDGE_PRIORITY_DEFAULT; + priv->stp = BRIDGE_STP_DEFAULT; + priv->vlan_default_pvid = BRIDGE_VLAN_DEFAULT_PVID_DEFAULT; + priv->vlan_stats_enabled = BRIDGE_VLAN_STATS_ENABLED_DEFAULT; + priv->multicast_query_use_ifaddr = BRIDGE_MULTICAST_QUERY_USE_IFADDR_DEFAULT; + priv->multicast_querier = BRIDGE_MULTICAST_QUERIER_DEFAULT; } /** @@ -1949,6 +1975,28 @@ nm_setting_bridge_class_init (NMSettingBridgeClass *klass) NM_SETTING_PARAM_INFERRABLE | G_PARAM_STATIC_STRINGS); + /** + * NMSettingBridge:multicast-last-member-interval: + * + * Set interval (in deciseconds) between queries to find remaining + * members of a group, after a "leave" message is received. + **/ + /* ---ifcfg-rh--- + * property: multicast-last-member-interval + * variable: BRIDGING_OPTS: multicast_last_member_interval= + * default: 100 + * example: BRIDGING_OPTS="multicast_last_member_interval=200" + * ---end--- + * + * Since: 1.26 + */ + obj_properties[PROP_MULTICAST_LAST_MEMBER_INTERVAL] = + g_param_spec_uint64 (NM_SETTING_BRIDGE_MULTICAST_LAST_MEMBER_INTERVAL, "", "", + 0, G_MAXUINT64, BRIDGE_MULTICAST_LAST_MEMBER_INTERVAL_DEFAULT, + G_PARAM_READWRITE | + NM_SETTING_PARAM_INFERRABLE | + G_PARAM_STATIC_STRINGS); + g_object_class_install_properties (object_class, _PROPERTY_ENUMS_LAST, obj_properties); _nm_setting_class_commit_full (setting_class, NM_META_SETTING_TYPE_BRIDGE, diff --git a/libnm-core/nm-setting-bridge.h b/libnm-core/nm-setting-bridge.h index 1a1cacc966..ebf250ab20 100644 --- a/libnm-core/nm-setting-bridge.h +++ b/libnm-core/nm-setting-bridge.h @@ -33,6 +33,7 @@ G_BEGIN_DECLS #define NM_SETTING_BRIDGE_GROUP_FORWARD_MASK "group-forward-mask" #define NM_SETTING_BRIDGE_MULTICAST_HASH_MAX "multicast-hash-max" #define NM_SETTING_BRIDGE_MULTICAST_LAST_MEMBER_COUNT "multicast-last-member-count" +#define NM_SETTING_BRIDGE_MULTICAST_LAST_MEMBER_INTERVAL "multicast-last-member-interval" #define NM_SETTING_BRIDGE_MULTICAST_SNOOPING "multicast-snooping" #define NM_SETTING_BRIDGE_MULTICAST_ROUTER "multicast-router" #define NM_SETTING_BRIDGE_MULTICAST_QUERIER "multicast-querier" @@ -148,6 +149,9 @@ guint32 nm_setting_bridge_get_multicast_hash_max (const NMSettingBridge *setting NM_AVAILABLE_IN_1_26 guint32 nm_setting_bridge_get_multicast_last_member_count (const NMSettingBridge *setting); +NM_AVAILABLE_IN_1_26 +guint64 nm_setting_bridge_get_multicast_last_member_interval (const NMSettingBridge *setting); + G_END_DECLS #endif /* __NM_SETTING_BRIDGE_H__ */ diff --git a/libnm/libnm.ver b/libnm/libnm.ver index c141fd3f3e..46bcc452bc 100644 --- a/libnm/libnm.ver +++ b/libnm/libnm.ver @@ -1700,5 +1700,6 @@ libnm_1_26_0 { global: nm_setting_bridge_get_multicast_hash_max; nm_setting_bridge_get_multicast_last_member_count; + nm_setting_bridge_get_multicast_last_member_interval; nm_setting_connection_get_mud_url; } libnm_1_24_0; diff --git a/src/devices/nm-device-bridge.c b/src/devices/nm-device-bridge.c index 1c65e07b63..6db8f40928 100644 --- a/src/devices/nm-device-bridge.c +++ b/src/devices/nm-device-bridge.c @@ -237,79 +237,83 @@ typedef struct { const char *sysname; const char *(*to_sysfs) (GValue *value); void (*from_sysfs) (const char *value, GValue *out); - uint nm_min; - uint nm_max; - uint nm_default; + guint64 nm_min; + guint64 nm_max; + guint64 nm_default; bool default_if_zero; bool user_hz_compensate; bool only_with_stp; } Option; static const Option master_options[] = { - { NM_SETTING_BRIDGE_STP, "stp_state", /* this must stay as the first item */ - NULL, NULL, - 0, 1, 1, - FALSE, FALSE, FALSE }, - { NM_SETTING_BRIDGE_PRIORITY, "priority", - NULL, NULL, - 0, G_MAXUINT16, 0x8000, - TRUE, FALSE, TRUE }, - { NM_SETTING_BRIDGE_FORWARD_DELAY, "forward_delay", - NULL, NULL, - 0, NM_BR_MAX_FORWARD_DELAY, 15, - TRUE, TRUE, TRUE}, - { NM_SETTING_BRIDGE_HELLO_TIME, "hello_time", - NULL, NULL, - 0, NM_BR_MAX_HELLO_TIME, 2, - TRUE, TRUE, TRUE }, - { NM_SETTING_BRIDGE_MAX_AGE, "max_age", - NULL, NULL, - 0, NM_BR_MAX_MAX_AGE, 20, - TRUE, TRUE, TRUE }, - { NM_SETTING_BRIDGE_AGEING_TIME, "ageing_time", - NULL, NULL, - NM_BR_MIN_AGEING_TIME, NM_BR_MAX_AGEING_TIME, 300, - TRUE, TRUE, FALSE }, - { NM_SETTING_BRIDGE_GROUP_FORWARD_MASK, "group_fwd_mask", - NULL, NULL, - 0, 0xFFFF, 0, - TRUE, FALSE, FALSE }, - { NM_SETTING_BRIDGE_MULTICAST_HASH_MAX, "hash_max", - NULL, NULL, - NM_BR_MIN_MULTICAST_HASH_MAX, NM_BR_MAX_MULTICAST_HASH_MAX, 4096, - FALSE, FALSE, FALSE }, - { NM_SETTING_BRIDGE_MULTICAST_LAST_MEMBER_COUNT, "multicast_last_member_count", - NULL, NULL, - 0, G_MAXUINT32, 2, - FALSE, FALSE, FALSE }, - { NM_SETTING_BRIDGE_MULTICAST_QUERIER, "multicast_querier", - NULL, NULL, - 0, 1, 0, - FALSE, FALSE, FALSE }, - { NM_SETTING_BRIDGE_MULTICAST_QUERY_USE_IFADDR, "multicast_query_use_ifaddr", - NULL, NULL, - 0, 1, 0, - FALSE, FALSE, FALSE }, - { NM_SETTING_BRIDGE_MULTICAST_SNOOPING, "multicast_snooping", - NULL, NULL, - 0, 1, 1, - FALSE, FALSE, FALSE }, - { NM_SETTING_BRIDGE_MULTICAST_ROUTER, "multicast_router", - to_sysfs_multicast_router, from_sysfs_multicast_router, - 0, 0, 0, - FALSE, FALSE, FALSE }, - { NM_SETTING_BRIDGE_GROUP_ADDRESS, "group_addr", - to_sysfs_group_address, from_sysfs_group_address, - 0, 0, 0, - FALSE, FALSE, FALSE }, - { NM_SETTING_BRIDGE_VLAN_PROTOCOL, "vlan_protocol", - to_sysfs_vlan_protocol, from_sysfs_vlan_protocol, - 0, 0, 0, - FALSE, FALSE, FALSE }, - { NM_SETTING_BRIDGE_VLAN_STATS_ENABLED, "vlan_stats_enabled", - NULL, NULL, - 0, 1, 0, - FALSE, FALSE, FALSE }, + { NM_SETTING_BRIDGE_STP, "stp_state", /* this must stay as the first item */ + NULL, NULL, + 0, 1, 1, + FALSE, FALSE, FALSE }, + { NM_SETTING_BRIDGE_PRIORITY, "priority", + NULL, NULL, + 0, G_MAXUINT16, 0x8000, + TRUE, FALSE, TRUE }, + { NM_SETTING_BRIDGE_FORWARD_DELAY, "forward_delay", + NULL, NULL, + 0, NM_BR_MAX_FORWARD_DELAY, 15, + TRUE, TRUE, TRUE}, + { NM_SETTING_BRIDGE_HELLO_TIME, "hello_time", + NULL, NULL, + 0, NM_BR_MAX_HELLO_TIME, 2, + TRUE, TRUE, TRUE }, + { NM_SETTING_BRIDGE_MAX_AGE, "max_age", + NULL, NULL, + 0, NM_BR_MAX_MAX_AGE, 20, + TRUE, TRUE, TRUE }, + { NM_SETTING_BRIDGE_AGEING_TIME, "ageing_time", + NULL, NULL, + NM_BR_MIN_AGEING_TIME, NM_BR_MAX_AGEING_TIME, 300, + TRUE, TRUE, FALSE }, + { NM_SETTING_BRIDGE_GROUP_FORWARD_MASK, "group_fwd_mask", + NULL, NULL, + 0, 0xFFFF, 0, + TRUE, FALSE, FALSE }, + { NM_SETTING_BRIDGE_MULTICAST_HASH_MAX, "hash_max", + NULL, NULL, + NM_BR_MIN_MULTICAST_HASH_MAX, NM_BR_MAX_MULTICAST_HASH_MAX, 4096, + FALSE, FALSE, FALSE }, + { NM_SETTING_BRIDGE_MULTICAST_LAST_MEMBER_COUNT, "multicast_last_member_count", + NULL, NULL, + 0, G_MAXUINT32, 2, + FALSE, FALSE, FALSE }, + { NM_SETTING_BRIDGE_MULTICAST_LAST_MEMBER_INTERVAL, "multicast_last_member_interval", + NULL, NULL, + 0, G_MAXUINT64, 100, + FALSE, FALSE, FALSE }, + { NM_SETTING_BRIDGE_MULTICAST_QUERIER, "multicast_querier", + NULL, NULL, + 0, 1, 0, + FALSE, FALSE, FALSE }, + { NM_SETTING_BRIDGE_MULTICAST_QUERY_USE_IFADDR, "multicast_query_use_ifaddr", + NULL, NULL, + 0, 1, 0, + FALSE, FALSE, FALSE }, + { NM_SETTING_BRIDGE_MULTICAST_SNOOPING, "multicast_snooping", + NULL, NULL, + 0, 1, 1, + FALSE, FALSE, FALSE }, + { NM_SETTING_BRIDGE_MULTICAST_ROUTER, "multicast_router", + to_sysfs_multicast_router, from_sysfs_multicast_router, + 0, 0, 0, + FALSE, FALSE, FALSE }, + { NM_SETTING_BRIDGE_GROUP_ADDRESS, "group_addr", + to_sysfs_group_address, from_sysfs_group_address, + 0, 0, 0, + FALSE, FALSE, FALSE }, + { NM_SETTING_BRIDGE_VLAN_PROTOCOL, "vlan_protocol", + to_sysfs_vlan_protocol, from_sysfs_vlan_protocol, + 0, 0, 0, + FALSE, FALSE, FALSE }, + { NM_SETTING_BRIDGE_VLAN_STATS_ENABLED, "vlan_stats_enabled", + NULL, NULL, + 0, 1, 0, + FALSE, FALSE, FALSE }, { NULL, NULL } }; @@ -357,11 +361,15 @@ commit_option (NMDevice *device, NMSetting *setting, const Option *option, gbool case G_TYPE_BOOLEAN: value = g_value_get_boolean (&val) ? "1" : "0"; break; + case G_TYPE_UINT64: case G_TYPE_UINT: { char value_buf[100]; - guint uval; + guint64 uval; - uval = g_value_get_uint (&val); + if (pspec->value_type == G_TYPE_UINT64) + uval = g_value_get_uint64 (&val); + else + uval = (guint) g_value_get_uint (&val); /* zero means "unspecified" for some NM properties but isn't in the * allowed kernel range, so reset the property to the default value. @@ -370,7 +378,11 @@ commit_option (NMDevice *device, NMSetting *setting, const Option *option, gbool g_value_unset (&val); g_value_init (&val, G_PARAM_SPEC_VALUE_TYPE (pspec)); g_param_value_set_default (pspec, &val); - uval = g_value_get_uint (&val); + + if (pspec->value_type == G_TYPE_UINT64) + uval = g_value_get_uint64 (&val); + else + uval = (guint) g_value_get_uint (&val); } /* Linux kernel bridge interfaces use 'centiseconds' for time-based values. @@ -381,7 +393,11 @@ commit_option (NMDevice *device, NMSetting *setting, const Option *option, gbool if (option->user_hz_compensate) uval *= 100; - nm_sprintf_buf (value_buf, "%u", uval); + if (pspec->value_type == G_TYPE_UINT64) + nm_sprintf_buf (value_buf, "%"G_GUINT64_FORMAT, uval); + else + nm_sprintf_buf (value_buf, "%u", (guint) uval); + value = value_buf; } break; @@ -507,8 +523,9 @@ update_connection (NMDevice *device, NMConnection *connection) } switch (pspec->value_type) { + case G_TYPE_UINT64: case G_TYPE_UINT: { - guint uvalue; + guint64 uvalue; /* See comments in set_sysfs_uint() about centiseconds. */ if (option->user_hz_compensate) { @@ -518,12 +535,16 @@ update_connection (NMDevice *device, NMConnection *connection) option->nm_default * 100); uvalue /= 100; } else { - uvalue = _nm_utils_ascii_str_to_int64 (str, 10, - option->nm_min, - option->nm_max, - option->nm_default); + uvalue = _nm_utils_ascii_str_to_uint64 (str, 10, + option->nm_min, + option->nm_max, + option->nm_default); } - g_value_set_uint (&value, uvalue); + + if (pspec->value_type == G_TYPE_UINT64) + g_value_set_uint64(&value, uvalue); + else + g_value_set_uint (&value, (guint) uvalue); } break; case G_TYPE_BOOLEAN: { diff --git a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c index deaa94947d..e976f8a352 100644 --- a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c +++ b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c @@ -5157,26 +5157,27 @@ handle_bridge_option (NMSetting *setting, gboolean only_with_stp; gboolean extended_bool; } m/*etadata*/[] = { - { "DELAY", NM_SETTING_BRIDGE_FORWARD_DELAY, BRIDGE_OPT_TYPE_MAIN, .only_with_stp = TRUE }, - { "priority", NM_SETTING_BRIDGE_PRIORITY, BRIDGE_OPT_TYPE_OPTION, .only_with_stp = TRUE }, - { "hello_time", NM_SETTING_BRIDGE_HELLO_TIME, BRIDGE_OPT_TYPE_OPTION, .only_with_stp = TRUE }, - { "max_age", NM_SETTING_BRIDGE_MAX_AGE, BRIDGE_OPT_TYPE_OPTION, .only_with_stp = TRUE }, - { "ageing_time", NM_SETTING_BRIDGE_AGEING_TIME, BRIDGE_OPT_TYPE_OPTION }, - { "multicast_last_member_count", NM_SETTING_BRIDGE_MULTICAST_LAST_MEMBER_COUNT, BRIDGE_OPT_TYPE_OPTION }, - { "multicast_hash_max", NM_SETTING_BRIDGE_MULTICAST_HASH_MAX, BRIDGE_OPT_TYPE_OPTION }, - { "multicast_querier", NM_SETTING_BRIDGE_MULTICAST_QUERIER, BRIDGE_OPT_TYPE_OPTION }, - { "multicast_query_use_ifaddr", NM_SETTING_BRIDGE_MULTICAST_QUERY_USE_IFADDR, BRIDGE_OPT_TYPE_OPTION }, - { "multicast_snooping", NM_SETTING_BRIDGE_MULTICAST_SNOOPING, BRIDGE_OPT_TYPE_OPTION }, - { "multicast_router", NM_SETTING_BRIDGE_MULTICAST_ROUTER, BRIDGE_OPT_TYPE_OPTION }, - { "vlan_filtering", NM_SETTING_BRIDGE_VLAN_FILTERING, BRIDGE_OPT_TYPE_OPTION }, - { "default_pvid", NM_SETTING_BRIDGE_VLAN_DEFAULT_PVID, BRIDGE_OPT_TYPE_OPTION }, - { "group_address", NM_SETTING_BRIDGE_GROUP_ADDRESS, BRIDGE_OPT_TYPE_OPTION }, - { "group_fwd_mask", NM_SETTING_BRIDGE_GROUP_FORWARD_MASK, BRIDGE_OPT_TYPE_OPTION }, - { "vlan_protocol", NM_SETTING_BRIDGE_VLAN_PROTOCOL, BRIDGE_OPT_TYPE_OPTION }, - { "vlan_stats_enabled", NM_SETTING_BRIDGE_VLAN_STATS_ENABLED, BRIDGE_OPT_TYPE_OPTION }, - { "priority", NM_SETTING_BRIDGE_PORT_PRIORITY, BRIDGE_OPT_TYPE_PORT_OPTION }, - { "path_cost", NM_SETTING_BRIDGE_PORT_PATH_COST, BRIDGE_OPT_TYPE_PORT_OPTION }, - { "hairpin_mode", NM_SETTING_BRIDGE_PORT_HAIRPIN_MODE, BRIDGE_OPT_TYPE_PORT_OPTION, .extended_bool = TRUE, }, + { "DELAY", NM_SETTING_BRIDGE_FORWARD_DELAY, BRIDGE_OPT_TYPE_MAIN, .only_with_stp = TRUE }, + { "priority", NM_SETTING_BRIDGE_PRIORITY, BRIDGE_OPT_TYPE_OPTION, .only_with_stp = TRUE }, + { "hello_time", NM_SETTING_BRIDGE_HELLO_TIME, BRIDGE_OPT_TYPE_OPTION, .only_with_stp = TRUE }, + { "max_age", NM_SETTING_BRIDGE_MAX_AGE, BRIDGE_OPT_TYPE_OPTION, .only_with_stp = TRUE }, + { "ageing_time", NM_SETTING_BRIDGE_AGEING_TIME, BRIDGE_OPT_TYPE_OPTION }, + { "multicast_last_member_count", NM_SETTING_BRIDGE_MULTICAST_LAST_MEMBER_COUNT, BRIDGE_OPT_TYPE_OPTION }, + { "multicast_last_member_interval", NM_SETTING_BRIDGE_MULTICAST_LAST_MEMBER_INTERVAL, BRIDGE_OPT_TYPE_OPTION }, + { "multicast_hash_max", NM_SETTING_BRIDGE_MULTICAST_HASH_MAX, BRIDGE_OPT_TYPE_OPTION }, + { "multicast_querier", NM_SETTING_BRIDGE_MULTICAST_QUERIER, BRIDGE_OPT_TYPE_OPTION }, + { "multicast_query_use_ifaddr", NM_SETTING_BRIDGE_MULTICAST_QUERY_USE_IFADDR, BRIDGE_OPT_TYPE_OPTION }, + { "multicast_snooping", NM_SETTING_BRIDGE_MULTICAST_SNOOPING, BRIDGE_OPT_TYPE_OPTION }, + { "multicast_router", NM_SETTING_BRIDGE_MULTICAST_ROUTER, BRIDGE_OPT_TYPE_OPTION }, + { "vlan_filtering", NM_SETTING_BRIDGE_VLAN_FILTERING, BRIDGE_OPT_TYPE_OPTION }, + { "default_pvid", NM_SETTING_BRIDGE_VLAN_DEFAULT_PVID, BRIDGE_OPT_TYPE_OPTION }, + { "group_address", NM_SETTING_BRIDGE_GROUP_ADDRESS, BRIDGE_OPT_TYPE_OPTION }, + { "group_fwd_mask", NM_SETTING_BRIDGE_GROUP_FORWARD_MASK, BRIDGE_OPT_TYPE_OPTION }, + { "vlan_protocol", NM_SETTING_BRIDGE_VLAN_PROTOCOL, BRIDGE_OPT_TYPE_OPTION }, + { "vlan_stats_enabled", NM_SETTING_BRIDGE_VLAN_STATS_ENABLED, BRIDGE_OPT_TYPE_OPTION }, + { "priority", NM_SETTING_BRIDGE_PORT_PRIORITY, BRIDGE_OPT_TYPE_PORT_OPTION }, + { "path_cost", NM_SETTING_BRIDGE_PORT_PATH_COST, BRIDGE_OPT_TYPE_PORT_OPTION }, + { "hairpin_mode", NM_SETTING_BRIDGE_PORT_HAIRPIN_MODE, BRIDGE_OPT_TYPE_PORT_OPTION, .extended_bool = TRUE, }, }; const char *error_message = NULL; int i; @@ -5229,6 +5230,16 @@ handle_bridge_option (NMSetting *setting, goto warn; } return; + case G_TYPE_UINT64: { + guint64 vu64; + + vu64 = _nm_utils_ascii_str_to_uint64 (value, 10, 0, G_MAXUINT64, 0); + if (!nm_g_object_set_property_uint64 (G_OBJECT (setting), m[i].property_name, vu64, NULL)) { + error_message = "number is out of range"; + goto warn; + } + } + return; case G_TYPE_STRING: nm_g_object_set_property_string (G_OBJECT (setting), m[i].property_name, value, NULL); return; diff --git a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c index d1c8416d83..66850dfc21 100644 --- a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c +++ b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c @@ -1379,6 +1379,23 @@ get_setting_default_uint (NMSetting *setting, const char *prop) return ret; } +static guint64 +get_setting_default_uint64 (NMSetting *setting, const char *prop) +{ + GParamSpec *pspec; + GValue val = G_VALUE_INIT; + guint32 ret = 0; + + pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (setting), prop); + g_assert (pspec); + g_value_init (&val, pspec->value_type); + g_param_value_set_default (pspec, &val); + g_assert (G_VALUE_HOLDS_UINT64 (&val)); + ret = g_value_get_uint64 (&val); + g_value_unset (&val); + return ret; +} + static gboolean get_setting_default_boolean (NMSetting *setting, const char *prop) { @@ -1437,6 +1454,7 @@ write_bridge_setting (NMConnection *connection, shvarFile *ifcfg, gboolean *wire { NMSettingBridge *s_bridge; guint32 i; + guint64 u64; gboolean b; const char *s; GString *opts; @@ -1516,6 +1534,13 @@ write_bridge_setting (NMConnection *connection, shvarFile *ifcfg, gboolean *wire g_string_append_printf (opts, "multicast_last_member_count=%u", i); } + u64 = nm_setting_bridge_get_multicast_last_member_interval (s_bridge); + if (u64 != get_setting_default_uint64 (NM_SETTING (s_bridge), NM_SETTING_BRIDGE_MULTICAST_LAST_MEMBER_INTERVAL)) { + if (opts->len) + g_string_append_c (opts, ' '); + g_string_append_printf (opts, "multicast_last_member_interval=%"G_GUINT64_FORMAT, u64); + } + b = nm_setting_bridge_get_multicast_querier (s_bridge); if (b != get_setting_default_boolean (NM_SETTING (s_bridge), NM_SETTING_BRIDGE_MULTICAST_QUERIER)) { if (opts->len)