mac80211: start hostapd with logging wpa_printf messages to syslog
[openwrt/openwrt.git] / package / kernel / mac80211 / files / lib / netifd / wireless / mac80211.sh
index ec0966ea8d85dc9d960dbe432ac0e6dfe22a6179..baa023ecf63ba3515e1458064e1b14bc5c74a8bc 100644 (file)
@@ -21,8 +21,9 @@ drv_mac80211_init_device_config() {
        config_add_string hwmode
        config_add_int beacon_int chanbw frag rts
        config_add_int rxantenna txantenna antenna_gain txpower distance
-       config_add_boolean noscan
+       config_add_boolean noscan ht_coex
        config_add_array ht_capab
+       config_add_array channels
        config_add_boolean \
                rxldpc \
                short_gi_80 \
@@ -89,8 +90,9 @@ mac80211_hostapd_setup_base() {
        json_select config
 
        [ "$auto_channel" -gt 0 ] && channel=acs_survey
+       [ "$auto_channel" -gt 0 ] && json_get_values channel_list channels
 
-       json_get_vars noscan
+       json_get_vars noscan ht_coex
        json_get_values ht_capab_list ht_capab
 
        ieee80211n=1
@@ -127,6 +129,9 @@ mac80211_hostapd_setup_base() {
        [ -n "$ieee80211n" ] && {
                append base_cfg "ieee80211n=1" "$N"
 
+               set_default ht_coex 0
+               append base_cfg "ht_coex=$ht_coex" "$N"
+
                json_get_vars \
                        ldpc:1 \
                        greenfield:0 \
@@ -215,7 +220,6 @@ mac80211_hostapd_setup_base() {
                        vht_max_a_mpdu_len_exp:7 \
                        vht_max_mpdu:11454 \
                        rx_stbc:4 \
-                       tx_stbc:4 \
                        vht_link_adapt:3 \
                        vht160:2
 
@@ -227,13 +231,13 @@ mac80211_hostapd_setup_base() {
 
                cap_rx_stbc=$((($vht_cap >> 8) & 7))
                [ "$rx_stbc" -lt "$cap_rx_stbc" ] && cap_rx_stbc="$rx_stbc"
-               ht_cap_mask="$(( ($vht_cap & ~(0x700)) | ($cap_rx_stbc << 8) ))"
+               vht_cap="$(( ($vht_cap & ~(0x700)) | ($cap_rx_stbc << 8) ))"
 
                mac80211_add_capabilities vht_capab $vht_cap \
                        RXLDPC:0x10::$rxldpc \
                        SHORT-GI-80:0x20::$short_gi_80 \
                        SHORT-GI-160:0x40::$short_gi_160 \
-                       TX-STBC-2BY1:0x80::$tx_stbc \
+                       TX-STBC-2BY1:0x80::$tx_stbc_2by1 \
                        SU-BEAMFORMER:0x800::$su_beamformer \
                        SU-BEAMFORMEE:0x1000::$su_beamformee \
                        MU-BEAMFORMER:0x80000::$mu_beamformer \
@@ -242,10 +246,10 @@ mac80211_hostapd_setup_base() {
                        HTC-VHT:0x400000::$htc_vht \
                        RX-ANTENNA-PATTERN:0x10000000::$rx_antenna_pattern \
                        TX-ANTENNA-PATTERN:0x20000000::$tx_antenna_pattern \
-                       RX-STBC1:0x700:0x100:1 \
-                       RX-STBC12:0x700:0x200:1 \
-                       RX-STBC123:0x700:0x300:1 \
-                       RX-STBC1234:0x700:0x400:1 \
+                       RX-STBC-1:0x700:0x100:1 \
+                       RX-STBC-12:0x700:0x200:1 \
+                       RX-STBC-123:0x700:0x300:1 \
+                       RX-STBC-1234:0x700:0x400:1 \
 
                # supported Channel widths
                vht160_hw=0
@@ -298,6 +302,7 @@ mac80211_hostapd_setup_base() {
        hostapd_prepare_device_config "$hostapd_conf_file" nl80211
        cat >> "$hostapd_conf_file" <<EOF
 ${channel:+channel=$channel}
+${channel_list:+chanlist=$channel_list}
 ${noscan:+noscan=$noscan}
 $base_cfg
 
@@ -388,11 +393,10 @@ mac80211_generate_mac() {
 find_phy() {
        [ -n "$phy" -a -d /sys/class/ieee80211/$phy ] && return 0
        [ -n "$path" ] && {
-               for phy in /sys/devices/$path/ieee80211/phy*; do
-                       [ -e "$phy" ] && {
-                               phy="${phy##*/}"
-                               return 0
-                       }
+               for phy in $(ls /sys/class/ieee80211 2>/dev/null); do
+                       case "$(readlink -f /sys/class/ieee80211/$phy/device)" in
+                               *$path) return 0;;
+                       esac
                done
        }
        [ -n "$macaddr" ] && {
@@ -447,17 +451,12 @@ mac80211_prepare_vif() {
                        mac80211_hostapd_setup_bss "$phy" "$ifname" "$macaddr" "$type" || return
 
                        [ -n "$hostapd_ctrl" ] || {
-                               iw phy "$phy" interface add "$ifname" type managed
+                               iw phy "$phy" interface add "$ifname" type __ap
                                hostapd_ctrl="${hostapd_ctrl:-/var/run/hostapd/$ifname}"
                        }
                ;;
                mesh)
-                       json_get_vars key mesh_id
-                       if [ -n "$key" ]; then
-                               iw phy "$phy" interface add "$ifname" type mp
-                       else
-                               iw phy "$phy" interface add "$ifname" type mp mesh_id "$mesh_id"
-                       fi
+                       iw phy "$phy" interface add "$ifname" type mp
                ;;
                monitor)
                        iw phy "$phy" interface add "$ifname" type monitor
@@ -483,7 +482,7 @@ mac80211_prepare_vif() {
                # All interfaces must have unique mac addresses
                # which can either be explicitly set in the device
                # section, or automatically generated
-               ifconfig "$ifname" hw ether "$macaddr"
+               ip link set dev "$ifname" address "$macaddr"
        fi
 
        json_select ..
@@ -498,7 +497,7 @@ mac80211_setup_supplicant() {
 mac80211_setup_adhoc_htmode() {
        case "$htmode" in
                VHT20|HT20) ibss_htmode=HT20;;
-               HT40*|VHT40|VHT80|VHT160)
+               HT40*|VHT40|VHT160)
                        case "$hwmode" in
                                a)
                                        case "$(( ($channel / 4) % 2 ))" in
@@ -522,6 +521,12 @@ mac80211_setup_adhoc_htmode() {
                        esac
                        [ "$auto_channel" -gt 0 ] && ibss_htmode="HT40+"
                ;;
+               VHT80)
+                       ibss_htmode="80MHZ"
+               ;;
+               NONE|NOHT)
+                       ibss_htmode="NOHT"
+               ;;
                *) ibss_htmode="" ;;
        esac
 
@@ -579,7 +584,7 @@ mac80211_setup_vif() {
        json_get_vars mode
        json_get_var vif_txpower txpower
 
-       ifconfig "$ifname" up || {
+       ip link set dev "$ifname" up || {
                wireless_setup_vif_failed IFUP_ERROR
                json_select ..
                return
@@ -590,23 +595,64 @@ mac80211_setup_vif() {
 
        case "$mode" in
                mesh)
-                       for var in $MP_CONFIG_INT $MP_CONFIG_BOOL $MP_CONFIG_STRING; do
-                               json_get_var mp_val "$var"
-                               [ -n "$mp_val" ] && iw dev "$ifname" set mesh_param "$var" "$mp_val"
-                       done
-
-                       # authsae
+                       # authsae or wpa_supplicant
                        json_get_vars key
                        if [ -n "$key" ]; then
                                if [ -e "/lib/wifi/authsae.sh" ]; then
                                        . /lib/wifi/authsae.sh
                                        authsae_start_interface || failed=1
                                else
-                                       wireless_setup_vif_failed AUTHSAE_NOT_INSTALLED
-                                       json_select ..
-                                       return
+                                       wireless_vif_parse_encryption
+                                       mac80211_setup_supplicant || failed=1
                                fi
+                       else
+                               json_get_vars mesh_id mcast_rate
+
+                               mcval=
+                               [ -n "$mcast_rate" ] && wpa_supplicant_add_rate mcval "$mcast_rate"
+
+                               case "$htmode" in
+                                       VHT20|HT20) mesh_htmode=HT20;;
+                                       HT40*|VHT40)
+                                               case "$hwmode" in
+                                                       a)
+                                                               case "$(( ($channel / 4) % 2 ))" in
+                                                                       1) mesh_htmode="HT40+" ;;
+                                                                       0) mesh_htmode="HT40-";;
+                                                               esac
+                                                       ;;
+                                                       *)
+                                                               case "$htmode" in
+                                                                       HT40+) mesh_htmode="HT40+";;
+                                                                       HT40-) mesh_htmode="HT40-";;
+                                                                       *)
+                                                                               if [ "$channel" -lt 7 ]; then
+                                                                                       mesh_htmode="HT40+"
+                                                                               else
+                                                                                       mesh_htmode="HT40-"
+                                                                               fi
+                                                                       ;;
+                                                               esac
+                                                       ;;
+                                               esac
+                                       ;;
+                                       VHT80)
+                                               mesh_htmode="80Mhz"
+                                       ;;
+                                       VHT160)
+                                               mesh_htmode="160Mhz"
+                                       ;;
+                                       *) mesh_htmode="NOHT" ;;
+                               esac
+
+                               freq="$(get_freq "$phy" "$channel")"
+                               iw dev "$ifname" mesh join "$mesh_id" freq $freq $mesh_htmode ${mcval:+mcast-rate $mcval}
                        fi
+
+                       for var in $MP_CONFIG_INT $MP_CONFIG_BOOL $MP_CONFIG_STRING; do
+                               json_get_var mp_val "$var"
+                               [ -n "$mp_val" ] && iw dev "$ifname" set mesh_param "$var" "$mp_val"
+                       done
                ;;
                adhoc)
                        wireless_vif_parse_encryption
@@ -636,7 +682,7 @@ mac80211_interface_cleanup() {
        local phy="$1"
 
        for wdev in $(list_phy_interfaces "$phy"); do
-               ifconfig "$wdev" down 2>/dev/null
+               ip link set dev "$wdev" down 2>/dev/null
                iw dev "$wdev" del
        done
 }
@@ -710,7 +756,7 @@ drv_mac80211_setup() {
        for_each_interface "ap" mac80211_prepare_vif
 
        [ -n "$hostapd_ctrl" ] && {
-               /usr/sbin/hostapd -P /var/run/wifi-$phy.pid -B "$hostapd_conf_file"
+               /usr/sbin/hostapd -s -P /var/run/wifi-$phy.pid -B "$hostapd_conf_file"
                ret="$?"
                wireless_add_process "$(cat /var/run/wifi-$phy.pid)" "/usr/sbin/hostapd" 1
                [ "$ret" != 0 ] && {