嵌入式ARM-Linux平臺上的編譯、配置和運(yùn)行使用
wpa_supplicant編譯和配置運(yùn)行
從https://w1.fi/wpa_supplicant/(git地址git://w1.fi/hostap.git)下載最新的wpa_supplicant源碼壓縮包,目前最新的為版本2.5. wpa_supplicant的編譯依賴于openssl和libnl庫(Netlink Protocol Library Suite (libnl)),openssl是ssl協(xié)議的開源庫(OpenSSL, Secure Sockets Layer (SSL v2/v3) Transport Layer Security (TLS v1)).(壓縮包地址:http://www.openssl.org/source/,Git地址:https://github.com/openssl/openssl),libnl是網(wǎng)絡(luò)相關(guān)的庫(壓縮包地址:http://www.infradead.org/~tgr/libnl/,Git地址 :http://git.infradead.org/users/tgr/libnl.git)。
本文引用地址:http://butianyuan.cn/article/201611/317418.htm編譯libnl
解壓源代碼包。進(jìn)入libnl目錄,執(zhí)行./configure配置編譯環(huán)境;執(zhí)行make進(jìn)行編譯
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabi-
./configure --prefix=/usr
--sysconfdir=/etc
--disable-static&&
make
然后執(zhí)行sudo make install,libnl.so會被安裝至/usr/local/lib/目錄下,相應(yīng)的頭文件也會被copy到/usr/local/include/netlink下。
如果報出編譯錯誤:“../include/netlink_local.h:218:error ULONG_MAX undeclared",我們在對應(yīng)文件添加一個頭文件#include
編譯openssl
進(jìn)入openssl目錄,./config shared #一定要加shared,否則編譯出來的是靜態(tài)庫。執(zhí)行make進(jìn)行編譯,完成后執(zhí)行make install,編譯好的openssl庫和頭文件等被安裝在目錄/usr/local/ssl下
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabi-
./config --prefix=/usr
--openssldir=/etc/ssl
--libdir=lib
shared
zlib-dynamic &&
make
If you want to disable installing the static libraries, use this sed:
sed -i s# libcrypto.a##;s# libssl.a## Makefile
Now, as therootuser:
make MANDIR=/usr/share/man MANSUFFIX=ssl install &&
install -dv -m755 /usr/share/doc/openssl-1.0.2e&&
cp -vfr doc/*/usr/share/doc/openssl-1.0.2e
編譯wpa_supplicant
添加修改配置文件
進(jìn)入wpa_supplicant/wpa_supplicant目錄,執(zhí)行cp defconfig .config拷貝生成編譯配置,然后修改配置文件.config,
#如果選擇的不是libnl的1.0版本,需要根據(jù)libnl的版本打開下面的選項
CONFIG_LIBNL32=y
CONFIG_LIBNL20=y選擇libnl的版本
#添加openssl和libnl的頭文件和庫文件目錄,更新編譯鏈接環(huán)境變量
CFLAGS += -I/usr/local/ssl/include
CFLAGS += -I/usr/local/include/ libnl3
CFLAGS += -I/usr/local/include/netlink
LIBS += -L/usr/local/ssl/lib
LIBS += -L/usr/local/lib
LIBS_p += -L/usr/local/ssl/lib#不加此行,編wpa_passphrase出錯。
cp defconfig .config
make CC=arm-linux-gnueabi-gcc
make install DESTDIR=/home/export/rootfs
執(zhí)行make進(jìn)行編譯
成功后生成三個目標(biāo)文件wpa_supplicant, wpa_cli, wpa_passphrase,至此編譯完成。
運(yùn)行wpa_supplicant
需要保證libssl庫在我們的搜索路徑里,否則不做處理,會出現(xiàn)找不到libnl, ssl和crypto庫的錯誤。
./wpa_supplicant
./wpa_supplicant: error while loading shared libraries: libssl.so.1.1.0: cannot open shared object file: No such file or directory
將/usr/local/ssl/lib下的libssl.so.x.x.x和libcrypto.so.xxx拷貝到/lib目錄下即可,或者:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/ssl/lib,或者在/etc/ld.so.conf文件中添加庫的搜索路徑。(或者在/etc/ld.so.conf.d下新建一個.conf文件,將搜索路徑一行一個加入).
cp /usr/arm-linux-gnueabi/lib/libnl.so.1.1.4 /home/export/rootfs/lib/
cp /usr/arm-linux-gnueabi/lib/libcrypto.so.1.0.0 /home/export/rootfs/lib/
cp /usr/arm-linux-gnueabi/lib/libssl.so.1.0.0 /home/export/rootfs/lib/
配置wpa_supplicant
wpa_supplicant runs as a daemon and requires a configuration file. Create a file called /etc/wpa_supplicant.conf with the following contents:
network={
ssid="MySSID"
key_mgmt=WPA-PSK
proto=RSN
pairwise=CCMP TKIP
psk="MyPassPhrase"
}
The above file works with both WPA (TKIP) and WPA2 (CCMP/AES). Please insert your access point name at MySSID and your pass phrase at MyPassPhase.
On
wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant.conf
編譯錯誤處理
Error#1
#######################################################################
CC ../src/drivers/driver_wired.c
../src/drivers/driver_nl80211.c:25:31: fatal error: netlink/genl/genl.h: No such file or directory
compilation terminated.
make: *** [../src/drivers/driver_nl80211.o] Error 1
#######################################################################
Solution #1
sudo apt-get -y install libssl-dev libnl-3-dev
echo CFLAGS +=-I/usr/include/libnl3/ >> .config
make
Error#2
../src/drivers/driver_nl80211.c:95:9: warning: passing argument 1 of ‘genl_ctrl_alloc_cache’ from incompatible pointer type [enabled by default]
/usr/include/libnl3/netlink/genl/ctrl.h:25:14: note: expected ‘struct nl_sock *’ but argument is of type ‘struct nl_handle *’
../src/drivers/driver_nl80211.c:95:9: error: too few arguments to function ‘genl_ctrl_alloc_cache’
/usr/include/libnl3/netlink/genl/ctrl.h:25:14: note: declared here
Solution #2
sudo apt-get install libnl-genl-3-dev
echo CONFIG_LIBNL32=y >> .config
make
Usage
usage:
wpa_supplicant [-BddhKLqqtvW] [-P] [-g]
[-G
-i
[-b
[-o
[-N -i -c [-C] [-D]
[-p
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)
-i = interface name
-I = additional configuration file
-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
-K = include keys (passwords, etc.) in debug output
-t = include timestamp in debug messages
-h = show this help text
-L = show license (BSD)
-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)
-v = show version
-W = wait for a control interface monitor before starting
-N = start describing new interface
example:
wpa_supplicant -Dnl80211 -iwlan0 -c/etc/wpa_supplicant.conf
wpa_cli [-pctrl sockets>] [-i] [-hvB] [-a]
[-P
-h = help (show this usage text)
-v = shown version information
-a = run in daemon mode executing the action file based on events from
wpa_supplicant
-B = run a daemon in the background
default path: /var/run/wpa_supplicant
default interface: first interface found in socket path
commands:
status [verbose] = get current WPA/EAPOL/EAP status
ifname = get current interface name
ping = pings wpa_supplicant
relog = re-open log-file (allow rolling logs)
note
mib = get MIB variables (dot1x, dot11)
help [command] = show usage help
interface [ifname] = show interfaces/select interface
level
license = show full wpa_cli license
quit = exit wpa_cli
set = set variables (shows list of variables when run without arguments)
get
logon = IEEE 802.1X EAPOL state machine logon
logoff = IEEE 802.1X EAPOL state machine logoff
pmksa = show PMKSA cache
reassociate = force reassociation
preauthenticate = force preauthentication
identity
password
new_password
pin
otp = configure one-time-password for an SSID
passphrase = configure private key passphrase
for an SSID
sim
bssid = set preferred BSSID for an SSID
blacklist
blacklist clear = clear the blacklist
blacklist = display the blacklist
log_level
log_level = display the current log level and log options
list_networks = list configured networks
select_network
enable_network
disable_network
add_network = add a network
remove_network
set_network
list of variables when run without arguments)
get_network
list_creds = list configured credentials
add_cred = add a credential
remove_cred
set_cred
save_config = save the current configuration
disconnect = disconnect and wait for reassociate/reconnect command before
connecting
reconnect = like reassociate, but only takes effect if already disconnected
scan = request new BSS scan
scan_results = get latest scan results
bss < | > = get detailed scan result info
get_capability
reconfigure = force wpa_supplicant to re-read its configuration file
terminate = terminate wpa_supplicant
interface_add
are optional
interface_remove
interface_list = list available interfaces
ap_scan
scan_interval
bss_expire_age = set BSS expiration age parameter
bss_expire_count = set BSS expiration scan count parameter
bss_flush = set BSS flush age (0 by default)
stkstart = request STK negotiation with
ft_ds = request over-the-DS FT with
wps_pbc [BSSID] = start Wi-Fi Protected Setup: Push Button Configuration
wps_pin [PIN] = start WPS PIN method (returns PIN, if not hardcoded)
wps_check_pin
wps_cancel Cancels the pending WPS operation
wps_reg = start WPS Registrar to configure an AP
wps_ap_pin [params..] = enable/disable AP PIN
wps_er_start [IP address] = start Wi-Fi Protected Setup External Registrar
wps_er_stop = stop Wi-Fi Protected Setup External Registrar
wps_er_pin
wps_er_pbc
wps_er_learn
wps_er_set_config
wps_er_config
ibss_rsn = request RSN authentication with in IBSS
sta = get information about an associated station (AP)
all_sta = get information about all associated stations (AP)
deauthenticate = deauthenticate a station
disassociate = disassociate a station
chan_switch
suspend = notification of suspend/hibernate
resume = notification of resume/thaw
drop_sa = drop SA without deauth/disassoc (test command)
roam = roam to the specified BSS
p2p_find [timeout] [type=*] = find P2P Devices for up-to timeout seconds
p2p_stop_find = stop P2P Devices search
p2p_connect <“pbc”|PIN> [ht40] = connect to a P2P Device
p2p_listen [timeout] = listen for P2P Devices for up-to timeout seconds
p2p_group_remove
p2p_group_add [ht40] = add a new P2P group (local end as GO)
p2p_prov_disc
p2p_get_passphrase = get the passphrase for a group (GO only)
p2p_serv_disc_req
p2p_serv_disc_cancel_req
p2p_serv_disc_resp
p2p_presence_req [
p2p_ext_listen [
p2p_remove_client = remove a peer from all groups
sta_autoconnect <0/1> = disable/enable automatic reconnection
tdls_discover = request TDLS discovery with
tdls_setup = request TDLS setup with
tdls_teardown = tear down TDLS with
signal_poll = get signal parameters
pktcnt_poll = get TX/RX packet counters
reauthenticate = trigger IEEE 802.1X/EAPOL reauthentication
raw
flush = flush wpa_supplicant state
radio_work = radio_work
Configuration
Setwpa_supplicant.confto the following:
You have to change the values according to the response of
# wpa_passphrase
.
For WPA-PSK
ctrl_interface=/var/run/wpa_supplicantctrl_interface_group=0eapol_version=1# ap_scan=2 was the one for me you may try 0 or 1 indstead of 2ap_scan=2fast_reauth=1network={ssid="my_network"proto=WPAkey_mgmt=WPA-PSKpairwise=TKIPgroup=TKIPpsk="secret_password"}
For WPA2-Personal
ctrl_interface=/var/run/wpa_supplicantctrl_interface_group=0ap_scan=1network={ssid="my_network"proto=RSNkey_mgmt=WPA-PSKpairwise=CCMP TKIPgroup=CCMP TKIPpsk="secret_password"}
Bringing up the network card manually
Bring up the network interface with
# ifconfig ath0
.
NOTE!
At the moment there is a problem within the madwifi driver or wpa_supplicant passing dhcp. That??s why I use a fixed IP.
There are two patches one for wpa_supllicant (http://hostap.epitest.fi/bugz/show_bug.cgi?id=63) and one for madwifi
(http://article.gmane.org/gmane.linux.drivers.madwifi.devel/1275). Each one is supposed to work.
Change the routes and add the default gateway.
Bringing up the device at boottime (forGentoousers)
Make a symbolic link
# cd /etc/init.d/
# ln -s net.lo net.ath0
Copywpa_supplicant.confto/etc/conf.d/wpa_supplicant.
Edit/etc/conf.d/net
##net#modules=( "wpa_supplicant" )wpa_supplicant_ath0="-Dmadwifi"modules=( "wpa_supplicant" )wpa_timeout_ath0=60config_ath0=("netmask 255.255.255.0")routes_ath0=("default gw ")
Add net.ath0 to the default runlevel by executing
# rc-update add net.ath0 default
Make sure all needed modules are in/etc/modules.autoload/2.x
iw的編譯和配置運(yùn)行
iwis a new nl80211 (802.11 netlink interface) based CLI configuration utility for wireless devices.
Netlink Protocol Library Suite
iw requires theNetlink Protocol Library Suite (libnl)
Download, cross compile and install the Netlink Protocol libraries:
wget http://www.infradead.org/~tgr/libnl/files/libnl-3.2.24.tar.gz
tar -xzf libnl-3.2.24.tar.gz
cd libnl-3.2.24
./configure --host=arm-linux-gnueabi --prefix=/usr/arm-linux-gnueabi
make
make install
cd include
make install
iw
With the Netlink Protocol Library Suite prerequisite installed, download and build theiwnl80211 based CLI configuration utility:
wget https://www.kernel.org/pub/software/network/iw/iw-3.15.tar.gz
tar -xzf iw-3.15.tar.gz
cd iw-3.15/
export PKG_CONFIG_PATH=/usr/arm-linux-gnueabi/lib/pkgconfig
export CC=arm-linux-gnueabi-gcc
make
Manually install iw and required libraries on your target root-fs:
cp iw /home/export/rootfs/sbin/
cp /usr/arm-linux-gnueabi/lib/libnl-genl-3.so.200 /home/export/rootfs/lib/
cp /usr/arm-linux-gnueabi/lib/libnl-3.so.200 /home/export/rootfs/lib/
And update the dynamic linker run-time bindings on your target:
ldconfig -v
hostapd
hostapdis an 802.11 Access Point and IEEE 802.1X/WPA/WPA2/EAP/RADIUS Authenticator daemon.
Download, extract and build hostapd:
wget http://hostap.epitest.fi/releases/hostapd-2.2.tar.gz
tar -xzf hostapd-2.2.tar.gz
cd hostapd-2.2/hostapd
cp defconfig .config
make CC=arm-linux-gnueabi-gcc
make install DESTDIR=/home/export/rootfs
rfkillhttp://houh-1984.blog.163.com
rfkillis a userspace tool to query the state of the rfkill switches.
Download, extract and build rfkill:
wgethttps://www.kernel.org/pub/software/network/rfkill/rfkill-0.5.tar.gz
tar -xzf rfkill-0.5.tar.gz
cd rfkill-0.5/
http://houh-1984.blog.163.com
make CC=arm-linux-gnueabi-gcc
評論