Linux маршрутизатор на чипсете ADM5120


Содержание

 

Отказ от ответственности

Автор не несет никакой ответсвенности, за ваши действия или бездействия, за физический, финансовый, моральный или любой другой ущерб. Помните, вскрывая рассмотренный в этой статье маршрутизатор, вы лишаетесь гарантии.
Статья не является пошаговым руководством: вы должны понимать, что вы делаете.

Введение

Недавно ко мне в руки попало устройство Edimax BR-6104K (а позже и Edimax BR-6104KP). Оно представляет собой маршрутизатор размером с маленький восьмипортовый switch.

Возможности

  • 1 WAN Ethernet порт
  • 4 LAN Ethernet порта
  • Встроенный коммутатор Fast Ethernet
  • Общий доступ с помощью NAT/NAPT
  • Межсетевой экран SPI (Stateful Packet Inspection) с защитой от DoS-атак
  • Поддержка виртуальных серверов и DMZ
  • Поддержка DDNS (DynDNS/TZO)
  • Поддержка специальных приложений (conntrack)
  • Свободное прохождение туннелей VPN (IPSec/PPTP/L2TP)
  • Получение WAN IP через PPPoE/Static IP/PPTP/DHCP/L2TP
  • Сервер DHCP
  • Поддержка UPNP
  • Возможность работы в режиме моста
  • Конфигурирование через web-интерфейс
  • Возможность получения информации о подключении к портам и работы DHCP.
  • Журнал событий
  • Возможность обновления программного обеспечения

Маршрутизатор имеет flash память объемом 2М и SDRAM память объемом 16М.

Но самое интересное, что операционной системой устройства является Linux. Эта мысль у меня возникла при ознакомлении с его возможностями, и подтвердилась после внимательного изучения его прошивки.

Такое же устройство изготавливает компания Sweex (Sweex LB000021), и говорят, что платы Edimax и Sweex отличить друг от друга невозможно1) (прошивки отличаются только логотипами и оформлением (CSS) ).

Существуют модификации

  • BR-6104K — Маршрутизатор 1 WAN порт, 4 LAN порта (~$35)
  • BR-6104KP — Маршрутизатор 1 WAN порт, 4 LAN порта, 2 порта USB (~$45)
  • BR-6524K — Маршрутизатор 2 WAN порта, 4 LAN порта (подключение к 2 провайдерам)
  • BR-6524WP — Маршрутизатор Wireless 802.11g, 2 WAN порта, 4 LAN порта, 2 порта USB (подключение к 2 провайдерам) ($158.00)
  • BR-6541K — Маршрутизатор 4 WAN порта, 1 LAN порт (подключение к 4 провайдерам)
  • BR-6541WP — Маршрутизатор Wireless 802.11g 4 WAN порта, 1 LAN порт, 2 USB порта (подключение к 4 провайдерам)

 

Фото


Внешний вид BR-6104K


Вид внутри BR-6104K

Web Интерфейс

   

Основные возможности

  • Общий доступ

    Функция NAT/NATP позволит организовать общий доступ к одному широкополосному подключению (через кабельный или ADSL-модем). Возможна одновременная работа до 253 пользователей. Маршрутизатор обеспечивает функцию DMZ для осуществления доступа из интернет к серверам, расположенным во внутренней сети.

  • Поддержка специальных приложений

    Маршрутизатор позволяет использовать специальные приложения (H.323, IRC, MSN, MMS, PPTP, Quake3, starcraft, tftp и другие).

  • Межсетевой экран

    Межсетевой экран SPI (Stateful Packet Inspection) защитит вашу внутреннюю сеть от несанкционированного доступа и различного рода DoS-атак (атаки типа “Отказ в обслуживании”), а также сразу оповестит вас об этом по электронной почте. С его помощью вы также можете контролировать доступ к интернет из внутренней сети.

  • Поддержка виртуальных серверов и DMZ

    Функция поддержки виртуальных серверов и DMZ обеспечит доступ из интернет к ресурсам ваших серверов, расположенных во внутренней сети.

  • Поддержка UPnP

    Функция UPnP поможет быстро настроить маршрутизатор.

  • DHCP

    Встроенный сервер DHCP даст возможность клиентам из внутренней сети получать сетевые параметры автоматически.

  • Настройка через web-интерфейс

    Вы можете легко настроить маршрутизатор через обычный веб-браузер.

Варианты использования

Конечно, на двух мегабайтах flash и 16 мегабайтах RAM памяти в модели без USB порта сильно не разгуляешься, но в умелых руках со своими технико-экономическими показателями, данное устройство может занять свою нишу. Навряд ли получится его использовать как почтовый или Web сервер, да он для этого и не предназначен. Это маршрутизатор: без вращающихся механических элементов, с малыми габаритами, питанием 12V, пропускной способностью WAN-LAN около 25 МБит/сек. Поэтому он может быть установлен как в офисе, в квартире, так и на крыше дома. Но! Имея USB Flash (USB-HDD) мы запросто можем превратить маршрутизатор в полноценный сервер

Возможности, которые сразу приходят в голову:

  • Маршрутизатор
  • iptables (firewall, dnat, snat, policy routing, etc)
  • shaper (cbq, htb, etc)
  • VPN шлюз
  • dhcp сервер
  • ssh/telnet доступ (dropbear/busybox)
  • snmpd (большой размер для ramdisk’а)
  • ftp/tftp update
  • не вижу препятствий для того, чтобы подключить dial-up модем или другое коммуникационное оборудование
  • + широкая гамма USB устройств
  • и все остальное в рамках вашей фантазии, аппаратных и программных ограничений

На досуге хочу

  • Из BR-6104KP сделать файловый сервер для USB flash/hdd
  • подключить USB звук/web-камеру

Ограничения/Огорчения

Так как процессор довольно специфический, то Linux ядро изменено именно под него и оно относительно старое — 2.4.18. Совсем недавно компания Edimax предоставила исходные тексты ядра для скачивания, до этого момента приходилось пользоваться или уже скомпилированным ядром из ‘родной’ прошивки, или собирать ядро предоставленное компанией OvisLink (с некоторыми ограничениями — не работает mtd и switch).

Также есть ограничение связанное с размерами flash памяти — ее нельзя использовать как полноценную файловую систему, так как ядро с ramdisk’ом почти не оставляет свободного места (на досуге надо будет поэкспериментировать с JFFS). Чтобы обойти это ограничение, мною был написан простой скрипт, который после загрузки загружает другой скрипт, который в свою очередь обновляет систему (содержимое ramdisk’а). Также можно через определенные промежутки времени выгружать изменившиеся файлы на tftp/ftp сервер.


Вид внутри BR-6104KP (включенная USB flash, и подпаянный консольный кабель)

Второе и более красивое решение состоит в приобретении устройства с USB-портом и USB-Flash к нему. По моему опыту это наиболее бесхлопотное решение, позволяющее настроить полноценный linux сервер.

Есть отличная страница /www.norocketscience.com/router/upgrade.htm и форум, где владельцы маршрутизаторов исправляют ошибки допущенные производителем.

Теперь, если вы заинтересовались этим устройством, то вы можете:

  1. Использовать роутер без изменений
    • Для обычных пользователей подключенных через xDSL модем — то, что доктор прописал.
  2. Использовать ядро и ramdisk от производителя изменяя под свои нужды скрипты/бинари, для этого вам потребуется:
    • Изучить структуру прошивки, научится разбирать и собирать ramdisk
    • Подключить консольный кабель — получить доступ к консоли
    • Установить MIPS toolchain
  3. Использовать самосборное ядро и самосборный ramdisk, для этого вам потребуется:
    • Тоже что и в предыдущем пункте
    • Скачать, собрать, установить ядро, buildroot ;)
  4. Полностью пересобрать родную прошивку
  5. Через web интерфейс залить прошивку, root-система которой находится на первом разделе USB Flash диска.
    • плюс: Это ‘живая’ система, с изменяемой в любой момент конфигурацией, а не ramdisk.
    • плюс: не требуется вскрывать роутер, чтобы подключиться через RS232 порт
    • плюс: в любой момент можно изменить файловую систему на настольном компьютере

Поделюсь заметками и рекомендациями.

Различная информация

Hardware

Данный маршрутизатор построен на чипе ADM5120 фирмы AdmTek (Infineon), который представляет собой высокопроизводительную и очень гибкий систему System On Chip (SOC), которая может использоваться для SOHO Gateway, NAT роутер, принт сервер, точки доступа WLAN, VPN шлюза, ядром VoIP шлюза

Внутри этот чип содержит высокопроизводительный процессор 175 MHz/227 MIPS, сетевую подсистему, switch engine, поддержку PCI, USB, UART


Структурная схема



Фотография ADM5120

Сетевая подсистема

Содержит 6 портов и обладает следующими возможностями:

  • IEEE 802.3 Fast Ethernet
  • 5 auto-MDIX (auto-crossover) twisted paired LAN interfaces, embedded 10/100M PHY
  • 1 GMII2)/MII interface
  • Flexible WAN port selection

 

Встроенный switch engine

  • Embedded Data-buffer/Address-look-up table
  • Look-up table read/write-able
  • MAC layer security
  • MAC clone solution
  • Multicast grouping (IGMP)
  • MAC filtering, Bandwidth control
  • Class of Services (CoS) with two priority levels
  • Shared dynamic data buffer management, embedded SSRAM
  • Port grouping VLAN (overlap-able)
  • TCP/IP accelerator

Memory interface

SDRAM

  • Two bank support (2 chip select pins)
  • Each bank can support — 1Mx32 up to 32Mx32bit (128M-byte)

Flash

  • NAND Flash boot3)
  • NOR Flash boot: Two bank support (2 chip select pins)
  • NOR Flash boot: Each bank can support — 1Mx8-bit, up to 1Mx32-bit (4M-byte)

 

System

  • UART interface (support MODEM interface)
  • PCI bridge that supports 3 master devices (только в BGA корпусе)
  • GPIO4)
  • USB 1.1 host
  • Clock source
    • 25MHz crystal for 10/100
    • 48MHz crystal for USB
  • 0.18u CMOS process
  • 1.8V/3.3V dual power
  • BGA/PQFP

и все это удовольствие за ~$35.

Консольный порт

Консольного порта в его привычном виде нет. Для него предусмотрен разъем на плате обозначенный JP2. И для того, чтобы иметь доступ к консоли и возможность прошивать маршрутизатор через кабель, вам необходимо будет собрать переходник с ~12V (RS232) на 3.3V. Для этого потребуется микросхема MAX232 или ей подобная.

IMHO проще всего взять шнурок к мобильному телефону, обычно они все на 3.3V, но вы это должны проверить самостоятельно.

На плате маршрутизатора имеется разъем подписанный как JP2. К нему необходимо подключать кабель согласно разводке:

JP2
2-o o o o-8
1-o o o o-7

1 — Rx
7 — Tx
8 — Gnd

Внимание: подключение COM порта напрямую к маршрутизатору непременно выведет последний из строя.
Подключайтесь любой терминальной программой на скорости 115200 бит/сек, 8 бит, No parity, 1 stopbit
Tip: Консольный вход очень чувствителен к различным шумам и наводкам, поэтому, если они у вас появляются — проверьте кабеля, не приближайте их к источникам помех. Как вариант можно установить конденсатор 0.1 мкф между 1 и 8 контактами.

USB порт

Jeroen Domburg написал прекрасное HOWTO по установке компонентов для поддержки USB.

 

JTAG порт

JTAG порт предназначен для отладки, тестирования устройства. На плате он обозначен как JP1. Через него возможно чтение/запись flash/sdram памяти напрямую, но информации по этому поводу у меня нет.

1  /TRST    2  gnd
3  TDI      4  gnd
5  TDO      6  gnd
7  TMS      8  gnd
9  TCK      10 gnd
11 ???      12 not connected
13 ???      14 +3.3 volt

приветствуется информация по JTAG

Заметки по родной прошивке

В основном вся логика представлена набором shell скриптов, все относительно просто.

HTTP сервером является пропатченный GoAhead WebServer, в котором находится логика работы с пользователем.

Программа /bin/flash реализует функциональность сохранения/восстановления параметров. Параметры предопределены и привязаны (внутри программы) к определенным областям flash памяти.

К сожалению, при загрузке на консоли, запускается программа, требующая ввести username/password, которые известны только производителю. Поэтому, чтобы получить shell доступ, нужно, как минимум, прошить модифицированную прошивку.

Также запускается демон diagd, слушающий TCP порт 31727, который позволяет локально устанавливать MAC-адреса и количество интерфейсов, а также удаленно: получать информацию об устройстве, менять MAC адреса, устанавливать частотный диапазон WLAN, и другие функции, которые, скорее всего, будут включены в следующих версиях.  

Разработчиками написан модуль для ядра реализующий URL blocking, имеются файлы /proc/url_blocking_list и /proc/trigger_port_list

  • /dev/mtd

    Блочное устройство, предоставляющее доступ к flash памяти. Крайне не советую что-либо записывать в диапазон 0x000000 — 0x008000, иначе велика вероятность превратить маршрутизатор в кирпич.

  • /dev/switch

    Кнопка reset. В цикле опрашивается скриптом monitor.sh, в случае нажатия делает reboot

  • /dev/led0

    Светодиод питания.

    	echo "led off" > /dev/led0       # turn on
    	echo "led on" > /dev/led0        # turn off
    	echo "led blink 100" >/dev/led0  # blink with freq 0.1
    	
  • /dev/led_wlan

    неизвестно, возможно светодиод WLAN

  • /dev/ttyS0, /dev/console

    консоль

Структура Flash памяти

  0x000000 — 0x0004ff interrupt handlers 
                      0    Reset
                      100  
                      180  General
                      200  Cyclic loop 
                      280  
  0x000500 — 0x007fff boot loader
  0x008000 — 0x0083ff 'HS' section = hardware setting 
  					   (ethernet MAC addresses, etc.)
  0x008400 — 0x009fff 'DS' section = default config
  0x00a000 — 0x00bbff 'CS' section = current config
  0x00bc00 — 0x00ffff empty
  0x010000 — 0x01ffff WB4K web image (webpages-6104k.bin.gz)
  0x020000 — 0x1fffff CSYS system image (vmlinux.bin.bz2)

HS, DS и CS секции начинаются с шестибайтного заголовка:

char tag[2]; /* "HS", "DS" or "CS" */
char version[2]; /* currently HS = "01", DS = CS = "08" */
uint16_t length;

WB4K и CSYS секции начинаются с 12-ти байтного заголовка:

char signature[4];
uint32_t startAddress;
uint32_t length;

17KB неиспользуемого места + 64KB занимаемые webpages.bin, так что потенциально выигрываем 81KB.

Структура официальной прошивки

Прошивки от Edimax и Sweex (версий 2.65/2.75) имееют следующий формат

       V2.65                    Block name               V2.75
+--------------------+ 0x00         +        0x00+--------------------+
| Header             |              |            | Header             |
+--------------------+ 0x0c         |        0x0c+--------------------+
|                    |              |            |                    |
|                    |              |            |                    |
| webpages-6104k.bin |         webpages.bin      | webpages-6104k.bin |
| gzipped            |              |            | gzipped            |
|                    |              |            |                    |
+--------------------+              |            +--------------------+
| padding            |              |            | padding            |
+--------------------+ 0x20000      +     0x10000+--------------------+
| CSYS header        |          csys.bin         | CSYS header        |
+--------------------+ 0x2000c      +     0x1000c+--------------------+
|                    |              |            |                    |
|                    |              |            |                    |
| vmlinux.bin        |        vmlinux.bin.gz     | vmlinux.bin        |
| gzipped            |              |            | gzipped            |
|                    |              |            |                    |
|                    |              |            |                    |
+--------------------+              +            +--------------------+
	
  • ''CSYS header''

    Заголовок ‘CSYS header’ описанный выше

  • ''vmlinux.bin''

    (unzipped) имеет следующий формат

         V2.65                                                 V2.75
    +-------------+ 0x00                 +             0x00+------------+
    |             |                      |                 |            |
    | Kernel      |                  kernel.bin            | Kernel     |
    |             |                      |                 |            |
    +-------------+ 0x16d000             +         0x172000+------------+
    | tmpimg.img  |                      |                 | tmpimg.img |
    | gzipped     | --> ram image  tmpimg.img.gz (bz2)     | bzip2      |
    | +padding    |                      |                 | +padding   |
    +-------------+ 0x28f000             +         0x27c000+------------+
    
    		
    Offset      Length
    0x00        0x20000 web pages block containing 
                                        webpages-6104k.bin (gzipped)
    0x20000     0x0c    CSYS header
    0x2000c     eof     kernel block containing vmlinux.bin (gzipped)
     		

    После распаковки vmlinux.bin мы имеем 2 дополнительных блока:

    Offset      Length
    0x00        0x16d000    kernel
    0x16d000    0x122000    RAM image block containing tmpimg.img 
    						(gzipped) (RAMDISK)
    		

    Tip1: Отмечу, что ramdisk может быть сжат не gzip, а и bzip2.
    Tip2: На самом деле, загрузчик ищет заголовок CSYS header в памяти по адресам 0x10000 + n*0x10000 (где n 0,1,2).
    То есть можно располагать ядро и без webpages-6104k.bin (я так и не понял зачем он нужен), и без главного заголовка.

boot

При загрузке, на консоли появляется следующее сообщение:

ADM5120 Boot:

Если нажать 3 раза пробел в течении около одной сек, то появится загрузочное меню:

ADM5120 Boot: <--- press space 3x times

Linux Loader Menu
====================
(a) Download vmlinuz to flash ...
(b) Download vmlinuz to sdram (for debug) ...
(c) Exit

Please enter your key :
  • Пункт a предназначен для загрузки firmware в flash. Требуется прошивка с CSYS заголовком
  • Пункт b для загрузки в RAM. Передавать нужно vmlinux.bin.gz (запакованные ядро+ramdisk)

Протокол передачи — XMODEM
Например, загружаем прошивку во flash:
Создаем firmware.bin

../bin/mksyshdr csys.bin vmlinux.bin.gz
cat csys.bin vmlinux.bin.gz >firmware.bin

Upload with XMODEM

Linux Loader Menu
====================
(a) Download vmlinuz to flash ...
(b) Download vmlinuz to sdram (for debug) ...
(c) Exit

Please enter your key : a
Downloading...........PASS

Eraseing nor flash.......PASS

Programming nor flash...PASS


Linux Loader Menu
====================
(a) Download vmlinuz to flash ...
(b) Download vmlinuz to sdram (for debug) ...
(c) Exit

Please enter your key : c
jump to linux code!!


LINUX started...

Tip: передавать следует не сразу после выбора меню, а через 5-7 сек.

 

MIPS toolchain

Для того, чтобы иметь возможность собирать программы под MIPS архитектуру, вам необходим кросс-компилятор и собранная uclibc5) для этой архитектуры. Есть четыре способа использовать MIPS toolchain:

  1. Скачать и установить готовый пакет ( см Ссылки )
  2. Скачать и собрать ‘вручную’ gcc и uclibc для платформы MIPS
  3. Использовать собранный MIPS toolchain из собранного buildroot
  4. Если у вас замечательный дистрибутив Debian, то рекомендую использовать пакет toolchain-source ( см Ссылки )

Я применяю третий способ, так как все равно использую buildroot.
При употреблении USB-накопителей можно использовать и более тяжеловесный (но стандартный) вариант библиотеки C — glibc

buildroot

Buildroot — замечательный пакет, являющийся частью проекта uClibc, специально предназначенный для сборки ramdisk’ов для встроенных и микросистем. Именно то, что нам необходимо!

Задачи buildroot:

  • загрузить и скомпилировать пакеты, необходимые для построения (gcc, binutils, ccache, etc)
  • загрузить и скомпилировать пакеты, которые войдут в состав ramdisk’а (uclibc, busybox, etc)
  • построить ramdisk требуемого формата (ext2, cramfs, jffs)

При первом построении buildroot загрузит из сети необходимые компоненты для построения (gcc, binutils, etc), а далее те пакеты, которые вы выбрали в TARGETS. Отмечу, что список пакетов, которые buildroot собирает простым добавлением в достаточно велик, перечислю некоторые:

  • bash, busybox
  • bzip2, gzip
  • coreutils, diffutils, findutils
  • dropbear_sshd
  • autoconf/automake, gcc, flex, gdb, gdbserver, ltrace, strace
  • iproute2, iptables, mrouted, netsnmp, netkitbase, netkittelnet, openssh, openssl, vtun, links, ltp

Написать Makefile для другого пакета большой сложности не составляет.

Настройка и сборка buildroot крайне проста:

  • в Makefile определяем архитектуру: ARCH:=mipsel
  • далее по вкусу включаем определения TARGETS

Небольшое описание структуры каталогов buildroot:

  • build_mipsel/package-name/ лежат исходные тексты пакетов
  • build_mipsel/root/ — готовая файловая система, которая превратится в ramdisk
  • build_mipsel/staging_dir/ — скомпилированные утилиты для построения
  • make/ содержит Makefile’s для загрузки, распаковки, конфигурации, компиляции, установки.
  • sources/ содержит патчи и конфиги.
  • sources/dl/ содержит загруженные с сети пакеты.
  • sources/target_skeleton/ скелет файловой системы
  • sources/device_table.txt файл с описанием того, какие каталоги, файлы, устройства, сокеты нужно создать в готовой файловой системе
  • root_fs_mipsel — готовый образ файловой системы ramdisk’а

Для конфигурации busybox:

cd build_mipsel/busybox/
make menuconfig
cp .config ../../sources/busybox.config
cd -

Аналогичная процедура для uClibc.config

kernel

Процесс компиляции ядра мало чем отличается от компиляции для платформы x86, конечно, это должен быть MIPS кросскомпилятор и ядро специально для этого чипсета.
Перед компиляцией я устанавливаю переменные окружения:

export ARCH=mips
export CC=mipsel-linux-gcc
export CPP=mipsel-linux-cpp
export CXX=mipsel-linux-g++
export AR=mipsel-linux-ar
export CXXCPP=mipsel-linux-cpp
export RANLIB=mipsel-linux-ranlib

Если использовать компиляторы из buildroot:

export PATH=/path/to/buildroot/build_mipsel/staging_dir/bin/:$PATH

Замечу, что в этом случае нет смысла вручную ‘собирать’ образ ядра с initrd — пусть за вас это сделает make vmlinux. Для этого готовый ramdisk требуется положить в arch/mips/ramdisk/ramdisk_el.gz6) и установить [*] Embed root filesystem ramdisk into the kernel в меню конфигурации ядра.

Подробности см. в arch/mips/ramdisk/Makefile

В составе архива, находящегося на сайте производителя (Linux-SC.zip), входят утилиты для построения образа для Flash

 

USB root

Для того чтобы иметь возможность располагать корневую файловую систему на USB-носителе, требуется наложить патч, смысл которого сводится в некоторой задержке монтирования, чтобы USB-подсистема увидела и проинициализировала носитель.

Ссылки

NoRocketScience Forum
vlad.org.ua/adm5120/firmware/
www.linux-mips.org/wiki/index.php/ADMtek

Благодарности

Компании ‘Агатис’ www.agatis.biz, которая является официальным дистрибутором фирм SWEEX и EDIMAX в Украине. А особенно Шафаренко Дмитрию — менеджеру по сбыту
Большое спасибо Андрею Ищенко и Адилю Изидинову за наводку, а также Игорю Залатову другу и “HAM’у”.

(с)

Vladislav Moskovets (Владислав Московец)
mail: adm5120 {at} vlad. org. ua
icq: 3703834
Буду рад любым замечаниям, конструктивной критике, предложениям, дополнительной информации.

 


  • 1) также есть подмодификации плат Edimax (Sweex) BR-6104K(P) отмеченные в левом верхнем углу как “Rev A” и “Rev B”
  • 2) только в BGA корпусе
  • 3) только в BGA корпусе
  • 4) PQFP has 4 GPIO pins v.s. BGA has 8 pins
  • 5) uClibc — библиотека языка C, оптимизированная для микроконтроллеров и embedded систем.
  • 6) может отличаться

 




Дополнительно

iXBT BRAND 2016

«iXBT Brand 2016» — Выбор читателей в номинации «Процессоры (CPU)»:
Подробнее с условиями участия в розыгрыше можно ознакомиться здесь. Текущие результаты опроса доступны тут.

Нашли ошибку на сайте? Выделите текст и нажмите Shift+Enter

Код для блога бета

Выделите HTML-код в поле, скопируйте его в буфер и вставьте в свой блог.