summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBeniamino Galvani <bgalvani@redhat.com>2019-07-11 22:31:10 +0200
committerBeniamino Galvani <bgalvani@redhat.com>2019-07-11 22:31:10 +0200
commit808d45423ca90c23f4a246ab85f501b1d138f1a4 (patch)
treed3d33c3df7967d3e818eacb065d23f236e253dc1
parentfd059c3982b5db36a1a255f5dd8fe390bde07c95 (diff)
downloadNetworkManager-bg/802-1x-fallback.tar.gz
-rw-r--r--src/devices/nm-device-ethernet.c21
-rw-r--r--src/supplicant/nm-supplicant-interface.c22
-rw-r--r--src/supplicant/nm-supplicant-interface.h1
3 files changed, 44 insertions, 0 deletions
diff --git a/src/devices/nm-device-ethernet.c b/src/devices/nm-device-ethernet.c
index 1c39147759..6d50fb4178 100644
--- a/src/devices/nm-device-ethernet.c
+++ b/src/devices/nm-device-ethernet.c
@@ -65,6 +65,7 @@ typedef struct Supplicant {
/* signal handler ids */
gulong iface_state_id;
+ gulong auth_status_id;
/* Timeouts and idles */
guint con_timeout_id;
@@ -415,6 +416,7 @@ supplicant_interface_release (NMDeviceEthernet *self)
nm_clear_g_source (&priv->supplicant_timeout_id);
nm_clear_g_source (&priv->supplicant.con_timeout_id);
nm_clear_g_signal_handler (priv->supplicant.iface, &priv->supplicant.iface_state_id);
+ nm_clear_g_signal_handler (priv->supplicant.iface, &priv->supplicant.auth_status_id);
if (priv->supplicant.iface) {
nm_supplicant_interface_disconnect (priv->supplicant.iface);
@@ -423,8 +425,20 @@ supplicant_interface_release (NMDeviceEthernet *self)
}
static void
+supplicant_auth_status_changed (NMSupplicantInterface *iface,
+ const char *status,
+ const char *detail,
+ gpointer user_data)
+{
+ NMDeviceEthernet *self = NM_DEVICE_ETHERNET (user_data);
+
+ _LOGE (LOGD_CORE, "supplicant auth status changed: %s - %s", status, detail);
+}
+
+static void
wired_auth_cond_fail (NMDeviceEthernet *self, NMDeviceStateReason reason)
{
+ NMDeviceEthernetPrivate *priv = NM_DEVICE_ETHERNET_GET_PRIVATE (self);
NMConnection *applied;
NMSetting8021x *s_8021x;
@@ -437,6 +451,13 @@ wired_auth_cond_fail (NMDeviceEthernet *self, NMDeviceStateReason reason)
return;
}
+ if (!priv->supplicant.auth_status_id) {
+ priv->supplicant.auth_status_id = g_signal_connect (priv->supplicant.iface,
+ NM_SUPPLICANT_INTERFACE_AUTH_STATUS_CHANGED,
+ G_CALLBACK (supplicant_auth_status_changed),
+ self);
+ }
+
nm_device_state_changed (NM_DEVICE (self),
NM_DEVICE_STATE_FAILED,
reason);
diff --git a/src/supplicant/nm-supplicant-interface.c b/src/supplicant/nm-supplicant-interface.c
index e94c98765b..9743e52880 100644
--- a/src/supplicant/nm-supplicant-interface.c
+++ b/src/supplicant/nm-supplicant-interface.c
@@ -93,6 +93,7 @@ enum {
GROUP_STARTED, /* a new Group (interface) was created */
GROUP_FINISHED, /* a Group (interface) has been finished */
GROUP_FORMATION_FAILURE, /* P2P Group formation failed */
+ AUTH_STATUS_CHANGED, /* Authentication status changed */
LAST_SIGNAL
};
static guint signals[LAST_SIGNAL] = { 0 };
@@ -1270,6 +1271,17 @@ wpas_iface_network_request (GDBusProxy *proxy,
}
static void
+eap_changed (GDBusProxy *proxy,
+ const char *status,
+ const char *parameter,
+ gpointer user_data)
+{
+ NMSupplicantInterface *self = NM_SUPPLICANT_INTERFACE (user_data);
+
+ g_signal_emit (self, signals[AUTH_STATUS_CHANGED], 0, status, parameter);
+}
+
+static void
props_changed_cb (GDBusProxy *proxy,
GVariant *changed_properties,
GStrv invalidated_properties,
@@ -1611,6 +1623,8 @@ on_iface_proxy_acquired (GDBusProxy *proxy, GAsyncResult *result, gpointer user_
G_CALLBACK (wpas_iface_bss_removed), self);
_nm_dbus_signal_connect (priv->iface_proxy, "NetworkRequest", G_VARIANT_TYPE ("(oss)"),
G_CALLBACK (wpas_iface_network_request), self);
+ _nm_dbus_signal_connect (priv->iface_proxy, "EAP", G_VARIANT_TYPE ("(ss)"),
+ G_CALLBACK (eap_changed), self);
/* Scan result aging parameters */
g_dbus_proxy_call (priv->iface_proxy,
@@ -2981,4 +2995,12 @@ nm_supplicant_interface_class_init (NMSupplicantInterfaceClass *klass)
0,
NULL, NULL, NULL,
G_TYPE_NONE, 1, G_TYPE_VARIANT);
+
+ signals[AUTH_STATUS_CHANGED] =
+ g_signal_new (NM_SUPPLICANT_INTERFACE_AUTH_STATUS_CHANGED,
+ G_OBJECT_CLASS_TYPE (object_class),
+ G_SIGNAL_RUN_LAST,
+ 0,
+ NULL, NULL, NULL,
+ G_TYPE_NONE, 2, G_TYPE_STRING, G_TYPE_STRING);
}
diff --git a/src/supplicant/nm-supplicant-interface.h b/src/supplicant/nm-supplicant-interface.h
index 2e124df92d..f577c2c1de 100644
--- a/src/supplicant/nm-supplicant-interface.h
+++ b/src/supplicant/nm-supplicant-interface.h
@@ -82,6 +82,7 @@ typedef enum {
#define NM_SUPPLICANT_INTERFACE_GROUP_STARTED "group-started"
#define NM_SUPPLICANT_INTERFACE_GROUP_FINISHED "group-finished"
#define NM_SUPPLICANT_INTERFACE_GROUP_FORMATION_FAILURE "group-formation-failure"
+#define NM_SUPPLICANT_INTERFACE_AUTH_STATUS_CHANGED "auth-status-changed"
typedef struct _NMSupplicantInterfaceClass NMSupplicantInterfaceClass;