hi3516 wpa_supplicant


原文链接: hi3516 wpa_supplicant

wpa_supplicant 和hostpad让WiFi模块同时工作在AP+STA模式
wpa_supplicant 和hostpad让WiFi模块同时工作在AP+STA模式_运维_leumber的专栏-CSDN博客
比如这个 wireless_ext。
make menuconfig 后搜一下,能搜到,不过会发现他没有 Location,只有个 selected by。
这就是说,只有满足了那些 selected by 的时候,这个才会被选上。在 selected by 里面,能看到 GELIC_WIRELESS [=n] && NETDEVICES [=y] && NETDEV_1000 [=y] && WLAN [=y] && GELIC_NET [=n] || IPW2100 [=m] && NETDEVICES [=y] && WLAN [=y] && PCI [=y] && CFG80211 [=y] 这样的一些内容。怎么理解呢?这些是按照那些 || 来分割的,竖线左右的是或的关系,不管哪边满足都可以。我在那个长长的列表里面摸索了半天,总算找到一个合适的,那就是先把 ipw2100 这个驱动选上,因为网卡不是这个型号的,所以把这个编译成模块,然后加在 blacklist 里面
Symbol: WIRELESS_EXT [=n] │
│ Type : boolean │
│ Defined at net/wireless/Kconfig:1 │
│ Depends on: NET [=y] && WIRELESS [=y] │
│ Selected by: GELIC_WIRELESS [=n] && NETDEVICES [=y] && ETHERNET [=y] && NET_VENDOR_TOSHIBA │

│ Symbol: GELIC_WIRELESS [=n] │
│ Type : boolean │
│ Prompt: PS3 Wireless support │
│ Location: │
│ -> Device Drivers │
│ -> Network device support (NETDEVICES [=y]) │
│ (2) -> Ethernet driver support (ETHERNET [=y]) │
│ -> Toshiba devices (NET_VENDOR_TOSHIBA [=n]) │
│ -> PS3 Gigabit Ethernet driver (GELIC_NET [=n]) │
│ Defined at drivers/net/ethernet/toshiba/Kconfig:30 │
│ Depends on: NETDEVICES [=y] && ETHERNET [=y] && NET_VENDOR_TOSHIBA [=n] && GELIC_NET [=n] │
│ Selects: WIRELESS_EXT [=n]

2、Wifi

   (1). Networking support

          --->Wireless 下增加802.11 协议栈的支持

   (2)、USB 支持WIFI 的配置

   USB 支持WIFI 的配置选项位于Device Drivers >USB support 配置菜单下USB Wireless

   DeviceManagement support。

   (3)、用户空间的mdev 和firmware 支持配置

   进入Device Driver > Generic Driver Options 配置菜单,按照下图所示配置用户空间的 mdev 和 firmware    支持

   (4)、WIFI 设备支持配置
   Device Drivers ---> Network device support ---> Wireless LAN ---> Ralink driver support--->Ralink    rt2800 (USB) support (EXPERIMENTAL) --->rt2800usb - Include support for rt30xx (USB) devices
   以及Wireless LAN 目录里IEEE 802.11 for Host AP (Prism2/2.5/3 and WEP/TKIP/CCMP)都选上,   目的是打开CONFIG_WIRELESS_EXT=y CONFIG_WEXT_PRIV=y

3.在命令行下配置无线网卡:

(1)iwconfig 查看当前的无线网卡设备,假设你的无线网卡设备为wlan1

(2)设置无线网卡的AP信息

添加AP账号名,AP登陆密码 iwconfig essid "AP-Name" key 1234-5678-90ab(密码每四个一组,中间用破折号隔开)

(3)启动无线网卡

ifconfig wlan1 up

(4)设置无线网卡的IP地址

如果你的无线网卡的IP地址是静态设置的 ifconfig wlan1 192.168.1.2 netmask 255.255.255.0

如果你的无线网卡的IP地址是动态获取的 dhclient wlan1 或者 dhcpcd wlan1 动态获取无线网卡的IP

二、配置并使用
使用 iwconfig 命令来查看当前机器上被识别出来的无线设备,例如这里我的树莓派上插入了一块腾达的USB无线网卡,则在系统中会得到识别。

然后在 /etc/wpa_supplicant/ 目录下或者其它目录建立一个 wifi 的配置文件 example.conf,这里我创建在 /etc/wpa_supplicant/example.conf,并写入如下配置内容:

ctrl_interface=/run/wpa_supplicant
update_config=1
这样配置是为了后面可以使用 wpa_cli 命令来实时地扫描和配置网络,并能狗保存配置信息。

配置文件建立完毕后,运行 wpa_supplicant 命令来启动无线网络接口,并加载相关配置文件。

sudo wpa_supplicant -B -D nl80211 -i wlan0 -c /etc/wpa_supplicant/example.conf

可以看到提示初始化成功,-B参数表示后台运行。如果遇到驱动不支持所插入的无线网卡,可选择wired或者wext等,具体详情可使用 wpa_supplicant -h 进行查看。

初始化完毕后,即可运行 sudo wpa_cli 来实时地配置网络。进入 wpa_cli 的交互界面后,它会自动地扫描周围的无线网络,你也可以使用 scan 命令进行手动扫描:

扫描完成后,使用 scan_result 打印扫描结果,选择你要连接的无线网络的 SSID(名称),然后新建一个网络配置信息(0代表了配置编号):

add_network
然后对编号为 1 的网络配置信息进行设置:

set_network 1 ssid "Wifi名称"
set_network 1 psk "Wifi密码"
set_network 1 key_mgmt "Wifi的加密方式(WPA-PSK/WPA2-PSK)"
设置好后,即可使用 enable_network 1 来启用该配置并使用 save_config 来保存当前配置至 /etc/wpa_supplicant/example.conf。

这是可以再次使用 iwconfig 命令来查看无线网卡信息,可以看到已经连接上了对应的 Wifi 并有了相应的信息。

一般 Wifi 的 IP 地址获取都使用了 DHCP 协议,因此我们还需要手动 dhclient wlan0 来自动协商获取 IP 地址。

下次启动时可以直接使用现有配置来对之前的 Wifi 进行连接,当然不要忘了使用相应命令来进行 DCHP 协商获取 IP 地址。

sudo wpa_supplicant -B -D nl80211 -i wlan0 -c /etc/wpa_supplicant/example.conf
sudo dhclient wlan0
至此就大功告成了,终端下连接 Wifi 就是这么简单 :)


wpa_supplicant 的编译依赖 libnl 库、libssl库,因此需要先编译这两个库。

1 libssl编译

1.1下载

下载链接:https://www.openssl.org/source/
下载文件openssl-1.0.2r.tar.gz

1.2编译

解压文件,进入主目录,使用如下命令编译

#mkdir _install
#./config  no-asm shared --prefix=$PWD/_install --cross-compile-prefix=arm-himix100-linux- 
#make CC=arm-himix100-linux-gcc
#make insatll

_install为相关库的存放路径
arm-himix100-linux- 为交叉编译工具链
注意,在编译过程中,如果出现如下错误:
arm-himix100-linux-gcc: error: unrecognized command line option ‘-m64’
则需要打开Makefile 查找里面的 ‘-m64’,并将其删除即可

2 libnl编译

2.1 下载

下载链接:
http://www.linuxfromscratch.org/blfs/view/svn/basicnet/libnl.html
下载当前最新包libnl-3.4.0.tar.gz

2.2 编译

解压进入主目录,使用如下命令编译:

#mkdir _install
#./configure --host=arm-himix100-linux --prefix=$PWD/_install
#make 
#make install

_install为相关库的存放路径
arm-himix100-linux- 为交叉编译工具链

3 wpa_supplicant

3.1 下载

下载链接:http://w1.fi/releases/
下载当前最新包wpa_supplicant-2.8.tar.gz

3.2 编译

解压并进入主目录
使用如下命令编译

#cd wpa_supplicant/
#cp defconfig .config

在Makefile中添加libssl和libnl的路径,如下:

CFLAGS += -I/home/openssl-1.0.2r/_install/include
LIBS += -L/home/openssl-1.0.2r/_install/lib
CFLAGS += -I/home/libnl-3.4.0/_install/include/libnl3
LIBS += -L/home/libnl-3.4.0/_install/lib

路径要根据自己的实际路径填写

#make CC=arm-himix100-linux-gcc

编译成功后便生成了工具wpa_supplicant和wpa_cli

上面生成的可执行文件为动态链接的,若要想静态链接,在Makefile中找到对应的编译选项加上 -static 字段即可,如下:

wpa_supplicant: $(BCHECK) $(OBJS) $(EXTRA_progs)
	$(Q)$(LDO) --static $(LDFLAGS) -o wpa_supplicant $(OBJS) $(LIBS) $(EXTRALIBS) -lm -lpthread
	@$(E) "  LD " $@
wpa_cli: $(OBJS_c)
	$(Q)$(LDO) -static $(LDFLAGS) -o wpa_cli $(OBJS_c) $(LIBS_c)
	@$(E) "  LD " $@

目前开发的产品中需要集成WIFI,由于iwconfig工具功能有限,准备移植wpa_supplicant到海思+linux平台

历史原因
iwconfig工具只支持WEP加密,现在大部分路由器都使用wpa加密,所以使用iwconfig工具是无法连接到路由器AP上。

一、源码下载
https://w1.fi/releases/ 本次选择wpa_supplicant-2.0.tar.gz版本。

网上大多是配置openssl的方式来编译wpa_supplicant,经测试,编译出来的可执行文件大小超过了2M,
由于本次移植的平台容量仅仅16MB,2M+相当于一个庞然大物,显然依赖openssl方式编译不合适。所以选择了不依赖openssl方式来编译wpa_supplicant。

二、移植流程
1.解压镜像并进入到wpa_supplicant目录中。

tar -xzvf wpa_supplicant-2.0.tar.gz

2.修改.config文件

cp defconfig .config
vim .config
  • 2

CC=arm-hisiv300-linux-gcc

找到以下选项将以下注释的语句改为不注释

CONFIG_TLS=internal
CONFIG_INTERNAL_LIBTOMMATH=y
ifndef CONFIG_INTERNAL_LIBTOMMATH
LTM_PAHT=/usr/src/libtommath-0.39
CFLAGS += -I$(LTM_PATH)
LIBS += -L$(LTM_)
LIBS_p +=-L$(LTM_PATH)
endif
make

3.生成的wpa_supplicant大小依然超过1M,NND别急,有如下手段来收拾它:

arm-hisiv300-linux-strip wpa_suppiant
arm-hisiv300-linux-strip wpa_cli
arm-hisiv300-linux-strip wpa_passphrase

一、下载源码
http://hostap.epitest.fi/wpa_supplicant/

下载wpa_supplicant-0.7.3.tar.gz(openssl用到0.7.3提供的补丁) tar xvfz wpa_supplicant-0.7.3.tar.gz

   下载<u>[www.openssl.org/source/openssl-0.9.8e.tar.gz](http://www.openssl.org/source/openssl-0.9.8e.tar.gz)</u>  
           tar zxvf openssl-0.9.8e.tar.gz**  

二、编译openssl库**

将wpa_supplicant中的补丁拷贝到openssl中

cp wpa_supplicant-0.7.3/patches/openssl-0.9.8e-tls-extensions.patchopenssl-0.9.8e/  
cd openssl-0.9.8e  
mkdir /usr/local/ssl  
vim Makefile  

CC=arm-hismall-linux-gcc
AR=arm-hismall-linux-ar$(ARFLAGS) r
RANLIB=arm-hismall-linux-ranlib

还有上面的两项:INSTALLTOP=/usr/local/ssl

                     OPENSSLDIR=/usr/local/ssl  

make
make install

在/usr/local/ssl目录下安装了ssl库
ls/usr/local/ssl
bin certs include lib man misc openssl.cnf private

后面编译wpa_supplicant要依赖openssl中的lib和include

三、编译 wpa_supplicant

进入wpa_supplicant-0.7.3.tar.gz解压生成的wpa_supplicant-0.7.3/wpa_supplicant目录中:

   cp defconfig       .config  
   vim .config  

CC=arm-hismall-linux-gcc -L/usr/local/ssl/lib

CC=/opt/brcm/hndtools-mipsel-uclibc/bin/mipsel-uclibc-gcc

CFLAGS += -I/usr/local/ssl/include

CPPFLAGS=-I../src/include -I../openssl-0.9.7d/include

-I../WRT54GS/release/src/include

LIBS += -L/usr/local/ssl/lib

make

经过编译后的wpa_supplicant源程序可以看到两个主要的可执行工具:wpa_supplicant和wpa_cli。wpa_supplicant是核心程序,它和wpa_cli的关系就是服务和客户端的关系:后台运行wpa_supplicant,使用wpa_cli来搜索、设置、和连接网络。

四、配置wpa_supplicant

在板子根目录/etc中建立wpa_supplicant.conf文件

当然在别的目录建立也行。但是要和后面的路径对应

配置的内容如下:

ctrl_interface=/var/run/wpa_supplicant
ap_scan=1
network={
ssid="735"
key_mgmt=WPA-PSK
proto=WPA RSN
group=TKIP CCMP
pairwise=TKIP CCMP
psk="1111122222"
psk=bd3932b7e88772f675d913659fccc03a3043cd62cd08402c3e2c828ce5f509a5
psk=af488e53787f0ff88577319dd25bf829f328f0560ed985c6442ab659985e2380
}

当然我写出来的只是配置的一种可能,我相信这个配置的方法不只一种,当然要要和你的路由器上面的设置相对应。下面的psk是加密之后的密码,网络上面有这些参数的详解,感兴趣的可以上网搜搜。

五、运行测试

板子上电之后,登录进去,加载wifi的驱动,我自己的驱动是rt3070sta.ko,然后让网卡ra0启动

iiconfig ra0 192.168.1.111 up (这里我随机赋给了一个ip地址,可以不要)

然后运行 已经移植好的wpa_supplicant程序 :wpa_supplicant -Dwext-ira0 -c /etc/wpa_supplicant.conf -B

-B的意思是在后台运行,如果不加,可以看看指令打印出来的参数,具体参数的意义大家可以上网搜搜

过几秒钟 运行iwconfig指令 可以看见运行起来的网卡ra0 (iwconfig也是移植的指令)

ra0 Ralink STA ESSID:"735" Nickname:"RT2870STA"
Mode:Managed Frequency=2.462GHz Access Point:28:2C:B2:0D:08:82
Bit Rate=54 Mb/s
RTS thr:off Fragmentthr:off
Encryptionkey:FC1E-751D-9F0F-4706-2461-90B9-68AE-1404 Security mode:open
Link Quality=100/100 Signal level:-54dBm Noise level:-54 dBm
Rx invalid nwid:0 Rx invalidcrypt:0 Rx invalid frag:0
Tx excessive retries:0 Invalidmisc:0 Missed beacon:0

说明已经连接上路由器了,我之前设置了网卡ra0 192.168.111我现在ping路由器就可以ping通。

运行udhcpc -i ra0可以获得路由器分配给wifi模块的ip地址

运行route查看自己的路由 把默认的路由删掉,重新添加自己的路由器的网关:

route del default dev eth0

route add default gw 192.168.1.1 dev ra0(具体网关看情况定)

这样子以后就可以上外网了 可以ping www.baidu.com 看看!

下面我粘贴一个网上看见的好文章:

本文转自:http://forum.ubuntu.org.cn/viewtopic.php?f=155&t=314945
斗胆写个WPA2加密网络下net模式的安装指南,是因为实在被这个安装折磨得受不了了,N次的tty7失败,hcdp失败,还有更要命的kernelpanic -not syncing:vfs:unable to mount rootfs onunkown-block(0.0),甚至到最后光盘模式、图形界面下装个衍生版本Archbang,都无法成功。已经把我打击的不行了。好不容易收了它,自然得发泄一下。我会尽可能详细的讲解全部的安装经历,把每一个笔记碎片串起来,用以纪念被ArchLinux的安装折磨的这十几个日和夜。
1、先说明安装环境
一台P4 845G的老旧爱机(2G内存,160G SATA+320SATA硬盘),TPLink无线路由器,TPLink无线USB网卡
网络环境: 教育网
安装方式:U盘启动安装采用unetbootin-windows-494制作,(目前发现这个版本采用HDD模式刻录、启动表现最好,能正常启动,也少在初始化时出现错误。)
其中,TPLink无线路由器最初设置为
安全类型 WPA-PSK/WPA2-PSK
安全选项 WPA2-PSK
加密方法 AES
请各位看客,非常注意我的无线路由配置,已经一开始的最初二字,后面,我会饱含血泪的告诉诸位,为什么这些设置如此重要。
1、原始状态
原在160G SATA硬盘中装有一个 Windows7操作系统,并分有5个区,其中有1个11G和1个40G的区是完全空的,320GSATA硬盘所有分区全部都装有数据。
2、安装
1) 不知道是命苦还是,Arch鄙视我这个菜鸟,每次选择从CD安装都不行,无论是64位的NetinstallImage,还是64位的CoreImage,亦或者archlinux-2010.12-1-archboot.iso,都千篇一律的在选择CD模式后,弹出无法找到/src/core/pkg。没办法只好自己建了一个目录。Arch开始倒是很听话就通过了选择安装模式这一关,但是到了更新安装包时,就开始弹出tty7错误的信息,无法继续下去。只好铁了心的要用http/ftp模式安装。
2)被逼上梁山的感觉很不好,但是只要坚持,倒真能找到路。
我在ArchLinux的wiki和论坛里翻了很久之后,发现这篇回复。这也打开了我在命令行使用无线wpa2网络的钥匙。就连wiki,我个人觉得都需要以这篇为主干,混合在一起看,才能看懂。
https://bbs.archlinux.org/viewtopic.php?pid=7343327
具体流程如下:
1、开始还是正常的流程,由U盘启动,进过初始化,进入到系统中,出现

代码:

archiso login:

根据提示,输入root,密码[空]。

如果你不能从U盘启动,并到不了登陆这一步,wpa2模式安装过程讲解完成后,会给你解决方法。

登陆后,输入 /arch/setup 开始进入蓝色的安装界面。

source selection -> net ->

仔细看此处的提示,你会发现可以在此时,用Alt+F2,切换到桌面2,设置好无线网络,再使用ALT+F1,切换回蓝色的安装界面,也就是桌面1。我也是这样做的。

ALT+F2,切换到桌面2,然后用root登陆。开始无线网络设置。

2、首先查看光盘里有没有 wpa_supplicant.conf 文件,它一般在 /etc/wpa_supplicant.conf

3、备份 /etc/wpa_supplicant.conf

代码:

mv /etc/wpa_supplicant.conf/etc/wpa_supplicant.conf.original

基于我们现在还处于操作系统的安装过程,所以,wiki里的WPA GUI安装,在当下没有意义。

4、修改wpa_supplicant.conf

1)输入命令+修改,以我的无线网络的SSID号为Mywireless,密码为 secretpassphrase,为例。我就要按如下输入。

代码:

wpa_passphrase Mywireless "secretpassphrase" >/etc/wpa_supplicant.conf

2)

代码:

nano /etc/wpa_supplicant.conf
在这里顺便赞一个nano,实在太顺手了,比起vi和vim,nano与windows下的文本输入使用方式更接近。

会看到wpa_supplicant.conf本应是新建的空白文档,已经被填入了如下数据。

代码:

network={

  ssid="mywireless"  
  psk="secretpassphrase"  
  psk=7b271c9a7c8a6ac07d12403a1f0792d7d92b5957ff8dfd56481ced43ec6a6515  

}

此处到关键点了,手动添加一下,变成这样

network={

ssid="Mywireless" #请非常注意你ssid名的大小写。

proto=RSN #Robust Security Network:强健安全网络,表示这个网络配置比WEP模式要更安全。

key_mgmt=WPA-PSK #请无论你是使用WPA-PSK,WPA2-PSK,都请在这里输入WPA-PSK。这在wpa_supplicant看来WPA-PSK,WPA2-PSK都是WPA-PSK,改成WPA2-PSK,它会不认识。

pairwise=CCMP TKIP #关键点,wpa_supplicant目前还不认AES的加密标准,因此即使你在此输入AES也没有用,自行web到路由器上改成CCMPTKIP吧,否则…… 否则 …… 我也不知道该怎么做。

group=CCMP TKIP #同上

psk=7b271c9a7c8a6ac07d12403a

1f0792d7d92b5957ff8dfd56481ced43ec6a6515#wpa_supplicant算出来的密码。如果你自己会算,你就可以完全自己写这个wpa_supplicant.conf文件:)

}

如果还想添加另外的无线接入点。

代码:

wpa_passphrase additional_ssid "additional_passphrase">> /etc/wpa_supplicant.conf

并用nano打开/etc/wpa_supplicant.conf文档,在文档顶端写入如下:

代码:

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=wheel

3) 启动wlan

代码:

ifconfig wlan0 up

4) 搜索无线接入点

代码:

iwlist wlan0 scan

5)用ALT+F3切换到桌面3,以保证桌面2的相对干净,不会在后面进行网络连接时的大量刷屏所干扰。

6)启动wpa_supplicant协议

代码:

wpa_supplicant -i wlan0 -c /etc/wpa_supplicant.conf -d

此时,wpa_supplicant开始快速刷屏,不停的传回目前的连接情况,注意看有没有哪些是mismatch,如果有,认真回去改wpa_supplicant里的SSID或者 key_mgmt、pairwise、group。

再强调一遍

a、不要写成WPA2-PSK,即使你真的是,也要写成WPA-PSK。

b、如果用的是AES加密标准,wpa_supplicant是不能识别的。自行在路由器上改成CCMP TKIP。

7)可选步骤,如果你网络在上一步已经提示连接上,且你的路由器采用的dhcp分配IP地址,那么请输入。

代码:

dhcpcd wlan0

8)用ALT+F1切换回久违的蓝色Archlinux安装界面。

如果你用的是静止IP,那么可以在后一步自行输入IP 掩码,网关信息。

到此,在wpa2加密环境下,进行无线网络连接的最关键部分就完成了。

====================================================================================

推荐一个教育网下载很快的Archlinux镜像站

记住,在图文安装Archlinux模式下,输入更新镜像地址,请只输入顶级域名部分。

代码:

Shttp://mirror.csclub.uwaterloo.ca/

直接在mirror.lst中手工加入,则需注意要添加一些尾巴。如:/archlinux/$repo/os/$arch[/code

代码:

Server =http://mirror.csclub.uwaterloo.ca/archlinux/$repo/os/$arch[/code

=====================================================================================

rc.conf

[code]LOCALE="en_US.UTF-8"#没改成zh_CN,以避免出现命令行下出现中文乱码和方块的情况,就让它都用英文吧。图形界面有其他地方可以改。

HARDWARECLOCK="UTC"

TIMEZONE="Asia/Shanghai"

KEYMAP="us"

CONSOLEFONT=Lat2-Terminus16

CONSOLEMAP=

USECOLOR="yes"

MOD_

USELVM="no"

HOSTNAME=""

wlan0="dhcp" #此处wlan方式安装完后,程序就已经自行改好了。

INTERFACES=(wlan0) #此处wlan方式安装完后,程序就已经自行改好了。

gateway="default gw 192.168.0.1"请写自己的网关地址。

ROUTES=(!gateway)

DAEMONS=(syslog-ng net-profiles)[/code]后面要添加这两个。

locale.gen 拉到该文件的最下面。

[code]zh_CN.GB18030 GB18030 去掉前面的#

zh_CN.GBK GBK 去掉前面的#

zh_CN.UTF-8 UTF-8 去掉前面的#

zh_CN GB2312 去掉前面的#

不得不说,ArchLinux的中文格式还是挺全的。

`