Linux無線驅動接口有兩種標準接口,wext(Wireless Extensions無線擴展接口)和nl80211接口。
wext的接口實現上,應用層採用ioctl方式訪問驅動,設置無線參數或者獲取無線參數,配置無線驅動進行聯網操作。無線驅動事件到應用層的傳遞採用的netlink socket技術,一種netlink route消息技術。這也是很多其他類型的驅動標準的實現方法。但在linux-2.6.25(記得不是很清楚了,懶得確定了)之後,wext API接口版本停止在V22就不再進行更新了。而替代其的是nl80211接口。
nl80211接口其實在linux-2.6.18併入wext和mac80211協議棧的時候已經提供,但當時的功能還不完整,而且應用層的軟件還是都使用WEXT接口,驅動基本不使用nl80211接口實現(除了基於mac80211協議棧的驅動)。 nl80211接口是由開發者Johannes Berg實現的,他也是cfg80211(無線協議棧配置接口,在無線驅動接口和mac80211之間的接口)和mac80211的維護者。無論是用戶層訪問驅動還是驅動事件通知應用層,nl80211接口都採用的netlink技術。
nl80211接口逐漸替代wext接口的原因主要是使用netlink技術在應用層和內核層數據交換上相比ioctl方式具有優勢,具體的比較見點擊打開鏈接(轉載的一篇文章,寫得非常清楚),而且很多其他之前使用ioctl的驅動也逐漸採用了netlink方式。再一個原因就是802.11協議的發展,隨着802.11n協議以及P2P,WPS無線規範的加入,協議的很多功能可以在應用層實現,增加了很多應用層與驅動層間的API接口和事件。WEXT接口不方便功能擴展的缺點,nl80211可以完全支持wext的所有功能,又可以在不修改內核的情況下增加命令字和事件。無線驅動接口從wext發展到nl80211也就順理成章。
1. linux kernel4.1 wext vs nl80211:
下面以realtek rtl8189es模塊在imx6ul上爲例 :
2. realtek wifi driver 配置:
ifeq ($(CONFIG_PLATFORM_IMX6UL), y)
EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN
#EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT
EXTRA_CFLAGS += -DRTW_ENABLE_WIFI_CONTROL_FUNC
EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE
EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211
EXTRA_CFLAGS += -DRTW_USE_CFG80211_STA_EVENT
#ARCH := arm
#CROSS_COMPILE := /home/share/CusEnv/FreeScale/arm-eabi-4.4.3/bin/arm-eabi-
#KSRC ?= /home/share/CusEnv/FreeScale/FS_kernel_env
MODULE_NAME := rtl8189ES
endif
3. make modules
4. insmod rtl8189es.ko
5.iw dev wlan0 scan | grep SSID
6. station mode:
station mode:
=======connect.sh===========
#/bin/sh
killall hostapd udhcpd wpa_supplicant udhcpc 2> /dev/null
wpa_supplicant -Dnl80211 -iwlan0 -cwpa_supplicant.conf -B
udhcpc -i wlan0
=======connect.sh end========
=======wpa_supplicant.conf====
ctrl_interface=/var/run/wpa_supplicant
ap_scan=1
network={
ssid="liuxd"
psk="12345678"
}
=======wpa_supplicant.conf end====