summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrancesco Giudici <fgiudici@redhat.com>2017-10-30 16:24:04 +0100
committerFrancesco Giudici <fgiudici@redhat.com>2017-11-09 17:56:15 +0100
commitec60e01d39e7477e4d19aa24d7832b368b7ee125 (patch)
tree6ce96987a784953a7e5d329159d82163ac4e1204
parent1c99d379eb7ef1947beb4176a9611e404d1b220f (diff)
downloadNetworkManager-ec60e01d39e7477e4d19aa24d7832b368b7ee125.tar.gz
libnm-core: enforce team-port config and properties alignment
Ensure .config is aligned when an explicit team-port is set and vice versa
-rw-r--r--libnm-core/nm-setting-team-port.c50
1 files changed, 50 insertions, 0 deletions
diff --git a/libnm-core/nm-setting-team-port.c b/libnm-core/nm-setting-team-port.c
index 6c3967e563..09b0ca8036 100644
--- a/libnm-core/nm-setting-team-port.c
+++ b/libnm-core/nm-setting-team-port.c
@@ -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