[package] base-files, mac80211 (#6491)
authorjow <jow@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Wed, 13 Jan 2010 18:39:44 +0000 (18:39 +0000)
committerjow <jow@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Wed, 13 Jan 2010 18:39:44 +0000 (18:39 +0000)
  - fix wep key handling in iw with mac80211 based drivers
  - sanitize keys where necessary
  - put a procedure prepare_key_wep() into /sbin/wifi for use by other driver backends

git-svn-id: svn://svn.openwrt.org/openwrt/trunk@19118 3c298f89-4303-0410-b956-a3cf2f4a3e73

package/base-files/files/sbin/wifi
package/mac80211/files/lib/wifi/mac80211.sh

index 90aeef7..5b6007f 100755 (executable)
@@ -34,6 +34,19 @@ bridge_interface() {(
        [ "$iftype" = bridge ] && config_get "$cfg" ifname
 )}
 
+prepare_key_wep() {
+       local key="$1"
+       local hex=1
+
+       echo -n "$key" | grep -qE "[^a-fA-F0-9]" && hex=0
+       [ "${#key}" -eq 10 -a $hex -eq 1 ] || \
+       [ "${#key}" -eq 26 -a $hex -eq 1 ] || {
+               [ "${key:0:2}" = "s:" ] && key="${key#s:}"
+               key="$(echo -n "$key" | hexdump -ve '1/1 "%02x" ""')"
+       }
+       echo "$key"
+}
+
 wifi_fixup_hwmode() {
        local device="$1"
        local default="$2"
index 742c1bb..06f4b84 100644 (file)
@@ -176,20 +176,30 @@ enable_mac80211() {
                # configured to handle the wep connection
                if [ ! "$mode" = "ap" ]; then
                        case "$enc" in
-                               wep)
+                               *wep*)
                                        config_get keymgmt "$vif" keymgmt
-                                       if [ -n "$keymgmt" ]; then
-                                               for idx in 1 2 3 4; do
-                                                       local zidx
-                                                       zidx=$(($idx - 1))
-                                                       config_get key "$vif" "key${idx}"
-                                                       if [ -n "$key" ]; then
-                                                               append keystring "${zidx}:${key} "
-                                                       fi
-                                               done
+                                       if [ -z "$keymgmt" ]; then
+                                               config_get key "$vif" key
+                                               key="${key:-1}"
+                                               case "$key" in
+                                                       [1234])
+                                                               for idx in 1 2 3 4; do
+                                                                       local zidx
+                                                                       zidx=$(($idx - 1))
+                                                                       config_get ckey "$vif" "key${idx}"
+                                                                       if [ -n "$ckey" ]; then
+                                                                               [ $idx -eq $key ] && zidx="d:${zidx}"
+                                                                               append keystring "${zidx}:$(prepare_key_wep "$ckey")"
+                                                                       fi
+                                                               done
+                                                               ;;
+                                                       *)
+                                                               keystring="d:0:$(prepare_key_wep "$key")"
+                                                               ;;
+                                               esac
                                        fi
                                ;;
-                               *wpa*|*psk*)
+                               *psk*|*wpa*)
                                        config_get key "$vif" key
                                ;;
                        esac
@@ -241,10 +251,10 @@ enable_mac80211() {
                        sta|mesh)
                                config_get bssid "$vif" bssid
                                case "$enc" in
-                                       wep)
-                                               if [ -n "$keymgmt" ]; then
+                                       *wep*)
+                                               if [ -z "$keymgmt" ]; then
                                                        [ -n "$keystring" ] &&
-                                                               iw dev "$ifname" connect "$ssid" ${fixed:+$freq} $bssid key "$keystring"
+                                                               iw dev "$ifname" connect "$ssid" ${fixed:+$freq} $bssid key $keystring
                                                else
                                                        if eval "type wpa_supplicant_setup_vif" 2>/dev/null >/dev/null; then
                                                                wpa_supplicant_setup_vif "$vif" wext || {