Chinaunix
标题:
802.11无线网卡界面上的wifi信号强度是怎么获取的?
[打印本页]
作者:
九阳神功爱喝茶
时间:
2015-11-19 15:35
标题:
802.11无线网卡界面上的wifi信号强度是怎么获取的?
小弟用的是ath9k的源码,经过分析我大概可以分析出来应该是通过beacon帧的携带的信息获取的。流程大概如下所示
ieee80211_rx_h_mgmt调用ieee80211_queue_work(&rx->local->hw, &sdata->work);也就是进入了iface.c中的ieee80211_iface_work函数;这在个函数中接着调用
ieee80211_sta_rx_queued_mgmt(这里考虑AP模式下的情况);进而调用ieee80211_rx_mgmt_beacon这个函数,这个函数通过依次调用ieee80211_bss_info_update, cfg80211_inform_bss_width_frame 和cfg80211_bss_update函数将接收到的BSS信息保存在rdev中;最后一个函数cfg中可以看到是一个红黑树的基本操作,如果之前的BSS存在则更新,不存在则创建一个新的插入进去,代码非常值得一看。
这里我遇到的问题是rdev中的数据是如何被上层获取的,一般来说都是通过cfg.c中定义的函数获取并返回用户态。下面是cfg.c中定义的全部ops但是我并没有找到是获取BSS信息的。请各位大神多多指点,不甚感激。
const struct cfg80211_ops mac80211_config_ops = {
.add_virtual_intf = ieee80211_add_iface,
.del_virtual_intf = ieee80211_del_iface,
.change_virtual_intf = ieee80211_change_iface,
.start_p2p_device = ieee80211_start_p2p_device,
.stop_p2p_device = ieee80211_stop_p2p_device,
.add_key = ieee80211_add_key,
.del_key = ieee80211_del_key,
.get_key = ieee80211_get_key,
.set_default_key = ieee80211_config_default_key,
.set_default_mgmt_key = ieee80211_config_default_mgmt_key,
.start_ap = ieee80211_start_ap,
.change_beacon = ieee80211_change_beacon,
.stop_ap = ieee80211_stop_ap,
.add_station = ieee80211_add_station,
.del_station = ieee80211_del_station,
.change_station = ieee80211_change_station,
.get_station = ieee80211_get_station,
.dump_station = ieee80211_dump_station,
.dump_survey = ieee80211_dump_survey,
#ifdef CPTCFG_MAC80211_MESH
.add_mpath = ieee80211_add_mpath,
.del_mpath = ieee80211_del_mpath,
.change_mpath = ieee80211_change_mpath,
.get_mpath = ieee80211_get_mpath,
.dump_mpath = ieee80211_dump_mpath,
.update_mesh_config = ieee80211_update_mesh_config,
.get_mesh_config = ieee80211_get_mesh_config,
.join_mesh = ieee80211_join_mesh,
.leave_mesh = ieee80211_leave_mesh,
#endif
.change_bss = ieee80211_change_bss,
.set_txq_params = ieee80211_set_txq_params,
.set_monitor_channel = ieee80211_set_monitor_channel,
.suspend = ieee80211_suspend,
.resume = ieee80211_resume,
.scan = ieee80211_scan,
.sched_scan_start = ieee80211_sched_scan_start,
.sched_scan_stop = ieee80211_sched_scan_stop,
.auth = ieee80211_auth,
.assoc = ieee80211_assoc,
.deauth = ieee80211_deauth,
.disassoc = ieee80211_disassoc,
.join_ibss = ieee80211_join_ibss,
.leave_ibss = ieee80211_leave_ibss,
.set_mcast_rate = ieee80211_set_mcast_rate,
.set_wiphy_params = ieee80211_set_wiphy_params,
.set_tx_power = ieee80211_set_tx_power,
.get_tx_power = ieee80211_get_tx_power,
.set_antenna_gain = ieee80211_set_antenna_gain,
.set_wds_peer = ieee80211_set_wds_peer,
.rfkill_poll = ieee80211_rfkill_poll,
CFG80211_TESTMODE_CMD(ieee80211_testmode_cmd)
CFG80211_TESTMODE_DUMP(ieee80211_testmode_dump)
.set_power_mgmt = ieee80211_set_power_mgmt,
.set_bitrate_mask = ieee80211_set_bitrate_mask,
.remain_on_channel = ieee80211_remain_on_channel,
.cancel_remain_on_channel = ieee80211_cancel_remain_on_channel,
.mgmt_tx = ieee80211_mgmt_tx,
.mgmt_tx_cancel_wait = ieee80211_mgmt_tx_cancel_wait,
.set_cqm_rssi_config = ieee80211_set_cqm_rssi_config,
.mgmt_frame_register = ieee80211_mgmt_frame_register,
.set_antenna = ieee80211_set_antenna,
.get_antenna = ieee80211_get_antenna,
.set_rekey_data = ieee80211_set_rekey_data,
.tdls_oper = ieee80211_tdls_oper,
.tdls_mgmt = ieee80211_tdls_mgmt,
.probe_client = ieee80211_probe_client,
.set_noack_map = ieee80211_set_noack_map,
#ifdef CONFIG_PM
.set_wakeup = ieee80211_set_wakeup,
#endif
.get_channel = ieee80211_cfg_get_channel,
.start_radar_detection = ieee80211_start_radar_detection,
.channel_switch = ieee80211_channel_switch,
.set_qos_map = ieee80211_set_qos_map,
.set_ap_chanwidth = ieee80211_set_ap_chanwidth,
};
复制代码
作者:
九阳神功爱喝茶
时间:
2015-11-19 20:43
本帖最后由 九阳神功爱喝茶 于 2015-11-22 17:22 编辑
反复看了看这个问题怎么解决,最后分析应该是通过ieee80211_scan获取各个BSS的信息的。
下面的图片是获取sta和当前连接的AP之间的信息的调用
QQ图片20151119204107.jpg
(1.07 MB, 下载次数: 43)
下载附件
2015-11-19 20:45 上传
作者:
nswcfd
时间:
2015-11-20 10:41
这记笔记的习惯挺好的,赞一个!
作者:
九阳神功爱喝茶
时间:
2015-11-20 12:04
本帖最后由 九阳神功爱喝茶 于 2015-11-22 17:22 编辑
问题已经解决,见二楼
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2