mac80211解析二

在实现无线网络设备分配时,ieee80211_register_hw关联了ieee80211_ops结构体:

ieee80211_ops结构体是mac80211到设备驱动的回调操作函数集合,定义如下:

/**
 * struct ieee80211_ops - callbacks from mac80211 to the driver
 *
 * This structure contains various callbacks that the driver may
 * handle or, in some cases, must handle, for example to configure
 * the hardware to a new channel or to transmit a frame.
 */
struct ieee80211_ops {
    void (*tx)(struct ieee80211_hw *hw,
           struct ieee80211_tx_control *control,
           struct sk_buff *skb);
    int (*start)(struct ieee80211_hw *hw);
    void (*stop)(struct ieee80211_hw *hw);
#ifdef CONFIG_PM
    int (*suspend)(struct ieee80211_hw *hw, struct cfg80211_wowlan *wowlan);
    int (*resume)(struct ieee80211_hw *hw);
    void (*set_wakeup)(struct ieee80211_hw *hw, bool enabled);
#endif
    int (*add_interface)(struct ieee80211_hw *hw,
                 struct ieee80211_vif *vif);
    int (*change_interface)(struct ieee80211_hw *hw,
                struct ieee80211_vif *vif,
                enum nl80211_iftype new_type, bool p2p);
    void (*remove_interface)(struct ieee80211_hw *hw,
                 struct ieee80211_vif *vif);
    int (*config)(struct ieee80211_hw *hw, u32 changed);
    void (*bss_info_changed)(struct ieee80211_hw *hw,
                 struct ieee80211_vif *vif,
                 struct ieee80211_bss_conf *info,
                 u32 changed);

    int (*start_ap)(struct ieee80211_hw *hw, struct ieee80211_vif *vif);
    void (*stop_ap)(struct ieee80211_hw *hw, struct ieee80211_vif *vif);

    u64 (*prepare_multicast)(struct ieee80211_hw *hw,
                 struct netdev_hw_addr_list *mc_list);
    void (*configure_filter)(struct ieee80211_hw *hw,
                 unsigned int changed_flags,
                 unsigned int *total_flags,
                 u64 multicast);
    int (*set_tim)(struct ieee80211_hw *hw, struct ieee80211_sta *sta,
               bool set);
    int (*set_key)(struct ieee80211_hw *hw, enum set_key_cmd cmd,
               struct ieee80211_vif *vif, struct ieee80211_sta *sta,
               struct ieee80211_key_conf *key);
    void (*update_tkip_key)(struct ieee80211_hw *hw,
                struct ieee80211_vif *vif,
                struct ieee80211_key_conf *conf,
                struct ieee80211_sta *sta,
                u32 iv32, u16 *phase1key);
    void (*set_rekey_data)(struct ieee80211_hw *hw,
                   struct ieee80211_vif *vif,
                   struct cfg80211_gtk_rekey_data *data);
    void (*set_default_unicast_key)(struct ieee80211_hw *hw,
                    struct ieee80211_vif *vif, int idx);
    int (*hw_scan)(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
               struct cfg80211_scan_request *req);
    void (*cancel_hw_scan)(struct ieee80211_hw *hw,
                   struct ieee80211_vif *vif);
    int (*sched_scan_start)(struct ieee80211_hw *hw,
                struct ieee80211_vif *vif,
                struct cfg80211_sched_scan_request *req,
                struct ieee80211_sched_scan_ies *ies);
    int (*sched_scan_stop)(struct ieee80211_hw *hw,
                   struct ieee80211_vif *vif);
    void (*sw_scan_start)(struct ieee80211_hw *hw);
    void (*sw_scan_complete)(struct ieee80211_hw *hw);
    int (*get_stats)(struct ieee80211_hw *hw,
             struct ieee80211_low_level_stats *stats);
    void (*get_tkip_seq)(struct ieee80211_hw *hw, u8 hw_key_idx,
                 u32 *iv32, u16 *iv16);
    int (*set_frag_threshold)(struct ieee80211_hw *hw, u32 value);
    int (*set_rts_threshold)(struct ieee80211_hw *hw, u32 value);
    int (*sta_add)(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
               struct ieee80211_sta *sta);
    int (*sta_remove)(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
              struct ieee80211_sta *sta);
#ifdef CPTCFG_MAC80211_DEBUGFS
    void (*sta_add_debugfs)(struct ieee80211_hw *hw,
                struct ieee80211_vif *vif,
                struct ieee80211_sta *sta,
                struct dentry *dir);
    void (*sta_remove_debugfs)(struct ieee80211_hw *hw,
                   struct ieee80211_vif *vif,
                   struct ieee80211_sta *sta,
                   struct dentry *dir);
#endif
    void (*sta_notify)(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
            enum sta_notify_cmd, struct ieee80211_sta *sta);
    int (*sta_state)(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
             struct ieee80211_sta *sta,
             enum ieee80211_sta_state old_state,
             enum ieee80211_sta_state new_state);
    void (*sta_pre_rcu_remove)(struct ieee80211_hw *hw,
                   struct ieee80211_vif *vif,
                   struct ieee80211_sta *sta);
    void (*sta_rc_update)(struct ieee80211_hw *hw,
                  struct ieee80211_vif *vif,
                  struct ieee80211_sta *sta,
                  u32 changed);
    int (*conf_tx)(struct ieee80211_hw *hw,
               struct ieee80211_vif *vif, u16 ac,
               const struct ieee80211_tx_queue_params *params);
    u64 (*get_tsf)(struct ieee80211_hw *hw, struct ieee80211_vif *vif);
    void (*set_tsf)(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
            u64 tsf);
    void (*reset_tsf)(struct ieee80211_hw *hw, struct ieee80211_vif *vif);
    int (*tx_last_beacon)(struct ieee80211_hw *hw);
    int (*ampdu_action)(struct ieee80211_hw *hw,
                struct ieee80211_vif *vif,
                enum ieee80211_ampdu_mlme_action action,
                struct ieee80211_sta *sta, u16 tid, u16 *ssn,
                u8 buf_size);
    int (*get_survey)(struct ieee80211_hw *hw, int idx,
        struct survey_info *survey);
    void (*rfkill_poll)(struct ieee80211_hw *hw);
    void (*set_coverage_class)(struct ieee80211_hw *hw, u8 coverage_class);
#ifdef CPTCFG_NL80211_TESTMODE
    int (*testmode_cmd)(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
                void *data, int len);
    int (*testmode_dump)(struct ieee80211_hw *hw, struct sk_buff *skb,
                 struct netlink_callback *cb,
                 void *data, int len);
#endif
    void (*flush)(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
              u32 queues, bool drop);
    void (*channel_switch)(struct ieee80211_hw *hw,
                   struct ieee80211_channel_switch *ch_switch);
    int (*set_antenna)(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant);
    int (*get_antenna)(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant);

    int (*remain_on_channel)(struct ieee80211_hw *hw
  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值