Merge "[connman]: Fixed: ConnMan keep trying connection infintely" into tizen
authortaesub kim <taesub.kim@samsung.com>
Tue, 7 Feb 2017 10:24:21 +0000 (02:24 -0800)
committerGerrit Code Review <gerrit@review.vlan103.tizen.org>
Tue, 7 Feb 2017 10:24:21 +0000 (02:24 -0800)
include/network.h
include/service.h
plugins/wifi.c
src/network.c
src/service.c

index a609522..68dc410 100755 (executable)
@@ -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
index fe55d4b..ff29613 100755 (executable)
@@ -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 {
index c9d8c80..84d0708 100755 (executable)
@@ -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
@@ -2661,6 +2663,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,
@@ -2669,13 +2690,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 */
@@ -2685,9 +2704,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,
index 715c8ea..8687619 100755 (executable)
@@ -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);
index f24f491..f561170 100755 (executable)
@@ -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;