From 3e34e404b475cd44fea7448e9b2b5176de709ef8 Mon Sep 17 00:00:00 2001 From: Francesco Giudici Date: Wed, 8 Nov 2017 18:10:27 +0100 Subject: libnm-core: enforce team and team-port defaults Rework a bit the way default values are check, set and aligned. --- libnm-core/nm-setting-team-port.c | 26 ++++++++++----------- libnm-core/nm-setting-team-port.h | 3 +++ libnm-core/nm-setting-team.c | 49 +++++++++++++++++++++++---------------- libnm-core/nm-setting-team.h | 8 +++++++ libnm-core/nm-utils-private.h | 31 ++++++++++++++++--------- libnm-core/nm-utils.c | 14 ++++++----- 6 files changed, 81 insertions(+), 50 deletions(-) diff --git a/libnm-core/nm-setting-team-port.c b/libnm-core/nm-setting-team-port.c index 09b0ca8036..9886cdc91e 100644 --- a/libnm-core/nm-setting-team-port.c +++ b/libnm-core/nm-setting-team-port.c @@ -68,13 +68,13 @@ enum { /* Keep aligned with team-port properties enum */ static const _NMUtilsTeamPropertyKeys _prop_to_keys[LAST_PROP] = { - [PROP_0] = { NULL, NULL, NULL }, - [PROP_CONFIG] = { NULL, NULL, NULL }, - [PROP_QUEUE_ID] = { "queue_id", NULL, NULL }, - [PROP_PRIO] = { "prio", NULL, NULL }, - [PROP_STICKY] = { "sticky", NULL, NULL }, - [PROP_LACP_PRIO] = { "lacp_prio", NULL, NULL }, - [PROP_LACP_KEY] = { "lacp_key", NULL, NULL }, + [PROP_0] = { NULL, NULL, NULL, 0 }, + [PROP_CONFIG] = { NULL, NULL, NULL, 0 }, + [PROP_QUEUE_ID] = { "queue_id", NULL, NULL, NM_SETTING_TEAM_PORT_QUEUE_ID_DEFAULT }, + [PROP_PRIO] = { "prio", NULL, NULL, 0 }, + [PROP_STICKY] = { "sticky", NULL, NULL, 0 }, + [PROP_LACP_PRIO] = { "lacp_prio", NULL, NULL, NM_SETTING_TEAM_PORT_LACP_PRIO_DEFAULT }, + [PROP_LACP_KEY] = { "lacp_key", NULL, NULL, 0 }, }; @@ -276,11 +276,11 @@ nm_setting_team_port_init (NMSettingTeamPort *setting) { NMSettingTeamPortPrivate *priv = NM_SETTING_TEAM_PORT_GET_PRIVATE (setting); - priv->queue_id = -1; - priv->lacp_prio = 255; + priv->queue_id = NM_SETTING_TEAM_PORT_QUEUE_ID_DEFAULT; + priv->lacp_prio = NM_SETTING_TEAM_PORT_LACP_PRIO_DEFAULT; } -#define JSON_TO_VAL(typ, id) _nm_utils_json_extract_##typ (priv->config, _prop_to_keys[id]) +#define JSON_TO_VAL(typ, id) _nm_utils_json_extract_##typ (priv->config, _prop_to_keys[id], TRUE) static void set_property (GObject *object, guint prop_id, @@ -304,7 +304,7 @@ set_property (GObject *object, guint prop_id, if (priv->queue_id == g_value_get_int (value)) break; priv->queue_id = g_value_get_int (value); - if (priv->queue_id > -1) + if (priv->queue_id != NM_SETTING_TEAM_PORT_QUEUE_ID_DEFAULT) align_value = value; align_config = TRUE; break; @@ -329,7 +329,7 @@ set_property (GObject *object, guint prop_id, break; priv->lacp_prio = g_value_get_int (value); /* from libteam sources: lacp_prio default value is 0xff */ - if (priv->lacp_prio != 255) + if (priv->lacp_prio != NM_SETTING_TEAM_PORT_LACP_PRIO_DEFAULT) align_value = value; align_config = TRUE; break; @@ -337,7 +337,7 @@ set_property (GObject *object, guint prop_id, if (priv->lacp_key == g_value_get_int (value)) break; priv->lacp_key = g_value_get_int (value); - if (priv->lacp_key > 0) + if (priv->lacp_key) align_value = value; align_config = TRUE; break; diff --git a/libnm-core/nm-setting-team-port.h b/libnm-core/nm-setting-team-port.h index fbb772d1a1..2643daba3c 100644 --- a/libnm-core/nm-setting-team-port.h +++ b/libnm-core/nm-setting-team-port.h @@ -45,6 +45,9 @@ G_BEGIN_DECLS #define NM_SETTING_TEAM_PORT_LACP_PRIO "lacp-prio" #define NM_SETTING_TEAM_PORT_LACP_KEY "lacp-key" +#define NM_SETTING_TEAM_PORT_QUEUE_ID_DEFAULT -1 +#define NM_SETTING_TEAM_PORT_LACP_PRIO_DEFAULT 255 + /** * NMSettingTeamPort: * diff --git a/libnm-core/nm-setting-team.c b/libnm-core/nm-setting-team.c index efeab675f0..884c370716 100644 --- a/libnm-core/nm-setting-team.c +++ b/libnm-core/nm-setting-team.c @@ -83,22 +83,26 @@ enum { /* Keep aligned with team properties enum */ static const _NMUtilsTeamPropertyKeys _prop_to_keys[LAST_PROP] = { - [PROP_0] = { NULL, NULL, NULL }, - [PROP_CONFIG] = { NULL, NULL, NULL }, - [PROP_NOTIFY_PEERS_COUNT] = { "notify_peers", "count", NULL }, - [PROP_NOTIFY_PEERS_INTERVAL] = { "notify_peers", "interval", NULL }, - [PROP_MCAST_REJOIN_COUNT] = { "mcast_rejoin", "count", NULL }, - [PROP_MCAST_REJOIN_INTERVAL] = { "mcast_rejoin", "interval", NULL }, - [PROP_RUNNER] = { "runner", "name", NULL }, - [PROP_RUNNER_HWADDR_POLICY] = { "runner", "hwaddr_policy", NULL }, - [PROP_RUNNER_TX_HASH] = { "runner", "tx_hash", NULL }, - [PROP_RUNNER_TX_BALANCER] = { "runner", "tx_balancer", "name" }, - [PROP_RUNNER_TX_BALANCER_INTERVAL] = { "runner", "tx_balancer", "interval" }, - [PROP_RUNNER_ACTIVE] = { "runner", "active", NULL }, - [PROP_RUNNER_FAST_RATE] = { "runner", "fast_rate", NULL }, - [PROP_RUNNER_SYS_PRIO] = { "runner", "sys_prio", NULL }, - [PROP_RUNNER_MIN_PORTS] = { "runner", "min_ports", NULL }, - [PROP_RUNNER_AGG_SELECT_POLICY] = { "runner", "agg_select_policy", NULL }, + [PROP_0] = { NULL, NULL, NULL, 0 }, + [PROP_CONFIG] = { NULL, NULL, NULL, 0 }, + [PROP_NOTIFY_PEERS_COUNT] = { "notify_peers", "count", NULL, 0 }, + [PROP_NOTIFY_PEERS_INTERVAL] = { "notify_peers", "interval", NULL, 0 }, + [PROP_MCAST_REJOIN_COUNT] = { "mcast_rejoin", "count", NULL, 0 }, + [PROP_MCAST_REJOIN_INTERVAL] = { "mcast_rejoin", "interval", NULL, 0 }, + [PROP_RUNNER] = { "runner", "name", NULL, + {.default_str = NM_SETTING_TEAM_RUNNER_DEFAULT} }, + [PROP_RUNNER_HWADDR_POLICY] = { "runner", "hwaddr_policy", NULL, 0 }, + [PROP_RUNNER_TX_HASH] = { "runner", "tx_hash", NULL, 0 }, + [PROP_RUNNER_TX_BALANCER] = { "runner", "tx_balancer", "name", 0 }, + [PROP_RUNNER_TX_BALANCER_INTERVAL] = { "runner", "tx_balancer", "interval", + NM_SETTING_TEAM_RUNNER_TX_BALANCER_INTERVAL_DEFAULT }, + [PROP_RUNNER_ACTIVE] = { "runner", "active", NULL, 0 }, + [PROP_RUNNER_FAST_RATE] = { "runner", "fast_rate", NULL, 0 }, + [PROP_RUNNER_SYS_PRIO] = { "runner", "sys_prio", NULL, + NM_SETTING_TEAM_RUNNER_SYS_PRIO_DEFAULT }, + [PROP_RUNNER_MIN_PORTS] = { "runner", "min_ports", NULL, 0 }, + [PROP_RUNNER_AGG_SELECT_POLICY] = { "runner", "agg_select_policy", NULL, + {.default_str = NM_SETTING_TEAM_RUNNER_AGG_SELECT_POLICY_DEFAULT} }, }; /** @@ -540,6 +544,8 @@ nm_setting_team_init (NMSettingTeam *setting) NMSettingTeamPrivate *priv = NM_SETTING_TEAM_GET_PRIVATE (setting); priv->runner = g_strdup (NM_SETTING_TEAM_RUNNER_ROUNDROBIN); + priv->runner_sys_prio = NM_SETTING_TEAM_RUNNER_SYS_PRIO_DEFAULT; + priv->runner_tx_balancer_interval = NM_SETTING_TEAM_RUNNER_TX_BALANCER_INTERVAL_DEFAULT; } static void @@ -559,7 +565,7 @@ finalize (GObject *object) } -#define JSON_TO_VAL(typ, id) _nm_utils_json_extract_##typ (priv->config, _prop_to_keys[id]) +#define JSON_TO_VAL(typ, id) _nm_utils_json_extract_##typ (priv->config, _prop_to_keys[id], FALSE) static void _align_team_properties (NMSettingTeam *setting) @@ -651,7 +657,9 @@ set_property (GObject *object, guint prop_id, case PROP_RUNNER: g_free (priv->runner); priv->runner = g_value_dup_string (value); - if (priv->runner && !nm_streq (priv->runner, "roundrobin")) + if ( priv->runner + && !nm_streq (priv->runner, + NM_SETTING_TEAM_RUNNER_DEFAULT)) align_value = value; align_config = TRUE; break; @@ -687,7 +695,8 @@ set_property (GObject *object, guint prop_id, if (priv->runner_tx_balancer_interval == g_value_get_int (value)) break; priv->runner_tx_balancer_interval = g_value_get_int (value); - if (priv->runner_tx_balancer_interval) + if (priv->runner_tx_balancer_interval != + NM_SETTING_TEAM_RUNNER_TX_BALANCER_INTERVAL_DEFAULT) align_value = value; align_config = TRUE; break; @@ -711,7 +720,7 @@ set_property (GObject *object, guint prop_id, if (priv->runner_sys_prio == g_value_get_int (value)) break; priv->runner_sys_prio = g_value_get_int (value); - if (priv->runner_sys_prio) + if (priv->runner_sys_prio != NM_SETTING_TEAM_RUNNER_SYS_PRIO_DEFAULT) align_value = value; align_config = TRUE; break; diff --git a/libnm-core/nm-setting-team.h b/libnm-core/nm-setting-team.h index 80ec5f1569..18811374d0 100644 --- a/libnm-core/nm-setting-team.h +++ b/libnm-core/nm-setting-team.h @@ -70,6 +70,14 @@ G_BEGIN_DECLS #define NM_SETTING_TEAM_RUNNER_AGG_SELECT_POLICY_COUNT "count" #define NM_SETTING_TEAM_RUNNER_AGG_SELECT_POLICY_PORT_CONFIG "port_config" +#define NM_SETTING_TEAM_NOTIFY_PEERS_COUNT_ACTIVEBACKUP_DEFAULT 1 +#define NM_SETTING_TEAM_NOTIFY_MCAST_COUNT_ACTIVEBACKUP_DEFAULT 1 +#define NM_SETTING_TEAM_RUNNER_DEFAULT NM_SETTING_TEAM_RUNNER_ROUNDROBIN +#define NM_SETTING_TEAM_RUNNER_HWADDR_POLICY_DEFAULT NM_SETTING_TEAM_RUNNER_HWADDR_POLICY_SAME_ALL +#define NM_SETTING_TEAM_RUNNER_TX_BALANCER_INTERVAL_DEFAULT 50 +#define NM_SETTING_TEAM_RUNNER_SYS_PRIO_DEFAULT 255 +#define NM_SETTING_TEAM_RUNNER_AGG_SELECT_POLICY_DEFAULT NM_SETTING_TEAM_RUNNER_AGG_SELECT_POLICY_LACP_PRIO + /** * NMSettingTeam: * diff --git a/libnm-core/nm-utils-private.h b/libnm-core/nm-utils-private.h index aaf80363f5..6b8d58726a 100644 --- a/libnm-core/nm-utils-private.h +++ b/libnm-core/nm-utils-private.h @@ -85,18 +85,24 @@ typedef struct { const char *key1; const char *key2; const char *key3; + union { + int default_int; + gboolean default_bool; + const char *default_str; + }; } _NMUtilsTeamPropertyKeys; static inline int _nm_utils_json_extract_int (char *conf, - _NMUtilsTeamPropertyKeys key) + _NMUtilsTeamPropertyKeys key, + gboolean is_port) { gs_free GValue *t_value = NULL; int ret; - t_value = _nm_utils_team_config_get (conf, key.key1, key.key2, key.key3, FALSE); + t_value = _nm_utils_team_config_get (conf, key.key1, key.key2, key.key3, is_port); if (!t_value) - return 0; + return key.default_int; ret = g_value_get_int (t_value); g_value_unset (t_value); @@ -105,14 +111,15 @@ _nm_utils_json_extract_int (char *conf, static inline gboolean _nm_utils_json_extract_boolean (char *conf, - _NMUtilsTeamPropertyKeys key) + _NMUtilsTeamPropertyKeys key, + gboolean is_port) { gs_free GValue *t_value = NULL; gboolean ret; - t_value = _nm_utils_team_config_get (conf, key.key1, key.key2, key.key3, FALSE); + t_value = _nm_utils_team_config_get (conf, key.key1, key.key2, key.key3, is_port); if (!t_value) - return FALSE; + return key.default_bool; ret = g_value_get_boolean (t_value); g_value_unset (t_value); @@ -121,14 +128,15 @@ _nm_utils_json_extract_boolean (char *conf, static inline char * _nm_utils_json_extract_string (char *conf, - _NMUtilsTeamPropertyKeys key) + _NMUtilsTeamPropertyKeys key, + gboolean is_port) { gs_free GValue *t_value = NULL; char *ret; - t_value = _nm_utils_team_config_get (conf, key.key1, key.key2, key.key3, FALSE); + t_value = _nm_utils_team_config_get (conf, key.key1, key.key2, key.key3, is_port); if (!t_value) - return NULL; + return g_strdup (key.default_str); ret = g_value_dup_string (t_value); g_value_unset (t_value); @@ -137,12 +145,13 @@ _nm_utils_json_extract_string (char *conf, static inline char ** _nm_utils_json_extract_strv (char *conf, - _NMUtilsTeamPropertyKeys key) + _NMUtilsTeamPropertyKeys key, + gboolean is_port) { gs_free GValue *t_value = NULL; char **ret; - t_value = _nm_utils_team_config_get (conf, key.key1, key.key2, key.key3, FALSE); + t_value = _nm_utils_team_config_get (conf, key.key1, key.key2, key.key3, is_port); if (!t_value) return NULL; diff --git a/libnm-core/nm-utils.c b/libnm-core/nm-utils.c index ec7a80f958..6c8436cc5d 100644 --- a/libnm-core/nm-utils.c +++ b/libnm-core/nm-utils.c @@ -4535,16 +4535,18 @@ _nm_utils_team_config_get (const char *conf, json_object_set_new (json, "runner", json_element); } if (!runner) { - runner = "roundrobin"; + runner = NM_SETTING_TEAM_RUNNER_DEFAULT; json_object_set_new (json_element, "name", json_string (runner)); } - if (nm_streq (runner, "activebackup")) { - _json_add_object (json, "notify_peers", "count", NULL, json_integer (1)); - _json_add_object (json, "mcast_rejoin", "count", NULL, json_integer (1)); - _json_add_object (json, "runner", "hwaddr_policy", NULL, json_string ("same_all")); - } else if (nm_streq (runner, "loadbalance") || nm_streq (runner, "lacp")) { + if (nm_streq (runner, NM_SETTING_TEAM_RUNNER_ACTIVEBACKUP)) { + _json_add_object (json, "notify_peers", "count", NULL, + json_integer (NM_SETTING_TEAM_NOTIFY_PEERS_COUNT_ACTIVEBACKUP_DEFAULT)); + _json_add_object (json, "mcast_rejoin", "count", NULL, + json_integer (NM_SETTING_TEAM_NOTIFY_MCAST_COUNT_ACTIVEBACKUP_DEFAULT)); + } else if ( nm_streq (runner, NM_SETTING_TEAM_RUNNER_LOADBALANCE) + || nm_streq (runner, NM_SETTING_TEAM_RUNNER_LACP)) { json_element = json_array (); json_array_append_new (json_element, json_string ("eth")); json_array_append_new (json_element, json_string ("ipv4")); -- cgit v1.2.1