diff options
| author | Michael Biebl <biebl@debian.org> | 2020-06-28 18:58:14 +0200 |
|---|---|---|
| committer | Michael Biebl <biebl@debian.org> | 2020-06-28 18:58:14 +0200 |
| commit | a54ac63bbf9b2c71026ac9028a8ffaf186cf3c82 (patch) | |
| tree | 6a32883bd916c4096357b35298beff6db8bcd0b5 /src/devices/nm-device-bridge.c | |
| parent | 45e8e1149027529194982212c804c0468aa01d98 (diff) | |
New upstream version 1.25.90 upstream/1.25.90
Diffstat (limited to 'src/devices/nm-device-bridge.c')
| -rw-r--r-- | src/devices/nm-device-bridge.c | 256 |
1 files changed, 169 insertions, 87 deletions
diff --git a/src/devices/nm-device-bridge.c b/src/devices/nm-device-bridge.c index c93c6a54..544e6614 100644 --- a/src/devices/nm-device-bridge.c +++ b/src/devices/nm-device-bridge.c @@ -237,88 +237,156 @@ 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; +#define OPTION(_name, _sysname, ...) \ + { \ + .name = ""_name"", \ + .sysname = ""_sysname"", \ + __VA_ARGS__ \ + } + +#define OPTION_TYPE_INT(min, max, def) \ + .nm_min = (min), .nm_max = (max), .nm_default = (def) + +#define OPTION_TYPE_BOOL(def) \ + OPTION_TYPE_INT (FALSE, TRUE, def) + +#define OPTION_TYPE_TOFROM(to, fro) \ + .to_sysfs = (to), .from_sysfs = (fro) + 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_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 } + OPTION (NM_SETTING_BRIDGE_STP, /* this must stay as the first item */ + "stp_state", + OPTION_TYPE_BOOL (NM_BRIDGE_STP_DEF), + ), + OPTION (NM_SETTING_BRIDGE_PRIORITY, + "priority", + OPTION_TYPE_INT (NM_BRIDGE_PRIORITY_MIN, NM_BRIDGE_PRIORITY_MAX, NM_BRIDGE_PRIORITY_DEF), + .default_if_zero = TRUE, + .only_with_stp = TRUE, + ), + OPTION (NM_SETTING_BRIDGE_FORWARD_DELAY, + "forward_delay", + OPTION_TYPE_INT (NM_BRIDGE_FORWARD_DELAY_MIN, NM_BRIDGE_FORWARD_DELAY_MAX, NM_BRIDGE_FORWARD_DELAY_DEF), + .default_if_zero = TRUE, + .user_hz_compensate = TRUE, + .only_with_stp = TRUE, + ), + OPTION (NM_SETTING_BRIDGE_HELLO_TIME, + "hello_time", + OPTION_TYPE_INT (NM_BRIDGE_HELLO_TIME_MIN, NM_BRIDGE_HELLO_TIME_MAX, NM_BRIDGE_HELLO_TIME_DEF), + .default_if_zero = TRUE, + .user_hz_compensate = TRUE, + .only_with_stp = TRUE, + ), + OPTION (NM_SETTING_BRIDGE_MAX_AGE, + "max_age", + OPTION_TYPE_INT (NM_BRIDGE_MAX_AGE_MIN, NM_BRIDGE_MAX_AGE_MAX, NM_BRIDGE_MAX_AGE_DEF), + .default_if_zero = TRUE, + .user_hz_compensate = TRUE, + .only_with_stp = TRUE, + ), + OPTION (NM_SETTING_BRIDGE_AGEING_TIME, + "ageing_time", + OPTION_TYPE_INT (NM_BRIDGE_AGEING_TIME_MIN, NM_BRIDGE_AGEING_TIME_MAX, NM_BRIDGE_AGEING_TIME_DEF), + .default_if_zero = TRUE, + .user_hz_compensate = TRUE, + ), + OPTION (NM_SETTING_BRIDGE_GROUP_FORWARD_MASK, + "group_fwd_mask", + OPTION_TYPE_INT (0, 0xFFFF, 0), + .default_if_zero = TRUE, + ), + OPTION (NM_SETTING_BRIDGE_MULTICAST_HASH_MAX, + "hash_max", + OPTION_TYPE_INT (NM_BRIDGE_MULTICAST_HASH_MAX_MIN, NM_BRIDGE_MULTICAST_HASH_MAX_MAX, NM_BRIDGE_MULTICAST_HASH_MAX_DEF), + ), + OPTION (NM_SETTING_BRIDGE_MULTICAST_LAST_MEMBER_COUNT, + "multicast_last_member_count", + OPTION_TYPE_INT (NM_BRIDGE_MULTICAST_LAST_MEMBER_COUNT_MIN, NM_BRIDGE_MULTICAST_LAST_MEMBER_COUNT_MAX, NM_BRIDGE_MULTICAST_LAST_MEMBER_COUNT_DEF), + ), + OPTION (NM_SETTING_BRIDGE_MULTICAST_LAST_MEMBER_INTERVAL, + "multicast_last_member_interval", + OPTION_TYPE_INT (NM_BRIDGE_MULTICAST_LAST_MEMBER_INTERVAL_MIN, NM_BRIDGE_MULTICAST_LAST_MEMBER_INTERVAL_MAX, NM_BRIDGE_MULTICAST_LAST_MEMBER_INTERVAL_DEF), + ), + OPTION (NM_SETTING_BRIDGE_MULTICAST_MEMBERSHIP_INTERVAL, + "multicast_membership_interval", + OPTION_TYPE_INT (NM_BRIDGE_MULTICAST_MEMBERSHIP_INTERVAL_MIN, NM_BRIDGE_MULTICAST_MEMBERSHIP_INTERVAL_MAX, NM_BRIDGE_MULTICAST_MEMBERSHIP_INTERVAL_DEF), + ), + OPTION (NM_SETTING_BRIDGE_MULTICAST_QUERIER, + "multicast_querier", + OPTION_TYPE_BOOL (NM_BRIDGE_MULTICAST_QUERIER_DEF), + ), + OPTION (NM_SETTING_BRIDGE_MULTICAST_QUERIER_INTERVAL, + "multicast_querier_interval", + OPTION_TYPE_INT (NM_BRIDGE_MULTICAST_QUERIER_INTERVAL_MIN, NM_BRIDGE_MULTICAST_QUERIER_INTERVAL_MAX, NM_BRIDGE_MULTICAST_QUERIER_INTERVAL_DEF), + ), + OPTION (NM_SETTING_BRIDGE_MULTICAST_QUERY_INTERVAL, + "multicast_query_interval", + OPTION_TYPE_INT (NM_BRIDGE_MULTICAST_QUERY_INTERVAL_MIN, NM_BRIDGE_MULTICAST_QUERY_INTERVAL_MAX, NM_BRIDGE_MULTICAST_QUERY_INTERVAL_DEF), + ), + OPTION (NM_SETTING_BRIDGE_MULTICAST_QUERY_RESPONSE_INTERVAL, + "multicast_query_response_interval", + OPTION_TYPE_INT (NM_BRIDGE_MULTICAST_QUERY_RESPONSE_INTERVAL_MIN, NM_BRIDGE_MULTICAST_QUERY_RESPONSE_INTERVAL_MAX, NM_BRIDGE_MULTICAST_QUERY_RESPONSE_INTERVAL_DEF), + ), + OPTION (NM_SETTING_BRIDGE_MULTICAST_QUERY_USE_IFADDR, + "multicast_query_use_ifaddr", + OPTION_TYPE_BOOL (NM_BRIDGE_MULTICAST_QUERY_USE_IFADDR_DEF), + ), + OPTION (NM_SETTING_BRIDGE_MULTICAST_SNOOPING, + "multicast_snooping", + OPTION_TYPE_BOOL (NM_BRIDGE_MULTICAST_SNOOPING_DEF), + ), + OPTION (NM_SETTING_BRIDGE_MULTICAST_ROUTER, + "multicast_router", + OPTION_TYPE_TOFROM (to_sysfs_multicast_router, from_sysfs_multicast_router), + ), + OPTION (NM_SETTING_BRIDGE_MULTICAST_STARTUP_QUERY_COUNT, + "multicast_startup_query_count", + OPTION_TYPE_INT (NM_BRIDGE_MULTICAST_STARTUP_QUERY_COUNT_MIN, NM_BRIDGE_MULTICAST_STARTUP_QUERY_COUNT_MAX, NM_BRIDGE_MULTICAST_STARTUP_QUERY_COUNT_DEF), + ), + OPTION (NM_SETTING_BRIDGE_MULTICAST_STARTUP_QUERY_INTERVAL, + "multicast_startup_query_interval", + OPTION_TYPE_INT (NM_BRIDGE_MULTICAST_STARTUP_QUERY_INTERVAL_MIN, NM_BRIDGE_MULTICAST_STARTUP_QUERY_INTERVAL_MAX, NM_BRIDGE_MULTICAST_STARTUP_QUERY_INTERVAL_DEF), + ), + OPTION (NM_SETTING_BRIDGE_GROUP_ADDRESS, + "group_addr", + OPTION_TYPE_TOFROM (to_sysfs_group_address, from_sysfs_group_address), + ), + OPTION (NM_SETTING_BRIDGE_VLAN_PROTOCOL, + "vlan_protocol", + OPTION_TYPE_TOFROM (to_sysfs_vlan_protocol, from_sysfs_vlan_protocol), + ), + OPTION (NM_SETTING_BRIDGE_VLAN_STATS_ENABLED, + "vlan_stats_enabled", + OPTION_TYPE_BOOL (NM_BRIDGE_VLAN_STATS_ENABLED_DEF) + ), + { 0, } }; static const Option slave_options[] = { - { NM_SETTING_BRIDGE_PORT_PRIORITY, "priority", - NULL, NULL, - 0, NM_BR_PORT_MAX_PRIORITY, NM_BR_PORT_DEF_PRIORITY, - TRUE, FALSE }, - { NM_SETTING_BRIDGE_PORT_PATH_COST, "path_cost", - NULL, NULL, - 0, NM_BR_PORT_MAX_PATH_COST, 100, - TRUE, FALSE }, - { NM_SETTING_BRIDGE_PORT_HAIRPIN_MODE, "hairpin_mode", - NULL, NULL, - 0, 1, 0, - FALSE, FALSE }, - { NULL, NULL } + OPTION (NM_SETTING_BRIDGE_PORT_PRIORITY, + "priority", + OPTION_TYPE_INT (NM_BRIDGE_PORT_PRIORITY_MIN, NM_BRIDGE_PORT_PRIORITY_MAX, NM_BRIDGE_PORT_PRIORITY_DEF), + .default_if_zero = TRUE, + ), + OPTION (NM_SETTING_BRIDGE_PORT_PATH_COST, + "path_cost", + OPTION_TYPE_INT (NM_BRIDGE_PORT_PATH_COST_MIN, NM_BRIDGE_PORT_PATH_COST_MAX, NM_BRIDGE_PORT_PATH_COST_DEF), + .default_if_zero = TRUE, + ), + OPTION (NM_SETTING_BRIDGE_PORT_HAIRPIN_MODE, + "hairpin_mode", + OPTION_TYPE_BOOL (FALSE), + ), + { 0 } }; static void @@ -350,19 +418,24 @@ 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: { - 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. */ - if (option->default_if_zero && uval == 0) { - 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 ( option->default_if_zero + && uval == 0) { + if (pspec->value_type == G_TYPE_UINT64) + uval = NM_G_PARAM_SPEC_GET_DEFAULT_UINT64 (pspec); + else + uval = NM_G_PARAM_SPEC_GET_DEFAULT_UINT (pspec); } /* Linux kernel bridge interfaces use 'centiseconds' for time-based values. @@ -373,7 +446,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; @@ -499,8 +576,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) { @@ -510,12 +588,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: { |