Openwrt的wifi脚本分析

首先分享一下/sbin/wifi脚本

#!/bin/sh                                                            
# Copyright (C) 2006 OpenWrt.org                                     . /lib/functions.sh                                                  
. /usr/share/libubox/jshn.sh                                         usage() {                                                            cat <$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                       [ 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"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; theneval "detect_$driver" || echo "$driver: Detect failed" >&2else                                                              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-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                                         

前面定义了函数,后面实际运行
wifi up
wifi down
wifi detect
wifi status
wifi reload
wifi reload_legacy
wifi –help
wifi **
不同的命令调动不同的函数

这里只分析wifi up
wifi up = wifi
执行 ubus call network reload
对network进行了reload
wifi_updown “enable” “ 2wifiupdownenable 2
$2为网络设备

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 "$@"                                                                    
}                               

进入函数enable
ubus_wifi_cmd

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)"                                       
}                     


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部