summaryrefslogtreecommitdiff
path: root/gsupplicant
diff options
context:
space:
mode:
authorTomasz Bursztyka <tomasz.bursztyka@linux.intel.com>2012-10-10 11:18:45 +0300
committerPatrik Flykt <patrik.flykt@linux.intel.com>2012-10-16 13:18:02 +0300
commit583b1a120a8b5b11654c389144d9f7f96c4cfe35 (patch)
treef47f61249fdb58d290f71e4e99f933093661634f /gsupplicant
parentc270ca4eeaefc43ec471ba0b5383b50f4d34c0b7 (diff)
downloadconnman-583b1a120a8b5b11654c389144d9f7f96c4cfe35.tar.gz
connman-583b1a120a8b5b11654c389144d9f7f96c4cfe35.tar.bz2
connman-583b1a120a8b5b11654c389144d9f7f96c4cfe35.zip
gsupplicant: Add a new state according to 'interface_disabled'
When soft rfkill is on, wpa_supplicant sets the interface disabled and sends a state named 'interface_disabled'. Taking this information into account fixes the following issue: - disable wifi (user setting) and hard rfkill it - then un-hard rfkill it, whereafter rfkill states (soft/hard) will go like this: * from 1/1 to 0/0 * from 0/0 to 1/0 when 0/0 occurs, connman will request to enable wifi The problem with this is that enabling wifi takes quite some time and in between ConnMan will soft block wifi to disable it (according to previous user setting). Thus it will request to disable wifi but since enabling is still going on, this request won't do anything. Meanwhile wpa_supplicant will also catch the soft rfkill event and wpa_supplicant will set the state to 'interface_disabled', but since it's not handled properly by ConnMan, the wifi_enable() callback will be called and the function will assume wifi got enabled.
Diffstat (limited to 'gsupplicant')
-rw-r--r--gsupplicant/gsupplicant.h1
-rw-r--r--gsupplicant/supplicant.c8
2 files changed, 8 insertions, 1 deletions
diff --git a/gsupplicant/gsupplicant.h b/gsupplicant/gsupplicant.h
index 4e0118d9..790cfedc 100644
--- a/gsupplicant/gsupplicant.h
+++ b/gsupplicant/gsupplicant.h
@@ -95,6 +95,7 @@ typedef enum {
typedef enum {
G_SUPPLICANT_STATE_UNKNOWN,
+ G_SUPPLICANT_STATE_DISABLED,
G_SUPPLICANT_STATE_DISCONNECTED,
G_SUPPLICANT_STATE_INACTIVE,
G_SUPPLICANT_STATE_SCANNING,
diff --git a/gsupplicant/supplicant.c b/gsupplicant/supplicant.c
index be429586..477106b1 100644
--- a/gsupplicant/supplicant.c
+++ b/gsupplicant/supplicant.c
@@ -287,6 +287,8 @@ static GSupplicantState string2state(const char *state)
if (g_str_equal(state, "unknown") == TRUE)
return G_SUPPLICANT_STATE_UNKNOWN;
+ else if (g_str_equal(state, "interface_disabled") == TRUE)
+ return G_SUPPLICANT_STATE_DISABLED;
else if (g_str_equal(state, "disconnected") == TRUE)
return G_SUPPLICANT_STATE_DISCONNECTED;
else if (g_str_equal(state, "inactive") == TRUE)
@@ -1681,7 +1683,6 @@ static void interface_property(const char *key, DBusMessageIter *iter,
debug_strvalmap("Mode capability", mode_capa_map,
interface->mode_capa);
- interface->ready = TRUE;
callback_interface_added(interface);
return;
}
@@ -1698,6 +1699,10 @@ static void interface_property(const char *key, DBusMessageIter *iter,
interface->state = string2state(str);
callback_interface_state(interface);
}
+ if (interface->state == G_SUPPLICANT_STATE_DISABLED)
+ interface->ready = FALSE;
+ else
+ interface->ready = TRUE;
SUPPLICANT_DBG("state %s (%d)", str, interface->state);
} else if (g_strcmp0(key, "Scanning") == 0) {
@@ -2857,6 +2862,7 @@ int g_supplicant_interface_scan(GSupplicantInterface *interface,
case G_SUPPLICANT_STATE_GROUP_HANDSHAKE:
return -EBUSY;
case G_SUPPLICANT_STATE_UNKNOWN:
+ case G_SUPPLICANT_STATE_DISABLED:
case G_SUPPLICANT_STATE_DISCONNECTED:
case G_SUPPLICANT_STATE_INACTIVE:
case G_SUPPLICANT_STATE_SCANNING: