[connman]: Fixed: ConnMan keep trying connection infintely
[platform/upstream/connman.git] / plugins / wifi.c
index 76a1d7a..1c136f3 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
@@ -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,