summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2016-01-10 14:31:10 +0100
committerThomas Haller <thaller@redhat.com>2016-01-11 14:05:49 +0100
commiteee00a8355108130c680e4df9c3c1eb0979d88ae (patch)
treee01e7bfcd10efb2a3f31d37034af1f732cf76e80
parent225ce48b8ad37029cee0bddac4575e44755ccfb7 (diff)
downloadNetworkManager-eee00a8355108130c680e4df9c3c1eb0979d88ae.tar.gz
device/vlan: refactor handling platform properties for NMDeviceVlan
Extract a function update_properties() similar to other device implementations. It reads the device specific data from platform and raises property-changed notifications. update_properties() is now called by realize_start_notify(). NMDeviceVlan:realize() -- which previously implemented something like update_properties() -- now does nothing. Note that previously realize() might have failed, but this is different from other device implementations and it was unclear what a failure really meant. Ok, it might fail because the link was not found in the platform cache. But other implementations don't check that either, so why vlan? And how to handle that properly anyway? Therefore realize()'s implementation is no longer needed because nm_device_realize() already calls realize_start_setup(), which calls realize_start_notify() and update_properties(). update_connection() no longer refreshes the device properties. Instead it only modifies the passed-in NMConnection. It's a bit ugly that update_connection() uses both cached properties from NMDeviceVlan (vlan_id) and platform properties (xgress maps). Also, update_connection() doesn't return early on error but continues trying to update the NMConnection. The reason is that update_connection() cannot return a failure status.
-rw-r--r--src/devices/nm-device-vlan.c144
1 files changed, 69 insertions, 75 deletions
diff --git a/src/devices/nm-device-vlan.c b/src/devices/nm-device-vlan.c
index a6bb8123da..16f2bda077 100644
--- a/src/devices/nm-device-vlan.c
+++ b/src/devices/nm-device-vlan.c
@@ -51,7 +51,7 @@ typedef struct {
NMDevice *parent;
gulong parent_state_id;
gulong parent_hwaddr_id;
- int vlan_id;
+ guint vlan_id;
} NMDeviceVlanPrivate;
enum {
@@ -152,53 +152,47 @@ nm_device_vlan_set_parent (NMDeviceVlan *self, NMDevice *parent)
}
static void
-realize_start_notify (NMDevice *device, const NMPlatformLink *plink)
+update_properties (NMDevice *device)
{
- NMDeviceVlan *self = NM_DEVICE_VLAN (device);
- NMDeviceVlanPrivate *priv = NM_DEVICE_VLAN_GET_PRIVATE (self);
+ NMDeviceVlanPrivate *priv;
+ const NMPlatformLink *plink = NULL;
+ const NMPlatformLnkVlan *plnk = NULL;
+ NMDevice *parent = NULL;
+ int ifindex;
+ guint vlan_id;
- NM_DEVICE_CLASS (nm_device_vlan_parent_class)->realize_start_notify (device, plink);
+ g_return_if_fail (NM_IS_DEVICE_VLAN (device));
- _LOGI (LOGD_HW | LOGD_VLAN, "VLAN ID %d with parent %s",
- priv->vlan_id, nm_device_get_iface (priv->parent));
-}
+ priv = NM_DEVICE_VLAN_GET_PRIVATE (device);
-static gboolean
-realize (NMDevice *device,
- NMPlatformLink *plink,
- GError **error)
-{
- NMDeviceVlanPrivate *priv = NM_DEVICE_VLAN_GET_PRIVATE (device);
- NMDevice *parent;
- const NMPlatformLnkVlan *plnk;
+ ifindex = nm_device_get_ifindex (device);
- g_return_val_if_fail (plink, FALSE);
+ if (ifindex > 0)
+ plnk = nm_platform_link_get_lnk_vlan (NM_PLATFORM_GET, ifindex, &plink);
+ if ( plnk
+ && plink->parent
+ && plink->parent != NM_PLATFORM_LINK_OTHER_NETNS)
+ parent = nm_manager_get_device_by_ifindex (nm_manager_get (), plink->parent);
- g_assert (plink->type == NM_LINK_TYPE_VLAN);
+ g_object_freeze_notify ((GObject *) device);
- plnk = nm_platform_link_get_lnk_vlan (NM_PLATFORM_GET, plink->ifindex, NULL);
- if (!plnk) {
- g_set_error (error, NM_DEVICE_ERROR, NM_DEVICE_ERROR_FAILED,
- "(%s): failed to get VLAN properties", plink->name);
- return FALSE;
+ nm_device_vlan_set_parent ((NMDeviceVlan *) device, parent);
+
+ vlan_id = plnk ? plnk->id : 0;
+ if (vlan_id != priv->vlan_id) {
+ priv->vlan_id = vlan_id;
+ g_object_notify ((GObject *) device, NM_DEVICE_VLAN_ID);
}
- if (plink->parent != NM_PLATFORM_LINK_OTHER_NETNS) {
- parent = nm_manager_get_device_by_ifindex (nm_manager_get (), plink->parent);
- if (!parent) {
- nm_log_dbg (LOGD_HW, "(%s): VLAN parent interface unknown", plink->name);
- g_set_error (error, NM_DEVICE_ERROR, NM_DEVICE_ERROR_FAILED,
- "(%s): VLAN parent interface unknown", plink->name);
- return FALSE;
- }
- } else
- parent = NULL;
+ g_object_thaw_notify ((GObject *) device);
+}
- g_warn_if_fail (priv->parent == NULL);
- nm_device_vlan_set_parent (NM_DEVICE_VLAN (device), parent);
- priv->vlan_id = plnk->id;
+static void
+realize_start_notify (NMDevice *device, const NMPlatformLink *plink)
+{
+ NM_DEVICE_CLASS (nm_device_vlan_parent_class)->realize_start_notify (device, plink);
- return TRUE;
+ update_properties (device);
}
static gboolean
@@ -211,7 +205,8 @@ create_and_realize (NMDevice *device,
NMDeviceVlanPrivate *priv = NM_DEVICE_VLAN_GET_PRIVATE (device);
const char *iface = nm_device_get_iface (device);
NMSettingVlan *s_vlan;
- int parent_ifindex, vlan_id;
+ int parent_ifindex;
+ guint vlan_id;
NMPlatformError plerr;
s_vlan = nm_connection_get_setting_vlan (connection);
@@ -247,7 +242,10 @@ create_and_realize (NMDevice *device,
g_warn_if_fail (priv->parent == NULL);
nm_device_vlan_set_parent (NM_DEVICE_VLAN (device), parent);
- priv->vlan_id = vlan_id;
+ if (vlan_id != priv->vlan_id) {
+ priv->vlan_id = vlan_id;
+ g_object_notify ((GObject *) device, NM_DEVICE_VLAN_ID);
+ }
return TRUE;
}
@@ -311,10 +309,8 @@ notify_new_device_added (NMDevice *device, NMDevice *new_device)
return;
plnk = nm_platform_link_get_lnk_vlan (NM_PLATFORM_GET, nm_device_get_ifindex (device), &plink);
- if (!plnk) {
- _LOGW (LOGD_VLAN, "failed to get VLAN interface info while checking added component.");
+ if (!plnk)
return;
- }
if ( plink->parent <= 0
|| nm_device_get_ifindex (new_device) != plink->parent)
@@ -478,15 +474,14 @@ complete_connection (NMDevice *device,
static void
update_connection (NMDevice *device, NMConnection *connection)
{
- NMDeviceVlan *self = NM_DEVICE_VLAN (device);
NMDeviceVlanPrivate *priv = NM_DEVICE_VLAN_GET_PRIVATE (device);
NMSettingVlan *s_vlan = nm_connection_get_setting_vlan (connection);
int ifindex = nm_device_get_ifindex (device);
- NMDevice *parent;
const char *setting_parent, *new_parent;
const NMPlatformLink *plink;
const NMPObject *polnk;
- nm_auto_nmpobj NMPObject *polnk_ref = NULL;
+ guint vlan_id;
+ guint vlan_flags;
if (!s_vlan) {
s_vlan = (NMSettingVlan *) nm_setting_vlan_new ();
@@ -494,36 +489,27 @@ update_connection (NMDevice *device, NMConnection *connection)
}
polnk = nm_platform_link_get_lnk (NM_PLATFORM_GET, ifindex, NM_LINK_TYPE_VLAN, &plink);
- if (!polnk) {
- _LOGW (LOGD_VLAN, "failed to get VLAN interface info while updating connection.");
- return;
- }
- polnk_ref = nmp_object_ref ((NMPObject *) polnk);
- if (priv->vlan_id != polnk->lnk_vlan.id) {
- priv->vlan_id = polnk->lnk_vlan.id;
- g_object_notify (G_OBJECT (device), NM_DEVICE_VLAN_ID);
- }
-
- if (polnk->lnk_vlan.id != nm_setting_vlan_get_id (s_vlan))
- g_object_set (s_vlan, NM_SETTING_VLAN_ID, priv->vlan_id, NULL);
-
- if (plink->parent != NM_PLATFORM_LINK_OTHER_NETNS)
- parent = nm_manager_get_device_by_ifindex (nm_manager_get (), plink->parent);
+ if (polnk)
+ vlan_id = polnk->lnk_vlan.id;
else
- parent = NULL;
- nm_device_vlan_set_parent (NM_DEVICE_VLAN (device), parent);
+ vlan_id = priv->vlan_id;
+ if (vlan_id != nm_setting_vlan_get_id (s_vlan))
+ g_object_set (s_vlan, NM_SETTING_VLAN_ID, vlan_id, NULL);
/* Update parent in the connection; default to parent's interface name */
- if (parent) {
- new_parent = nm_device_get_iface (parent);
+ if ( priv->parent
+ && polnk
+ && plink->parent > 0
+ && nm_device_get_ifindex (priv->parent) == plink->parent) {
+ new_parent = nm_device_get_iface (priv->parent);
setting_parent = nm_setting_vlan_get_parent (s_vlan);
if (setting_parent && nm_utils_is_uuid (setting_parent)) {
NMConnection *parent_connection;
/* Don't change a parent specified by UUID if it's still valid */
parent_connection = nm_connection_provider_get_connection_by_uuid (nm_connection_provider_get (), setting_parent);
- if (parent_connection && nm_device_check_connection_compatible (parent, parent_connection))
+ if (parent_connection && nm_device_check_connection_compatible (priv->parent, parent_connection))
new_parent = NULL;
}
if (new_parent)
@@ -531,15 +517,24 @@ update_connection (NMDevice *device, NMConnection *connection)
} else
g_object_set (s_vlan, NM_SETTING_VLAN_PARENT, NULL, NULL);
- if (polnk->lnk_vlan.flags != nm_setting_vlan_get_flags (s_vlan))
- g_object_set (s_vlan, NM_SETTING_VLAN_FLAGS, (NMVlanFlags) polnk->lnk_vlan.flags, NULL);
-
- _nm_setting_vlan_set_priorities (s_vlan, NM_VLAN_INGRESS_MAP,
- polnk->_lnk_vlan.ingress_qos_map,
- polnk->_lnk_vlan.n_ingress_qos_map);
- _nm_setting_vlan_set_priorities (s_vlan, NM_VLAN_EGRESS_MAP,
- polnk->_lnk_vlan.egress_qos_map,
- polnk->_lnk_vlan.n_egress_qos_map);
+ if (polnk)
+ vlan_flags = polnk->lnk_vlan.flags;
+ else
+ vlan_flags = NM_VLAN_FLAG_REORDER_HEADERS;
+ if (vlan_flags != nm_setting_vlan_get_flags (s_vlan))
+ g_object_set (s_vlan, NM_SETTING_VLAN_FLAGS, (NMVlanFlags) vlan_flags, NULL);
+
+ if (polnk) {
+ _nm_setting_vlan_set_priorities (s_vlan, NM_VLAN_INGRESS_MAP,
+ polnk->_lnk_vlan.ingress_qos_map,
+ polnk->_lnk_vlan.n_ingress_qos_map);
+ _nm_setting_vlan_set_priorities (s_vlan, NM_VLAN_EGRESS_MAP,
+ polnk->_lnk_vlan.egress_qos_map,
+ polnk->_lnk_vlan.n_egress_qos_map);
+ } else {
+ _nm_setting_vlan_set_priorities (s_vlan, NM_VLAN_INGRESS_MAP, NULL, 0);
+ _nm_setting_vlan_set_priorities (s_vlan, NM_VLAN_EGRESS_MAP, NULL, 0);
+ }
}
static NMActStageReturn
@@ -685,7 +680,6 @@ nm_device_vlan_class_init (NMDeviceVlanClass *klass)
object_class->dispose = dispose;
parent_class->create_and_realize = create_and_realize;
- parent_class->realize = realize;
parent_class->realize_start_notify = realize_start_notify;
parent_class->unrealize = unrealize;
parent_class->get_generic_capabilities = get_generic_capabilities;