矽昌--Wireless配置简述

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-devicestringradio0驱动设备名称
typestringmac80211驱动类型,目前固定为”mac80211”。
countrystringCN国家码,2个大写字母,默认为CN,表示中国(China),国家码会影响信道和发射功率。
channelstring/int-信道,默认2.4G为信道1,值为”auto”时表示自动选取最优信道,不同国家信道限制不同,如中国地区2.4G信道为1~13 ,5G信道为36~64 、149~165。
txpower_lvlint2发射功率,可设值为0、1、2。该值越大,表示功率越大。
max_all_num_staint64驱动所能连接设备个数的最大值
netisolateboolean0设备隔离,如果设置为1,则从该device下的设备无法访问同一网桥(bridge)中其它bssid的设备。
noscanboolean0值为1时,表示不扫描周围信道。
pathstring-对应驱动在/sys/devices/下的节点,一般不作修改。默认2.4G为”platform/11000000.wifi-lb”,5G为”platform/17800000.wifi-hb”。
htmodestring20MHz带宽模式,2.4G支持20MHz/40MHz,5G支持20MHz/40MHz/80MHz。
hwmodestring-wifi工作模式,2.4G支持11b/11g/11n,5G支持11n/11a/11ac,最终的模式是由htmode和hwmode共同决定的
disabledboolean00表示启用该驱动设备,1表示关闭该驱动设备。
ht_coexboolean/值为1时,表示带宽20MHZ/40MHZ共存,与htmode有一定联系
2.1.2 wifi-iface配置选项
选项值类型默认值描述
wifi-ifacestringdefault_radio0wifi-iface节点名称
devicestring-对应wifi-device驱动名称,默认2.4G为radio0,5G为radio1。
ifnamestringwlan0网卡(iface)的名称,使用ifconfig时会显示对应名称。
networkstringlan对应的网桥(bridge)名称,如果需要把wifi加入到lan口则配置该值为lan。
modestringap (sta、minotor)ap对应热点,sta对应站点(station),monitor对应监听模式。默认为ap模式。
ssidstringSiWIFi-****wifi的名称,最大不超过32位。支持中文,但在串口会显示为”…“。默认名称中的数字来源于mac地址。
encryptionstringnone加密方式,”none”表示不加密,如果想加密,建议改成”psk2+ccmp”
keystring12345678wifi密码,psk2需设置8位以上。当加密方式为不加密(none)时此选项不生效,而其他加密方式必须配置密码。
hiddenboolean0是否隐藏热点,1表示隐藏,0表示不隐藏。隐藏后设备只能通过手动添加SSID才能连接wifi。
wpa_group_rekeyint3600刷新GTK(广播/多播加密密钥)的时间间隔(以秒为单位)。若不设置此项,则使用CCMP / GCMP作为组密码时默认为86400秒(每天一次),使用TKIP作为组密码时默认为600秒(每10分钟一次)。
isolateboolean0连接此wifi的各设备之间是否隔离,1表示隔离,0表示不隔离。
groupint-bridge中的分组,各个不同的group之间在bridge中是不能互相访问的。默认2.4G为0,5G为1。
netisolateboolean0如果配置为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模式配置描述
11boption hwmode 11b该模式下option htmode必须删除
该模式下option ht_coex必须删除
11goption hwmode 11g该模式下option htmode必须删除
该模式下option ht_coex必须删除
11noption 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模式配置描述
11aoption hwmode 11a该模式下option htmode必须删除
该模式下option ht_coex必须删除
11noption hwmode 11a option htmode HT20 (或option htmode HT40) option ht_coex 1当ht_coex的值为1时,处于20MHz/40MHz混合模式;
当ht_coex的值为0时,htmode的值就是频宽
11acoption hwmode 11a option htmode VHT20 (或option htmode VHT40 或option htmode VHT80)该模式下option ht_coex必须删除
2.1.5 encryption加密方式
WPA版本密钥加密协议
psk2+tkip+ccmp psk2+tkip+aesWPA2 Personal (PSK)TKIP, CCMP
psk2+tkipWPA2 Personal (PSK)TKIP
psk2+ccmp psk2+aes psk2WPA2 Personal (PSK)CCMP
psk+tkip+ccmp psk+tkip+aesWPA Personal (PSK)TKIP, CCMP
psk+tkipWPA Personal (PSK)TKIP
psk+ccmp psk+aes pskWPA Personal (PSK)CCMP
psk-mixed+tkip+ccmp psk-mixed+tkip+aesWPA/WPA2 Personal (PSK) mixed modeTKIP, CCMP
psk-mixed+tkipWPA/WPA2 Personal (PSK) mixed modeTKIP
psk-mixed+ccmp psk-mixed+aes psk-mixedWPA/WPA2 Personal (PSK) mixed modeCCMP
wepWEP

3.固件烧录之后的wifi配置

3.1 如何修改wifi配置

​ 直接修改配置文件/etc/config/wireless保存后执行**wifi reload**即可

wifi指令执行脚本位于/sbin/wifi,相关使用方法见下表格所示

指令参数描述
wifi-不加任何参数,则重新启用”全部wifi”
wificonfig当”/etc/config/wireless”文件不存在时重新生成该文件
wifireload重新启用”配置有所更改的wifi”
wifidown关闭全部wifi
wifiup启用全部wifi
wifistatus以json串的方式打印wifi信息

3.2 查看wifi信息

使用”iw”指令可查看wifi相关信息,下面列出常见的iw指令。

指令参数描述示例
iwinfo/列出所有无线网络信息iwinfo
iw info列出单个wifi信息iw wlan0 info
iwlist列出所有无线设备信息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.koinsmod startcore)。需要注意的是,有些模块加载需要附加较多参数,建议使用sfwifi指令进行模块操作。
rmmod“模块名称” …卸载该模块
modinfo“模块名称” …显示该模块相关信息
sfwifiremove移除wifi驱动相关模块,包括sf16a18_rf.ko、startcore.ko、sf16a18_fmac.ko
sfwifireload重新加载wifi驱动模块
sfwifireset重新启动wifi驱动相关模块
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值