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