# (Solved) Wireless at startup using ndiswrapper and wpa

## warrens

I have been able to get my wirless workin with wpa_supplicant manually from the cli using the following:

```

# ifconfig wlan0 up

# wpa_supplicant -Dndiswrapper -iwlan0 -c/etc/wpa_supplicant.conf -Bw

# dhcpcd wlan0

```

This is according to the wpa_supplicant website.  Wpa_supplicant has to authinticate with the AP before dhcpcd runs, but the net.wlan0 does not do this.  Here are the relevent lines form my /etc/conf.d/net file:

```

#iface_wlan0="dhcp"

#dhcpcd_wlan0="-N"

modules=( "!iwconfig" "wpa_supplicant" )

wpa_supplicant_wlan0="-Dndiswrapper"

wpa_timeout_wlan0=60

iface_wlan0="dhcp"

dhcpcd_wlan0="-N"

```

I have tried this with with the wpa supplicant lines before, between, and after the iface_wlan0 and dhcpcd_wlan0 lines, but the results are the same, I either get an ip address from a nearby unsecuer AP or no ip address at all.  How do I modify net.wlan0 script to authenticate with my AP before requesting an ip address?

----------

## warrens

I finally got tired of messing with the /etc/init.d/net.wlan0 script and went to the documentation and wrote my own script using the same commands as I used for manual setup and it WORKS!!!  Now I have a secure wpa connection to my AP.  Here is the code to my script to possibly help anyone else who has the same problem that I had.

```

!/sbin/runscript

# Wireless startup script for wlan0

depend() {

   before net

   }

start() {

   ebegin "Bring up wlan0"

   /sbin/ifconfig wlan0 up

   sleep 3

   /usr/sbin/wpa_supplicant -Dndiswrapper -iwlan0 -c/etc/wpa_supplicant.conf -Bw

   sleep 5   # Wait 5 seconds to let wpa_supplicant to authenticate

   /sbin/dhcpcd -N wlan0

   eend $?

   }

stop() {

   ebegin "Shuting down wlan0"

   /sbin/ifconfig wlan0 down

   eend $?

   }

```

You will need to replace wlan0 with whatever your network designation of you card is and replace ndiswarapper with your cards drivers name.  Feel free to change as you see fit.  The only hardware that I am sure that this script works with is the Dell Inspiron 8500 with the TrueMobile 1400 wifi card.

Note to the developers:  Feel free to use this as a bases for a general wpa setup.

----------

## warrens

I forgot to mention in earlier posts that I am using the default baselayout, which is currently version 1.9.4-r6.  I have since my last post improve the script to better allow stopping and then restarting the wireless connection. So here in the updated script for wlan0:

```

#!/sbin/runscript

# Wireless startup script for wlan0

depend() {

             before net

             }

start()    {

             ebegin "Starting wlan0"

              /sbin/ifconfig wlan0 up

              /usr/sbin/wpa_supplicant -Dndiswrapper -iwlan0 -c/etc/wpa_supplicant.conf -Bw

              /sleep 5   # Wait 5 seconds to let wp_supplicant to authenticate

              /sbin/dhcpcd -N wlan0

              eend $?

               }

stop()      {

               ebegin "Shuting down wlan0"

                /sbin/dhcpcd -z wlan0

                killall wpa_supplicant

                /sbin/ifconfig wlan0 down

                eend $?

                }

```

I have added the parts that relate to my original net.wlan0 script and have it working now.  I will continue working with the net.wlan0 file to make my added lines more generic so that they are setup by /etc/conf.d/net.  Hopefully I will be able to get this to work for any wireless driver, but I only have a Dell TrueMobile 1400 (Broadcom chipset) to test on.  I will post my changes to the files when I get the more generic form working.  Just trying now to help get wpa working for all, without having to use a masked baselayout.

----------

## warrens

Here is the code for the wireless setup using wpa_supplicant under baselayout 1.9.4-r6.  This should be more along the way things are done in Gentoo.

First /etc/init.d/net.eth0 to which /etc/init.d/net.wlan0 is linked now.

```

#!/sbin/runscript

# Copyright 1999-2004 Gentoo Technologies, Inc.

# Distributed under the terms of the GNU General Public License v2

# $Header: /home/cvsroot/gentoo-src/rc-scripts/init.d/net.eth0,v 1.41 2004/05/10 14:16:35 agriffis Exp $

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

if [[ -n $NET_DEBUG ]]; then

   set -x

   devnull=/dev/stderr

else

   devnull=/dev/null

fi

# For pcmcia users. note that pcmcia must be added to the same

# runlevel as the net.* script that needs it.

depend() {

   use hotplug pcmcia

}

checkconfig() {

   if [[ -z "${ifconfig_IFACE}" ]]; then

      eerror "Please make sure that /etc/conf.d/net has \$ifconfig_$IFACE set"

      eerror "(or \$iface_$IFACE for old-style configuration)"

      return 1

   fi

   if [[ -n "${vlans_IFACE}" && ! -x /sbin/vconfig ]]; then

      eerror "For VLAN (802.1q) support, emerge net-misc/vconfig"

      return 1

   fi

}

# Fix bug 50039 (init.d/net.eth0 localization)

# Some other commands in this script might need to be wrapped, but

# we'll get them one-by-one.  Note that LC_ALL trumps LC_anything_else

# according to locale(7)

ifconfig() {

   LC_ALL=C /sbin/ifconfig "$@"

}

# setup_vars: setup variables based on $1 and content of /etc/conf.d/net

# The following variables are set, which should be declared local by

# the calling routine.

#   status_IFACE         (up or '')

#   vlans_IFACE            (space-separated list)

#   ifconfig_IFACE         (array of ifconfig lines, replaces iface_IFACE)

#   dhcpcd_IFACE         (command-line args for dhcpcd)

#   routes_IFACE         (array of route lines)

#   inet6_IFACE            (array of inet6 lines)

#   ifconfig_fallback_IFACE   (fallback ifconfig if dhcp fails)

setup_vars() {

   local i iface="${1//\./_}"

   status_IFACE="$(ifconfig ${1} 2>${devnull} | gawk '$1 == "UP" {print "up"}')"

   eval vlans_IFACE=\"\$\{iface_${iface}_vlans\}\"

   eval ifconfig_IFACE=( \"\$\{ifconfig_$iface\[@\]\}\" )

   eval dhcpcd_IFACE=\"\$\{dhcpcd_$iface\}\"

   eval routes_IFACE=( \"\$\{routes_$iface\[@\]\}\" )

   eval inet6_IFACE=( \"\$\{inet6_$iface\[@\]\}\" )

   eval ifconfig_fallback_IFACE=( \"\$\{ifconfig_fallback_$iface\[@\]\}\" )

   # BACKWARD COMPATIBILITY: populate the ifconfig_IFACE array

   # if iface_IFACE is set (fex. iface_eth0 instead of ifconfig_eth0)

   eval local iface_IFACE=\"\$\{iface_$iface\}\"

   if [[ -n ${iface_IFACE} && -z ${ifconfig_IFACE} ]]; then

      # Make sure these get evaluated as arrays

      local -a aliases broadcasts netmasks

      # Start with the primary interface

      ifconfig_IFACE=( "${iface_IFACE}" )

      # ..then add aliases

      eval aliases=( \$\{alias_$iface\} )

      eval broadcasts=( \$\{broadcast_$iface\} )

      eval netmasks=( \$\{netmask_$iface\} )

      for ((i = 0; i < ${#aliases[@]}; i = i + 1)); do

         ifconfig_IFACE[i+1]="${aliases[i]} ${broadcasts[i]:+broadcast ${broadcasts[i]}} ${netmasks[i]:+netmask ${netmasks[i]}}"

      done

   fi

   # BACKWARD COMPATIBILITY: check for space-separated inet6 addresses

   if [[ ${#inet6_IFACE[@]} == 1 && ${inet6_IFACE} == *' '* ]]; then

      inet6_IFACE=( ${inet6_IFACE} )

   fi

}

iface_start() {

   local IFACE=${1} i x retval

   checkconfig || return 1

   if [[ ${ifconfig_IFACE} != dhcp ]]; then

      # Show the address, but catch if this interface will be inet6 only

      i=${ifconfig_IFACE%% *}

      if [[ ${i} == *.*.*.* ]]; then

         ebegin "Bringing ${IFACE} up (${i})"

      else

         ebegin "Bringing ${IFACE} up"

      fi

      # ifconfig does not always return failure ..

      ifconfig ${IFACE} ${ifconfig_IFACE} >${devnull} && \

      ifconfig ${IFACE} up &>${devnull}

      eend $? || return $?

   else

      # Check that eth0 was not brought up by the kernel ...

      if [[ ${status_IFACE} == up ]]; then

         einfo "Keeping kernel configuration for ${IFACE}"

      else

         ebegin "Bringing ${IFACE} up via DHCP"                                                                                                

         [if [[ ${wireless_crypt} == wpa ]]; then                                                        #   This where wpa_supplicant

            /usr/sbin/wpa_supplicant -D${wpa_supplicant_driver} -i${IFACE} -c/etc/wpa_supplicant.conf -Bw   #    is called and given ttime

            sleep 5                                                                                           # authinticate with the

         fi                                                                                                            #    AP.

         /sbin/dhcpcd ${dhcpcd_IFACE} ${IFACE}

         retval=$?

         eend $retval

         if [[ $retval == 0 ]]; then

            # DHCP succeeded, show address retrieved

            i=$(ifconfig ${IFACE} | grep -m1 -o 'inet addr:[^ ]*' | 

               cut -d: -f2)

            [[ -n ${i} ]] && einfo "  ${IFACE} received address ${i}"

         elif [[ -n "${ifconfig_fallback_IFACE}" ]]; then

            # DHCP failed, try fallback.

            # Show the address, but catch if this interface will be inet6 only

            i=${ifconfig_fallback_IFACE%% *}

            if [[ ${i} == *.*.*.* ]]; then

               ebegin "Using fallback configuration (${i}) for ${IFACE}"

            else

               ebegin "Using fallback configuration for ${IFACE}"

            fi

            ifconfig ${IFACE} ${ifconfig_fallback_IFACE} >${devnull} && \

            ifconfig ${IFACE} up &>${devnull}

            eend $? || return $?

         else

            return $retval

         fi

      fi

   fi

   if [[ ${#ifconfig_IFACE[@]} -gt 1 ]]; then

      einfo "  Adding aliases"

      for ((i = 1; i < ${#ifconfig_IFACE[@]}; i = i + 1)); do

         ebegin "    ${IFACE}:${i} (${ifconfig_IFACE[i]%% *})"

         ifconfig ${IFACE}:${i} ${ifconfig_IFACE[i]}

         eend $?

      done

   fi

   if [[ -n ${inet6_IFACE} ]]; then

      einfo "  Adding inet6 addresses"

      for ((i = 0; i < ${#inet6_IFACE[@]}; i = i + 1)); do

         ebegin "    ${IFACE} inet6 add ${inet6_IFACE[i]}"

         ifconfig ${IFACE} inet6 add ${inet6_IFACE[i]} >${devnull}

         eend $?

      done

   fi

   # Set static routes

   if [[ -n ${routes_IFACE} ]]; then

      einfo "  Adding routes"

      for ((i = 0; i < ${#routes_IFACE[@]}; i = i + 1)); do

         ebegin "    ${routes_IFACE[i]}"

         /sbin/route add ${routes_IFACE[i]}

         eend $?

      done

   fi

   # Set default route if applicable to this interface

   if [[ ${gateway} == ${IFACE}/* ]]; then

      local ogw=$(/bin/netstat -rn | awk '$1 == "0.0.0.0" {print $2}')

      local gw=${gateway#*/}

      if [[ ${ogw} != ${gw} ]]; then

         ebegin "  Setting default gateway ($gw)"

         # First delete any existing route if it was setup by kernel...

         /sbin/route del default dev ${IFACE} &>${devnull}

         # Second delete old gateway if it was set...

         /sbin/route del default gw ${ogw} &>${devnull}

         # Third add our new default gateway

         /sbin/route add default gw ${gw} >${devnull}

         eend $? || {

            true # need to have some command in here

            # Note: This originally called stop, which is obviously

            # wrong since it's calling with a local version of IFACE.

            # The below code works correctly to abort configuration of

            # the interface, but is commented because we're assuming

            # that default route failure should not cause the interface

            # to be unconfigured.

            #local error=$?

            #ewarn "Aborting configuration of ${IFACE}"

            #iface_stop ${IFACE}

            #return ${error}

         }

      fi

   fi

   # Enabling rp_filter causes wacky packets to be auto-dropped by

   # the kernel.  Note that we only do this if it is not set via

   # /etc/sysctl.conf ...

   if [[ -e /proc/sys/net/ipv4/conf/${IFACE}/rp_filter && \

         -z "$(grep -s '^[^#]*rp_filter' /etc/sysctl.conf)" ]]; then

      echo -n 1 > /proc/sys/net/ipv4/conf/${IFACE}/rp_filter

   fi

}

# iface_stop: bring down an interface.  Don't trust information in

# /etc/conf.d/net since the configuration might have changed since

# iface_start ran.  Instead query for current configuration and bring

# down the interface.

iface_stop() {

   local IFACE=${1} i x aliases inet6 count

   # Try to do a simple down (no aliases, no inet6, no dhcp)

   aliases="$(ifconfig | grep -o "^$IFACE:[0-9]*" | tac)"

   inet6="$(ifconfig ${IFACE} | awk '$1 == "inet6" {print $2}')"

   if [[ -z ${aliases} && -z ${inet6} && ! -e /var/run/dhcpcd-${IFACE}.pid ]]; then

      ebegin "Bringing ${IFACE} down"

      ifconfig ${IFACE} down &>/dev/null

      eend 0

      return 0

   fi

   einfo "Bringing ${IFACE} down"

   # Stop aliases before primary interface.

   # Note this must be done in reverse order, since ifconfig eth0:1 

   # will remove eth0:2, etc.  It might be sufficient to simply remove 

   # the base interface but we're being safe here.

   for i in ${aliases} ${IFACE}; do

      # Delete all the inet6 addresses for this interface

      inet6="$(ifconfig ${i} | awk '$1 == "inet6" {print $3}')"

      if [[ -n ${inet6} ]]; then

         einfo "  Removing inet6 addresses"

         for x in ${inet6}; do 

            ebegin "    ${IFACE} inet6 del ${x}"

            ifconfig ${i} inet6 del ${x}

            eend $?

         done

      fi

      # Stop DHCP (should be N/A for aliases)

      # Don't trust current configuration... investigate ourselves

      if /sbin/dhcpcd -z ${i} &>${devnull}; then

         ebegin "  Releasing DHCP lease for ${IFACE}"

         for ((count = 0; count < 9; count = count + 1)); do

            /sbin/dhcpcd -z ${i} &>${devnull} || break

            sleep 1

         done

         [[ ${count} -lt 9 ]]

         eend $? "Timed out"

      fi

      ebegin "  Stopping ${i}"

      if [[ /usr/sbin/wpa_supplicant ]]; then

         killall wpa_supplicant                 # Kills wpa_supplicant.  Need help on how to do this properly.

      fi

      ifconfig ${i} down &>${devnull}

      eend 0

   done

   return 0

}

start() {

   # These variables are set by setup_vars

   local status_IFACE vlans_IFACE dhcpcd_IFACE 

   local -a ifconfig_IFACE routes_IFACE inet6_IFACE

   # Call user-defined preup function if it exists

   if [[ $(type -t preup) == function ]]; then

      einfo "Running preup function"

      preup ${IFACE} || {

         eerror "preup ${IFACE} failed"

         return 1

      }

   fi

   # Start the primary interface and aliases

   setup_vars ${IFACE}

   iface_start ${IFACE} || return 1

   # Start vlans

   local vlan

   for vlan in ${vlans_IFACE}; do

      /sbin/vconfig add ${IFACE} ${vlan} >${devnull}

      setup_vars ${IFACE}.${vlan}

      iface_start ${IFACE}.${vlan}

   done

   # Call user-defined postup function if it exists

   if [[ $(type -t postup) == function ]]; then

      einfo "Running postup function"

      postup ${IFACE}

   fi

}

stop() {

   # Call user-defined predown function if it exists

   if [[ $(type -t predown) == function ]]; then

      einfo "Running predown function"

      predown ${IFACE}

   fi

   # Don't depend on setup_vars since configuration might have changed.

   # Investigate current configuration instead.

   local vlan

   for vlan in $(ifconfig | grep -o "^${IFACE}\.[^ ]*"); do

      iface_stop ${vlan}

      /sbin/vconfig rem ${vlan} >${devnull}

   done

   iface_stop ${IFACE} || return 1  # always succeeds, btw

   # Call user-defined postdown function if it exists

   if [[ $(type -t postdown) == function ]]; then

      einfo "Running postdown function"

      postdown ${IFACE}

   fi

}

# vim:ts=4

```

Now the relevent lines in /etc/conf.d/net

```

iface_wlan0="dhcp"                               #  iface_wlan0, iface_eth1...

wireless_crypt="wpa"                            # Tells the script to use wpa_supplicant

wpa_supplicant_driver="ndiswrapper"   # The name of the driver for your wifi card

dhcpcd_wlan0="-N"

```

And now the /etc/wpa_supplicant.conf file.

```

ctrl_interface=/var/run/wpa_supplicant

ctrl_interface_group=0

eapol_version=1

ap_scan=1

fast_reauth=1

network={

   ssid="your ssid here"

   scan_ssid=0

   proto=WPA

   key_mgmt=WPA-PSK

   pairwise=TKIP

   group=TKIP CCMP

   psk="your pass key here"

   priority=5

}

```

I hope that this is of help to people trying to get their wireless working.  Just trying to give something back to the Gentoo community.  GENTOO ROCKS!!!

----------

## UberLord

Whilst we do appreciate your efforts to integrate wpa_supplicant into Gentoo, it's been supported for a long time in baselayout-1.11.x

----------

## drumz

UberLord:

That's nice that it's supported in 1.11, but when is it going to go mainstream?  They're all still marked ~ and have been this way for quite a while.

Thanks!

----------

## UberLord

 *drumz wrote:*   

> That's nice that it's supported in 1.11, but when is it going to go mainstream?

 

Good question.

I'd love to give a definite answer other than Soon (tm), but I can't :/

----------

## Sensha

warren, your script worked well for /etc/init.d/net.wlan0, except for some very minor changes:

1.  Most likely an accident

```
/sleep 5   # Wait 5 seconds to let wp_supplicant to authenticate
```

Drop the "/" in front of sleep.

and 2.  This is for if you don''t have your AP broadcast its SSID, you need to manually assign your ESSID, by putting the following line after 

"/sbin/ifconfig wlan0 up"

```
/usr/sbin/iwconfig wlan0 essid "whatever the ssid of your AP is (without the quotes)"
```

But other than that, you are awesome.

--Sensha

----------

## mijenix

 *warrens wrote:*   

> 
> 
> First /etc/init.d/net.eth0 to which /etc/init.d/net.wlan0 is linked now.
> 
> 

 

Hmm...I don't understand. Wich file I need to replace or create with your file?

Thx!

--Mathias

----------

## warrens

 *mijenix wrote:*   

>  *warrens wrote:*   
> 
> First /etc/init.d/net.eth0 to which /etc/init.d/net.wlan0 is linked now.
> 
>  
> ...

 

Edit the /etc/init.d/net.eth0 file and then link /etc/init.d/wlan.0 to it.

----------

## PChaos

Should not net.eth0 itself only be a symlink to net.lo ?

It indeed should not matter if you link net.wlan0 either to net.lo or net.eth0, but some people prefere linking to the real file.

----------

