Доброго ночера уважаемый All.
Есть желание ввести в работу роутера понятие минимально-допустимого для клиента(!) уровня сигнала... Из чего исходим:
Подключаемся ноутом к роутеру, лежащему на ноуте, в консоли делаем:
watch -n 1 'iwconfig wlan0 | grep Qual'
Видим магические числа:70/70 -20
Уже по этим цифрам появляются вопросы:
Первое упоминание 70 - та самая мощность/уровень сигнала? Предположил, что «да» и дальше от этого отталкивался.
Второе упоминание /70 - это что?
-20 это уровень шума?
Гуляя с ноутом в пределах помещения экспериментальным способом получаем, что 32/70 -60 соответствуют самой дальней точке внутри помещения.
И наконец предположение, взятое за основу для дальнейших действий: первая цифирь это и есть тот самый уровень сигнала, который в различных осях рисуется палочками/черточками. Исходя из наших реалий, за мин.допустимый уровень можно принять значение 30 (попугаев?).
Маленькое отступление: нужно «мониторить» уровень сигнала существующих «клиентов» + не давать подключаться новым, у кого меньше. Выворачивать задачу, изначально уменьшая мощность передатчика, не предлогайе пож. Эта возможность была изучена и отброшена.
Далее, долго копаясь в различных источниках полуслучайно удалось набрести на: ./src/rt2860v2/ap/ap.c в котором нашлась функция: MacTableMaintenance.
Далее совсем уж на интуитивном уровне были произведены след.действия:
В самом начале кода из ap.c была добавлена переменная:
#include "rt_config.h"
int LowLevelSignal_ap = 55; /*55 а не 30 было поставлено для облегчения тестирования - меньше бегать с ноутом от роутера*/
Далее, в теле упомянутой функции, была добавлена проверка:
if (pEntry->RssiSample.LastRssi0 < LowLevelSignal_ap)
bDisconnectSta = TRUE;
Выполнив make clean; make получил прошивку, которую не постеснялся залить на роутер. Далее снова тесты:
Подключаюсь к роутеру по wi-fi, открываю в одной консоли вотч качества, во второй ping в мир и бреду в даль. После того как качество падает до 54/70 -48 пинги начинают теряться чаще, чем проходить, но - проходят.
Смотрим с другой стороны (telnet'ом в логи роутера) и видим, что наш ноут, по выходу в «< 55» зону начинает постоянно дисконектиться, и снова конектиться! От 3х до 6ти таких записей в секунду!
Получается, что для окончательного выполнения задачи мне необходимо найти место, в котором происходит «подключение» клиента и вставить такую же проверку еще и туда...
Или нет? Собственно, тут я пока что и замер. Ибо недостаточные знания английского не позволяют бегло искать по просторам нерунета необходимую документацию, а слабые познания в Си (все еще преобретаемые благодаря творению Кернигана и Ритчи в 3тьем издании) не служат достаточным подспорьем для самостоятельного аализа исходников драйверов...
Вопрос у меня к тебе, многоуважаемый All: похож ли вышеизложенный поток сознания на правду? Если да, то где мне дальше искать точку входа клиента? В каком файле описывается инициализация именно клиента, а не передатчика например? А то я уже разок промахнулся, благо по шнурку смог зайти и перепрошиться/откатиться.
А если все это чуш и притянутые за уши совпадения, то в какую сторону мне изначально смотреть нужно было?
И на последок, встретилась мне такая вот штука:
BOOLEAN bAutoRoaming; /* 0:disable auto roaming by RSSI, 1:enable auto roaming by RSSI */
А в ./src/rt2860v2/include/mlme.h
#define RSSI_THRESHOLD_FOR_ROAMING 25
Правка значения до 69ти результата не принесла.
Во множестве исходников встречается #ifdef перед проверкой if (bAutoRoaming)... Я выдумываю велосипед, вместо того чтоб просто подключить готовый функционал, либо это какой-то другой роуминг, не относящийся к моей задаче???
Sorry за сумбур в описании, готов ответить на уточняющие вопросы...