linux下移植wifi之概念介绍(一)

南笙酒味 提交于 2019-11-29 10:14:57

详细介绍linux下移植wifi的步骤.docx

Linux系统下移植wifi模块,使其正常工作。包括两部分内容,第一部分是识别无线设备,并且正确安装驱动程序。第二部分是选择管理无线连接的方法。本文将介绍这两部分内容。

 

一、   背景
配置wifi有三种方式:图形客户端,文本模式接口和命令行界面。最简单的方法是在安装桌面环境后使用图形客户端。它们提供了一个方便的点击式界面,可以在几秒钟内让用户进入网络。也可以通过编辑一些配置文件从命令行配置无线,这需要花费更多的时间来设置。

 

有三种工具支持命令行驱动的无线配置:net-wireless / iw,net-wireless / wireless-tools和net-wireless /wpa_supplicant。在这三个中,net-wireless / wpa_supplicant是首选的。需要记住的重要一点是,无线网络是在全局基础上配置的,而不是基于接口的。

 

net-wireless/iw是net-wireless/wireless-tools延伸的产品(继承者),它支持几乎所有卡和驱动,但它不能连接到WPA-only接入点。如果网络只提供WEP加密或完全开放,那么net-wireless/iw轻轻松松胜过其他软件。

 

市场上现在经常使用 iw 和 wpa_supplicant两种软件。wifi 是 完全开放 或者 WEP 模式的时候,使用iw。如果wifi 需要WPA加密的话,则使用wpa_supplicant软件。

 

 

二、   概念介绍
1.      Card introduction
 

市场上现在有两种类型的无线卡,FullMac和SoftMac。下图是这两种卡同用户空间交互数据时,调用的说明图。即不同部分cfg80211 / mac80211 / nl80211如何协同工作的图片。

FullMac

此类无线卡通过硬件处理的MLME(MAC子层管理实体),通常出于省电的原因(例如智能手机,平板电脑,SBC和物联网)。除了少数例外,这些卡都不支持监控模式和注入。

SoftMac

SoftMac无线卡使用mac80211在软件中处理MLME。其中大多数都支持捕获和注入(少数例外)。

 

小知识点:

>>>>>>>>>>>begin<<<<<<<<<<<<

Wifi设备的协议栈如下框图: 

SoftMAC和FullMAC的区别在于MLME是在软件还是硬件上实现,蓝色部分表示WiFi芯片上执行 

SoftMAC: 无线网络MAC层通过软件实现. 
FullMAC: 无线网络MAC层通过硬件实现,也叫HardMAC.

SoftMAC优势: 
1. 低硬件成本 
2. 升级驱动可以直接通过更新软件实现 
3. 不同无线网络设备可以分享同一个驱动 
4. 对设备有更精细的控制

FullMAC的主要优势是执行快,不占用cpu

SoftMAC通过mac80211框架实现,FullMAC通过cfg80211框架实现 
不管SoftMAC还是FullMAC,都要调用cfg80211,mac80211通过cfg80211的callback来执行

>>>>>>>>>>>>>end<<<<<<<<<<<<<<

2.   cfg80211
cfg80211是Linux802.11配置API。cfg80211取代了Wireless-Extensions。nl80211用于配置cfg80211设备,用于内核←→用户空间通信。cfg80211现在功能齐全,具有无线扩展功能,在实施cfg80211驱动程序时,仍然会通过cfg80211到CONFIG_CFG80211_WEXT自动为您提供无线扩展支持。不再需要无线扩展的发行版可以删除它,并鼓励这样做。

3.      mac80211
mac80211是一个驱动程序,开发人员可以用来为SoftMAC无线设备编写驱动程序的框架。

SoftMAC设备允许更精细地控制硬件,允许在软件中完成802.11帧管理,用于解析和生成802.11无线帧。目前大多数802.11设备都属于这种类型

mac80211实现了SoftMAC设备的cfg80211回调,然后mac80211依赖于cfg80211来注册网络子系统和配置。配置由cfg80211通过nl80211和无线扩展来处理。

在mac80211中,MLME在用于站模式(STA)的内核中以及在用于AP模式的用户空间(hostapd)中完成。

如果您有支持nl80211的新用户空间实用程序,则不需要无线扩展来支持mac80211设备。

 

支持的功能:
IEEE 802.11abgn

IEEE 802.11d

Integration of work for the emerging 802.11sstandard

使用wpa_supplicant进行漫游(802.11r也是如此)。

不同类型的接口,详见支持的无线模式。

供应商特定费率支持

QoS

all mac80211 drivers get monitor modesupport

 

4.      nl80211
nl80211 is the new 802.11 netlink interfacepublic header. Together with cfg80211 it is intended to replace Wireless-Extensions. nl80211and cfg80211 are still under development.

 
nl80211的当前用户:
iw

crda

hostapd

wpa_supplicant (with -Dnl80211)

testmode(CONFIG_NL80211_TESTMODE =y)
nl80211 testmode命令有助于实现工厂校准或无线芯片验证工具等。

该功能可能用于SAR测试(比吸收率),MPE测试(最大允许曝光),RF测试(射频),如FCC等机构可能要求的。

5.      加密方式
无线网络的安全性由认证和加密来保证。

认证允许只有被许可的用户才能连接到无线网络;

加密的目的是提供数据的保密性和完整性(数据在传输过程中不会被篡改)。

 

关于wifi的加密/认证,以手机为例主要有四种模式:

(1)OPEN模式

(2)WEP模式

(3)WPA(TKIP)

(4)WPA2(AES)

 

阶段划分

 

初级版本:认证不需要密码, 传输不需要加密

 

         认证不需要密码, 传输需要加密(用WEP算法)

 

         认证需要密码(用WEP算法), 传输需要加密(用WEP算法,容易破解)

 

过渡版本:WPA  认证方式(802.1x),加密方式(TKIP,WEP)

 

                认证方式(PSK),加密方式(TKIP,WEP)

 

终极版本: WPA2  认证方式(802.1x),加密方式CCMP(AES-CCMP),TKIP,WEP

 

                 认证方式(PSK),加密方式CCMP(AES-CCMP),TKIP,WEP

 

802.1x:手机连接到AP后,它的认证过程不是在AP上进行的,而是发送到一个服务器,由服务器进行认证,在大型公司里面,用一个服务器统一进行认证这样比较好,但对于家庭网络,这样做认证成本太高,因而用PSK替代

 

PSK;手机只需要连接AP,AP会提示手机输入密码,AP上事先设置密码,如果手机提供的密码和事先设置的密码一样,那么手机就可以使用无线网络。

 

 

 

三、   正确安装驱动程序
安装驱动程序这项任务,又包括两部分内容。第一部分是驱动程序源码,第二部分是依赖。

1.      驱动程序源码
默认的Arch Linux内核是模块化的,这意味着许多机器硬件的驱动程序位于硬盘驱动器上,可以作为模块使用。在启动时,udev获取硬件的清单,并为相应的硬件加载适当的模块(驱动程序),从而允许创建网络接口。

除了相应的驱动程序之外,一些无线芯片组还需要固件。许多固件映像由默认安装的linux-firmware软件包提供,但是,不包含专有固件映像,必须单独安装。

注意:如果udev在启动时未加载正确的模块,只需手动加载即可。如果udev为设备加载多个驱动程序,则产生的冲突可能会阻止成功配置。确保将不需要的模块列入黑名单。

 

上面的内容说的通俗点就是:

设备驱动程序是模块化的,内核启动的时候,加载了驱动程序的模块,就会识别这个无线模块。有些无线芯片,除了要有驱动程序,还需要固件。许多固件映像由默认安装的linux-firmware软件包提供,但是,有些专有固件映像,必须单独安装(在网上下载固件,放在根文件系统下,加载驱动模块后,发命令指定固件位置)。

无线网卡的源码驱动程序可由以下三种方式获得。

 

1.    内核程序里,自带的驱动程序源码。

我现在使用的无线wifi网卡是雷凌的RT3070,这款芯片的驱动在内核里有,不需要专门下载。

 

项目思路:

根据无线芯片的VID, PID在内核drivers/net/wireless/中搜索该芯片的驱动的配置参数,比如CONFIG_RTL8192CU,CONFIG_ATH9K_HTC等等。配置.config 使CONFIG_RTL8192CU=m,或者CONFIG_ATH9K_HTC=m。

如下图内核里有需要的芯片驱动,直接配置成模块就行。

2.    官方网站或者wiki网站去寻找。

https://en.wikipedia.org/wiki/Comparison_of_open-source_wireless_drivers

https://wireless.wiki.kernel.org/en/users/drivers

https://www.mediatek.com/products/connectivity-and-networking/broadband-wifi

https://www.mediatek.com/products/connectivity-and-networking/legacy-products

这些网站是国外的网站,这里面的驱动源码程序是比较全面的,可以在这里面查找与下载。

 

3.    找代理商要驱动源码程序。

我之前用的无线wifi网卡芯片是博通的bcm8335,驱动程序就是代理商提供的。

供应商驱动程序有自己的堆栈,通常称为STA驱动程序。它们通常仅限于托管模式(客户端),有时还限制基础设施(有限的接入点功能)以共享Internet连接(网络共享)。它们可以是开源的或闭源的(或两者兼而有之)。

编译时的注意点:

您将需要以下内容来编译驱动程序:

与当前运行的内核匹配的Linux内核头文件。在openSUSE上,还必须安装内核源代码。根据驱动程序和发行版,您还必须安装完整的内核源代码。

用于编译内核的相同gcc版本。至少要确保前两个版本号或编译器是相同的(例如,如果内核是由gcc 3.4 .2 编译的话,可以使用gcc 3.4 .6编译驱动程序)。忽略此规则将导致模块加载期间出现无效的模块格式错误。可以通过/ proc/ version检查。

 

 

2.   依赖
由上面讲的可知,无线卡工作,要有cfg80211 , mac80211 ,nl80211的支持,所以配置内核的时候,要选择上这几个选项。

如下图:

 

 

 

 

 

======================================================================================================================================加载驱动之后,可能驱动没有正常工作,可以从下面查找一下,解决办法。
硬件验证
第一个关键步骤是确保您的系统识别您的无线设备。有多种方法可以验证您的系统是否成功完成了此操作。以下是一些方法:

§  “dmesg”命令通常可以包含指示正确检测到无线设备的详细消息。

§  如果卡是PCI卡(miniPCI/ miniPCI Express / PCI Express),则需要使用命令“lspci”来显示卡识别字符串。

§  如果硬件是USB加密狗,则需要使用命令“lsusb”来显示加密狗标识字符串。在某些情况下,“lsusb”不起作用(例如,如果未安装usbfs),您可以使用“dmesg”(或在/ var /log / messages中)从内核日志中获取标识字符串。

 

modprobe
首先运行“modprobe<kernel module name>”。

查看dmesg输出
运行“dmesg”命令并​​查找与您的无线设备相关的错误。至少应该有一些与您的设备加载和模块初始化有关的消息。如果没有消息或错误,您将不得不调查并纠正问题。

两个常见问题是:

*“未知符号”。*缺少固件

缺少固件
某些无线卡需要固件才能工作。

这个消息在dmesg中非常清楚,它会告诉你缺少什么文件名以及它在哪里。在某些情况下,驱动程序可以退回并尝试以前版本的固件。

可以手动添加文件来解决问题,但大多数情况下,固件可以在软件包中找到(例如firmware-linux或firmware-linux-nonfree)。

“未知符号”错误
加载驱动程序内核模块时,您会收到另一个字段名称的“未知符号”错误消息。有时您也会在dmesg输出中看到这一点。这是由于您加载的模块与您正在运行的内核版本不匹配而导致的。

查看lsmod输出
运行“lsmod”命令可以用来查看加载的模块。确认实际加载了无线设备的内核模块。如果未加载,则必须调查并更正问题。

有时其他模块与您尝试运行的模块冲突。请参阅下面的黑名单。此外,冲突的模块可以移出模块树。如果这样做,请在之后运行“depmod-ae”。

查看modinfo输出
运行“modinfo<kernel module name>”。这将确认模块实际上在模块树中。同样,确认它是正确的版本。执行“每个modinfo>的ls -l<​​文件位置”并在编译时确认日期匹配。

 

 

 

四、   管理无线连接的方法
1.      iw
iw是一款基于nl80211的新型无线设备CLI配置实用程序。它支持最近添加到内核的所有新驱动程序。使用WirelessExtensions接口的旧工具iwconfig已弃用,强烈建议切换到iw和nl80211。iw依赖libnl库。

iw的功能是配置无线网络。例如,扫描没有密码或者wep加密的wifi热点,然后连接,并且可以修改当前STA的功率,传输比特率等等。

 

建立要求
§  libnl>= libnl1

§  libnl-dev>= libnl-dev-1

§  pkg-config使用iw需要你有libnl,第一个工作版本是1.0pre8,因为这个版本引入了genl,Generic Netlink,nl80211依赖它。如果您的发行版的libnl版本错误,那么您现在必须自己下载并编译libnl(http://www.infradead.org/~tgr/libnl/)。

 

命令:
# iwhelp    # 帮助

# iwlist    # 获得所有设备的功能,如带宽信息(2.4GHz,和5GHz),和802.11n的信息

# iw devwlan0 scan    # 扫描

# iwevent    # 监听事件

# iw devwlan0 link    # 获得链路状态

# iw wlan0connect foo    # 连接到已禁用加密的AP,这里它的SSID是foo

# iw wlan0connect foo 2432  # 假设你有两个APSSID 都是 foo ,你知道你要连接的是在 2432 频道

# iw wlan0connect foo keys 0:abcde d:1:0011223344    # 连接到使用WEP的AP

# iw devwlan1 station dump    # 获取station 的统计信息

# iw devwlan1 station get     # 获得station对应的peer统计信息

# iw wlan0set bitrates legacy-2.4 12 18 24    # 修改传输比特率

# iw devwlan0 set bitrates mcs-5 4    # 修改tx HT MCS的比特率

# iw devwlan0 set bitrates mcs-2.4 10

# iw devwlan0 set bitrates mcs-5    # 清除所有 tx 比特率和设置的东西来恢复正常

# iwdev  set txpower  []   #设置传输功率

# iwphy  set txpower  []   #设置传输功率

# iw devwlan0 set power_save on  #设置省电模式

# iw devwlan0 get power_save  #查询当前的节电设定

# iw phyphy0 interface add moni0 type monitor  #添加一个 monitor 接口

 

下载路径:
http://kernel.org/pub/software/network/iw/.

http://git.kernel.org/?p=linux/kernel/git/jberg/iw.git.

https://packages.gentoo.org/packages/net-wireless/iw

 

 

 

 

2.     wpa_supplicant
wpa_supplicant是适用于Linux,BSD,Mac OS X和Windows的WPA请求者,支持WPA和WPA2(IEEE 802.11i / RSN)。它适用于台式机/笔记本电脑和嵌入式系统。请求者是客户端站中使用的IEEE 802.1X / WPA组件。它实现与WPA Authenticator的密钥协商,并控制wlan驱动程序的漫游和IEEE 802.11身份验证/关联。

wpa_supplicant被设计为一个“后台程序”程序,它在后台运行并充当控制无线连接的后端组件。wpa_supplicant支持单独的前端程序,wpa_supplicant包含基于文本的前端(wpa_cli)和GUI(wpa_gui),可以通过wpa_cli来进行WIFI的配置与连接,前提要保证wpa_supplicant正常启动.例如命令:wpa_cli scan_results

 

支持的WPA / IEEE 802.11i功能:
WPA-PSK(“WPA-Personal”)

带有EAP的WPA(例如,使用RADIUS身份验证服务器)(“WPA-Enterprise”)

CCMP,TKIP,WEP104,WEP40的密钥管理

WPA和完整的IEEE 802.11i/ RSN / WPA2

RSN:PMKSA缓存,预身份验证

IEEE 802.11r

IEEE 802.11w

Wi-Fi保护设置(WPS)

 

使用wpa_supplicant:
使用WPA与AP关联时使用以下步骤:

wpa_supplicant请求内核驱动程序扫描相邻BSS

wpa_supplicant根据其配置选择BSS

wpa_supplicant请求内核驱动程序与所选BSS关联

如果WPA-EAP:集成的IEEE 802.1X请求方使用认证服务器完成EAP认证(由AP中的认证方代理)

如果从IEEE 802.1X请求方收到WPA-EAP:主密钥

如果WPA-PSK:wpa_supplicant使用PSK作为主会话密钥

wpa_supplicant使用身份验证器(AP)完成WPA 4-Way Handshake和Group Key Handshake。WPA2已将初始组密钥握手集成到4路握手中。

wpa_supplicant为单播和广播配置加密密钥

可以发送和接收普通数据包

 

配置文件:
使用文本文件配置wpa_supplicant,该文件列出所有接受的网络和安全策略,包括预共享密钥。有关配置格式和支持的字段的详细信息,请参阅示例配置文件http://w1.fi/cgit/hostap/plain/wpa_supplicant/wpa_supplicant.conf下的wpa_supplicant.conf。示例配置可用于明文, 静态WEP,具有动态WEP的IEEE 802.1X(EAP-PEAP / MSCHAPv2), WPA-PSK / TKIP和 WPA2-EAP / CCMP(EAP-TLS)。

 

下载地址:
http://w1.fi/releases/
http://w1.fi/wpa_supplicant/
 
 

3.     hostapd
hostapd是访问点和身份验证服务器的用户空间守护程序。它实现了IEEE802.11接入点管理,IEEE 802.1X / WPA / WPA2 / EAP认证器,RADIUS客户端,EAP服务器和RADIUS认证服务器。当前版本支持Linux(Host AP,madwifi,基于mac80211的驱动程序)和FreeBSD(net80211)。

hostapd旨在成为一个“后台程序”程序,它在后台运行并充当控制身份验证的后端组件。hostapd支持单独的前端程序,并且hostapd中包含一个示例基于文本的前端hostapd_cli。

要与内核驱动程序通信,hostapd必须使用某些接口。所有新的实现AP功能cfg80211(和mac80211)的驱动程序使用支持nl80211接口。

hosatapd负责sta接入点的管理。

下载并编译hostapd
使用带有nl80211的hostapd要求你至少拥有libnl-1.0pre8,因为这个版本引入了nl80211所依赖的genl,Generic Netlink。大多数发行版现在发布此版本或更高版本。要在Fedora或其他将二进制文件中的标题分开的发行版上进行编译,您需要libnl-devel包。

 

支持的无线卡/驱动程序:
Linux mac80211驱动程序

在AP模式下支持nl80211 / cfg80211的Linux驱动程序

Prism2 / 2.5 / 3的主机AP驱动程序

madwifi(Atheros ar521x)

BSD net80211层(例如,Atheros驱动程序)(FreeBSD 6-CURRENT)

配置文件:
hostapd使用列出所有配置参数的文本文件进行配置。有关配置格式和支持的字段的详细信息,请参阅示例配置文件 hostapd.conf。路径:http://w1.fi/cgit/hostap/plain/hostapd/hostapd.conf

 

下载地址:
http://w1.fi/hostapd/

http://w1.fi/releases/

4.      总结:
1. iw            (无线网卡连接其它设备,工作于STA模式,开放模式或者WEP)

2. wpa_supplicant(无线网卡连接其它设备,工作于STA模式,WPA或者WPA2)

3. hostapd         (无线网卡作为路由器,工作于AP模式)

4. wpa_supplicant和 hostapd是后台程序,wpa_cli 和 hostapd_cli是前台程序。

五、   参考文档
http://aircrack-ng.org/doku.php?id=install_drivers

https://wireless.wiki.kernel.org/en/users/documentation/hostapd

https://wireless.wiki.kernel.org/en/users/Documentation/iw

 

http://w1.fi/wpa_supplicant/

 

https://wireless.wiki.kernel.org/en/users/documentation/wpa_supplicant

http://w1.fi/wpa_supplicant/

 

http://w1.fi/cgit/hostap/plain/wpa_supplicant/wpa_supplicant.conf

注意点:

1. 本篇博客是移植wifi的概念介绍,后面的博客会详细介绍每个步骤的实现过程。

2. 下载本博客的详细文档格式,请去网页:

https://download.csdn.net/download/happygrilclh/10537896

3. 原创作,不做商业。
 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!