broadcom-wl: bring interfaces up, do not rely on netifd doing it
[openwrt/staging/wigyori.git] / package / kernel / broadcom-wl / files / lib / wifi / broadcom.sh
index 4d81bcb1b4e6e205c64c53c85c27fbf81c2c8060..ba31518c1f97efb036a2bfa39f35d0f5fe5ced16 100644 (file)
@@ -2,18 +2,17 @@ append DRIVERS "broadcom"
 
 scan_broadcom() {
        local device="$1"
-       local wds
+       local vif vifs wds
        local adhoc sta apmode mon disabled
        local adhoc_if sta_if ap_if mon_if
-       local _c=0
 
        config_get vifs "$device" vifs
        for vif in $vifs; do
                config_get_bool disabled "$vif" disabled 0
                [ $disabled -eq 0 ] || continue
 
+               local mode
                config_get mode "$vif" mode
-               _c=$(($_c + 1))
                case "$mode" in
                        adhoc)
                                adhoc=1
@@ -28,6 +27,7 @@ scan_broadcom() {
                                ap_if="${ap_if:+$ap_if }$vif"
                        ;;
                        wds)
+                               local addr
                                config_get addr "$vif" bssid
                                [ -z "$addr" ] || {
                                        addr=$(echo "$addr" | tr 'A-F' 'a-f')
@@ -45,17 +45,11 @@ scan_broadcom() {
 
        local _c=
        for vif in ${adhoc_if:-$sta_if $ap_if $mon_if}; do
-               config_set "$vif" ifname "${device}${_c:+.$_c}"
+               config_set "$vif" ifname "${device}${_c:+-$_c}"
                _c=$((${_c:-0} + 1))
        done
        config_set "$device" vifs "${adhoc_if:-$sta_if $ap_if $mon_if}"
 
-       ifdown="down"
-       for vif in 0 1 2 3; do
-               append ifdown "vif $vif" "$N"
-               append ifdown "enabled 0" "$N"
-       done
-
        ap=1
        infra=1
        if [ "$_c" -gt 1 ]; then
@@ -96,24 +90,45 @@ scan_broadcom() {
 disable_broadcom() {
        local device="$1"
        set_wifi_down "$device"
-       wlc ifname "$device" down
-       wlc ifname "$device" bssid `wlc ifname "$device" default_bssid`
        (
                include /lib/network
 
+               local pid_file=/var/run/nas.$device.pid
+               [ -e $pid_file ] && start-stop-daemon -K -q -s SIGKILL -p $pid_file && rm $pid_file
+
                # make sure the interfaces are down and removed from all bridges
-               for dev in $device ${device}.1 ${device}.2 ${device}.3; do
-                       ifconfig "$dev" down 2>/dev/null >/dev/null && {
-                               unbridge "$dev"
-                       }
+               local dev ifname
+               for dev in /sys/class/net/wds${device##wl}-* /sys/class/net/${device}-* /sys/class/net/${device}; do
+                       if [ -e "$dev" ]; then
+                               ifname=${dev##/sys/class/net/}
+                               ifconfig "$ifname" down
+                               unbridge "$ifname"
+                       fi
+               done
+
+               # make sure all of the devices are disabled in the driver
+               local ifdown=
+               local bssmax=$(wlc ifname "$device" bssmax)
+               local vif=$((${bssmax:-4} - 1))
+               append ifdown "down" "$N"
+               append ifdown "wds none" "$N"
+               while [ $vif -ge 0 ]; do
+                       append ifdown "vif $vif" "$N"
+                       append ifdown "enabled 0" "$N"
+                       vif=$(($vif - 1))
                done
+
+               wlc ifname "$device" stdin <<EOF
+$ifdown
+EOF
        )
        true
 }
 
 enable_broadcom() {
        local device="$1"
-       local _c
+       local channel country maxassoc wds vifs distance slottime rxantenna txantenna
+       local frameburst macfilter maclist macaddr txpower frag rts hwmode htmode
        config_get channel "$device" channel
        config_get country "$device" country
        config_get maxassoc "$device" maxassoc
@@ -126,21 +141,15 @@ enable_broadcom() {
        config_get_bool frameburst "$device" frameburst
        config_get macfilter "$device" macfilter
        config_get maclist "$device" maclist
-       config_get macaddr "$device" macaddr
+       config_get macaddr "$device" macaddr $(wlc ifname "$device" default_bssid)
        config_get txpower "$device" txpower
        config_get frag "$device" frag
        config_get rts "$device" rts
        config_get hwmode "$device" hwmode
        config_get htmode "$device" htmode
-       local vif_pre_up vif_post_up vif_do_up vif_txpower
        local doth=0
        local wmm=1
 
-       _c=0
-       nas="$(which nas)"
-       nas_cmd=
-       if_up=
-
        [ -z "$slottime" ] && {
                [ -n "$distance" ] && {
                        # slottime = 9 + (distance / 150) + (distance % 150 ? 1 : 0)
@@ -162,32 +171,34 @@ enable_broadcom() {
                ;;
        esac
 
-       [ ${channel:-0} -ge 1 -a ${channel:-0} -le 14 ] && band=2
-       [ ${channel:-0} -ge 36 ] && band=1
+       local gmode=2 nmode=0 nreqd=
+       case "$hwmode" in
+               *a)     gmode=;;
+               *b)     gmode=0;;
+               *bg)    gmode=1;;
+               *g)     gmode=2;;
+               *gst)   gmode=4;;
+               *lrs)   gmode=5;;
+               *)      nmode=1; nreqd=0;;
+       esac
 
        case "$hwmode" in
-               *na)    nmode=1; nreqd=0;;
-               *a)     nmode=0;;
-               *ng)    gmode=1; nmode=1; nreqd=0;;
-               *n)     nmode=1; nreqd=1;;
-               *b)     gmode=0; nmode=0;;
-               *bg)    gmode=1; nmode=0;;
-               *g)     gmode=2; nmode=0;;
-               *gst)   gmode=4; nmode=0;;
-               *lrs)   gmode=5; nmode=0;;
-               *)      case "$band" in
-                               2) gmode=1; nmode=1; nreqd=0;;
-                               1) nmode=1; nreqd=0;;
-                               *) gmode=1; nmode=1; nreqd=0;;
-                       esac
-                       ;;
+               n|11n)  nmode=1; nreqd=1;;
+               *n*)    nmode=1; nreqd=0;;
        esac
 
         # Use 'nmode' for N-Phy only
-       [ "$(wlc ifname $device phytype)" = 4 ] || nmode=
+       [ "$(wlc ifname "$device" phytype)" = 4 ] || nmode=
+
+       local band chanspec
+       [ ${channel:-0} -ge 1 -a ${channel:-0} -le 14 ] && band=2
+       [ ${channel:-0} -ge 36 ] && {
+               band=1
+               gmode=
+       }
 
        # Use 'chanspec' instead of 'channel' for 'N' modes (See bcmwifi.h)
-       [ ${nmode:-0} -ne 0 -a -n "$band" ] && {
+       [ ${nmode:-0} -ne 0 -a -n "$band" -a -n "$channel" ] && {
                case "$htmode" in
                        HT40-)  chanspec=$(printf 0x%x%x%02x $band 0xe $(($channel - 2))); channel=;;
                        HT40+)  chanspec=$(printf 0x%x%x%02x $band 0xd $(($channel + 2))); channel=;;
@@ -196,9 +207,19 @@ enable_broadcom() {
                esac
        }
 
+       local _c=0
+       local nas="$(which nas)"
+       local if_pre_up if_up nas_cmd
+       local vif vif_pre_up vif_post_up vif_do_up vif_txpower
+       local bssmax=$(wlc ifname "$device" bssmax)
+       bssmax=${bssmax:-4}
+
        for vif in $vifs; do
+               [ $_c -ge $bssmax ] && break
+
                config_get vif_txpower "$vif" txpower
 
+               local mode
                config_get mode "$vif" mode
                append vif_pre_up "vif $_c" "$N"
                append vif_post_up "vif $_c" "$N"
@@ -208,20 +229,24 @@ enable_broadcom() {
                config_get_bool doth "$vif" doth "$doth"
 
                [ "$mode" = "sta" ] || {
+                       local hidden isolate
                        config_get_bool hidden "$vif" hidden 0
                        append vif_pre_up "closed $hidden" "$N"
                        config_get_bool isolate "$vif" isolate 0
                        append vif_pre_up "ap_isolate $isolate" "$N"
                }
 
-               wsec_r=0
-               eap_r=0
-               wsec=0
-               auth=0
-               nasopts=
+               local wsec_r=0
+               local eap_r=0
+               local wsec=0
+               local auth=0
+               local nasopts=
+               local enc key rekey
+
                config_get enc "$vif" encryption
                case "$enc" in
                        *wep*)
+                               local def defkey k knr
                                wsec_r=1
                                wsec=1
                                defkey=1
@@ -269,6 +294,7 @@ enable_broadcom() {
                                nasopts="-k \"\$${vif}_key\"${rekey:+ -g $rekey}"
                        ;;
                        *wpa*)
+                               local auth_port auth_secret auth_server
                                wsec_r=1
                                eap_r=1
                                config_get auth_server "$vif" auth_server
@@ -304,16 +330,17 @@ enable_broadcom() {
                append vif_do_up "wsec_restrict $wsec_r" "$N"
                append vif_do_up "eap_restrict $eap_r" "$N"
 
+               local ssid
                config_get ssid "$vif" ssid
                append vif_post_up "vlan_mode 0" "$N"
-               append vif_post_up "ssid $ssid" "$N"
-               append vif_do_up "ssid $ssid" "$N"
+               append vif_pre_up "ssid $ssid" "$N"
 
                [ "$mode" = "monitor" ] && {
                        append vif_post_up "monitor $monitor" "$N"
                }
 
                [ "$mode" = "adhoc" ] && {
+                       local bssid
                        config_get bssid "$vif" bssid
                        [ -n "$bssid" ] && {
                                append vif_pre_up "bssid $bssid" "$N"
@@ -325,30 +352,35 @@ enable_broadcom() {
 
                append vif_post_up "enabled 1" "$N"
 
+               local ifname
                config_get ifname "$vif" ifname
-               #append if_up "ifconfig $ifname up" ";$N"
+               local if_cmd="if_pre_up"
+               [ "$ifname" != "${ifname##${device}-}" ] && if_cmd="if_up"
+               append $if_cmd "macaddr=\$(wlc ifname '$ifname' cur_etheraddr)" ";$N"
+               append $if_cmd "ifconfig '$ifname' \${macaddr:+hw ether \$macaddr}" ";$N"
+               append if_up "ifconfig '$ifname' up" ";$N"
 
-               local net_cfg
-               net_cfg="$(find_net_config "$vif")"
+               local net_cfg="$(find_net_config "$vif")"
                [ -z "$net_cfg" ] || {
                        append if_up "set_wifi_up '$vif' '$ifname'" ";$N"
                        append if_up "start_net '$ifname' '$net_cfg'" ";$N"
                }
-               [ -z "$nasopts" ] || {
+               [ -z "$nas" -o -z "$nasopts" ] || {
                        eval "${vif}_ssid=\"\$ssid\""
-                       nas_mode="-A"
+                       local nas_mode="-A"
                        [ "$mode" = "sta" ] && nas_mode="-S"
-                       [ -z "$nas" ] || {
-                               nas_cmd="${nas_cmd:+$nas_cmd$N}start-stop-daemon -S -b -p /var/run/nas.$ifname.pid -x $nas -- -P /var/run/nas.$ifname.pid -H 34954 -i $ifname $nas_mode -m $auth -w $wsec -s \"\$${vif}_ssid\" -g 3600 -F $nasopts"
+                       [ -z "$nas_cmd" ] && {
+                               local pid_file=/var/run/nas.$device.pid
+                               nas_cmd="start-stop-daemon -S -b -p $pid_file -x $nas -- -P $pid_file -H 34954"
                        }
+                       append nas_cmd "-i $ifname $nas_mode -m $auth -w $wsec -s \"\$${vif}_ssid\" -g 3600 -F $nasopts"
                }
                _c=$(($_c + 1))
        done
-       killall -KILL nas >&- 2>&-
        wlc ifname "$device" stdin <<EOF
-$ifdown
-
-${nmode:+band ${band:-0}}
+${macaddr:+bssid $macaddr}
+${macaddr:+cur_etheraddr $macaddr}
+band ${band:-0}
 ${nmode:+nmode $nmode}
 ${nmode:+${nreqd:+nreqd $nreqd}}
 ${gmode:+gmode $gmode}
@@ -369,7 +401,6 @@ monitor ${monitor:-0}
 radio ${radio:-1}
 macfilter ${macfilter:-0}
 maclist ${maclist:-none}
-wds none
 ${wds:+wds $wds}
 country ${country:-US}
 ${channel:+channel $channel}
@@ -379,6 +410,9 @@ slottime ${slottime:--1}
 ${frameburst:+frameburst $frameburst}
 
 $vif_pre_up
+EOF
+       eval "$if_pre_up"
+       wlc ifname "$device" stdin <<EOF
 up
 $vif_post_up
 EOF
@@ -400,7 +434,7 @@ detect_broadcom() {
        local i=-1
 
        while grep -qs "^ *wl$((++i)):" /proc/net/dev; do
-               local channel
+               local channel type
 
                config_get type wl${i} type
                [ "$type" = broadcom ] && continue