commit a92c5bbc4dbcb1e613c50ca9c163780bcf3a40c3
parent a88550ed41fed269d08a2ff29c6a5f01d94edfef
Author: Daniel Ehlers <danielehlers@mindeye.net>
Date: Tue, 26 Jul 2016 20:17:07 +0200
roam: add cleanup timer
forget_time: the time after we forget a client.
Diffstat:
2 files changed, 24 insertions(+), 27 deletions(-)
diff --git a/roamguide/files/etc/config/roamguide b/roamguide/files/etc/config/roamguide
@@ -7,4 +7,5 @@ config roamguide
option bantime_base '500' # on the first level ban for 500ms
option bantime_factor '2375' # on the second one for 2775ms,
# and in the final 10000ms
+ option forget_time '600' # Forget about a client after 10s
option enabled '0' # set to '1' to enable this profile
diff --git a/roamguide/files/usr/bin/roamguide b/roamguide/files/usr/bin/roamguide
@@ -9,47 +9,42 @@ wifi_kick(){
ubus call hostapd.${dev} del_client '{ "addr" : "'${mac}'", "reason" : "assoc toomany", "ban_time" : '${bantime}' }'
}
+count_file(){
+ echo "/tmp/roam-${1}-${2}"
+}
+
count_get(){
- local mac="$1"
- if [ -e /tmp/client-${mac} ] ; then
- touch /tmp/client-${mac}
- cat /tmp/client-${mac}
+ local fn=$(count_file $@)
+ if [ -e "$fn" ] ; then
+ touch "$fn"
+ cat $fn
else
echo 0
fi
}
count_inc(){
- local mac="$1"
- local count=$(count_get "${mac}")
- count=$(expr $count + 1)
- echo $count > /tmp/client-${mac}
+ local count=$(count_get $@)
+ expr $count + 1 > $(count_file $@)
}
count_dec(){
- local mac="$1"
- local count=$(count_get "${mac}")
- count=$(expr $count - 1)
- if [ $count -le 0 ] ; then
- count_rm "${mac}"
- else
- echo $count > /tmp/client-${mac}
- fi
+ local count=$(count_get $@)
+ count=$(expr $count - 1) > $(count_file $@)
}
count_rm(){
- local mac="$1"
- if [ -e /tmp/client-${mac} ] ; then
- logger -t roamguide "forget ${mac}"
- rm /tmp/client-${mac}
+ local fn=$(count_file $@)
+ if [ -e $fn ] ; then
+ logger -t roamguide "forget" $@
+ rm $fn
fi
}
count_cleanup() {
- local now=$(date +%s)
- for file in $(find /tmp -maxdepth 1 -name "client-*"); do
- filedate=$(date +%s -r $file)
- [ $(expr $now - ${filedate}) -gt 120 ] && rm $file
+ local device="$1" ; shift
+ for file in $(find /tmp -maxdepth 1 -name "roam-${1}-*" -type f ); do
+ [ $(expr $(date +%s) - $(date +%s -r $file)) -gt ${forget_time} ] && rm $file
done
}
@@ -70,14 +65,16 @@ roamguide() {
[ $enabled -ne 0 ] || return 0
config_get device "$s" device
+ config_get forget_time "$s" forget_time 600
config_get bantime_base "$s" bantime_base 500
- config_get bantime_factor "$s" bantime_factor 2300
+ config_get bantime_factor "$s" bantime_factor 2375
for mac in $(client_macs "${device}") ; do
tq=$(client_tq "${device}" "${mac}")
level=1
config_list_foreach "$s" signal roamlevel "${tq}" "${device}" "${mac}"
done
+ count_cleanup ${device}
}
roamlevel(){
@@ -88,7 +85,7 @@ roamlevel(){
if [ ${tq} -le ${roam_tq} ]; then
mac_count=$(count_get "${device}" "${mac}")
if [ $mac_count -lt $level ] ; then
- count_inc ${mac}
+ count_inc ${device} ${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}"
@@ -100,4 +97,3 @@ roamlevel(){
config_load 'roamguide'
config_foreach roamguide 'roamguide'
-count_cleanup