11 #include <linux/rtnetlink.h>
12 #include <linux/slab.h>
15 #include <linux/if_ether.h>
39 sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
46 static int ieee80211_del_iface(
struct wiphy *wiphy,
struct wireless_dev *wdev)
53 static int ieee80211_change_iface(
struct wiphy *wiphy,
75 if (ieee80211_sdata_running(sdata)) {
106 static int ieee80211_start_p2p_device(
struct wiphy *wiphy,
112 static void ieee80211_stop_p2p_device(
struct wiphy *wiphy,
118 static int ieee80211_set_noack_map(
struct wiphy *wiphy,
128 static int ieee80211_add_key(
struct wiphy *wiphy,
struct net_device *dev,
137 if (!ieee80211_sdata_running(sdata))
145 if (IS_ERR(sdata->
local->wep_tx_tfm))
163 if (ieee80211_vif_is_mesh(&sdata->
vif))
174 switch (sdata->
vif.type) {
176 if (sdata->
u.
mgd.mfp != IEEE80211_MFP_DISABLED)
189 #ifdef CONFIG_MAC80211_MESH
190 if (sdata->
u.
mesh.security != IEEE80211_MESH_SEC_NONE)
216 static int ieee80211_del_key(
struct wiphy *wiphy,
struct net_device *dev,
217 u8 key_idx,
bool pairwise,
const u8 *mac_addr)
257 static int ieee80211_get_key(
struct wiphy *wiphy,
struct net_device *dev,
258 u8 key_idx,
bool pairwise,
const u8 *mac_addr,
273 sdata = IEEE80211_DEV_TO_SUB_IF(dev);
292 memset(¶ms, 0,
sizeof(params));
296 switch (key->
conf.cipher) {
298 iv32 = key->
u.
tkip.tx.iv32;
299 iv16 = key->
u.
tkip.tx.iv16;
302 drv_get_tkip_seq(sdata->
local,
303 key->
conf.hw_key_idx,
306 seq[0] = iv16 & 0xff;
307 seq[1] = (iv16 >> 8) & 0xff;
308 seq[2] = iv32 & 0xff;
309 seq[3] = (iv32 >> 8) & 0xff;
310 seq[4] = (iv32 >> 16) & 0xff;
311 seq[5] = (iv32 >> 24) & 0xff;
350 static int ieee80211_config_default_key(
struct wiphy *wiphy,
352 u8 key_idx,
bool uni,
362 static int ieee80211_config_default_mgmt_key(
struct wiphy *wiphy,
377 sband = sta->
local->hw.wiphy->bands[
378 sta->
local->oper_channel->band];
395 rate_idx_to_bitrate(rinfo, sta, rate->
idx);
437 if (!local->
ops->get_rssi ||
438 drv_get_rssi(local, sdata, &sta->
sta, &sinfo->
signal))
454 if (ieee80211_vif_is_mesh(&sdata->
vif)) {
455 #ifdef CONFIG_MAC80211_MESH
471 if (sdata->
vif.bss_conf.use_cts_prot)
473 if (sdata->
vif.bss_conf.use_short_preamble)
475 if (sdata->
vif.bss_conf.use_short_slot)
477 sinfo->
bss_param.dtim_period = sdata->
local->hw.conf.ps_dtim_period;
478 sinfo->
bss_param.beacon_interval = sdata->
vif.bss_conf.beacon_int;
502 "rx_packets",
"rx_bytes",
"wep_weak_iv_count",
503 "rx_duplicates",
"rx_fragments",
"rx_dropped",
504 "tx_packets",
"tx_bytes",
"tx_fragments",
505 "tx_filtered",
"tx_retry_failed",
"tx_retries",
506 "beacon_loss",
"sta_state",
"txrate",
"rxrate",
"signal",
507 "channel",
"noise",
"ch_time",
"ch_time_busy",
508 "ch_time_ext_busy",
"ch_time_rx",
"ch_time_tx"
510 #define STA_STATS_LEN ARRAY_SIZE(ieee80211_gstrings_sta_stats)
512 static int ieee80211_get_et_sset_count(
struct wiphy *wiphy,
522 rv += drv_get_et_sset_count(sdata, sset);
529 static void ieee80211_get_et_stats(
struct wiphy *wiphy,
540 #define STA_STATS_SURVEY_LEN 7
544 #define ADD_STA_STATS(sta) \
546 data[i++] += sta->rx_packets; \
547 data[i++] += sta->rx_bytes; \
548 data[i++] += sta->wep_weak_iv_count; \
549 data[i++] += sta->num_duplicates; \
550 data[i++] += sta->rx_fragments; \
551 data[i++] += sta->rx_dropped; \
553 data[i++] += sta->tx_packets; \
554 data[i++] += sta->tx_bytes; \
555 data[i++] += sta->tx_fragments; \
556 data[i++] += sta->tx_filtered_count; \
557 data[i++] += sta->tx_retry_failed; \
558 data[i++] += sta->tx_retry_count; \
559 data[i++] += sta->beacon_loss_count; \
582 sta_set_sinfo(sta, &sinfo);
599 if (sta->
sdata->dev != dev)
613 if (drv_get_survey(local, q, &survey) != 0) {
618 if (survey.channel &&
620 survey.channel->center_freq))
626 data[i++] = survey.channel->center_freq;
630 data[i++] = (
u8)survey.noise;
634 data[i++] = survey.channel_time;
638 data[i++] = survey.channel_time_busy;
642 data[i++] = survey.channel_time_ext_busy;
646 data[i++] = survey.channel_time_rx;
650 data[i++] = survey.channel_time_tx;
662 static void ieee80211_get_et_strings(
struct wiphy *wiphy,
667 int sz_sta_stats = 0;
670 sz_sta_stats =
sizeof(ieee80211_gstrings_sta_stats);
671 memcpy(data, *ieee80211_gstrings_sta_stats, sz_sta_stats);
673 drv_get_et_strings(sdata, sset, &(data[sz_sta_stats]));
676 static int ieee80211_dump_station(
struct wiphy *wiphy,
struct net_device *dev,
690 sta_set_sinfo(sta, sinfo);
698 static int ieee80211_dump_survey(
struct wiphy *wiphy,
struct net_device *dev,
703 return drv_get_survey(local, idx, survey);
706 static int ieee80211_get_station(
struct wiphy *wiphy,
struct net_device *dev,
719 sta_set_sinfo(sta, sinfo);
727 static int ieee80211_set_channel(
struct wiphy *wiphy,
736 sdata = IEEE80211_DEV_TO_SUB_IF(netdev);
763 static int ieee80211_set_monitor_channel(
struct wiphy *wiphy,
767 return ieee80211_set_channel(wiphy,
NULL, chan, channel_type);
775 if (!resp || !resp_len)
785 memcpy(new->data, resp, resp_len);
798 int new_head_len, new_tail_len;
805 if (!params->
head && !old)
815 if (params->
tail || !old)
821 size =
sizeof(*new) + new_head_len + new_tail_len;
833 new->head = ((
u8 *)
new) +
sizeof(*new);
834 new->tail =
new->head + new_head_len;
835 new->head_len = new_head_len;
836 new->tail_len = new_tail_len;
840 memcpy(new->head, params->
head, new_head_len);
846 memcpy(new->tail, params->
tail, new_tail_len);
851 err = ieee80211_set_probe_resp(sdata, params->
probe_resp,
866 static int ieee80211_start_ap(
struct wiphy *wiphy,
struct net_device *dev,
882 err = ieee80211_set_channel(wiphy, dev, params->
channel,
895 params->
crypto.control_port_ethertype;
897 params->
crypto.control_port_no_encrypt;
907 sdata->
vif.bss_conf.hidden_ssid =
910 err = ieee80211_assign_beacon(sdata, ¶ms->
beacon);
931 sdata = IEEE80211_DEV_TO_SUB_IF(dev);
937 err = ieee80211_assign_beacon(sdata, params);
944 static int ieee80211_stop_ap(
struct wiphy *wiphy,
struct net_device *dev)
949 sdata = IEEE80211_DEV_TO_SUB_IF(dev);
980 static void ieee80211_send_layer2_update(
struct sta_info *sta)
988 skb = dev_alloc_skb(
sizeof(*msg));
996 eth_broadcast_addr(msg->
da);
1009 memset(skb->cb, 0,
sizeof(skb->cb));
1036 if (
WARN_ON(!ieee80211_vif_is_mesh(&sdata->
vif)))
1061 if (
WARN_ON(!ieee80211_vif_is_mesh(&sdata->
vif)))
1086 sta->
sta.wme =
true;
1089 sta->
sta.wme =
false;
1117 sta->
sta.aid = params->
aid;
1135 if (sband->
bitrates[j].bitrate == rate)
1147 if (ieee80211_vif_is_mesh(&sdata->
vif)) {
1148 #ifdef CONFIG_MAC80211_MESH
1149 if (sdata->
u.
mesh.security & IEEE80211_MESH_SEC_SECURED)
1175 static int ieee80211_add_station(
struct wiphy *wiphy,
struct net_device *dev,
1185 sdata = IEEE80211_DEV_TO_SUB_IF(params->
vlan);
1191 sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1193 if (ether_addr_equal(mac, sdata->
vif.addr))
1196 if (is_multicast_ether_addr(mac))
1206 err = sta_apply_parameters(local, sta, params);
1217 rate_control_rate_init(sta);
1229 ieee80211_send_layer2_update(sta);
1236 static int ieee80211_del_station(
struct wiphy *wiphy,
struct net_device *dev,
1242 sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1251 static int ieee80211_change_station(
struct wiphy *wiphy,
1279 bool prev_4addr =
false;
1280 bool new_4addr =
false;
1282 vlansdata = IEEE80211_DEV_TO_SUB_IF(params->
vlan);
1290 if (params->
vlan->ieee80211_ptr->use_4addr) {
1291 if (vlansdata->
u.
vlan.sta) {
1301 sta->
sdata->u.vlan.sta) {
1306 sta->
sdata = vlansdata;
1309 prev_4addr != new_4addr) {
1316 ieee80211_send_layer2_update(sta);
1319 err = sta_apply_parameters(local, sta, params);
1326 rate_control_rate_init(sta);
1338 #ifdef CONFIG_MAC80211_MESH
1339 static int ieee80211_add_mpath(
struct wiphy *wiphy,
struct net_device *dev,
1347 sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1373 static int ieee80211_del_mpath(
struct wiphy *wiphy,
struct net_device *dev,
1385 static int ieee80211_change_mpath(
struct wiphy *wiphy,
1387 u8 *dst,
u8 *next_hop)
1393 sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1415 static void mpath_set_pinfo(
struct mesh_path *mpath,
u8 *next_hop,
1425 memset(pinfo, 0,
sizeof(*pinfo));
1438 pinfo->
sn = mpath->
sn;
1457 static int ieee80211_get_mpath(
struct wiphy *wiphy,
struct net_device *dev,
1464 sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1473 mpath_set_pinfo(mpath, next_hop, pinfo);
1478 static int ieee80211_dump_mpath(
struct wiphy *wiphy,
struct net_device *dev,
1479 int idx,
u8 *dst,
u8 *next_hop,
1485 sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1494 mpath_set_pinfo(mpath, next_hop, pinfo);
1499 static int ieee80211_get_mesh_config(
struct wiphy *wiphy,
1504 sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1512 return (mask >> (parm-1)) & 0x1;
1543 ifmsh->
security = IEEE80211_MESH_SEC_NONE;
1545 ifmsh->
security |= IEEE80211_MESH_SEC_AUTHED;
1547 ifmsh->
security |= IEEE80211_MESH_SEC_SECURED;
1556 static int ieee80211_update_mesh_config(
struct wiphy *wiphy,
1564 sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1565 ifmsh = &sdata->
u.
mesh;
1568 conf = &(sdata->
u.
mesh.mshcfg);
1639 sdata->
vif.bss_conf.ht_operation_mode = nconf->
ht_opmode;
1654 static int ieee80211_join_mesh(
struct wiphy *wiphy,
struct net_device *dev,
1663 err = copy_mesh_setup(ifmsh, setup);
1667 err = ieee80211_set_channel(wiphy, dev, setup->
channel,
1677 static int ieee80211_leave_mesh(
struct wiphy *wiphy,
struct net_device *dev)
1687 static int ieee80211_change_bss(
struct wiphy *wiphy,
1694 sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1701 sdata->
vif.bss_conf.use_short_preamble =
1706 if (!sdata->
vif.bss_conf.use_short_slot &&
1708 sdata->
vif.bss_conf.use_short_slot =
true;
1713 sdata->
vif.bss_conf.use_short_slot =
1728 if (sband->
bitrates[j].bitrate == rate)
1732 sdata->
vif.bss_conf.basic_rates = rates;
1744 sdata->
vif.bss_conf.ht_operation_mode =
1754 static int ieee80211_set_txq_params(
struct wiphy *wiphy,
1762 if (!local->
ops->conf_tx)
1769 p.aifs = params->
aifs;
1770 p.cw_max = params->
cwmax;
1771 p.cw_min = params->
cwmin;
1772 p.txop = params->
txop;
1781 if (drv_conf_tx(local, sdata, params->
ac, &
p)) {
1783 "failed to set TX queue parameters for AC %d\n",
1802 return __ieee80211_resume(wiphy_priv(wiphy));
1805 #define ieee80211_suspend NULL
1806 #define ieee80211_resume NULL
1809 static int ieee80211_scan(
struct wiphy *wiphy,
1814 sdata = IEEE80211_WDEV_TO_SUB_IF(req->
wdev);
1816 switch (ieee80211_vif_type_p2p(&sdata->
vif)) {
1824 if (sdata->
local->ops->hw_scan)
1832 if (sdata->
u.
ap.beacon)
1843 ieee80211_sched_scan_start(
struct wiphy *wiphy,
1849 if (!sdata->
local->ops->sched_scan_start)
1856 ieee80211_sched_scan_stop(
struct wiphy *wiphy,
struct net_device *dev)
1860 if (!sdata->
local->ops->sched_scan_stop)
1866 static int ieee80211_auth(
struct wiphy *wiphy,
struct net_device *dev,
1872 static int ieee80211_assoc(
struct wiphy *wiphy,
struct net_device *dev,
1892 static int ieee80211_deauth(
struct wiphy *wiphy,
struct net_device *dev,
1904 static int ieee80211_join_ibss(
struct wiphy *wiphy,
struct net_device *dev,
1926 static int ieee80211_leave_ibss(
struct wiphy *wiphy,
struct net_device *dev)
1933 static int ieee80211_set_wiphy_params(
struct wiphy *wiphy,
u32 changed)
1960 local->
hw.conf.short_frame_max_tx_count = wiphy->
retry_short;
1962 local->
hw.conf.long_frame_max_tx_count = wiphy->
retry_long;
1964 (WIPHY_PARAM_RETRY_SHORT | WIPHY_PARAM_RETRY_LONG))
1970 static int ieee80211_set_tx_power(
struct wiphy *wiphy,
1982 if (mbm < 0 || (mbm % 100))
1987 if (mbm < 0 || (mbm % 100))
2001 static int ieee80211_get_tx_power(
struct wiphy *wiphy,
int *
dbm)
2005 *dbm = local->
hw.conf.power_level;
2010 static int ieee80211_set_wds_peer(
struct wiphy *wiphy,
struct net_device *dev,
2020 static void ieee80211_rfkill_poll(
struct wiphy *wiphy)
2024 drv_rfkill_poll(local);
2027 #ifdef CONFIG_NL80211_TESTMODE
2028 static int ieee80211_testmode_cmd(
struct wiphy *wiphy,
void *data,
int len)
2032 if (!local->
ops->testmode_cmd)
2035 return local->
ops->testmode_cmd(&local->
hw, data, len);
2038 static int ieee80211_testmode_dump(
struct wiphy *wiphy,
2041 void *data,
int len)
2045 if (!local->
ops->testmode_dump)
2048 return local->
ops->testmode_dump(&local->
hw, skb, cb, data, len);
2061 old_req = sdata->
u.
mgd.req_smps;
2064 if (old_req == smps_mode &&
2072 if (!sdata->
u.
mgd.associated ||
2078 ap = sdata->
u.
mgd.associated->bssid;
2081 if (sdata->
u.
mgd.powersave)
2091 sdata->
u.
mgd.req_smps = old_req;
2096 static int ieee80211_set_power_mgmt(
struct wiphy *wiphy,
struct net_device *dev,
2108 if (enabled == sdata->
u.
mgd.powersave &&
2129 static int ieee80211_set_cqm_rssi_config(
struct wiphy *wiphy,
2131 s32 rssi_thold,
u32 rssi_hyst)
2145 if (sdata->
u.
mgd.associated &&
2152 static int ieee80211_set_bitrate_mask(
struct wiphy *wiphy,
2161 if (!ieee80211_sdata_running(sdata))
2165 ret = drv_set_bitrate_mask(local, sdata, mask);
2173 sizeof(mask->
control[i].mcs));
2187 bool queued =
false;
2208 goto out_check_combine;
2211 if (!local->
ops->remain_on_channel) {
2230 ret = drv_remain_on_channel(local, channel, channel_type, duration);
2258 if (local->
ops->remain_on_channel) {
2304 unsigned long new_end;
2339 *cookie = (
unsigned long)txskb;
2341 *cookie = (
unsigned long)roc;
2346 static int ieee80211_remain_on_channel(
struct wiphy *wiphy,
2350 unsigned int duration,
2358 ret = ieee80211_start_roc_work(local, sdata, chan, channel_type,
2359 duration, cookie,
NULL);
2366 u64 cookie,
bool mgmt_tx)
2376 if (!mgmt_tx && (
unsigned long)dep != cookie)
2388 if (!mgmt_tx && (
unsigned long)roc != cookie)
2409 if (local->
ops->remain_on_channel) {
2411 ret = drv_cancel_remain_on_channel(local);
2427 found->
abort =
true;
2439 static int ieee80211_cancel_remain_on_channel(
struct wiphy *wiphy,
2446 return ieee80211_cancel_roc(local, cookie,
false);
2449 static int ieee80211_mgmt_tx(
struct wiphy *wiphy,
struct wireless_dev *wdev,
2452 bool channel_type_valid,
unsigned int wait,
2453 const u8 *
buf,
size_t len,
bool no_cck,
2454 bool dont_wait_for_ack,
u64 *cookie)
2461 bool need_offchan =
false;
2465 if (dont_wait_for_ack)
2474 switch (sdata->
vif.type) {
2476 if (!sdata->
vif.bss_conf.ibss_joined)
2477 need_offchan =
true;
2479 #ifdef CONFIG_MAC80211_MESH
2481 if (ieee80211_vif_is_mesh(&sdata->
vif) &&
2482 !sdata->
u.
mesh.mesh_id_len)
2483 need_offchan =
true;
2490 !ieee80211_vif_is_mesh(&sdata->
vif) &&
2492 need_offchan =
true;
2504 if (!sdata->
u.
mgd.associated)
2505 need_offchan =
true;
2508 need_offchan =
true;
2517 if (!need_offchan) {
2519 if (channel_type_valid &&
2521 need_offchan =
true;
2524 if (need_offchan && !offchan) {
2529 skb = dev_alloc_skb(local->
hw.extra_tx_headroom + len);
2534 skb_reserve(skb, local->
hw.extra_tx_headroom);
2538 IEEE80211_SKB_CB(skb)->flags =
flags;
2542 if (!need_offchan) {
2543 *cookie = (
unsigned long) skb;
2544 ieee80211_tx_skb(sdata, skb);
2551 IEEE80211_SKB_CB(skb)->hw_queue =
2552 local->
hw.offchannel_tx_hw_queue;
2555 ret = ieee80211_start_roc_work(local, sdata, chan, channel_type,
2564 static int ieee80211_mgmt_tx_cancel_wait(
struct wiphy *wiphy,
2570 return ieee80211_cancel_roc(local, cookie,
true);
2573 static void ieee80211_mgmt_frame_register(
struct wiphy *wiphy,
2580 switch (frame_type) {
2607 static int ieee80211_set_antenna(
struct wiphy *wiphy,
u32 tx_ant,
u32 rx_ant)
2614 return drv_set_antenna(local, tx_ant, rx_ant);
2617 static int ieee80211_get_antenna(
struct wiphy *wiphy,
u32 *tx_ant,
u32 *rx_ant)
2621 return drv_get_antenna(local, tx_ant, rx_ant);
2624 static int ieee80211_set_ringparam(
struct wiphy *wiphy,
u32 tx,
u32 rx)
2628 return drv_set_ringparam(local, tx, rx);
2631 static void ieee80211_get_ringparam(
struct wiphy *wiphy,
2636 drv_get_ringparam(local, tx, tx_max, rx, rx_max);
2639 static int ieee80211_set_rekey_data(
struct wiphy *wiphy,
2646 if (!local->
ops->set_rekey_data)
2649 drv_set_rekey_data(local, sdata, data);
2654 static void ieee80211_tdls_add_ext_capab(
struct sk_buff *skb)
2700 ieee80211_prep_tdls_encap_data(
struct wiphy *wiphy,
struct net_device *dev,
2715 switch (action_code) {
2729 ieee80211_tdls_add_ext_capab(skb);
2745 ieee80211_tdls_add_ext_capab(skb);
2777 ieee80211_prep_tdls_direct(
struct wiphy *wiphy,
struct net_device *dev,
2778 u8 *peer,
u8 action_code,
u8 dialog_token,
2785 mgmt = (
void *)
skb_put(skb, 24);
2794 switch (action_code) {
2796 skb_put(skb, 1 +
sizeof(mgmt->
u.action.u.tdls_discover_resp));
2798 mgmt->
u.action.u.tdls_discover_resp.action_code =
2800 mgmt->
u.action.u.tdls_discover_resp.dialog_token =
2802 mgmt->
u.action.u.tdls_discover_resp.capability =
2809 ieee80211_tdls_add_ext_capab(skb);
2818 static int ieee80211_tdls_mgmt(
struct wiphy *wiphy,
struct net_device *dev,
2819 u8 *peer,
u8 action_code,
u8 dialog_token,
2820 u16 status_code,
const u8 *extra_ies,
2821 size_t extra_ies_len)
2835 !sdata->
u.
mgd.associated)
2838 tdls_dbg(sdata,
"TDLS mgmt action %d peer %pM\n",
2841 skb = dev_alloc_skb(local->
hw.extra_tx_headroom +
2851 info = IEEE80211_SKB_CB(skb);
2852 skb_reserve(skb, local->
hw.extra_tx_headroom);
2854 switch (action_code) {
2860 ret = ieee80211_prep_tdls_encap_data(wiphy, dev, peer,
2861 action_code, dialog_token,
2863 send_direct =
false;
2866 ret = ieee80211_prep_tdls_direct(wiphy, dev, peer, action_code,
2867 dialog_token, status_code,
2880 memcpy(
skb_put(skb, extra_ies_len), extra_ies, extra_ies_len);
2883 switch (action_code) {
2889 ieee80211_tdls_add_link_ie(skb, sdata->
vif.addr, peer,
2890 sdata->
u.
mgd.bssid);
2895 ieee80211_tdls_add_link_ie(skb, peer, sdata->
vif.addr,
2896 sdata->
u.
mgd.bssid);
2904 ieee80211_tx_skb(sdata, skb);
2912 switch (action_code) {
2936 static int ieee80211_tdls_oper(
struct wiphy *wiphy,
struct net_device *dev,
2948 tdls_dbg(sdata,
"TDLS oper %d peer %pM\n", oper, peer);
2976 static int ieee80211_probe_client(
struct wiphy *wiphy,
struct net_device *dev,
2977 const u8 *peer,
u64 *cookie)
2983 int size =
sizeof(*nullfunc);
3010 skb = dev_alloc_skb(local->
hw.extra_tx_headroom + size);
3016 skb_reserve(skb, local->
hw.extra_tx_headroom);
3018 nullfunc = (
void *)
skb_put(skb, size);
3026 info = IEEE80211_SKB_CB(skb);
3040 *cookie = (
unsigned long) skb;
3045 ieee80211_cfg_get_channel(
struct wiphy *wiphy,
struct wireless_dev *wdev,
3055 static void ieee80211_set_wakeup(
struct wiphy *wiphy,
bool enabled)
3057 drv_set_wakeup(wiphy_priv(wiphy), enabled);
3062 .add_virtual_intf = ieee80211_add_iface,
3063 .del_virtual_intf = ieee80211_del_iface,
3064 .change_virtual_intf = ieee80211_change_iface,
3065 .start_p2p_device = ieee80211_start_p2p_device,
3066 .stop_p2p_device = ieee80211_stop_p2p_device,
3067 .add_key = ieee80211_add_key,
3068 .del_key = ieee80211_del_key,
3069 .get_key = ieee80211_get_key,
3070 .set_default_key = ieee80211_config_default_key,
3071 .set_default_mgmt_key = ieee80211_config_default_mgmt_key,
3072 .start_ap = ieee80211_start_ap,
3073 .change_beacon = ieee80211_change_beacon,
3074 .stop_ap = ieee80211_stop_ap,
3075 .add_station = ieee80211_add_station,
3076 .del_station = ieee80211_del_station,
3077 .change_station = ieee80211_change_station,
3078 .get_station = ieee80211_get_station,
3079 .dump_station = ieee80211_dump_station,
3080 .dump_survey = ieee80211_dump_survey,
3081 #ifdef CONFIG_MAC80211_MESH
3082 .add_mpath = ieee80211_add_mpath,
3083 .del_mpath = ieee80211_del_mpath,
3084 .change_mpath = ieee80211_change_mpath,
3085 .get_mpath = ieee80211_get_mpath,
3086 .dump_mpath = ieee80211_dump_mpath,
3087 .update_mesh_config = ieee80211_update_mesh_config,
3088 .get_mesh_config = ieee80211_get_mesh_config,
3089 .join_mesh = ieee80211_join_mesh,
3090 .leave_mesh = ieee80211_leave_mesh,
3092 .change_bss = ieee80211_change_bss,
3093 .set_txq_params = ieee80211_set_txq_params,
3094 .set_monitor_channel = ieee80211_set_monitor_channel,
3097 .scan = ieee80211_scan,
3098 .sched_scan_start = ieee80211_sched_scan_start,
3099 .sched_scan_stop = ieee80211_sched_scan_stop,
3100 .auth = ieee80211_auth,
3101 .assoc = ieee80211_assoc,
3102 .deauth = ieee80211_deauth,
3104 .join_ibss = ieee80211_join_ibss,
3105 .leave_ibss = ieee80211_leave_ibss,
3106 .set_wiphy_params = ieee80211_set_wiphy_params,
3107 .set_tx_power = ieee80211_set_tx_power,
3108 .get_tx_power = ieee80211_get_tx_power,
3109 .set_wds_peer = ieee80211_set_wds_peer,
3110 .rfkill_poll = ieee80211_rfkill_poll,
3113 .set_power_mgmt = ieee80211_set_power_mgmt,
3114 .set_bitrate_mask = ieee80211_set_bitrate_mask,
3115 .remain_on_channel = ieee80211_remain_on_channel,
3116 .cancel_remain_on_channel = ieee80211_cancel_remain_on_channel,
3117 .mgmt_tx = ieee80211_mgmt_tx,
3118 .mgmt_tx_cancel_wait = ieee80211_mgmt_tx_cancel_wait,
3119 .set_cqm_rssi_config = ieee80211_set_cqm_rssi_config,
3120 .mgmt_frame_register = ieee80211_mgmt_frame_register,
3121 .set_antenna = ieee80211_set_antenna,
3122 .get_antenna = ieee80211_get_antenna,
3123 .set_ringparam = ieee80211_set_ringparam,
3124 .get_ringparam = ieee80211_get_ringparam,
3125 .set_rekey_data = ieee80211_set_rekey_data,
3126 .tdls_oper = ieee80211_tdls_oper,
3127 .tdls_mgmt = ieee80211_tdls_mgmt,
3128 .probe_client = ieee80211_probe_client,
3129 .set_noack_map = ieee80211_set_noack_map,
3131 .set_wakeup = ieee80211_set_wakeup,
3133 .get_et_sset_count = ieee80211_get_et_sset_count,
3134 .get_et_stats = ieee80211_get_et_stats,
3135 .get_et_strings = ieee80211_get_et_strings,
3136 .get_channel = ieee80211_cfg_get_channel,