本文最后更新于 28 天前,其中的信息可能已经有所发展或是发生改变。
笔者注
本文涉及到的hostapd源码均为hostapd-2019-08-08-ca8c2bd2即2.9版本
1. 文件目录结构
hostapd目录结构如下
.
├─doc
├─eap_example
├─hostapd
├─hs20
├─radius_example
├─src
│ ├── ap
│ ├── common
│ ├── crypto
│ ├── drivers
│ ├── eap_common
│ ├── eapol_auth
│ ├── eapol_supp
│ ├── eap_peer
│ ├── eap_server
│ ├── fst
│ ├── l2_packet
│ ├── lib.rules
│ ├── Makefile
│ ├── p2p
│ ├── pae
│ ├── radius
│ ├── rsn_supp
│ ├── tls
│ ├── utils
│ └── wps
├─tests
├─wlantest
├─wpadebug
├─wpaspy
└─wpa_supplicant
其中各个目录的主要功能如下
- hostapd
特定于hostapd的代码,用于配置、控制接口和AP管理 - wpa_supplicant
特定于wpa_supplicant的代码,用于配置、控制接口和客户端管理 - src
与IEEE 802.11规范相关的功能、hostapd和wpa_supplicant都会调用的API统一在这里实现,其中包含数个独立的小模块 - wpaspy
该部分代码允许可以通过Python来访问hostapd/wpa_spllicant的控制接口 - wpadebug
为Andoid平台开发的调试接口。开发者可以通过Android framework对hostapd/wpa_supplicant进行调试 - wlantest
简易的抓包功能,既可以在monitor模式下使用,也可以在普通模式下使用 - tests
该目录下是用于测试hostapd/wpa_supplicant的一些工具 - radius_example
此目录包含一个示例,显示如何将hostapd的RADIUS客户机功能用作另一个程序中的库 - hs20
此目录是Hotspot 2.0的示例代码,包括server和client两部分 - eap_example
该目录包含一个示例,说明如何将wpa_supplicant和hostapd中的EAP peer和server代码以库的方式使用 - doc
该目录包含hostapd和wpa_supplicant的doxygen文档
由于hostapd的模块设计,其源码中每个小模块均包含一个单独的makefile文件,例如hostapd目录下包含着编译hostapd主程序的makefile;而src目录下每个小模块均有自己的独立的makefile文件。故本文只对hostapd目录进行讨论
2. 编译方法
如果只想编译源代码,直接在源代码目录$(WORKSPACE)/hostapd运行命令
cp defconfig .config
make clean
make hostapd或make all
3. 从编译脚本看
笔者注:这里仅讨论./hostapd目录下的编译脚本
从编译脚本来看可以快速的看到整个软件的整体架构是什么样子
3.1 依赖库
hostapad编译时使用到了如下的依赖库
- 标准库
-lrt:实时库,用于支持clock_gettime()等函数(在glibc版本低于 2.17 时需要)-lm:数学库,用于支持数学函数(如sin、cos等)
- 网络相关库
-lpcap:用于数据包捕获(如libpcap)-ldnet:用于低级网络操作(如libdnet)-lws2_32:Windows 套接字库(仅在 Windows 平台上使用)
- 加密相关库
-lssl和-lcrypto:OpenSSL库,用于加密和安全通信-lwolfssl:WolfSSL库,轻量级的SSL/TLS实现-lgnutls:GnuTLS库,用于加密和安全通信-lgcrypt:GnuPG的加密库-ltomcrypt和-ltfm:LibTomCrypt和LibTomMath库,用于加密和数学运算
- 调试和跟踪相关库
-ldl:动态链接库,用于加载动态库-lbfd:二进制文件描述库(Binary File Descriptor library),用于调试和跟踪-liberty:GNU的辅助库,通常与-lbfd一起使用-lz:zlib压缩库,用于支持压缩功能
- 数据库相关库
-lsqlite3:SQLite数据库库,用于存储和查询数据。
- 其他库
-lgmp:GNU多精度数学库,用于高精度数学运算。-lgpg-error:GPG错误处理库,用于支持GnuPG
总结
hostapd中使用的库涵盖了以下功能:
- 加密和安全通信:
OpenSSL、WolfSSL、GnuTLS、LibTomCrypt等 - 网络操作:
libpcap、libdnet、ws2_32 - 调试和跟踪:
libbfd、liberty、zlib - 数学运算:
libm、libgmp - 数据库支持:
SQLite
这些库的使用是根据配置选项(如 CONFIG_TLS、CONFIG_SQLITE 等)动态决定的
3.2 编译宏
笔者注:这里仅讨论./hostapd目录下的编译宏选项
hostapd的源码中默认提供了一份编译选项,名称命名为defconfig,这里列出其中的编译选项
| 编译选项 | 作用 |
|---|---|
CONFIG_DRIVER_HOSTAP | 如果启用了该宏,hostapd会加载与Host AP驱动相关的代码模块,并通过该接口与无线网卡通信。否则,相关代码将不会被编译进hostapd |
CONFIG_DRIVER_WIRED | CONFIG_DRIVER_WIRED 宏的作用是启用 有线认证器驱动接口 的支持 |
CONFIG_DRIVER_NL80211 | 启用 nl80211 驱动接口 的支持,启用该宏后,hostapd将通过 nl80211 接口与无线网卡通信 |
CONFIG_DRIVER_NL80211_QCA | 启用 Qualcomm Atheros (QCA) 扩展功能 对 nl80211 驱动接口的支持 |
CONFIG_LIBNL20 | 指定hostapd在编译时使用 libnl 2.0 或更高版本 的库。 |
CONFIG_LIBNL32 | 指定hostapd在编译时使用 libnl 3.2 或更高版本 的库 |
CONFIG_DRIVER_BSD | 启用 FreeBSD 的 net80211 驱动接口 支持,需要注意的是此宏仅适用于FreeBSD系统 |
CONFIG_DRIVER_NONE | 启用 无驱动模式,即在没有无线网卡驱动的情况下运行hostapd。此模式通常用于仅作为 RADIUS 服务器 或 测试环境,hostapd 将不依赖任何无线网卡驱动接口(如 nl80211 或 hostap),而是运行在一个独立的模式下。 |
CONFIG_IAPP | 启用 IEEE 802.11F/IAPP(Inter-Access Point Protocol) 支持;CONFIG_IAPP 用于在hostapd中启用IEEE 802.11F/IAPP协议支持,适用于需要在多AP部署中实现客户端无缝漫游的场景 |
CONFIG_RSN_PREAUTH | CONFIG_RSN_PREAUTH用于在 hostapd中启用 RSN 预认证功能,适用于需要支持快速漫游的无线网络场景。它通过减少切换延迟,提升用户的漫游体验 |
CONFIG_IEEE80211W | CONFIG_IEEE80211W用于在 hostapd中启用 IEEE 802.11w 管理帧保护功能,提升无线网络的安全性,防止伪造管理帧的攻击 |
CONFIG_OCV | CONFIG_OCV 用于在 hostapd中启用操作信道验证功能,提升无线网络的安全性,防止信道切换攻击和中间人攻击 |
CONFIG_ERP | CONFIG_ERP用于在hostapd中EAP Re-authentication Protocol(ERP,EAP 重新认证协议) 的支持,以优化无线客户端在漫游时的认证过程 |
CONFIG_EAP_MD5 | CONFIG_EAP_MD5 用于在 hostapd中启用EAP-MD5(Message Digest 5)认证方法的支持,适用于简单的网络环境或测试场景。然而,由于其安全性较低,不建议在生产环境或需要高安全性的网络中使用 |
CONFIG_EAP_TLS | CONFIG_EAP_TLS用于在hostapd中启用EAP-TLS(Extensible Authentication Protocol - Transport Layer Security) 认证方法的支持,适用于需要高安全性和基于证书认证的无线网络场景,它是WPA2-Enterprise和WPA3-Enterprise的核心认证方法,广泛应用于企业和高安全性环境 |
CONFIG_EAP_MSCHAPV2 | CONFIG_EAP_MSCHAPV2 用于在hostapd中EAP-MSCHAPv2(Microsoft Challenge Handshake Authentication Protocol version 2) 认证方法的支持,适用于需要基于用户名和密码认证的企业无线网络。它通常与 EAP-PEAP 或 EAP-TTLS 结合使用,以提供更高的安全性 |
CONFIG_EAP_PEAP | CONFIG_EAP_PEAP用于在 hostapd中启用 EAP-PEAP(Protected Extensible Authentication Protocol) 认证方法的支持,适用于需要高安全性和保护认证数据的无线网络场景。它是 WPA2-Enterprise 和 WPA3-Enterprise 的常用认证方法之一,广泛应用于企业环境 |
CONFIG_EAP_GTC | CONFIG_EAP_GTC 用于在 hostapd 中启用EAP-GTC(Generic Token Card)认证方法的支持,适用于基于令牌卡的认证系统或简单的用户名密码认证场景。由于其缺乏内置的加密保护,通常需要与 EAP-TTLS 或 EAP-PEAP 结合使用,以确保认证数据的安全性 |
CONFIG_EAP_TTLS | CONFIG_EAP_TTLS用于在 hostapd中启用EAP-TTLS(Tunneled Transport Layer Security)认证方法的支持,适用于需要高安全性和灵活认证的无线网络场景。它通过 TLS 隧道保护认证数据,并支持多种内部认证协议,是WPA2-Enterprise和WPA3-Enterprise的常用认证方法之一 |
CONFIG_EAP_SIM | CONFIG_EAP_SIM 用于在hostapd中启用 EAP-SIM(Subscriber Identity Module)认证方法的支持,适用于需要基于SIM卡认证的无线网络场景,特别是在与 GSM 网络集成的环境中 |
CONFIG_EAP_AKA | CONFIG_EAP_AKA 用于在hostapd中启用EAP-AKA(Authentication and Key Agreement)认证方法的支持,适用于需要基于USIM卡认证的无线网络场景,特别是在与UMTS或LTE网络集成的环境中 |
CONFIG_EAP_AKA_PRIME | CONFIG_EAP_AKA_PRIME用于在hostapd中启用EAP-AKA(EAP-AKA Prime)认证方法的支持,适用于需要基于 USIM/ISIM卡认证的无线网络场景,特别是在与LTE或5G网络集成的环境中。它是EAP-AKA的增强版本,提供更高的安全性和更现代化的认证机制 |
CONFIG_EAP_PAX | CONFIG_EAP_PAX用于在hostapd中启用 EAP-PAX(Password Authenticated Exchange)认证方法的支持,适用于资源受限设备或无需复杂证书管理的场景 |
CONFIG_EAP_PSK | CONFIG_EAP_PSK用于在hostapd中启用EAP-PSK(Pre-Shared Key) 认证方法的支持,适用于资源受限设备或无需复杂证书管理的场景 |
CONFIG_EAP_PWD | CONFIG_EAP_PWD用于在hostapd中启用EAP-pwd(Password-based Authentication) 认证方法的支持,适用于需要基于密码的高安全性无线网络场景。它通过密码验证密钥交换协议提供强大的安全性,同时避免了证书管理的复杂性,是一种轻量级但安全的认证方法 |
CONFIG_EAP_SAKE | CONFIG_EAP_SAKE用于在hostapd中启用EAP-SAK(Shared-secret Authentication and Key Establishment) 认证方法的支持,适用于资源受限设备或无需复杂证书管理的场景 |
CONFIG_EAP_GPSK | CONFIG_EAP_GPSK 用于在 hostapd中启用EAP-GPSK(Generalized Pre-Shared Key) 认证方法的支持,适用于资源受限设备或无需复杂证书管理的场景 |
CONFIG_EAP_GPSK_SHA256 | CONFIG_EAP_GPSK_SHA256用于为EAP-GPSK(Generalized Pre-Shared Key) 认证方法启用SHA-256 加密套件的支持,显著提升认证过程的安全性。它适用于需要更高安全性但仍希望保持轻量级认证的无线网络场景 |
CONFIG_EAP_FAST | CONFIG_EAP_FAST用于在hostapd中启用EAP-FAST(Flexible Authentication via Secure Tunneling) 认证方法的支持,适用于无需证书但需要高安全性的无线网络场景。它通过PAC提供安全隧道,简化了证书管理,但需要注意PAC的安全性和管理复杂性 |
CONFIG_EAP_TEAP | CONFIG_EAP_TEAP用于在hostapd中启用EAP-TEAP(Tunneled EAP Protocol) 认证方法的支持,适用于需要高安全性和灵活认证的无线网络场景。它通过TLS隧道保护认证数据,并支持多阶段认证 |
CONFIG_WPS | CONFIG_WPS用于在hostapd中启用 Wi-Fi Protected Setup(WPS) 功能支持,适用于需要简化无线网络配置的场景 |
CONFIG_WPS_UPNP | CONFIG_WPS_UPNP用于在hostapd中启用Wi-Fi Protected Setup(WPS) 的UPnP(Universal Plug and Play)支持,允许外部设备通过UPnP协议管理无线网络的 WPS 配置 |
CONFIG_WPS_NFC | CONFIG_WPS_NFC 用于在hostapd中启用WPS的Wi-Fi Protected Setup(WPS)的NFC(Near Field Communication)配置方法 支持 |
CONFIG_EAP_IKEV2 | CONFIG_EAP_IKEV2 用于在hostapd中启用EAP-IKEv2(Internet Key Exchange version 2) 认证方法的支持,适用于需要高安全性和灵活认证的无线网络或VPN集成场景 |
CONFIG_EAP_TNC | CONFIG_EAP_TNC 用于在hostapd中启用EAP-TNC(Trusted Network Connect) 认证方法的支持,适用于需要动态网络访问控制和设备健康状态检查的场景 |
CONFIG_EAP_EKE | CONFIG_EAP_EKE 用于在hostapd中启用EAP-EKE(Extensible Authentication Protocol - Encrypted Key Exchange) 认证方法的支持,适用于需要基于密码的高安全性无线网络场景 |
CONFIG_PKCS12 | CONFIG_PKCS12用于在hostapd中启用对PKCS#12(Public-Key Cryptography Standards #12) 文件支持,允许直接加载包含私钥和证书的 .p12 或 .pfx 文件。它简化了证书管理 |
CONFIG_RADIUS_SERVER | CONFIG_RADIUS_SERVER 用于在hostapd中启用RADIUS(Remote Authentication Dial-In User Service)认证服务器 的支持,适用于需要集中式用户认证的企业网络或测试环境。它允许外部设备通过RADIUS协议与 hostapd的EAP服务器交互 |
CONFIG_IPV6 | CONFIG_IPV6用于在hostapd中启用IPv6支持,适用于需要在IPv6网络环境中运行的场景,特别是涉及RADIUS操作时。它确保hostapd能够处理基于IPv6的通信,同时保持对IPv4的兼容性 |
CONFIG_IEEE80211R | CONFIG_IEEE80211R用于在hostapd中启用IEEE 802.11r(快速基本服务集切换,Fast BSS Transition, FT) 支持,适用于需要低延迟切换的无线网络场景。它通过优化认证过程,显著提升了用户在多个AP之间切换时的体验 |
CONFIG_DRIVER_RADIUS_ACL | CONFIG_DRIVER_RADIUS_ACL 用于在hostapd中启用RADIUS ACL(Access Control List)驱动接口 的支持,适用于需要RADIUS认证但不需要完整IEEE 802.11管理功能的场景,特别是在FreeBSD系统中。它提供了灵活的用户认证和访问控制功能,但需要依赖外部RADIUS服务器 |
CONFIG_IEEE80211N | CONFIG_IEEE80211N 用于在hostapd中启用IEEE 802.11n(高吞吐量,High Throughput, HT) 支持,适用于需要高吞吐量和更高效无线网络的场景。它通过MIMO、信道绑定和帧聚合等技术,显著提升了无线网络的性 |
CONFIG_WNM | CONFIG_WNM 用于在hostapd中启用无线网络管理(Wireless Network Management, WNM) 功能支持,适用于需要优化网络性能和客户端管理的场景。它提供了负载均衡、网络状态报告和节能管理等功能 |
CONFIG_IEEE80211AC | CONFIG_IEEE80211AC 用于在hostapd中启用IEEE 802.11ac(非常高吞吐量,Very High Throughput, VHT) 支持,适用于需要高吞吐量和更高效无线网络的场景。它通过更宽的信道、更高效的调制和更多的空间流,显著提升了无线网络的性能 |
CONFIG_IEEE80211AX | CONFIG_IEEE80211AX 用于在hostapd中启用IEEE 802.11ax(Wifi 6) 支持,适用于需要高吞吐量、高效率和高密度环境的无线网络场景。它通过OFDMA、1024-QAM 和TWT等技术显著提升了无线网络的性能 |
CONFIG_NO_STDOUT_DEBUG | CONFIG_NO_STDOUT_DEBUG 用于禁用hostapd的标准输出调试信息,适用于嵌入式设备或生产环境,以减少二进制文件大小和优化性能 |
CONFIG_DEBUG_FILE | CONFIG_DEBUG_FILE 用于在hostapd中启用将调试日志写入文件的功能,适用于需要保存和分析日志的场景。通过指定日志文件路径,可以方便地记录hostapd的运行状态 |
CONFIG_DEBUG_SYSLOG | CONFIG_DEBUG_SYSLOG 用于在hostapd中启用将调试信息发送到系统日志(syslog)的功能,适用于需要集中管理日志的生产环境或远程日志监控场景。通过 syslog,可以更方便地记录和分析hostapd的运行状态,同时避免直接输出到控制台 |
CONFIG_DEBUG_LINUX_TRACING | CONFIG_DEBUG_LINUX_TRACING 用于在hostapd中启用将调试信息发送到Linux内核跟踪设施的功能,适用于开发和调试环境 |
CONFIG_NO_ACCOUNTING | CONFIG_NO_ACCOUNTING 用于禁用hostapd的RADIUS计费(Accounting)功能,适用于不需要记录用户网络使用情况的场景。它可以减少二进制文件大小和资源占用 |
CONFIG_NO_RADIUS | CONFIG_NO_RADIUS 用于禁用hostapd的RADIUS(Remote Authentication Dial-In User Service)功能,适用于不需要集中式认证或计费的场景。它可以减少二进制文件大小和资源占用 |
CONFIG_NO_VLAN | CONFIG_NO_VLAN 用于禁用VLAN(虚拟局域网)支持,适用于不需要VLAN支持的场景。它可以减少二进制文件大小和资源占用 |
CONFIG_FULL_DYNAMIC_VLAN | CONFIG_FULL_DYNAMIC_VLAN 用于在hostapd中启用完全动态VLAN(Fully Dynamic VLAN),适用于需要基于用户或设备动态分配VLAN的场景。它通过自动创建和管理VLAN接口,简化了网络配置并增强了网络隔离能力 |
CONFIG_VLAN_NETLINK | CONFIG_VLAN_NETLINK 用于在hostapd中启用基于 基于Netlink的VLAN操作支持,适用于需要动态VLAN管理的现代Linux系统。它通过使用 Netlink 接口替代传统的 ioctl() 方法,提供了更高效和可靠的VLAN操作方式,是动态VLAN管理的推荐选项 |
CONFIG_NO_DUMP_STATE | CONFIG_NO_DUMP_STATE 用于禁用hostapd的内部状态转储功能,适用于不需要调试功能的场景。它可以减少二进制文件大小和运行时资源占用,但如果需要通过控制接口获取状态信息进行调试,则不应启用此选项 |
CONFIG_WPA_TRACE | CONFIG_WPA_TRACE 用于在hostapd中启用WPA 内部跟踪(Tracing)功能,适用于开发和调试场景。它通过记录内存分配和调用栈信息,帮助开发者快速定位和修复问题 |
CONFIG_WPA_TRACE_BFD | CONFIG_WPA_TRACE_BFD 用于在hostapd中启用基于 libbf的详细符号解析功能,适用于开发和调试场景。它通过生成更详细的调用栈信息,帮助开发者快速定位问题 |
CONFIG_NO_RANDOM_POOL | CONFIG_NO_RANDOM_POOL宏的作用是 禁用hostapd的内部随机数池(random pool),从而减少二进制文件大小和运行时的资源使用 |
CONFIG_GETRANDOM | CONFIG_GETRANDOM 宏的作用是启用 getrandom() 系统调用 作为随机数生成的来源,用于增强随机数生成的安全性和可靠性 |
CONFIG_ELOOP_POLL | CONFIG_ELOOP_POLL宏的作用是启用 基于 poll() 的事件循环机制,用于替代默认的 select() 方法来处理事件 |
CONFIG_ELOOP_EPOLL | CONFIG_ELOOP_EPOLL宏的作用是启用 基于 epoll 的事件循环机制,用于替代默认的 select() 方法来处理事件 |
CONFIG_ELOOP_KQUEUE | CONFIG_ELOOP_KQUEUE宏的作用是启用 基于 kqueue 的事件循环机制,用于替代默认的 select() 方法来处理事件 |
CONFIG_TLS | CONFIG_TLS宏的作用是指定 TLS(传输层安全协议) 的实现方式,用于支持基于TLS的EAP方法(如EAP-TLS、EAP-TTLS、EAP-PEAP 等) |
CONFIG_TLSV11 | CONFIG_TLSV11 宏的作用是启用 TLS 1.1(传输层安全协议版本1.1) 支持,用于基于TLS的EAP方法(如EAP-TLS、EAP-TTLS、EAP-PEAP等) |
CONFIG_TLSV12 | CONFIG_TLSV12 宏的作用是启用TLS 1.2(传输层安全协议版本1.2) 支持,用于基于TLS的EAP方法(如EAP-TLS、EAP-TTLS、EAP-PEAP等) |
CONFIG_TLS_DEFAULT_CIPHERS | CONFIG_TLS_DEFAULT_CIPHERS 宏的作用是指定 默认的TLS加密套件(ciphersuites),用于基于TLS的EAP方法(如EAP-TLS、EAP-TTLS、EAP-PEAP等) |
CONFIG_INTERNAL_LIBTOMMATH | CONFIG_INTERNAL_LIBTOMMATH 宏的作用是启用 内部集成的LibTomMath库,用于支持hostapd的加密操作(如大整数运算),而无需依赖外部的LibTomMath库 |
CONFIG_INTERNAL_LIBTOMMATH_FAST | CONFIG_INTERNAL_LIBTOMMATH_FAST 宏的作用是启用 内部LibTomMath库的快速算法支持,以提升加密运算(如Diffie-Hellman和RSA)的性能 |
CONFIG_INTERWORKING | CONFIG_INTERWORKING宏的作用是启用 IEEE 802.11u互通功能(Interworking) 支持,用于改善无线网络与外部网络的互操作性 |
CONFIG_HS20 | CONFIG_HS20宏的作用是启用Hotspot 2.0(Passpoint) 功能支持 |
CONFIG_SQLITE | CONFIG_SQLITE宏的作用是启用SQLite数据库支持,用于hostapd中的某些功能模块(如EAP-SIM数据库、HLR/AuC网关和用户配置文件) |
CONFIG_FST | CONFIG_FST宏的作用是启用Fast Session Transfer(FST,快速会话转移) 功能支持,用于在不同的无线网络接口之间快速切换会话 |
CONFIG_FST_TEST | CONFIG_FST_TEST宏的作用是启用Fast Session Transfer(FST,快速会话转移)测试命令支持,用于调试和验证FST功能的正确性 |
CONFIG_TESTING_OPTIONS | CONFIG_TESTING_OPTIONS宏的作用是启用测试选项,用于在开发和测试环境中模拟特定的网络行为或故障场景,以验证客户端设备或网络的行为 |
CONFIG_ACS | CONFIG_ACS宏的作用是启用 自动信道选择(Automatic Channel Selection, ACS) 功能,用于让hostapd自动选择最佳的无线信道 |
CONFIG_MBO | CONFIG_MBO宏的作用是启用 多频段操作(Multiband Operation, MBO) 支持,用于优化无线网络中多频段的使用效率 |
CONFIG_TAXONOMY | CONFIG_TAXONOMY 宏的作用是启用 客户端分类(Client Taxonomy) 功能,用于识别连接到接入点(AP)的客户端设备类型和型号 |
CONFIG_FILS | CONFIG_FILS 宏的作用是启用FILS(Fast Initial Link Setup,快速初始链路建立) 功能支持,这是IEEE 802.11 ai标准的一部分,用于加速无线网络的连接过程 |
CONFIG_FILS_SK_PFS | CONFIG_FILS_SK_PFS 宏的作用是启用FILS(Fast Initial Link Setup)共享密钥认证的前向安全性(PFS, Perfect Forward Secrecy) 支持 |
CONFIG_WPA_CLI_EDIT | CONFIG_WPA_CLI_EDIT 宏的作用是启用 hostapd_cli 的内置行编辑模式,为命令行工具提供基本的编辑和历史记录功能 |
CONFIG_OWE | CONFIG_OWE 宏的作用是启用Opportunistic Wireless Encryption(OWE,机会无线加密) 功能支持,这是一个增强的开放式无线网络安全机制 |
CONFIG_AIRTIME_POLICY | CONFIG_AIRTIME_POLICY 宏的作用是启用Airtime Policy(空口时间策略) 功能,用于管理和优化无线网络中客户端设备的空口时间分配 |
3.3 编译makefile目标
从makefile中可以清晰的了解软件的整体结构;这里需要注意make all并不会生成所以的产物,hlr_auc_gw和nt_password_hash的编译是需要手动执行
| 目标 | 编译产物 | 说明 |
|---|---|---|
all | hostapd, hostapd_cli | 默认目标,生成主程序和客户端 |
verify_config | 无 | 检查配置文件是否存在 |
hostapd | hostapd | 主程序,可执行文件 |
hostapd_cli | hostapd_cli | 客户端程序,可执行文件 |
nt_password_hash | nt_password_hash | 计算 NT 密码哈希的工具 |
hlr_auc_gw | hlr_auc_gw | HLR/AuC 网关工具 |
install | 安装文件 | 将生成的可执行文件安装到指定目录 |
clean | 无 | 清理所有中间文件和目标文件 |
lcov-html | lcov-html 目录 | 生成代码覆盖率报告 |
其中各个目标的作用及依赖如下
all
all: verify_config $(ALL)
- 作用:默认目标,依赖于
verify_config和$(ALL) - 编译产物:hostapd 和
hostapd_cli - 说明:
$(ALL)是一个变量,定义如下:ALL=hostapd hostapd_cli该目标会先检查配置文件是否存在(通过verify_config),然后编译 hostapd 和hostapd_cli
verify_config
verify_config:
@if [ ! -r .config ]; then \
echo 'Building hostapd requires a configuration file'; \
echo '(.config). See README for more instructions. You can'; \
echo 'run "cp defconfig .config" to create an example'; \
echo 'configuration.'; \
exit 1; \
fi
- 作用:检查
.config文件是否存在 - 编译产物:无
- 说明:如果
.config文件不存在,会提示用户创建配置文件并终止构建
- hostapd
hostapd: $(BCHECK) $(OBJS)
$(Q)$(CC) $(LDFLAGS) -o hostapd $(OBJS) $(LIBS)
@$(E) " LD " $@
- 作用:编译
hostapd主程序 - 编译产物:
hostapd可执行文件 - 依赖项:
$(BCHECK):检查驱动构建状态BCHECK=../src/drivers/build.hostapd$(OBJS):所有目标文件OBJS += main.o OBJS += config_file.o OBJS += ../src/ap/hostapd.o ...$(LIBS):链接的库LIBS += -lssl -lcrypto -lrt
- 说明:将所有目标文件和库链接生成
hostapd
hostapd_cli
hostapd_cli: $(OBJS_c)
$(Q)$(CC) $(LDFLAGS) -o hostapd_cli $(OBJS_c) $(LIBS_c)
@$(E) " LD " $@
- 作用:编译
hostapd_cli客户端程序 - 编译产物:
hostapd_cli可执行文件 - 依赖项:
$(OBJS_c):客户端相关目标文件OBJS_c = hostapd_cli.o OBJS_c += ../src/common/wpa_ctrl.o OBJS_c += ../src/utils/os_$(CONFIG_OS).o OBJS_c += ../src/common/cli.o$(LIBS_c):客户端链接的库LIBS_c += -lrt
- 说明:将客户端目标文件和库链接生成
hostapd_cli
nt_password_hash
nt_password_hash: $(NOBJS)
$(Q)$(CC) $(LDFLAGS) -o nt_password_hash $(NOBJS) $(LIBS_n)
@$(E) " LD " $@
- 作用:编译
nt_password_hash工具 - 编译产物:
nt_password_hash可执行文件 - 依赖项:
$(NOBJS):与 NT 密码哈希相关的目标文件NOBJS = nt_password_hash.o ../src/crypto/ms_funcs.o $(SHA1OBJS) NOBJS += ../src/utils/common.o$(LIBS_n):链接的库LIBS_n += -lcrypto
- 说明:生成一个用于计算
NT密码哈希的工具
hlr_auc_gw
hlr_auc_gw: $(HOBJS)
$(Q)$(CC) $(LDFLAGS) -o hlr_auc_gw $(HOBJS) $(LIBS_h)
@$(E) " LD " $@
- 作用:编译
hlr_auc_gw工具。 - 编译产物:
hlr_auc_gw可执行文件。 - 依赖项:
$(HOBJS):与HLR/AuC网关相关的目标文件HOBJS += hlr_auc_gw.o ../src/utils/common.o ../src/utils/wpa_debug.o HOBJS += ../src/utils/os_$(CONFIG_OS).o ../src/utils/wpabuf.o$(LIBS_h):链接的库LIBS_h += -lcrypto
- 说明:生成一个用于
HLR/AuC网关的工具
install
install: $(addprefix $(DESTDIR)$(BINDIR)/,$(ALL))
- 作用:安装生成的可执行文件。
- 编译产物:将 hostapd 和
hostapd_cli安装到指定目录。 - 依赖项:
$(ALL):hostapd 和hostapd_cli;安装路径由$(DESTDIR)和$(BINDIR)控制export BINDIR ?= /usr/local/bin/ - 说明:通过
install命令将可执行文件复制到目标目录。
clean
clean:
$(MAKE) -C ../src clean
rm -f core *~ *.o hostapd hostapd_cli nt_password_hash hlr_auc_gw
rm -f *.d *.gcno *.gcda *.gcov
rm -f lcov.info
rm -rf lcov-html
- 作用:清理构建生成的文件
- 编译产物:无(删除所有中间文件和目标文件)
- 说明:删除
.o文件、可执行文件、覆盖率文件等
lcov-html
lcov-html:
lcov -c -d .. > lcov.info
genhtml lcov.info --output-directory lcov-html
- 作用:生成代码覆盖率报告
- 编译产物:
lcov-html目录,包含 HTML 格式的覆盖率报告 - 说明:使用
lcov和genhtml工具生成覆盖率报告
5. 总结
hostapd整体文件结构是按照模块进行划分,主要设计如下几个模块
hostapd主进程eloop核心循环实现cli模块- 各个协议实现的子模块
drivers模块实现与驱动的兼容层
从文件目录结构来看,整体划分是按照功能模块进行划分,结构较为清晰。粗读代码各个子模块,耦合度其实还是非常高,这部分还需要梳理软件整体架构后再仔细分析