Add setter/getter for handling MAC randomization policy
[platform/upstream/connman.git] / plugins / wifi.c
index 7f26417..5b4a0aa 100755 (executable)
 
 #include <gsupplicant/gsupplicant.h>
 
+#include "src/shared/util.h"
+
 #define CLEANUP_TIMEOUT   8    /* in seconds */
 #define INACTIVE_TIMEOUT  12   /* in seconds */
 #define FAVORITE_MAXIMUM_RETRIES 2
 
-#define BGSCAN_DEFAULT "simple:30:-45:300"
+#define BGSCAN_DEFAULT "simple:30:-65:300"
 #define AUTOSCAN_EXPONENTIAL "exponential:3:300"
 #define AUTOSCAN_SINGLE "single:3"
 
@@ -2406,7 +2408,7 @@ static void setup_autoscan(struct wifi_data *wifi)
 
                return;
        }
-#endif
+#else
 
        /*
         * On the contrary, if BackgroundScanning is disabled, update autoscan
@@ -2430,8 +2432,15 @@ static void setup_autoscan(struct wifi_data *wifi)
                wifi->autoscan = parse_autoscan_params(AUTOSCAN_SINGLE);
                break;
        }
+#endif
 }
 
+#ifdef TIZEN_EXT
+int wifi_set_mac_policy(struct connman_device *device, unsigned int policy);
+int wifi_set_preassoc_mac_policy(struct connman_device *device, unsigned int policy);
+int wifi_set_random_mac_lifetime(struct connman_device *device, unsigned int lifetime);
+#endif /* TIZEN_EXT */
+
 static void finalize_interface_creation(struct wifi_data *wifi)
 {
        DBG("interface is ready wifi %p tethering %d", wifi, wifi->tethering);
@@ -2443,6 +2452,17 @@ static void finalize_interface_creation(struct wifi_data *wifi)
 
        connman_device_set_powered(wifi->device, true);
 
+#ifdef TIZEN_EXT
+       wifi_set_mac_policy(wifi->device,
+                               connman_device_get_mac_policy(wifi->device));
+
+       wifi_set_preassoc_mac_policy(wifi->device,
+                               connman_device_get_preassoc_mac_policy(wifi->device));
+
+       wifi_set_random_mac_lifetime(wifi->device,
+                               connman_device_get_random_mac_lifetime(wifi->device));
+#endif /* TIZEN_EXT */
+
        if (wifi->p2p_device)
                return;
 
@@ -2618,7 +2638,7 @@ static int get_latest_connections(int max_ssids,
                        g_key_file_free(keyfile);
                        continue;
                }
-               g_time_val_from_iso8601(str, &modified);
+               util_iso8601_to_timeval(str, &modified);
                g_free(str);
 
                ssid = g_key_file_get_string(keyfile,
@@ -2954,6 +2974,99 @@ static int wifi_specific_scan(enum connman_service_type type,
 
        return ret;
 }
+
+static void wifi_mac_policy_callback(int result,
+                                       unsigned int policy,
+                                               void *user_data)
+{
+       struct connman_device *device = user_data;
+
+       if (result == 0)
+               connman_device_mac_policy_notify(device, result, policy);
+
+       connman_device_unref(device);
+}
+
+int wifi_set_mac_policy(struct connman_device *device, unsigned int policy)
+{
+       struct wifi_data *wifi = connman_device_get_data(device);
+       int ret;
+
+       if (!wifi)
+               return -EINVAL;
+
+       connman_device_ref(device);
+
+       ret = g_supplicant_interface_set_mac_policy(wifi->interface,
+                                       wifi_mac_policy_callback,
+                                       policy, device);
+       if (ret != 0)
+               connman_device_unref(device);
+
+       return ret;
+}
+
+static void wifi_preassoc_mac_policy_callback(int result,
+                                       unsigned int policy,
+                                               void *user_data)
+{
+       struct connman_device *device = user_data;
+
+       if (result == 0)
+               connman_device_preassoc_mac_policy_notify(device, result, policy);
+
+       connman_device_unref(device);
+}
+
+int wifi_set_preassoc_mac_policy(struct connman_device *device, unsigned int policy)
+{
+       struct wifi_data *wifi = connman_device_get_data(device);
+       int ret;
+
+       if (!wifi)
+               return -EINVAL;
+
+       connman_device_ref(device);
+
+       ret = g_supplicant_interface_set_preassoc_mac_policy(wifi->interface,
+                                       wifi_preassoc_mac_policy_callback,
+                                       policy, device);
+       if (ret != 0)
+               connman_device_unref(device);
+
+       return ret;
+}
+
+static void wifi_random_mac_lifetime_callback(int result,
+                                       unsigned int lifetime,
+                                               void *user_data)
+{
+       struct connman_device *device = user_data;
+
+       if (result == 0)
+               connman_device_random_mac_lifetime_notify(device, result, lifetime);
+
+       connman_device_unref(device);
+}
+
+int wifi_set_random_mac_lifetime(struct connman_device *device, unsigned int lifetime)
+{
+       struct wifi_data *wifi = connman_device_get_data(device);
+       int ret;
+
+       if (!wifi)
+               return -EINVAL;
+
+       connman_device_ref(device);
+
+       ret = g_supplicant_interface_set_random_mac_lifetime(wifi->interface,
+                                       wifi_random_mac_lifetime_callback,
+                                       lifetime, device);
+       if (ret != 0)
+               connman_device_unref(device);
+
+       return ret;
+}
 #endif
 
 #if defined TIZEN_EXT_WIFI_MESH
@@ -2986,7 +3099,7 @@ static int mesh_scan(struct connman_device *device)
 
        wifi = connman_device_get_data(device);
 
-       if (!wifi->mesh_interface)
+       if (!wifi || !wifi->mesh_interface)
                return -ENOTSUP;
 
        mesh_info = wifi->mesh_info;
@@ -3329,6 +3442,9 @@ static struct connman_device_driver wifi_ng_driver = {
        .set_regdom     = wifi_set_regdom,
 #if defined TIZEN_EXT
        .specific_scan  = wifi_specific_scan,
+       .set_mac_policy           = wifi_set_mac_policy,
+       .set_preassoc_mac_policy  = wifi_set_preassoc_mac_policy,
+       .set_random_mac_lifetime  = wifi_set_random_mac_lifetime,
 #endif
 #if defined TIZEN_EXT_WIFI_MESH
        .abort_scan     = mesh_abort_scan,
@@ -3353,6 +3469,9 @@ static void system_killed(void)
 
 static int network_probe(struct connman_network *network)
 {
+#if defined TIZEN_EXT
+       if (!simplified_log)
+#endif
        DBG("network %p", network);
 
        return 0;
@@ -3397,7 +3516,8 @@ static void connect_callback(int result, GSupplicantInterface *interface,
        DBG("network %p result %d", network, result);
 
 #if defined TIZEN_EXT
-       set_connman_bssid(RESET_BSSID, NULL);
+       const char *ifname = g_supplicant_interface_get_ifname(interface);
+       set_connman_bssid(RESET_BSSID, NULL, ifname);
 
        for (list = iface_list; list; list = list->next) {
                wifi = list->data;
@@ -3550,9 +3670,11 @@ static void ssid_init(GSupplicantSSID *ssid, struct connman_network *network)
 #endif
 
 #if defined TIZEN_EXT
-       if (set_connman_bssid(CHECK_BSSID, NULL) == 6) {
+       const char *ifname = connman_device_get_string(
+                       connman_network_get_device(network), "Interface");
+       if (set_connman_bssid(CHECK_BSSID, NULL, ifname) == 6) {
                ssid->bssid_for_connect_len = 6;
-               set_connman_bssid(GET_BSSID, (char *)ssid->bssid_for_connect);
+               set_connman_bssid(GET_BSSID, (char *)ssid->bssid_for_connect, ifname);
                DBG("BSSID : %02x:%02x:%02x:%02x:%02x:%02x",
                        ssid->bssid_for_connect[0], ssid->bssid_for_connect[1],
                        ssid->bssid_for_connect[2], ssid->bssid_for_connect[3],
@@ -3568,8 +3690,8 @@ static void ssid_init(GSupplicantSSID *ssid, struct connman_network *network)
                 * the user-specified bssid is tried only once at the beginning.
                 * After that, the bssids in the list are tried in order.
                 */
-               if (set_connman_bssid(CHECK_BSSID, NULL) == 6) {
-                       set_connman_bssid(RESET_BSSID, NULL);
+               if (set_connman_bssid(CHECK_BSSID, NULL, ifname) == 6) {
+                       set_connman_bssid(RESET_BSSID, NULL, ifname);
                        goto done;
                }
 
@@ -3701,7 +3823,7 @@ found:
                return;
        }
 
-       if (wifi->network != wifi->pending_network)
+       if (wifi->network && wifi->network != wifi->pending_network)
                connman_network_set_connected(wifi->network, false);
        wifi->network = NULL;
 
@@ -3854,6 +3976,7 @@ static void signalpoll_callback(int result, int maxspeed, int strength,
 
        if (result != 0) {
                DBG("Failed to get maxspeed from signalpoll !");
+               connman_network_unref(network);
                return;
        }
 
@@ -3862,11 +3985,12 @@ static void signalpoll_callback(int result, int maxspeed, int strength,
                strength = 100;
 
        DBG("maxspeed = %d, strength = %d", maxspeed, strength);
-       if (network) {
-               connman_network_set_strength(network, (uint8_t)strength);
-               connman_network_set_maxspeed(network, maxspeed);
-               set_connection_mode(network, maxspeed);
-       }
+
+       connman_network_set_strength(network, (uint8_t)strength);
+       connman_network_set_maxspeed(network, maxspeed);
+       set_connection_mode(network, maxspeed);
+
+       connman_network_unref(network);
 }
 
 static int network_signalpoll(struct wifi_data *wifi)
@@ -3877,6 +4001,8 @@ static int network_signalpoll(struct wifi_data *wifi)
        if (!wifi || !wifi->network)
                return -ENODEV;
 
+       wifi->network = connman_network_ref(wifi->network);
+
        interface = wifi->interface;
        network = wifi->network;
 
@@ -3898,6 +4024,9 @@ static gboolean autosignalpoll_timeout(gpointer data)
        if (ret < 0) {
                DBG("Fail to get max speed !!");
                wifi->automaxspeed_timeout = 0;
+
+               if (wifi->network)
+                       connman_network_unref(wifi->network);
                return FALSE;
        }
 
@@ -3956,10 +4085,10 @@ static void interface_added(GSupplicantInterface *interface)
 
        connman_device_set_powered(wifi->device, true);
 #if defined TIZEN_EXT
-       connman_techonology_wifi_set_5ghz_supported(wifi_technology, is_5_0_ghz_supported);
+       connman_device_set_wifi_5ghz_supported(wifi->device, is_5_0_ghz_supported);
        /* Max number of SSIDs supported by wlan chipset that can be scanned */
        int max_scan_ssids = g_supplicant_interface_get_max_scan_ssids(interface);
-       connman_techonology_set_max_scan_ssids(wifi_technology, max_scan_ssids);
+       connman_device_set_max_scan_ssids(wifi->device, max_scan_ssids);
 #endif
 }
 
@@ -4809,7 +4938,9 @@ static void network_added(GSupplicantNetwork *supplicant_network)
 
        mode = g_supplicant_network_get_mode(supplicant_network);
        identifier = g_supplicant_network_get_identifier(supplicant_network);
-
+#if defined TIZEN_EXT
+       if (!simplified_log)
+#endif
        DBG("%s", identifier);
 
        if (!g_strcmp0(mode, "adhoc"))
@@ -5062,7 +5193,8 @@ static void network_changed(GSupplicantNetwork *network, const char *property)
        name = g_supplicant_network_get_name(network);
 
 #if defined TIZEN_EXT
-       DBG("name %s property %s", name, property);
+       if (!simplified_log)
+               DBG("name %s property %s", name, property);
 #else
        DBG("name %s", name);
 #endif
@@ -5600,7 +5732,8 @@ static void scan_done(GSupplicantInterface *interface)
                        scanning = connman_device_get_scanning(wifi->device,
                                        CONNMAN_SERVICE_TYPE_WIFI);
                        if (!scanning)
-                               __connman_technology_notify_scan_done(scan_type);
+                               __connman_technology_notify_scan_done(
+                                               connman_device_get_string(wifi->device, "Interface"), scan_type);
                        break;
                }
        }