详细介绍linux下移植wifi的步骤.docx
目录
一、 背景... 2
二、 概念介绍... 2
1. Card introduction. 2
2. cfg80211. 4
3. mac80211. 4
4. nl80211. 5
5. 加密方式... 5
三、 正确安装驱动程序... 6
1. 驱动程序源码... 6
2. 依赖... 8
四、 管理无线连接的方法... 11
1. iw.. 11
2. wpa_supplicant. 13
3. hostapd. 14
4. 总结:... 15
五、 参考文档... 15
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软件。
市场上现在有两种类型的无线卡,FullMac和SoftMac。下图是这两种卡同用户空间交互数据时,调用的说明图。即不同部分cfg80211 / mac80211 / nl80211如何协同工作的图片。
FullMac
这些无线卡具有通过硬件处理的MLME(MAC子层管理实体),通常出于省电的原因(例如智能手机,平板电脑,SBC和物联网)。除了少数例外,这些卡都不支持监控模式和注入。
SoftMac
SoftMac无线卡使用mac80211在软件中处理MLME。其中大多数都支持捕获和注入(少数例外)。
cfg80211是Linux802.11配置API。cfg80211取代了Wireless-Extensions。nl80211用于配置cfg80211设备,用于内核←→用户空间通信。cfg80211现在功能齐全,具有无线扩展功能,在实施cfg80211驱动程序时,仍然会通过cfg80211到CONFIG_CFG80211_WEXT自动为您提供无线扩展支持。不再需要无线扩展的发行版可以删除它,并鼓励这样做。
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
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.
iw
crda
hostapd
wpa_supplicant (with -Dnl80211)
nl80211 testmode命令有助于实现工厂校准或无线芯片验证工具等。
该功能可能用于SAR测试(比吸收率),MPE测试(最大允许曝光),RF测试(射频),如FCC等机构可能要求的。
无线网络的安全性由认证和加密来保证。
认证允许只有被许可的用户才能连接到无线网络;
加密的目的是提供数据的保密性和完整性(数据在传输过程中不会被篡改)。
关于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上事先设置密码,如果手机提供的密码和事先设置的密码一样,那么手机就可以使用无线网络。
安装驱动程序这项任务,又包括两部分内容。第一部分是驱动程序源码,第二部分是依赖。
默认的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检查。
由上面讲的可知,无线卡工作,要有cfg80211 , mac80211 ,nl80211的支持,所以配置内核的时候,要选择上这几个选项。
如下图:
第一个关键步骤是确保您的系统识别您的无线设备。有多种方法可以验证您的系统是否成功完成了此操作。以下是一些方法:
§ “dmesg”命令通常可以包含指示正确检测到无线设备的详细消息。
§ 如果卡是PCI卡(miniPCI/ miniPCI Express / PCI Express),则需要使用命令“lspci”来显示卡识别字符串。
§ 如果硬件是USB加密狗,则需要使用命令“lsusb”来显示加密狗标识字符串。在某些情况下,“lsusb”不起作用(例如,如果未安装usbfs),您可以使用“dmesg”(或在/ var /log / messages中)从内核日志中获取标识字符串。
首先运行“modprobe
运行“dmesg”命令并查找与您的无线设备相关的错误。至少应该有一些与您的设备加载和模块初始化有关的消息。如果没有消息或错误,您将不得不调查并纠正问题。
两个常见问题是:
*“未知符号”。*缺少固件
某些无线卡需要固件才能工作。
这个消息在dmesg中非常清楚,它会告诉你缺少什么文件名以及它在哪里。在某些情况下,驱动程序可以退回并尝试以前版本的固件。
可以手动添加文件来解决问题,但大多数情况下,固件可以在软件包中找到(例如firmware-linux或firmware-linux-nonfree)。
加载驱动程序内核模块时,您会收到另一个字段名称的“未知符号”错误消息。有时您也会在dmesg输出中看到这一点。这是由于您加载的模块与您正在运行的内核版本不匹配而导致的。
运行“lsmod”命令可以用来查看加载的模块。确认实际加载了无线设备的内核模块。如果未加载,则必须调查并更正问题。
有时其他模块与您尝试运行的模块冲突。请参阅下面的黑名单。此外,冲突的模块可以移出模块树。如果这样做,请在之后运行“depmod-ae”。
运行“modinfo
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
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-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与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)。
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接入点的管理。
使用带有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/
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. 原创作,不做商业。