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>
#if defined TIZEN_EXT
CONNMAN_NETWORK_ERROR_DHCP_FAIL = 5,
#endif
#if defined TIZEN_EXT
CONNMAN_NETWORK_ERROR_DHCP_FAIL = 5,
#endif
+ CONNMAN_NETWORK_ERROR_BLOCKED = 6,
+
};
#define CONNMAN_NETWORK_PRIORITY_LOW -100
};
#define CONNMAN_NETWORK_PRIORITY_LOW -100
CONNMAN_SERVICE_ERROR_LOGIN_FAILED = 5,
CONNMAN_SERVICE_ERROR_AUTH_FAILED = 6,
CONNMAN_SERVICE_ERROR_INVALID_KEY = 7,
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 {
};
enum connman_service_proxy_method {
Name: connman
Version: 1.29
Name: connman
Version: 1.29
License: GPL-2.0+
Summary: Connection Manager
Url: http://connman.net
License: GPL-2.0+
Summary: Connection Manager
Url: http://connman.net
struct connman_network *scan_pending_network;
bool allow_full_scan;
#endif
struct connman_network *scan_pending_network;
bool allow_full_scan;
#endif
+#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,
/* We disable the selected network, if not then
* wpa_supplicant will loop retrying */
if (g_supplicant_interface_enable_selected_network(interface,
#if defined TIZEN_EXT
int err;
#if defined TIZEN_EXT
int err;
err = g_supplicant_interface_remove_network(wifi->interface);
if (err < 0)
DBG("Failed to remove network(%d)", err);
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 */
/* Some of Wi-Fi networks are not comply Wi-Fi specification.
* Retry association until its retry count is expired */
- 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,
}
/* To avoid unnecessary repeated association in wpa_supplicant,
CONNMAN_SERVICE_ERROR_CONNECT_FAILED);
}
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)
{
#if defined TIZEN_EXT
static void set_dhcp_error(struct connman_network *network)
{
set_dhcp_error(network);
break;
#endif
set_dhcp_error(network);
break;
#endif
+
+ case CONNMAN_NETWORK_ERROR_BLOCKED:
+ set_blocked_error(network);
+ break;
+
}
__connman_network_disconnect(network);
}
__connman_network_disconnect(network);
return "auth-failed";
case CONNMAN_SERVICE_ERROR_INVALID_KEY:
return "invalid-key";
return "auth-failed";
case CONNMAN_SERVICE_ERROR_INVALID_KEY:
return "invalid-key";
+ case CONNMAN_SERVICE_ERROR_BLOCKED:
+ return "blocked";