移植wpa_supplicant-2.6 (2017-10-14 16:21:17)

移植wpa_supplicant-2.6 (2017-10-14 16:21:17)
转载

分类: linux

转载至: http://blog.csdn.net/kuangzuxiaoN/article/details/75028643

开发环境: ubuntu 16.04LTS
目标环境: iTOP4412精英板

交叉编译器: arm-2014.05

到官网下载最新的版本wpa_supplicant-2.6

http://www.linuxfromscratch.org/blfs/view/svn/basicnet/wpa_supplicant.html

在官网可以看到wpa_supplicant-2.6的依赖程序

WPA Supplicant Dependencies

Recommended

libnl-3.3.0 and OpenSSL-1.1.0f

Optional

dbus-1.10.20, libxml2-2.9.4, and Qt-5.9.1

主要依赖于libnl-3.3.0和OpenSSL-1.1.0f,这里给出下载地址:

libnl-3.3.0: http://www.linuxfromscratch.org/blfs/view/svn/basicnet/libnl.html

OpenSSL-1.1.0f: http://www.linuxfromscratch.org/blfs/view/svn/postlfs/openssl.html

移植步骤:

(1)首先移植openssl-1.1.0f

  1. 解压并进入到openssl-1.1.0f主目录

[cpp] view plain copy

tar -xvf openssl-1.1.0f  
cd openssl-1.1.0f  
  1. 执行
    [cpp] view plain copy

    ./Configure linux-armv4 –prefix=/usr/local/arm/openssl

配置目标环境,根据自己的板子具体修改,Exynos4412是armv7架构,并且给定路径参数,我要安装的绝对路径是/usr/local/arm/openssl

配置成功后,可以看到

[cpp] view plain copy

Configuring for linux-armv4  
CC            =gcc  
CFLAG         =-Wall -O3 -pthread   
SHARED_CFLAG  =-fPIC -DOPENSSL_USE_NODELETE  
DEFINES       =DSO_DLFCN HAVE_DLFCN_H NDEBUG OPENSSL_THREADS OPENSSL_NO_STATIC_ENGINE OPENSSL_PIC OPENSSL_BN_ASM_MONT OPENSSL_BN_ASM_GF2m SHA1_ASM SHA256_ASM SHA512_ASM AES_ASM BSAES_ASM GHASH_ASM ECP_NISTZ256_ASM POLY1305_ASM  
LFLAG         =  
PLIB_LFLAG    =  
EX_LIBS       =-ldl   
APPS_OBJ      =  
CPUID_OBJ     =armcap.o armv4cpuid.o  
UPLINK_OBJ    =  
BN_ASM        =bn_asm.o armv4-mont.o armv4-gf2m.o  
EC_ASM        =ecp_nistz256.o ecp_nistz256-armv4.o  
DES_ENC       =des_enc.o fcrypt_b.o  
AES_ENC       =aes_cbc.o aes-armv4.o bsaes-armv7.o aesv8-armx.o  
BF_ENC        =bf_enc.o  
CAST_ENC      =c_enc.o  
RC4_ENC       =rc4_enc.o rc4_skey.o  
RC5_ENC       =rc5_enc.o  
MD5_OBJ_ASM   =  
SHA1_OBJ_ASM  =sha1-armv4-large.o sha256-armv4.o sha512-armv4.o  
RMD160_OBJ_ASM=  
CMLL_ENC      =camellia.o cmll_misc.o cmll_cbc.o  
MODES_OBJ     =ghash-armv4.o ghashv8-armx.o  
PADLOCK_OBJ   =  
CHACHA_ENC    =chacha-armv4.o  
POLY1305_OBJ  =poly1305-armv4.o  
BLAKE2_OBJ    =  
PROCESSOR     =  
RANLIB        =ranlib  
ARFLAGS       =  
PERL          =/usr/bin/perl  

THIRTY_TWO_BIT mode  
BN_LLONG mode  
RC4 uses unsigned char  

Configured for linux-armv4.  
  1. 这里就需要修改交叉编译器,修改Makefile

添加交叉编译器:

[cpp] view plain copy

CROSS_COMPILE=/usr/local/arm/arm-2014.05/bin/arm-none-linux-gnueabi-   

配置参数中已经指定了路径,因此在Makefile不用修改,可以看到:

[cpp] view plain copy

51: INSTALLTOP=/usr/local/arm/openssl  
52: OPENSSLDIR=/usr/local/arm/openssl/ssl  
53: LIBDIR=lib  
54: ENGINESDIR=/usr/local/arm/openssl/lib/engines-1.1  
  1. 执行make,完成编译

  2. 执行sudo make install,完成安装

  3. 可以看到openssl被编译成静态库,放在指定目录/usr/local/arm/openssl下

[cpp] view plain copy

yang@yang:/usr/local/arm/openssl$ ls  
bin  include  lib  share  ssl  
yang@yang:/usr/local/arm/openssl/lib$ ls  
engines-1.1  libcrypto.so      libssl.a   libssl.so.1.1  
libcrypto.a  libcrypto.so.1.1  libssl.so  pkgconfig  
yang@yang:/usr/local/arm/openssl/lib$   
  1. 将lib中的libcrypto.a、libcrypto.so.1.1、libssl.so.1.1和libssl.a文件拷贝到开发板文件系统的/lib目录下,bin中的openssl文件拷贝到开发板的/bin中

(2)移植libnl-3.3.0

1.解压并进入到主目录
[cpp] view plain copy

cd libnl-3.3.0  

2.配置交叉编译选项
[cpp] view plain copy

sudo ./configure --host=arm-linux --prefix=/usr/local/arm/libnl --enable-static --enable-shared CC=/usr/local/arm/arm-2014.05/bin/arm-none-linux-gnueabi-gcc  

在这里交叉编译器用的是绝对路径。

可能会出现如下错误:

[cpp] view plain copy

configure: WARNING: bison not found. Please install before continuing.  
configure: WARNING: flex not found. Please install before continuing.  
configure: error: Required packages are missing. Please install them and rerun ./configure  

根据提示,安装bison和flex

[cpp] view plain copy

sudo apt-get install bison  
sudo apt-get install flex  

再次使用配置编译选项命令,最终看到如下输出
[cpp] view plain copy

-------------------------------------------------------------------------------  
                                  NOTE  

 There have been some changes starting with 3.2 regarding where and how libnl  
 is being installed on the system in order to allow multiple libnl versions  
 to be installed in parallel:  

    - Headers will be installed in ${prefix}/include/libnl3, therefore  
      you will need to add "-I/usr/include/libnl3" to CFLAGS  

    - The library basename was renamed to libnl-3, i.e. the SO names become  
      libnl-3.so., libnl-route-3.so, etc.  

    - libtool versioning was assumed, to ease detection of compatible library  
      versions.  

 If you are using pkg-config for detecting and linking against the library   
 things will continue magically as if nothing every happened. If you are   
 linking manually you need to adapt your Makefiles or switch to using   
 pkg-config files.  

-------------------------------------------------------------------------------  

配置成功。

  1. 开始编译,执行make命令

  2. 安装,执行make install命令

在/usr/local/arm/libnl目录下有以下文件
[cpp] view plain copy

yang@yang:/usr/local/arm/libnl$ ls  
bin  etc  include  lib  share  
yang@yang:/usr/local/arm/libnl$ ls lib/  
libnl                    libnl-genl-3.so            libnl-route-3.a  
libnl-3.a                libnl-genl-3.so.200        libnl-route-3.la  
libnl-3.la               libnl-genl-3.so.200.25.0   libnl-route-3.so  
libnl-3.so               libnl-idiag-3.a            libnl-route-3.so.200  
libnl-3.so.200           libnl-idiag-3.la           libnl-route-3.so.200.25.0  
libnl-3.so.200.25.0      libnl-idiag-3.so           libnl-xfrm-3.a  
libnl-cli-3.a            libnl-idiag-3.so.200       libnl-xfrm-3.la  
libnl-cli-3.la           libnl-idiag-3.so.200.25.0  libnl-xfrm-3.so  
libnl-cli-3.so           libnl-nf-3.a               libnl-xfrm-3.so.200  
libnl-cli-3.so.200       libnl-nf-3.la              libnl-xfrm-3.so.200.25.0  
libnl-cli-3.so.200.25.0  libnl-nf-3.so              pkgconfig  
libnl-genl-3.a           libnl-nf-3.so.200  
libnl-genl-3.la          libnl-nf-3.so.200.25.0  
  1. 安装成功,将libnl-3.so.200.25.0、libnl-genl-3.so.200.25.0放到开发板的/lib目录,并创建软链接

[cpp] view plain copy

ln -s libnl-3.so.200.25.0 libnl-3.so  
ln -s libnl-3.so.200.25.0 libnl-3.so.200  
ln -s libnl-genl-3.so.200.25.0 libnl-genl-3.so  
ln -s libnl-genl-3.so.200.25.0 libnl-genl-3.so.200  

(3)移植wpa_supplicant-2.6

  1. 解压并进入到wpa_supplicant-2.6主目录,并生成.config文件

[cpp] view plain copy

cd wpa_supplicant-2.6  
cp defconfig .config  
  1. 修改.config文件

[cpp] view plain copy

CC=/usr/local/arm/arm-2014.05/bin/arm-none-linux-gnueabi-gcc -L/usr/local/arm/openssl/lib  
CFLAGS += -I/usr/local/arm/openssl/include  
LIBS += -L/usr/local/arm/openssl/lib  

CONFIG_DRIVER_NL80211=y  

CONFIG_LIBNL32=y  
CFLAGS += -I/usr/local/arm/libnl/include  
LIBS += -L/usr/local/arm/libnl/lib  

这里只给出主要的修改部分,其他使用默认设置就好。注意,这里一定要添加libnl的配置,否则会出现错误:

[cpp] view plain copy

../src/drivers/driver_nl80211.c:17:31: fatal error: netlink/genl/genl.h: No such file or directory  
 #include   
                               ^  
compilation terminated.  
Makefile:1776: recipe for target '../src/drivers/driver_nl80211.o' failed  
make: *** [../src/drivers/driver_nl80211.o] Error 1  
  1. 编译,执行make
  2. 将生成的wpa_cli、wpa_passphrase、 wpa_supplicant等工具添加到开发板文件系统/bin目录下,并且拷贝配置文件到开发板文件系统/etc目录下。

[cpp] view plain copy

cp examples/wpa-psk-tkip.conf rootfs/etc/wpa_supplicant.conf  
  1. 修改wpa_supplicant.conf

[cpp] view plain copy

# WPA-PSK/TKIP  

ctrl_interface=/var/run/wpa_supplicant  

network={  
        ssid="yang"     #无线网络名称  
        key_mgmt=WPA-PSK  
        proto=WPA  
        pairwise=TKIP  
        group=TKIP  
        psk="57b559b778"    #无线网络密码  
}  

(4)测试wpa_supplicant

  1. 在开发板的/var/run/下创建文件wpa_supplicant

[cpp] view plain copy

mkdir -p wpa_supplicant  
  1. 使用命令:

[cpp] view plain copy

wpa_passphrase yang 57b559b778 >> wpa_supplicant.conf   

创建连接暗文密码(PSK密码),通过明码转换,修改wpa_supplicant.conf,用PSK密码替换明文密码

[cpp] view plain copy

# WPA-PSK/TKIP  

ctrl_interface=/var/run/wpa_supplicant  

network={  
        ssid="yang"  
        key_mgmt=WPA-PSK  
        proto=WPA  
        pairwise=TKIP  
        group=TKIP  
        psk=725e926081647954f9af00e46904fd6382b2cbc91b8ab7b5655a8d8db146c5dc  
}  
  1. 在开发板的终端命令行使用命令wpa_supplicant,出现如下信息,说明wpa_supplicant移植成功
    [cpp] view plain copy

    Successfully initialized wpa_supplicant
    wpa_supplicant v2.6
    Copyright (c) 2003-2016, Jouni Malinen and contributors

    This software may be distributed under the terms of the BSD license.
    See README for more details.

    This product includes software developed by the OpenSSL Project
    for use in the OpenSSL Toolkit (http://www.openssl.org/)

    usage:
    wpa_supplicant [-BddhKLqqtvW] [-P] [-g] \
    [-G] \
    -i -c [-C] [-D] [-p] \
    [-b] [-e] \
    [-o] [-O] \
    [-N -i -c [-C] [-D] \
    [-p] [-b] [-I] …]

    drivers:
    nl80211 = Linux nl80211/cfg80211
    wext = Linux wireless extensions (generic)
    wired = Wired Ethernet driver
    options:
    -b = optional bridge interface name
    -B = run daemon in the background
    -c = Configuration file
    -C = ctrl_interface parameter (only used if -c is not)
    -d = increase debugging verbosity (-dd even more)
    -D = driver name (can be multiple drivers: nl80211,wext)
    -e = entropy file
    -g = global ctrl_interface
    -G = global ctrl_interface group
    -h = show this help text
    -i = interface name
    -I = additional configuration file
    -K = include keys (passwords, etc.) in debug output
    -L = show license (BSD)
    -N = start describing new interface
    -o = override driver parameter for new interfaces
    -O = override ctrl_interface parameter for new interfaces
    -p = driver parameters
    -P = PID file
    -q = decrease debugging verbosity (-qq even less)
    -t = include timestamp in debug messages
    -v = show version
    -W = wait for a control interface monitor before starting
    example:
    wpa_supplicant -Dnl80211 -iwlan0 -c/etc/wpa_supplicant.conf

  2. 加载网卡驱动,并且配置IP地址
    [cpp] view plain copy

    ifconfig wlan0 up
    ifconfig wlan0 10.42.0.12 netmask 255.255.255.0

注意:此处设置的IP需要与你将要连接的局域网IP在同一网段,或者是直接移植DHCP

  1. 用ifconfig命令查看无线网卡
    [cpp] view plain copy

    eth0 Link encap:Ethernet HWaddr 08:90:90:90:90:90
    inet addr:192.168.1.230 Bcast:192.168.1.255 Mask:255.255.255.0
    inet6 addr: fe80::a90:90ff:fe90:9090/64 Scope:Link
    UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
    RX packets:19520 errors:0 dropped:123 overruns:0 frame:0
    TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
    collisions:0 txqueuelen:1000
    RX bytes:1323355 (1.2 MiB) TX bytes:480 (480.0 B)

    lo Link encap:Local Loopback
    inet addr:127.0.0.1 Mask:255.0.0.0
    inet6 addr: ::1/128 Scope:Host
    UP LOOPBACK RUNNING MTU:16436 Metric:1
    RX packets:0 errors:0 dropped:0 overruns:0 frame:0
    TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
    collisions:0 txqueuelen:0
    RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

    wlan0 Link encap:Ethernet HWaddr 48:8A:D2:3A:9E:24
    inet addr:10.42.0.12 Bcast:10.42.0.255 Mask:255.255.255.0
    UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
    RX packets:0 errors:0 dropped:0 overruns:0 frame:0
    TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
    collisions:0 txqueuelen:1000
    RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

  2. 加载网卡成功,连接无线局域网

这里根据wpa_supplicant命令的提示,使用提示命令

[cpp] view plain copy

wpa_supplicant -Dnl80211 -iwlan0 -c/etc/wpa_supplicant.conf  

会出现如下错误:

[cpp] view plain copy

nl80211: deinit ifname=wlan0 disabled_11b_rates=0  
wlan0: Failed to initialize driver interface  

可见wlan0驱动不支持Linux nl80211/cfg80211, 因此改用
[cpp] view plain copy

wpa_supplicant -Dwext -iwlan0 -c/etc/wpa_supplicant.conf  

注:关于nl80211和wext无线驱动接口的区别

nl80211 = Linux nl80211/cfg80211

wext = Linux wireless extensions (generic)

可参考: http://blog.csdn.net/dickjtk/article/details/11862815

  1. 测试无线局域网,将要连接的无线网IP: 10.42.0.1

[cpp] view plain copy

PING 10.42.0.1 (10.42.0.1): 56 data bytes  
64 bytes from 10.42.0.1: seq=0 ttl=64 time=8.918 ms  
64 bytes from 10.42.0.1: seq=1 ttl=64 time=1.402 ms  
64 bytes from 10.42.0.1: seq=2 ttl=64 time=1.315 ms  
64 bytes from 10.42.0.1: seq=3 ttl=64 time=3.993 ms  
64 bytes from 10.42.0.1: seq=4 ttl=64 time=3.141 ms  
64 bytes from 10.42.0.1: seq=5 ttl=64 time=2.574 ms  
64 bytes from 10.42.0.1: seq=6 ttl=64 time=2.136 ms  
64 bytes from 10.42.0.1: seq=7 ttl=64 time=1.561 ms  
^C  
--- 10.42.0.1 ping statistics ---  
8 packets transmitted, 8 packets received, 0% packet loss  
round-trip min/avg/max = 1.315/3.130/8.918 ms  

网络连接成功。

猜你喜欢

转载自blog.csdn.net/whereisdog/article/details/81632587