123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236 |
- #!/bin/sh
- # Copyright (C) 2006 OpenWrt.org
- . /lib/functions.sh
- . /usr/share/libubox/jshn.sh
- usage() {
- cat <<EOF
- Usage: $0 [down|detect|reload|status]
- enables (default), disables or detects a wifi configuration.
- EOF
- exit 1
- }
- ubus_wifi_cmd() {
- local cmd="$1"
- local dev="$2"
- json_init
- [ -n "$2" ] && json_add_string device "$2"
- ubus call network.wireless "$1" "$(json_dump)"
- }
- 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
- for cfg in $cfg; do
- config_get iftype "$cfg" type
- [ "$iftype" = bridge ] && config_get "$cfg" ifname
- prepare_interface_bridge "$cfg"
- return $?
- done
- )}
- 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() {
- for device in ${2:-$DEVICES}; do (
- config_get disabled "$device" disabled
- [ "$disabled" = "1" ] && {
- 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"
- elif [ ! -f /lib/netifd/wireless/$iftype.sh ]; then
- echo "$device($iftype): Interface type not supported"
- fi
- ); done
- }
- wifi_updown() {
- cmd=down
- [ enable = "$1" ] && {
- _wifi_updown disable "$2"
- ubus_wifi_cmd "$cmd" "$2"
- scan_wifi
- cmd=up
- }
- ubus_wifi_cmd "$cmd" "$2"
- _wifi_updown "$@"
- }
- wifi_reload_legacy() {
- _wifi_updown "disable" "$1"
- scan_wifi
- _wifi_updown "enable" "$1"
- }
- wifi_reload() {
- ubus call network reload
- wifi_reload_legacy
- }
- 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
- [ -z "$config" ] || {
- include /lib/network
- scan_interfaces
- for config in $config; do
- setup_interface "$iface" "$config" "" "$vifmac"
- done
- }
- )}
- 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")" 2>/dev/null
- 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"
- DEVICES=
- config_cb() {
- local type="$1"
- local section="$2"
- # section start
- case "$type" in
- wifi-device)
- append DEVICES "$section"
- config_set "$section" vifs ""
- config_set "$section" ht_capab ""
- ;;
- esac
- # section end
- config_get TYPE "$CONFIG_SECTION" TYPE
- case "$TYPE" in
- 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";;
- status) ubus_wifi_cmd "status" "$2";;
- reload) wifi_reload "$2";;
- reload_legacy) wifi_reload_legacy "$2";;
- --help|help) usage;;
- *) ubus call network reload; wifi_updown "enable" "$2";;
- esac
|