libnm-core: enforce team-port config and properties alignment

Ensure .config is aligned when an explicit team-port is set and vice
versa
This commit is contained in:
Francesco Giudici
2017-10-30 16:24:04 +01:00
parent 1c99d379eb
commit ec60e01d39

View File

@@ -54,6 +54,7 @@ typedef struct {
int lacp_key;
} NMSettingTeamPortPrivate;
/* Keep aligned with _prop_to_keys[] */
enum {
PROP_0,
PROP_CONFIG,
@@ -65,6 +66,18 @@ enum {
LAST_PROP
};
/* 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 },
};
/**
* nm_setting_team_port_new:
*
@@ -267,36 +280,73 @@ nm_setting_team_port_init (NMSettingTeamPort *setting)
priv->lacp_prio = 255;
}
#define JSON_TO_VAL(typ, id) _nm_utils_json_extract_##typ (priv->config, _prop_to_keys[id])
static void
set_property (GObject *object, guint prop_id,
const GValue *value, GParamSpec *pspec)
{
NMSettingTeamPortPrivate *priv = NM_SETTING_TEAM_PORT_GET_PRIVATE (object);
const GValue *align_value = NULL;
gboolean align_config = FALSE;
switch (prop_id) {
case PROP_CONFIG:
g_free (priv->config);
priv->config = g_value_dup_string (value);
priv->queue_id = JSON_TO_VAL (int, PROP_QUEUE_ID);
priv->prio = JSON_TO_VAL (int, PROP_PRIO);
priv->sticky = JSON_TO_VAL (boolean, PROP_STICKY);
priv->lacp_prio = JSON_TO_VAL (int, PROP_LACP_PRIO);
priv->lacp_key = JSON_TO_VAL (int, PROP_LACP_KEY);
break;
case PROP_QUEUE_ID:
if (priv->queue_id == g_value_get_int (value))
break;
priv->queue_id = g_value_get_int (value);
if (priv->queue_id > -1)
align_value = value;
align_config = TRUE;
break;
case PROP_PRIO:
if (priv->prio == g_value_get_int (value))
break;
priv->prio = g_value_get_int (value);
if (priv->prio)
align_value = value;
align_config = TRUE;
break;
case PROP_STICKY:
if (priv->sticky == g_value_get_boolean (value))
break;
priv->sticky = g_value_get_boolean (value);
if (priv->sticky)
align_value = value;
align_config = TRUE;
break;
case PROP_LACP_PRIO:
if (priv->lacp_prio == g_value_get_int (value))
break;
priv->lacp_prio = g_value_get_int (value);
/* from libteam sources: lacp_prio default value is 0xff */
if (priv->lacp_prio != 255)
align_value = value;
align_config = TRUE;
break;
case PROP_LACP_KEY:
if (priv->lacp_key == g_value_get_int (value))
break;
priv->lacp_key = g_value_get_int (value);
if (priv->lacp_key > 0)
align_value = value;
align_config = TRUE;
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
if (align_config)
_nm_utils_json_append_gvalue (&priv->config, _prop_to_keys[prop_id], align_value);
}
static void