Wireless配置简述
1 编译
1.1 首次编译
如果是第一次编译时就需要添加wifi模块,请检查所需编译版型的配置,配置位于openwrt-18.06/target/linux/siflower/
文件夹下,例如sf19a28_ac28_fullmask_def.config为ac28版型的配置。 查看配置并作对应修改:(所有矽昌支持的版型的配置文件均在此路径下)
CONFIG_PACKAGE_dnsmasq=y
CONFIG_PACKAGE_wireless-regdb=y
CONFIG_PACKAGE_kmod-cfg80211=y
CONFIG_PACKAGE_kmod-mac80211=y
CONFIG_PACKAGE_MAC80211_DEBUGFS=y
CONFIG_PACKAGE_MAC80211_MESH=y
CONFIG_PACKAGE_kmod-sf_smac=y
CONFIG_PACKAGE_SFSMAC_DBGINFO_ALLOCS=y
CONFIG_PACKAGE_SFUMAC_WIFI_TEST_SCRIPTS=y
CONFIG_PACKAGE_SFUMAC_WIFI_ATE_TOOLS=y
CONFIG_PACKAGE_SFUMAC_FMAC=y
CONFIG_PACKAGE_libiwinfo=y
CONFIG_PACKAGE_hostapd-common=y
CONFIG_PACKAGE_iw=y
CONFIG_WPA_MSG_MIN_PRIORITY=3
CONFIG_DRIVER_11N_SUPPORT=y
CONFIG_DRIVER_11AC_SUPPORT=y
CONFIG_PACKAGE_wpad-mini=y
CONFIG_PACKAGE_iwinfo=y
修改完成后,若编译ac28镜像,则在openwrt-18.06目录下使用./make.sh ac28
即可编译,编译完成后在当前目录即可得到镜像。
1.2 非首次编译
如果不是第一次编译,那么可以使用make menuconfig
然后选中以下内容:(默认已经配置好,可以直接make -j V=s
)
Kernel modules ---> Wireless Drivers--->kmod-sf_smac
Network--->hostapd-common
Utilities--->iwinfo
Base system--->dnsmasq
修改完成之后保存,在openwrt-18.06目录下使用make -j V=s
即可编译,镜像位于bin/siflower/openwrt-siflower-sf16a18-mpw0-squashfs-sysupgrade.bin
。
2 wifi配置
1806 sdk 中的 wifi 配置沿用了 openwrt 原始的 wifi 配置,
可以参考 openwrt-wifi配置。
配置文件在镜像中的位置为/etc/config/wireless,典型的配置如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rTxXba7R-1671777490458)(https://developers.siflower.cn/document/picture_download?pictureId=5c6d004e5466e40001704766)]
配置分为两层,wifi-device对应到具体的wifi驱动设备,在我们的硬件中支持2.4G和5G两种device,
wifi-iface对应了单个wifi接口,与单个ssid相对应,
一个wifi-device下面可以配置多个wifi-iface,最多支持4个。
2.1 配置选项说明
2.1.1 wifi-device配置选项
注:默认值为”/”时表示该选项不一定会出现,只有在进行了某些设置的情况下才会出现;默认值为”-“时表示2.4G和5G有差异,将在描述里进行说明。
选项 | 值类型 | 默认值 | 描述 |
---|---|---|---|
wifi-device | string | radio0 | 驱动设备名称 |
type | string | mac80211 | 驱动类型,目前固定为”mac80211”。 |
country | string | CN | 国家码,2个大写字母,默认为CN,表示中国(China),国家码会影响信道和发射功率。 |
channel | string/int | - | 信道,默认2.4G为信道1,值为”auto”时表示自动选取最优信道,不同国家信道限制不同,如中国地区2.4G信道为1~13 ,5G信道为36~64 、149~165。 |
txpower_lvl | int | 2 | 发射功率,可设值为0、1、2。该值越大,表示功率越大。 |
max_all_num_sta | int | 64 | 驱动所能连接设备个数的最大值 |
netisolate | boolean | 0 | 设备隔离,如果设置为1,则从该device下的设备无法访问同一网桥(bridge)中其它bssid的设备。 |
noscan | boolean | 0 | 值为1时,表示不扫描周围信道。 |
path | string | - | 对应驱动在/sys/devices/下的节点,一般不作修改。默认2.4G为”platform/11000000.wifi-lb”,5G为”platform/17800000.wifi-hb”。 |
htmode | string | 20MHz | 带宽模式,2.4G支持20MHz/40MHz,5G支持20MHz/40MHz/80MHz。 |
hwmode | string | - | wifi工作模式,2.4G支持11b/11g/11n,5G支持11n/11a/11ac,最终的模式是由htmode和hwmode共同决定的 |
disabled | boolean | 0 | 0表示启用该驱动设备,1表示关闭该驱动设备。 |
ht_coex | boolean | / | 值为1时,表示带宽20MHZ/40MHZ共存,与htmode有一定联系 |
2.1.2 wifi-iface配置选项
选项 | 值类型 | 默认值 | 描述 |
---|---|---|---|
wifi-iface | string | default_radio0 | wifi-iface节点名称 |
device | string | - | 对应wifi-device驱动名称,默认2.4G为radio0,5G为radio1。 |
ifname | string | wlan0 | 网卡(iface)的名称,使用ifconfig时会显示对应名称。 |
network | string | lan | 对应的网桥(bridge)名称,如果需要把wifi加入到lan口则配置该值为lan。 |
mode | string | ap (sta、minotor) | ap对应热点,sta对应站点(station),monitor对应监听模式。默认为ap模式。 |
ssid | string | SiWIFi-**** | wifi的名称,最大不超过32位。支持中文,但在串口会显示为”…“。默认名称中的数字来源于mac地址。 |
encryption | string | none | 加密方式,”none”表示不加密,如果想加密,建议改成”psk2+ccmp” |
key | string | 12345678 | wifi密码,psk2需设置8位以上。当加密方式为不加密(none)时此选项不生效,而其他加密方式必须配置密码。 |
hidden | boolean | 0 | 是否隐藏热点,1表示隐藏,0表示不隐藏。隐藏后设备只能通过手动添加SSID才能连接wifi。 |
wpa_group_rekey | int | 3600 | 刷新GTK(广播/多播加密密钥)的时间间隔(以秒为单位)。若不设置此项,则使用CCMP / GCMP作为组密码时默认为86400秒(每天一次),使用TKIP作为组密码时默认为600秒(每10分钟一次)。 |
isolate | boolean | 0 | 连接此wifi的各设备之间是否隔离,1表示隔离,0表示不隔离。 |
group | int | - | bridge中的分组,各个不同的group之间在bridge中是不能互相访问的。默认2.4G为0,5G为1。 |
netisolate | boolean | 0 | 如果配置为1,则从该bssid下的设备无法访问同一bridge中其它bssid的设备。 |
2.1.3 源码中如何修改wifi的默认配置
修改package/kernel/mac80211/files/lib/wifi/mac80211.sh文件即可。
#!/bin/sh
append DRIVERS "mac80211"
lookup_phy() {
[ -n "$phy" ] && {
[ -d /sys/class/ieee80211/$phy ] && return
}
local devpath
config_get devpath "$device" path
[ -n "$devpath" ] && {
for phy in $(ls /sys/class/ieee80211 2>/dev/null); do
case "$(readlink -f /sys/class/ieee80211/$phy/device)" in
*$devpath) return;;
esac
done
}
local macaddr="$(config_get "$device" macaddr | tr 'A-Z' 'a-z')"
[ -n "$macaddr" ] && {
for _phy in /sys/class/ieee80211/*; do
[ -e "$_phy" ] || continue
[ "$macaddr" = "$(cat ${_phy}/macaddress)" ] || continue
phy="${_phy##*/}"
return
done
}
phy=
return
}
find_mac80211_phy() {
local device="$1"
config_get phy "$device" phy
lookup_phy
[ -n "$phy" -a -d "/sys/class/ieee80211/$phy" ] || {
echo "PHY for wifi device $1 not found"
return 1
}
config_set "$device" phy "$phy"
config_get macaddr "$device" macaddr
[ -z "$macaddr" ] && {
config_set "$device" macaddr "$(cat /sys/class/ieee80211/${phy}/macaddress)"
}
return 0
}
check_mac80211_device() {
config_get phy "$1" phy
[ -z "$phy" ] && {
find_mac80211_phy "$1" >/dev/null || return 0
config_get phy "$1" phy
}
[ "$phy" = "$dev" ] && found=1
}
detect_mac80211() {
devidx=0
config_load wireless
while :; do
config_get type "radio$devidx" type
[ -n "$type" ] || break
devidx=$(($devidx + 1))
done
for _dev in /sys/class/ieee80211/*; do
[ -e "$_dev" ] || continue
dev="${_dev##*/}"
found=0
config_foreach check_mac80211_device wifi-device
[ "$found" -gt 0 ] && continue
mode_band="g"
channel="1"
htmode=""
ht_capab=""
ssidprefix="-2.4G"
noscan="0"
band="2.4G"
htcodex="0"
txpower="20"
iw phy "$dev" info | grep -q 'Capabilities:' && htmode=HT20
iw phy "$dev" info | grep -q '5180 MHz' && {
mode_band="a"
channel="161"
ssidprefix=""
band="5G"
txpower="25"
iw phy "$dev" info | grep -q 'VHT Capabilities' && htmode="VHT80"
}
[ -n "$htmode" ] && ht_capab="set wireless.radio${devidx}.htmode=$htmode"
if [ -x /usr/bin/readlink -a -h /sys/class/ieee80211/${dev} ]; then
path="$(readlink -f /sys/class/ieee80211/${dev}/device)"
else
path=""
fi
if [ -n "$path" ]; then
path="${path##/sys/devices/}"
case "$path" in
platform*/pci*) path="${path##platform/}";;
esac
dev_id="set wireless.radio${devidx}.path='$path'"
else
dev_id="set wireless.radio${devidx}.macaddr=$(cat /sys/class/ieee80211/${dev}/macaddress)"
fi
[ -f "/sys/devices/factory-read/countryid" ] && {
country=`cat /sys/devices/factory-read/countryid`
}
ssid=SiWiFi-`cat /sys/class/ieee80211/${dev}/macaddress | cut -c 13- | sed 's/://g'`$ssidprefix
ssid_lease=SiWiFi-租赁-$ssidprefix`cat /sys/class/ieee80211/${dev}/macaddress | cut -c 13- | sed 's/://g'`
if [ ! -n "$country" ]; then
country='CN'
fi
txpower_lvl=2
[ -f "/etc/ext_pa_exist" ] && {
txpower_lvl=1
}
uci -q batch <<-EOF
set wireless.radio${devidx}=wifi-device
set wireless.radio${devidx}.type=mac80211
set wireless.radio${devidx}.country=${country}
set wireless.radio${devidx}.txpower_lvl=${txpower_lvl}
set wireless.radio${devidx}.txpower=${txpower}
set wireless.radio${devidx}.channel=${channel}
set wireless.radio${devidx}.band=${band}
set wireless.radio${devidx}.hwmode=11${mode_band}
set wireless.radio${devidx}.noscan=${noscan}
set wireless.radio${devidx}.netisolate=0
set wireless.radio${devidx}.max_all_num_sta=64
set wireless.radio${devidx}.ht_coex=${ht_coex}
${dev_id}
${ht_capab}
set wireless.radio${devidx}.disabled=0
set wireless.default_radio${devidx}=wifi-iface
set wireless.default_radio${devidx}.device=radio${devidx}
set wireless.default_radio${devidx}.network=lan
set wireless.default_radio${devidx}.mode=ap
set wireless.default_radio${devidx}.ssid=${ssid}
set wireless.default_radio${devidx}.encryption=none
set wireless.default_radio${devidx}.key=12345678
set wireless.default_radio${devidx}.hidden=0
set wireless.default_radio${devidx}.ifname=wlan${devidx}
set wireless.default_radio${devidx}.wpa_group_rekey=36000
set wireless.default_radio${devidx}.isolate=0
set wireless.default_radio${devidx}.group=1
set wireless.default_radio${devidx}.disable_input=0
set wireless.default_radio${devidx}.wps_pushbutton=1
set wireless.default_radio${devidx}.wps_label=0
set wireless.guest_radio${devidx}=wifi-iface
set wireless.guest_radio${devidx}.device=radio${devidx}
set wireless.guest_radio${devidx}.network=guest
set wireless.guest_radio${devidx}.mode=ap
set wireless.guest_radio${devidx}.ssid=${ssid}-guest
set wireless.guest_radio${devidx}.encryption=none
set wireless.guest_radio${devidx}.hidden=0
set wireless.guest_radio${devidx}.ifname=wlan${devidx}-guest
set wireless.guest_radio${devidx}.isolate=1
set wireless.guest_radio${devidx}.group=1
set wireless.guest_radio${devidx}.netisolate=0
set wireless.guest_radio${devidx}.disable_input=0
set wireless.guest_radio${devidx}.disabled=1
EOF
uci -q commit wireless
if [ "$devidx" == "0" ]; then
uci -q batch <<-EOF
set wireless.lease_radio${devidx}=wifi-iface
set wireless.lease_radio${devidx}.device=radio${devidx}
set wireless.lease_radio${devidx}.network=lease
set wireless.lease_radio${devidx}.mode=ap
set wireless.lease_radio${devidx}.ssid=${ssid_lease}
set wireless.lease_radio${devidx}.encryption=none
set wireless.lease_radio${devidx}.hidden=0
set wireless.lease_radio${devidx}.ifname=wlan${devidx}-lease
set wireless.lease_radio${devidx}.isolate=1
set wireless.lease_radio${devidx}.group=1
set wireless.lease_radio${devidx}.netisolate=0
set wireless.lease_radio${devidx}.disable_input=0
set wireless.lease_radio${devidx}.maxassoc=64
set wireless.lease_radio${devidx}.disabled=1
EOF
uci -q commit wireless
fi
devidx=$(($devidx + 1))
done
}
2.1.4 htmode与hwmode的对应关系
不同的hwmode决定了htmode可以配置的选项,下表列举了不同模式的对应关系。
2.1.4.1 2.4G配置
2.4G模式 | 配置 | 描述 |
---|---|---|
11b | option hwmode 11b | 该模式下option htmode必须删除 该模式下option ht_coex必须删除 |
11g | option hwmode 11g | 该模式下option htmode必须删除 该模式下option ht_coex必须删除 |
11n | option hwmode 11g option htmode HT20 (或option htmode HT40) option ht_coex 1 | 当ht_coex的值为1时,处于20MHz/40MHz混合模式; 当ht_coex的值为0时,htmode的值就是频宽 |
2.1.4.2 5G配置
5G模式 | 配置 | 描述 |
---|---|---|
11a | option hwmode 11a | 该模式下option htmode必须删除 该模式下option ht_coex必须删除 |
11n | option hwmode 11a option htmode HT20 (或option htmode HT40) option ht_coex 1 | 当ht_coex的值为1时,处于20MHz/40MHz混合模式; 当ht_coex的值为0时,htmode的值就是频宽 |
11ac | option hwmode 11a option htmode VHT20 (或option htmode VHT40 或option htmode VHT80) | 该模式下option ht_coex必须删除 |
2.1.5 encryption加密方式
值 | WPA版本 | 密钥加密协议 |
---|---|---|
psk2+tkip+ccmp psk2+tkip+aes | WPA2 Personal (PSK) | TKIP, CCMP |
psk2+tkip | WPA2 Personal (PSK) | TKIP |
psk2+ccmp psk2+aes psk2 | WPA2 Personal (PSK) | CCMP |
psk+tkip+ccmp psk+tkip+aes | WPA Personal (PSK) | TKIP, CCMP |
psk+tkip | WPA Personal (PSK) | TKIP |
psk+ccmp psk+aes psk | WPA Personal (PSK) | CCMP |
psk-mixed+tkip+ccmp psk-mixed+tkip+aes | WPA/WPA2 Personal (PSK) mixed mode | TKIP, CCMP |
psk-mixed+tkip | WPA/WPA2 Personal (PSK) mixed mode | TKIP |
psk-mixed+ccmp psk-mixed+aes psk-mixed | WPA/WPA2 Personal (PSK) mixed mode | CCMP |
wep | WEP | 无 |
3.固件烧录之后的wifi配置
3.1 如何修改wifi配置
直接修改配置文件/etc/config/wireless保存后执行**wifi reload
**即可
wifi
指令执行脚本位于/sbin/wifi
,相关使用方法见下表格所示
指令 | 参数 | 描述 |
---|---|---|
wifi | - | 不加任何参数,则重新启用”全部wifi” |
wifi | config | 当”/etc/config/wireless”文件不存在时重新生成该文件 |
wifi | reload | 重新启用”配置有所更改的wifi” |
wifi | down | 关闭全部wifi |
wifi | up | 启用全部wifi |
wifi | status | 以json串的方式打印wifi信息 |
3.2 查看wifi信息
使用”iw”指令可查看wifi相关信息,下面列出常见的iw指令。
指令 | 参数 | 描述 | 示例 |
---|---|---|---|
iwinfo | / | 列出所有无线网络信息 | iwinfo |
iw | info | 列出单个wifi信息 | iw wlan0 info |
iw | list | 列出所有无线设备信息 | iw list |
iw | scan | 扫描周围信号 | iw wlan1 scan |
iw | station dump | 列出连接该wifi的所有设备信息 | iw wlan0 station sump |
3.3 新增AP节点
在/etc/config/wireless中增加一段即可,最简单的一种配置如下:
config wifi-iface
option device 'radio0'
option network 'lan'
option mode 'ap'
option ssid 'SiWiFi-new-ap'
option encryption 'psk2+ccmp'
option key '12345678'
option ifname 'wlan0-1'
3.4 新增sta节点
在/etc/config/wireless中增加一段即可,实例如下:
config wifi-iface
option key '12345678'
option ifname 'sfi0'
option network 'wwan'
option encryption 'psk2+ccmp'
option device 'radio0'
option mode 'sta'
option bssid 'A8:5A:F3:00:02:3F'
option ssid 'SiWiFi-023c-2.4G-8_1'
4.wifi配置生效流程
4.1 如何修改默认配置?
在板子上生成默认配置的脚本为lib/wifi/mac80211.sh,其在源码中位于package/kernel/mac80211/files/lib/wifi/mac80211.sh,此脚本用于生成/etc/config/wirelesss
4.2 默认配置生成后被应用到哪里?
/etc/config/wirelesss会被netifd和hostapd使用。
对于netifd,将直接读取wireless的配置;
对于hostapd,会由脚本/lib/netifd/wireless/mac80211.sh读取配置,生成配置文件/var/run/hostapd-phy.conf以供hostapd使用,该脚本在源码中位于package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh*。
4.3 wifi配置流程图
5 wifi驱动模块
wifi模块存放在板子上的目录为/lib/modules/4.14.90/
,在板子启动过程中这些模块会依序自动加载
5.1 wifi驱动相关模块加载流程
5.2 wifi驱动模块的相关指令
指令 | 参数 | 描述 |
---|---|---|
insmod | “模块名称” … | 加载该模块,简单指令如insmod /lib/modules/4.14.90/startcore.ko (或insmod startcore.ko 或insmod startcore )。需要注意的是,有些模块加载需要附加较多参数,建议使用sfwifi指令进行模块操作。 |
rmmod | “模块名称” … | 卸载该模块 |
modinfo | “模块名称” … | 显示该模块相关信息 |
sfwifi | remove | 移除wifi驱动相关模块,包括sf16a18_rf.ko、startcore.ko、sf16a18_fmac.ko |
sfwifi | reload | 重新加载wifi驱动模块 |
sfwifi | reset | 重新启动wifi驱动相关模块 |