libnm-core: enforce team and team-port defaults

Rework a bit the way default values are check, set and aligned.
This commit is contained in:
Francesco Giudici
2017-11-08 18:10:27 +01:00
parent 81527f1a09
commit 3e34e404b4
6 changed files with 81 additions and 50 deletions

View File

@@ -68,13 +68,13 @@ enum {
/* Keep aligned with team-port properties enum */ /* Keep aligned with team-port properties enum */
static const _NMUtilsTeamPropertyKeys _prop_to_keys[LAST_PROP] = { static const _NMUtilsTeamPropertyKeys _prop_to_keys[LAST_PROP] = {
[PROP_0] = { NULL, NULL, NULL }, [PROP_0] = { NULL, NULL, NULL, 0 },
[PROP_CONFIG] = { NULL, NULL, NULL }, [PROP_CONFIG] = { NULL, NULL, NULL, 0 },
[PROP_QUEUE_ID] = { "queue_id", NULL, NULL }, [PROP_QUEUE_ID] = { "queue_id", NULL, NULL, NM_SETTING_TEAM_PORT_QUEUE_ID_DEFAULT },
[PROP_PRIO] = { "prio", NULL, NULL }, [PROP_PRIO] = { "prio", NULL, NULL, 0 },
[PROP_STICKY] = { "sticky", NULL, NULL }, [PROP_STICKY] = { "sticky", NULL, NULL, 0 },
[PROP_LACP_PRIO] = { "lacp_prio", NULL, NULL }, [PROP_LACP_PRIO] = { "lacp_prio", NULL, NULL, NM_SETTING_TEAM_PORT_LACP_PRIO_DEFAULT },
[PROP_LACP_KEY] = { "lacp_key", NULL, NULL }, [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); NMSettingTeamPortPrivate *priv = NM_SETTING_TEAM_PORT_GET_PRIVATE (setting);
priv->queue_id = -1; priv->queue_id = NM_SETTING_TEAM_PORT_QUEUE_ID_DEFAULT;
priv->lacp_prio = 255; 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 static void
set_property (GObject *object, guint prop_id, 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)) if (priv->queue_id == g_value_get_int (value))
break; break;
priv->queue_id = g_value_get_int (value); 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_value = value;
align_config = TRUE; align_config = TRUE;
break; break;
@@ -329,7 +329,7 @@ set_property (GObject *object, guint prop_id,
break; break;
priv->lacp_prio = g_value_get_int (value); priv->lacp_prio = g_value_get_int (value);
/* from libteam sources: lacp_prio default value is 0xff */ /* 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_value = value;
align_config = TRUE; align_config = TRUE;
break; break;
@@ -337,7 +337,7 @@ set_property (GObject *object, guint prop_id,
if (priv->lacp_key == g_value_get_int (value)) if (priv->lacp_key == g_value_get_int (value))
break; break;
priv->lacp_key = g_value_get_int (value); priv->lacp_key = g_value_get_int (value);
if (priv->lacp_key > 0) if (priv->lacp_key)
align_value = value; align_value = value;
align_config = TRUE; align_config = TRUE;
break; break;

View File

@@ -45,6 +45,9 @@ G_BEGIN_DECLS
#define NM_SETTING_TEAM_PORT_LACP_PRIO "lacp-prio" #define NM_SETTING_TEAM_PORT_LACP_PRIO "lacp-prio"
#define NM_SETTING_TEAM_PORT_LACP_KEY "lacp-key" #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: * NMSettingTeamPort:
* *

View File

@@ -83,22 +83,26 @@ enum {
/* Keep aligned with team properties enum */ /* Keep aligned with team properties enum */
static const _NMUtilsTeamPropertyKeys _prop_to_keys[LAST_PROP] = { static const _NMUtilsTeamPropertyKeys _prop_to_keys[LAST_PROP] = {
[PROP_0] = { NULL, NULL, NULL }, [PROP_0] = { NULL, NULL, NULL, 0 },
[PROP_CONFIG] = { NULL, NULL, NULL }, [PROP_CONFIG] = { NULL, NULL, NULL, 0 },
[PROP_NOTIFY_PEERS_COUNT] = { "notify_peers", "count", NULL }, [PROP_NOTIFY_PEERS_COUNT] = { "notify_peers", "count", NULL, 0 },
[PROP_NOTIFY_PEERS_INTERVAL] = { "notify_peers", "interval", NULL }, [PROP_NOTIFY_PEERS_INTERVAL] = { "notify_peers", "interval", NULL, 0 },
[PROP_MCAST_REJOIN_COUNT] = { "mcast_rejoin", "count", NULL }, [PROP_MCAST_REJOIN_COUNT] = { "mcast_rejoin", "count", NULL, 0 },
[PROP_MCAST_REJOIN_INTERVAL] = { "mcast_rejoin", "interval", NULL }, [PROP_MCAST_REJOIN_INTERVAL] = { "mcast_rejoin", "interval", NULL, 0 },
[PROP_RUNNER] = { "runner", "name", NULL }, [PROP_RUNNER] = { "runner", "name", NULL,
[PROP_RUNNER_HWADDR_POLICY] = { "runner", "hwaddr_policy", NULL }, {.default_str = NM_SETTING_TEAM_RUNNER_DEFAULT} },
[PROP_RUNNER_TX_HASH] = { "runner", "tx_hash", NULL }, [PROP_RUNNER_HWADDR_POLICY] = { "runner", "hwaddr_policy", NULL, 0 },
[PROP_RUNNER_TX_BALANCER] = { "runner", "tx_balancer", "name" }, [PROP_RUNNER_TX_HASH] = { "runner", "tx_hash", NULL, 0 },
[PROP_RUNNER_TX_BALANCER_INTERVAL] = { "runner", "tx_balancer", "interval" }, [PROP_RUNNER_TX_BALANCER] = { "runner", "tx_balancer", "name", 0 },
[PROP_RUNNER_ACTIVE] = { "runner", "active", NULL }, [PROP_RUNNER_TX_BALANCER_INTERVAL] = { "runner", "tx_balancer", "interval",
[PROP_RUNNER_FAST_RATE] = { "runner", "fast_rate", NULL }, NM_SETTING_TEAM_RUNNER_TX_BALANCER_INTERVAL_DEFAULT },
[PROP_RUNNER_SYS_PRIO] = { "runner", "sys_prio", NULL }, [PROP_RUNNER_ACTIVE] = { "runner", "active", NULL, 0 },
[PROP_RUNNER_MIN_PORTS] = { "runner", "min_ports", NULL }, [PROP_RUNNER_FAST_RATE] = { "runner", "fast_rate", NULL, 0 },
[PROP_RUNNER_AGG_SELECT_POLICY] = { "runner", "agg_select_policy", NULL }, [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); NMSettingTeamPrivate *priv = NM_SETTING_TEAM_GET_PRIVATE (setting);
priv->runner = g_strdup (NM_SETTING_TEAM_RUNNER_ROUNDROBIN); 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 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 static void
_align_team_properties (NMSettingTeam *setting) _align_team_properties (NMSettingTeam *setting)
@@ -651,7 +657,9 @@ set_property (GObject *object, guint prop_id,
case PROP_RUNNER: case PROP_RUNNER:
g_free (priv->runner); g_free (priv->runner);
priv->runner = g_value_dup_string (value); 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_value = value;
align_config = TRUE; align_config = TRUE;
break; break;
@@ -687,7 +695,8 @@ set_property (GObject *object, guint prop_id,
if (priv->runner_tx_balancer_interval == g_value_get_int (value)) if (priv->runner_tx_balancer_interval == g_value_get_int (value))
break; break;
priv->runner_tx_balancer_interval = g_value_get_int (value); 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_value = value;
align_config = TRUE; align_config = TRUE;
break; break;
@@ -711,7 +720,7 @@ set_property (GObject *object, guint prop_id,
if (priv->runner_sys_prio == g_value_get_int (value)) if (priv->runner_sys_prio == g_value_get_int (value))
break; break;
priv->runner_sys_prio = g_value_get_int (value); 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_value = value;
align_config = TRUE; align_config = TRUE;
break; break;

View File

@@ -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_COUNT "count"
#define NM_SETTING_TEAM_RUNNER_AGG_SELECT_POLICY_PORT_CONFIG "port_config" #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: * NMSettingTeam:
* *

View File

@@ -85,18 +85,24 @@ typedef struct {
const char *key1; const char *key1;
const char *key2; const char *key2;
const char *key3; const char *key3;
union {
int default_int;
gboolean default_bool;
const char *default_str;
};
} _NMUtilsTeamPropertyKeys; } _NMUtilsTeamPropertyKeys;
static inline int static inline int
_nm_utils_json_extract_int (char *conf, _nm_utils_json_extract_int (char *conf,
_NMUtilsTeamPropertyKeys key) _NMUtilsTeamPropertyKeys key,
gboolean is_port)
{ {
gs_free GValue *t_value = NULL; gs_free GValue *t_value = NULL;
int ret; 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) if (!t_value)
return 0; return key.default_int;
ret = g_value_get_int (t_value); ret = g_value_get_int (t_value);
g_value_unset (t_value); g_value_unset (t_value);
@@ -105,14 +111,15 @@ _nm_utils_json_extract_int (char *conf,
static inline gboolean static inline gboolean
_nm_utils_json_extract_boolean (char *conf, _nm_utils_json_extract_boolean (char *conf,
_NMUtilsTeamPropertyKeys key) _NMUtilsTeamPropertyKeys key,
gboolean is_port)
{ {
gs_free GValue *t_value = NULL; gs_free GValue *t_value = NULL;
gboolean ret; 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) if (!t_value)
return FALSE; return key.default_bool;
ret = g_value_get_boolean (t_value); ret = g_value_get_boolean (t_value);
g_value_unset (t_value); g_value_unset (t_value);
@@ -121,14 +128,15 @@ _nm_utils_json_extract_boolean (char *conf,
static inline char * static inline char *
_nm_utils_json_extract_string (char *conf, _nm_utils_json_extract_string (char *conf,
_NMUtilsTeamPropertyKeys key) _NMUtilsTeamPropertyKeys key,
gboolean is_port)
{ {
gs_free GValue *t_value = NULL; gs_free GValue *t_value = NULL;
char *ret; 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) if (!t_value)
return NULL; return g_strdup (key.default_str);
ret = g_value_dup_string (t_value); ret = g_value_dup_string (t_value);
g_value_unset (t_value); g_value_unset (t_value);
@@ -137,12 +145,13 @@ _nm_utils_json_extract_string (char *conf,
static inline char ** static inline char **
_nm_utils_json_extract_strv (char *conf, _nm_utils_json_extract_strv (char *conf,
_NMUtilsTeamPropertyKeys key) _NMUtilsTeamPropertyKeys key,
gboolean is_port)
{ {
gs_free GValue *t_value = NULL; gs_free GValue *t_value = NULL;
char **ret; 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) if (!t_value)
return NULL; return NULL;

View File

@@ -4535,16 +4535,18 @@ _nm_utils_team_config_get (const char *conf,
json_object_set_new (json, "runner", json_element); json_object_set_new (json, "runner", json_element);
} }
if (!runner) { if (!runner) {
runner = "roundrobin"; runner = NM_SETTING_TEAM_RUNNER_DEFAULT;
json_object_set_new (json_element, "name", json_string (runner)); json_object_set_new (json_element, "name", json_string (runner));
} }
if (nm_streq (runner, "activebackup")) { if (nm_streq (runner, NM_SETTING_TEAM_RUNNER_ACTIVEBACKUP)) {
_json_add_object (json, "notify_peers", "count", NULL, json_integer (1)); _json_add_object (json, "notify_peers", "count", NULL,
_json_add_object (json, "mcast_rejoin", "count", NULL, json_integer (1)); json_integer (NM_SETTING_TEAM_NOTIFY_PEERS_COUNT_ACTIVEBACKUP_DEFAULT));
_json_add_object (json, "runner", "hwaddr_policy", NULL, json_string ("same_all")); _json_add_object (json, "mcast_rejoin", "count", NULL,
} else if (nm_streq (runner, "loadbalance") || nm_streq (runner, "lacp")) { 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_element = json_array ();
json_array_append_new (json_element, json_string ("eth")); json_array_append_new (json_element, json_string ("eth"));
json_array_append_new (json_element, json_string ("ipv4")); json_array_append_new (json_element, json_string ("ipv4"));