Add BSSID , signal strength and frequency list of the APs
[platform/upstream/connman.git] / plugins / wifi.c
index 3d7636c..aad3b2c 100755 (executable)
 #define ASSOC_STATUS_NO_CLIENT 17
 #define LOAD_SHAPING_MAX_RETRIES 3
 
+#if defined TIZEN_EXT
+#define WIFI_EAP_FAST_PAC_FILE         "/var/lib/wifi/wifi.pac"        /* path of Pac file for EAP-FAST */
+#endif
+
 static struct connman_technology *wifi_technology = NULL;
 static struct connman_technology *p2p_technology = NULL;
 
@@ -2071,7 +2075,7 @@ static int wifi_specific_scan(enum connman_service_type type,
                return -EALREADY;
 
        DBG("scan_type: %d", scan_type);
-       if (scan_type == 1) { /* ssid based scan */
+       if (scan_type == CONNMAN_MULTI_SCAN_SSID) { /* ssid based scan */
                scan_params = g_try_malloc0(sizeof(GSupplicantScanParams));
                if (!scan_params) {
                        DBG("Failed to allocate memory.");
@@ -2097,7 +2101,7 @@ static int wifi_specific_scan(enum connman_service_type type,
                }
                scan_params->num_ssids = count;
 
-       } else if (scan_type == 2) { /* frequency based scan */
+       } else if (scan_type == CONNMAN_MULTI_SCAN_FREQ) { /* frequency based scan */
 
                scan_params = g_try_malloc0(sizeof(GSupplicantScanParams));
                if (!scan_params) {
@@ -2125,6 +2129,51 @@ static int wifi_specific_scan(enum connman_service_type type,
                }
                scan_params->num_freqs = count;
 
+       } else if (scan_type == CONNMAN_MULTI_SCAN_SSID_FREQ) { /* SSID & Frequency mixed scan */
+               int freq_count, ap_count;
+               scan_params = g_try_malloc0(sizeof(GSupplicantScanParams));
+               if (!scan_params) {
+                       DBG("Failed to allocate memory.");
+                       return -ENOMEM;
+               }
+
+               guint size = g_slist_length(specific_scan_list);
+
+               scan_params->freqs = g_try_new0(uint16_t, size/2);
+               if (!scan_params->freqs) {
+                       DBG("Failed to allocate memory.");
+                       g_free(scan_params);
+                       return -ENOMEM;
+               }
+
+               ap_count = freq_count = 0;
+               for (list = specific_scan_list; list; list = list->next) {
+                       if (((connman_multi_scan_ap_s *)list->data)->flag == true) { /** ssid */
+                               ssid = ((connman_multi_scan_ap_s *)list->data)->str;
+                               int ssid_len = strlen(ssid);
+
+                               scan_ssid = g_try_new0(struct scan_ssid, 1);
+                               if (!scan_ssid) {
+                                       DBG("Failed to allocate memory.");
+                                       g_supplicant_free_scan_params(scan_params);
+                                       return -ENOMEM;
+                               }
+
+                               memcpy(scan_ssid->ssid, ssid, (ssid_len + 1));
+                               DBG("scan ssid %s len: %d", scan_ssid->ssid, ssid_len);
+                               scan_ssid->ssid_len = ssid_len;
+                               scan_params->ssids = g_slist_prepend(scan_params->ssids, scan_ssid);
+                               ap_count++;
+
+                       } else { /* freq */
+                               freq = atoi(((connman_multi_scan_ap_s *)list->data)->str);
+                               scan_params->freqs[freq_count] = freq;
+                               DBG("scan_params->freqs[%d]: %d", freq_count, scan_params->freqs[freq_count]);
+                               freq_count++;
+                       }
+               }
+               scan_params->num_ssids = ap_count;
+               scan_params->num_freqs = freq_count;
        } else {
                DBG("Invalid scan");
                return -EINVAL;
@@ -2442,6 +2491,21 @@ static GSupplicantSecurity network_security(const char *security)
        return G_SUPPLICANT_SECURITY_UNKNOWN;
 }
 
+#if defined TIZEN_EXT
+static GSupplicantEapKeymgmt network_eap_keymgmt(const char *security)
+{
+       if (security == NULL)
+               return G_SUPPLICANT_EAP_KEYMGMT_NONE;
+
+       if (g_str_equal(security, "FT") == TRUE)
+               return G_SUPPLICANT_EAP_KEYMGMT_FT;
+       else if (g_str_equal(security, "CCKM") == TRUE)
+               return G_SUPPLICANT_EAP_KEYMGMT_CCKM;
+
+       return G_SUPPLICANT_EAP_KEYMGMT_NONE;
+}
+#endif
+
 static void ssid_init(GSupplicantSSID *ssid, struct connman_network *network)
 {
        const char *security;
@@ -2500,8 +2564,14 @@ static void ssid_init(GSupplicantSSID *ssid, struct connman_network *network)
 
 #if defined TIZEN_EXT
        ssid->bssid = connman_network_get_bssid(network);
-#endif
-#if defined TIZEN_EXT
+
+       ssid->eap_keymgmt = network_eap_keymgmt(
+                       connman_network_get_string(network, "WiFi.KeymgmtType"));
+       ssid->phase1 = connman_network_get_string(network, "WiFi.Phase1");
+
+       if(g_strcmp0(ssid->eap, "fast") == 0)
+               ssid->pac_file = g_strdup(WIFI_EAP_FAST_PAC_FILE);
+
        if (set_connman_bssid(CHECK_BSSID, NULL) == 6) {
                ssid->bssid_for_connect_len = 6;
                set_connman_bssid(GET_BSSID, (char *)ssid->bssid_for_connect);
@@ -3347,6 +3417,7 @@ static void network_added(GSupplicantNetwork *supplicant_network)
 
 #if defined TIZEN_EXT
        GSList *vsie_list = NULL;
+       const unsigned char *country_code;
 #endif
 
        mode = g_supplicant_network_get_mode(supplicant_network);
@@ -3402,6 +3473,8 @@ static void network_added(GSupplicantNetwork *supplicant_network)
                connman_network_set_vsie_list(network, vsie_list);
        else
                DBG("vsie_list is NULL");
+       country_code = g_supplicant_network_get_countrycode(supplicant_network);
+       connman_network_set_countrycode(network, country_code);
 #endif
        connman_network_set_string(network, "WiFi.Security", security);
        connman_network_set_strength(network,
@@ -3436,6 +3509,8 @@ static void network_added(GSupplicantNetwork *supplicant_network)
                        g_supplicant_network_get_keymgmt(supplicant_network));
        connman_network_set_bool(network, "WiFi.HS20AP",
                        g_supplicant_network_is_hs20AP(supplicant_network));
+       connman_network_set_bssid_list(network,
+                       (GSList *)g_supplicant_network_get_bssid_list(supplicant_network));
 #endif
        connman_network_set_available(network, true);
        connman_network_set_string(network, "WiFi.Mode", mode);
@@ -3523,6 +3598,8 @@ static void network_changed(GSupplicantNetwork *network, const char *property)
        unsigned int maxrate;
        uint16_t frequency;
        bool wps;
+       const unsigned char *country_code;
+       GSList *bssid_list;
 #endif
 
        interface = g_supplicant_network_get_interface(network);
@@ -3555,6 +3632,10 @@ static void network_changed(GSupplicantNetwork *network, const char *property)
        connman_network_set_maxrate(connman_network, maxrate);
        connman_network_set_frequency(connman_network, frequency);
        connman_network_set_bool(connman_network, "WiFi.WPS", wps);
+       country_code = g_supplicant_network_get_countrycode(network);
+       connman_network_set_countrycode(connman_network, country_code);
+       bssid_list = (GSList *)g_supplicant_network_get_bssid_list(network);
+       connman_network_set_bssid_list(connman_network, bssid_list);
 #endif
 }
 
@@ -3704,11 +3785,6 @@ static void peer_changed(GSupplicantPeer *peer, GSupplicantPeerState state)
        struct connman_peer *connman_peer;
        const char *identifier;
 
-#if defined TIZEN_EXT
-       if (!wifi)
-               return;
-#endif
-
        identifier = g_supplicant_peer_get_identifier(peer);
 
        DBG("ident: %s", identifier);