WPA_SUPPLICANT筆記1

WPA_SUPPLICANT8 中 NL80211使用netlink有驅動交互的相關數據結構
nl80211其實就是利用netlink機制將一些802.11相關的命令和參數發送給驅動去執行
// 發送netlink消息
ret = send_and_recv_msgs(drv, msg, NULL, NULL);




if (!([nl_msg] msg =【1】 nl80211_drv_msg( [wpa_driver_nl80211_data] drv, 0, NL80211_CMD_SET_MAC_ACL)) ||
        【2】nla_put_u32(msg, NL80211_ATTR_ACL_POLICY, params->acl_policy ?
            NL80211_ACL_POLICY_DENY_UNLESS_LISTED :
            NL80211_ACL_POLICY_ACCEPT_UNLESS_LISTED) ||
        【3】 nla_put_nested(msg, NL80211_ATTR_MAC_ADDRS, [nl_msg] acl)) {
        nlmsg_free(msg);
        nlmsg_free(acl);
        return -ENOMEM;
    }
    ret = 【4】send_and_recv_msgs( [wpa_driver_nl80211_data] drv, msg, NULL, NULL);
//  
1.nl80211_drv_msg  該函數用於創建一個基於nl80211通信的發送給驅動程序的CMD命令消息
2.nla_put_u32 該函數用於在 CMD命令消息  添加一些該命令的一些參數 NL80211_ATTR
3.nla_put_nested 用於消息的嵌套,即 [nl_msg] msg 攜帶的屬性Key NL80211_ATTR_MAC_ADDRS,
  對應的值Value 也是一個  [nl_msg] acl 消息
4.send_and_recv_msgs  函數用於發送消息給驅動,並等待返回結果

int send_and_recv_msgs(struct wpa_driver_nl80211_data *drv,
               struct nl_msg *msg,
               int (*valid_handler)(struct nl_msg *, void *),
               void *valid_data)
{
    return send_and_recv(drv->global, drv->global->nl, msg,valid_handler, valid_data);
}



static int send_and_recv(struct nl80211_global *global,
             struct nl_handle *nl_handle, struct nl_msg *msg,
             int (*valid_handler)(struct nl_msg *, void *),
             void *valid_data)
{
    struct nl_cb *cb;
    int err = -ENOMEM;

    if (!msg)   return -ENOMEM;

    cb = nl_cb_clone(global->nl_cb);
    if (!cb)    goto out;

    err = nl_send_auto_complete(nl_handle, msg);  // 發送消息給驅動
    if (err < 0)   goto out;

    err = 1;

    nl_cb_err(cb, NL_CB_CUSTOM, error_handler, &err);
    nl_cb_set(cb, NL_CB_FINISH, NL_CB_CUSTOM, finish_handler, &err);
    nl_cb_set(cb, NL_CB_ACK, NL_CB_CUSTOM, ack_handler, &err);

    if (valid_handler)
        nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM,valid_handler, valid_data);

    while (err > 0) {
        int res = nl_recvmsgs(nl_handle, cb);  // 等待驅動處理返回
        if (res < 0) {
            wpa_printf(MSG_INFO,"nl80211: %s->nl_recvmsgs failed: %d", __func__, res);
        }
    }
 out:
    nl_cb_put(cb);
    if (!valid_handler && valid_data == (void *) -1) nl80211_nlmsg_clear(msg);
    nlmsg_free(msg);
    return err;
}
//【 nl80211對應的驅動提供的接口函數】
const struct wpa_driver_ops wpa_driver_nl80211_ops = {
    .name = "nl80211",
    .desc = "Linux nl80211/cfg80211",
    .get_bssid = wpa_driver_nl80211_get_bssid, //os_memcpy(bssid, drv->bssid, ETH_ALEN);
    .get_ssid = wpa_driver_nl80211_get_ssid,//os_memcpy(ssid, drv->ssid, drv->ssid_len);

    //msg = nl80211_ifindex_msg(drv, ifindex, 0, NL80211_CMD_SET_KEY);
    //ret = send_and_recv_msgs(drv, msg, NULL, NULL);
    .set_key = driver_nl80211_set_key,


    //msg = nl80211_scan_common(bss, NL80211_CMD_TRIGGER_SCAN, params);
    //ret = send_and_recv_msgs(drv, msg, NULL, NULL);
    .scan2 = driver_nl80211_scan2,

    //msg = nl80211_scan_common(bss, NL80211_CMD_START_SCHED_SCAN, params);
    //ret = send_and_recv_msgs(drv, msg, NULL, NULL);
    .sched_scan = wpa_driver_nl80211_sched_scan,

    //msg = nl80211_drv_msg(drv, 0, NL80211_CMD_STOP_SCHED_SCAN);
    //ret = send_and_recv_msgs(drv, msg, NULL, NULL);
    .stop_sched_scan = wpa_driver_nl80211_stop_sched_scan,

    //msg = nl80211_cmd_msg(drv->first_bss, NLM_F_DUMP,NL80211_CMD_GET_SCAN)
    //ret = send_and_recv_msgs(drv, msg, bss_info_handler, &arg);
    .get_scan_results2 = wpa_driver_nl80211_get_scan_results,

    //msg = nl80211_cmd_msg(bss, 0, NL80211_CMD_ABORT_SCAN);
    //ret = send_and_recv_msgs(drv, msg, NULL, NULL);
    .abort_scan = wpa_driver_nl80211_abort_scan,

    //  ret = wpa_driver_nl80211_mlme(drv, NULL, NL80211_CMD_DISCONNECT,reason_code, 0);
    .deauthenticate = driver_nl80211_deauthenticate,

    //msg = nl80211_drv_msg(drv, 0, NL80211_CMD_AUTHENTICATE);
    //ret = send_and_recv_msgs(drv, msg, NULL, NULL);
    .authenticate = driver_nl80211_authenticate,

    //msg = nl80211_drv_msg(drv, 0, NL80211_CMD_ASSOCIATE);
    //ret = nl80211_connect_common(drv, params, msg);
    //ret = send_and_recv_msgs(drv, msg, NULL, NULL);
    .associate = wpa_driver_nl80211_associate,

    //wpa_driver_nl80211_init_nl_global(global)
    //global->ioctl_sock = socket(PF_INET, SOCK_DGRAM, 0);
    //【PF_INET socket接口,主要用於向kernel 發送ioctl命令,控制並獲取相應信息。】
    .global_init = nl80211_global_init,

    //nl_destroy_handles(&global->nl);
    //  if (global->ioctl_sock >= 0)   close(global->ioctl_sock);
    .global_deinit = nl80211_global_deinit,

// drv->eapol_tx_sock = socket(PF_PACKET, SOCK_DGRAM, 0);【 PF_PACKET 主要用於向driver上下傳遞802.1X報文】
    .init2 = wpa_driver_nl80211_init,

//  if (drv->eapol_sock >= 0) {eloop_unregister_read_sock(drv->eapol_sock);close(drv->eapol_sock);}
// 關閉 eapol_sock
    .deinit = driver_nl80211_deinit,

//os_memcpy(capa, &drv->capa, sizeof(*capa));
    .get_capa = wpa_driver_nl80211_get_capa,

    //os_memset(&req, 0, sizeof(req));
    //ret = send(netlink->sock, &req, req.hdr.nlmsg_len, 0);
    .set_operstate = wpa_driver_nl80211_set_operstate,

    //msg = nl80211_bss_msg(bss, 0, NL80211_CMD_SET_STATION)
    //ret = send_and_recv_msgs(drv, msg, NULL, NULL);
    .set_supp_port = wpa_driver_nl80211_set_supp_port,

    //  struct nl_msg *msg;      msg = nlmsg_alloc();
    //nl80211_cmd(drv, msg, 0, NL80211_CMD_REQ_SET_REG)    
    //send_and_recv_msgs(drv, msg, NULL, NULL)
    .set_country = wpa_driver_nl80211_set_country,

    //  struct nl_msg *msg;   msg = nlmsg_alloc()
    //nl80211_cmd(drv, msg, 0, NL80211_CMD_GET_REG);
    //  send_and_recv_msgs(drv, msg, nl80211_get_country, alpha2);
    .get_country = wpa_driver_nl80211_get_country,


    //msg = nl80211_bss_msg(bss, 0, NL80211_CMD_NEW_BEACON))
    //ret = send_and_recv_msgs(drv, msg, NULL, NULL);
    .set_ap = wpa_driver_nl80211_set_ap,

    //msg = nl80211_drv_msg(drv, 0, NL80211_CMD_SET_MAC_ACL)
    //ret = send_and_recv_msgs(drv, msg, NULL, NULL);
    .set_acl = wpa_driver_nl80211_set_acl,

    //ifidx = nl80211_create_iface(drv, ifname, nlmode, addr, 0, NULL, NULL, use_existing);
    //add_ifidx(drv, ifidx, IFIDX_ANY);
    .if_add = wpa_driver_nl80211_if_add,

    //nl80211_remove_iface(drv, ifindex); nl80211_teardown_ap(bss);
    .if_remove = driver_nl80211_if_remove,

//  res = nl80211_send_frame_cmd(bss, freq, wait_time, data, len,&cookie, no_cck, noack, offchanok,csa_offs, csa_offs_len);
    //msg = nl80211_cmd_msg(bss, 0, NL80211_CMD_FRAME)
    //ret = send_and_recv_msgs(drv, msg, cookie_handler, &cookie);
    .send_mlme = driver_nl80211_send_mlme,

    //msg = nl80211_cmd_msg(bss, nl_flags, NL80211_CMD_GET_WIPHY)
    //send_and_recv_msgs(drv, msg, phy_info_handler, &result)
    .get_hw_feature_data = nl80211_get_hw_feature_data,

    //  msg = nl80211_bss_msg(bss, 0, params->set ? NL80211_CMD_SET_STATION :NL80211_CMD_NEW_STATION);
    //ret = send_and_recv_msgs(drv, msg, NULL, NULL);
    .sta_add = wpa_driver_nl80211_sta_add,

    //msg = nl80211_bss_msg(bss, 0, NL80211_CMD_DEL_STATION)
    //ret = send_and_recv_msgs(drv, msg, NULL, NULL);
    .sta_remove = driver_nl80211_sta_remove,

//res = wpa_driver_nl80211_send_frame(bss, (u8 *) hdr, len, encrypt, 0, 0, 0, 0, 0, NULL, 0);
//res = nl80211_send_frame_cmd(bss, freq, wait_time, data, len, &cookie, no_cck, noack, offchanok,csa_offs, csa_offs_len);
    .hapd_send_eapol = wpa_driver_nl80211_hapd_send_eapol,

    //(msg = nl80211_bss_msg(bss, 0, NL80211_CMD_SET_STATION) 
    //flags = nla_nest_start(msg, NL80211_ATTR_STA_FLAGS);
    //send_and_recv_msgs(bss->drv, msg, NULL, NULL);
    .sta_set_flags = wpa_driver_nl80211_sta_set_flags,

    //  bss = wpa_driver_nl80211_drv_init(hapd, params->ifname,params->global_priv, 1,
    // params->bssid, params->driver_params);
    //drv->eapol_tx_sock = socket(PF_PACKET, SOCK_DGRAM, 0);
    .hapd_init = i802_init,

    //close(drv->eapol_tx_sock);  close(drv->eapol_sock);  nl80211_destroy_bss(drv->first_bss);
    .hapd_deinit = i802_deinit,

    //msg = nl80211_bss_msg(bss, 0, NL80211_CMD_SET_STATION))
    //ret = send_and_recv_msgs(drv, msg, NULL, NULL);
    .set_wds_sta = i802_set_wds_sta,

    //  msg = nl80211_ifindex_msg(drv, if_nametoindex(iface), 0,NL80211_CMD_GET_KEY);
    //  send_and_recv_msgs(drv, msg, get_key_handler, seq);
    .get_seqnum = i802_get_seqnum,

    // msg = nl80211_bss_msg(bss, 0, NL80211_CMD_DEL_STATION);
    // res = send_and_recv_msgs(bss->drv, msg, NULL, NULL);
    .flush = i802_flush,

    //msg = nl80211_bss_msg(bss, 0, NL80211_CMD_SET_WIPHY); 
    //txq = nla_nest_start(msg, NL80211_ATTR_WIPHY_TXQ_PARAMS);
    //send_and_recv_msgs(drv, msg, NULL, NULL)
    .get_inact_sec = i802_get_inact_sec,

    //return 0;
    .sta_clear_stats = i802_sta_clear_stats,

    //msg = nl80211_drv_msg(drv, 0, NL80211_CMD_SET_WIPHY)
    //ret = send_and_recv_msgs(drv, msg, NULL, NULL);
    .set_rts = i802_set_rts,

    //msg = nl80211_drv_msg(drv, 0, NL80211_CMD_SET_WIPHY))
    //ret = send_and_recv_msgs(drv, msg, NULL, NULL);
    .set_frag = i802_set_frag,

    //msg = nl80211_bss_msg(bss, 0, NL80211_CMD_SET_WIPHY);
    //send_and_recv_msgs(drv, msg, NULL, NULL)
    .set_tx_queue_params = i802_set_tx_queue_params,

    //msg = nl80211_bss_msg(bss, 0, NL80211_CMD_SET_STATION))
    //ret = send_and_recv_msgs(drv, msg, NULL, NULL);
    .set_sta_vlan = driver_nl80211_set_sta_vlan,

    //msg = nl80211_cmd_msg(bss, 0, NL80211_CMD_FRAME))
    //ret = send_and_recv_msgs(drv, msg, cookie_handler, &cookie);
    .sta_deauth = i802_sta_deauth,

    //msg = nl80211_bss_msg(bss, 0, NL80211_CMD_DEL_STATION))
    //ret = send_and_recv_msgs(drv, msg, NULL, NULL);
    .sta_disassoc = i802_sta_disassoc,

    //msg = nl80211_bss_msg(bss, 0, NL80211_CMD_GET_STATION))
    //send_and_recv_msgs(bss->drv, msg, get_sta_handler, data);
    .read_sta_data = driver_nl80211_read_sta_data,

    //  msg = nl80211_drv_msg(drv, 0, set_chan ? NL80211_CMD_SET_CHANNEL : NL80211_CMD_SET_WIPHY)
    //ret = send_and_recv_msgs(drv, msg, NULL, NULL);
    .set_freq = i802_set_freq,

    //msg = nl80211_cmd_msg(bss, 0, NL80211_CMD_FRAME))
    //msg = nl80211_cmd_msg(bss, 0, NL80211_CMD_FRAME))
    .send_action = driver_nl80211_send_action,

    //msg = nl80211_cmd_msg(bss, 0, NL80211_CMD_FRAME_WAIT_CANCEL)
    //ret = send_and_recv_msgs(drv, msg, NULL, NULL);
    .send_action_cancel_wait = wpa_driver_nl80211_send_action_cancel_wait,

    //msg = nl80211_cmd_msg(bss, 0, NL80211_CMD_REMAIN_ON_CHANNEL))
    //ret = send_and_recv_msgs(drv, msg, cookie_handler, &cookie);
    .remain_on_channel = wpa_driver_nl80211_remain_on_channel,

    //msg = nl80211_cmd_msg(bss, 0, NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL);
    //ret = send_and_recv_msgs(drv, msg, NULL, NULL);
    .cancel_remain_on_channel = wpa_driver_nl80211_cancel_remain_on_channel,


    //msg = nl80211_drv_msg(drv, 0, NL80211_CMD_UPDATE_FT_IES))
    //ret = send_and_recv_msgs(drv, msg, NULL, NULL);
    .probe_req_report = driver_nl80211_probe_req_report,

    //  msg = nl80211_drv_msg(drv, 0, NL80211_CMD_DEL_BEACON);
    // send_and_recv_msgs(drv, msg, NULL, NULL);
    .deinit_ap = wpa_driver_nl80211_deinit_ap,

    //msg = nl80211_cmd_msg(drv->first_bss, 0, NL80211_CMD_SET_INTERFACE);
    //ret = send_and_recv_msgs(drv, msg, NULL, NULL);
    // mode_switch_res = nl80211_set_mode(drv, drv->ifindex, nlmode);
    .deinit_p2p_cli = wpa_driver_nl80211_deinit_p2p_cli,

    //  msg = nl80211_ifindex_msg(drv, ifindex, 0,NL80211_CMD_SET_TX_BITRATE_MASK);
    //ret = send_and_recv_msgs(drv, msg, NULL, NULL);
    .resume = wpa_driver_nl80211_resume,

    //msg = nl80211_bss_msg(bss, 0, NL80211_CMD_SET_CQM))
    //send_and_recv_msgs(drv, msg, NULL, NULL);
    .signal_monitor = nl80211_signal_monitor,

    //res = nl80211_get_link_signal(drv, si);  nl80211_get_channel_width(drv, si);
    //msg = nl80211_drv_msg(drv, NLM_F_DUMP, NL80211_CMD_GET_SURVEY);
    // send_and_recv_msgs(drv, msg, get_link_noise, sig_change);
    .signal_poll = nl80211_signal_poll,

    //res = nl80211_send_frame_cmd(bss, freq, wait_time, data, len,&cookie, no_cck, noack, offchanok,
    //csa_offs, csa_offs_len);
    //msg = nl80211_cmd_msg(bss, 0, NL80211_CMD_FRAME)
    //ret = send_and_recv_msgs(drv, msg, cookie_handler, &cookie);
    .send_frame = nl80211_send_frame,

    //      drv->capa.flags &= ~WPA_DRIVER_FLAGS_SME; drv->force_connect_cmd = 1;
    .set_param = nl80211_set_param,

    //drv->phyname;
    .get_radio_name = nl80211_get_radio_name,


    //msg = nl80211_bss_msg(bss, 0, NL80211_CMD_SET_PMKSA)) 
    //send_and_recv_msgs(bss->drv, msg, NULL, NULL);
    .add_pmkid = nl80211_add_pmkid,


    //msg = nl80211_bss_msg(bss, 0, NL80211_CMD_DEL_PMKSA)) 
    //send_and_recv_msgs(bss->drv, msg, NULL, NULL);
    .remove_pmkid = nl80211_remove_pmkid,


    //msg = nl80211_bss_msg(bss, 0, NL80211_CMD_FLUSH_PMKSA)) 
    //send_and_recv_msgs(bss->drv, msg, NULL, NULL);
    .flush_pmkid = nl80211_flush_pmkid,

    //msg = nl80211_bss_msg(bss, 0, NL80211_CMD_SET_REKEY_OFFLOAD))
    //ret = send_and_recv_msgs(drv, msg, NULL, (void *) -1);
    .set_rekey_info = nl80211_set_rekey_info,

    //msg = nl80211_bss_msg(bss, 0, NL80211_CMD_PROBE_CLIENT))
    //ret = send_and_recv_msgs(drv, msg, NULL, NULL);
    .poll_client = nl80211_poll_client,

    //msg = nl80211_bss_msg(bss, 0, NL80211_CMD_SET_POWER_SAVE))
    //send_and_recv_msgs(bss->drv, msg, NULL, NULL);
    .set_p2p_powersave = nl80211_set_p2p_powersave,

    //msg = nl80211_drv_msg(drv, 0, NL80211_CMD_RADAR_DETECT))
    //ret = send_and_recv_msgs(drv, msg, NULL, NULL);
    .start_dfs_cac = nl80211_start_radar_detection,

    //  msg = nl80211_drv_msg(drv, 0, NL80211_CMD_DEL_BEACON);
    // return send_and_recv_msgs(drv, msg, NULL, NULL);
    .stop_ap = wpa_driver_nl80211_stop_ap,

#ifdef CONFIG_TDLS  
#TDLS(Tunneled Direct Link Setup,通道直接鏈路建立)的無線標準,
#這項標準允許兩款設備通過WiFi網絡進行點對點直連,
#與早起提倡的WiFi Direct相似,不過功能則更加完善

    .send_tdls_mgmt = nl80211_send_tdls_mgmt,
    .tdls_oper = nl80211_tdls_oper,
    .tdls_enable_channel_switch = nl80211_tdls_enable_channel_switch,
    .tdls_disable_channel_switch = nl80211_tdls_disable_channel_switch,
#endif /* CONFIG_TDLS */

//msg = nl80211_drv_msg(drv, 0, NL80211_CMD_UPDATE_FT_IES)
//ret = send_and_recv_msgs(drv, msg, NULL, NULL);
    .update_ft_ies = wpa_driver_nl80211_update_ft_ies,

    //(i802_bss *bss)->addr;
    .get_mac_addr = wpa_driver_nl80211_get_macaddr,

    //msg = nl80211_drv_msg(drv, NLM_F_DUMP, NL80211_CMD_GET_SURVEY);
    //  err = send_and_recv_msgs(drv, msg, survey_handler,survey_results);
    .get_survey = wpa_driver_nl80211_get_survey,


    .status = wpa_driver_nl80211_status, 【打印】
    //res = os_snprintf(pos, end - pos,
              "ifindex=%d\n"
              "ifname=%s\n"
              "brname=%s\n"
              "addr=" MACSTR "\n"
              "freq=%d\n"
              "%s%s%s%s%s",
              bss->ifindex,
              bss->ifname,
              bss->brname,
              MAC2STR(bss->addr),
              bss->freq,
              bss->beacon_set ? "beacon_set=1\n" : "",
              bss->added_if_into_bridge ?
              "added_if_into_bridge=1\n" : "",
              bss->added_bridge ? "added_bridge=1\n" : "",
              bss->in_deinit ? "in_deinit=1\n" : "",
              bss->if_dynamic ? "if_dynamic=1\n" : "");

    //msg = nl80211_bss_msg(bss, 0, NL80211_CMD_CHANNEL_SWITCH)
    //ret = send_and_recv_msgs(drv, msg, NULL, NULL);
    .switch_channel = nl80211_switch_channel,
#ifdef ANDROID_P2P
    .set_noa = wpa_driver_set_p2p_noa,    //return 0;
    .get_noa = wpa_driver_get_p2p_noa,   //return 0;
    .set_ap_wps_ie = wpa_driver_set_ap_wps_p2p_ie, //return 0;
#endif /* ANDROID_P2P */
#ifdef ANDROID
#ifndef ANDROID_LIB_STUB
    .driver_cmd = wpa_driver_nl80211_driver_cmd,
#endif /* !ANDROID_LIB_STUB */
#endif /* ANDROID */

//msg = nl80211_cmd_msg(bss, 0, NL80211_CMD_VENDOR))
//ret = send_and_recv_msgs(drv, msg, vendor_reply_handler, buf);
    .vendor_cmd = nl80211_vendor_cmd,

    //msg = nl80211_drv_msg(drv, 0, NL80211_CMD_SET_QOS_MAP)
    //  ret = send_and_recv_msgs(drv, msg, NULL, NULL);
    .set_qos_map = nl80211_set_qos_map,

    //msg = nl80211_cmd_msg(bss, 0, NL80211_CMD_SET_WOWLAN)) 
    //  ret = send_and_recv_msgs(drv, msg, NULL, NULL);
    .set_wowlan = nl80211_set_wowlan,

    //drv->addr_changed = new_addr;  os_memcpy(bss->addr, addr, ETH_ALEN); 
    //linux_set_iface_flags(drv->global->ioctl_sock, bss->ifname, 1) 
    .set_mac_addr = nl80211_set_mac_addr,
#ifdef CONFIG_MESH
    .init_mesh = wpa_driver_nl80211_init_mesh,
    .join_mesh = wpa_driver_nl80211_join_mesh,
    .leave_mesh = wpa_driver_nl80211_leave_mesh,
#endif /* CONFIG_MESH */

//nl_lladdr = nl_addr_build(AF_BRIDGE, (u8 *) addr, ETH_ALEN); 
//res = rtnl_neigh_add(drv->rtnl_sk, rn, NLM_F_CREATE);
    .br_add_ip_neigh = wpa_driver_br_add_ip_neigh,

    //res = rtnl_neigh_delete(drv->rtnl_sk, rn, 0);
    .br_delete_ip_neigh = wpa_driver_br_delete_ip_neigh,

    //attr_txt = drv_br_port_attr_str(attr);
    //linux_write_system_file(path, val)
    .br_port_set_attr = wpa_driver_br_port_set_attr,

    //param_txt = drv_br_net_param_str(param);
    //linux_write_system_file(path, val)
    .br_set_net_param = wpa_driver_br_set_net_param,

    //msg = nl80211_cmd_msg(bss, 0, NL80211_CMD_ADD_TX_TS);
    //ret = send_and_recv_msgs(drv, msg, NULL, NULL);
    .add_tx_ts = nl80211_add_ts,

    //msg = nl80211_cmd_msg(bss, 0, NL80211_CMD_DEL_TX_TS))
    //ret = send_and_recv_msgs(drv, msg, NULL, NULL);
    .del_tx_ts = nl80211_del_ts,

    //(i802_bss *bss).drv->ifindex;
    .get_ifindex = nl80211_get_ifindex,

#ifdef CONFIG_DRIVER_NL80211_QCA   QCA==高通聯網芯片

//msg = nl80211_drv_msg(drv, 0, NL80211_CMD_VENDOR))
//send_and_recv_msgs(drv, msg, NULL, NULL);
    .roaming = nl80211_roaming,
    .do_acs = wpa_driver_do_acs,
    .set_band = nl80211_set_band,
    .get_pref_freq_list = nl80211_get_pref_freq_list,
    .set_prob_oper_freq = nl80211_set_prob_oper_freq,
    .p2p_lo_start = nl80211_p2p_lo_start,
    .p2p_lo_stop = nl80211_p2p_lo_stop,
    .set_default_scan_ies = nl80211_set_default_scan_ies,
    .set_tdls_mode = nl80211_set_tdls_mode,
#endif /* CONFIG_DRIVER_NL80211_QCA */

    //ret = nl80211_write_to_file(path,!!(filter_flags &WPA_DATA_FRAME_FILTER_FLAG_GTK));
    //fd = open(name, O_RDWR);   write(fd, tmp, len);
    .configure_data_frame_filters = nl80211_configure_data_frame_filters,

    //drv->extended_capa;
    .get_ext_capab = nl80211_get_ext_capab,
};
//【 nl80211對應的驅動數據結構】

struct wpa_driver_nl80211_data {
    struct nl80211_global *global;
    struct dl_list list;
    struct dl_list wiphy_list;
    char phyname[32];
    unsigned int wiphy_idx;
    u8 perm_addr[ETH_ALEN];
    void *ctx;
    int ifindex;
    int if_removed;
    int if_disabled;
    int ignore_if_down_event;
    struct rfkill_data *rfkill;
    struct wpa_driver_capa capa;
    u8 *extended_capa, *extended_capa_mask;
    unsigned int extended_capa_len;
    struct drv_nl80211_ext_capa {
        enum nl80211_iftype iftype;
        u8 *ext_capa, *ext_capa_mask;
        unsigned int ext_capa_len;
    } iface_ext_capa[NL80211_IFTYPE_MAX];
    unsigned int num_iface_ext_capa;

    int has_capability;

    int operstate;

    int scan_complete_events;
    enum scan_states {
        NO_SCAN, SCAN_REQUESTED, SCAN_STARTED, SCAN_COMPLETED,
        SCAN_ABORTED, SCHED_SCAN_STARTED, SCHED_SCAN_STOPPED,
        SCHED_SCAN_RESULTS
    } scan_state;

    u8 auth_bssid[ETH_ALEN];
    u8 auth_attempt_bssid[ETH_ALEN];
    u8 bssid[ETH_ALEN];
    u8 prev_bssid[ETH_ALEN];
    int associated;
    u8 ssid[SSID_MAX_LEN];
    size_t ssid_len;
    enum nl80211_iftype nlmode;
    enum nl80211_iftype ap_scan_as_station;
    unsigned int assoc_freq;

    int monitor_sock;
    int monitor_ifidx;
    int monitor_refcount;

    unsigned int disabled_11b_rates:1;
    unsigned int pending_remain_on_chan:1;
    unsigned int in_interface_list:1;
    unsigned int device_ap_sme:1;
    unsigned int poll_command_supported:1;
    unsigned int data_tx_status:1;
    unsigned int scan_for_auth:1;
    unsigned int retry_auth:1;
    unsigned int use_monitor:1;
    unsigned int ignore_next_local_disconnect:1;
    unsigned int ignore_next_local_deauth:1;
    unsigned int hostapd:1;
    unsigned int start_mode_ap:1;
    unsigned int start_iface_up:1;
    unsigned int test_use_roc_tx:1;
    unsigned int ignore_deauth_event:1;
    unsigned int vendor_cmd_test_avail:1;
    unsigned int roaming_vendor_cmd_avail:1;
    unsigned int dfs_vendor_cmd_avail:1;
    unsigned int have_low_prio_scan:1;
    unsigned int force_connect_cmd:1;
    unsigned int addr_changed:1;
    unsigned int get_features_vendor_cmd_avail:1;
    unsigned int set_rekey_offload:1;
    unsigned int p2p_go_ctwindow_supported:1;
    unsigned int setband_vendor_cmd_avail:1;
    unsigned int get_pref_freq_list:1;
    unsigned int set_prob_oper_freq:1;
    unsigned int scan_vendor_cmd_avail:1;
    unsigned int connect_reassoc:1;
    unsigned int set_wifi_conf_vendor_cmd_avail:1;
    unsigned int he_capab_vendor_cmd_avail:1;

    u64 vendor_scan_cookie;
    u64 remain_on_chan_cookie;
    u64 send_action_cookie;
#define MAX_SEND_ACTION_COOKIES 20
    u64 send_action_cookies[MAX_SEND_ACTION_COOKIES];
    unsigned int num_send_action_cookies;

    unsigned int last_mgmt_freq;

    struct wpa_driver_scan_filter *filter_ssids;
    size_t num_filter_ssids;

    struct i802_bss *first_bss;

    int eapol_tx_sock;

    int eapol_sock; /* socket for EAPOL frames  */

    struct nl_handle *rtnl_sk; /* nl_sock for NETLINK_ROUTE */

    int default_if_indices[16];
    /* the AP/AP_VLAN iface that is in this bridge */
    int default_if_indices_reason[16];
    int *if_indices;
    int *if_indices_reason;
    int num_if_indices;

    /* From failed authentication command */
    int auth_freq;
    u8 auth_bssid_[ETH_ALEN];
    u8 auth_ssid[SSID_MAX_LEN];
    size_t auth_ssid_len;
    int auth_alg;
    u8 *auth_ie;
    size_t auth_ie_len;
    u8 auth_wep_key[4][16];
    size_t auth_wep_key_len[4];
    int auth_wep_tx_keyidx;
    int auth_local_state_change;
    int auth_p2p;

    /*
     * Tells whether the last scan issued from wpa_supplicant was a normal
     * scan (NL80211_CMD_TRIGGER_SCAN) or a vendor scan
     * (NL80211_CMD_VENDOR). 0 if no pending scan request.
     */
    int last_scan_cmd;

    struct he_capabilities he_capab;
};
// 發送netlink消息
ret = send_and_recv_msgs(drv, msg, NULL, NULL);

nl80211其實就是利用netlink機制將一些802.11相關的命令和參數發送給驅動去執行
// 【80211 中的命令  】


enum nl80211_commands {
/* don't change the order or add anything between, this is ABI! */
    NL80211_CMD_UNSPEC,

    NL80211_CMD_GET_WIPHY,      /* can dump */
    NL80211_CMD_SET_WIPHY,
    NL80211_CMD_NEW_WIPHY,
    NL80211_CMD_DEL_WIPHY,

    NL80211_CMD_GET_INTERFACE,  /* can dump */
    NL80211_CMD_SET_INTERFACE,
    NL80211_CMD_NEW_INTERFACE,
    NL80211_CMD_DEL_INTERFACE,

    NL80211_CMD_GET_KEY,
    NL80211_CMD_SET_KEY,
    NL80211_CMD_NEW_KEY,
    NL80211_CMD_DEL_KEY,

    NL80211_CMD_GET_BEACON,
    NL80211_CMD_SET_BEACON,
    NL80211_CMD_START_AP,
    NL80211_CMD_NEW_BEACON = NL80211_CMD_START_AP,
    NL80211_CMD_STOP_AP,
    NL80211_CMD_DEL_BEACON = NL80211_CMD_STOP_AP,

    NL80211_CMD_GET_STATION,
    NL80211_CMD_SET_STATION,
    NL80211_CMD_NEW_STATION,
    NL80211_CMD_DEL_STATION,

    NL80211_CMD_GET_MPATH,
    NL80211_CMD_SET_MPATH,
    NL80211_CMD_NEW_MPATH,
    NL80211_CMD_DEL_MPATH,

    NL80211_CMD_SET_BSS,

    NL80211_CMD_SET_REG,
    NL80211_CMD_REQ_SET_REG,

    NL80211_CMD_GET_MESH_CONFIG,
    NL80211_CMD_SET_MESH_CONFIG,

    NL80211_CMD_SET_MGMT_EXTRA_IE /* reserved; not used */,

    NL80211_CMD_GET_REG,

    NL80211_CMD_GET_SCAN,
    NL80211_CMD_TRIGGER_SCAN,
    NL80211_CMD_NEW_SCAN_RESULTS,
    NL80211_CMD_SCAN_ABORTED,

    NL80211_CMD_REG_CHANGE,

    NL80211_CMD_AUTHENTICATE,
    NL80211_CMD_ASSOCIATE,
    NL80211_CMD_DEAUTHENTICATE,
    NL80211_CMD_DISASSOCIATE,

    NL80211_CMD_MICHAEL_MIC_FAILURE,

    NL80211_CMD_REG_BEACON_HINT,

    NL80211_CMD_JOIN_IBSS,
    NL80211_CMD_LEAVE_IBSS,

    NL80211_CMD_TESTMODE,

    NL80211_CMD_CONNECT,
    NL80211_CMD_ROAM,
    NL80211_CMD_DISCONNECT,

    NL80211_CMD_SET_WIPHY_NETNS,

    NL80211_CMD_GET_SURVEY,
    NL80211_CMD_NEW_SURVEY_RESULTS,

    NL80211_CMD_SET_PMKSA,
    NL80211_CMD_DEL_PMKSA,
    NL80211_CMD_FLUSH_PMKSA,

    NL80211_CMD_REMAIN_ON_CHANNEL,
    NL80211_CMD_CANCEL_REMAIN_ON_CHANNEL,

    NL80211_CMD_SET_TX_BITRATE_MASK,

    NL80211_CMD_REGISTER_FRAME,
    NL80211_CMD_REGISTER_ACTION = NL80211_CMD_REGISTER_FRAME,
    NL80211_CMD_FRAME,
    NL80211_CMD_ACTION = NL80211_CMD_FRAME,
    NL80211_CMD_FRAME_TX_STATUS,
    NL80211_CMD_ACTION_TX_STATUS = NL80211_CMD_FRAME_TX_STATUS,

    NL80211_CMD_SET_POWER_SAVE,
    NL80211_CMD_GET_POWER_SAVE,

    NL80211_CMD_SET_CQM,
    NL80211_CMD_NOTIFY_CQM,

    NL80211_CMD_SET_CHANNEL,
    NL80211_CMD_SET_WDS_PEER,

    NL80211_CMD_FRAME_WAIT_CANCEL,

    NL80211_CMD_JOIN_MESH,
    NL80211_CMD_LEAVE_MESH,

    NL80211_CMD_UNPROT_DEAUTHENTICATE,
    NL80211_CMD_UNPROT_DISASSOCIATE,

    NL80211_CMD_NEW_PEER_CANDIDATE,

    NL80211_CMD_GET_WOWLAN,
    NL80211_CMD_SET_WOWLAN,

    NL80211_CMD_START_SCHED_SCAN,
    NL80211_CMD_STOP_SCHED_SCAN,
    NL80211_CMD_SCHED_SCAN_RESULTS,
    NL80211_CMD_SCHED_SCAN_STOPPED,

    NL80211_CMD_SET_REKEY_OFFLOAD,

    NL80211_CMD_PMKSA_CANDIDATE,

    NL80211_CMD_TDLS_OPER,
    NL80211_CMD_TDLS_MGMT,

    NL80211_CMD_UNEXPECTED_FRAME,

    NL80211_CMD_PROBE_CLIENT,

    NL80211_CMD_REGISTER_BEACONS,

    NL80211_CMD_UNEXPECTED_4ADDR_FRAME,

    NL80211_CMD_SET_NOACK_MAP,

    NL80211_CMD_CH_SWITCH_NOTIFY,

    NL80211_CMD_START_P2P_DEVICE,
    NL80211_CMD_STOP_P2P_DEVICE,

    NL80211_CMD_CONN_FAILED,

    NL80211_CMD_SET_MCAST_RATE,

    NL80211_CMD_SET_MAC_ACL, // 設置Mac訪問控制表, MAC ACL能根據幀的源和目的MAC及幀的類型進行過濾

    NL80211_CMD_RADAR_DETECT,

    NL80211_CMD_GET_PROTOCOL_FEATURES,

    NL80211_CMD_UPDATE_FT_IES,
    NL80211_CMD_FT_EVENT,

    NL80211_CMD_CRIT_PROTOCOL_START,
    NL80211_CMD_CRIT_PROTOCOL_STOP,

    NL80211_CMD_GET_COALESCE,
    NL80211_CMD_SET_COALESCE,

    NL80211_CMD_CHANNEL_SWITCH,

    NL80211_CMD_VENDOR,

    NL80211_CMD_SET_QOS_MAP,

    NL80211_CMD_ADD_TX_TS,
    NL80211_CMD_DEL_TX_TS,

    NL80211_CMD_GET_MPP,

    NL80211_CMD_JOIN_OCB,
    NL80211_CMD_LEAVE_OCB,

    NL80211_CMD_CH_SWITCH_STARTED_NOTIFY,

    NL80211_CMD_TDLS_CHANNEL_SWITCH,
    NL80211_CMD_TDLS_CANCEL_CHANNEL_SWITCH,

    NL80211_CMD_WIPHY_REG_CHANGE,

    NL80211_CMD_ABORT_SCAN,

    NL80211_CMD_START_NAN,
    NL80211_CMD_STOP_NAN,
    NL80211_CMD_ADD_NAN_FUNCTION,
    NL80211_CMD_DEL_NAN_FUNCTION,
    NL80211_CMD_CHANGE_NAN_CONFIG,
    NL80211_CMD_NAN_MATCH,

    NL80211_CMD_SET_MULTICAST_TO_UNICAST,

    NL80211_CMD_UPDATE_CONNECT_PARAMS,

    /* add new commands above here */

    /* used to define NL80211_CMD_MAX below */
    __NL80211_CMD_AFTER_LAST,
    NL80211_CMD_MAX = __NL80211_CMD_AFTER_LAST - 1
};

nl80211其實就是利用netlink機制將一些802.11相關的命令和參數發送給驅動去執行
// 【80211 中的屬性  】

enum nl80211_attrs {
/* don't change the order or add anything between, this is ABI! */
    NL80211_ATTR_UNSPEC,

    NL80211_ATTR_WIPHY,
    NL80211_ATTR_WIPHY_NAME,

    NL80211_ATTR_IFINDEX,  【網絡設備編號】
    NL80211_ATTR_IFNAME,
    NL80211_ATTR_IFTYPE,

    NL80211_ATTR_MAC,

    NL80211_ATTR_KEY_DATA,
    NL80211_ATTR_KEY_IDX,
    NL80211_ATTR_KEY_CIPHER,
    NL80211_ATTR_KEY_SEQ,
    NL80211_ATTR_KEY_DEFAULT,

    NL80211_ATTR_BEACON_INTERVAL,
    NL80211_ATTR_DTIM_PERIOD,
    NL80211_ATTR_BEACON_HEAD,
    NL80211_ATTR_BEACON_TAIL,

    NL80211_ATTR_STA_AID,
    NL80211_ATTR_STA_FLAGS,
    NL80211_ATTR_STA_LISTEN_INTERVAL,
    NL80211_ATTR_STA_SUPPORTED_RATES,
    NL80211_ATTR_STA_VLAN,
    NL80211_ATTR_STA_INFO,

    NL80211_ATTR_WIPHY_BANDS,

    NL80211_ATTR_MNTR_FLAGS,

    NL80211_ATTR_MESH_ID,
    NL80211_ATTR_STA_PLINK_ACTION,
    NL80211_ATTR_MPATH_NEXT_HOP,
    NL80211_ATTR_MPATH_INFO,

    NL80211_ATTR_BSS_CTS_PROT,
    NL80211_ATTR_BSS_SHORT_PREAMBLE,
    NL80211_ATTR_BSS_SHORT_SLOT_TIME,

    NL80211_ATTR_HT_CAPABILITY,

    NL80211_ATTR_SUPPORTED_IFTYPES,

    NL80211_ATTR_REG_ALPHA2,
    NL80211_ATTR_REG_RULES,

    NL80211_ATTR_MESH_CONFIG,

    NL80211_ATTR_BSS_BASIC_RATES,

    NL80211_ATTR_WIPHY_TXQ_PARAMS,
    NL80211_ATTR_WIPHY_FREQ,
    NL80211_ATTR_WIPHY_CHANNEL_TYPE,

    NL80211_ATTR_KEY_DEFAULT_MGMT,

    NL80211_ATTR_MGMT_SUBTYPE,
    NL80211_ATTR_IE,

    NL80211_ATTR_MAX_NUM_SCAN_SSIDS,

    NL80211_ATTR_SCAN_FREQUENCIES,
    NL80211_ATTR_SCAN_SSIDS,
    NL80211_ATTR_GENERATION, /* replaces old SCAN_GENERATION */
    NL80211_ATTR_BSS,

    NL80211_ATTR_REG_INITIATOR,
    NL80211_ATTR_REG_TYPE,

    NL80211_ATTR_SUPPORTED_COMMANDS,

    NL80211_ATTR_FRAME,
    NL80211_ATTR_SSID,
    NL80211_ATTR_AUTH_TYPE,
    NL80211_ATTR_REASON_CODE,

    NL80211_ATTR_KEY_TYPE,

    NL80211_ATTR_MAX_SCAN_IE_LEN,
    NL80211_ATTR_CIPHER_SUITES,

    NL80211_ATTR_FREQ_BEFORE,
    NL80211_ATTR_FREQ_AFTER,

    NL80211_ATTR_FREQ_FIXED,


    NL80211_ATTR_WIPHY_RETRY_SHORT,
    NL80211_ATTR_WIPHY_RETRY_LONG,
    NL80211_ATTR_WIPHY_FRAG_THRESHOLD,
    NL80211_ATTR_WIPHY_RTS_THRESHOLD,

    NL80211_ATTR_TIMED_OUT,

    NL80211_ATTR_USE_MFP,

    NL80211_ATTR_STA_FLAGS2,

    NL80211_ATTR_CONTROL_PORT,

    NL80211_ATTR_TESTDATA,

    NL80211_ATTR_PRIVACY,

    NL80211_ATTR_DISCONNECTED_BY_AP,
    NL80211_ATTR_STATUS_CODE,

    NL80211_ATTR_CIPHER_SUITES_PAIRWISE,
    NL80211_ATTR_CIPHER_SUITE_GROUP,
    NL80211_ATTR_WPA_VERSIONS,
    NL80211_ATTR_AKM_SUITES,

    NL80211_ATTR_REQ_IE,
    NL80211_ATTR_RESP_IE,

    NL80211_ATTR_PREV_BSSID,

    NL80211_ATTR_KEY,
    NL80211_ATTR_KEYS,

    NL80211_ATTR_PID,

    NL80211_ATTR_4ADDR,

    NL80211_ATTR_SURVEY_INFO,

    NL80211_ATTR_PMKID,
    NL80211_ATTR_MAX_NUM_PMKIDS,

    NL80211_ATTR_DURATION,

    NL80211_ATTR_COOKIE,

    NL80211_ATTR_WIPHY_COVERAGE_CLASS,

    NL80211_ATTR_TX_RATES,

    NL80211_ATTR_FRAME_MATCH,

    NL80211_ATTR_ACK,

    NL80211_ATTR_PS_STATE,

    NL80211_ATTR_CQM,

    NL80211_ATTR_LOCAL_STATE_CHANGE,

    NL80211_ATTR_AP_ISOLATE,

    NL80211_ATTR_WIPHY_TX_POWER_SETTING,
    NL80211_ATTR_WIPHY_TX_POWER_LEVEL,

    NL80211_ATTR_TX_FRAME_TYPES,
    NL80211_ATTR_RX_FRAME_TYPES,
    NL80211_ATTR_FRAME_TYPE,

    NL80211_ATTR_CONTROL_PORT_ETHERTYPE,
    NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT,

    NL80211_ATTR_SUPPORT_IBSS_RSN,

    NL80211_ATTR_WIPHY_ANTENNA_TX,
    NL80211_ATTR_WIPHY_ANTENNA_RX,

    NL80211_ATTR_MCAST_RATE,

    NL80211_ATTR_OFFCHANNEL_TX_OK,

    NL80211_ATTR_BSS_HT_OPMODE,

    NL80211_ATTR_KEY_DEFAULT_TYPES,

    NL80211_ATTR_MAX_REMAIN_ON_CHANNEL_DURATION,

    NL80211_ATTR_MESH_SETUP,

    NL80211_ATTR_WIPHY_ANTENNA_AVAIL_TX,
    NL80211_ATTR_WIPHY_ANTENNA_AVAIL_RX,

    NL80211_ATTR_SUPPORT_MESH_AUTH,
    NL80211_ATTR_STA_PLINK_STATE,

    NL80211_ATTR_WOWLAN_TRIGGERS,
    NL80211_ATTR_WOWLAN_TRIGGERS_SUPPORTED,

    NL80211_ATTR_SCHED_SCAN_INTERVAL,

    NL80211_ATTR_INTERFACE_COMBINATIONS,
    NL80211_ATTR_SOFTWARE_IFTYPES,

    NL80211_ATTR_REKEY_DATA,

    NL80211_ATTR_MAX_NUM_SCHED_SCAN_SSIDS,
    NL80211_ATTR_MAX_SCHED_SCAN_IE_LEN,

    NL80211_ATTR_SCAN_SUPP_RATES,

    NL80211_ATTR_HIDDEN_SSID,

    NL80211_ATTR_IE_PROBE_RESP,
    NL80211_ATTR_IE_ASSOC_RESP,

    NL80211_ATTR_STA_WME,
    NL80211_ATTR_SUPPORT_AP_UAPSD,

    NL80211_ATTR_ROAM_SUPPORT,

    NL80211_ATTR_SCHED_SCAN_MATCH,
    NL80211_ATTR_MAX_MATCH_SETS,

    NL80211_ATTR_PMKSA_CANDIDATE,

    NL80211_ATTR_TX_NO_CCK_RATE,

    NL80211_ATTR_TDLS_ACTION,
    NL80211_ATTR_TDLS_DIALOG_TOKEN,
    NL80211_ATTR_TDLS_OPERATION,
    NL80211_ATTR_TDLS_SUPPORT,
    NL80211_ATTR_TDLS_EXTERNAL_SETUP,

    NL80211_ATTR_DEVICE_AP_SME,

    NL80211_ATTR_DONT_WAIT_FOR_ACK,

    NL80211_ATTR_FEATURE_FLAGS,

    NL80211_ATTR_PROBE_RESP_OFFLOAD,

    NL80211_ATTR_PROBE_RESP,

    NL80211_ATTR_DFS_REGION,

    NL80211_ATTR_DISABLE_HT,
    NL80211_ATTR_HT_CAPABILITY_MASK,

    NL80211_ATTR_NOACK_MAP,

    NL80211_ATTR_INACTIVITY_TIMEOUT,

    NL80211_ATTR_RX_SIGNAL_DBM,

    NL80211_ATTR_BG_SCAN_PERIOD,

    NL80211_ATTR_WDEV,

    NL80211_ATTR_USER_REG_HINT_TYPE,

    NL80211_ATTR_CONN_FAILED_REASON,

    NL80211_ATTR_AUTH_DATA,

    NL80211_ATTR_VHT_CAPABILITY,

    NL80211_ATTR_SCAN_FLAGS,

    NL80211_ATTR_CHANNEL_WIDTH,
    NL80211_ATTR_CENTER_FREQ1,
    NL80211_ATTR_CENTER_FREQ2,

    NL80211_ATTR_P2P_CTWINDOW,
    NL80211_ATTR_P2P_OPPPS,

    NL80211_ATTR_LOCAL_MESH_POWER_MODE,

    NL80211_ATTR_ACL_POLICY,  //設置訪問控制表規則

    NL80211_ATTR_MAC_ADDRS,

    NL80211_ATTR_MAC_ACL_MAX,

    NL80211_ATTR_RADAR_EVENT,

    NL80211_ATTR_EXT_CAPA,
    NL80211_ATTR_EXT_CAPA_MASK,

    NL80211_ATTR_STA_CAPABILITY,
    NL80211_ATTR_STA_EXT_CAPABILITY,

    NL80211_ATTR_PROTOCOL_FEATURES,
    NL80211_ATTR_SPLIT_WIPHY_DUMP,

    NL80211_ATTR_DISABLE_VHT,
    NL80211_ATTR_VHT_CAPABILITY_MASK,

    NL80211_ATTR_MDID,
    NL80211_ATTR_IE_RIC,

    NL80211_ATTR_CRIT_PROT_ID,
    NL80211_ATTR_MAX_CRIT_PROT_DURATION,

    NL80211_ATTR_PEER_AID,

    NL80211_ATTR_COALESCE_RULE,

    NL80211_ATTR_CH_SWITCH_COUNT,
    NL80211_ATTR_CH_SWITCH_BLOCK_TX,
    NL80211_ATTR_CSA_IES,
    NL80211_ATTR_CSA_C_OFF_BEACON,
    NL80211_ATTR_CSA_C_OFF_PRESP,

    NL80211_ATTR_RXMGMT_FLAGS,

    NL80211_ATTR_STA_SUPPORTED_CHANNELS,

    NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES,

    NL80211_ATTR_HANDLE_DFS,

    NL80211_ATTR_SUPPORT_5_MHZ,
    NL80211_ATTR_SUPPORT_10_MHZ,

    NL80211_ATTR_OPMODE_NOTIF,

    NL80211_ATTR_VENDOR_ID,
    NL80211_ATTR_VENDOR_SUBCMD,
    NL80211_ATTR_VENDOR_DATA,
    NL80211_ATTR_VENDOR_EVENTS,

    NL80211_ATTR_QOS_MAP,

    NL80211_ATTR_MAC_HINT,
    NL80211_ATTR_WIPHY_FREQ_HINT,

    NL80211_ATTR_MAX_AP_ASSOC_STA,

    NL80211_ATTR_TDLS_PEER_CAPABILITY,

    NL80211_ATTR_SOCKET_OWNER,

    NL80211_ATTR_CSA_C_OFFSETS_TX,
    NL80211_ATTR_MAX_CSA_COUNTERS,

    NL80211_ATTR_TDLS_INITIATOR,

    NL80211_ATTR_USE_RRM,

    NL80211_ATTR_WIPHY_DYN_ACK,

    NL80211_ATTR_TSID,
    NL80211_ATTR_USER_PRIO,
    NL80211_ATTR_ADMITTED_TIME,

    NL80211_ATTR_SMPS_MODE,

    NL80211_ATTR_OPER_CLASS,

    NL80211_ATTR_MAC_MASK,

    NL80211_ATTR_WIPHY_SELF_MANAGED_REG,

    NL80211_ATTR_EXT_FEATURES,

    NL80211_ATTR_SURVEY_RADIO_STATS,

    NL80211_ATTR_NETNS_FD,

    NL80211_ATTR_SCHED_SCAN_DELAY,

    NL80211_ATTR_REG_INDOOR,

    NL80211_ATTR_MAX_NUM_SCHED_SCAN_PLANS,
    NL80211_ATTR_MAX_SCAN_PLAN_INTERVAL,
    NL80211_ATTR_MAX_SCAN_PLAN_ITERATIONS,
    NL80211_ATTR_SCHED_SCAN_PLANS,

    NL80211_ATTR_PBSS,

    NL80211_ATTR_BSS_SELECT,

    NL80211_ATTR_STA_SUPPORT_P2P_PS,

    NL80211_ATTR_PAD,

    NL80211_ATTR_IFTYPE_EXT_CAPA,

    NL80211_ATTR_MU_MIMO_GROUP_DATA,
    NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR,

    NL80211_ATTR_SCAN_START_TIME_TSF,
    NL80211_ATTR_SCAN_START_TIME_TSF_BSSID,
    NL80211_ATTR_MEASUREMENT_DURATION,
    NL80211_ATTR_MEASUREMENT_DURATION_MANDATORY,

    NL80211_ATTR_MESH_PEER_AID,

    NL80211_ATTR_NAN_MASTER_PREF,
    NL80211_ATTR_NAN_DUAL,
    NL80211_ATTR_NAN_FUNC,
    NL80211_ATTR_NAN_MATCH,

    NL80211_ATTR_FILS_KEK,
    NL80211_ATTR_FILS_NONCES,

    NL80211_ATTR_MULTICAST_TO_UNICAST_ENABLED,

    NL80211_ATTR_BSSID,

    NL80211_ATTR_SCHED_SCAN_RELATIVE_RSSI,
    NL80211_ATTR_SCHED_SCAN_RSSI_ADJUST,

    NL80211_ATTR_TIMEOUT_REASON,

    /* add attributes here, update the policy in nl80211.c */

    __NL80211_ATTR_AFTER_LAST,
    NUM_NL80211_ATTR = __NL80211_ATTR_AFTER_LAST,
    NL80211_ATTR_MAX = __NL80211_ATTR_AFTER_LAST - 1
};
發佈了71 篇原創文章 · 獲贊 36 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章