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 的回调函数集合,此结构包含驱动可以处理的各种回调函数,其中有一些是驱动必须要实现的,如 txstartstopadd_interfaceremove_interfaceconfigconfigure_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,剩下的就交给驱动和硬件处理了

参考

IEEE802.11协议栈