summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2017-06-02 21:04:12 +0200
committerThomas Haller <thaller@redhat.com>2017-06-02 21:06:08 +0200
commitde0da1df32fc29a3a89afb549c7d9e8ff016fc09 (patch)
treeefc462dd62a04406f8ccac04baa698f142f47380
parent1d35fd01031aeeaf54edb55771e53d8c5365ccbd (diff)
parentc79a97657bfeef34aa376394bc61f49d46391695 (diff)
downloadNetworkManager-de0da1df32fc29a3a89afb549c7d9e8ff016fc09.tar.gz
device: merge various device cleanups
-rw-r--r--src/devices/nm-device-bond.c3
-rw-r--r--src/devices/nm-device-bridge.c3
-rw-r--r--src/devices/nm-device-ethernet.c56
-rw-r--r--src/devices/nm-device.c70
-rw-r--r--src/devices/nm-device.h6
-rw-r--r--src/devices/team/nm-device-team.c3
6 files changed, 72 insertions, 69 deletions
diff --git a/src/devices/nm-device-bond.c b/src/devices/nm-device-bond.c
index 3325c9485e..18291397db 100644
--- a/src/devices/nm-device-bond.c
+++ b/src/devices/nm-device-bond.c
@@ -613,6 +613,7 @@ reapply_connection (NMDevice *device, NMConnection *con_old, NMConnection *con_n
static void
nm_device_bond_init (NMDeviceBond * self)
{
+ nm_assert (nm_device_is_master (NM_DEVICE (self)));
}
static void
@@ -622,6 +623,7 @@ nm_device_bond_class_init (NMDeviceBondClass *klass)
NM_DEVICE_CLASS_DECLARE_TYPES (klass, NM_SETTING_BOND_SETTING_NAME, NM_LINK_TYPE_BOND)
+ parent_class->is_master = TRUE;
parent_class->get_generic_capabilities = get_generic_capabilities;
parent_class->is_available = is_available;
parent_class->check_connection_compatible = check_connection_compatible;
@@ -662,7 +664,6 @@ create_device (NMDeviceFactory *factory,
NM_DEVICE_TYPE_DESC, "Bond",
NM_DEVICE_DEVICE_TYPE, NM_DEVICE_TYPE_BOND,
NM_DEVICE_LINK_TYPE, NM_LINK_TYPE_BOND,
- NM_DEVICE_IS_MASTER, TRUE,
NULL);
}
diff --git a/src/devices/nm-device-bridge.c b/src/devices/nm-device-bridge.c
index c281dbad0c..166e1bdd27 100644
--- a/src/devices/nm-device-bridge.c
+++ b/src/devices/nm-device-bridge.c
@@ -494,6 +494,7 @@ create_and_realize (NMDevice *device,
static void
nm_device_bridge_init (NMDeviceBridge * self)
{
+ nm_assert (nm_device_is_master (NM_DEVICE (self)));
}
static void
@@ -503,6 +504,7 @@ nm_device_bridge_class_init (NMDeviceBridgeClass *klass)
NM_DEVICE_CLASS_DECLARE_TYPES (klass, NM_SETTING_BRIDGE_SETTING_NAME, NM_LINK_TYPE_BRIDGE)
+ parent_class->is_master = TRUE;
parent_class->get_generic_capabilities = get_generic_capabilities;
parent_class->is_available = is_available;
parent_class->check_connection_compatible = check_connection_compatible;
@@ -543,7 +545,6 @@ create_device (NMDeviceFactory *factory,
NM_DEVICE_TYPE_DESC, "Bridge",
NM_DEVICE_DEVICE_TYPE, NM_DEVICE_TYPE_BRIDGE,
NM_DEVICE_LINK_TYPE, NM_LINK_TYPE_BRIDGE,
- NM_DEVICE_IS_MASTER, TRUE,
NULL);
}
diff --git a/src/devices/nm-device-ethernet.c b/src/devices/nm-device-ethernet.c
index 8a04d401ca..8044ec3b85 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);
@@ -1579,7 +1560,7 @@ update_connection (NMDevice *device, NMConnection *connection)
}
static void
-get_link_speed (NMDevice *device)
+link_speed_update (NMDevice *device)
{
NMDeviceEthernet *self = NM_DEVICE_ETHERNET (device);
NMDeviceEthernetPrivate *priv = NM_DEVICE_ETHERNET_GET_PRIVATE (self);
@@ -1591,16 +1572,28 @@ get_link_speed (NMDevice *device)
return;
priv->speed = speed;
- _notify (self, PROP_SPEED);
-
_LOGD (LOGD_PLATFORM | LOGD_ETHER, "speed is now %d Mb/s", speed);
+ _notify (self, PROP_SPEED);
}
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);
+ link_speed_update (device);
+
NM_DEVICE_CLASS (nm_device_ethernet_parent_class)->carrier_changed_notify (device, carrier);
}
@@ -1682,7 +1675,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);
}
diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c
index e11b7158fb..de3bc687eb 100644
--- a/src/devices/nm-device.c
+++ b/src/devices/nm-device.c
@@ -188,7 +188,6 @@ NM_GOBJECT_PROPERTIES_DEFINE (NMDevice,
PROP_IFINDEX,
PROP_AVAILABLE_CONNECTIONS,
PROP_PHYSICAL_PORT_ID,
- PROP_IS_MASTER,
PROP_MASTER,
PROP_PARENT,
PROP_HW_ADDRESS,
@@ -451,7 +450,6 @@ typedef struct _NMDevicePrivate {
gulong master_ready_id;
/* slave management */
- bool is_master;
CList slaves; /* list of SlaveInfo */
NMMetered metered;
@@ -2183,8 +2181,6 @@ carrier_changed (NMDevice *self, gboolean carrier)
{
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
- NM_DEVICE_GET_CLASS (self)->carrier_changed_notify (self, carrier);
-
if (priv->state <= NM_DEVICE_STATE_UNMANAGED)
return;
@@ -2194,7 +2190,7 @@ carrier_changed (NMDevice *self, gboolean carrier)
if (priv->ignore_carrier && !carrier)
return;
- if (priv->is_master) {
+ if (nm_device_is_master (self)) {
/* Bridge/bond/team carrier does not affect its own activation,
* but when carrier comes on, if there are slaves waiting,
* it will restart them.
@@ -2254,7 +2250,7 @@ carrier_disconnected_action_cb (gpointer user_data)
NMDevice *self = NM_DEVICE (user_data);
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
- _LOGD (LOGD_DEVICE, "link disconnected (calling deferred action) (id=%u)", priv->carrier_defer_id);
+ _LOGD (LOGD_DEVICE, "carrier: link disconnected (calling deferred action) (id=%u)", priv->carrier_defer_id);
priv->carrier_defer_id = 0;
carrier_changed (self, FALSE);
@@ -2268,7 +2264,7 @@ carrier_disconnected_action_cancel (NMDevice *self)
guint id = priv->carrier_defer_id;
if (nm_clear_g_source (&priv->carrier_defer_id)) {
- _LOGD (LOGD_DEVICE, "link disconnected (canceling deferred action) (id=%u)",
+ _LOGD (LOGD_DEVICE, "carrier: link disconnected (canceling deferred action) (id=%u)",
id);
}
}
@@ -2286,8 +2282,9 @@ nm_device_set_carrier (NMDevice *self, gboolean carrier)
_notify (self, PROP_CARRIER);
if (priv->carrier) {
- _LOGI (LOGD_DEVICE, "link connected");
+ _LOGI (LOGD_DEVICE, "carrier: link connected");
carrier_disconnected_action_cancel (self);
+ NM_DEVICE_GET_CLASS (self)->carrier_changed_notify (self, carrier);
carrier_changed (self, TRUE);
if (priv->carrier_wait_id) {
@@ -2297,14 +2294,15 @@ nm_device_set_carrier (NMDevice *self, gboolean carrier)
} else {
if (priv->carrier_wait_id)
nm_device_add_pending_action (self, NM_PENDING_ACTION_CARRIER_WAIT, FALSE);
+ NM_DEVICE_GET_CLASS (self)->carrier_changed_notify (self, carrier);
if ( state <= NM_DEVICE_STATE_DISCONNECTED
&& !priv->queued_act_request) {
- _LOGD (LOGD_DEVICE, "link disconnected");
+ _LOGD (LOGD_DEVICE, "carrier: link disconnected");
carrier_changed (self, FALSE);
} else {
priv->carrier_defer_id = g_timeout_add_seconds (LINK_DISCONNECT_DELAY,
carrier_disconnected_action_cb, self);
- _LOGD (LOGD_DEVICE, "link disconnected (deferring action for %d seconds) (id=%u)",
+ _LOGD (LOGD_DEVICE, "carrier: link disconnected (deferring action for %d seconds) (id=%u)",
LINK_DISCONNECT_DELAY, priv->carrier_defer_id);
}
}
@@ -3531,7 +3529,9 @@ nm_device_master_release_slaves (NMDevice *self)
gboolean
nm_device_is_master (NMDevice *self)
{
- return NM_DEVICE_GET_PRIVATE (self)->is_master;
+ g_return_val_if_fail (NM_IS_DEVICE (self), FALSE);
+
+ return NM_DEVICE_GET_CLASS (self)->is_master;
}
/**
@@ -4190,7 +4190,7 @@ nm_device_check_slave_connection_compatible (NMDevice *self, NMConnection *slave
priv = NM_DEVICE_GET_PRIVATE (self);
- if (!priv->is_master)
+ if (!nm_device_is_master (self))
return FALSE;
/* All masters should have connection type set */
@@ -6033,14 +6033,14 @@ act_stage3_ip4_config_start (NMDevice *self,
g_return_val_if_fail (connection, NM_ACT_STAGE_RETURN_FAILURE);
if ( connection_ip4_method_requires_carrier (connection, NULL)
- && priv->is_master
+ && nm_device_is_master (self)
&& !priv->carrier) {
_LOGI (LOGD_IP4 | LOGD_DEVICE,
"IPv4 config waiting until carrier is on");
return NM_ACT_STAGE_RETURN_IP_WAIT;
}
- if (priv->is_master && ip4_requires_slaves (connection)) {
+ if (nm_device_is_master (self) && ip4_requires_slaves (connection)) {
/* If the master has no ready slaves, and depends on slaves for
* a successful IPv4 attempt, then postpone IPv4 addressing.
*/
@@ -7634,14 +7634,14 @@ act_stage3_ip6_config_start (NMDevice *self,
g_return_val_if_fail (connection, NM_ACT_STAGE_RETURN_FAILURE);
if ( connection_ip6_method_requires_carrier (connection, NULL)
- && priv->is_master
+ && nm_device_is_master (self)
&& !priv->carrier) {
_LOGI (LOGD_IP6 | LOGD_DEVICE,
"IPv6 config waiting until carrier is on");
return NM_ACT_STAGE_RETURN_IP_WAIT;
}
- if (priv->is_master && ip6_requires_slaves (connection)) {
+ if (nm_device_is_master (self) && ip6_requires_slaves (connection)) {
/* If the master has no ready slaves, and depends on slaves for
* a successful IPv6 attempt, then postpone IPv6 addressing.
*/
@@ -8268,7 +8268,7 @@ arp_announce (NMDevice *self)
}
static void
-activate_stage5_ip4_config_commit (NMDevice *self)
+activate_stage5_ip4_config_result (NMDevice *self)
{
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
NMActRequest *req;
@@ -8340,7 +8340,7 @@ nm_device_activate_schedule_ip4_config_result (NMDevice *self, NMIP4Config *conf
if (config)
priv->dev_ip4_config = g_object_ref (config);
- activation_source_schedule (self, activate_stage5_ip4_config_commit, AF_INET);
+ activation_source_schedule (self, activate_stage5_ip4_config_result, AF_INET);
}
gboolean
@@ -10540,7 +10540,7 @@ update_ip4_config (NMDevice *self, gboolean initial)
*/
if ( !initial
&& activation_source_is_scheduled (self,
- activate_stage5_ip4_config_commit,
+ activate_stage5_ip4_config_result,
AF_INET)) {
priv->queued_ip4_config_pending = FALSE;
priv->queued_ip4_config_id = g_idle_add (queued_ip4_config_change, self);
@@ -13464,6 +13464,12 @@ nm_device_get_initial_hw_address (NMDevice *self)
gboolean
nm_device_spec_match_list (NMDevice *self, const GSList *specs)
{
+ return nm_device_spec_match_list_full (self, specs, FALSE);
+}
+
+int
+nm_device_spec_match_list_full (NMDevice *self, const GSList *specs, int no_match_value)
+{
NMDeviceClass *klass;
NMMatchSpecMatchType m;
@@ -13478,7 +13484,17 @@ nm_device_spec_match_list (NMDevice *self, const GSList *specs)
nm_device_get_driver_version (self),
nm_device_get_permanent_hw_address (self),
klass->get_s390_subchannels ? klass->get_s390_subchannels (self) : NULL);
- return m == NM_MATCH_SPEC_MATCH;
+
+ switch (m) {
+ case NM_MATCH_SPEC_MATCH:
+ return TRUE;
+ case NM_MATCH_SPEC_NEG_MATCH:
+ return FALSE;
+ case NM_MATCH_SPEC_NO_MATCH:
+ return no_match_value;
+ }
+ nm_assert_not_reached ();
+ return no_match_value;
}
guint
@@ -13523,7 +13539,7 @@ _activation_func_to_string (ActivationHandleFunc func)
FUNC_TO_STRING_CHECK_AND_RETURN (func, activate_stage3_ip_config_start);
FUNC_TO_STRING_CHECK_AND_RETURN (func, activate_stage4_ip4_config_timeout);
FUNC_TO_STRING_CHECK_AND_RETURN (func, activate_stage4_ip6_config_timeout);
- FUNC_TO_STRING_CHECK_AND_RETURN (func, activate_stage5_ip4_config_commit);
+ FUNC_TO_STRING_CHECK_AND_RETURN (func, activate_stage5_ip4_config_result);
FUNC_TO_STRING_CHECK_AND_RETURN (func, activate_stage5_ip6_config_commit);
g_return_val_if_reached ("unknown");
}
@@ -13864,10 +13880,6 @@ set_property (GObject *object, guint prop_id,
/* construct-only */
priv->rfkill_type = g_value_get_uint (value);
break;
- case PROP_IS_MASTER:
- /* construct-only */
- priv->is_master = g_value_get_boolean (value);
- break;
case PROP_PERM_HW_ADDRESS:
/* construct-only */
priv->hw_addr_perm = g_value_dup_string (value);
@@ -14002,9 +14014,6 @@ get_property (GObject *object, guint prop_id,
case PROP_PHYSICAL_PORT_ID:
g_value_set_string (value, priv->physical_port_id);
break;
- case PROP_IS_MASTER:
- g_value_set_boolean (value, priv->is_master);
- break;
case PROP_MASTER:
g_value_set_object (value, nm_device_get_master (self));
break;
@@ -14267,11 +14276,6 @@ nm_device_class_init (NMDeviceClass *klass)
NULL,
G_PARAM_READABLE |
G_PARAM_STATIC_STRINGS);
- obj_properties[PROP_IS_MASTER] =
- g_param_spec_boolean (NM_DEVICE_IS_MASTER, "", "",
- FALSE,
- G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
- G_PARAM_STATIC_STRINGS);
obj_properties[PROP_MASTER] =
g_param_spec_object (NM_DEVICE_MASTER, "", "",
NM_TYPE_DEVICE,
diff --git a/src/devices/nm-device.h b/src/devices/nm-device.h
index e7d79947cc..b5c933c94e 100644
--- a/src/devices/nm-device.h
+++ b/src/devices/nm-device.h
@@ -120,7 +120,6 @@ nm_device_state_reason_check (NMDeviceStateReason reason)
#define NM_DEVICE_TYPE_DESC "type-desc" /* Internal only */
#define NM_DEVICE_RFKILL_TYPE "rfkill-type" /* Internal only */
#define NM_DEVICE_IFINDEX "ifindex" /* Internal only */
-#define NM_DEVICE_IS_MASTER "is-master" /* Internal only */
#define NM_DEVICE_MASTER "master" /* Internal only */
#define NM_DEVICE_HAS_PENDING_ACTION "has-pending-action" /* Internal only */
@@ -196,6 +195,10 @@ typedef struct {
const char *connection_type;
const NMLinkType *link_types;
+ /* Whether the device type is a master-type. This depends purely on the
+ * type (NMDeviceClass), not the actual device instance. */
+ bool is_master:1;
+
void (*state_changed) (NMDevice *device,
NMDeviceState new_state,
NMDeviceState old_state,
@@ -507,6 +510,7 @@ gboolean nm_device_check_slave_connection_compatible (NMDevice *device, NMConnec
gboolean nm_device_unmanage_on_quit (NMDevice *self);
gboolean nm_device_spec_match_list (NMDevice *device, const GSList *specs);
+int nm_device_spec_match_list_full (NMDevice *self, const GSList *specs, int no_match_value);
gboolean nm_device_is_activating (NMDevice *dev);
gboolean nm_device_autoconnect_allowed (NMDevice *self);
diff --git a/src/devices/team/nm-device-team.c b/src/devices/team/nm-device-team.c
index c457e91242..2986664105 100644
--- a/src/devices/team/nm-device-team.c
+++ b/src/devices/team/nm-device-team.c
@@ -822,6 +822,7 @@ get_property (GObject *object, guint prop_id,
static void
nm_device_team_init (NMDeviceTeam * self)
{
+ nm_assert (nm_device_is_master (NM_DEVICE (self)));
}
static void
@@ -854,7 +855,6 @@ nm_device_team_new (const char *iface)
NM_DEVICE_TYPE_DESC, "Team",
NM_DEVICE_DEVICE_TYPE, NM_DEVICE_TYPE_TEAM,
NM_DEVICE_LINK_TYPE, NM_LINK_TYPE_TEAM,
- NM_DEVICE_IS_MASTER, TRUE,
NULL);
}
@@ -887,6 +887,7 @@ nm_device_team_class_init (NMDeviceTeamClass *klass)
object_class->dispose = dispose;
object_class->get_property = get_property;
+ parent_class->is_master = TRUE;
parent_class->create_and_realize = create_and_realize;
parent_class->get_generic_capabilities = get_generic_capabilities;
parent_class->is_available = is_available;