___________________________________
主机操作系统:Centos 6.5
交叉编译器环境:arm-linux-gcc-4.5.4
开发板平台: FL2440
Linux内核版本: 3.0
作者:songyong<handy_sky@outlook.com>
___________________________________
无线网卡:RT3070.
STA模式:笔记本上无线网卡模式,用来连接到无线路由器上上网。通俗点说,就是客户端模式(笔记本)
AP模式:即作为无线路由器,提供其他用户接入 (路由器)
RT3070的驱动移植:由上可知我们的驱动自然也有两种,分别支持无来线网卡工作在STA模式和AP模式。因为linux3.0以上的内核中已经含有了RT3070的通用mac80211驱动框架,所以我首先直接基于此并借助wpa_suppicant来实现WIFI的STA模式。
一、配置Linux内核支持wireless无线上网
[*] Networking support --->
-*- Wireless --->
<*> cfg80211 - wireless configuration API
[ ] nl80211 testmode command
[ ] enable developer warnings
[ ] cfg80211 regulatory debugging
[*] enable powersave by default
[ ] cfg80211 DebugFS entries
[*] cfg80211 wireless extensions compatibility
[*] Wireless extensions sysfs files
{*} Common routines for IEEE802.11 drivers
[ ] lib80211 debugging messages
<*> Generic IEEE 802.11 Networking Stack (mac80211)
Default rate control algorithm (Minstrel) --->
[ ] Enable mac80211 mesh networking (pre-802.11s) support
[ ] Export mac80211 internals in DebugFS
[ ] Select mac80211 debugging features --->
Device Drivers --->
Generic Driver Options --->
(/sbin/hotplug) path to uevent helper
[ ] Maintain a devtmpfs filesystem to mount at /dev
[ ] Select only drivers that don't need compile-time external firmware
[ ] Prevent firmware from being built
-*- Userspace firmware loading support
[*] Include in-kernel firmware blobs in kernel binary
() External firmware blobs to build into the kernel binary
[ ] Driver Core verbose debug messages
[ ] Managed device resources verbose debug messages
[*] Network device support --->
[*] Wireless LAN --->
<*> Ralink driver support --->
< > Ralink rt2500 (USB) support
< > Ralink rt2501/rt73 (USB) support
<*> Ralink rt27xx/rt28xx/rt30xx (USB) support
[ ] rt2800usb - Include support for rt33xx devices
[ ] rt2800usb - Include support for rt35xx devices (EXPERIMENTAL)
[ ] rt2800usb - Include support for rt53xx devices (EXPERIMENTAL)
[ ] rt2800usb - Include support for unknown (USB) devices
[*] Ralink debug output
二、无线网络配置工具Wireless tools和Wpa_supplicant以及Openssl移植
==================================================================================================================
目前可以使用wireless-tools或wpa_supplicant工具来配置无线网络。但要注意对无线网络的配置是全局性的,而非针对具体的接口。wpa_supplicant是一个较好的选择,但缺点是它不支持所有的驱动。另外,wpa_supplicant目前只能连接到那些你已经配置好ESSID的无线网络。而wireless-tools支持几乎所有的无线网卡和驱动,但它不能连接到那些只支持WPA的AP。
===================================================================================================================
Wireless tools for Linux是一个Linux命令行工具包,用来设置支持Linux Wireless Extension的无线设备。
1.1、资源下载
wireless_tools.29.tar.gz
1.2、解压
#tar zxvf wireless_tools.29.tar.gz
#cd wireless_tools.29
1.3、修改Makefile
11 ## Compiler to use (modify this for cross compile).
12 CC = /opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc
13 ## Other tools you need to modify for cross compile (static lib only).
14 AR = /opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-ar
15 RANLIB = /opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-ranlib
1.4编译
#make
1.5、拷贝
将生成的命令工具:iwlist、iwconfig、iwpriv,libiw.so.29 等拷贝到目标板上,路径为:分别把他们放到开发板的/bin和/lib目录下,并赋予权限chmod 777 iw* libiw.so.29
2.Openssl工具和wpa_supplicant工具驱动移植
======================================================================================================
现在的wifi网络肯定都是加密的。而大多都是WPA加密,所以wpa_supplicant对我们来说除了配置无线网络的需求之外,它更主要是用来支持WEP,WPA/WPA2和WAPI无线协议和加密认证的。而要加密就要使用到相关的加密算法,常用的密钥等,所以我们要先移植Openssl工具再移植wpa-supplicant。因为后面编译wpa_supplicant要依赖openssl中的lib和include
===================================================================================================================
2.1、下载openssl驱动源码
2.1.1、解压后
[pikaqiu@centos6 openssl-0.9.8i]$ mkdir install
2.1.2、修改Makefile
29 INSTALLTOP=/home/pikaqiu/tools/openssl-0.9.8i/install//指定ssl的安装目录
32 OPENSSLDIR=/home/pikaqiu/tools/openssl-0.9.8i/install
62 CC= /opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc
69 AR= /opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-ar $(ARFLAGS) r
70 RANLIB= /opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-ranlib
2.1.3、编译
# sudo make & make install 并拷贝libcrypto.a ; libssl.a到开发板的/lib下
2.2、下载wpa_supplicant源码
2.2.1、解压后修改.config配置文件
[pikaqiu@centos6 wpa_supplicant-0.7.3]$ls
COPYING ;patches ;README ;src ;wpa_supplicant
[pikaqiu@centos6 wpa_supplicant-0.7.3]$ cd wpa_supplicant/
[pikaqiu@centos6 wpa_supplicant]$ cp defconfig .config
[pikaqiu@centos6 wpa_supplicant]$ vim .config
修改如下:
27 #CC=/opt/brcm/hndtools-mipsel-uclibc/bin/mipsel-uclibc-gcc
28 CC= /opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc -L/home/pikaqiu/tools/openssl-0.9.8i/install/lib
29 #CFLAGS += -Os
30 CFLAGS += -I/home/pikaqiu/tools/openssl-0.9.8i/install/include
31 #CPPFLAGS += -I../src/include -I../../src/router/openssl/include
32 #LIBS += -L/opt/brcm/hndtools-mipsel-uclibc-0.9.19/lib -lssl
33 LIBS += -L/home/pikaqiu/tools/openssl-0.9.8i/install/lib
2.2.2、编译
[pikaqiu@centos6 wpa_supplicant]$ make
三、启动RT3070无线模块连接路由器
3.1配置无线网络
==========================================================================================
上面我们说过,我们既可以通过wireless tools工具提供的命令来配置和搜索无线网络,也可以通过wpa_supplicant来配置.因为实验室的无线网信息均为已知,所以我这里不用iwlist搜索周围网络而直接采用wpa_supplicant来配置。
==========================================================================================
3.1.1 使用wpa_passphrase创建wpa_supplicant的配置文件
以下命令均在开发板上进行操作:
/apps/wireless/Sta # wpa_passphrase CMCC 2b2072b207 >> wpa_supplicant.conf
/apps/wireless/Sta # cat wpa_supplicant.conf
修改wpa_supplicant.conf:
ctrl_interface=/var/run/wpa_supplicant
network={
ssid="Router_LingYun" //已知要连接的路由器的名字
key_mgmt=WPA-PSK //采用WPA-PSK加密模式
proto=WPA2
pairwise=TKIP CCMP
group=TKIP CCMP
psk="lingyun-emb" //路由器密码
#psk=20a17fe2e0482c0db4e4dcf6c4494cebbd88ae4f166015115ca83ce9022b8cd2
}
pairwise = TKIP CCMP和group =TKIP CCMP表示自动匹配加密算法CCMP或TKIP;
3.1.2 使能RT3070无线网卡模块
>: ifconfig wlan0 up
这时候我遇到了一个错误
下载:
Rt2870.bin
http://download.csdn.net/detail/u010944778/8918841
解决办法:
我是到内核网站
git clone git://git.kernel.org/pub/scm/linux/kernel/git/dwmw2/linux-firmware.git
把各种固件都下了。其实将下载好的固件 RT2870.bin并放入/lib文件下新创建的firmware目录中就可以解决。
再次使能:
3.1.3 启动RT3070并配置RT3070无线网卡参数
我们依旧利用wpa_supplicant工具来配置
在开发板执行:
#wpa_supplicant -B -d -Dwext -iwlan0-c/apps/wireless/Sta/wpa_supplicant.conf
-d :增加调试信息
-B:后台守护进程
-c:指定配置文件
-Dwext:wext为驱动名称
-iwlan0 :wlan0为网络接口名称
配置无线网卡IP和子网掩码
>:ifconfig wlan0 192.168.1.33 broadcast 192.168.1.1 netmask 255.255.255.0 up
成功连上如上目标无线网络。
3.1.4 测试
先关闭eth0
如上就是利用wpa_supplicant配置无线网卡,并实现ping通无线路由器。但可能是因为没有设置网关和DNS地址解析,还ping不通外网。
===============================================================================
而我想要的是板子自己去动态随机获取IP联网,这样可以不用给wlan0指定IP。接下我们来完成这个功能。
===============================================================================
首先我们在busybox里面make menuconfig配置好udhcp server(udhcpd)和udhcp client(udhcpc)两个选项并编译,同时将新的内核放到开发板上。
然后从busybox的examples/udhcp/下copy好simple.script文件到开发板/usr/share/udhcpc/下,并重命名为default.script.
注:(busybox里面默认的目录文件是/usr/share/udhcpc/default.script)
在上面启动无线网卡后我们便可以直接在开发板上面执行命令动态获取IP。
如上,利用wpa_supplicant和udhcpc实现动态获取wifi上网的功能就完成了。
———————————————————————————————————————
RT3070与FL2440实现路由器功能,并使客户端成功联网
———————————————————————————————————————
一、配置内核支持无线网卡softAP模式
如果没有build in RF选项,在使用hostapd命令时会出错
一、配置无线网络的软件移植
1.移植Openssl-0.9.8e
Hostapd依赖于openssl与libnl这两个库。所以首先要移植openssl与libnl,openssl我们已经移植过了,但我担心版本兼容性的问题,本着学习的心态便又移植了网上普遍使用的openssl-0.9.8e
1.1下载Openssl-0.9.8e
Openssl-0.9.8e
http://download.csdn.net/detail/u010944778/8940135
1.2解压之后直接修改Makefile
# mkdir install
# sudo make && make install
2.移植libnl
2.1下载libnl
libnl
http://download.csdn.net/detail/u010944778/8940293
2.2解压后创建指定安装目录
# mkdir install
2.3编译&&安装libnl
./configure --prefix=/home/pikaqiu/tools/WIFI/libnl-1.1/install(指定安装路径) --host=arm-linux
# make CC= /opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc
# sudo make install
将/install下的lib文件夹中的libnl.so.1拷贝到开发板/lib目录下。
3.移植Hostapd
hostapd-1.0.tar.gz
http://download.csdn.net/detail/u010944778/8940421
3.2修改.config与Makefile
# cp defconfig .config
#vim .config
#vim Makefile
分别添加openssl和libnl的头文件和库路径
# make CC=/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc
# sudo make install
将生成可执行命令hostapd和配置文件hostapd.conf
hostapd主要就在于配置文件,以下是我的基本配置:
interface=wlan0 //网络接口名称
driver=nl80211 //默认使用nl80211无线驱动
ssid=My_wifi //热点名称
channel=3 //设定无线频道
hw_mode=g //使用80211g协议标准
ignore_broadcast_ssid=0 //
auth_algs=1 //指定OSA认证算法
wpa=3 //指定WPA/WPA2类型
wpa_passphrase=11111111//指定认证密钥
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
//启用了WPA或WPA2则需要指定wpa_pairwise或rsn_pairwise。
rsn_pairwise=CCMP
===================================================================
无线局域网标准 IEEE 802.11协议
*IEEE 802.11, 1997年,原始标准(2Mbit/s,工作在2.4GHz)。
*IEEE 802.11a,1999年,物理层补充(54Mbit/s,工作在5GHz)。
*IEEE 802.11b,1999年,物理层补充(11Mbit/s工作在2.4GHz)。
*IEEE 802.11g,2003年,物理层补充(54Mbit/s,工作在2.4GHz)。
使用最多的应该是802.11n标准,工作在2.4GHz频段,可达600Mbps(理论值)
===================================================================
在板子上直接执行hostapd -B hostapd.conf 即可;
如果编译过程出现缺少库的错误,请自行检查你hostapd所依赖的libnl库和openssl库是否成功交叉编译。
若出现读取random随机数错误,可采用符号链接的方法解决:
# mv /dev/random /dev/random.org
# ln -s /dev/urandom /dev/random
=========================================================================================
Linux中的随机数可以从两个特殊的文件中产生,一个是/dev/urandom.另外一个是/dev/random。上述两种方式都可以产生随机数,dev/urandom 和dev/random都是产生用不为空的随机字符流,但区别是:/dev/random设备会封锁,直到系统产生的随机字符流已经充分够用,所以耗用时间较长。/dev/urandom设备不会封锁,数据的随机程度不高,但是一般情况已经够用。
=========================================================================================
更详细的文章链接:http://www.linuxidc.com/Linux/2012-05/60476.htm
4.配置udhcpd
修改/opt/busybox-1.20.2/examples/udhcp/udhcpd.conf然后拷贝到开发板/etc目录下。
因为是实现最基础的功能,所以我们只要简单的修改地址池、默认网关以及dns即可。
以下是我的配置:
因为udhcpd和udhcpc一样都是busybox里面自带的命令。所以我直接把配置文件放到开发板上再执行命令
# udhcpd /etc/udhcpd.conf //就可以启动dhcp服务器了。
Udhcpd在执行的时候可能会提示没有一个叫做udhcpd.release的租赁文件,这个只要在相应的文件夹下创建即可。执行下面两条命令:
#mkdir -p /var/lib/misc/
#touch /var/lib/misc/udhcpd.leases
PS:在做的时候我参考过网上udhcpd.conf的那些配置,试了两次行不通,便直接使用原始配置文件了。我觉得主要是因为我们使用的udhcpd.conf是busybox内的,而网上的是给pc上虚拟机linux系统使用的。不尽相同,但是感兴趣有时间的人还是可以多试试。
4.iptables移植
===============================================================================
iptables简介
iptables是基于内核的防火墙,功能非常强大,iptables内置了filter,nat和mangle三张表。
Filter表负责过滤数据包,包括的规则链有,input,output和forward;
Nat表则涉及到网络地址转换,包括的规则链有,prerouting,postrouting和output;
Mangle表则主要应用在修改数据包内容上,用来做流量整形的。
默认的规则链有:INPUT,OUTPUT,NAT,POSTROUTING,PREROUTING;
INPUT匹配目的IP是本机的数据包,FORWARD匹配流经本机的数据包,PREROUTING用来修改目的地址用来做DNAT,POSTROUTING用来修改源地址用来做SNAT。
===============================================================================
http://download.csdn.net/detail/u010944778/8945513
[pikaqiu@centos6 iptables-1.4.12]$mkdir install
[pikaqiu@centos6iptables-1.4.12]$ ./configure
--host=arm-linux --enable-static --disable-shared --prefix=/home/pikaqiu/tools/iptables-1.4.12/install --disable-ipv6 --disable-largefile
[pikaqiu@centos6iptables-1.4.12]$make CC=/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc CFALGS=--static LDFLAGS=-static
[pikaqiu@centos6 iptables-1.4.12]$sudo make install
=====================================================================================
再理解一次CFLAGS和LDFLAGS:一般我们通过CFLAGS的 -I 选项告诉编译器所依赖的第三方的库的头文件在哪里,通过LDFLAGS的-L选项告诉链接器这些库的库文件在哪里;还有LIBS是告诉链接器要链接哪些库文件。简单地说,LDFLAGS是告诉链接器从哪里寻找库文件,而LIBS是告诉链接器要链接哪些库文件。有时候LIBS指定了却找不到库时可以试试LDFLAGS。
=====================================================================================
# cd /install/sbin
# file *
# sudo /opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-strip xtables-multi
strip减轻点重量
此时将/install/lib文件夹和xtables-multi打包放到开发板/lib和/bin目录下,赋予权限后将xtables-multi改名为iptables
有了iptables命令工具之后我们便要来配置nat转发表,如下:
# /apps/wireless/softAP/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
// 将局域网内地址通过eth0接口伪装后转发出去
# /apps/wireless/softAP/iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISH -j ACCEPT
//对于已经建立连接的包以及该连接相关的包都允许通过!
# /apps/wireless/softAP/iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT
// 配置数据包转发时候的接口
====================================================================================
关于iptables的nat参考:
MASQUERADE是SNAT网络地址转换的一种,SNAT的使用方法,即可以NAT成一个地址,也可以NAT成多个地址,但是,对于SNAT,不管是几个地址,必须明确的指定destination的ip.如果eth0是动态拨号获取IP,那就需要MASQUERADE来实现SNAT。而我的eth0是接到路由器VAN上的,虽然路由器是拨号上网,但是我的eth0是自己指定的IP,每次都不会变,所以应该也可以使用SNAT的方式来配置iptables。不过我觉得MASQUERADE更方便,这就当为3G动态拨号直连做预热吧。
====================================================================================
参考文档:
http://soft.zdnet.com.cn/techupdate/2008/0317/772069.shtml
http://www.cnblogs.com/argb/p/3535179.html
http://blog.chinaunix.net/uid-26495963-id-3279216.html iptables详解
由开头知我GCC编译器先是静态编译生成静态库文件最后静态链接生成的可执行程序。起初我是放任它编译,动态链接生成可执行文件,然后直接把install下的/lib和/extensive里的.so全部拷贝到开发板上,再全放进文件系统的/lib和/bin目录下。
但这样执行时提示我出错:
>: ./apps/wireless/ap/softAP/iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
iptables v1.4.12: Couldn't load target `MASQUERADE':No such file or directory
Try `iptables -h' or 'iptables --help' for more information.
而报错的MASQUERADE库我的lib下是存在的,在反复检查内核配置MASQUERADE相关选项后我怀疑是有些相互依赖的库没有被拷贝到开发板上。因为我一时找不到到底是哪些库,于是直接在make时指定环境变量静态链接。问题解决。
所有的准备就绪后,我们一定要记得先实现eth0能上网。我就是在这里磨了2天,还以为是ipables的nat转发命令的问题。连上路由器如果eth0都上不了网,自然谈不上转发。eth0要上网的话我们只要再给网关和DNS就可以了。
#route add default gw 192.168.1.1 //设置默认网关为192.168.1.1 ;只有eth0联网,这个缺省就行。
至于DNS,linux系统并没有直接配置DNS的命令行。网上都说在/etc/resolv.conf中修改,我们回顾STA模式DHCPC自动分配IP的时候打印信息也有个recreating /etc/resolv.conf因为我在做根文件系统的时候并没有在/etc目录下创建resolv.conf,于是我又到文件系统目录树里面创建了一个。在新建的resolv.conf里面添加nameserver:114.114.114.114//DNS
然后连上的wifi热点就可以上网了。至此使用hostapd+udhcpd+iptables等工具基于内核mac80211驱动框架就实现了RT3070无线网卡的softAP!!!
附上简图:
#!/bin/sh
# Copyright (C) 2015 songyong<handy_skyoutlook.com>
# This script is used to start Wifi
export Sta=/apps/wireless/Sta //可自行更改为自己的存放路径.
export AP=/apps/wireless/softAP
read -p "choice Wifi mode(Sta or AP):" mode
echo "Worked on $mode now"
if [ $mode = Sta ]; then
cp $Sta/libcrypto.a /lib
cp $Sta/libssl.a /lib
cp $Sta/wpa_supplicant /bin
mkdir -p /lib/firmware
cp $Sta/rt2870.bin /lib/firmware
ifconfig wlan0 up
wpa_supplicant -B -d -Dwext -iwlan0 -c$Sta/wpa_supplicant.conf
#ifconfig wlan0 192.168.1.33 broadcast 192.168.1.1 netmask 255.255.255.0 up
cp $Sta/default.script /usr/share/udhcpc/
udhcpc -i wlan0
ifconfig eth0 down
exit
fi
if [ $mode = AP ]; then
mkdir /lib/firmware
cp /apps/wireless/Sta/rt2870.bin /lib/firmware/
mv /dev/random /dev/random.org
ln -s /dev/urandom /dev/random
mkdir -p /var/lib/misc/
touch /var/lib/misc/udhcpd.leases
ifconfig wlan0 192.168.2.1
ifconfig eth0 192.168.1.2 netmask 255.255.255.0 up
route add default gw 192.168.1.1
cp $AP/libnl.so.1 /lib
$AP/hostapd -B $AP/hostapd.conf
udhcpd $AP/udhcpd.conf
echo "1" >/proc/sys/net/ipv4/ip_forward
$AP/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
$AP/iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j
$AP/iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT
exit
fi