从官网下载相对而言比较干净的源码版本http://w1.fi/hostapd/,然后将其移植到openwrt下,方便在源码阅读时候进行调试编译,移植的过程总结如下心得。
1. openwrt编译与clean均会先读取buildroot根目录下的.config文件,以确认哪些软件包与选项需要编译与清除,即使你针对某个包进行编译与clean,例如:
make package/network/services/hostapd/clean V=s
打印信息将会出现两次进入:make[2]: Entering directory `/work/to/buildroot/package/network/services/hostapd'
2. OP编译环境buildroot中常常会出现BUILD_VARIANT变量,该变量是在软件包定义控制器菜单里面定义的:
例如openvpn:
define Package/openvpn/Default
TITLE:=Open source VPN solution using $()
SECTION:=net
CATEGORY:=Network
URL:=http://openvpn.net
SUBMENU:=VPN
MENU:=
DEPENDS:=+kmod-tun +OPENVPN_$()_ENABLE_LZO:liblzo +OPENVPN_$()_ENABLE_IPROUTE2:ip $()
VARIANT:=$()
MAINTAINER:=Mirko Vogt <[email protected]>
endef
然后buildroot根据.config读取编译目标与顺序,进行编译,从而带入该变量,该量适用于一个软件工程中包含多个组件的情况。
3. 关于openwrt下hostapd依赖问题说明
a. DEPENDS:=@PACKAGE_hostapd表示只有变量PACKAGE_hostapd被定义了,该组件(包)才会显示菜单
b. DEPENDS:=uhttpd表示只有选择了uhttpd,该组件(包)才会显示在菜单中,被选择,并且选择状态不能高于uhttpd(例如:uhttpd为模块-M,那么该组件最多也是模块或者不选择)
c. DEPENDS:=+liblua表示该组件(包)被选择后,其依赖liblua也会被选择。
d. DEPENDS:=+PACKAGE_arpd:libpcap, 选择该组件(包),如果arpd被成功选择了,将自动选择libpcap
4. 最后我们来看看openwrt下hostapd源码组织结构
buildroot编译配置树:
hostapd
├── Config.in
├── files
├── Makefile
└── patches
Config.in提供选择额外组件与功能选项,files为hostapd的相关配置文件、启动脚本等,根据上一篇文章,op下的hostapd是由netifd管理的,所以与常规的op启动配置有点不同,Makefile为功能选择主菜单配置,patches为hostapd官方或者感言提供的补丁。
hostapd源码树:
├── Android.mk
├── build_release
├── CONTRIBUTIONS
├── COPYING
├── doc
├── eap_example
├── hostapd
├── hs20
├── ipkg-ar71xx
├── mac80211_hwsim
├── patches
├── radius_example
├── README
├── src
├── tests
├── wlantest
├── wpadebug
├── wpaspy
└── wpa_supplicant
其中,本系列主要讨论hostapd,那么该源码树相关的有(http://w1.fi/wpa_supplicant/devel/dir_22f5a0c5f1f5dd1a61a0e5968e7769c4.html):
hostapd:hostapd主程序与控制接口主程序源码。
src: 主要是扩展组件:
├── ap
├── common
├── crypto
├── drivers
├── eap_common
├── eapol_auth
├── eapol_supp
├── eap_peer
├── eap_server
├── l2_packet
├── lib.rules
├── Makefile
├── p2p
├── pae
├── radius
├── rsn_supp
├── tls
├── utils
└── wps
其它相关均为测试与认证客户端相关源码,暂时可以先不关心。