hostapd 0.5.9 笔记(详细数据结构关系见数据结构图)
hostapd官方网站:
----------------------------------------------------------------------
一个topology_parse结构代表一个topology文件
1 topology_find_radios 先解析配置文件topology.conf 再解析配置文件 hostapd_cfg_ath*
1.1 topology_line_get获取一行,并去除结尾符
1.2 topology_skip_section 如果是{,则检查是否成对出现
1.3 topology_parse_bridge 如果是bridge关键字,则读取桥和interface的配置
1.3.1 topology_add_bridge 将此桥记录到topology_parse 桥链中
1.3.2 topology_find_section 找到桥的第一个{
1.3.3 topology_add_iface 以相同的方法读入interface配置到此桥中
1.4 topology_parse_radio 如果是radio关键字,则读取radio并解析之下的配置
1.4.1 topology_parse_ap 解析关键字ap下的配置
1.4.1.1 hostapd_radio_config_create 创建一个默认配置
1.4.1.2 hostapd_radio_config_apply_file 解析配置文件 config关键字 (radio的配置)
1.4.1.2.1 hostapd_config_line_lex 获取每一行的配置信息,并整理格式
1.4.1.2.2 将上述的配置文件信息读入到配置结构hostapd_config中
1.4.1.2.3 读入覆盖字段override
1.4.1.3 topology_parse_bss 按照上述同样方法解析bss下的config以及override (vap的配置)
1.4.1.3.1 解析config
1.4.1.3.2 解析override
1.4.1.3.3 填写vap所在interface名称
1.4.1.3.4 填写vap所在的桥的名称
附录:
topology.conf 示例1:
bridge none
{
interface ath0
}
bridge br2
{
interface ath2
}
radio wifi0
{
ap
{
bss ath0
{
config /var/hostapd/hostapd_cfg_ath0
}
bss ath2
{
config /var/hostapd/hostapd_cfg_ath2
}
}
}
# cat /var/hostapd/hostapd_cfg_ath2
##### hostapd configuration file ##############################################
# Empty lines and lines starting with # are ignored
logger_syslog=-1
logger_syslog_level=2
logger_stdout=-1
logger_stdout_level=2
debug=0
dump_file=/var/hostapd/hostapd_dump_ath2
ssid=wpa_psk
ieee8021x=0
wpa=3
eapol_key_index_workaround=1
eap_reauth_period=0
eap_server=0
own_ip_addr=172.25.10.107
wpa_passphrase=11111111
wpa_key_mgmt=WPA-PSK
wpa_pairwise=CCMP
wpa_group_rekey=600
wpa_strict_rekey=0
rsn_preauth=1
rsn_preauth_interfaces=eth0
ctrl_interface=/var/run/hostapd
wps_disable=1
wps_upnp_disable=1
#
----------------------------------------------------------------------
2 setup_interface_start 配置vap数据的第一步
2.1 setup_interface1
2.1.1 setup_interface1_bss
2.1.1.1 hostapd_driver_init驱动初始化
2.1.1.2 hostapd_set_country 设置国家代码
2.1.1.3 hostapd_set_ieee80211d 设置802.11d
2.1.1.4 hostapd_set_internal_bridge 设置桥
2.1.1.5 设置radius参数
2.1.1.6 设置wps参数
2.1.1.7 hostapd_wireless_event_init 无线事件初始化
2.1.1.8 hostapd_get_hw_features
2.1.1.9 setup_interface2_handler
2.1.1.9.1 setup_interface2_wrapper
2.1.1.9.1.1 setup_interface2 配置vap数据的第二步
2.1.1.9.1.1.1 setup_interface2_bss 详细见3
2.1.1.9.1.2 ap_list_init
2.1.1.9.1.2.1 ap_list_timer 注册定时器,处理定时任务
2.1.1.9.2 setup_interface_finalize 结束vap配置
2.1.1.9.2.1 取消setup_interface_start setup_interface2_handler
2.1.1.9.2.2 调用回调函数iface->setup_cb(setup_interface_done)
2.1.1.9.2.2.1 前面配置成功则打印成功信息,否则设置结束标志位
----------------------------------------------------------------------
3 setup_interface2_bss 配置vap数据的第二步
3.1 hostapd_flush_old_stations 清除旧的状态数据
3.2 hostapd_set_privacy
3.3 hostapd_set_freq 设置信道
3.4 hostapd_broadcast_wep_clear hostapd_setup_encryption 清除并重新设置 wep 密码
3.5 ieee802_11_set_beacon 设置beacon相关参数
3.6 hostapd_set_rts
3.7 hostapd_set_frag
3.8 hostapd_setup_bss 设置 vap 相关参数
3.8.1 hostapd_setup_wpa_psk 设置wpa参数
3.8.2 hostapd_set_broadcast_ssid
3.8.3 hostapd_set_dtim_period
3.8.4 hostapd_set_ssid
3.8.5 radius_client_init /* radius客户端初始化 */
3.8.5.1 radius_client_init_auth /*认证客户端初始化*/
3.8.5.1.1 创建socket
3.8.5.1.2 注册回调处理函数 radius_client_receive--->ieee802_1x_receive_auth
3.8.5.2 radius_client_init_acct /*计费客户端初始化*/
3.8.5.2.1 创建socket
3.8.5.2.2 注册回调处理函数 radius_client_receive--->accounting_receive
3.8.6 hostapd_acl_init
3.8.7 ieee802_1x_init /*802.1x 相关初始化 */
3.8.8 配置wpa的相关回调处理函数
3.8.9 hostapd_ctrl_iface_init 初始化ctrl接口socket
3.8.10 vlan_init 初始化vlan的数据及处理
3.9 hostapd_driver_commit 如果接口为down,则提交配置到驱动,并将接口up。
----------------------------------------------------------------------
4 eloop_run
循环等待并处理 注册的读socket收到的数据。
eloop.readers[i].handler(
eloop.readers[i].sock,
eloop.readers[i].eloop_data,
eloop.readers[i].user_data);
----------------------------------------------------------------------
5 madwifi_init 和无线驱动相关的初始化
5.1 创建 madwifi_driver_data 数据结构
5.2 l2_packet_init sock_xmit 创建并注册监听在无线口上的socket
5.2.1 处理消息的回调函数为 handle_read--->ieee802_1x_receive
5.3 l2_packet_init sock_recv 创建并注册监听在桥上的socket
----------------------------------------------------------------------
6 802.1x认证过程数据流
6.1 sta发送802.1x报文到ap,无线驱动收到802.1x报文后,送到对应的桥中。
hostapd创建了桥监听socket,因此将收到802.1x报文,然后交由ieee802_1x_receive处理。
ieee802_1x_receive 将解析802.1x报文,并转换成radius报文(ieee802_1x_encapsulate_radius),发送到radius认证服务器等。
6.2 radius认证服务器向ap发送了认证结果信息。ap的radius客户端收到消息后,交由函数radius_client_receive处理,
然后由函数ieee802_1x_receive_auth 解析radius报文,并进入状态机(eapol_sm_step(sm))继续下一步处理。
如果认证通过由 sock_xmit 创建的socket向无线驱动发送报文。
----------------------------------------------------------------------
eap_sim_db_receive
ieee802_1x_receive
阅读(1353) | 评论(0) | 转发(0) |