ieee80211_ops
struct ieee80211_ops
结构体定义就不贴在这了,这边贴一个 ath9k 具体的赋值
struct ieee80211_ops ath9k_ops = {
.tx = ath9k_tx,
.start = ath9k_start,
.stop = ath9k_stop,
.add_interface = ath9k_add_interface,
.change_interface = ath9k_change_interface,
.remove_interface = ath9k_remove_interface,
.config = ath9k_config,
.configure_filter = ath9k_configure_filter,
.sta_state = ath9k_sta_state,
.sta_notify = ath9k_sta_notify,
.conf_tx = ath9k_conf_tx,
.bss_info_changed = ath9k_bss_info_changed,
.set_key = ath9k_set_key,
.get_tsf = ath9k_get_tsf,
.set_tsf = ath9k_set_tsf,
.reset_tsf = ath9k_reset_tsf,
.ampdu_action = ath9k_ampdu_action,
.get_survey = ath9k_get_survey,
.rfkill_poll = ath9k_rfkill_poll_state,
.set_coverage_class = ath9k_set_coverage_class,
.flush = ath9k_flush,
.tx_frames_pending = ath9k_tx_frames_pending,
.tx_last_beacon = ath9k_tx_last_beacon,
.release_buffered_frames = ath9k_release_buffered_frames,
.get_stats = ath9k_get_stats,
.set_antenna = ath9k_set_antenna,
.get_antenna = ath9k_get_antenna,
#ifdef CONFIG_ATH9K_WOW
.suspend = ath9k_suspend,
.resume = ath9k_resume,
.set_wakeup = ath9k_set_wakeup,
#endif
#ifdef CONFIG_ATH9K_DEBUGFS
.get_et_sset_count = ath9k_get_et_sset_count,
.get_et_stats = ath9k_get_et_stats,
.get_et_strings = ath9k_get_et_strings,
#endif
#if defined(CONFIG_MAC80211_DEBUGFS) && defined(CONFIG_ATH9K_STATION_STATISTICS)
.sta_add_debugfs = ath9k_sta_add_debugfs,
#endif
.sw_scan_start = ath9k_sw_scan_start,
.sw_scan_complete = ath9k_sw_scan_complete,
.get_txpower = ath9k_get_txpower,
.wake_tx_queue = ath9k_wake_tx_queue,
};
struct ieee80211_ops
是 driver 注册到 mac80211 的回调函数集合,此结构包含驱动可以处理的各种回调函数,其中有一些是驱动必须要实现的,如 tx
、start
、stop
、add_interface
、remove_interface
、config
、configure_filter
。
- tx:802.11 模块发送一个帧时会调用该函数,传送一个 skb,driver 负责将帧发送出去,这个函数最好是永不失败,并且是原子的。
- start:第一个 interface 使能时使能硬件,打开帧接收。如果失败,返回负数。在设备启动前,不应该有一个MAC地址。避免收到帧。
- stop:最后一个 interface 关闭时停止硬件。
- add_interface:增加一个接口
- remove_interface:删除一个接口
- config:配置硬件,如设置信道。
- configure_filter:配置设备的 RX 过滤
思考
在驱动中为什么要调用 register_netdevice() 函数来向网络子系统注册一个网络设备
- 为了使用网络子系统的功能
- 使用 ifconfig wlan0 up 来使能驱动和硬件
- 使用 iw dev wlan0 scan 来扫描周边设备
- 提供给网络子系统发送数据的方法
- 网络子系统发送数据时调用
tx
,剩下的就交给驱动和硬件处理了
- 网络子系统发送数据时调用