При использовании Wi-Fi оборудования для оказания услуг доступа к Интернету важно отказаться от «слабых» клиентов. Ведь часто так бывает, что даже один клиент, работающий на низкой скорости, может испортить жизнь всему сектору. Поэтому клиентов с низким уровнем сигнала нужно либо вообще не брать, либо жестко ограничивать по скорости.
Кроме того, при работе на територии с перекрытой деревьями видимостью, уровень сигнала в течение суток может измениться в значительных пределах. В жаркий день листья у деревьев подсыхают и опускаются – сигнал растет. А вечером или во время дождя влажность повышается, листья поднимаются – сигнал падает.
Таким образом родилась идея скрипта, который бы в зависимости от уровней сигналов от клиентов менял бы ограничение скорости. Причём ограничение скорости должно быть «на клиента» и не зависеть от IP-адресов (для надежности). Эта версия скрипта не требует создавать статическую WDS запись.
Итак, приступим..
Использовать базу мы будем в режиме WDS. Базовая станция работает в режиме ap-bridge.
Все клиентские станции работают в режиме Station WDS. На закладке WDS радоинтерфейса базовой станции выбран режим wds-mode=dynamic wds-default-bridge=bridge1
Радиоинтерфейс базы не добавлен в бридж, т.е. клиенты работают за счет того, что их виртуальные WDS-интерфейсы добавляются в бридж при подключении.
Заходим в Bridge, нажимаем Settings, ставим галочку Use IP firewall.
Рис.1. Use IP firewall.
Вот собственно и все. Далее заходим в System/scripts и пишем (скрипт см. ниже).
Рис.2. System/scripts.
Нажимаем apply, затем Run. Если все прошло успешно, то в queue будут добавлены правила для ограничения клиентов.
Рис.3. Queue List.
Ну и завершающий штрих: добавляем в расписание
/system scheduler add disabled=no interval=10m name=schedule1 on-event=script1
А вот, собственно, и сам скрипт:
:local tx;
:local txccq;
:local rx;
:local rxccq;
:local total;
:local rate;
:foreach i in=[/interface wireless registration-table find] do={
:set tx [/interface wireless registration-table get number=[$i] tx-rate]
:set txccq [/interface wireless registration-table get number=[$i] tx-ccq]
:set rx [/interface wireless registration-table get number=[$i] rx-rate]
:set rxccq [/interface wireless registration-table get number=[$i] rx-ccq]
:local mac [/interface wireless registration-table get number=[$i] mac-address]
:local wds ([interface wireless wds find wds-address=$mac])
:local name ([/interface wireless registration-table get number=[$i] radio-name])
:local pos5 [:find $tx "."]
:local pos6 [:len $tx]
:set rate ( ([:pick $tx 0 ($pos5)]))
:local TXrateCCQ ($rate * $txccq * 4 * 1000)
:local pos5 [:find $rx "."]
:local pos6 [:len $rx]
:set rate ( ([:pick $rx 0 ($pos5)]))
:local RXrateCCQ ($rate * $rxccq * 1 * 1000)
:set total ([$RXrateCCQ]."/".[$TXrateCCQ])
:local nname ($name)
:if ([/queue simple find name="$nname"]!="") do={queue simple set $name max-limit=[$total] interface=$wds } else={ queue simple add name=$name max-limit=[$total] interface=$wds}
}
Здесь можно поменять Ограничение скорости передачи:
TXrateCCQ ($rate * $txccq * 4 * 1000)
RXrateCCQ ($rate * $rxccq * 1 * 1000)
Считаем его так: скоростьПоРадио умножаем на CCQ. CCQ у нас в процентах, поэтому нам нужно ещё разделить на 100. Потом умножаем на коэффициент перевода канальной скорости в реальную, на коэффициент разрешения использовать эфир и на 1м для перевода в байты.
Поэтому у нас было-бы: скорость * ССQ/100 *0.5 * 1000000. Убираем лишнее, оставляем ($rate * $txccq * 4 * 1000). Для приема я оставил коэффициент 1, для передачи – 4. Этот коэффициент можно менять на свой вкус в диапазоне от 0,5 до 8.
Принцип работы: скрипт перебирает таблицу регистрации и для каждого клиента создает (или меняет) правило в queue simple, которое ограничивает скорость на виртуальном интерфейсе.
Артём Смирнов специально для ASP24.



