}
_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)
;;
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
fi
;;
esac
+
+ case "$band" in
+ 2g) hwmode=g;;
+ 5g|6g) hwmode=a;;
+ 60g) hwmode=ad;;
+ *)
+ case "$hwmode" in
+ *a) band=5g;;
+ *ad) band=60g;;
+ *b|*g) band=2g;;
+ esac
+ ;;
+ esac
}
_wdev_handler() {
}
_wdev_notify_init() {
- local command="$1"
- local interface="$2"
+ local command="$1"; shift;
json_init
json_add_int "command" "$command"
json_add_string "device" "$__netifd_device"
- [ -n "$interface" ] && json_add_string "interface" "$interface"
+ while [ -n "$1" ]; do
+ local name="$1"; shift
+ local value="$1"; shift
+ json_add_string "$name" "$value"
+ done
json_add_object "data"
}
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 interface "$__cur_interface" "vlan" "$name"
json_add_string "ifname" "$ifname"
_wdev_add_variables "$@"
_wdev_notify
json_add_int pid "$1"
json_add_string exe "$exe"
[ -n "$3" ] && json_add_boolean required 1
- exe2="$(readlink -f /proc/$pid/exe)"
- [ "$exe" = "$exe2" ] && echo "WARNING (wireless_add_process): executable path $exe does not match process $1 path ($exe2)"
+ [ -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
}
_wdev_wrapper \
wireless_add_vif \
+ wireless_add_vlan \
wireless_set_up \
wireless_set_data \
wireless_add_process \
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";;
+ *ccmp256) wpa_cipher="CCMP-256";;
*aes|*ccmp) wpa_cipher="CCMP";;
*tkip) wpa_cipher="TKIP";;
+ *gcmp256) wpa_cipher="GCMP-256";;
+ *gcmp) wpa_cipher="GCMP";;
+ wpa3-192*) wpa_cipher="GCMP-256";;
esac
# 802.11n requires CCMP for WPA
# wpa2/tkip+aes => WPA2 RADIUS, CCMP+TKIP
case "$encryption" in
- wpa2*|*psk2*)
+ wpa2*|wpa3*|*psk2*|psk3*|sae*|owe*)
wpa=2
;;
- *mixed*)
+ wpa*mixed*|*psk*mixed*)
wpa=3
;;
wpa*|*psk*)
wpa_pairwise="$wpa_cipher"
case "$encryption" in
+ owe*)
+ auth_type=owe
+ ;;
+ wpa3-192*)
+ auth_type=eap192
+ ;;
+ wpa3-mixed*)
+ auth_type=eap-eap2
+ ;;
+ wpa3*)
+ auth_type=eap2
+ ;;
+ psk3-mixed*|sae-mixed*)
+ auth_type=psk-sae
+ ;;
+ psk3*|sae*)
+ auth_type=sae
+ ;;
*psk*)
auth_type=psk
;;
esac
;;
esac
+
+ case "$encryption" in
+ *osen*)
+ auth_osen=1
+ ;;
+ esac
}
_wireless_set_brsnoop_isolation() {
local multicast_to_unicast="$1"
local isolate
- json_get_var isolate isolate
+ json_get_vars isolate proxy_arp
[ ${isolate:-0} -gt 0 -o -z "$network_bridge" ] && return
- [ ${multicast_to_unicast:-1} -gt 0 ] && json_add_boolean isolate 1
+ [ ${multicast_to_unicast:-1} -gt 0 -o ${proxy_arp:-0} -gt 0 ] && json_add_boolean isolate 1
}
for_each_interface() {
json_select "$_w_iface"
if [ -n "$_w_types" ]; then
json_get_var network_bridge bridge
+ json_get_var network_ifname bridge-ifname
json_get_var multicast_to_unicast multicast_to_unicast
json_select config
_wireless_set_brsnoop_isolation "$multicast_to_unicast"
continue
}
fi
+ __cur_interface="$_w_iface"
"$@" "$_w_iface"
json_select ..
done
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
+ config_add_string channel hwmode band htmode noscan
}
_wdev_common_iface_config() {
config_add_string mode ssid encryption 'key:wpakey'
+ config_add_boolean bridge_isolate
+}
+
+_wdev_common_vlan_config() {
+ config_add_string name vid iface
+ config_add_boolean bridge_isolate
+}
+
+_wdev_common_station_config() {
+ config_add_string mac key vid iface
}
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
}
;;