2 * BSS Load Element / Channel Utilization
3 * Copyright (c) 2014, Qualcomm Atheros, Inc.
5 * This software may be distributed under the terms of the BSD license.
6 * See README for more details.
9 #include "utils/includes.h"
11 #include "utils/common.h"
12 #include "utils/eloop.h"
15 #include "ap_drv_ops.h"
19 static int get_bss_load_update_timeout(struct hostapd_data *hapd,
20 unsigned int *sec, unsigned int *usec)
22 unsigned int update_period = hapd->conf->bss_load_update_period;
23 unsigned int beacon_int = hapd->iconf->beacon_int;
24 unsigned int update_timeout;
26 if (!update_period || !beacon_int) {
28 "BSS Load: Invalid BSS load update configuration (period=%u beacon_int=%u)",
29 update_period, beacon_int);
33 update_timeout = update_period * beacon_int;
35 *sec = ((update_timeout / 1000) * 1024) / 1000;
36 *usec = (update_timeout % 1000) * 1024;
42 static void update_channel_utilization(void *eloop_data, void *user_data)
44 struct hostapd_data *hapd = eloop_data;
45 unsigned int sec, usec;
47 struct hostapd_iface *iface = hapd->iface;
49 if (!(hapd->beacon_set_done && hapd->started))
52 err = hostapd_drv_get_survey(hapd, hapd->iface->freq);
54 wpa_printf(MSG_ERROR, "BSS Load: Failed to get survey data");
58 ieee802_11_set_beacon(hapd);
60 if (get_bss_load_update_timeout(hapd, &sec, &usec) < 0)
63 if (hapd->conf->chan_util_avg_period) {
64 iface->chan_util_samples_sum += iface->channel_utilization;
65 iface->chan_util_num_sample_periods +=
66 hapd->conf->bss_load_update_period;
67 if (iface->chan_util_num_sample_periods >=
68 hapd->conf->chan_util_avg_period) {
69 iface->chan_util_average =
70 iface->chan_util_samples_sum /
71 (iface->chan_util_num_sample_periods /
72 hapd->conf->bss_load_update_period);
73 iface->chan_util_samples_sum = 0;
74 iface->chan_util_num_sample_periods = 0;
78 eloop_register_timeout(sec, usec, update_channel_utilization, hapd,
83 int bss_load_update_init(struct hostapd_data *hapd)
85 unsigned int sec, usec;
87 if (get_bss_load_update_timeout(hapd, &sec, &usec) < 0)
90 eloop_register_timeout(sec, usec, update_channel_utilization, hapd,
96 void bss_load_update_deinit(struct hostapd_data *hapd)
98 eloop_cancel_timeout(update_channel_utilization, hapd, NULL);