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

2019-07-13 07:48发布

详细介绍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软件。  

二、   概念介绍

1.      Card introduction

 市场上现在有两种类型的无线卡,FullMac和SoftMac。下图是这两种卡同用户空间交互数据时,调用的说明图。即不同部分cfg80211 / mac80211 / nl80211如何协同工作的图片。
FullMac这些无线卡具有通过硬件处理的MLMEMAC子层管理实体),通常出于省电的原因(例如智能手机,平板电脑,SBC和物联网)。除了少数例外,这些卡都不支持监控模式和注入。SoftMacSoftMac无线卡使用mac80211在软件中处理MLME。其中大多数都支持捕获和注入(少数例外)。 

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.11abgnIEEE 802.11dIntegration of work for the emerging 802.11sstandard使用wpa_supplicant进行漫游(802.11r也是如此)。不同类型的接口,详见支持的无线模式。供应商特定费率支持QoSall 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的当前用户:

iwcrdahostapdwpa_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_drivershttps://wireless.wiki.kernel.org/en/users/drivershttps://www.mediatek.com/products/connectivity-and-networking/broadband-wifihttps://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

查看dmesg输出

运行“dmesg”命令并​​查找与您的无线设备相关的错误。至少应该有一些与您的设备加载和模块初始化有关的消息。如果没有消息或错误,您将不得不调查并纠正问题。两个常见问题是:*“未知符号*缺少固件

缺少固件

某些无线卡需要固件才能工作。这个消息在dmesg中非常清楚,它会告诉你缺少什么文件名以及它在哪里。在某些情况下,驱动程序可以退回并尝试以前版本的固件。可以手动添加文件来解决问题,但大多数情况下,固件可以在软件包中找到(例如firmware-linuxfirmware-linux-nonfree)。

未知符号错误

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

查看lsmod输出

运行“lsmod”命令可以用来查看加载的模块。确认实际加载了无线设备的内核模块。如果未加载,则必须调查并更正问题。有时其他模块与您尝试运行的模块冲突。请参阅下面的黑名单。此外,冲突的模块可以移出模块树。如果这样做,请在之后运行“depmod-ae”

查看modinfo输出

运行“modinfo。这将确认模块实际上在模块树中。同样,确认它是正确的版本。执行每个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,因为这个版本引入了genlGeneric Netlinknl80211依赖它。如果您的发行版的libnl版本错误,那么您现在必须自己下载并编译libnlhttp://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 / WPA2RSN:PMKSA缓存,预身份验证IEEE 802.11rIEEE 802.11wWi-Fi保护设置(WPS) 

使用wpa_supplicant:

使用WPA与AP关联时使用以下步骤:wpa_supplicant请求内核驱动程序扫描相邻BSSwpa_supplicant根据其配置选择BSSwpa_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

使用带有nl80211hostapd要求你至少拥有libnl-1.0pre8,因为这个版本引入了nl80211所依赖的genlGeneric 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_drivershttps://wireless.wiki.kernel.org/en/users/documentation/hostapdhttps://wireless.wiki.kernel.org/en/users/Documentation/iw http://w1.fi/wpa_supplicant/ https://wireless.wiki.kernel.org/en/users/documentation/wpa_supplicanthttp://w1.fi/wpa_supplicant/ http://w1.fi/cgit/hostap/plain/wpa_supplicant/wpa_supplicant.conf
注意点:1. 本篇博客是移植wifi的概念介绍,后面的博客会详细介绍每个步骤的实现过程。2. 下载本博客的详细文档格式,请去网页:https://download.csdn.net/download/happygrilclh/105378963. 原创作,不做商业。