Chinaunix首页 | 论坛 | 博客
  • 博客访问: 151807
  • 博文数量: 34
  • 博客积分: 1270
  • 博客等级: 中尉
  • 技术积分: 269
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-06 10:49
文章分类
文章存档

2011年(12)

2010年(22)

我的朋友

分类: 网络与安全

2010-11-10 11:07:22

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
阅读(4340) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~