void connman_network_set_assoc_reject_table(struct connman_network *network,
GHashTable *assoc_reject_table);
GHashTable *connman_network_get_assoc_reject_table(struct connman_network *network);
+__time_t connman_network_get_roam_scan_time(struct connman_network *network);
+void connman_network_set_roam_scan_time(struct connman_network *network,
+ __time_t roam_scan_time);
int connman_network_get_snr(struct connman_network *network);
void connman_network_set_snr(struct connman_network *network, int snr);
#endif
#define WIFI_BSSID_STR_LEN 18
#define MAC2STR(a) (a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5]
#define MACSTR "%02x:%02x:%02x:%02x:%02x:%02x"
+#define ROAM_SCAN_INTERVAL 60 /* 60 seconds */
#endif
static struct connman_technology *wifi_technology = NULL;
char bssid_buff[WIFI_BSSID_STR_LEN] = {0,};
char *bssid_str = bssid_buff;
unsigned char *bssid;
+ struct timespec curr_time = {0};
+ __time_t roam_scan_time;
const char *interface = NULL;
struct connman_device *device;
struct connman_network *network = user_data;
connman_network_set_maxspeed(network, maxspeed);
set_connection_mode(network, maxspeed);
- bssid = connman_network_get_bssid(network);
- device = connman_network_get_device(network);
-
- if (device)
- interface = connman_device_get_string(device, "Interface");
-
- connman_network_unref(network);
+ clock_gettime(CLOCK_MONOTONIC, &curr_time);
+ roam_scan_time = connman_network_get_roam_scan_time(network);
+ if (curr_time.tv_sec <= roam_scan_time + ROAM_SCAN_INTERVAL)
+ goto done;
if (need_bss_transition(freq, snr, strength)) {
+ device = connman_network_get_device(network);
+ if (device)
+ interface = connman_device_get_string(device, "Interface");
+
+ bssid = connman_network_get_bssid(network);
snprintf(bssid_str, WIFI_BSSID_STR_LEN, MACSTR, MAC2STR(bssid));
__connman_technology_notify_roaming_state(interface, "required", bssid_str, NULL);
if (connman_setting_get_bool("WifiRoamingScan") == false)
- return;
+ goto done;
throw_wifi_scan(device, scan_callback);
+ connman_network_set_roam_scan_time(network, curr_time.tv_sec);
}
+
+done:
+ connman_network_unref(network);
}
static int network_signalpoll(struct wifi_data *wifi)
bool roaming_progress;
char *roaming_cur_bssid;
char *roaming_dst_bssid;
+ __time_t roam_scan_time;
int snr;
#endif
} wifi;
return network->wifi.assoc_reject_table;
}
+__time_t connman_network_get_roam_scan_time(struct connman_network *network)
+{
+ return network->wifi.roam_scan_time;
+}
+
+void connman_network_set_roam_scan_time(struct connman_network *network,
+ __time_t roam_scan_time)
+{
+ network->wifi.roam_scan_time = roam_scan_time;
+}
+
int connman_network_get_snr(struct connman_network *network)
{
return network->wifi.snr;