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 */
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;

View File

@@ -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:
*

View File

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

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_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:
*

View File

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

View File

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