Алексей Владыкин


Linksys WRT54GL и OpenWRT

26 июля 2015

wrt54gl

Продолжение истории про мою домашнюю сеть. А точнее — про роутер Linksys WRT54GL, который раздает интернет на все домашние устройства. Расскажу об обнаруженных граблях и как их обойти.

Этот самый WRT54GL я в свое время выбрал за его аппаратную кнопку “Secure Easy Setup”, чтобы, заменив прошивку на OpenWRT, перепрограммировать кнопку на отключение Wi-Fi. В стоковой прошивке это, к сожалению, невозможно.

На момент покупки роутера самой свежей была версия OpenWRT Backfire (10.03.1). Она и была успешно прошита согласно инструкции. Я выбрал вариант прошивки brcm47xx — с ядром 2.6 и стандартным драйвером b43 для Wi-Fi адаптера. Вариант brcm-2.4 был забракован, т.к. это более старое ядро 2.4 и проприетарный драйвер от Broadcom.

Проводная сеть работала отлично, однако беспроводная постоянно отваливалась, стоило только начать качать что-нибудь тяжелое. Причем отваливалась настолько, что приходилось перезагружать роутер. Эпическая переписка в багтрекере намекала, что такая проблема не только у меня. Через некоторое время разработчики OpenWRT пофиксили драйвер b43, и я обновил прошивку сначала на trunk, потом на вышедший вскоре релиз Attitude Adjustment (12.09).

Новый драйвер b43 действительно решил проблему с Wi-Fi. Однако стали возникать кратковременные (примерно на минуту) перебои с сетью, в том числе с проводной. В конце концов выяснилось, что новая прошивка Attitude Adjustment стала более требовательной к объему оперативной памяти. Под нагрузкой память заканчивалась и роутер перезагружался, что выглядело как перебои с сетью.

Когда стало понятно, что новая прошивка для WRT54GL слишком тяжелая, я решил откатиться обратно на Backfire. Но, зная о проблемах с драйвером b43 в ней, на этот раз взял вариант brcm-2.4 с Linux 2.4 и проприетарным драйвером wl от Broadcom. К нему, вроде бы, ни у кого претензий не было. И — бинго — с этой прошивкой сеть работает как часы уже пару месяцев.

Единственный недостаток: стандартный пакет wifitoggle не совместим с ядром 2.4. Но нетрудно ручками написать работающий аналог:

# /bin/sh

button=ses
device=wl0
led=/proc/diag/led/ses_white

if [ "$BUTTON" = "$button" -a "$ACTION" = "pressed" ]; then
    disabled="$(uci get "wireless.$device.disabled")"
    if [ "$disabled" = "1" ]; then
        uci set "wireless.$device.disabled=0"
        wifi up "$device"
        echo 1 > "$led"
    else
        uci set "wireless.$device.disabled=1"
        wifi down "$device"
        echo 0 > "$led"
        echo 1 > /proc/diag/led/power
    fi
fi

Скрипт надо положить в директорию /etc/hotplug.d/button/. Назвать можно, например, 50-mywifitoggle.

Кроме /proc/diag/led/ses_white есть еще /proc/diag/led/ses_orange. Можно выбрать, каким цветом подсвечивать кнопку при включении Wi-Fi: белым или оранжевым — по вкусу.

При отключении W-Fi почему-то начинает моргать индикатор Power, поэтому в скрипт добавлена строчка echo 1 > /proc/diag/led/power, возвращающая индикатор в обычное постоянно включенное состояние.

Мораль сей басни такова: самое новое не всегда самое лучшее. Для роутера WRT54GL лучше всего подошла довольно старая версия прошивки OpenWRT Backfire brcm-2.4.

К оглавлению блога