X-Git-Url: http://git.openwrt.org/?p=project%2Fnetifd.git;a=blobdiff_plain;f=scripts%2Fnetifd-wireless.sh;h=b920296a9764ab61e513644c31694ab037668956;hp=396ef7121c06cc447321f582438c2aaffa5d76ef;hb=62e3cb52941032e13a8ad421454b9bc93382ef75;hpb=22476ff99ea2c233e342dfe2bdff506e54278f03 diff --git a/scripts/netifd-wireless.sh b/scripts/netifd-wireless.sh index 396ef71..b920296 100644 --- a/scripts/netifd-wireless.sh +++ b/scripts/netifd-wireless.sh @@ -39,13 +39,12 @@ prepare_key_wep() { } _wdev_prepare_channel() { - json_get_vars channel hwmode + json_get_vars channel band hwmode auto_channel=0 enable_ht=0 htmode= hwmode="${hwmode##11}" - hwmode_n="${hwmode##n}" case "$channel" in ""|0|auto) @@ -58,19 +57,8 @@ _wdev_prepare_channel() { ;; esac - [[ "$hwmode_n" = "$hwmode" ]] || { - enable_ht=1 - hwmode="$hwmode_n" - - json_get_vars htmode - case "$htmode" in - HT20|HT40+|HT40-);; - *) htmode= ;; - esac - } - case "$hwmode" in - a|b|g) ;; + a|b|g|ad) ;; *) if [ "$channel" -gt 14 ]; then hwmode=a @@ -79,6 +67,18 @@ _wdev_prepare_channel() { fi ;; esac + + case "$band" in + 2g) hwmode=g;; + 5g|6g|60g) hwmode=a;; + *) + case "$hwmode" in + *a) band=5g;; + *ad) band=60g;; + *b|*g) band=2g;; + esac + ;; + esac } _wdev_handler() { @@ -108,12 +108,13 @@ _wdev_wrapper() { _wdev_notify_init() { local command="$1" - local interface="$2" + local name="$2" + local value="$3" json_init json_add_int "command" "$command" json_add_string "device" "$__netifd_device" - [ -n "$interface" ] && json_add_string "interface" "$interface" + [ -n "$name" -a -n "$value" ] && json_add_string "$name" "$value" json_add_object "data" } @@ -139,7 +140,17 @@ _wireless_add_vif() { local name="$1"; shift local ifname="$1"; shift - _wdev_notify_init $CMD_SET_DATA "$name" + _wdev_notify_init $CMD_SET_DATA "interface" "$name" + json_add_string "ifname" "$ifname" + _wdev_add_variables "$@" + _wdev_notify +} + +_wireless_add_vlan() { + local name="$1"; shift + local ifname="$1"; shift + + _wdev_notify_init $CMD_SET_DATA "vlan" "$name" json_add_string "ifname" "$ifname" _wdev_add_variables "$@" _wdev_notify @@ -163,6 +174,7 @@ _wireless_add_process() { json_add_int pid "$1" json_add_string exe "$exe" [ -n "$3" ] && json_add_boolean required 1 + [ -n "$4" ] && json_add_boolean keep 1 exe2="$(readlink -f /proc/$1/exe)" [ "$exe" != "$exe2" ] && echo "WARNING (wireless_add_process): executable path $exe does not match process $1 path ($exe2)" _wdev_notify @@ -182,6 +194,7 @@ _wireless_set_retry() { _wdev_wrapper \ wireless_add_vif \ + wireless_add_vlan \ wireless_set_up \ wireless_set_data \ wireless_add_process \ @@ -195,11 +208,18 @@ wireless_vif_parse_encryption() { auth_mode_open=1 auth_mode_shared=0 auth_type=none - wpa_cipher=CCMP + + if [ "$hwmode" = "ad" ]; then + wpa_cipher="GCMP" + else + wpa_cipher="CCMP" + fi + case "$encryption" in *tkip+aes|*tkip+ccmp|*aes+tkip|*ccmp+tkip) wpa_cipher="CCMP TKIP";; *aes|*ccmp) wpa_cipher="CCMP";; *tkip) wpa_cipher="TKIP";; + *gcmp) wpa_cipher="GCMP";; esac # 802.11n requires CCMP for WPA @@ -211,7 +231,7 @@ wireless_vif_parse_encryption() { # wpa2/tkip+aes => WPA2 RADIUS, CCMP+TKIP case "$encryption" in - wpa2*|*psk2*|psk3*|sae*) + wpa2*|wpa3*|*psk2*|psk3*|sae*|owe*) wpa=2 ;; wpa*mixed*|*psk*mixed*) @@ -228,6 +248,15 @@ wireless_vif_parse_encryption() { wpa_pairwise="$wpa_cipher" case "$encryption" in + owe*) + auth_type=owe + ;; + wpa3-mixed*) + auth_type=eap-eap192 + ;; + wpa3*) + auth_type=eap192 + ;; psk3-mixed*|sae-mixed*) auth_type=psk-sae ;; @@ -253,6 +282,12 @@ wireless_vif_parse_encryption() { esac ;; esac + + case "$encryption" in + *osen*) + auth_osen=1 + ;; + esac } _wireless_set_brsnoop_isolation() { @@ -296,14 +331,52 @@ for_each_interface() { json_select .. } +for_each_vlan() { + local _w_vlans _w_vlan + + json_get_keys _w_vlans vlans + json_select vlans + for _w_vlan in $_w_vlans; do + json_select "$_w_vlan" + json_select config + "$@" "$_w_vlan" + json_select .. + json_select .. + done + json_select .. +} + +for_each_station() { + local _w_stas _w_sta + + json_get_keys _w_stas stas + json_select stas + for _w_sta in $_w_stas; do + json_select "$_w_sta" + json_select config + "$@" "$_w_sta" + json_select .. + json_select .. + done + json_select .. +} + _wdev_common_device_config() { - config_add_string channel hwmode htmode noscan + config_add_string channel hwmode band htmode noscan } _wdev_common_iface_config() { config_add_string mode ssid encryption 'key:wpakey' } +_wdev_common_vlan_config() { + config_add_string name vid iface +} + +_wdev_common_station_config() { + config_add_string mac key vid iface +} + init_wireless_driver() { name="$1"; shift cmd="$1"; shift @@ -326,6 +399,16 @@ init_wireless_driver() { eval "drv_$1_init_iface_config" json_close_array + json_add_array vlan + _wdev_common_vlan_config + eval "drv_$1_init_vlan_config" + json_close_array + + json_add_array station + _wdev_common_station_config + eval "drv_$1_init_station_config" + json_close_array + json_dump } ;;