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