Войти в систему

Home
    - Создать дневник
    - Написать в дневник
       - Подробный режим

LJ.Rossia.org
    - Новости сайта
    - Общие настройки
    - Sitemap
    - Оплата
    - ljr-fif

Редактировать...
    - Настройки
    - Список друзей
    - Дневник
    - Картинки
    - Пароль
    - Вид дневника

Сообщества

Настроить S2

Помощь
    - Забыли пароль?
    - FAQ
    - Тех. поддержка



Пишет Леонид Каганов ([info]lleokaganov)
@ 2016-06-05 19:23:00

Previous Entry  Add to memories!  Tell a Friend!  Next Entry
Кривые костыли для wlan0 Banana BPI-R1
это перепост заметки, оригинал находится на моем сайте: http://lleo.me/dnevnik/2016/06/04.html

Скучный пост для айтишников, сразу предупреждаю. Пару месяцев назад я рассказывал, что в качестве роутера у меня работает системная платка Banana BPI-R1, и только глючок у нее с WiFi - иногда виснет. К сожалению, колдовство и компиляция драйверов не помогли - вайфай как вис, так и виснет, иногда раз в сутки, иногда раз в несколько дней.

Питание платы было заменено на прекрасное - по питанию нареканий нет. Возможно, портят дело какие-то другие устройства на USB-шинах, у меня их, увы, много висит. Почему-то контроллер WiFi интегрирован на плате, но видится как USB-устройство. Контроллер называется 0bda:8178 Realtek Semiconductor Corp. RTL8192CU 802.11n WLAN Adapter. В интернете встречаются упоминания о плохой работе RTL8192CU с hostapd, но я пока не нашел эффективного средства, кроме как перегрузить сервер.

Потом по совету Кирилла я стал просто делать такие махинации:

/sbin/ifconfig wlan0 down
/sbin/ifconfig wlan0 up
/usr/sbin/service hostapd restart

Этого оказалось достаточно, чтобы снова поднять WiFi без полной перезагрузки. Поизучав логи, я понял, что во-первых, ничего в логах не смыслю. Во-вторых, когда WiFi зависает, а устройства (мобильник, например) пытается раз за разом соединиться, чтобы получить адрес, в /var/log/daemon.log сыплются такие строки:

May 29 12:29:46 banana hostapd: wlan0: STA 3c:40:8e:75:b9:c3 IEEE 802.11: associated
May 29 12:29:50 banana hostapd: wlan0: STA 3c:40:8e:75:b9:c3 IEEE 802.11: disassociated
May 29 12:29:51 banana hostapd: wlan0: STA 3c:40:8e:75:b9:c3 IEEE 802.11: associated
May 29 12:29:55 banana hostapd: wlan0: STA 3c:40:8e:75:b9:c3 IEEE 802.11: disassociated
May 29 12:29:56 banana hostapd: wlan0: STA 3c:40:8e:75:b9:c3 IEEE 802.11: associated
May 29 12:30:00 banana hostapd: wlan0: STA 3c:40:8e:75:b9:c3 IEEE 802.11: disassociated
May 29 12:30:01 banana hostapd: wlan0: STA 3c:40:8e:75:b9:c3 IEEE 802.11: associated
May 29 12:30:05 banana hostapd: wlan0: STA 3c:40:8e:75:b9:c3 IEEE 802.11: disassociated
May 29 12:30:06 banana hostapd: wlan0: STA 3c:40:8e:75:b9:c3 IEEE 802.11: associated
May 29 12:30:11 banana hostapd: wlan0: STA 3c:40:8e:75:b9:c3 IEEE 802.11: disassociated
May 29 12:30:11 banana hostapd: wlan0: STA 3c:40:8e:75:b9:c3 IEEE 802.11: associated
May 29 12:30:15 banana hostapd: wlan0: STA 3c:40:8e:75:b9:c3 IEEE 802.11: disassociated
May 29 12:30:17 banana hostapd: wlan0: STA 3c:40:8e:75:b9:c3 IEEE 802.11: associated

Поскольку зависания сетки задолбали всех (меня, домочадцев, гостей дома, а также погодную станцию, висящую за окном), а решения проблемы не видно, то я принял решение построить костыли и просто выполнять перезапуск wlan0 при появлении в логе признаков зависания. К сожалению, shell-скрипты на основе tail -f | grep -q мне соорудить не удалось в силу нетривиальности задачи. Поэтому пришлось взять ненавистный мною язык C и написать демон-костыль. Выкладываю, может кому-то пригодится. Запускается от рута при старте системы:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define BUFLEN 2048
#define REREAD 50
#define REREADC 5000

void LLOG(char* s) { printf("%s\n",s); }

int main(int argc, char* argv[]) {
int i,kel=0,cn=-1,cn2=-1;
char openflag=0, *result, *msg = malloc (BUFLEN+1);
const char *str1="IEEE 802.11: associated";
const char *str2="IEEE 802.11: disassociated";
const char *logfile="/var/log/daemon.log";
const time_t timer = time(NULL); sprintf(msg,"+++ Start: %s",ctime(&timer)); LLOG(msg);
FILE *fp;

while(1) {
if(cn<0||cn2<0) { LLOG("+++ Reload");
if(openflag) { fclose(fp); openflag=0; LLOG("+++ Close file"); }
if((fp=fopen(logfile,"r"))==NULL) { sprintf(msg,"+++ %s+++ error open: %s",ctime(&timer),logfile); LLOG(msg); sleep(2); continue; } // открыть не удалось
openflag=1; // открыть удалось
fseek(fp,0L,SEEK_END); // в конец файла
cn=REREAD; cn2=REREADC;
}
cn2--;
if(!openflag || NULL==fgets(msg,BUFLEN,fp)) { sleep(1); continue; } // прочесть не удалось - и ладно
LLOG(msg); // что прочли
cn--;

for(i=0;i<BUFLEN;i++) { if(!msg[i] ||msg[i]==0x0d||msg[i]==0x0a) break; printf("%c",msg[i]); } printf("\n");

if(NULL!=strstr(msg,str1)) { kel=1; continue; } // найдена первая строка
if(NULL!=strstr(msg,str2)) { if(kel==1) { LLOG("*** CATCH ***");

system("/sbin/ifconfig wlan0 down"); sleep(1); // опустить wlan0
system("/sbin/ifconfig wlan0 up"); sleep(1); // поднять wlan0
system("/usr/sbin/service hostapd restart"); // перестартовать hostapd
system("mpg123 /home/audio/samples/jitie-moe.mp3"); // ну и сыграть звук в колонки

} kel=2; cn=-1; }
else kel=0;
}
}

Второй день зависаний нет. Один раз тихо вздохнуло в коридоре "Житие-мое" (сэмпл из "Иван Васильевич меняет професссию") - значит, отработало. В остальном Banana BPI-R1 показала прекрасные результаты, поскольку основная работа сего квартирного сервера (помимо чисто серверных и архивных задач) - быть шлюзом и хабом на 5 портов Ethernet. Это лучший сервер, что был у меня - надежный, компактный, малопотребляющий и абсолютно бесшумный. В ближайших планах - привесить к нему двухстрочный дисплей и кучу электроники к GPIO.



это перепост заметки, оригинал находится на моем сайте: http://lleo.me/dnevnik/2016/06/04.html


(Читать комментарии)

Добавить комментарий:

Как:
( )анонимно- этот пользователь отключил возможность писать комментарии анонимно
Identity URL: 
имя пользователя:    
Вы должны предварительно войти в LiveJournal.com
 
E-mail для ответов: 
Вы сможете оставлять комментарии, даже если не введете e-mail.
Но вы не сможете получать уведомления об ответах на ваши комментарии!
Внимание: на указанный адрес будет выслано подтверждение.
Имя пользователя:
Пароль:
Тема:
HTML нельзя использовать в теме сообщения
Сообщение:



Обратите внимание! Этот пользователь включил опцию сохранения IP-адресов пишущих комментарии к его дневнику.