Wireless Ethernet D-Link DWL-520+ и Linux

Статья посвящена настройке беспроводной сетевой карты D-Link DWL-520+ в системе, работающей под управлением Linux. Предлагается набор стартовых rc-скриптов и способ их использования в Slackware Linux 9.1

[Андрей Головня andrew_golovnia AT ukr DOT net]

Wireless Ethernet D-Link DWL-520+ и Linux

Введение

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

Для многих устройств отсутствуют <<родные>> драйверы. На сайтах многих производителей аппаратуры присутствуют драйверы только для семейства Windows. Возникает вопрос: а знают ли они вообще о чем-нибудь, кроме <<конторской>> Windows? :-)

Точно такая же ситуация возникла и с беспроводной сетевой карточкой DWL-520+ от D-Link (http://www.d-link.com/) -- на сайте производителя отсутствуют драйверы для Linux. А ведь карточку поднять надо...

Что для этого надо?

Поиск на Google по ключевым словам <<DWL-520+>>, <<linux>> и <<driver>> очень быстро дал ответ на вопрос <<Что надо, чтобы поднять карточку>>. На первой же странице можно обнаружить ссылку на проект http://acx100.sourceforge.net, где можно легко найти сам драйвер и море информации на тему беспроводных сетей. Например, легко выяснить, почему в адресе проекта присутствует наименование acx100. Оказывается, это наименование чипсета от Texas Instruments, на котором построена карточка. К слову, стоит отметить, что предшественница DWL-520+, карточка DWL-520, была основана на совершенно ином чипсете -- Prism2. Что нам нужно для полно счастья? Мне было необходимо следующее:

Как это сделать?

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

Сборка займет много времени, поэтому ее стоит начать в первую очередь. Материалов по сборке ядра много, и я опущу ее описание.

Далее, во время сборки ядра, можно подготовить остальные средства. Начнем, например, со сборки wireless_tools.26.tar.gz. Для этого достаточно сделать следующее:

       # tar -xzf wireless_tools.26.tar.gz
       # cd wireless_tools.26
       # make && make install
Теперь можно заняться драйвером acx100. Распакуем его и драйверы для Windows:
       # tar -xjf acx100-0.2.0pre7.tar.bz2
       # unzip dwl520+_drivers_307.zip
Теперь необходимо скопировать файлы firmware из набора драйверов для Windows и скомпилировать драйвер:
       # cp Drivers/520+/WinXP/*.BIN acx100-0.2.0pre7/firmware
       # make -C acx100-0.2.0pre7
Теперь подождем, пока завершится сборка ядра... подождем... пойдем покурим, попьем кофе...

После окончания сборки ядра перезагрузим Linux с новым ядром.

Настройка

Теперь стоит проверить работоспособность карточки. Для начала, для простоты, допустим, что у нас есть другая машина под управлением Windows с такой же карточкой, настроенная и готовая к работе.

Предположим, что карточка имеет такую конфигурацию:

       SSID: HomeLan
       Wireless Mode: Ad-hoc
       Channel: 6
       TxRate: Auto
       Preamble: Long Preamble
       Power Mode: Continuous Access Mode
       IP: 192.168.85.1
Теперь настроим скрипт запуска драйвера сетевой карточки из пакета acx100-0.2.0pre7. Для этого перейдем в каталог acx100-0.2.0pre7/scripts и отредактируем файл start_net. Установим следующие значения переменных:
       DEV=wlan0
       ESSID=HomeLan
       RATE=11M
       CHAN=6
       MODE=Ad-hoc
       ALG=open
       IP=192.168.85.2
       NETMASK=255.255.255.0
       GATEWAY=192.168.85.1
Запускаем скрипт start_net и смотрим результат... Если нет сообщений об ошибках, то проверяем связь:
       # ping 192.168.85.1
Если не идет обмен, надо проверить еще раз настройки и на том ли месте firmware, включена ли в ядре поддержка беспроводных сетей... и попробовать снова.

Так как связь установлена нормально, можно приступать к настройке автоматического запуска сетевого драйвера по старту ОС. Автоматический запуск: взгляд из Slackware Linux 9.1

Лично я подошел к вопросу автоматизации запуска следующим образом:

  1. Скопировал модуль драйвера для DWL-520+ (acx100_pci.o) в каталог /lib/modules/2.4.26/kernel/drivers/net/wireless.

  2. Создал каталог /lib/modules/2.4.26/firmware/acx100_pci и скопировал в него файлы firmware: WLANGEN.BIN, RADIO11.BIN, RADIO0d.BIN, AIRPLUS.BIN.

  3. В каталоге /etc/rc.d создал два файла: rc.dwl_520p и rc.dwl_520p.conf:
    a. Содержание файла rc.dwl_520p:
    #! /bin/sh
    #
    #set -x
    
    ############################
    # READ NETWORK CONFIG FILE #
    ############################
    
    # Get the configuration information from /etc/rc.d/rc.dwl_520p.conf:
    . /etc/rc.d/rc.dwl_520p.conf
    
    WLAN_DEV_NO="0"
    KERNEL_VER=`uname -r`
    MODULES_DIR="/lib/modules/${KERNEL_VER}"
    MODULE_TYPE="acx100_pci"
    MODULE_FILE="${MODULES_DIR}/kernel/drivers/net/wireless/${MODULE_TYPE}.o"
    FIRMWARE_DIR="${MODULES_DIR}/firmware/${MODULE_TYPE}"
    
    dwl_520p_up() {
      DEV="wlan${1}"
      if test -r "$FIRMWARE_DIR/WLANGEN.BIN" -o -r "$FIRMWARE_DIR/TIACX111.BIN"; then
        insmod $MODULE_FILE debug=$DEBUG firmware_dir=$FIRMWARE_DIR
        if test "$?" = "0"; then
          if test "$DEBUG_ETH_UP" = "yes"; then
            echo "Module $MODULE_FILE successfully inserted."
          fi
          if test -n "$RATE"; then
            iwconfig $DEV rate $RATE
            if test "$?" != "0"; then
              if test "$DEBUG_ETH_UP" = "yes"; then
                echo "Failed to set rate $RATE!"
              fi
            fi
          fi
          if test -n "$CHAN"; then
            iwconfig $DEV channel $CHAN
            if test "$?" != "0"; then
              if test "$DEBUG_ETH_UP" = "yes"; then
                echo "Failed to set channel $CHAN!"
              fi
            fi
          fi
          if test -n "$TXPOWER"; then
            iwconfig $DEV txpower $TXPOWER
            if test "$?" != "0"; then
              if test "$DEBUG_ETH_UP" = "yes"; then
                echo "Failed to set Tx power level to $TXPOWER dBm!"
              fi
            fi
          fi
          iwconfig $DEV essid "$ESSID"
          if test "$?" != "0"; then
            if test "$DEBUG_ETH_UP" = "yes"; then
              echo "Failed to join or set ESSID $ESSID!"
            fi
          fi
          if test -n "$MODE"; then
            iwconfig $DEV mode $MODE
            if test "$?" != "0"; then
              if test "$DEBUG_ETH_UP" = "yes"; then
                echo "Failed to set mode to $MODE!"
              fi
            fi
          fi
          if test -n "$KEY" -a "$ALG" != "open"; then
            iwconfig $DEV key $ALG "$KEY"
            if test "$?" != "0"; then
              if test "$DEBUG_ETH_UP" = "yes"; then
                echo "Failed to set key to $KEY and algorithm $ALG!"
              fi
            fi
          fi
    
          if test "${USE_DHCP}" = "yes"; then # use DHCP to bring interface up
            if test ! "${DHCP_HOSTNAME[$1]}" = ""; then
              /sbin/dhcpcd -t 10 -h ${DHCP_HOSTNAME} -d $DEV
            else
              /sbin/dhcpcd -t 10 -d $DEV
            fi
          else # bring up interface using a static IP address
            if test ! "${IPADDR[$1]}" = ""; then # skip unconfigured interfaces
              # Determine broadcast address from the IP address and netmask:
              BROADCAST=`/bin/ipmask ${NETMASK} ${IPADDR} | cut -f 1 -d ' '`
              # Set up the ethernet card:
              echo "Configuring $DEV:"
              echo "/sbin/ifconfig $DEV ${IPADDR} broadcast ${BROADCAST} netask ${NETMASK}"
              /sbin/ifconfig $DEV ${IPADDR} broadcast ${BROADCAST} netmask ${NETMASK}
              /sbin/ifconfig $DEV mtu 576
            else
              if test "$DEBUG_ETH_UP" = "yes"; then
                echo "$DEV interface is not configured in /etc/rc.d/rc.dwl-520p.conf!"
              fi
            fi
          fi
    
        else
          if test "$DEBUG_ETH_UP" = "yes"; then
            echo "Error while inserting module $MODULE_FILE! Failed..."
          fi
        fi
      else
        if test "$DEBUG_ETH_UP" = "yes"; then
          echo "Firmware not found or not readable. Failed..."
        fi
      fi
    }
    
    dwl_520p_down() {
      DEV="wlan${1}"
      if test "${USE_DHCP}" = "yes"; then
        /sbin/dhcpcd -k -d $DEV
        sleep 1
      else
        /sbin/ifconfig $DEV down
      fi
      rmmod acx100_pci
    }
    
    # Function to bring up the gateway if there is not yet a default route:
    gateway_up() {
      if ! /sbin/route | grep "^default" 1> /dev/null ; then
        if [ ! "$GATEWAY" = "" ]; then
          /sbin/route add default gw ${GATEWAY} metric 1
        fi
      fi
    }
    
    # Function to take down an existing default gateway:
    gateway_down() {
      if /sbin/route | grep "^default" 1> /dev/null ; then
        /sbin/route del default
      fi
    }
    
    ############
    ### MAIN ###
    ############
    
    case "$1" in
    'start') # "start" brings up all available interfaces:
      dwl_520p_up $WLAN_DEV_NO
      gateway_up
      ;;
    'stop') # "stop" takes down all existing interfaces:
      gateway_down
      dwl_520p_down $WLAN_DEV_NO
      ;;
    *) # The default is to bring up all interfaces:
      dwl_520p_up $WLAN_DEV_NO
      gateway_up
    esac
    
    # End of /etc/rc.d/rc.dwl_520p
    

    b. Содержание файла rc.dwl_520p.conf:

    # /etc/rc.d/rc.dwl_520p.conf
    #
    # Config information for wlan0:
    ESSID="HomeLan"
    RATE="11M"
    CHAN="6"
    MODE="Ad-hoc"
    ALG="open"
    KEY=""
    
    IPADDR="192.168.85.2"
    NETMASK="255.255.255.0"
    GATEWAY="192.168.85.1"
    
    USE_DHCP="no"
    DHCP_HOSTNAME=""
    

  4. Внес изменение в файл rc.M, добавив после строк:
    # Initialize the networking hardware.  If your network driver is a module
    # and you haven't loaded it manually, this will be deferred until after
    # the hotplug system loads the module below.
    if [ -x /etc/rc.d/rc.inet1 ]; then
      . /etc/rc.d/rc.inet1
    fi
    

    следующие строки:

    # Setup D-Link DWL-520+
    if [ -x /etc/rc.d/rc.dwl_520p ]; then
      . /etc/rc.d/rc.dwl_520p
    fi
    

  5. Потом перезапустил Linux.

Источник: OpenNet. Оригинал: http://www.nixp.ru/cgi-bin/go.pl?q=articles;a=dwl-520plus_linux.

[ опубликовано 23/09/2004 ]

Андрей Головня andrew_golovnia AT ukr DOT net - Wireless Ethernet D-Link DWL-520+ и Linux   Версия для печати