Changeset 26201


Ignore:
Timestamp:
2011-03-17T08:23:28+01:00 (7 years ago)
Author:
acinonyx
Message:

[package] acx: Major rework of acx.sh script

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/package/acx/files/lib/wifi/acx.sh

    r26196 r26201  
    22append DRIVERS "acx" 
    33 
     4find_acx_phy() { 
     5        local device="$1" 
     6 
     7        local macaddr="$(config_get "$device" macaddr | tr 'A-Z' 'a-z')" 
     8        config_get phy "$device" phy 
     9        [ -z "$phy" -a -n "$macaddr" ] && { 
     10                cd /proc/driver 
     11                for phy in $(ls acx_wlan[0-9] 2>&-); do 
     12                        phy=${phy#acx_} 
     13                        [ "$macaddr" = "$(cat /sys/class/net/${phy}/address)" ] || continue 
     14                        config_set "$device" phy "$phy" 
     15                        break 
     16                done 
     17                config_get phy "$device" phy 
     18        } 
     19        [ -n "$phy" -a -f "/proc/driver/acx_$phy" ] || { 
     20                echo "phy for wifi device $1 not found" 
     21                return 1 
     22        } 
     23        [ -z "$macaddr" ] && { 
     24                config_set "$device" macaddr "$(cat /sys/class/net/${phy}/address)" 
     25        } 
     26        return 0 
     27} 
     28 
    429scan_acx() { 
    530        local device="$1" 
    6         local adhoc sta ap 
    7          
     31 
     32        [ ${device%[0-9]} = "wlan" ] && config_set "$device" phy "$device" || find_acx_phy "$device" || { 
     33                config_unset "$device" vifs 
     34                return 0 
     35        } 
     36        config_get phy "$device" phy 
     37 
    838        config_get vifs "$device" vifs 
    939        for vif in $vifs; do 
    10          
    11                 config_get ifname "$vif" ifname 
    12                 config_set "$vif" ifname "${ifname:-$device}" 
    13                  
    1440                config_get mode "$vif" mode 
    1541                case "$mode" in 
    1642                        adhoc|sta|ap|monitor) 
    17                                 append $mode "$vif" 
     43                                # Only one vif is allowed 
     44                                config_set "$vif" ifname "$phy" 
     45                                break 
    1846                        ;; 
    1947                        *) echo "$device($vif): Invalid mode, ignored."; continue;; 
    2048                esac 
    2149        done 
    22  
    23         config_set "$device" vifs "${ap:+$ap }${adhoc:+$adhoc }${ahdemo:+$ahdemo }${sta:+$sta }${wds:+$wds }${monitor:+$monitor}" 
     50        config_set "$device" vifs "$vif" 
    2451} 
    25  
    2652 
    2753disable_acx() ( 
    2854        local device="$1" 
    2955 
     56        find_acx_phy "$device" || return 0 
     57        config_get phy "$device" phy 
     58 
    3059        set_wifi_down "$device" 
    31         # kill all running hostapd and wpa_supplicant processes that 
    32         # are running on atheros/mac80211 vifs  
    33         for pid in `pidof hostapd wpa_supplicant`; do 
    34                 grep wlan /proc/$pid/cmdline >/dev/null && \ 
    35                         kill $pid 
    36         done 
    37          
     60 
    3861        include /lib/network 
    39         cd /proc/sys/net 
    40         for dev in *; do 
    41                 grep "$device" "$dev/%parent" >/dev/null 2>/dev/null && { 
    42                         ifconfig "$dev" down  
    43                         unbridge "$dev" 
    44                 } 
    45         done 
     62        unbridge "$phy" 
    4663        return 0 
    4764) 
     
    4966enable_acx() { 
    5067        local device="$1" 
     68 
     69        find_acx_phy "$device" || return 0 
     70        config_get phy "$device" phy 
     71 
     72        config_get regdomain "$device" regdomain 
     73        [ -n "$regdomain" ] && iwpriv "$device" SetRegDomain "$regdomain" 
     74 
     75        config_get rxantenna "$device" rxantenna 
     76        config_get txantenna "$device" txantenna 
     77        config_get_bool diversity "$device" diversity 
     78        [ -n "$diversity" ] && { 
     79                rxantenna="2" 
     80        } 
     81        [ -n "$rxantenna" ] && iwpriv "$phy" SetRxAnt "$rxantenna" 
     82        [ -n "$txantenna" ] && iwpriv "$phy" SetTxAnt "$txantenna" 
     83 
    5184        config_get channel "$device" channel 
    52         config_get vifs "$device" vifs 
    53         config_get country "$device" country 
    54          
    55         local first=1 
    56         for vif in $vifs; do 
    57                 config_get ifname "$vif" ifname 
    58                 ifconfig "$ifname" down 
    59                 config_get enc "$vif" encryption 
    60                 config_get eap_type "$vif" eap_type 
    61                 config_get mode "$vif" mode 
    62                  
    63                 config_get ifname "$vif" ifname 
    64                 [ $? -ne 0 ] && { 
    65                         echo "enable_acx($device): Failed to set up $mode vif $ifname" >&2 
    66                         continue 
    67                 } 
    68                 config_set "$vif" ifname "$ifname" 
     85        [ -n "$channel" ] && iwconfig "$phy" channel "$channel" >/dev/null 2>/dev/null 
    6986 
    70                 [ "$first" = 1 ] && { 
    71                         # only need to change freq band and channel on the first vif 
    72                         case $country in 
    73                                 us) 
    74                                         iwpriv "$device" SetRegDomain 1 
    75                                         ;; 
    76                                 ca) 
    77                                         iwpriv "$device" SetRegDomain 2 
    78                                         ;; 
    79                                 de|uk|be|hu|nl|pt|pl|se|dk) 
    80                                         iwpriv "$device" SetRegDomain 3 
    81                                         ;; 
    82                                 es) 
    83                                         iwpriv "$device" SetRegDomain 4 
    84                                         ;; 
    85                                 fr) 
    86                                         iwpriv "$device" SetRegDomain 5 
    87                                         ;; 
    88                                 jp) 
    89                                         iwpriv "$device" SetRegDomain 7 
    90                                         ;; 
    91                                 il) 
    92                                         iwpriv "$device" SetRegDomain 8 
     87        config_get txpower "$device" txpower 
     88        [ -n "$txpower" ] && iwconfig "$phy" txpower "${txpower%%.*}" 
     89 
     90        config_get vif "$device" vifs 
     91 
     92        config_get ifname "$vif" ifname 
     93        config_get ssid "$vif" ssid 
     94        config_get mode "$vif" mode 
     95 
     96        iwconfig "$phy" essid ${ssid:+-- }"${ssid:-any}" 
     97 
     98        case "$mode" in 
     99                sta) 
     100                        iwconfig "$phy" mode managed 
     101                        config_get addr "$device" bssid 
     102                        [ -z "$addr" ] || {  
     103                                iwconfig "$phy" ap "$addr" 
     104                        } 
     105                ;; 
     106                ap) iwconfig "$phy" mode master;; 
     107                adhoc) iwconfig "$phy" mode ad-hoc;; 
     108                *) iwconfig "$phy" mode "$mode";; 
     109        esac 
     110 
     111        config_get frag "$vif" frag 
     112        [ -n "$frag" ] && iwconfig "$phy" frag "${frag%%.*}" 
     113 
     114        config_get rts "$vif" rts 
     115        [ -n "$rts" ] && iwconfig "$phy" rts "${rts%%.*}" 
     116 
     117        config_get enc "$vif" encryption 
     118        case "$enc" in 
     119                wep) 
     120                        for idx in 1 2 3 4; do 
     121                                config_get key "$vif" "key${idx}" 
     122                                iwconfig "$ifname" enc restricted "[$idx]" "${key:-off}" 
     123                        done 
     124                        config_get key "$vif" key 
     125                        key="${key:-1}" 
     126                        case "$key" in 
     127                                [1234]) iwconfig "$ifname" enc restricted "[$key]";; 
     128                                *) iwconfig "$ifname" enc restricted "$key";; 
    93129                        esac 
    94                                          
    95                         iwconfig "$ifname" channel "$channel" >/dev/null 2>/dev/null 
    96                         if [ "$mode" = adhoc ]; then 
    97                                 iwlist "$ifname" scan >/dev/null 2>/dev/null 
    98                                 sleep 1 
    99                                 iwconfig "$ifname" mode ad-hoc >/dev/null 2>/dev/null 
    100                         fi 
    101                         sleep 1 
    102                         iwconfig "$ifname" channel "$channel" >/dev/null 2>/dev/null 
    103                 } 
     130                ;; 
     131                psk*|wpa*) 
     132                        echo "$device($vif): WPA/WPA2 not supported by acx driver" 
     133                        return 1 
     134                ;; 
     135        esac 
    104136 
    105                 case "$mode" in 
    106                         sta) 
    107                                 iwconfig "$ifname" mode managed >/dev/null 2>/dev/null 
    108                                 ;; 
    109                         ap) 
    110                                 iwconfig "$ifname" mode master >/dev/null 2>/dev/null 
    111                                 ;; 
    112                         *) 
    113                                 iwconfig "$ifname" mode $mode >/dev/null 2>/dev/null 
    114                 esac 
    115          
    116                 wpa= 
    117                 case "$enc" in 
    118                         WEP|wep) 
    119                                 for idx in 1 2 3 4; do 
    120                                         config_get key "$vif" "key${idx}" 
    121                                         iwconfig "$ifname" enc "[$idx]" "${key:-off}" 
    122                                 done 
    123                                 config_get key "$vif" key 
    124                                 key="${key:-1}" 
    125                                 case "$key" in 
    126                                         [1234]) iwconfig "$ifname" enc restricted "[$key]";; 
    127                                         *) iwconfig "$ifname" enc restricted "$key";; 
    128                                 esac 
    129                         ;; 
    130                         PSK|psk|PSK2|psk2) 
    131                                 echo "WARNING WPA / WPA2 not supported by acx driver" 
    132                                 config_get key "$vif" key 
    133                         ;; 
    134                 esac 
     137        local net_cfg bridge 
     138        net_cfg="$(find_net_config "$vif")" 
     139        [ -z "$net_cfg" ] || { 
     140                bridge="$(bridge_interface "$net_cfg")" 
     141                config_set "$vif" bridge "$bridge" 
     142                start_net "$ifname" "$net_cfg" 
     143        } 
     144        set_wifi_up "$vif" "$ifname" 
    135145 
    136                 case "$mode" in 
    137                         adhoc) 
    138                                 config_get addr "$vif" bssid 
    139                                 [ -z "$addr" ] || {  
    140                                         iwconfig "$ifname" ap "$addr" 
    141                                 } 
    142                         ;; 
    143                 esac 
    144                 config_get ssid "$vif" ssid 
    145  
    146                 config_get txpwr "$vif" txpower 
    147                 if [ -n "$txpwr" ]; then 
    148                         iwconfig "$ifname" txpower "${txpwr%%.*}" 
    149                 fi 
    150  
    151                 config_get frag "$vif" frag 
    152                 if [ -n "$frag" ]; then 
    153                         iwconfig "$ifname" frag "${frag%%.*}" 
    154                 fi 
    155  
    156                 config_get rts "$vif" rts 
    157                 if [ -n "$rts" ]; then 
    158                         iwconfig "$ifname" rts "${rts%%.*}" 
    159                 fi 
    160  
    161                 ifconfig "$ifname" up 
    162                 iwconfig "$ifname" channel "$channel" >/dev/null 2>/dev/null  
    163  
    164                 local net_cfg bridge 
    165                 net_cfg="$(find_net_config "$vif")" 
    166                 [ -z "$net_cfg" ] || { 
    167                         bridge="$(bridge_interface "$net_cfg")" 
    168                         config_set "$vif" bridge "$bridge" 
    169                         start_net "$ifname" "$net_cfg" 
    170                 } 
    171                 iwconfig "$ifname" essid "$ssid" 
    172                 set_wifi_up "$vif" "$ifname" 
    173                 first=0 
    174         done 
    175          
    176         echo 1 >/sys/class/leds/wifi/brightness || : 
    177146} 
    178147 
     148check_acx_device() { 
     149        [ ${1%[0-9]} = "wlan" ] && config_set "$1" phy "$1" 
     150        config_get phy "$1" phy 
     151        [ -z "$phy" ] && { 
     152                find_acx_phy "$1" >/dev/null || return 0 
     153                config_get phy "$1" phy 
     154        } 
     155        [ "$phy" = "$dev" ] && found=1 
     156} 
    179157 
    180158detect_acx() { 
    181         cd /sys/class/net 
    182         for dev in $(ls -d wlan* 2>&-); do 
    183                 config_get type "$dev" type 
    184                 [ "$type" = acx ] && continue 
     159        devidx=0 
     160        config_load wireless 
     161        while :; do 
     162                config_get type "radio$devidx" type 
     163                [ -n "$type" ] || break 
     164                devidx=$(($devidx + 1)) 
     165        done 
     166        cd /proc/driver 
     167        for dev in $(ls acx_wlan[0-9] 2>&-); do 
     168                dev=${dev#acx_} 
     169                found=0 
     170                config_foreach check_acx_device wifi-device 
     171                [ "$found" -gt 0 ] && continue 
    185172                cat <<EOF 
    186 config wifi-device  $dev 
     173config wifi-device radio$devidx 
    187174        option type     acx 
    188175        option channel  11 
     176        option macaddr  $(cat /sys/class/net/${dev}/address) 
    189177 
    190178        # REMOVE THIS LINE TO ENABLE WIFI: 
     
    192180 
    193181config wifi-iface 
    194         option device   $dev 
     182        option device   radio$devidx 
    195183        option network  lan 
    196184        option mode     ap 
     
    199187 
    200188EOF 
     189        devidx=$(($devidx + 1)) 
    201190        done 
    202191} 
Note: See TracChangeset for help on using the changeset viewer.