hostapd: Add airtime policy configuration support
This adds support to hostapd for configuring airtime policy settings for stations as they connect to the access point. This is the userspace component of the airtime policy enforcement system PoliFi described in this paper: https://arxiv.org/abs/1902.03439 The Linux kernel part has been merged into mac80211 for the 5.1 dev cycle. The configuration mechanism has three modes: Static, dynamic and limit. In static mode, weights can be set in the configuration file for individual MAC addresses, which will be applied when the configured stations connect. In dynamic mode, weights are instead set per BSS, which will be scaled by the number of active stations on that BSS, achieving the desired aggregate weighing between the configured BSSes. Limit mode works like dynamic mode, except that any BSS *not* marked as 'limited' is allowed to exceed its configured share if a per-station fairness share would assign more airtime to that BSS. See the paper for details on these modes. Signed-off-by: Toke Høiland-Jørgensen <toke@toke.dk>
This commit is contained in:
parent
6720b9482f
commit
ef7217518b
12 changed files with 498 additions and 0 deletions
|
@ -19,6 +19,7 @@
|
|||
#include "eap_server/eap.h"
|
||||
#include "wpa_auth.h"
|
||||
#include "sta_info.h"
|
||||
#include "airtime_policy.h"
|
||||
#include "ap_config.h"
|
||||
|
||||
|
||||
|
@ -249,6 +250,10 @@ struct hostapd_config * hostapd_config_defaults(void)
|
|||
conf->rssi_reject_assoc_rssi = 0;
|
||||
conf->rssi_reject_assoc_timeout = 30;
|
||||
|
||||
#ifdef CONFIG_AIRTIME_POLICY
|
||||
conf->airtime_update_interval = AIRTIME_DEFAULT_UPDATE_INTERVAL;
|
||||
#endif /* CONFIG_AIRTIME_POLICY */
|
||||
|
||||
return conf;
|
||||
}
|
||||
|
||||
|
@ -766,6 +771,20 @@ void hostapd_config_free_bss(struct hostapd_bss_config *conf)
|
|||
|
||||
hostapd_config_free_sae_passwords(conf);
|
||||
|
||||
#ifdef CONFIG_AIRTIME_POLICY
|
||||
{
|
||||
struct airtime_sta_weight *wt, *wt_prev;
|
||||
|
||||
wt = conf->airtime_weight_list;
|
||||
conf->airtime_weight_list = NULL;
|
||||
while (wt) {
|
||||
wt_prev = wt;
|
||||
wt = wt->next;
|
||||
os_free(wt_prev);
|
||||
}
|
||||
}
|
||||
#endif /* CONFIG_AIRTIME_POLICY */
|
||||
|
||||
os_free(conf);
|
||||
}
|
||||
|
||||
|
@ -1162,6 +1181,13 @@ int hostapd_config_check(struct hostapd_config *conf, int full_config)
|
|||
return -1;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_AIRTIME_POLICY
|
||||
if (full_config && conf->airtime_mode > AIRTIME_MODE_STATIC &&
|
||||
!conf->airtime_update_interval) {
|
||||
wpa_printf(MSG_ERROR, "Airtime update interval cannot be zero");
|
||||
return -1;
|
||||
}
|
||||
#endif /* CONFIG_AIRTIME_POLICY */
|
||||
for (i = 0; i < NUM_TX_QUEUES; i++) {
|
||||
if (hostapd_config_check_cw(conf, i))
|
||||
return -1;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue