diff options
author | Thomas Haller <thaller@redhat.com> | 2017-06-02 16:24:31 +0200 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2017-06-02 21:06:07 +0200 |
commit | 158e852604660c9e8de370a9dd927792e00194f3 (patch) | |
tree | a3192d2efab29bae81bd0472cd2cb2027a00d855 | |
parent | 7f79b59330290fc406c4d9bf76d3b5216434cde3 (diff) | |
download | NetworkManager-158e852604660c9e8de370a9dd927792e00194f3.tar.gz |
device: rework listening to carrier changes for DCB in NMDeviceEthernet
Now, that NMDeviceClass:carrier_changed_notify() is no longer called as
deferred action, we can check for DCB state there, instead or registering
to the NM_DEVICE_CARRIER notifications.
-rw-r--r-- | src/devices/nm-device-ethernet.c | 49 |
1 files changed, 21 insertions, 28 deletions
diff --git a/src/devices/nm-device-ethernet.c b/src/devices/nm-device-ethernet.c index 8a04d401ca..5b15d48b69 100644 --- a/src/devices/nm-device-ethernet.c +++ b/src/devices/nm-device-ethernet.c @@ -115,7 +115,8 @@ typedef struct _NMDeviceEthernetPrivate { /* DCB */ DcbWait dcb_wait; guint dcb_timeout_id; - gulong dcb_carrier_id; + + bool dcb_handle_carrier_changes:1; } NMDeviceEthernetPrivate; NM_GOBJECT_PROPERTIES_DEFINE (NMDeviceEthernet, @@ -1133,7 +1134,7 @@ dcb_state (NMDevice *device, gboolean timeout) _LOGD (LOGD_DCB, "dcb_state() enabling DCB"); nm_clear_g_source (&priv->dcb_timeout_id); if (!dcb_enable (device)) { - nm_clear_g_signal_handler (device, &priv->dcb_carrier_id); + priv->dcb_handle_carrier_changes = FALSE; nm_device_state_changed (device, NM_DEVICE_STATE_FAILED, NM_DEVICE_STATE_REASON_DCB_FCOE_FAILED); @@ -1157,7 +1158,7 @@ dcb_state (NMDevice *device, gboolean timeout) _LOGD (LOGD_DCB, "dcb_state() preconfig up configuring DCB"); nm_clear_g_source (&priv->dcb_timeout_id); if (!dcb_configure (device)) { - nm_clear_g_signal_handler (device, &priv->dcb_carrier_id); + priv->dcb_handle_carrier_changes = FALSE; nm_device_state_changed (device, NM_DEVICE_STATE_FAILED, NM_DEVICE_STATE_REASON_DCB_FCOE_FAILED); @@ -1180,7 +1181,7 @@ dcb_state (NMDevice *device, gboolean timeout) if (timeout || carrier) { _LOGD (LOGD_DCB, "dcb_state() postconfig up starting IP"); nm_clear_g_source (&priv->dcb_timeout_id); - nm_clear_g_signal_handler (device, &priv->dcb_carrier_id); + priv->dcb_handle_carrier_changes = FALSE; priv->dcb_wait = DCB_WAIT_UNKNOWN; nm_device_activate_schedule_stage3_ip_config_start (device); } @@ -1190,20 +1191,6 @@ dcb_state (NMDevice *device, gboolean timeout) } } -static void -dcb_carrier_changed (NMDevice *device, GParamSpec *pspec, gpointer unused) -{ - NMDeviceEthernet *self = NM_DEVICE_ETHERNET (device); - NMDeviceEthernetPrivate *priv = NM_DEVICE_ETHERNET_GET_PRIVATE (self); - - g_return_if_fail (nm_device_get_state (device) == NM_DEVICE_STATE_CONFIG); - - if (priv->dcb_timeout_id) { - _LOGD (LOGD_DCB, "carrier_changed() calling dcb_state()"); - dcb_state (device, FALSE); - } -} - /*****************************************************************************/ static gboolean @@ -1262,7 +1249,7 @@ act_stage2_config (NMDevice *device, NMDeviceStateReason *out_failure_reason) g_return_val_if_fail (s_con, NM_ACT_STAGE_RETURN_FAILURE); nm_clear_g_source (&priv->dcb_timeout_id); - nm_clear_g_signal_handler (device, &priv->dcb_carrier_id); + priv->dcb_handle_carrier_changes = FALSE; /* 802.1x has to run before any IP configuration since the 802.1x auth * process opens the port up for normal traffic. @@ -1296,13 +1283,7 @@ act_stage2_config (NMDevice *device, NMDeviceStateReason *out_failure_reason) priv->dcb_timeout_id = g_timeout_add_seconds (4, dcb_carrier_timeout, device); } - /* Watch carrier independently of NMDeviceClass::carrier_changed so - * we get instant notifications of disconnection that aren't deferred. - */ - priv->dcb_carrier_id = g_signal_connect (device, - "notify::" NM_DEVICE_CARRIER, - G_CALLBACK (dcb_carrier_changed), - NULL); + priv->dcb_handle_carrier_changes = TRUE; ret = NM_ACT_STAGE_RETURN_POSTPONE; } @@ -1386,7 +1367,7 @@ deactivate (NMDevice *device) priv->dcb_wait = DCB_WAIT_UNKNOWN; nm_clear_g_source (&priv->dcb_timeout_id); - nm_clear_g_signal_handler (device, &priv->dcb_carrier_id); + priv->dcb_handle_carrier_changes = FALSE; /* Tear down DCB/FCoE if it was enabled */ s_dcb = (NMSettingDcb *) nm_device_get_applied_setting (device, NM_TYPE_SETTING_DCB); @@ -1599,8 +1580,21 @@ get_link_speed (NMDevice *device) static void carrier_changed_notify (NMDevice *device, gboolean carrier) { + NMDeviceEthernet *self = NM_DEVICE_ETHERNET (device); + NMDeviceEthernetPrivate *priv = NM_DEVICE_ETHERNET_GET_PRIVATE (self); + + if (priv->dcb_handle_carrier_changes) { + nm_assert (nm_device_get_state (device) == NM_DEVICE_STATE_CONFIG); + + if (priv->dcb_timeout_id) { + _LOGD (LOGD_DCB, "carrier_changed() calling dcb_state()"); + dcb_state (device, FALSE); + } + } + if (carrier) get_link_speed (device); + NM_DEVICE_CLASS (nm_device_ethernet_parent_class)->carrier_changed_notify (device, carrier); } @@ -1682,7 +1676,6 @@ dispose (GObject *object) nm_clear_g_source (&priv->pppoe_wait_id); nm_clear_g_source (&priv->dcb_timeout_id); - nm_clear_g_signal_handler (self, &priv->dcb_carrier_id); G_OBJECT_CLASS (nm_device_ethernet_parent_class)->dispose (object); } |