summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorManeesh Jain <maneesh.jain@samsung.com>2016-12-22 13:00:28 (GMT)
committerManeesh Jain <maneesh.jain@samsung.com>2017-01-09 07:35:39 (GMT)
commit77076d221356867d576bba8084614f1b15700597 (patch)
tree4365d814ba30ea2915e9f0a8471dab61358c0b22
parente2224351c2934d63d8e944b69e572a99db209919 (diff)
downloadconnman-77076d221356867d576bba8084614f1b15700597.zip
connman-77076d221356867d576bba8084614f1b15700597.tar.gz
connman-77076d221356867d576bba8084614f1b15700597.tar.bz2
[connman]: Fixed: ConnMan keep trying connection infintelyrefs/changes/21/106721/8
Description : In following use case, ConnMan was stuck in auto-connection with a specific AP. In that time, user could not be able to select any other AP for connection. 1. Connect with an AP 2. Add the Device Mac address in AP's Mac filter list 3. Device disconnect from AP 4. Device keep trying to connection with AP Partially added following upstream patch. "http://git.kernel.org/cgit/network/connman/connman.git/commit/?id=3bda07204b11158dd18322db6e64dc92bdd07124" Change-Id: I1731bfd21324c83a87f4ff2a5fccf264fd7883f5 Signed-off-by: Maneesh Jain <maneesh.jain@samsung.com>
-rwxr-xr-xinclude/network.h2
-rwxr-xr-xinclude/service.h1
-rwxr-xr-xpackaging/connman.spec2
-rwxr-xr-xplugins/wifi.c29
-rwxr-xr-xsrc/network.c16
-rwxr-xr-xsrc/service.c2
6 files changed, 46 insertions, 6 deletions
diff --git a/include/network.h b/include/network.h
index a609522..68dc410 100755
--- a/include/network.h
+++ b/include/network.h
@@ -58,6 +58,8 @@ enum connman_network_error {
#if defined TIZEN_EXT
CONNMAN_NETWORK_ERROR_DHCP_FAIL = 5,
#endif
+ CONNMAN_NETWORK_ERROR_BLOCKED = 6,
+
};
#define CONNMAN_NETWORK_PRIORITY_LOW -100
diff --git a/include/service.h b/include/service.h
index fe55d4b..ff29613 100755
--- a/include/service.h
+++ b/include/service.h
@@ -83,6 +83,7 @@ enum connman_service_error {
CONNMAN_SERVICE_ERROR_LOGIN_FAILED = 5,
CONNMAN_SERVICE_ERROR_AUTH_FAILED = 6,
CONNMAN_SERVICE_ERROR_INVALID_KEY = 7,
+ CONNMAN_SERVICE_ERROR_BLOCKED = 8,
};
enum connman_service_proxy_method {
diff --git a/packaging/connman.spec b/packaging/connman.spec
index ec6a457..5db54f0 100755
--- a/packaging/connman.spec
+++ b/packaging/connman.spec
@@ -4,7 +4,7 @@
Name: connman
Version: 1.29
-Release: 19
+Release: 20
License: GPL-2.0+
Summary: Connection Manager
Url: http://connman.net
diff --git a/plugins/wifi.c b/plugins/wifi.c
index 76a1d7a..1c136f3 100755
--- a/plugins/wifi.c
+++ b/plugins/wifi.c
@@ -133,6 +133,8 @@ struct wifi_data {
struct connman_network *scan_pending_network;
bool allow_full_scan;
#endif
+ int disconnect_code;
+
};
#if defined TIZEN_EXT
@@ -2658,6 +2660,25 @@ static void interface_state(GSupplicantInterface *interface)
network, wifi))
break;
+#if defined TIZEN_EXT
+ wifi->disconnect_code = g_supplicant_interface_get_disconnect_reason(wifi->interface);
+ DBG("Disconnect Reason code %d", wifi->disconnect_code);
+#endif
+ /* See table 8-36 Reason codes in IEEE Std 802.11 */
+ switch (wifi->disconnect_code) {
+ case 1: /* Unspecified reason */
+ /* Let's assume it's because we got blocked */
+
+ case 6: /* Class 2 frame received from nonauthenticated STA */
+ connman_network_set_error(network,
+ CONNMAN_NETWORK_ERROR_BLOCKED);
+ break;
+
+ default:
+ break;
+ }
+
+
/* We disable the selected network, if not then
* wpa_supplicant will loop retrying */
if (g_supplicant_interface_enable_selected_network(interface,
@@ -2666,13 +2687,11 @@ static void interface_state(GSupplicantInterface *interface)
#if defined TIZEN_EXT
int err;
- int reason_code = 0;
err = g_supplicant_interface_remove_network(wifi->interface);
if (err < 0)
DBG("Failed to remove network(%d)", err);
- reason_code = g_supplicant_interface_get_disconnect_reason(wifi->interface);
/* Some of Wi-Fi networks are not comply Wi-Fi specification.
* Retry association until its retry count is expired */
@@ -2682,9 +2701,9 @@ static void interface_state(GSupplicantInterface *interface)
break;
}
- if(reason_code > 0){
- DBG("Set disconnect reason code(%d)", reason_code);
- connman_network_set_disconnect_reason(network, reason_code);
+ if(wifi->disconnect_code > 0){
+ DBG("Set disconnect reason code(%d)", wifi->disconnect_code);
+ connman_network_set_disconnect_reason(network, wifi->disconnect_code);
}
/* To avoid unnecessary repeated association in wpa_supplicant,
diff --git a/src/network.c b/src/network.c
index 715c8ea..8687619 100755
--- a/src/network.c
+++ b/src/network.c
@@ -1403,6 +1403,17 @@ static void set_connect_error(struct connman_network *network)
CONNMAN_SERVICE_ERROR_CONNECT_FAILED);
}
+static void set_blocked_error(struct connman_network *network)
+{
+ struct connman_service *service;
+
+ service = connman_service_lookup_from_network(network);
+
+ __connman_service_indicate_error(service,
+ CONNMAN_SERVICE_ERROR_BLOCKED);
+}
+
+
#if defined TIZEN_EXT
static void set_dhcp_error(struct connman_network *network)
{
@@ -1477,6 +1488,11 @@ void connman_network_set_error(struct connman_network *network,
set_dhcp_error(network);
break;
#endif
+
+ case CONNMAN_NETWORK_ERROR_BLOCKED:
+ set_blocked_error(network);
+ break;
+
}
__connman_network_disconnect(network);
diff --git a/src/service.c b/src/service.c
index 34a37a7..fa2f709 100755
--- a/src/service.c
+++ b/src/service.c
@@ -412,6 +412,8 @@ static const char *error2string(enum connman_service_error error)
return "auth-failed";
case CONNMAN_SERVICE_ERROR_INVALID_KEY:
return "invalid-key";
+ case CONNMAN_SERVICE_ERROR_BLOCKED:
+ return "blocked";
}
return NULL;