一,构建环境
硬件:Ralink USB无线网卡,
软件:Linux4.12.7,wpa_supplicant , dhcp
在Linux中执行lsusb查看无线网卡vendorId及productId 为 148f:3070
在 https://wikidevi.com/wiki/List_of_Wi-Fi_Device_IDs_in_Linux LinuxUSB无线适配器设备列表中能够找到,说明内核已经包含了改款无线网卡的驱动;
如下图:
(图一)
如果内核没有包含该款网卡驱动,则需要将厂商提供的无线网卡驱动移植到内核中,并添加及选中相应的配置项,让无线网卡驱动编译进内核中;
二,开始构建
下面介绍无线网卡驱动包含在内核中的情况;
- 1,编译内核
从www.kernel.org网站下载4.12.7版本内核,解压,执行make menuconfig针对特定硬件进行配置,或者直接用已经备份好的.config文件进行配置:
针对Ralink USB无线网卡进行配置,首先从上面的图一中可以看到该款网卡的驱动模块为rt2800usb,在源码中搜索该模块名称可以得到配置项为:RT2800USB
在make menuconfig中搜索RT2800USB 得到如下:
```
Symbol: RT2800USB [=n]
Type : tristate
Prompt: Ralink rt27xx/rt28xx/rt30xx (USB) support
Location:
-> Device Drivers
-> Network device support (NETDEVICES [=y])
-> Wireless LAN (WLAN [=y])
-> Ralink devices (WLAN_VENDOR_RALINK [=y])
(1) -> Ralink driver support (RT2X00 [=n])
Defined at drivers/net/wireless/ralink/rt2x00/Kconfig:137
Depends on: NETDEVICES [=y] && WLAN [=y] && WLAN_VENDOR_RALINK [=y] && RT2X00 [=n] && USB [=y]
```
根据搜索的结果将RT2800USB配置项依赖的所有配置选中(选择Y),编译进内核:
```
[*] Networking support --->
-*- Wireless --->
<*> cfg80211 - wireless configuration API----------------------------[CFG80211]
<*> Generic IEEE 802.11 Networking Stack (mac80211)------------------[MAC80211]
Device Drivers --->
[*] Network device support --->
[*] Wireless LAN --->
<*> Ralink driver support ---->
<*> Ralink rt27xx/rt28xx/rt30xx (USB) support -----------[RT2800USB]
```
配置完成后开始编译,make,编译完成后开始安装内核,从启PC或开发板,之后执行ifconfig -a查看网卡设备名称:
如下图:
![这里写图片描述](https://img-blog.csdn.net/20171012130130422?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYTM3MjA0ODUxOA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
说明内核驱动模块以及配置成功!
注意,如果只执行ifconfig,在网卡还没有开启的情况下,可能什么也看不到;
2,编译无线路由链接工具;
首先执行ifconfig wlan0 up && ifconfig wlan0 192.168.0.107 配置网卡;配置完成执行ping 192.168.0.1,如下图:
由于还没有链接路由器所以无法ping通;
下载wpa_supplicant源码包并阅读REAMDE及配置文件:
在 w1.fi 官网下载 进入wpa_supplicant 页面下载源码包:wpa_supplicant-2.6.tar.gz 最新版本为2.6版本;
tar xf wpa_supplicant-2.6.tar.gz
cd wpa_supplicant-2.6/wpa_supplicant
首先阅读README,打开源码wpa_supplicant-2.6/wpa_supplicant目录下的README文件,查看如下部分:
可以看到wpa_supplicant依赖nl80211内核驱动接口及OpenSSL,内核驱动模块已经编译进内核;
再打开defconfig文件可以看到如下内容:
综上分析,在编译wpa_supplicant之前还需要编译OpenSSL及libnl源码;首先确定这两个库,如果后面编译的时候再缺少别的库,原则就是缺少啥安装啥!
—————————————————————-OpenSSL———————————————————————–
编译OpenSSL:
在OpenSSL官网下载最新版本的源码包: openssl-1.1.0f.tar.gz 版本为1.1.0版本;
tar xf openssl-1.1.0f.tar.gz && cd openssl-1.1.0f/
打开INSTALL 阅读如下部分:
如果是arm平台则需要配置交叉编译工具,命令为:CC=arm-linux-gcc ./config –prefix=/opt/openssl –openssldir=/usr/local/ssl
注意:CC选项必须在前面,prefix选项可以根据需要更改:此处暂不该;
配置完成之后 make && make install
OpenSSL编译安装完成!
————————————————————-libnl——————————————————————————
编译libnl:
在libnl官网 下载源码包: libnl-3.2.25.tar.gz;可以从官网上面的git库 下载更新的版本;
tar xf libnl-3.2.25.tar.gz && cd libnl-3.2.25
这个源码目录没有README及INSTALL文件,可以通过执行./configure –help 查看需要配置的选项,如果是arm平台:需要配置–prefix 及 –host , CC选项;
配置命令为 : ./configure –prefix=$PWD/tmp –host=arm-linux CC=arm-none-linux-gnueabi-gcc
然后编译安装: make && make install
libnl 编译安装完成!
——————————————————————wpa_supplicant———————————————————–
接下来在回到wpa_supplicant源码目录:wpa_supplicant-2.6/wpa_supplicant
继续看wpa_supplicant-2.6/wpa_supplicant/README的如下内容:
编译之前需要创建.config文件 , 可以看到源码提供了默认的配置文件defconfig , 先将defconfig重命名为.config文件;
然后配置.config,修改如下几个部分:
OpenSSL库:
# Uncomment following two lines and fix the paths if you have installed OpenSSL
# or GnuTLS in non-default location
CFLAGS += -I/opt/openssl/include
LIBS += -L/opt/openssl/lib
libnl库:
# driver_nl80211.c requires libnl. If you are compiling it yourself# you may need to point hostapd to your version of libnl.#
CFLAGS += -I/opt/netlink/libnl-3.2.25/tmp/include/libnl3/
LIBS += -L/opt/netlink/libnl-3.2.25/tmp/lib/
libnl版本支持:
# Use libnl 3.2 libraries (ifthisis selected, CONFIG_LIBNL20 is ignored)
CONFIG_LIBNL32=y
如果是arm平台,添加如下交叉编译工具选项:
CC=arm-none-linux-gnueabi-gcc
开始编译,在编译过程中会出现如下警告和错误: