roamguide

git clone git://archive.git.mtrnord.blog/MTRNord/roamguide.git
Log | Files | Refs | README

commit 400949ff31562fea336925e05ea296e77f137307
parent d366f5d8d5ee7abf48004df365a81302b1929983
Author: Daniel Ehlers <danielehlers@mindeye.net>
Date:   Tue, 26 Jul 2016 16:33:41 +0200

uci/roamguide: Adapt uci configuration, extend controlable parameters.

Also change the bantime calculation to a polynomial funtion.

Diffstat:
Mroamguide/files/roamguide | 63++++++++++++++++++++++++++++++++++++---------------------------
1 file changed, 36 insertions(+), 27 deletions(-)

diff --git a/roamguide/files/roamguide b/roamguide/files/roamguide @@ -2,17 +2,10 @@ . /lib/functions.sh -dev=${1:-client0} -signal="-60 -77 -85" -kickmax=2 - wifi_kick(){ - local dev="$1" - local mac="$2" - local tq="$3" - local num="$4" - local bantime=$(expr 2000 + $num \* 3000) - logger -t roamguide "${dev}: ban(${num}) ${mac} ${tq}dBm for ${bantime}ms" + local dev="$1" ; shift + local mac="$1" ; shift + local bantime="$1" ; shift ubus call hostapd.${dev} del_client '{ "addr" : "'${mac}'", "reason" : "assoc toomany", "ban_time" : '${bantime}' }' } @@ -31,7 +24,6 @@ count_inc(){ local count=$(count_get "${mac}") count=$(expr $count + 1) echo $count > /tmp/client-${mac} - echo $count } count_dec(){ @@ -72,23 +64,40 @@ client_tq() { iw dev "${dev}" station get "${mac}" | grep "signal avg" | xargs | cut -d' ' -f 3 } +roamguide() { + local s="$1" + config_get_bool enabled "$s" 'enabled' 0 + [ $enabled -ne 0 ] || return 0 -for mac in $(client_macs "${dev}") ; do - tq=$(client_tq "${dev}" "${mac}") - level=1 - hit=0 - for roam_tq in $signal; do - if [ ${tq} -le ${roam_tq} ]; then - mac_count=$(count_get "${mac}") - if [ $mac_count -lt $level ] ; then - count_inc ${mac} - wifi_kick "${dev}" "${mac}" "${tq}" "${mac_count}" - fi - hit=1 - break - fi - level=$(expr $level + 1) + config_get device "$s" device + config_get bantime_base "$s" bantime_base 500 + config_get bantime_factor "$s" bantime_factor 2300 + + for mac in $(client_macs "${device}") ; do + tq=$(client_tq "${device}" "${mac}") + level=1 + config_list_foreach "$s" signal roamlevel "${tq}" "${device}" "${mac}" done -done +} + +roamlevel(){ + local roam_tq="$1" ; shift + local tq="$1" ; shift + local device="$1" ; shift + local mac="$1" ; shift + if [ ${tq} -le ${roam_tq} ]; then + mac_count=$(count_get "${device}" "${mac}") + if [ $mac_count -lt $level ] ; then + count_inc ${mac} + local bantime=$(expr $bantime_base + $(expr $mac_count \* $mac_count) \* $bantime_factor) + logger -t roamguide "${dev}: ban ${mac} ${tq}dBm for ${bantime}ms" + wifi_kick "${device}" "${mac}" "${bantime}" + break + fi + fi + level=$(expr $level + 1) +} +config_load 'roamguide' +config_foreach roamguide 'roamguide' count_cleanup