Archive

Gentooで無線LANを

設定した時の旧いメモ。WLI-PCI-G54での設定。

#emerge wireless-tools
#emerge ndiswrapper

ドライバをインストールする。私の場合使用しているのがWLI-PCI-G54であるため、wdrv_392.exeを展開した後、 #ndiswrapper -i netcbg54.inf (ただし現在ではbcmwl5aを使用しています。)

/etc/conf.d/netに以下を追加

# wlan0
iface_wlan0="dhcp"
dhcpcd_wlan0="-DN"
iface_<ESSIDを記入>="dhcp"
essid_<ESSIDを記入>="00074DAF9888"
key_<ESSIDを記入>="s:<WEPを記入>"

以上でおしまいですが、/etc/init.d/net.wlan0をどこからか拾ってきて、ちょっと改造して使用しているので下に全文掲載。 私もあまり理解していませんので、不具合等発生した場合は自己責任でお願いします。

#!/sbin/runscript
# Copyright 1999-2003 Gentoo Technologies, Inc.
# Distributed under the terms of the GNU General Public License v2
# $Header: /etc/init.d/net.eth0,v 1.30 2003/10/18 18:03:19 faye Exp $

#NB: Config is in /etc/conf.d/net



checkconfig() {
  if [ -z "${iface_IFACE}" ]
    then
      eerror "Please make sure that /etc/conf.d/net has \$iface_$IFACE set"
      return 1
  fi
}

setup_env() {
    # No reason to check these multiple times in the file
    iface_IFACE="$(eval echo \$\{iface_${IFACE}\})"
    dhcpcd_IFACE="$(eval echo \$\{dhcpcd_${IFACE}\})"
    inet6_IFACE="$(eval echo \$\{inet6_${IFACE}\})"
    alias_IFACE="$(eval echo \$\{alias_${IFACE}\})"
    status_IFACE="$(ifconfig | gawk -v IFACE="${IFACE}" '/Link/ { if ($1 == IFACE) print "up" }')"
    if [ -x `which iwconfig` ]; then
        wireless_IFACE="$(iwconfig 2>/dev/null | gawk -v IFACE="${IFACE}" '/ESSID/ { if ($1 == IFACE) print "yes" }')"
    fi
    wireless_IFACE=${wireless_IFACE:-"no"}
    if [ -x `which mii-tool` ]; then
        link_IFACE=$(mii-tool ${IFACE} 2>/dev/null | gawk '{print $2}')
    fi
    link_IFACE=${link_IFACE:-"yes"}
}

setup_wireless() {
    # Reset to some defaults
    iwconfig $IFACE mode Managed
    iwconfig $IFACE rate auto
    iwconfig $IFACE key off
    # iwconfig $IFACE rts off
    # iwconfig $IFACE frag off
    iwconfig $IFACE essid any
    # Initiate a scan
    ifconfig $IFACE up
    # Wait for a response
    sleep 2
    # Find known access points
    for AP in `iwlist ${IFACE} scan 2>/dev/null | grep ESSID | awk -F: '{print $2}' | sed 's/[-"]//g'`; do
        if [ -z ${essid_AP} ]; then
            essid_AP="$(eval echo \$\{essid_${AP}\})"
            if [ ! -z ${essid_AP} ]; then
                # setup variables
                key_AP="$(eval echo \$\{key_${AP}\})"
                iface_IFACE="$(eval echo \$\{iface_${AP}\})"
                if [  "$(eval echo \$\{gateway_${AP}\})" != "" ];
                then
                    gateway="${IFACE}/$(eval echo \$\{gateway_${AP}\})"
                fi
            fi
        fi
    done
    # Bring interface down to apply changes
    ifconfig $IFACE down
    #ewarn "Setting wireless parameters ${essid_AP} and ${key_AP}"
    iw_param=""
    if [ ! -z ${essid_AP} ]; then
        iw_param="essid ${essid_AP}"
    fi
    if [ ! -z ${key_AP} ]; then
        iw_param="${iw_param} key ${key_AP}"
    fi
    iwconfig ${IFACE} ${iw_param}
    # Bring the interface up
    ifconfig $IFACE up
    # Wait for the system to associate
    #    repair below 20060326 by 2310
    #    while [ `iwconfig $IFACE | awk '/\<..:..:..:..:..:..\>/{print}' |
    #    sed 's/^.*\<\(..:..:..:..:..:..\)\>.*$/\1/g'` = FF:FF:FF:FF:FF:FF ]; do
    while [ x$ACCESS_POINT_CHECK_VALUE = x -o x$ACCESS_POINT_CHECK_VALUE = xFF:FF:FF:FF:FF:FF ]; do
       LC_NUMERIC=C sleep 0.5
       ACCESS_POINT_CHECK_VALUE=\
       `iwconfig $IFACE | awk '/\<..:..:..:..:..:..\>/{print}' | sed 's/^.*\<\(..:..:..:..:..:..\)\>.*$/\1/g'`
    done
    return 0
}

start() {
    local retval=0
    setup_env
    checkconfig || return 1
    if [ ${wireless_IFACE} == "yes" ]; then
        ebegin "Detecting network for ${IFACE}"
        setup_wireless
        eend 0
    fi
    ebegin "Bringing ${IFACE} up"
    if [ ${link_IFACE} == "no" ];then
        retval=1
        eend ${retval} "Failed to bring ${IFACE} up"
        return ${retval}
    fi
    if [ "${iface_IFACE}" != "dhcp" ]
    then
        /sbin/ifconfig ${IFACE} ${iface_IFACE} >/dev/null || {
            retval=$?
            eend ${retval} "Failed to bring ${IFACE} up"
            return ${retval}
        }
        # ifconfig do not always return failure ..
        /sbin/ifconfig ${IFACE} &> /dev/null || {
            retval=$?
            eend ${retval} "Failed to bring ${IFACE} up"
            return ${retval}
        }
    else
        # Check that eth0 was not brough up by the kernel ...
#       if [ "${status_IFACE}" != "up" ]
#       then
            /sbin/dhcpcd ${dhcpcd_IFACE} ${IFACE} >/dev/null || {
                retval=$?
                eend ${retval} "Failed to bring ${IFACE} up"
                return ${retval}
            }
#       fi
    fi

    ip_address=$(ifconfig ${IFACE} | grep -m1 -o 'inet addr:[^ ]*' | cut -d: -f2)
    [[ -n ${ip_address} ]] && einfo "  ${IFACE} received address ${ip_address}"



    eend 0

    if [ -n "${alias_IFACE}" ]
    then
        local x=""
        local num=0
        local aliasbcast=""
        local aliasnmask=""

        ebegin "  Adding aliases"
        for x in ${alias_IFACE}
        do
            aliasbcast="$(eval echo \$\{broadcast_${IFACE}\} \| awk \'\{ print \$$((num + 1)) \}\')"
            if [ -n "${aliasbcast}" ]
            then
                aliasbcast="broadcast ${aliasbcast}"
            fi

            aliasnmask="$(eval echo \$\{netmask_${IFACE}\} \| awk \'\{ print \$$((num + 1)) \}\')"
            if [ -n "${aliasnmask}" ]
            then
                aliasnmask="netmask ${aliasnmask}"
            fi

            ebegin "    ${IFACE}:${num}"
            /sbin/ifconfig ${IFACE}:${num} ${x} \
                ${aliasbcast} ${aliasnmask} >/dev/null
            num=$((num + 1))
            eend 0
        done
        save_options "alias" "${alias_IFACE}"
    fi

    if [ -n "${inet6_IFACE}" ]
    then
        local x=""
        ebegin "  Adding inet6 addresses"
        for x in ${inet6_IFACE}
        do
            ebegin "    ${IFACE} inet6 add ${x}"
            /sbin/ifconfig ${IFACE} inet6 add ${x} >/dev/null
            eend 0
        done
        save_options "inet6" "${inet6_IFACE}"
    fi

    if [ -n "${gateway}" ] && [ "${gateway%/*}" = "${IFACE}" ]
    then
        ebegin "  Setting default gateway"
        # First delete any existing routes if it was setup by kernel ..
        /sbin/route del default dev ${gateway%/*} &>/dev/null
        /sbin/route add default gw ${gateway#*/} dev ${gateway%/*} \
            netmask 0.0.0.0 metric 1 >/dev/null || {

            local error=$?
            ifconfig ${IFACE} down &>/dev/null
            eend ${error} "Failed to bring ${IFACE} up"
            stop
            return ${error}
        }
        eend 0
    fi

    # Enabling rp_filter causes wacky packets to be auto-dropped by
    # the kernel
    if [ -e /proc/sys/net/ipv4/conf/${IFACE}/rp_filter ]
    then
        echo 1 > /proc/sys/net/ipv4/conf/${IFACE}/rp_filter
    fi
    # If started by hotplug, this doesn't get done.
    # perhaps the right fix is in hotplug
    ln -sf /etc/init.d/net.${IFACE} /var/lib/init.d/started/net.${IFACE}
}

stop() {
    local myalias="$(get_options alias)"
    local myinet6="$(get_options inet6)"
    local myinet6="$(get_options inet6)"
    local ip_address=$(ifconfig ${IFACE} | grep -m1 -o 'inet addr:[^ ]*' | cut -d: -f2)

    setup_env

    ebegin "Bringing ${IFACE} down"

    # Also down the inet6 interfaces
    if [ -n "${myinet6}" ]
    then
        local x=""
        for x in ${myinet6}
        do
           /sbin/ifconfig ${IFACE} inet6 del ${x} >/dev/null
        done
    fi

    # Do some cleanup in case the amount of aliases change
    if [ -n "${myalias}" ]
    then
        local x=""
        local num=0
        for x in ${myalias}
        do
            /sbin/ifconfig ${IFACE}:${num} down >/dev/null
            num=$((num + 1))
        done
    fi

    if [ "${iface_IFACE}" = "dhcp" ]
    then
       local count=0
#      while /sbin/dhcpcd -k ${IFACE} &>/dev/null && [ "${count}" -lt 15 ]
       while [ `/sbin/dhcpcd -k ${IFACE} &>/dev/null` ] && [ "${count}" -lt 9 ]
       do
        # Give dhcpcd time to properly shutdown
        sleep 1
        count=$((count + 1))
       done
       if [ "${count}" -ge 9 ]
       then
        eerror "Timed out trying to stop dhcpcd"
       else
        [[ -n ${ip_address} ]] && einfo "  ${IFACE} released address ${ip_address}"
       fi
     else
        /sbin/ifconfig ${IFACE} down >/dev/null
     fi
     eend 0
}


# vim:ts=4