2
0
Эх сурвалжийг харах

mac80211: allow AP configuration of beacon interval, DTIM period, maximum permissible STA listen interval, and basic rates

This introduces beacon_int and basic_rate (per wifi-device), and
dtim_period and max_listen_int (per wifi-iface) for mac80211. These
configure the beacon interval, basic rate specification, DTIM period
(one DTIM per this many beacon frames), and maximum listen interval
that a STA will be permitted to associate with. All of the new
settings are optional; if they're absent, the existing hostapd (or, in
the case of basic_rate, driver) defaults will be used.

The existing bintval property only used for type adhoc is moved from
wifi-iface to wifi-device, and is renamed to beacon_interval because
bintval isn't a great name. The beacon interval is property of the
wifi-device; while the choice between wifi-device and wifi-iface may
not be relevant with an adhoc network, there's no reason to configure
the same property one way for type adhoc and another for type ap. This
change isn't expected to cause many problems, as bintval was added
recently, in r25111.

Similarly, the list of basic rates, also added for type adhoc in
r25111, is a property of the device and not the interface. Further, it
ought to be represented in UCI as a list, not a string dependent on
the format that iw uses. I’ve moved it onto the device, renamed it to
basic_rate, and made it configurable for APs via hostapd. Finally, I
adapted it to use the same kb/s representation as mcast_rate; there's
precedent for this format in that it's also how madwifi interprets
mcast_rate.

Neither bintval nor basicrates were ever documented in the UCI
wireless configuration page on the wiki. When this change is
committed, I'll update the documentation as needed.

Signed-off-by: Mark Mentovai <[email protected]>

SVN-Revision: 25837
Felix Fietkau 15 жил өмнө
parent
commit
3494bdc59a

+ 33 - 4
package/mac80211/files/lib/wifi/mac80211.sh

@@ -13,6 +13,8 @@ mac80211_hostapd_setup_base() {
 	config_get country "$device" country
 	config_get country "$device" country
 	config_get hwmode "$device" hwmode
 	config_get hwmode "$device" hwmode
 	config_get channel "$device" channel
 	config_get channel "$device" channel
+	config_get beacon_int "$device" beacon_int
+	config_get basic_rate_list "$device" basic_rate
 	config_get_bool noscan "$device" noscan
 	config_get_bool noscan "$device" noscan
 	[ -n "$channel" -a -z "$hwmode" ] && wifi_fixup_hwmode "$device"
 	[ -n "$channel" -a -z "$hwmode" ] && wifi_fixup_hwmode "$device"
 	[ "$channel" = auto ] && channel=
 	[ "$channel" = auto ] && channel=
@@ -51,6 +53,16 @@ mac80211_hostapd_setup_base() {
 			echo "$mac" >> $macfile
 			echo "$mac" >> $macfile
 		done
 		done
 	}
 	}
+
+	local br brval brstr
+	[ -n "$basic_rate_list" ] && {
+		for br in $basic_rate_list; do
+			brval="$(($br / 100))"
+			[ -n "$brstr" ] && brstr="$brstr "
+			brstr="$brstr$brval"
+		done
+	}
+	
 	cat >> "$cfgfile" <<EOF
 	cat >> "$cfgfile" <<EOF
 ctrl_interface=/var/run/hostapd-$phy
 ctrl_interface=/var/run/hostapd-$phy
 driver=nl80211
 driver=nl80211
@@ -92,8 +104,10 @@ tx_queue_data0_cwmax=7
 tx_queue_data0_burst=1.5
 tx_queue_data0_burst=1.5
 ${hwmode:+hw_mode=$hwmode}
 ${hwmode:+hw_mode=$hwmode}
 ${channel:+channel=$channel}
 ${channel:+channel=$channel}
+${beacon_int:+beacon_int=$beacon_int}
 ${country:+country_code=$country}
 ${country:+country_code=$country}
 ${noscan:+noscan=$noscan}
 ${noscan:+noscan=$noscan}
+${brstr:+basic_rates=$brstr}
 $base_cfg
 $base_cfg
 
 
 EOF
 EOF
@@ -127,6 +141,8 @@ mac80211_hostapd_setup_bss() {
 	local macaddr hidden maxassoc wmm
 	local macaddr hidden maxassoc wmm
 	config_get macaddr "$vif" macaddr
 	config_get macaddr "$vif" macaddr
 	config_get maxassoc "$vif" maxassoc
 	config_get maxassoc "$vif" maxassoc
+	config_get dtim_period "$vif" dtim_period
+	config_get max_listen_int "$vif" max_listen_int
 	config_get_bool hidden "$vif" hidden 0
 	config_get_bool hidden "$vif" hidden 0
 	config_get_bool wmm "$vif" wmm 1
 	config_get_bool wmm "$vif" wmm 1
 	cat >> /var/run/hostapd-$phy.conf <<EOF
 	cat >> /var/run/hostapd-$phy.conf <<EOF
@@ -134,6 +150,8 @@ $hostapd_cfg
 wmm_enabled=$wmm
 wmm_enabled=$wmm
 bssid=$macaddr
 bssid=$macaddr
 ignore_broadcast_ssid=$hidden
 ignore_broadcast_ssid=$hidden
+${dtim_period:+dtim_period=$dtim_period}
+${max_listen_int:+max_listen_interval=$max_listen_int}
 ${maxassoc:+max_num_sta=$maxassoc}
 ${maxassoc:+max_num_sta=$maxassoc}
 EOF
 EOF
 }
 }
@@ -390,8 +408,8 @@ enable_mac80211() {
 				adhoc)
 				adhoc)
 					config_get bssid "$vif" bssid
 					config_get bssid "$vif" bssid
 					config_get ssid "$vif" ssid
 					config_get ssid "$vif" ssid
-					config_get bintval "$vif" bintval
-					config_get basicrates "$vif" basicrates
+					config_get beacon_int "$device" beacon_int
+					config_get basic_rate_list "$device" basic_rate
 					config_get encryption "$vif" encryption
 					config_get encryption "$vif" encryption
 					config_get key "$vif" key 1
 					config_get key "$vif" key 1
 					config_get mcast_rate "$vif" mcast_rate
 					config_get mcast_rate "$vif" mcast_rate
@@ -416,6 +434,17 @@ enable_mac80211() {
 						esac
 						esac
 					}
 					}
 
 
+					local br brval brsub brstr
+					[ -n "$basic_rate_list" ] && {
+						for br in $basic_rate_list; do
+							brval="$(($br / 1000))"
+							brsub="$((($br / 100) % 10))"
+							[ "$brsub" -gt 0 ] && brval="$brval.$brsub"
+							[ -n "$brstr" ] && brstr="$brstr,"
+							brstr="$brstr$brval"
+						done
+					}
+
 					local mcval=""
 					local mcval=""
 					[ -n "$mcast_rate" ] && {
 					[ -n "$mcast_rate" ] && {
 						mcval="$(($mcast_rate / 1000))"
 						mcval="$(($mcast_rate / 1000))"
@@ -425,8 +454,8 @@ enable_mac80211() {
 
 
 					iw dev "$ifname" ibss join "$ssid" $freq \
 					iw dev "$ifname" ibss join "$ssid" $freq \
 						${fixed:+fixed-freq} $bssid \
 						${fixed:+fixed-freq} $bssid \
-						${bintval:+beacon-interval $bintval} \
-						${basicrates:+basic-rates $basicrates} \
+						${beacon_int:+beacon-interval $beacon_int} \
+						${brstr:+basic-rates $brstr} \
 						${mcval:+mcast-rate $mcval} \
 						${mcval:+mcast-rate $mcval} \
 						${keyspec:+keys $keyspec}
 						${keyspec:+keys $keyspec}
 				;;
 				;;