#!/bin/sh # Copyright (C) 2006 OpenWrt.org . /etc/functions.sh find_net_config() {( local vif="$1" local cfg local ifname config_get cfg "$vif" network [ -z "$cfg" ] && { include /lib/network scan_interfaces config_get ifname "$vif" ifname cfg="$(find_config "$ifname")" } [ -z "$cfg" ] && return 0 echo "$cfg" )} bridge_interface() {( local cfg="$1" [ -z "$cfg" ] && return 0 include /lib/network scan_interfaces config_get iftype "$cfg" type [ "$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" local hwmode hwmode_11n config_get channel "$device" channel config_get hwmode "$device" hwmode case "$hwmode" in 11bg) hwmode=bg;; 11a) hwmode=a;; 11b) hwmode=b;; 11g) hwmode=g;; 11n*) hwmode_11n="${hwmode##11n}" case "$hwmode_11n" in a|g) ;; default) hwmode_11n="$default" esac config_set "$device" hwmode_11n "$hwmode_11n" ;; *) hwmode= if [ "${channel:-0}" -gt 0 ]; then if [ "${channel:-0}" -gt 14 ]; then hwmode=a else hwmode=g fi else hwmode="$default" fi ;; esac config_set "$device" hwmode "$hwmode" } wifi_updown() { [ enable = "$1" ] && wifi_updown disable "$2" for device in ${2:-$DEVICES}; do ( config_get disabled "$device" disabled [ 1 == "$disabled" ] && { echo "'$device' is disabled" set disable } config_get iftype "$device" type if eval "type ${1}_$iftype" 2>/dev/null >/dev/null; then eval "scan_$iftype '$device'" eval "${1}_$iftype '$device'" || echo "$device($iftype): ${1} failed" else echo "$device($iftype): Interface type not supported" fi ); done } wifi_detect() { for driver in ${2:-$DRIVERS}; do ( if eval "type detect_$driver" 2>/dev/null >/dev/null; then eval "detect_$driver" || echo "$driver: Detect failed" >&2 else echo "$driver: Hardware detection not supported" >&2 fi ); done } start_net() {( local iface="$1" local config="$2" local vifmac="$3" [ -f "/var/run/$iface.pid" ] && kill "$(cat /var/run/${iface}.pid)" 2>/dev/null include /lib/network scan_interfaces setup_interface "$iface" "$config" "" "$vifmac" )} set_wifi_up() { local cfg="$1" local ifname="$2" uci_set_state wireless "$cfg" up 1 uci_set_state wireless "$cfg" ifname "$ifname" } set_wifi_down() { local cfg="$1" local vifs vif vifstr [ -f "/var/run/wifi-${cfg}.pid" ] && kill "$(cat "/var/run/wifi-${cfg}.pid")" uci_revert_state wireless "$cfg" config_get vifs "$cfg" vifs for vif in $vifs; do uci_revert_state wireless "$vif" done } scan_wifi() { local cfgfile="$1" config_cb() { config_get TYPE "$CONFIG_SECTION" TYPE case "$TYPE" in wifi-device) append DEVICES "$CONFIG_SECTION" ;; wifi-iface) config_get device "$CONFIG_SECTION" device config_get vifs "$device" vifs append vifs "$CONFIG_SECTION" config_set "$device" vifs "$vifs" ;; esac } config_load "${cfgfile:-wireless}" } DEVICES= DRIVERS= include /lib/wifi scan_wifi case "$1" in down) wifi_updown "disable" "$2";; detect) wifi_detect "$2";; *) wifi_updown "enable" "$2";; esac