1fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt/*
2fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt * BSS Load Element / Channel Utilization
3fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt * Copyright (c) 2014, Qualcomm Atheros, Inc.
4fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt *
5fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt * This software may be distributed under the terms of the BSD license.
6fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt * See README for more details.
7fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt */
8fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt
9fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt#include "utils/includes.h"
10fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt
11fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt#include "utils/common.h"
12fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt#include "utils/eloop.h"
13fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt#include "hostapd.h"
14fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt#include "bss_load.h"
15fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt#include "ap_drv_ops.h"
16fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt#include "beacon.h"
17fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt
18fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt
19fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidtstatic void update_channel_utilization(void *eloop_data, void *user_data)
20fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt{
21fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	struct hostapd_data *hapd = eloop_data;
22fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	unsigned int sec, usec;
23fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	int err;
24fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt
25fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	if (!(hapd->beacon_set_done && hapd->started))
26fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt		return;
27fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt
28fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	err = hostapd_drv_get_survey(hapd, hapd->iface->freq);
29fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	if (err) {
30fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt		wpa_printf(MSG_ERROR, "BSS Load: Failed to get survey data");
31fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt		return;
32fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	}
33fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt
34fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	ieee802_11_set_beacon(hapd);
35fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt
36fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	sec = ((hapd->bss_load_update_timeout / 1000) * 1024) / 1000;
37fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	usec = (hapd->bss_load_update_timeout % 1000) * 1024;
38fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	eloop_register_timeout(sec, usec, update_channel_utilization, hapd,
39fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt			       NULL);
40fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt}
41fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt
42fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt
43fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidtint bss_load_update_init(struct hostapd_data *hapd)
44fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt{
45fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	struct hostapd_bss_config *conf = hapd->conf;
46fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	struct hostapd_config *iconf = hapd->iconf;
47fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	unsigned int sec, usec;
48fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt
49fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	if (!conf->bss_load_update_period || !iconf->beacon_int)
50fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt		return -1;
51fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt
52fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	hapd->bss_load_update_timeout = conf->bss_load_update_period *
53fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt					iconf->beacon_int;
54fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	sec = ((hapd->bss_load_update_timeout / 1000) * 1024) / 1000;
55fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	usec = (hapd->bss_load_update_timeout % 1000) * 1024;
56fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	eloop_register_timeout(sec, usec, update_channel_utilization, hapd,
57fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt			       NULL);
58fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	return 0;
59fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt}
60fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt
61fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt
62fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidtvoid bss_load_update_deinit(struct hostapd_data *hapd)
63fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt{
64fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt	eloop_cancel_timeout(update_channel_utilization, hapd, NULL);
65fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt}
66