【源码解析】hostapd(2)目录及编译架构
本文最后更新于 28 天前,其中的信息可能已经有所发展或是发生改变。

笔者注

本文涉及到的hostapd源码均为hostapd-2019-08-08-ca8c2bd22.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规范相关的功能、hostapdwpa_supplicant都会调用的API统一在这里实现,其中包含数个独立的小模块
  • wpaspy
    该部分代码允许可以通过Python来访问hostapd/wpa_spllicant的控制接口
  • wpadebug
    Andoid平台开发的调试接口。开发者可以通过Android frameworkhostapd/wpa_supplicant进行调试
  • wlantest
    简易的抓包功能,既可以在monitor模式下使用,也可以在普通模式下使用
  • tests
    该目录下是用于测试hostapd/wpa_supplicant的一些工具
  • radius_example
    此目录包含一个示例,显示如何将hostapdRADIUS客户机功能用作另一个程序中的库
  • hs20
    此目录是Hotspot 2.0的示例代码,包括serverclient两部分
  • eap_example
    该目录包含一个示例,说明如何将wpa_supplicanthostapd中的EAP peerserver代码以库的方式使用
  • doc
    该目录包含hostapdwpa_supplicantdoxygen文档

由于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编译时使用到了如下的依赖库

  1. 标准库
  • -lrt:实时库,用于支持 clock_gettime() 等函数(在 glibc 版本低于 2.17 时需要)
  • -lm:数学库,用于支持数学函数(如 sincos 等)
  1. 网络相关库
  • -lpcap:用于数据包捕获(如 libpcap
  • -ldnet:用于低级网络操作(如 libdnet
  • -lws2_32:Windows 套接字库(仅在 Windows 平台上使用)
  1. 加密相关库
  • -lssl-lcryptoOpenSSL 库,用于加密和安全通信
  • -lwolfsslWolfSSL 库,轻量级的 SSL/TLS 实现
  • -lgnutlsGnuTLS 库,用于加密和安全通信
  • -lgcryptGnuPG 的加密库
  • -ltomcrypt-ltfmLibTomCryptLibTomMath 库,用于加密和数学运算
  1. 调试和跟踪相关库
  • -ldl:动态链接库,用于加载动态库
  • -lbfd:二进制文件描述库(Binary File Descriptor library),用于调试和跟踪
  • -libertyGNU的辅助库,通常与-lbfd一起使用
  • -lzzlib 压缩库,用于支持压缩功能
  1. 数据库相关库
  • -lsqlite3SQLite 数据库库,用于存储和查询数据。
  1. 其他库
  • -lgmpGNU 多精度数学库,用于高精度数学运算。
  • -lgpg-errorGPG 错误处理库,用于支持 GnuPG

总结

hostapd中使用的库涵盖了以下功能:

  1. 加密和安全通信OpenSSLWolfSSLGnuTLSLibTomCrypt
  2. 网络操作libpcaplibdnetws2_32
  3. 调试和跟踪libbfdlibertyzlib
  4. 数学运算libmlibgmp
  5. 数据库支持SQLite

这些库的使用是根据配置选项(如 CONFIG_TLSCONFIG_SQLITE 等)动态决定的

3.2 编译宏

笔者注:这里仅讨论./hostapd目录下的编译宏选项

hostapd的源码中默认提供了一份编译选项,名称命名为defconfig,这里列出其中的编译选项

编译选项作用
CONFIG_DRIVER_HOSTAP如果启用了该宏,hostapd会加载与Host AP驱动相关的代码模块,并通过该接口与无线网卡通信。否则,相关代码将不会被编译进hostapd
CONFIG_DRIVER_WIREDCONFIG_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启用 FreeBSDnet80211 驱动接口 支持,需要注意的是此宏仅适用于FreeBSD系统
CONFIG_DRIVER_NONE启用 无驱动模式,即在没有无线网卡驱动的情况下运行hostapd。此模式通常用于仅作为 RADIUS 服务器 或 测试环境,hostapd 将不依赖任何无线网卡驱动接口(如 nl80211hostap),而是运行在一个独立的模式下。
CONFIG_IAPP启用 IEEE 802.11F/IAPP(Inter-Access Point Protocol) 支持;CONFIG_IAPP 用于在hostapd中启用IEEE 802.11F/IAPP协议支持,适用于需要在多AP部署中实现客户端无缝漫游的场景
CONFIG_RSN_PREAUTHCONFIG_RSN_PREAUTH用于在 hostapd中启用 RSN 预认证功能,适用于需要支持快速漫游的无线网络场景。它通过减少切换延迟,提升用户的漫游体验
CONFIG_IEEE80211WCONFIG_IEEE80211W用于在 hostapd中启用 IEEE 802.11w 管理帧保护功能,提升无线网络的安全性,防止伪造管理帧的攻击
CONFIG_OCVCONFIG_OCV 用于在 hostapd中启用操作信道验证功能,提升无线网络的安全性,防止信道切换攻击和中间人攻击
CONFIG_ERPCONFIG_ERP用于在hostapdEAP Re-authentication ProtocolERPEAP 重新认证协议) 的支持,以优化无线客户端在漫游时的认证过程
CONFIG_EAP_MD5CONFIG_EAP_MD5 用于在 hostapd中启用EAP-MD5Message Digest 5)认证方法的支持,适用于简单的网络环境或测试场景。然而,由于其安全性较低,不建议在生产环境或需要高安全性的网络中使用
CONFIG_EAP_TLSCONFIG_EAP_TLS用于在hostapd中启用EAP-TLSExtensible Authentication Protocol - Transport Layer Security 认证方法的支持,适用于需要高安全性和基于证书认证的无线网络场景,它是WPA2-EnterpriseWPA3-Enterprise的核心认证方法,广泛应用于企业和高安全性环境
CONFIG_EAP_MSCHAPV2CONFIG_EAP_MSCHAPV2 用于在hostapdEAP-MSCHAPv2Microsoft Challenge Handshake Authentication Protocol version 2 认证方法的支持,适用于需要基于用户名和密码认证的企业无线网络。它通常与 EAP-PEAPEAP-TTLS 结合使用,以提供更高的安全性
CONFIG_EAP_PEAPCONFIG_EAP_PEAP用于在 hostapd中启用 EAP-PEAPProtected Extensible Authentication Protocol 认证方法的支持,适用于需要高安全性和保护认证数据的无线网络场景。它是 WPA2-EnterpriseWPA3-Enterprise 的常用认证方法之一,广泛应用于企业环境
CONFIG_EAP_GTCCONFIG_EAP_GTC 用于在 hostapd 中启用EAP-GTCGeneric Token Card认证方法的支持,适用于基于令牌卡的认证系统或简单的用户名密码认证场景。由于其缺乏内置的加密保护,通常需要与 EAP-TTLSEAP-PEAP 结合使用,以确保认证数据的安全性
CONFIG_EAP_TTLSCONFIG_EAP_TTLS用于在 hostapd中启用EAP-TTLSTunneled Transport Layer Security认证方法的支持,适用于需要高安全性和灵活认证的无线网络场景。它通过 TLS 隧道保护认证数据,并支持多种内部认证协议,是WPA2-EnterpriseWPA3-Enterprise的常用认证方法之一
CONFIG_EAP_SIMCONFIG_EAP_SIM 用于在hostapd中启用 EAP-SIMSubscriber Identity Module认证方法的支持,适用于需要基于SIM卡认证的无线网络场景,特别是在与 GSM 网络集成的环境中
CONFIG_EAP_AKACONFIG_EAP_AKA 用于在hostapd中启用EAP-AKAAuthentication and Key Agreement认证方法的支持,适用于需要基于USIM卡认证的无线网络场景,特别是在与UMTSLTE网络集成的环境中
CONFIG_EAP_AKA_PRIMECONFIG_EAP_AKA_PRIME用于在hostapd中启用EAP-AKAEAP-AKA Prime认证方法的支持,适用于需要基于 USIM/ISIM卡认证的无线网络场景,特别是在与LTE5G网络集成的环境中。它是EAP-AKA的增强版本,提供更高的安全性和更现代化的认证机制
CONFIG_EAP_PAXCONFIG_EAP_PAX用于在hostapd中启用 EAP-PAXPassword Authenticated Exchange认证方法的支持,适用于资源受限设备或无需复杂证书管理的场景
CONFIG_EAP_PSKCONFIG_EAP_PSK用于在hostapd中启用EAP-PSKPre-Shared Key 认证方法的支持,适用于资源受限设备或无需复杂证书管理的场景
CONFIG_EAP_PWDCONFIG_EAP_PWD用于在hostapd中启用EAP-pwdPassword-based Authentication 认证方法的支持,适用于需要基于密码的高安全性无线网络场景。它通过密码验证密钥交换协议提供强大的安全性,同时避免了证书管理的复杂性,是一种轻量级但安全的认证方法
CONFIG_EAP_SAKECONFIG_EAP_SAKE用于在hostapd中启用EAP-SAKShared-secret Authentication and Key Establishment 认证方法的支持,适用于资源受限设备或无需复杂证书管理的场景
CONFIG_EAP_GPSKCONFIG_EAP_GPSK 用于在 hostapd中启用EAP-GPSKGeneralized Pre-Shared Key 认证方法的支持,适用于资源受限设备或无需复杂证书管理的场景
CONFIG_EAP_GPSK_SHA256CONFIG_EAP_GPSK_SHA256用于为EAP-GPSKGeneralized Pre-Shared Key 认证方法启用SHA-256 加密套件的支持,显著提升认证过程的安全性。它适用于需要更高安全性但仍希望保持轻量级认证的无线网络场景
CONFIG_EAP_FASTCONFIG_EAP_FAST用于在hostapd中启用EAP-FASTFlexible Authentication via Secure Tunneling 认证方法的支持,适用于无需证书但需要高安全性的无线网络场景。它通过PAC提供安全隧道,简化了证书管理,但需要注意PAC的安全性和管理复杂性
CONFIG_EAP_TEAPCONFIG_EAP_TEAP用于在hostapd中启用EAP-TEAPTunneled EAP Protocol 认证方法的支持,适用于需要高安全性和灵活认证的无线网络场景。它通过TLS隧道保护认证数据,并支持多阶段认证
CONFIG_WPSCONFIG_WPS用于在hostapd中启用 Wi-Fi Protected SetupWPS 功能支持,适用于需要简化无线网络配置的场景
CONFIG_WPS_UPNPCONFIG_WPS_UPNP用于在hostapd中启用Wi-Fi Protected SetupWPSUPnPUniversal Plug and Play)支持,允许外部设备通过UPnP协议管理无线网络的 WPS 配置
CONFIG_WPS_NFCCONFIG_WPS_NFC 用于在hostapd中启用WPSWi-Fi Protected SetupWPS)的NFCNear Field Communication)配置方法 支持
CONFIG_EAP_IKEV2CONFIG_EAP_IKEV2 用于在hostapd中启用EAP-IKEv2Internet Key Exchange version 2 认证方法的支持,适用于需要高安全性和灵活认证的无线网络或VPN集成场景
CONFIG_EAP_TNCCONFIG_EAP_TNC 用于在hostapd中启用EAP-TNCTrusted Network Connect 认证方法的支持,适用于需要动态网络访问控制和设备健康状态检查的场景
CONFIG_EAP_EKECONFIG_EAP_EKE 用于在hostapd中启用EAP-EKEExtensible Authentication Protocol - Encrypted Key Exchange 认证方法的支持,适用于需要基于密码的高安全性无线网络场景
CONFIG_PKCS12CONFIG_PKCS12用于在hostapd中启用对PKCS#12Public-Key Cryptography Standards #12 文件支持,允许直接加载包含私钥和证书的 .p12.pfx 文件。它简化了证书管理
CONFIG_RADIUS_SERVERCONFIG_RADIUS_SERVER 用于在hostapd中启用RADIUSRemote Authentication Dial-In User Service)认证服务器 的支持,适用于需要集中式用户认证的企业网络或测试环境。它允许外部设备通过RADIUS协议与 hostapdEAP服务器交互
CONFIG_IPV6CONFIG_IPV6用于在hostapd中启用IPv6支持,适用于需要在IPv6网络环境中运行的场景,特别是涉及RADIUS操作时。它确保hostapd能够处理基于IPv6的通信,同时保持对IPv4的兼容性
CONFIG_IEEE80211RCONFIG_IEEE80211R用于在hostapd中启用IEEE 802.11r(快速基本服务集切换,Fast BSS Transition, FT 支持,适用于需要低延迟切换的无线网络场景。它通过优化认证过程,显著提升了用户在多个AP之间切换时的体验
CONFIG_DRIVER_RADIUS_ACLCONFIG_DRIVER_RADIUS_ACL 用于在hostapd中启用RADIUS ACLAccess Control List)驱动接口 的支持,适用于需要RADIUS认证但不需要完整IEEE 802.11管理功能的场景,特别是在FreeBSD系统中。它提供了灵活的用户认证和访问控制功能,但需要依赖外部RADIUS服务器
CONFIG_IEEE80211NCONFIG_IEEE80211N 用于在hostapd中启用IEEE 802.11n(高吞吐量,High Throughput, HT 支持,适用于需要高吞吐量和更高效无线网络的场景。它通过MIMO、信道绑定和帧聚合等技术,显著提升了无线网络的性
CONFIG_WNMCONFIG_WNM 用于在hostapd中启用无线网络管理(Wireless Network Management, WNM 功能支持,适用于需要优化网络性能和客户端管理的场景。它提供了负载均衡、网络状态报告和节能管理等功能
CONFIG_IEEE80211ACCONFIG_IEEE80211AC 用于在hostapd中启用IEEE 802.11ac(非常高吞吐量,Very High Throughput, VHT 支持,适用于需要高吞吐量和更高效无线网络的场景。它通过更宽的信道、更高效的调制和更多的空间流,显著提升了无线网络的性能
CONFIG_IEEE80211AXCONFIG_IEEE80211AX 用于在hostapd中启用IEEE 802.11axWifi 6 支持,适用于需要高吞吐量、高效率和高密度环境的无线网络场景。它通过OFDMA1024-QAMTWT等技术显著提升了无线网络的性能
CONFIG_NO_STDOUT_DEBUGCONFIG_NO_STDOUT_DEBUG 用于禁用hostapd的标准输出调试信息,适用于嵌入式设备或生产环境,以减少二进制文件大小和优化性能
CONFIG_DEBUG_FILECONFIG_DEBUG_FILE 用于在hostapd中启用将调试日志写入文件的功能,适用于需要保存和分析日志的场景。通过指定日志文件路径,可以方便地记录hostapd的运行状态
CONFIG_DEBUG_SYSLOGCONFIG_DEBUG_SYSLOG 用于在hostapd中启用将调试信息发送到系统日志(syslog)的功能,适用于需要集中管理日志的生产环境或远程日志监控场景。通过 syslog,可以更方便地记录和分析hostapd的运行状态,同时避免直接输出到控制台
CONFIG_DEBUG_LINUX_TRACINGCONFIG_DEBUG_LINUX_TRACING 用于在hostapd中启用将调试信息发送到Linux内核跟踪设施的功能,适用于开发和调试环境
CONFIG_NO_ACCOUNTINGCONFIG_NO_ACCOUNTING 用于禁用hostapdRADIUS计费(Accounting功能,适用于不需要记录用户网络使用情况的场景。它可以减少二进制文件大小和资源占用
CONFIG_NO_RADIUSCONFIG_NO_RADIUS 用于禁用hostapdRADIUSRemote Authentication Dial-In User Service功能,适用于不需要集中式认证或计费的场景。它可以减少二进制文件大小和资源占用
CONFIG_NO_VLANCONFIG_NO_VLAN 用于禁用VLAN(虚拟局域网)支持,适用于不需要VLAN支持的场景。它可以减少二进制文件大小和资源占用
CONFIG_FULL_DYNAMIC_VLANCONFIG_FULL_DYNAMIC_VLAN 用于在hostapd中启用完全动态VLANFully Dynamic VLAN,适用于需要基于用户或设备动态分配VLAN的场景。它通过自动创建和管理VLAN接口,简化了网络配置并增强了网络隔离能力
CONFIG_VLAN_NETLINKCONFIG_VLAN_NETLINK 用于在hostapd中启用基于 基于NetlinkVLAN操作支持,适用于需要动态VLAN管理的现代Linux系统。它通过使用 Netlink 接口替代传统的 ioctl() 方法,提供了更高效和可靠的VLAN操作方式,是动态VLAN管理的推荐选项
CONFIG_NO_DUMP_STATECONFIG_NO_DUMP_STATE 用于禁用hostapd的内部状态转储功能,适用于不需要调试功能的场景。它可以减少二进制文件大小和运行时资源占用,但如果需要通过控制接口获取状态信息进行调试,则不应启用此选项
CONFIG_WPA_TRACECONFIG_WPA_TRACE 用于在hostapd中启用WPA 内部跟踪(Tracing)功能,适用于开发和调试场景。它通过记录内存分配和调用栈信息,帮助开发者快速定位和修复问题
CONFIG_WPA_TRACE_BFDCONFIG_WPA_TRACE_BFD 用于在hostapd中启用基于 libbf的详细符号解析功能,适用于开发和调试场景。它通过生成更详细的调用栈信息,帮助开发者快速定位问题
CONFIG_NO_RANDOM_POOLCONFIG_NO_RANDOM_POOL宏的作用是 禁用hostapd的内部随机数池(random pool,从而减少二进制文件大小和运行时的资源使用
CONFIG_GETRANDOMCONFIG_GETRANDOM 宏的作用是启用 getrandom() 系统调用 作为随机数生成的来源,用于增强随机数生成的安全性和可靠性
CONFIG_ELOOP_POLLCONFIG_ELOOP_POLL宏的作用是启用 基于 poll() 的事件循环机制,用于替代默认的 select() 方法来处理事件
CONFIG_ELOOP_EPOLLCONFIG_ELOOP_EPOLL宏的作用是启用 基于 epoll 的事件循环机制,用于替代默认的 select() 方法来处理事件
CONFIG_ELOOP_KQUEUECONFIG_ELOOP_KQUEUE宏的作用是启用 基于 kqueue 的事件循环机制,用于替代默认的 select() 方法来处理事件
CONFIG_TLSCONFIG_TLS宏的作用是指定 TLS(传输层安全协议) 的实现方式,用于支持基于TLSEAP方法(如EAP-TLSEAP-TTLSEAP-PEAP 等)
CONFIG_TLSV11CONFIG_TLSV11 宏的作用是启用 TLS 1.1(传输层安全协议版本1.1 支持,用于基于TLSEAP方法(如EAP-TLSEAP-TTLSEAP-PEAP等)
CONFIG_TLSV12CONFIG_TLSV12 宏的作用是启用TLS 1.2(传输层安全协议版本1.2 支持,用于基于TLSEAP方法(如EAP-TLSEAP-TTLSEAP-PEAP等)
CONFIG_TLS_DEFAULT_CIPHERSCONFIG_TLS_DEFAULT_CIPHERS 宏的作用是指定 默认的TLS加密套件(ciphersuites,用于基于TLSEAP方法(如EAP-TLSEAP-TTLSEAP-PEAP等)
CONFIG_INTERNAL_LIBTOMMATHCONFIG_INTERNAL_LIBTOMMATH 宏的作用是启用 内部集成的LibTomMath,用于支持hostapd的加密操作(如大整数运算),而无需依赖外部的LibTomMath
CONFIG_INTERNAL_LIBTOMMATH_FASTCONFIG_INTERNAL_LIBTOMMATH_FAST 宏的作用是启用 内部LibTomMath库的快速算法支持,以提升加密运算(如Diffie-HellmanRSA)的性能
CONFIG_INTERWORKINGCONFIG_INTERWORKING宏的作用是启用 IEEE 802.11u互通功能(Interworking 支持,用于改善无线网络与外部网络的互操作性
CONFIG_HS20CONFIG_HS20宏的作用是启用Hotspot 2.0Passpoint 功能支持
CONFIG_SQLITECONFIG_SQLITE宏的作用是启用SQLite数据库支持,用于hostapd中的某些功能模块(如EAP-SIM数据库、HLR/AuC网关和用户配置文件)
CONFIG_FSTCONFIG_FST宏的作用是启用Fast Session TransferFST,快速会话转移) 功能支持,用于在不同的无线网络接口之间快速切换会话
CONFIG_FST_TESTCONFIG_FST_TEST宏的作用是启用Fast Session TransferFST,快速会话转移)测试命令支持,用于调试和验证FST功能的正确性
CONFIG_TESTING_OPTIONSCONFIG_TESTING_OPTIONS宏的作用是启用测试选项,用于在开发和测试环境中模拟特定的网络行为或故障场景,以验证客户端设备或网络的行为
CONFIG_ACSCONFIG_ACS宏的作用是启用 自动信道选择(Automatic Channel Selection, ACS 功能,用于让hostapd自动选择最佳的无线信道
CONFIG_MBOCONFIG_MBO宏的作用是启用 多频段操作(Multiband Operation, MBO 支持,用于优化无线网络中多频段的使用效率
CONFIG_TAXONOMYCONFIG_TAXONOMY 宏的作用是启用 客户端分类(Client Taxonomy 功能,用于识别连接到接入点(AP)的客户端设备类型和型号
CONFIG_FILSCONFIG_FILS 宏的作用是启用FILSFast Initial Link Setup,快速初始链路建立) 功能支持,这是IEEE 802.11 ai标准的一部分,用于加速无线网络的连接过程
CONFIG_FILS_SK_PFSCONFIG_FILS_SK_PFS 宏的作用是启用FILSFast Initial Link Setup)共享密钥认证的前向安全性(PFS, Perfect Forward Secrecy 支持
CONFIG_WPA_CLI_EDITCONFIG_WPA_CLI_EDIT 宏的作用是启用 hostapd_cli 的内置行编辑模式,为命令行工具提供基本的编辑和历史记录功能
CONFIG_OWECONFIG_OWE 宏的作用是启用Opportunistic Wireless EncryptionOWE,机会无线加密) 功能支持,这是一个增强的开放式无线网络安全机制
CONFIG_AIRTIME_POLICYCONFIG_AIRTIME_POLICY 宏的作用是启用Airtime Policy(空口时间策略) 功能,用于管理和优化无线网络中客户端设备的空口时间分配

3.3 编译makefile目标

makefile中可以清晰的了解软件的整体结构;这里需要注意make all并不会生成所以的产物,hlr_auc_gwnt_password_hash的编译是需要手动执行

目标编译产物说明
allhostapd, hostapd_cli默认目标,生成主程序和客户端
verify_config检查配置文件是否存在
hostapdhostapd主程序,可执行文件
hostapd_clihostapd_cli客户端程序,可执行文件
nt_password_hashnt_password_hash计算 NT 密码哈希的工具
hlr_auc_gwhlr_auc_gwHLR/AuC 网关工具
install安装文件将生成的可执行文件安装到指定目录
clean清理所有中间文件和目标文件
lcov-htmllcov-html 目录生成代码覆盖率报告

其中各个目标的作用及依赖如下

  1. all
   all: verify_config $(ALL)
  • 作用:默认目标,依赖于 verify_config$(ALL)
  • 编译产物:hostapd 和 hostapd_cli
  • 说明$(ALL) 是一个变量,定义如下: ALL=hostapd hostapd_cli 该目标会先检查配置文件是否存在(通过 verify_config),然后编译 hostapd 和 hostapd_cli
  1. 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 文件不存在,会提示用户创建配置文件并终止构建
  1. hostapd
   hostapd: $(BCHECK) $(OBJS)
       $(Q)$(CC) $(LDFLAGS) -o hostapd $(OBJS) $(LIBS)
       @$(E) "  LD " $@
  • 作用:编译 hostapd 主程序
  • 编译产物hostapd 可执行文件
  • 依赖项
    1. $(BCHECK):检查驱动构建状态 BCHECK=../src/drivers/build.hostapd
    2. $(OBJS):所有目标文件 OBJS += main.o OBJS += config_file.o OBJS += ../src/ap/hostapd.o ...
    3. $(LIBS):链接的库 LIBS += -lssl -lcrypto -lrt
  • 说明:将所有目标文件和库链接生成 hostapd
  1. hostapd_cli
   hostapd_cli: $(OBJS_c)
       $(Q)$(CC) $(LDFLAGS) -o hostapd_cli $(OBJS_c) $(LIBS_c)
       @$(E) "  LD " $@
  • 作用:编译 hostapd_cli 客户端程序
  • 编译产物hostapd_cli 可执行文件
  • 依赖项
    1. $(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
    2. $(LIBS_c):客户端链接的库 LIBS_c += -lrt
  • 说明:将客户端目标文件和库链接生成 hostapd_cli
  1. 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 可执行文件
  • 依赖项
    1. $(NOBJS):与 NT 密码哈希相关的目标文件 NOBJS = nt_password_hash.o ../src/crypto/ms_funcs.o $(SHA1OBJS) NOBJS += ../src/utils/common.o
    2. $(LIBS_n):链接的库 LIBS_n += -lcrypto
  • 说明:生成一个用于计算 NT 密码哈希的工具
  1. 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 可执行文件。
  • 依赖项
    1. $(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
    2. $(LIBS_h):链接的库 LIBS_h += -lcrypto
  • 说明:生成一个用于 HLR/AuC 网关的工具
  1. install
   install: $(addprefix $(DESTDIR)$(BINDIR)/,$(ALL))
  • 作用:安装生成的可执行文件。
  • 编译产物:将 hostapd 和 hostapd_cli 安装到指定目录。
  • 依赖项
    $(ALL):hostapd 和 hostapd_cli;安装路径由 $(DESTDIR)$(BINDIR) 控制 export BINDIR ?= /usr/local/bin/
  • 说明:通过 install 命令将可执行文件复制到目标目录。
  1. 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 文件、可执行文件、覆盖率文件等
  1. lcov-html
   lcov-html:
       lcov -c -d .. > lcov.info
       genhtml lcov.info --output-directory lcov-html
  • 作用:生成代码覆盖率报告
  • 编译产物lcov-html 目录,包含 HTML 格式的覆盖率报告
  • 说明:使用 lcovgenhtml 工具生成覆盖率报告

5. 总结

hostapd整体文件结构是按照模块进行划分,主要设计如下几个模块

  1. hostapd主进程
  2. eloop核心循环实现
  3. cli模块
  4. 各个协议实现的子模块
  5. drivers模块实现与驱动的兼容层

从文件目录结构来看,整体划分是按照功能模块进行划分,结构较为清晰。粗读代码各个子模块,耦合度其实还是非常高,这部分还需要梳理软件整体架构后再仔细分析

参考文档

Hostapd 详解 | 老张的blog

hostapd: Developers’ documentation for hostapd

上一篇
下一篇