bss_load.c revision 281681
1281681Srpaulo/*
2281681Srpaulo * BSS Load Element / Channel Utilization
3281681Srpaulo * Copyright (c) 2014, Qualcomm Atheros, Inc.
4281681Srpaulo *
5281681Srpaulo * This software may be distributed under the terms of the BSD license.
6281681Srpaulo * See README for more details.
7281681Srpaulo */
8281681Srpaulo
9281681Srpaulo#include "utils/includes.h"
10281681Srpaulo
11281681Srpaulo#include "utils/common.h"
12281681Srpaulo#include "utils/eloop.h"
13281681Srpaulo#include "hostapd.h"
14281681Srpaulo#include "bss_load.h"
15281681Srpaulo#include "ap_drv_ops.h"
16281681Srpaulo#include "beacon.h"
17281681Srpaulo
18281681Srpaulo
19281681Srpaulostatic void update_channel_utilization(void *eloop_data, void *user_data)
20281681Srpaulo{
21281681Srpaulo	struct hostapd_data *hapd = eloop_data;
22281681Srpaulo	unsigned int sec, usec;
23281681Srpaulo	int err;
24281681Srpaulo
25281681Srpaulo	if (!(hapd->beacon_set_done && hapd->started))
26281681Srpaulo		return;
27281681Srpaulo
28281681Srpaulo	err = hostapd_drv_get_survey(hapd, hapd->iface->freq);
29281681Srpaulo	if (err) {
30281681Srpaulo		wpa_printf(MSG_ERROR, "BSS Load: Failed to get survey data");
31281681Srpaulo		return;
32281681Srpaulo	}
33281681Srpaulo
34281681Srpaulo	ieee802_11_set_beacon(hapd);
35281681Srpaulo
36281681Srpaulo	sec = ((hapd->bss_load_update_timeout / 1000) * 1024) / 1000;
37281681Srpaulo	usec = (hapd->bss_load_update_timeout % 1000) * 1024;
38281681Srpaulo	eloop_register_timeout(sec, usec, update_channel_utilization, hapd,
39281681Srpaulo			       NULL);
40281681Srpaulo}
41281681Srpaulo
42281681Srpaulo
43281681Srpauloint bss_load_update_init(struct hostapd_data *hapd)
44281681Srpaulo{
45281681Srpaulo	struct hostapd_bss_config *conf = hapd->conf;
46281681Srpaulo	struct hostapd_config *iconf = hapd->iconf;
47281681Srpaulo	unsigned int sec, usec;
48281681Srpaulo
49281681Srpaulo	if (!conf->bss_load_update_period || !iconf->beacon_int)
50281681Srpaulo		return -1;
51281681Srpaulo
52281681Srpaulo	hapd->bss_load_update_timeout = conf->bss_load_update_period *
53281681Srpaulo					iconf->beacon_int;
54281681Srpaulo	sec = ((hapd->bss_load_update_timeout / 1000) * 1024) / 1000;
55281681Srpaulo	usec = (hapd->bss_load_update_timeout % 1000) * 1024;
56281681Srpaulo	eloop_register_timeout(sec, usec, update_channel_utilization, hapd,
57281681Srpaulo			       NULL);
58281681Srpaulo	return 0;
59281681Srpaulo}
60281681Srpaulo
61281681Srpaulo
62281681Srpaulovoid bss_load_update_deinit(struct hostapd_data *hapd)
63281681Srpaulo{
64281681Srpaulo	eloop_cancel_timeout(update_channel_utilization, hapd, NULL);
65281681Srpaulo}
66