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:
@@ -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;
|
||||||
|
@@ -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:
|
||||||
*
|
*
|
||||||
|
@@ -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;
|
||||||
|
@@ -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:
|
||||||
*
|
*
|
||||||
|
@@ -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;
|
||||||
|
|
||||||
|
@@ -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"));
|
||||||
|
Reference in New Issue
Block a user