linux wifi WEXT和NL80211访问接口简介 及imx6ul+realtek rtl8189es 驱动调试

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====

 

你可能感兴趣的:(wifi,wlan)