2007-10-05 17:56:15 +00:00
|
|
|
#!/bin/sh
|
|
|
|
append DRIVERS "mac80211"
|
|
|
|
|
2010-01-20 02:26:05 +00:00
|
|
|
mac80211_hostapd_setup_base() {
|
|
|
|
local phy="$1"
|
|
|
|
local ifname="$2"
|
|
|
|
|
|
|
|
cfgfile="/var/run/hostapd-$phy.conf"
|
2011-01-26 11:33:54 +00:00
|
|
|
macfile="/var/run/hostapd-$phy.maclist"
|
|
|
|
[ -e "$macfile" ] && rm -f "$macfile"
|
|
|
|
|
2010-01-20 02:26:05 +00:00
|
|
|
config_get device "$vif" device
|
|
|
|
config_get country "$device" country
|
|
|
|
config_get hwmode "$device" hwmode
|
|
|
|
config_get channel "$device" channel
|
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 <mark@moxienet.com>
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@25837 3c298f89-4303-0410-b956-a3cf2f4a3e73
2011-03-02 21:08:28 +00:00
|
|
|
config_get beacon_int "$device" beacon_int
|
|
|
|
config_get basic_rate_list "$device" basic_rate
|
2010-03-09 17:36:04 +00:00
|
|
|
config_get_bool noscan "$device" noscan
|
2011-08-20 00:14:48 +00:00
|
|
|
|
|
|
|
hostapd_set_log_options base_cfg "$device"
|
|
|
|
|
2010-01-20 02:26:05 +00:00
|
|
|
[ -n "$channel" -a -z "$hwmode" ] && wifi_fixup_hwmode "$device"
|
2011-08-13 22:55:59 +00:00
|
|
|
|
|
|
|
[ "$channel" = auto ] && {
|
|
|
|
channel=$(iw phy "$phy" info | \
|
|
|
|
sed -ne '/MHz/ { /disabled\|passive\|radar/d; s/.*\[//; s/\].*//; p; q }')
|
|
|
|
config_set "$device" channel "$channel"
|
|
|
|
}
|
|
|
|
|
2010-01-20 02:26:05 +00:00
|
|
|
[ -n "$hwmode" ] && {
|
|
|
|
config_get hwmode_11n "$device" hwmode_11n
|
|
|
|
[ -n "$hwmode_11n" ] && {
|
|
|
|
hwmode="$hwmode_11n"
|
|
|
|
append base_cfg "ieee80211n=1" "$N"
|
|
|
|
config_get htmode "$device" htmode
|
|
|
|
config_get ht_capab_list "$device" ht_capab
|
|
|
|
case "$htmode" in
|
|
|
|
HT20|HT40+|HT40-) ht_capab="[$htmode]";;
|
|
|
|
*)ht_capab=;;
|
|
|
|
esac
|
|
|
|
for cap in $ht_capab_list; do
|
|
|
|
ht_capab="$ht_capab[$cap]"
|
|
|
|
done
|
|
|
|
[ -n "$ht_capab" ] && append base_cfg "ht_capab=$ht_capab" "$N"
|
|
|
|
}
|
|
|
|
}
|
2011-01-26 11:33:54 +00:00
|
|
|
|
2011-04-26 19:33:27 +00:00
|
|
|
local country_ie=0
|
|
|
|
[ -n "$country" ] && country_ie=1
|
|
|
|
config_get_bool country_ie "$device" country_ie "$country_ie"
|
|
|
|
[ "$country_ie" -gt 0 ] && append base_cfg "ieee80211d=1" "$N"
|
|
|
|
|
2011-01-26 11:33:54 +00:00
|
|
|
config_get macfilter "$vif" macfilter
|
|
|
|
case "$macfilter" in
|
|
|
|
allow)
|
|
|
|
append base_cfg "macaddr_acl=1" "$N"
|
|
|
|
append base_cfg "accept_mac_file=$macfile" "$N"
|
|
|
|
;;
|
|
|
|
deny)
|
|
|
|
append base_cfg "macaddr_acl=0" "$N"
|
|
|
|
append base_cfg "deny_mac_file=$macfile" "$N"
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
config_get maclist "$vif" maclist
|
|
|
|
[ -n "$maclist" ] && {
|
|
|
|
for mac in $maclist; do
|
|
|
|
echo "$mac" >> $macfile
|
|
|
|
done
|
|
|
|
}
|
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 <mark@moxienet.com>
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@25837 3c298f89-4303-0410-b956-a3cf2f4a3e73
2011-03-02 21:08:28 +00:00
|
|
|
|
|
|
|
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
|
|
|
|
}
|
|
|
|
|
2011-01-26 11:33:54 +00:00
|
|
|
cat >> "$cfgfile" <<EOF
|
2010-01-20 02:26:05 +00:00
|
|
|
ctrl_interface=/var/run/hostapd-$phy
|
|
|
|
driver=nl80211
|
|
|
|
wmm_ac_bk_cwmin=4
|
|
|
|
wmm_ac_bk_cwmax=10
|
|
|
|
wmm_ac_bk_aifs=7
|
|
|
|
wmm_ac_bk_txop_limit=0
|
|
|
|
wmm_ac_bk_acm=0
|
|
|
|
wmm_ac_be_aifs=3
|
|
|
|
wmm_ac_be_cwmin=4
|
|
|
|
wmm_ac_be_cwmax=10
|
|
|
|
wmm_ac_be_txop_limit=0
|
|
|
|
wmm_ac_be_acm=0
|
|
|
|
wmm_ac_vi_aifs=2
|
|
|
|
wmm_ac_vi_cwmin=3
|
|
|
|
wmm_ac_vi_cwmax=4
|
|
|
|
wmm_ac_vi_txop_limit=94
|
|
|
|
wmm_ac_vi_acm=0
|
|
|
|
wmm_ac_vo_aifs=2
|
|
|
|
wmm_ac_vo_cwmin=2
|
|
|
|
wmm_ac_vo_cwmax=3
|
|
|
|
wmm_ac_vo_txop_limit=47
|
|
|
|
wmm_ac_vo_acm=0
|
|
|
|
tx_queue_data3_aifs=7
|
|
|
|
tx_queue_data3_cwmin=15
|
|
|
|
tx_queue_data3_cwmax=1023
|
|
|
|
tx_queue_data3_burst=0
|
|
|
|
tx_queue_data2_aifs=3
|
|
|
|
tx_queue_data2_cwmin=15
|
|
|
|
tx_queue_data2_cwmax=63
|
|
|
|
tx_queue_data2_burst=0
|
|
|
|
tx_queue_data1_aifs=1
|
|
|
|
tx_queue_data1_cwmin=7
|
|
|
|
tx_queue_data1_cwmax=15
|
|
|
|
tx_queue_data1_burst=3.0
|
|
|
|
tx_queue_data0_aifs=1
|
|
|
|
tx_queue_data0_cwmin=3
|
|
|
|
tx_queue_data0_cwmax=7
|
|
|
|
tx_queue_data0_burst=1.5
|
|
|
|
${hwmode:+hw_mode=$hwmode}
|
|
|
|
${channel:+channel=$channel}
|
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 <mark@moxienet.com>
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@25837 3c298f89-4303-0410-b956-a3cf2f4a3e73
2011-03-02 21:08:28 +00:00
|
|
|
${beacon_int:+beacon_int=$beacon_int}
|
2010-01-20 02:26:05 +00:00
|
|
|
${country:+country_code=$country}
|
2010-03-09 17:36:04 +00:00
|
|
|
${noscan:+noscan=$noscan}
|
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 <mark@moxienet.com>
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@25837 3c298f89-4303-0410-b956-a3cf2f4a3e73
2011-03-02 21:08:28 +00:00
|
|
|
${brstr:+basic_rates=$brstr}
|
2010-01-20 02:26:05 +00:00
|
|
|
$base_cfg
|
|
|
|
|
|
|
|
EOF
|
|
|
|
}
|
|
|
|
|
|
|
|
mac80211_hostapd_setup_bss() {
|
|
|
|
local phy="$1"
|
|
|
|
local vif="$2"
|
|
|
|
|
|
|
|
hostapd_cfg=
|
|
|
|
cfgfile="/var/run/hostapd-$phy.conf"
|
|
|
|
config_get ifname "$vif" ifname
|
|
|
|
|
|
|
|
if [ -f "$cfgfile" ]; then
|
|
|
|
append hostapd_cfg "bss=$ifname" "$N"
|
|
|
|
else
|
|
|
|
mac80211_hostapd_setup_base "$phy" "$ifname"
|
|
|
|
append hostapd_cfg "interface=$ifname" "$N"
|
|
|
|
fi
|
|
|
|
|
|
|
|
local net_cfg bridge
|
|
|
|
net_cfg="$(find_net_config "$vif")"
|
|
|
|
[ -z "$net_cfg" ] || bridge="$(bridge_interface "$net_cfg")"
|
|
|
|
config_set "$vif" bridge "$bridge"
|
|
|
|
|
|
|
|
hostapd_set_bss_options hostapd_cfg "$vif"
|
|
|
|
|
|
|
|
config_get_bool wds "$vif" wds 0
|
|
|
|
[ "$wds" -gt 0 ] && append hostapd_cfg "wds_sta=1" "$N"
|
|
|
|
|
2011-01-11 13:19:53 +00:00
|
|
|
local macaddr hidden maxassoc wmm
|
2010-01-20 02:26:05 +00:00
|
|
|
config_get macaddr "$vif" macaddr
|
2010-12-19 13:33:55 +00:00
|
|
|
config_get maxassoc "$vif" maxassoc
|
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 <mark@moxienet.com>
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@25837 3c298f89-4303-0410-b956-a3cf2f4a3e73
2011-03-02 21:08:28 +00:00
|
|
|
config_get dtim_period "$vif" dtim_period
|
|
|
|
config_get max_listen_int "$vif" max_listen_int
|
2011-01-11 13:19:53 +00:00
|
|
|
config_get_bool hidden "$vif" hidden 0
|
|
|
|
config_get_bool wmm "$vif" wmm 1
|
2010-01-20 02:26:05 +00:00
|
|
|
cat >> /var/run/hostapd-$phy.conf <<EOF
|
|
|
|
$hostapd_cfg
|
2011-01-11 13:19:53 +00:00
|
|
|
wmm_enabled=$wmm
|
2010-01-20 02:26:05 +00:00
|
|
|
bssid=$macaddr
|
|
|
|
ignore_broadcast_ssid=$hidden
|
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 <mark@moxienet.com>
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@25837 3c298f89-4303-0410-b956-a3cf2f4a3e73
2011-03-02 21:08:28 +00:00
|
|
|
${dtim_period:+dtim_period=$dtim_period}
|
|
|
|
${max_listen_int:+max_listen_interval=$max_listen_int}
|
2010-12-19 13:33:55 +00:00
|
|
|
${maxassoc:+max_num_sta=$maxassoc}
|
2010-01-20 02:26:05 +00:00
|
|
|
EOF
|
|
|
|
}
|
|
|
|
|
|
|
|
mac80211_start_vif() {
|
|
|
|
local vif="$1"
|
|
|
|
local ifname="$2"
|
|
|
|
|
|
|
|
local net_cfg
|
|
|
|
net_cfg="$(find_net_config "$vif")"
|
|
|
|
[ -z "$net_cfg" ] || start_net "$ifname" "$net_cfg"
|
|
|
|
|
|
|
|
set_wifi_up "$vif" "$ifname"
|
|
|
|
}
|
|
|
|
|
2009-10-02 15:18:44 +00:00
|
|
|
find_mac80211_phy() {
|
2010-01-20 02:26:05 +00:00
|
|
|
local device="$1"
|
2009-10-02 15:18:44 +00:00
|
|
|
|
|
|
|
local macaddr="$(config_get "$device" macaddr | tr 'A-Z' 'a-z')"
|
|
|
|
config_get phy "$device" phy
|
|
|
|
[ -z "$phy" -a -n "$macaddr" ] && {
|
2009-10-02 19:16:16 +00:00
|
|
|
for phy in $(ls /sys/class/ieee80211 2>/dev/null); do
|
2009-10-02 15:18:44 +00:00
|
|
|
[ "$macaddr" = "$(cat /sys/class/ieee80211/${phy}/macaddress)" ] || continue
|
|
|
|
config_set "$device" phy "$phy"
|
|
|
|
break
|
|
|
|
done
|
|
|
|
config_get phy "$device" phy
|
|
|
|
}
|
|
|
|
[ -n "$phy" -a -d "/sys/class/ieee80211/$phy" ] || {
|
|
|
|
echo "PHY for wifi device $1 not found"
|
|
|
|
return 1
|
|
|
|
}
|
|
|
|
[ -z "$macaddr" ] && {
|
|
|
|
config_set "$device" macaddr "$(cat /sys/class/ieee80211/${phy}/macaddress)"
|
|
|
|
}
|
|
|
|
return 0
|
|
|
|
}
|
|
|
|
|
2007-10-05 17:56:15 +00:00
|
|
|
scan_mac80211() {
|
|
|
|
local device="$1"
|
2011-09-08 23:21:36 +00:00
|
|
|
local adhoc sta ap monitor mesh disabled
|
2009-01-28 15:47:28 +00:00
|
|
|
|
2007-10-05 17:56:15 +00:00
|
|
|
config_get vifs "$device" vifs
|
|
|
|
for vif in $vifs; do
|
2011-09-08 23:21:36 +00:00
|
|
|
config_get_bool disabled "$vif" disabled 0
|
|
|
|
[ $disabled = 0 ] || continue
|
|
|
|
|
2007-10-05 17:56:15 +00:00
|
|
|
config_get mode "$vif" mode
|
|
|
|
case "$mode" in
|
2009-02-26 14:53:03 +00:00
|
|
|
adhoc|sta|ap|monitor|mesh)
|
2007-10-05 17:56:15 +00:00
|
|
|
append $mode "$vif"
|
|
|
|
;;
|
|
|
|
*) echo "$device($vif): Invalid mode, ignored."; continue;;
|
|
|
|
esac
|
|
|
|
done
|
|
|
|
|
2009-06-29 21:13:10 +00:00
|
|
|
config_set "$device" vifs "${ap:+$ap }${adhoc:+$adhoc }${sta:+$sta }${monitor:+$monitor }${mesh:+$mesh}"
|
2007-10-05 17:56:15 +00:00
|
|
|
}
|
|
|
|
|
2010-07-06 18:53:48 +00:00
|
|
|
list_phy_interfaces() {
|
|
|
|
local phy="$1"
|
|
|
|
if [ -d "/sys/class/ieee80211/${phy}/device/net" ]; then
|
|
|
|
ls "/sys/class/ieee80211/${phy}/device/net" 2>/dev/null;
|
|
|
|
else
|
|
|
|
ls "/sys/class/ieee80211/${phy}/device" 2>/dev/null | grep net: | sed -e 's,net:,,g'
|
|
|
|
fi
|
|
|
|
}
|
2007-10-05 17:56:15 +00:00
|
|
|
|
|
|
|
disable_mac80211() (
|
|
|
|
local device="$1"
|
|
|
|
|
2009-10-02 15:18:44 +00:00
|
|
|
find_mac80211_phy "$device" || return 0
|
|
|
|
config_get phy "$device" phy
|
|
|
|
|
2007-10-05 17:56:15 +00:00
|
|
|
set_wifi_down "$device"
|
|
|
|
# kill all running hostapd and wpa_supplicant processes that
|
2009-01-28 15:47:28 +00:00
|
|
|
# are running on atheros/mac80211 vifs
|
2010-01-25 22:11:21 +00:00
|
|
|
for pid in `pidof hostapd`; do
|
|
|
|
grep -E "$phy" /proc/$pid/cmdline >/dev/null && \
|
2007-10-05 17:56:15 +00:00
|
|
|
kill $pid
|
|
|
|
done
|
2009-01-28 15:47:28 +00:00
|
|
|
|
2007-10-05 17:56:15 +00:00
|
|
|
include /lib/network
|
2010-07-06 18:53:48 +00:00
|
|
|
for wdev in $(list_phy_interfaces "$phy"); do
|
2010-01-23 08:28:20 +00:00
|
|
|
[ -f "/var/run/$wdev.pid" ] && kill $(cat /var/run/$wdev.pid) >&/dev/null 2>&1
|
2010-01-25 22:11:21 +00:00
|
|
|
for pid in `pidof wpa_supplicant`; do
|
|
|
|
grep "$wdev" /proc/$pid/cmdline >/dev/null && \
|
|
|
|
kill $pid
|
|
|
|
done
|
2009-10-02 15:18:44 +00:00
|
|
|
ifconfig "$wdev" down 2>/dev/null
|
|
|
|
unbridge "$dev"
|
|
|
|
iw dev "$wdev" del
|
2007-10-05 17:56:15 +00:00
|
|
|
done
|
2009-10-02 15:18:44 +00:00
|
|
|
|
2007-10-05 17:56:15 +00:00
|
|
|
return 0
|
|
|
|
)
|
2011-09-25 14:14:37 +00:00
|
|
|
|
2009-10-11 00:36:23 +00:00
|
|
|
get_freq() {
|
|
|
|
local phy="$1"
|
2009-10-11 01:01:12 +00:00
|
|
|
local chan="$2"
|
|
|
|
iw "$phy" info | grep -E -m1 "(\* ${chan:-....} MHz${chan:+|\\[$chan\\]})" | grep MHz | awk '{print $2}'
|
2009-10-11 00:36:23 +00:00
|
|
|
}
|
2011-09-25 14:14:37 +00:00
|
|
|
|
|
|
|
mac80211_generate_mac() {
|
|
|
|
local off="$1"
|
|
|
|
local mac="$2"
|
|
|
|
local oIFS="$IFS"; IFS=":"; set -- $mac; IFS="$oIFS"
|
|
|
|
|
|
|
|
local b2mask=0x00
|
|
|
|
[ $off -gt 0 ] && b2mask=0x02
|
|
|
|
|
|
|
|
printf "%02x:%s:%s:%s:%02x:%02x" \
|
|
|
|
$(( 0x$1 | $b2mask )) $2 $3 $4 \
|
|
|
|
$(( (0x$5 + ($off / 0x100)) % 0x100 )) \
|
|
|
|
$(( (0x$6 + $off) % 0x100 ))
|
|
|
|
}
|
|
|
|
|
2007-10-05 17:56:15 +00:00
|
|
|
enable_mac80211() {
|
|
|
|
local device="$1"
|
|
|
|
config_get channel "$device" channel
|
|
|
|
config_get vifs "$device" vifs
|
2009-01-31 16:09:39 +00:00
|
|
|
config_get txpower "$device" txpower
|
2009-12-05 17:12:51 +00:00
|
|
|
config_get country "$device" country
|
2010-01-15 01:16:52 +00:00
|
|
|
config_get distance "$device" distance
|
2011-01-27 09:13:51 +00:00
|
|
|
config_get txantenna "$device" txantenna all
|
|
|
|
config_get rxantenna "$device" rxantenna all
|
2010-07-22 16:01:17 +00:00
|
|
|
config_get frag "$device" frag
|
|
|
|
config_get rts "$device" rts
|
2009-10-02 15:18:44 +00:00
|
|
|
find_mac80211_phy "$device" || return 0
|
|
|
|
config_get phy "$device" phy
|
|
|
|
local i=0
|
2010-01-17 01:52:45 +00:00
|
|
|
local macidx=0
|
2010-01-20 02:26:05 +00:00
|
|
|
local apidx=0
|
2009-10-11 01:01:12 +00:00
|
|
|
fixed=""
|
2010-10-23 23:39:54 +00:00
|
|
|
local hostapd_ctrl=""
|
2009-01-28 15:47:28 +00:00
|
|
|
|
2011-10-08 17:34:56 +00:00
|
|
|
[ -n "$country" ] && {
|
|
|
|
iw reg get | grep -q "^country $country:" || {
|
|
|
|
iw reg set "$country"
|
|
|
|
sleep 1
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-07-08 17:19:42 +00:00
|
|
|
config_get ath9k_chanbw "$device" ath9k_chanbw
|
|
|
|
[ -n "$ath9k_chanbw" -a -d /sys/kernel/debug/ieee80211/$phy/ath9k ] && echo "$ath9k_chanbw" > /sys/kernel/debug/ieee80211/$phy/ath9k/chanbw
|
|
|
|
|
2009-12-05 17:12:51 +00:00
|
|
|
[ -n "$country" ] && iw reg set "$country"
|
2009-10-11 01:01:12 +00:00
|
|
|
[ "$channel" = "auto" -o "$channel" = "0" ] || {
|
|
|
|
fixed=1
|
|
|
|
}
|
|
|
|
|
2011-01-28 12:01:54 +00:00
|
|
|
iw phy "$phy" set antenna $txantenna $rxantenna >/dev/null 2>&1
|
2011-01-26 18:01:26 +00:00
|
|
|
|
2010-01-15 01:16:52 +00:00
|
|
|
[ -n "$distance" ] && iw phy "$phy" set distance "$distance"
|
2010-07-22 16:01:17 +00:00
|
|
|
[ -n "$frag" ] && iw phy "$phy" set frag "${frag%%.*}"
|
|
|
|
[ -n "$rts" ] && iw phy "$phy" set rts "${rts%%.*}"
|
2010-01-15 01:16:52 +00:00
|
|
|
|
2009-10-11 01:01:12 +00:00
|
|
|
export channel fixed
|
2009-10-11 00:36:23 +00:00
|
|
|
# convert channel to frequency
|
2009-10-11 01:01:12 +00:00
|
|
|
local freq="$(get_freq "$phy" "${fixed:+$channel}")"
|
2009-10-11 00:36:23 +00:00
|
|
|
|
2009-03-27 21:14:59 +00:00
|
|
|
wifi_fixup_hwmode "$device" "g"
|
2007-10-05 17:56:15 +00:00
|
|
|
for vif in $vifs; do
|
|
|
|
config_get ifname "$vif" ifname
|
2009-10-02 15:18:44 +00:00
|
|
|
[ -n "$ifname" ] || {
|
2011-11-06 18:49:17 +00:00
|
|
|
[ $i -gt 0 ] && ifname="wlan${phy#phy}-$i" || ifname="wlan${phy#phy}"
|
2007-10-05 17:56:15 +00:00
|
|
|
}
|
2009-10-02 19:16:16 +00:00
|
|
|
config_set "$vif" ifname "$ifname"
|
2009-01-28 15:47:28 +00:00
|
|
|
|
2009-10-02 15:18:44 +00:00
|
|
|
config_get mode "$vif" mode
|
|
|
|
config_get ssid "$vif" ssid
|
2007-10-05 17:56:15 +00:00
|
|
|
|
2009-10-02 15:18:44 +00:00
|
|
|
# It is far easier to delete and create the desired interface
|
2007-10-05 17:56:15 +00:00
|
|
|
case "$mode" in
|
|
|
|
adhoc)
|
2009-10-02 15:18:44 +00:00
|
|
|
iw phy "$phy" interface add "$ifname" type adhoc
|
|
|
|
;;
|
|
|
|
ap)
|
|
|
|
# Hostapd will handle recreating the interface and
|
|
|
|
# it's accompanying monitor
|
2010-01-20 02:26:05 +00:00
|
|
|
apidx="$(($apidx + 1))"
|
|
|
|
[ "$apidx" -gt 1 ] || iw phy "$phy" interface add "$ifname" type managed
|
2009-10-02 15:18:44 +00:00
|
|
|
;;
|
|
|
|
mesh)
|
|
|
|
config_get mesh_id "$vif" mesh_id
|
|
|
|
iw phy "$phy" interface add "$ifname" type mp mesh_id "$mesh_id"
|
|
|
|
;;
|
|
|
|
monitor)
|
|
|
|
iw phy "$phy" interface add "$ifname" type monitor
|
|
|
|
;;
|
|
|
|
sta)
|
2009-11-10 19:27:19 +00:00
|
|
|
local wdsflag
|
2010-01-20 02:26:05 +00:00
|
|
|
config_get_bool wds "$vif" wds 0
|
2009-11-29 13:56:41 +00:00
|
|
|
[ "$wds" -gt 0 ] && wdsflag="4addr on"
|
2009-11-10 19:27:19 +00:00
|
|
|
iw phy "$phy" interface add "$ifname" type managed $wdsflag
|
2009-11-11 16:59:36 +00:00
|
|
|
config_get_bool powersave "$vif" powersave 0
|
|
|
|
[ "$powersave" -gt 0 ] && powersave="on" || powersave="off"
|
2011-12-19 10:27:28 +00:00
|
|
|
iw "$ifname" set power_save "$powersave"
|
2007-10-05 17:56:15 +00:00
|
|
|
;;
|
|
|
|
esac
|
|
|
|
|
2009-10-02 15:18:44 +00:00
|
|
|
# All interfaces must have unique mac addresses
|
2009-11-28 18:00:53 +00:00
|
|
|
# which can either be explicitly set in the device
|
2009-10-02 15:18:44 +00:00
|
|
|
# section, or automatically generated
|
|
|
|
config_get macaddr "$device" macaddr
|
|
|
|
config_get vif_mac "$vif" macaddr
|
|
|
|
[ -n "$vif_mac" ] || {
|
2011-09-25 14:14:37 +00:00
|
|
|
vif_mac="$(mac80211_generate_mac $macidx $macaddr)"
|
2010-01-17 01:52:45 +00:00
|
|
|
macidx="$(($macidx + 1))"
|
2009-10-02 15:18:44 +00:00
|
|
|
}
|
2010-01-20 02:26:05 +00:00
|
|
|
[ "$mode" = "ap" ] || ifconfig "$ifname" hw ether "$vif_mac"
|
|
|
|
config_set "$vif" macaddr "$vif_mac"
|
2009-10-02 15:18:44 +00:00
|
|
|
|
|
|
|
# !! ap !!
|
|
|
|
#
|
|
|
|
# ALL ap functionality will be passed to hostapd
|
|
|
|
#
|
2010-02-19 01:07:21 +00:00
|
|
|
# !! station !!
|
2009-10-02 15:18:44 +00:00
|
|
|
#
|
2010-02-19 01:07:21 +00:00
|
|
|
# ALL station functionality will be passed to wpa_supplicant
|
2009-10-02 15:18:44 +00:00
|
|
|
#
|
|
|
|
if [ ! "$mode" = "ap" ]; then
|
2010-01-20 02:26:05 +00:00
|
|
|
# We attempt to set the channel for all interfaces, although
|
|
|
|
# mac80211 may not support it or the driver might not yet
|
|
|
|
# for ap mode this is handled by hostapd
|
|
|
|
[ -n "$fixed" -a -n "$channel" ] && iw dev "$ifname" set channel "$channel"
|
2009-10-02 15:18:44 +00:00
|
|
|
fi
|
|
|
|
|
2011-11-06 18:49:17 +00:00
|
|
|
i=$(($i + 1))
|
2007-10-05 17:56:15 +00:00
|
|
|
done
|
2010-01-20 02:26:05 +00:00
|
|
|
|
|
|
|
local start_hostapd=
|
|
|
|
rm -f /var/run/hostapd-$phy.conf
|
|
|
|
for vif in $vifs; do
|
|
|
|
config_get mode "$vif" mode
|
|
|
|
[ "$mode" = "ap" ] || continue
|
|
|
|
mac80211_hostapd_setup_bss "$phy" "$vif"
|
|
|
|
start_hostapd=1
|
|
|
|
done
|
|
|
|
|
2010-02-28 19:02:05 +00:00
|
|
|
[ -n "$start_hostapd" ] && {
|
|
|
|
hostapd -P /var/run/wifi-$phy.pid -B /var/run/hostapd-$phy.conf || {
|
|
|
|
echo "Failed to start hostapd for $phy"
|
|
|
|
return
|
|
|
|
}
|
|
|
|
sleep 2
|
2010-01-20 02:26:05 +00:00
|
|
|
|
2010-02-28 19:02:05 +00:00
|
|
|
for vif in $vifs; do
|
|
|
|
config_get mode "$vif" mode
|
|
|
|
config_get ifname "$vif" ifname
|
|
|
|
[ "$mode" = "ap" ] || continue
|
2010-10-23 23:39:54 +00:00
|
|
|
hostapd_ctrl="${hostapd_ctrl:-/var/run/hostapd-$phy/$ifname}"
|
2010-02-28 19:02:05 +00:00
|
|
|
mac80211_start_vif "$vif" "$ifname"
|
|
|
|
done
|
2010-01-20 02:26:05 +00:00
|
|
|
}
|
2010-02-28 17:06:53 +00:00
|
|
|
|
|
|
|
for vif in $vifs; do
|
|
|
|
config_get mode "$vif" mode
|
|
|
|
config_get ifname "$vif" ifname
|
2011-12-23 19:24:38 +00:00
|
|
|
[ "$mode" = "ap" ] || ifconfig "$ifname" up
|
2010-02-28 17:06:53 +00:00
|
|
|
|
2011-12-18 22:19:21 +00:00
|
|
|
config_get vif_txpower "$vif" txpower
|
|
|
|
# use vif_txpower (from wifi-iface) to override txpower (from
|
|
|
|
# wifi-device) if the latter doesn't exist
|
|
|
|
txpower="${txpower:-$vif_txpower}"
|
|
|
|
[ -z "$txpower" ] || iw dev "$ifname" set txpower fixed "${txpower%%.*}00"
|
|
|
|
|
2011-12-23 19:24:38 +00:00
|
|
|
case "$mode" in
|
|
|
|
adhoc)
|
|
|
|
config_get bssid "$vif" bssid
|
|
|
|
config_get ssid "$vif" ssid
|
|
|
|
config_get beacon_int "$device" beacon_int
|
|
|
|
config_get basic_rate_list "$device" basic_rate
|
|
|
|
config_get encryption "$vif" encryption
|
|
|
|
config_get key "$vif" key 1
|
|
|
|
config_get mcast_rate "$vif" mcast_rate
|
|
|
|
|
|
|
|
local keyspec=""
|
|
|
|
[ "$encryption" == "wep" ] && {
|
|
|
|
case "$key" in
|
|
|
|
[1234])
|
|
|
|
local idx
|
|
|
|
for idx in 1 2 3 4; do
|
|
|
|
local ikey
|
|
|
|
config_get ikey "$vif" "key$idx"
|
|
|
|
|
|
|
|
[ -n "$ikey" ] && {
|
|
|
|
ikey="$(($idx - 1)):$(prepare_key_wep "$ikey")"
|
|
|
|
[ $idx -eq $key ] && ikey="d:$ikey"
|
|
|
|
append keyspec "$ikey"
|
|
|
|
}
|
|
|
|
done
|
|
|
|
;;
|
|
|
|
*) append keyspec "d:0:$(prepare_key_wep "$key")" ;;
|
2011-06-24 19:53:31 +00:00
|
|
|
esac
|
2011-12-23 19:24:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
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=""
|
|
|
|
[ -n "$mcast_rate" ] && {
|
|
|
|
mcval="$(($mcast_rate / 1000))"
|
|
|
|
mcsub="$(( ($mcast_rate / 100) % 10 ))"
|
|
|
|
[ "$mcsub" -gt 0 ] && mcval="$mcval.$mcsub"
|
|
|
|
}
|
|
|
|
|
|
|
|
config_get htmode "$device" htmode
|
|
|
|
case "$htmode" in
|
|
|
|
HT20|HT40+|HT40-) ;;
|
|
|
|
*) htmode= ;;
|
|
|
|
esac
|
|
|
|
|
|
|
|
iw dev "$ifname" ibss join "$ssid" $freq $htmode \
|
|
|
|
${fixed:+fixed-freq} $bssid \
|
|
|
|
${beacon_int:+beacon-interval $beacon_int} \
|
|
|
|
${brstr:+basic-rates $brstr} \
|
|
|
|
${mcval:+mcast-rate $mcval} \
|
|
|
|
${keyspec:+keys $keyspec}
|
|
|
|
;;
|
|
|
|
sta)
|
|
|
|
if eval "type wpa_supplicant_setup_vif" 2>/dev/null >/dev/null; then
|
|
|
|
wpa_supplicant_setup_vif "$vif" nl80211 "${hostapd_ctrl:+-H $hostapd_ctrl}" || {
|
|
|
|
echo "enable_mac80211($device): Failed to set up wpa_supplicant for interface $ifname" >&2
|
|
|
|
# make sure this wifi interface won't accidentally stay open without encryption
|
|
|
|
ifconfig "$ifname" down
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
fi
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
[ "$mode" = "ap" ] || mac80211_start_vif "$vif" "$ifname"
|
2010-02-28 17:06:53 +00:00
|
|
|
done
|
|
|
|
|
2007-10-05 17:56:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2011-03-15 00:44:02 +00:00
|
|
|
check_mac80211_device() {
|
2009-10-02 15:18:44 +00:00
|
|
|
config_get phy "$1" phy
|
|
|
|
[ -z "$phy" ] && {
|
2009-12-22 21:45:08 +00:00
|
|
|
find_mac80211_phy "$1" >/dev/null || return 0
|
2009-10-02 15:18:44 +00:00
|
|
|
config_get phy "$1" phy
|
|
|
|
}
|
|
|
|
[ "$phy" = "$dev" ] && found=1
|
|
|
|
}
|
|
|
|
|
2007-10-05 17:56:15 +00:00
|
|
|
detect_mac80211() {
|
2009-10-02 15:18:44 +00:00
|
|
|
devidx=0
|
|
|
|
config_load wireless
|
2009-11-28 18:00:59 +00:00
|
|
|
while :; do
|
2009-12-03 18:35:31 +00:00
|
|
|
config_get type "radio$devidx" type
|
2009-11-28 18:00:59 +00:00
|
|
|
[ -n "$type" ] || break
|
|
|
|
devidx=$(($devidx + 1))
|
|
|
|
done
|
2009-10-02 15:18:44 +00:00
|
|
|
for dev in $(ls /sys/class/ieee80211); do
|
|
|
|
found=0
|
2011-03-15 00:44:02 +00:00
|
|
|
config_foreach check_mac80211_device wifi-device
|
2009-10-02 15:18:44 +00:00
|
|
|
[ "$found" -gt 0 ] && continue
|
|
|
|
|
2009-10-02 19:41:04 +00:00
|
|
|
mode_11n=""
|
|
|
|
mode_band="g"
|
2010-10-13 12:22:48 +00:00
|
|
|
channel="11"
|
2009-11-09 00:58:39 +00:00
|
|
|
ht_cap=0
|
2010-01-15 02:55:29 +00:00
|
|
|
for cap in $(iw phy "$dev" info | grep 'Capabilities:' | cut -d: -f2); do
|
2009-11-09 00:58:39 +00:00
|
|
|
ht_cap="$(($ht_cap | $cap))"
|
|
|
|
done
|
2009-11-04 21:53:49 +00:00
|
|
|
ht_capab="";
|
2009-11-09 00:58:39 +00:00
|
|
|
[ "$ht_cap" -gt 0 ] && {
|
2009-11-04 21:53:49 +00:00
|
|
|
mode_11n="n"
|
2010-01-20 02:26:05 +00:00
|
|
|
append ht_capab " option htmode HT20" "$N"
|
|
|
|
|
2009-11-04 21:53:49 +00:00
|
|
|
list=" list ht_capab"
|
2009-11-27 21:21:28 +00:00
|
|
|
[ "$(($ht_cap & 1))" -eq 1 ] && append ht_capab "$list LDPC" "$N"
|
2010-10-27 15:04:29 +00:00
|
|
|
[ "$(($ht_cap & 16))" -eq 16 ] && append ht_capab "$list GF" "$N"
|
2009-11-04 21:53:49 +00:00
|
|
|
[ "$(($ht_cap & 32))" -eq 32 ] && append ht_capab "$list SHORT-GI-20" "$N"
|
|
|
|
[ "$(($ht_cap & 64))" -eq 64 ] && append ht_capab "$list SHORT-GI-40" "$N"
|
2010-05-02 22:03:44 +00:00
|
|
|
[ "$(($ht_cap & 128))" -eq 128 ] && append ht_capab "$list TX-STBC" "$N"
|
|
|
|
[ "$(($ht_cap & 768))" -eq 256 ] && append ht_capab "$list RX-STBC1" "$N"
|
|
|
|
[ "$(($ht_cap & 768))" -eq 512 ] && append ht_capab "$list RX-STBC12" "$N"
|
|
|
|
[ "$(($ht_cap & 768))" -eq 768 ] && append ht_capab "$list RX-STBC123" "$N"
|
2009-11-04 21:53:49 +00:00
|
|
|
[ "$(($ht_cap & 4096))" -eq 4096 ] && append ht_capab "$list DSSS_CCK-40" "$N"
|
|
|
|
}
|
2009-11-28 13:49:14 +00:00
|
|
|
iw phy "$dev" info | grep -q '2412 MHz' || { mode_band="a"; channel="36"; }
|
2009-10-02 15:18:44 +00:00
|
|
|
|
2007-10-05 17:56:15 +00:00
|
|
|
cat <<EOF
|
2009-12-03 18:35:31 +00:00
|
|
|
config wifi-device radio$devidx
|
2007-10-05 17:56:15 +00:00
|
|
|
option type mac80211
|
2009-11-27 21:21:10 +00:00
|
|
|
option channel ${channel}
|
2009-10-02 15:18:44 +00:00
|
|
|
option macaddr $(cat /sys/class/ieee80211/${dev}/macaddress)
|
2009-10-02 19:41:04 +00:00
|
|
|
option hwmode 11${mode_11n}${mode_band}
|
2010-01-20 02:26:05 +00:00
|
|
|
$ht_capab
|
2007-10-05 17:56:15 +00:00
|
|
|
# REMOVE THIS LINE TO ENABLE WIFI:
|
|
|
|
option disabled 1
|
|
|
|
|
|
|
|
config wifi-iface
|
2009-12-03 18:35:31 +00:00
|
|
|
option device radio$devidx
|
2009-10-02 15:18:44 +00:00
|
|
|
option network lan
|
|
|
|
option mode ap
|
|
|
|
option ssid OpenWrt
|
2007-10-05 17:56:15 +00:00
|
|
|
option encryption none
|
2009-10-02 15:18:44 +00:00
|
|
|
|
2007-10-05 17:56:15 +00:00
|
|
|
EOF
|
2009-11-28 18:00:59 +00:00
|
|
|
devidx=$(($devidx + 1))
|
2007-10-05 17:56:15 +00:00
|
|
|
done
|
|
|
|
}
|
2009-10-02 15:18:44 +00:00
|
|
|
|