104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt/*
204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * WPA Supplicant - auto scan periodic module
304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * Copyright (c) 2012, Intel Corporation. All rights reserved.
404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt *
504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * This software may be distributed under the terms of the BSD license.
604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt * See README for more details.
704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt */
804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#include "includes.h"
1004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
1104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#include "common.h"
1204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#include "wpa_supplicant_i.h"
1304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt#include "autoscan.h"
1404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
1504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
1604949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstruct autoscan_periodic_data {
1704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	int periodic_interval;
1804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt};
1904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
2004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
2104949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic int autoscan_periodic_get_params(struct autoscan_periodic_data *data,
2204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					const char *params)
2304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
2404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	int interval;
2504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
2604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (params == NULL)
2704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return -1;
2804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
2904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	interval = atoi(params);
3004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
3104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (interval < 0)
3204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return -1;
3304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
3404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	data->periodic_interval = interval;
3504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
3604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	return 0;
3704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
3804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
3904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
4004949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic void * autoscan_periodic_init(struct wpa_supplicant *wpa_s,
4104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt				     const char *params)
4204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
4304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	struct autoscan_periodic_data *data;
4404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
4504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	data = os_zalloc(sizeof(struct autoscan_periodic_data));
4604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (data == NULL)
4704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return NULL;
4804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
4904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (autoscan_periodic_get_params(data, params) < 0) {
5004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		os_free(data);
5104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return NULL;
5204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	}
5304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
5404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	wpa_printf(MSG_DEBUG, "autoscan periodic: interval is %d",
5504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		   data->periodic_interval);
5604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
5704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	return data;
5804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
5904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
6004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
6104949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic void autoscan_periodic_deinit(void *priv)
6204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
6304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	struct autoscan_periodic_data *data = priv;
6404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
6504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	os_free(data);
6604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
6704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
6804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
6904949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic int autoscan_periodic_notify_scan(void *priv,
7004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					 struct wpa_scan_results *scan_res)
7104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
7204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	struct autoscan_periodic_data *data = priv;
7304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
7404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	wpa_printf(MSG_DEBUG, "autoscan periodic: scan result notification");
7504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
7604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	return data->periodic_interval;
7704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
7804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
7904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
8004949598a23f501be6eec21697465fd46a28840aDmitry Shmidtconst struct autoscan_ops autoscan_periodic_ops = {
8104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	.name = "periodic",
8204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	.init = autoscan_periodic_init,
8304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	.deinit = autoscan_periodic_deinit,
8404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	.notify_scan = autoscan_periodic_notify_scan,
8504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt};
86