diff options
-rwxr-xr-x | include/network.h | 2 | ||||
-rwxr-xr-x | include/service.h | 1 | ||||
-rwxr-xr-x | packaging/connman.spec | 2 | ||||
-rwxr-xr-x | plugins/wifi.c | 29 | ||||
-rwxr-xr-x | src/network.c | 16 | ||||
-rwxr-xr-x | src/service.c | 2 |
6 files changed, 46 insertions, 6 deletions
diff --git a/include/network.h b/include/network.h index a6095224..68dc4107 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 fe55d4bc..ff296138 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 ec6a4573..5db54f07 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 76a1d7a0..1c136f32 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 715c8ea9..86876192 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 34a37a7b..fa2f7097 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; |