International conference of developers
and users of free / open source software

Модернизация программного обеспечения ADSL-роутера

Андрей Шадура, НПООО <<БелДисплейТех>>, Минск, Беларусь, bugzilla@tut.by

LVEE 2009

В докладе рассмотрен вариант адаптации прошивки ADSL-роутера D-Link DSL-2540U к особенностям белорусских ADSL-провайдеров. Приводится описание подхода к модификации состава прошивки, проблемы, возникшие при адаптации, а также
некоторые особенности, которые должны быть учтены.

введение

В Беларуси все большую популярность набирает доступ в Интернет с использованием технологии ADSL. Для подключения часло применяются ADSL-модемы с операционной системой на базе ядра Linux. Довольно популярным ADSL-модемом является D-Link DSL-2540U, распространяемый, в том числе, одним известным провайдером среди своих клиентов.

Данный модем основан на микросхеме BCM6338, являющейся процессором архитектуры MIPS32 со встроенной периферией, на котором работает Linux 2.6.8.1. В этом модеме используется «самосборный» дистрибутив от Broadcom.

Идея переделки прошивки модема возникла после знакомства с возможностями штатной прошивки, т. к. выяснилось, что многие вещи в ней «недопилены» или же работают некорректно. Ниже приведен неполный список выявленных недоработок:

  • невозможность использовать более одного соединения с одинаковыми параметрами виртуального канала (VCI/VPI). Точнее, соединения создать можно, но из-за искусственных ограничений, введенных авторами прошивки, работает только одно из них. В то же время, некоторые белорусские Интернет-провайдеры предоставляют подключение именно по такой схеме;
  • неполноценность встроенных DNS- и DHCP-серверов: встроенный DNS-сервер только перенаправляет запросы серверу более высокого уровня, DHCP сервер не имеет возможности прописать hostname клиента в DNS. Кроме того, DHCP сервер невозможно использовать при наличии необходимости в загружаемых по сети станциях (PXE);
  • отсутствие sshd (доступ осуществляется только через telnet): иногда необходимо получить доступ к роутеру извне локальной сети, которую он обслуживает – с telnet это крайне небезопасно;
  • крайне ограниченный встроенный shell – busybox собран в самой минимальной конфигурации, с отсутствующим большинством команд, включая ls, несмотря на то, что аппаратные ресурсы позволяют использовать значительно больший набор команд.

анализ проблемы

Первый вариант переделки роутера – попытаться использовать наработки проектов OpenWRT, DD-WRT и подобных -был неудачен, т. к. ни один из этих проектов на тот момент не поддерживал данный ADSL-модем.

Таким образом, единственным приемлемым вариантом представлялся следующий: взять оригинальные исходники Broadcom/D-Link, предоставляемые для свободного скачивания, и серьезно над ними поработать.

Как выяснилось, D-Link дает не только «почти» полные исходные коды прошивок, но и утилиты и скрипты, необходимые для сборки корректного firmware. Тем не менее, версия исходников на FTP-сервере D-Link не соответствует последней версии firmware (версия исходных кодов отстает на несколько версий). Кроме того, исходные коды многих драйверов и утилит либо распространяются под несвободной лицензией, запрещающей модификацию и дальнейшее распространение, либо не даны вовсе.

После изучения содержимого архива, стали известны следующие архитектурные особенности ПО роутера:

  • практически отсутствуют инитскрипты (фактически, единственный скрипт загружает дополнительные модули ядра);
  • значительную часть функций выполняет «блоб» под названием cfm, исходные коды которого, «как и положено», отсутствуют;
  • практически все свободные программы, используемые в роутере, значительно модифицированы программистами Broadcom.

Как уже было сказано, основная «логика» по управлению роутером возложена на модуль cfm.

Данная программа представляет собой сплав micro_httpd, telnetd и некоей самописной программы, выполняющей роль инитскриптов из «больших» дистрибутивов. Будучи запущенным, cfm формирует конфигурационные файлы из единого XML-файла, а затем запускает tftpd, udhcpd, а также утилиты настройки роутера. Кроме того, для установления PPPoE-соединения cfm отдельно запускает pppd и управляет им в дальнейшем при помощи сигналов.

Сам pppd также довольно значительно изменен. Во-первых, это изменения, позволяющие ему работать в связке с cfm. Во-вторых, разработчики Broadcom заменили парсер опций на легкую обертку вокруг getopt, оставив пользователю возможность менять весьма малое число параметров соединения. Кроме того, была исключена возможность использования ipup/ipdown-скриптов, что делает труднодостижимым создание сложных конфигураций подключений.

Соответственно, при переделке прошивки пришлось устранить многие из инженерных «новшеств» программистов Broadcom.

Были написаны скрипты, позволяющие независимо друг от друга поднимать и опускать ppp-подключения, а также осуществлять их настройку. Соответственно, для этого пришлось отказаться от навязчивого сервиса в лице управления подключениями от cfm. Кроме того, веб-интерфейс роутера был модифицирован таким образом, чтобы позволить полноценно управлять подключениями.

Также были внесены изменения в логику работы DHCP-сервера. Во-первых, добавлена возможность указывать параметры, отвечающие за загрузку рабочих станций по сети, благодаря чему отпадает нужда в отключении DHCP-сервера роутера при необходимости такой загрузки. Во-вторых, произведена интеграция DNS-сервера и udhcpd, так что теперь DNS-сервер «знает» все узлы, которым динамически выдавался IP-адрес по имени хоста.

заключение

В настоящее время автор работает над полноценной заменой модулю cfm, которая позволит сделать управление роутером более гибким. С другой стороны, проект OpenWRT занимается написанием свободных драйверов для чипсетов BCM63x8. Хочется надеяться, что в ближайшем будущем появятся полностью свободные прошивки под эти и другие роутеры.