Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/net/mac80211/cfg.c
15109 views
1
/*
2
* mac80211 configuration hooks for cfg80211
3
*
4
* Copyright 2006-2010 Johannes Berg <[email protected]>
5
*
6
* This file is GPLv2 as found in COPYING.
7
*/
8
9
#include <linux/ieee80211.h>
10
#include <linux/nl80211.h>
11
#include <linux/rtnetlink.h>
12
#include <linux/slab.h>
13
#include <net/net_namespace.h>
14
#include <linux/rcupdate.h>
15
#include <net/cfg80211.h>
16
#include "ieee80211_i.h"
17
#include "driver-ops.h"
18
#include "cfg.h"
19
#include "rate.h"
20
#include "mesh.h"
21
22
static struct net_device *ieee80211_add_iface(struct wiphy *wiphy, char *name,
23
enum nl80211_iftype type,
24
u32 *flags,
25
struct vif_params *params)
26
{
27
struct ieee80211_local *local = wiphy_priv(wiphy);
28
struct net_device *dev;
29
struct ieee80211_sub_if_data *sdata;
30
int err;
31
32
err = ieee80211_if_add(local, name, &dev, type, params);
33
if (err)
34
return ERR_PTR(err);
35
36
if (type == NL80211_IFTYPE_MONITOR && flags) {
37
sdata = IEEE80211_DEV_TO_SUB_IF(dev);
38
sdata->u.mntr_flags = *flags;
39
}
40
41
return dev;
42
}
43
44
static int ieee80211_del_iface(struct wiphy *wiphy, struct net_device *dev)
45
{
46
ieee80211_if_remove(IEEE80211_DEV_TO_SUB_IF(dev));
47
48
return 0;
49
}
50
51
static int ieee80211_change_iface(struct wiphy *wiphy,
52
struct net_device *dev,
53
enum nl80211_iftype type, u32 *flags,
54
struct vif_params *params)
55
{
56
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
57
int ret;
58
59
ret = ieee80211_if_change_type(sdata, type);
60
if (ret)
61
return ret;
62
63
if (type == NL80211_IFTYPE_AP_VLAN &&
64
params && params->use_4addr == 0)
65
rcu_assign_pointer(sdata->u.vlan.sta, NULL);
66
else if (type == NL80211_IFTYPE_STATION &&
67
params && params->use_4addr >= 0)
68
sdata->u.mgd.use_4addr = params->use_4addr;
69
70
if (sdata->vif.type == NL80211_IFTYPE_MONITOR && flags) {
71
struct ieee80211_local *local = sdata->local;
72
73
if (ieee80211_sdata_running(sdata)) {
74
/*
75
* Prohibit MONITOR_FLAG_COOK_FRAMES to be
76
* changed while the interface is up.
77
* Else we would need to add a lot of cruft
78
* to update everything:
79
* cooked_mntrs, monitor and all fif_* counters
80
* reconfigure hardware
81
*/
82
if ((*flags & MONITOR_FLAG_COOK_FRAMES) !=
83
(sdata->u.mntr_flags & MONITOR_FLAG_COOK_FRAMES))
84
return -EBUSY;
85
86
ieee80211_adjust_monitor_flags(sdata, -1);
87
sdata->u.mntr_flags = *flags;
88
ieee80211_adjust_monitor_flags(sdata, 1);
89
90
ieee80211_configure_filter(local);
91
} else {
92
/*
93
* Because the interface is down, ieee80211_do_stop
94
* and ieee80211_do_open take care of "everything"
95
* mentioned in the comment above.
96
*/
97
sdata->u.mntr_flags = *flags;
98
}
99
}
100
101
return 0;
102
}
103
104
static int ieee80211_add_key(struct wiphy *wiphy, struct net_device *dev,
105
u8 key_idx, bool pairwise, const u8 *mac_addr,
106
struct key_params *params)
107
{
108
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
109
struct sta_info *sta = NULL;
110
struct ieee80211_key *key;
111
int err;
112
113
if (!ieee80211_sdata_running(sdata))
114
return -ENETDOWN;
115
116
/* reject WEP and TKIP keys if WEP failed to initialize */
117
switch (params->cipher) {
118
case WLAN_CIPHER_SUITE_WEP40:
119
case WLAN_CIPHER_SUITE_TKIP:
120
case WLAN_CIPHER_SUITE_WEP104:
121
if (IS_ERR(sdata->local->wep_tx_tfm))
122
return -EINVAL;
123
break;
124
default:
125
break;
126
}
127
128
key = ieee80211_key_alloc(params->cipher, key_idx, params->key_len,
129
params->key, params->seq_len, params->seq);
130
if (IS_ERR(key))
131
return PTR_ERR(key);
132
133
if (pairwise)
134
key->conf.flags |= IEEE80211_KEY_FLAG_PAIRWISE;
135
136
mutex_lock(&sdata->local->sta_mtx);
137
138
if (mac_addr) {
139
if (ieee80211_vif_is_mesh(&sdata->vif))
140
sta = sta_info_get(sdata, mac_addr);
141
else
142
sta = sta_info_get_bss(sdata, mac_addr);
143
if (!sta) {
144
ieee80211_key_free(sdata->local, key);
145
err = -ENOENT;
146
goto out_unlock;
147
}
148
}
149
150
err = ieee80211_key_link(key, sdata, sta);
151
if (err)
152
ieee80211_key_free(sdata->local, key);
153
154
out_unlock:
155
mutex_unlock(&sdata->local->sta_mtx);
156
157
return err;
158
}
159
160
static int ieee80211_del_key(struct wiphy *wiphy, struct net_device *dev,
161
u8 key_idx, bool pairwise, const u8 *mac_addr)
162
{
163
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
164
struct ieee80211_local *local = sdata->local;
165
struct sta_info *sta;
166
struct ieee80211_key *key = NULL;
167
int ret;
168
169
mutex_lock(&local->sta_mtx);
170
mutex_lock(&local->key_mtx);
171
172
if (mac_addr) {
173
ret = -ENOENT;
174
175
sta = sta_info_get_bss(sdata, mac_addr);
176
if (!sta)
177
goto out_unlock;
178
179
if (pairwise)
180
key = key_mtx_dereference(local, sta->ptk);
181
else
182
key = key_mtx_dereference(local, sta->gtk[key_idx]);
183
} else
184
key = key_mtx_dereference(local, sdata->keys[key_idx]);
185
186
if (!key) {
187
ret = -ENOENT;
188
goto out_unlock;
189
}
190
191
__ieee80211_key_free(key);
192
193
ret = 0;
194
out_unlock:
195
mutex_unlock(&local->key_mtx);
196
mutex_unlock(&local->sta_mtx);
197
198
return ret;
199
}
200
201
static int ieee80211_get_key(struct wiphy *wiphy, struct net_device *dev,
202
u8 key_idx, bool pairwise, const u8 *mac_addr,
203
void *cookie,
204
void (*callback)(void *cookie,
205
struct key_params *params))
206
{
207
struct ieee80211_sub_if_data *sdata;
208
struct sta_info *sta = NULL;
209
u8 seq[6] = {0};
210
struct key_params params;
211
struct ieee80211_key *key = NULL;
212
u32 iv32;
213
u16 iv16;
214
int err = -ENOENT;
215
216
sdata = IEEE80211_DEV_TO_SUB_IF(dev);
217
218
rcu_read_lock();
219
220
if (mac_addr) {
221
sta = sta_info_get_bss(sdata, mac_addr);
222
if (!sta)
223
goto out;
224
225
if (pairwise)
226
key = rcu_dereference(sta->ptk);
227
else if (key_idx < NUM_DEFAULT_KEYS)
228
key = rcu_dereference(sta->gtk[key_idx]);
229
} else
230
key = rcu_dereference(sdata->keys[key_idx]);
231
232
if (!key)
233
goto out;
234
235
memset(&params, 0, sizeof(params));
236
237
params.cipher = key->conf.cipher;
238
239
switch (key->conf.cipher) {
240
case WLAN_CIPHER_SUITE_TKIP:
241
iv32 = key->u.tkip.tx.iv32;
242
iv16 = key->u.tkip.tx.iv16;
243
244
if (key->flags & KEY_FLAG_UPLOADED_TO_HARDWARE)
245
drv_get_tkip_seq(sdata->local,
246
key->conf.hw_key_idx,
247
&iv32, &iv16);
248
249
seq[0] = iv16 & 0xff;
250
seq[1] = (iv16 >> 8) & 0xff;
251
seq[2] = iv32 & 0xff;
252
seq[3] = (iv32 >> 8) & 0xff;
253
seq[4] = (iv32 >> 16) & 0xff;
254
seq[5] = (iv32 >> 24) & 0xff;
255
params.seq = seq;
256
params.seq_len = 6;
257
break;
258
case WLAN_CIPHER_SUITE_CCMP:
259
seq[0] = key->u.ccmp.tx_pn[5];
260
seq[1] = key->u.ccmp.tx_pn[4];
261
seq[2] = key->u.ccmp.tx_pn[3];
262
seq[3] = key->u.ccmp.tx_pn[2];
263
seq[4] = key->u.ccmp.tx_pn[1];
264
seq[5] = key->u.ccmp.tx_pn[0];
265
params.seq = seq;
266
params.seq_len = 6;
267
break;
268
case WLAN_CIPHER_SUITE_AES_CMAC:
269
seq[0] = key->u.aes_cmac.tx_pn[5];
270
seq[1] = key->u.aes_cmac.tx_pn[4];
271
seq[2] = key->u.aes_cmac.tx_pn[3];
272
seq[3] = key->u.aes_cmac.tx_pn[2];
273
seq[4] = key->u.aes_cmac.tx_pn[1];
274
seq[5] = key->u.aes_cmac.tx_pn[0];
275
params.seq = seq;
276
params.seq_len = 6;
277
break;
278
}
279
280
params.key = key->conf.key;
281
params.key_len = key->conf.keylen;
282
283
callback(cookie, &params);
284
err = 0;
285
286
out:
287
rcu_read_unlock();
288
return err;
289
}
290
291
static int ieee80211_config_default_key(struct wiphy *wiphy,
292
struct net_device *dev,
293
u8 key_idx, bool uni,
294
bool multi)
295
{
296
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
297
298
ieee80211_set_default_key(sdata, key_idx, uni, multi);
299
300
return 0;
301
}
302
303
static int ieee80211_config_default_mgmt_key(struct wiphy *wiphy,
304
struct net_device *dev,
305
u8 key_idx)
306
{
307
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
308
309
ieee80211_set_default_mgmt_key(sdata, key_idx);
310
311
return 0;
312
}
313
314
static void rate_idx_to_bitrate(struct rate_info *rate, struct sta_info *sta, int idx)
315
{
316
if (!(rate->flags & RATE_INFO_FLAGS_MCS)) {
317
struct ieee80211_supported_band *sband;
318
sband = sta->local->hw.wiphy->bands[
319
sta->local->hw.conf.channel->band];
320
rate->legacy = sband->bitrates[idx].bitrate;
321
} else
322
rate->mcs = idx;
323
}
324
325
static void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo)
326
{
327
struct ieee80211_sub_if_data *sdata = sta->sdata;
328
struct timespec uptime;
329
330
sinfo->generation = sdata->local->sta_generation;
331
332
sinfo->filled = STATION_INFO_INACTIVE_TIME |
333
STATION_INFO_RX_BYTES |
334
STATION_INFO_TX_BYTES |
335
STATION_INFO_RX_PACKETS |
336
STATION_INFO_TX_PACKETS |
337
STATION_INFO_TX_RETRIES |
338
STATION_INFO_TX_FAILED |
339
STATION_INFO_TX_BITRATE |
340
STATION_INFO_RX_BITRATE |
341
STATION_INFO_RX_DROP_MISC |
342
STATION_INFO_BSS_PARAM |
343
STATION_INFO_CONNECTED_TIME;
344
345
do_posix_clock_monotonic_gettime(&uptime);
346
sinfo->connected_time = uptime.tv_sec - sta->last_connected;
347
348
sinfo->inactive_time = jiffies_to_msecs(jiffies - sta->last_rx);
349
sinfo->rx_bytes = sta->rx_bytes;
350
sinfo->tx_bytes = sta->tx_bytes;
351
sinfo->rx_packets = sta->rx_packets;
352
sinfo->tx_packets = sta->tx_packets;
353
sinfo->tx_retries = sta->tx_retry_count;
354
sinfo->tx_failed = sta->tx_retry_failed;
355
sinfo->rx_dropped_misc = sta->rx_dropped;
356
357
if ((sta->local->hw.flags & IEEE80211_HW_SIGNAL_DBM) ||
358
(sta->local->hw.flags & IEEE80211_HW_SIGNAL_UNSPEC)) {
359
sinfo->filled |= STATION_INFO_SIGNAL | STATION_INFO_SIGNAL_AVG;
360
sinfo->signal = (s8)sta->last_signal;
361
sinfo->signal_avg = (s8) -ewma_read(&sta->avg_signal);
362
}
363
364
sinfo->txrate.flags = 0;
365
if (sta->last_tx_rate.flags & IEEE80211_TX_RC_MCS)
366
sinfo->txrate.flags |= RATE_INFO_FLAGS_MCS;
367
if (sta->last_tx_rate.flags & IEEE80211_TX_RC_40_MHZ_WIDTH)
368
sinfo->txrate.flags |= RATE_INFO_FLAGS_40_MHZ_WIDTH;
369
if (sta->last_tx_rate.flags & IEEE80211_TX_RC_SHORT_GI)
370
sinfo->txrate.flags |= RATE_INFO_FLAGS_SHORT_GI;
371
rate_idx_to_bitrate(&sinfo->txrate, sta, sta->last_tx_rate.idx);
372
373
sinfo->rxrate.flags = 0;
374
if (sta->last_rx_rate_flag & RX_FLAG_HT)
375
sinfo->rxrate.flags |= RATE_INFO_FLAGS_MCS;
376
if (sta->last_rx_rate_flag & RX_FLAG_40MHZ)
377
sinfo->rxrate.flags |= RATE_INFO_FLAGS_40_MHZ_WIDTH;
378
if (sta->last_rx_rate_flag & RX_FLAG_SHORT_GI)
379
sinfo->rxrate.flags |= RATE_INFO_FLAGS_SHORT_GI;
380
rate_idx_to_bitrate(&sinfo->rxrate, sta, sta->last_rx_rate_idx);
381
382
if (ieee80211_vif_is_mesh(&sdata->vif)) {
383
#ifdef CONFIG_MAC80211_MESH
384
sinfo->filled |= STATION_INFO_LLID |
385
STATION_INFO_PLID |
386
STATION_INFO_PLINK_STATE;
387
388
sinfo->llid = le16_to_cpu(sta->llid);
389
sinfo->plid = le16_to_cpu(sta->plid);
390
sinfo->plink_state = sta->plink_state;
391
#endif
392
}
393
394
sinfo->bss_param.flags = 0;
395
if (sdata->vif.bss_conf.use_cts_prot)
396
sinfo->bss_param.flags |= BSS_PARAM_FLAGS_CTS_PROT;
397
if (sdata->vif.bss_conf.use_short_preamble)
398
sinfo->bss_param.flags |= BSS_PARAM_FLAGS_SHORT_PREAMBLE;
399
if (sdata->vif.bss_conf.use_short_slot)
400
sinfo->bss_param.flags |= BSS_PARAM_FLAGS_SHORT_SLOT_TIME;
401
sinfo->bss_param.dtim_period = sdata->local->hw.conf.ps_dtim_period;
402
sinfo->bss_param.beacon_interval = sdata->vif.bss_conf.beacon_int;
403
}
404
405
406
static int ieee80211_dump_station(struct wiphy *wiphy, struct net_device *dev,
407
int idx, u8 *mac, struct station_info *sinfo)
408
{
409
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
410
struct sta_info *sta;
411
int ret = -ENOENT;
412
413
rcu_read_lock();
414
415
sta = sta_info_get_by_idx(sdata, idx);
416
if (sta) {
417
ret = 0;
418
memcpy(mac, sta->sta.addr, ETH_ALEN);
419
sta_set_sinfo(sta, sinfo);
420
}
421
422
rcu_read_unlock();
423
424
return ret;
425
}
426
427
static int ieee80211_dump_survey(struct wiphy *wiphy, struct net_device *dev,
428
int idx, struct survey_info *survey)
429
{
430
struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
431
432
return drv_get_survey(local, idx, survey);
433
}
434
435
static int ieee80211_get_station(struct wiphy *wiphy, struct net_device *dev,
436
u8 *mac, struct station_info *sinfo)
437
{
438
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
439
struct sta_info *sta;
440
int ret = -ENOENT;
441
442
rcu_read_lock();
443
444
sta = sta_info_get_bss(sdata, mac);
445
if (sta) {
446
ret = 0;
447
sta_set_sinfo(sta, sinfo);
448
}
449
450
rcu_read_unlock();
451
452
return ret;
453
}
454
455
/*
456
* This handles both adding a beacon and setting new beacon info
457
*/
458
static int ieee80211_config_beacon(struct ieee80211_sub_if_data *sdata,
459
struct beacon_parameters *params)
460
{
461
struct beacon_data *new, *old;
462
int new_head_len, new_tail_len;
463
int size;
464
int err = -EINVAL;
465
466
old = rtnl_dereference(sdata->u.ap.beacon);
467
468
/* head must not be zero-length */
469
if (params->head && !params->head_len)
470
return -EINVAL;
471
472
/*
473
* This is a kludge. beacon interval should really be part
474
* of the beacon information.
475
*/
476
if (params->interval &&
477
(sdata->vif.bss_conf.beacon_int != params->interval)) {
478
sdata->vif.bss_conf.beacon_int = params->interval;
479
ieee80211_bss_info_change_notify(sdata,
480
BSS_CHANGED_BEACON_INT);
481
}
482
483
/* Need to have a beacon head if we don't have one yet */
484
if (!params->head && !old)
485
return err;
486
487
/* sorry, no way to start beaconing without dtim period */
488
if (!params->dtim_period && !old)
489
return err;
490
491
/* new or old head? */
492
if (params->head)
493
new_head_len = params->head_len;
494
else
495
new_head_len = old->head_len;
496
497
/* new or old tail? */
498
if (params->tail || !old)
499
/* params->tail_len will be zero for !params->tail */
500
new_tail_len = params->tail_len;
501
else
502
new_tail_len = old->tail_len;
503
504
size = sizeof(*new) + new_head_len + new_tail_len;
505
506
new = kzalloc(size, GFP_KERNEL);
507
if (!new)
508
return -ENOMEM;
509
510
/* start filling the new info now */
511
512
/* new or old dtim period? */
513
if (params->dtim_period)
514
new->dtim_period = params->dtim_period;
515
else
516
new->dtim_period = old->dtim_period;
517
518
/*
519
* pointers go into the block we allocated,
520
* memory is | beacon_data | head | tail |
521
*/
522
new->head = ((u8 *) new) + sizeof(*new);
523
new->tail = new->head + new_head_len;
524
new->head_len = new_head_len;
525
new->tail_len = new_tail_len;
526
527
/* copy in head */
528
if (params->head)
529
memcpy(new->head, params->head, new_head_len);
530
else
531
memcpy(new->head, old->head, new_head_len);
532
533
/* copy in optional tail */
534
if (params->tail)
535
memcpy(new->tail, params->tail, new_tail_len);
536
else
537
if (old)
538
memcpy(new->tail, old->tail, new_tail_len);
539
540
sdata->vif.bss_conf.dtim_period = new->dtim_period;
541
542
rcu_assign_pointer(sdata->u.ap.beacon, new);
543
544
synchronize_rcu();
545
546
kfree(old);
547
548
ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON_ENABLED |
549
BSS_CHANGED_BEACON);
550
return 0;
551
}
552
553
static int ieee80211_add_beacon(struct wiphy *wiphy, struct net_device *dev,
554
struct beacon_parameters *params)
555
{
556
struct ieee80211_sub_if_data *sdata;
557
struct beacon_data *old;
558
559
sdata = IEEE80211_DEV_TO_SUB_IF(dev);
560
561
old = rtnl_dereference(sdata->u.ap.beacon);
562
if (old)
563
return -EALREADY;
564
565
return ieee80211_config_beacon(sdata, params);
566
}
567
568
static int ieee80211_set_beacon(struct wiphy *wiphy, struct net_device *dev,
569
struct beacon_parameters *params)
570
{
571
struct ieee80211_sub_if_data *sdata;
572
struct beacon_data *old;
573
574
sdata = IEEE80211_DEV_TO_SUB_IF(dev);
575
576
old = rtnl_dereference(sdata->u.ap.beacon);
577
if (!old)
578
return -ENOENT;
579
580
return ieee80211_config_beacon(sdata, params);
581
}
582
583
static int ieee80211_del_beacon(struct wiphy *wiphy, struct net_device *dev)
584
{
585
struct ieee80211_sub_if_data *sdata;
586
struct beacon_data *old;
587
588
sdata = IEEE80211_DEV_TO_SUB_IF(dev);
589
590
old = rtnl_dereference(sdata->u.ap.beacon);
591
if (!old)
592
return -ENOENT;
593
594
rcu_assign_pointer(sdata->u.ap.beacon, NULL);
595
synchronize_rcu();
596
kfree(old);
597
598
ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON_ENABLED);
599
return 0;
600
}
601
602
/* Layer 2 Update frame (802.2 Type 1 LLC XID Update response) */
603
struct iapp_layer2_update {
604
u8 da[ETH_ALEN]; /* broadcast */
605
u8 sa[ETH_ALEN]; /* STA addr */
606
__be16 len; /* 6 */
607
u8 dsap; /* 0 */
608
u8 ssap; /* 0 */
609
u8 control;
610
u8 xid_info[3];
611
} __packed;
612
613
static void ieee80211_send_layer2_update(struct sta_info *sta)
614
{
615
struct iapp_layer2_update *msg;
616
struct sk_buff *skb;
617
618
/* Send Level 2 Update Frame to update forwarding tables in layer 2
619
* bridge devices */
620
621
skb = dev_alloc_skb(sizeof(*msg));
622
if (!skb)
623
return;
624
msg = (struct iapp_layer2_update *)skb_put(skb, sizeof(*msg));
625
626
/* 802.2 Type 1 Logical Link Control (LLC) Exchange Identifier (XID)
627
* Update response frame; IEEE Std 802.2-1998, 5.4.1.2.1 */
628
629
memset(msg->da, 0xff, ETH_ALEN);
630
memcpy(msg->sa, sta->sta.addr, ETH_ALEN);
631
msg->len = htons(6);
632
msg->dsap = 0;
633
msg->ssap = 0x01; /* NULL LSAP, CR Bit: Response */
634
msg->control = 0xaf; /* XID response lsb.1111F101.
635
* F=0 (no poll command; unsolicited frame) */
636
msg->xid_info[0] = 0x81; /* XID format identifier */
637
msg->xid_info[1] = 1; /* LLC types/classes: Type 1 LLC */
638
msg->xid_info[2] = 0; /* XID sender's receive window size (RW) */
639
640
skb->dev = sta->sdata->dev;
641
skb->protocol = eth_type_trans(skb, sta->sdata->dev);
642
memset(skb->cb, 0, sizeof(skb->cb));
643
netif_rx_ni(skb);
644
}
645
646
static void sta_apply_parameters(struct ieee80211_local *local,
647
struct sta_info *sta,
648
struct station_parameters *params)
649
{
650
unsigned long flags;
651
u32 rates;
652
int i, j;
653
struct ieee80211_supported_band *sband;
654
struct ieee80211_sub_if_data *sdata = sta->sdata;
655
u32 mask, set;
656
657
sband = local->hw.wiphy->bands[local->oper_channel->band];
658
659
spin_lock_irqsave(&sta->flaglock, flags);
660
mask = params->sta_flags_mask;
661
set = params->sta_flags_set;
662
663
if (mask & BIT(NL80211_STA_FLAG_AUTHORIZED)) {
664
sta->flags &= ~WLAN_STA_AUTHORIZED;
665
if (set & BIT(NL80211_STA_FLAG_AUTHORIZED))
666
sta->flags |= WLAN_STA_AUTHORIZED;
667
}
668
669
if (mask & BIT(NL80211_STA_FLAG_SHORT_PREAMBLE)) {
670
sta->flags &= ~WLAN_STA_SHORT_PREAMBLE;
671
if (set & BIT(NL80211_STA_FLAG_SHORT_PREAMBLE))
672
sta->flags |= WLAN_STA_SHORT_PREAMBLE;
673
}
674
675
if (mask & BIT(NL80211_STA_FLAG_WME)) {
676
sta->flags &= ~WLAN_STA_WME;
677
if (set & BIT(NL80211_STA_FLAG_WME))
678
sta->flags |= WLAN_STA_WME;
679
}
680
681
if (mask & BIT(NL80211_STA_FLAG_MFP)) {
682
sta->flags &= ~WLAN_STA_MFP;
683
if (set & BIT(NL80211_STA_FLAG_MFP))
684
sta->flags |= WLAN_STA_MFP;
685
}
686
687
if (mask & BIT(NL80211_STA_FLAG_AUTHENTICATED)) {
688
sta->flags &= ~WLAN_STA_AUTH;
689
if (set & BIT(NL80211_STA_FLAG_AUTHENTICATED))
690
sta->flags |= WLAN_STA_AUTH;
691
}
692
spin_unlock_irqrestore(&sta->flaglock, flags);
693
694
/*
695
* cfg80211 validates this (1-2007) and allows setting the AID
696
* only when creating a new station entry
697
*/
698
if (params->aid)
699
sta->sta.aid = params->aid;
700
701
/*
702
* FIXME: updating the following information is racy when this
703
* function is called from ieee80211_change_station().
704
* However, all this information should be static so
705
* maybe we should just reject attemps to change it.
706
*/
707
708
if (params->listen_interval >= 0)
709
sta->listen_interval = params->listen_interval;
710
711
if (params->supported_rates) {
712
rates = 0;
713
714
for (i = 0; i < params->supported_rates_len; i++) {
715
int rate = (params->supported_rates[i] & 0x7f) * 5;
716
for (j = 0; j < sband->n_bitrates; j++) {
717
if (sband->bitrates[j].bitrate == rate)
718
rates |= BIT(j);
719
}
720
}
721
sta->sta.supp_rates[local->oper_channel->band] = rates;
722
}
723
724
if (params->ht_capa)
725
ieee80211_ht_cap_ie_to_sta_ht_cap(sband,
726
params->ht_capa,
727
&sta->sta.ht_cap);
728
729
if (ieee80211_vif_is_mesh(&sdata->vif)) {
730
#ifdef CONFIG_MAC80211_MESH
731
if (sdata->u.mesh.security & IEEE80211_MESH_SEC_SECURED)
732
switch (params->plink_state) {
733
case NL80211_PLINK_LISTEN:
734
case NL80211_PLINK_ESTAB:
735
case NL80211_PLINK_BLOCKED:
736
sta->plink_state = params->plink_state;
737
break;
738
default:
739
/* nothing */
740
break;
741
}
742
else
743
switch (params->plink_action) {
744
case PLINK_ACTION_OPEN:
745
mesh_plink_open(sta);
746
break;
747
case PLINK_ACTION_BLOCK:
748
mesh_plink_block(sta);
749
break;
750
}
751
#endif
752
}
753
}
754
755
static int ieee80211_add_station(struct wiphy *wiphy, struct net_device *dev,
756
u8 *mac, struct station_parameters *params)
757
{
758
struct ieee80211_local *local = wiphy_priv(wiphy);
759
struct sta_info *sta;
760
struct ieee80211_sub_if_data *sdata;
761
int err;
762
int layer2_update;
763
764
if (params->vlan) {
765
sdata = IEEE80211_DEV_TO_SUB_IF(params->vlan);
766
767
if (sdata->vif.type != NL80211_IFTYPE_AP_VLAN &&
768
sdata->vif.type != NL80211_IFTYPE_AP)
769
return -EINVAL;
770
} else
771
sdata = IEEE80211_DEV_TO_SUB_IF(dev);
772
773
if (compare_ether_addr(mac, sdata->vif.addr) == 0)
774
return -EINVAL;
775
776
if (is_multicast_ether_addr(mac))
777
return -EINVAL;
778
779
sta = sta_info_alloc(sdata, mac, GFP_KERNEL);
780
if (!sta)
781
return -ENOMEM;
782
783
sta->flags = WLAN_STA_AUTH | WLAN_STA_ASSOC;
784
785
sta_apply_parameters(local, sta, params);
786
787
rate_control_rate_init(sta);
788
789
layer2_update = sdata->vif.type == NL80211_IFTYPE_AP_VLAN ||
790
sdata->vif.type == NL80211_IFTYPE_AP;
791
792
err = sta_info_insert_rcu(sta);
793
if (err) {
794
rcu_read_unlock();
795
return err;
796
}
797
798
if (layer2_update)
799
ieee80211_send_layer2_update(sta);
800
801
rcu_read_unlock();
802
803
return 0;
804
}
805
806
static int ieee80211_del_station(struct wiphy *wiphy, struct net_device *dev,
807
u8 *mac)
808
{
809
struct ieee80211_local *local = wiphy_priv(wiphy);
810
struct ieee80211_sub_if_data *sdata;
811
812
sdata = IEEE80211_DEV_TO_SUB_IF(dev);
813
814
if (mac)
815
return sta_info_destroy_addr_bss(sdata, mac);
816
817
sta_info_flush(local, sdata);
818
return 0;
819
}
820
821
static int ieee80211_change_station(struct wiphy *wiphy,
822
struct net_device *dev,
823
u8 *mac,
824
struct station_parameters *params)
825
{
826
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
827
struct ieee80211_local *local = wiphy_priv(wiphy);
828
struct sta_info *sta;
829
struct ieee80211_sub_if_data *vlansdata;
830
831
rcu_read_lock();
832
833
sta = sta_info_get_bss(sdata, mac);
834
if (!sta) {
835
rcu_read_unlock();
836
return -ENOENT;
837
}
838
839
if (params->vlan && params->vlan != sta->sdata->dev) {
840
vlansdata = IEEE80211_DEV_TO_SUB_IF(params->vlan);
841
842
if (vlansdata->vif.type != NL80211_IFTYPE_AP_VLAN &&
843
vlansdata->vif.type != NL80211_IFTYPE_AP) {
844
rcu_read_unlock();
845
return -EINVAL;
846
}
847
848
if (params->vlan->ieee80211_ptr->use_4addr) {
849
if (vlansdata->u.vlan.sta) {
850
rcu_read_unlock();
851
return -EBUSY;
852
}
853
854
rcu_assign_pointer(vlansdata->u.vlan.sta, sta);
855
}
856
857
sta->sdata = vlansdata;
858
ieee80211_send_layer2_update(sta);
859
}
860
861
sta_apply_parameters(local, sta, params);
862
863
rcu_read_unlock();
864
865
if (sdata->vif.type == NL80211_IFTYPE_STATION &&
866
params->sta_flags_mask & BIT(NL80211_STA_FLAG_AUTHORIZED))
867
ieee80211_recalc_ps(local, -1);
868
869
return 0;
870
}
871
872
#ifdef CONFIG_MAC80211_MESH
873
static int ieee80211_add_mpath(struct wiphy *wiphy, struct net_device *dev,
874
u8 *dst, u8 *next_hop)
875
{
876
struct ieee80211_sub_if_data *sdata;
877
struct mesh_path *mpath;
878
struct sta_info *sta;
879
int err;
880
881
sdata = IEEE80211_DEV_TO_SUB_IF(dev);
882
883
rcu_read_lock();
884
sta = sta_info_get(sdata, next_hop);
885
if (!sta) {
886
rcu_read_unlock();
887
return -ENOENT;
888
}
889
890
err = mesh_path_add(dst, sdata);
891
if (err) {
892
rcu_read_unlock();
893
return err;
894
}
895
896
mpath = mesh_path_lookup(dst, sdata);
897
if (!mpath) {
898
rcu_read_unlock();
899
return -ENXIO;
900
}
901
mesh_path_fix_nexthop(mpath, sta);
902
903
rcu_read_unlock();
904
return 0;
905
}
906
907
static int ieee80211_del_mpath(struct wiphy *wiphy, struct net_device *dev,
908
u8 *dst)
909
{
910
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
911
912
if (dst)
913
return mesh_path_del(dst, sdata);
914
915
mesh_path_flush(sdata);
916
return 0;
917
}
918
919
static int ieee80211_change_mpath(struct wiphy *wiphy,
920
struct net_device *dev,
921
u8 *dst, u8 *next_hop)
922
{
923
struct ieee80211_sub_if_data *sdata;
924
struct mesh_path *mpath;
925
struct sta_info *sta;
926
927
sdata = IEEE80211_DEV_TO_SUB_IF(dev);
928
929
rcu_read_lock();
930
931
sta = sta_info_get(sdata, next_hop);
932
if (!sta) {
933
rcu_read_unlock();
934
return -ENOENT;
935
}
936
937
mpath = mesh_path_lookup(dst, sdata);
938
if (!mpath) {
939
rcu_read_unlock();
940
return -ENOENT;
941
}
942
943
mesh_path_fix_nexthop(mpath, sta);
944
945
rcu_read_unlock();
946
return 0;
947
}
948
949
static void mpath_set_pinfo(struct mesh_path *mpath, u8 *next_hop,
950
struct mpath_info *pinfo)
951
{
952
struct sta_info *next_hop_sta = rcu_dereference(mpath->next_hop);
953
954
if (next_hop_sta)
955
memcpy(next_hop, next_hop_sta->sta.addr, ETH_ALEN);
956
else
957
memset(next_hop, 0, ETH_ALEN);
958
959
pinfo->generation = mesh_paths_generation;
960
961
pinfo->filled = MPATH_INFO_FRAME_QLEN |
962
MPATH_INFO_SN |
963
MPATH_INFO_METRIC |
964
MPATH_INFO_EXPTIME |
965
MPATH_INFO_DISCOVERY_TIMEOUT |
966
MPATH_INFO_DISCOVERY_RETRIES |
967
MPATH_INFO_FLAGS;
968
969
pinfo->frame_qlen = mpath->frame_queue.qlen;
970
pinfo->sn = mpath->sn;
971
pinfo->metric = mpath->metric;
972
if (time_before(jiffies, mpath->exp_time))
973
pinfo->exptime = jiffies_to_msecs(mpath->exp_time - jiffies);
974
pinfo->discovery_timeout =
975
jiffies_to_msecs(mpath->discovery_timeout);
976
pinfo->discovery_retries = mpath->discovery_retries;
977
pinfo->flags = 0;
978
if (mpath->flags & MESH_PATH_ACTIVE)
979
pinfo->flags |= NL80211_MPATH_FLAG_ACTIVE;
980
if (mpath->flags & MESH_PATH_RESOLVING)
981
pinfo->flags |= NL80211_MPATH_FLAG_RESOLVING;
982
if (mpath->flags & MESH_PATH_SN_VALID)
983
pinfo->flags |= NL80211_MPATH_FLAG_SN_VALID;
984
if (mpath->flags & MESH_PATH_FIXED)
985
pinfo->flags |= NL80211_MPATH_FLAG_FIXED;
986
if (mpath->flags & MESH_PATH_RESOLVING)
987
pinfo->flags |= NL80211_MPATH_FLAG_RESOLVING;
988
989
pinfo->flags = mpath->flags;
990
}
991
992
static int ieee80211_get_mpath(struct wiphy *wiphy, struct net_device *dev,
993
u8 *dst, u8 *next_hop, struct mpath_info *pinfo)
994
995
{
996
struct ieee80211_sub_if_data *sdata;
997
struct mesh_path *mpath;
998
999
sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1000
1001
rcu_read_lock();
1002
mpath = mesh_path_lookup(dst, sdata);
1003
if (!mpath) {
1004
rcu_read_unlock();
1005
return -ENOENT;
1006
}
1007
memcpy(dst, mpath->dst, ETH_ALEN);
1008
mpath_set_pinfo(mpath, next_hop, pinfo);
1009
rcu_read_unlock();
1010
return 0;
1011
}
1012
1013
static int ieee80211_dump_mpath(struct wiphy *wiphy, struct net_device *dev,
1014
int idx, u8 *dst, u8 *next_hop,
1015
struct mpath_info *pinfo)
1016
{
1017
struct ieee80211_sub_if_data *sdata;
1018
struct mesh_path *mpath;
1019
1020
sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1021
1022
rcu_read_lock();
1023
mpath = mesh_path_lookup_by_idx(idx, sdata);
1024
if (!mpath) {
1025
rcu_read_unlock();
1026
return -ENOENT;
1027
}
1028
memcpy(dst, mpath->dst, ETH_ALEN);
1029
mpath_set_pinfo(mpath, next_hop, pinfo);
1030
rcu_read_unlock();
1031
return 0;
1032
}
1033
1034
static int ieee80211_get_mesh_config(struct wiphy *wiphy,
1035
struct net_device *dev,
1036
struct mesh_config *conf)
1037
{
1038
struct ieee80211_sub_if_data *sdata;
1039
sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1040
1041
memcpy(conf, &(sdata->u.mesh.mshcfg), sizeof(struct mesh_config));
1042
return 0;
1043
}
1044
1045
static inline bool _chg_mesh_attr(enum nl80211_meshconf_params parm, u32 mask)
1046
{
1047
return (mask >> (parm-1)) & 0x1;
1048
}
1049
1050
static int copy_mesh_setup(struct ieee80211_if_mesh *ifmsh,
1051
const struct mesh_setup *setup)
1052
{
1053
u8 *new_ie;
1054
const u8 *old_ie;
1055
1056
/* allocate information elements */
1057
new_ie = NULL;
1058
old_ie = ifmsh->ie;
1059
1060
if (setup->ie_len) {
1061
new_ie = kmemdup(setup->ie, setup->ie_len,
1062
GFP_KERNEL);
1063
if (!new_ie)
1064
return -ENOMEM;
1065
}
1066
ifmsh->ie_len = setup->ie_len;
1067
ifmsh->ie = new_ie;
1068
kfree(old_ie);
1069
1070
/* now copy the rest of the setup parameters */
1071
ifmsh->mesh_id_len = setup->mesh_id_len;
1072
memcpy(ifmsh->mesh_id, setup->mesh_id, ifmsh->mesh_id_len);
1073
ifmsh->mesh_pp_id = setup->path_sel_proto;
1074
ifmsh->mesh_pm_id = setup->path_metric;
1075
ifmsh->security = IEEE80211_MESH_SEC_NONE;
1076
if (setup->is_authenticated)
1077
ifmsh->security |= IEEE80211_MESH_SEC_AUTHED;
1078
if (setup->is_secure)
1079
ifmsh->security |= IEEE80211_MESH_SEC_SECURED;
1080
1081
return 0;
1082
}
1083
1084
static int ieee80211_update_mesh_config(struct wiphy *wiphy,
1085
struct net_device *dev, u32 mask,
1086
const struct mesh_config *nconf)
1087
{
1088
struct mesh_config *conf;
1089
struct ieee80211_sub_if_data *sdata;
1090
struct ieee80211_if_mesh *ifmsh;
1091
1092
sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1093
ifmsh = &sdata->u.mesh;
1094
1095
/* Set the config options which we are interested in setting */
1096
conf = &(sdata->u.mesh.mshcfg);
1097
if (_chg_mesh_attr(NL80211_MESHCONF_RETRY_TIMEOUT, mask))
1098
conf->dot11MeshRetryTimeout = nconf->dot11MeshRetryTimeout;
1099
if (_chg_mesh_attr(NL80211_MESHCONF_CONFIRM_TIMEOUT, mask))
1100
conf->dot11MeshConfirmTimeout = nconf->dot11MeshConfirmTimeout;
1101
if (_chg_mesh_attr(NL80211_MESHCONF_HOLDING_TIMEOUT, mask))
1102
conf->dot11MeshHoldingTimeout = nconf->dot11MeshHoldingTimeout;
1103
if (_chg_mesh_attr(NL80211_MESHCONF_MAX_PEER_LINKS, mask))
1104
conf->dot11MeshMaxPeerLinks = nconf->dot11MeshMaxPeerLinks;
1105
if (_chg_mesh_attr(NL80211_MESHCONF_MAX_RETRIES, mask))
1106
conf->dot11MeshMaxRetries = nconf->dot11MeshMaxRetries;
1107
if (_chg_mesh_attr(NL80211_MESHCONF_TTL, mask))
1108
conf->dot11MeshTTL = nconf->dot11MeshTTL;
1109
if (_chg_mesh_attr(NL80211_MESHCONF_ELEMENT_TTL, mask))
1110
conf->dot11MeshTTL = nconf->element_ttl;
1111
if (_chg_mesh_attr(NL80211_MESHCONF_AUTO_OPEN_PLINKS, mask))
1112
conf->auto_open_plinks = nconf->auto_open_plinks;
1113
if (_chg_mesh_attr(NL80211_MESHCONF_HWMP_MAX_PREQ_RETRIES, mask))
1114
conf->dot11MeshHWMPmaxPREQretries =
1115
nconf->dot11MeshHWMPmaxPREQretries;
1116
if (_chg_mesh_attr(NL80211_MESHCONF_PATH_REFRESH_TIME, mask))
1117
conf->path_refresh_time = nconf->path_refresh_time;
1118
if (_chg_mesh_attr(NL80211_MESHCONF_MIN_DISCOVERY_TIMEOUT, mask))
1119
conf->min_discovery_timeout = nconf->min_discovery_timeout;
1120
if (_chg_mesh_attr(NL80211_MESHCONF_HWMP_ACTIVE_PATH_TIMEOUT, mask))
1121
conf->dot11MeshHWMPactivePathTimeout =
1122
nconf->dot11MeshHWMPactivePathTimeout;
1123
if (_chg_mesh_attr(NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL, mask))
1124
conf->dot11MeshHWMPpreqMinInterval =
1125
nconf->dot11MeshHWMPpreqMinInterval;
1126
if (_chg_mesh_attr(NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME,
1127
mask))
1128
conf->dot11MeshHWMPnetDiameterTraversalTime =
1129
nconf->dot11MeshHWMPnetDiameterTraversalTime;
1130
if (_chg_mesh_attr(NL80211_MESHCONF_HWMP_ROOTMODE, mask)) {
1131
conf->dot11MeshHWMPRootMode = nconf->dot11MeshHWMPRootMode;
1132
ieee80211_mesh_root_setup(ifmsh);
1133
}
1134
return 0;
1135
}
1136
1137
static int ieee80211_join_mesh(struct wiphy *wiphy, struct net_device *dev,
1138
const struct mesh_config *conf,
1139
const struct mesh_setup *setup)
1140
{
1141
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1142
struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
1143
int err;
1144
1145
memcpy(&ifmsh->mshcfg, conf, sizeof(struct mesh_config));
1146
err = copy_mesh_setup(ifmsh, setup);
1147
if (err)
1148
return err;
1149
ieee80211_start_mesh(sdata);
1150
1151
return 0;
1152
}
1153
1154
static int ieee80211_leave_mesh(struct wiphy *wiphy, struct net_device *dev)
1155
{
1156
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1157
1158
ieee80211_stop_mesh(sdata);
1159
1160
return 0;
1161
}
1162
#endif
1163
1164
static int ieee80211_change_bss(struct wiphy *wiphy,
1165
struct net_device *dev,
1166
struct bss_parameters *params)
1167
{
1168
struct ieee80211_sub_if_data *sdata;
1169
u32 changed = 0;
1170
1171
sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1172
1173
if (params->use_cts_prot >= 0) {
1174
sdata->vif.bss_conf.use_cts_prot = params->use_cts_prot;
1175
changed |= BSS_CHANGED_ERP_CTS_PROT;
1176
}
1177
if (params->use_short_preamble >= 0) {
1178
sdata->vif.bss_conf.use_short_preamble =
1179
params->use_short_preamble;
1180
changed |= BSS_CHANGED_ERP_PREAMBLE;
1181
}
1182
1183
if (!sdata->vif.bss_conf.use_short_slot &&
1184
sdata->local->hw.conf.channel->band == IEEE80211_BAND_5GHZ) {
1185
sdata->vif.bss_conf.use_short_slot = true;
1186
changed |= BSS_CHANGED_ERP_SLOT;
1187
}
1188
1189
if (params->use_short_slot_time >= 0) {
1190
sdata->vif.bss_conf.use_short_slot =
1191
params->use_short_slot_time;
1192
changed |= BSS_CHANGED_ERP_SLOT;
1193
}
1194
1195
if (params->basic_rates) {
1196
int i, j;
1197
u32 rates = 0;
1198
struct ieee80211_local *local = wiphy_priv(wiphy);
1199
struct ieee80211_supported_band *sband =
1200
wiphy->bands[local->oper_channel->band];
1201
1202
for (i = 0; i < params->basic_rates_len; i++) {
1203
int rate = (params->basic_rates[i] & 0x7f) * 5;
1204
for (j = 0; j < sband->n_bitrates; j++) {
1205
if (sband->bitrates[j].bitrate == rate)
1206
rates |= BIT(j);
1207
}
1208
}
1209
sdata->vif.bss_conf.basic_rates = rates;
1210
changed |= BSS_CHANGED_BASIC_RATES;
1211
}
1212
1213
if (params->ap_isolate >= 0) {
1214
if (params->ap_isolate)
1215
sdata->flags |= IEEE80211_SDATA_DONT_BRIDGE_PACKETS;
1216
else
1217
sdata->flags &= ~IEEE80211_SDATA_DONT_BRIDGE_PACKETS;
1218
}
1219
1220
if (params->ht_opmode >= 0) {
1221
sdata->vif.bss_conf.ht_operation_mode =
1222
(u16) params->ht_opmode;
1223
changed |= BSS_CHANGED_HT;
1224
}
1225
1226
ieee80211_bss_info_change_notify(sdata, changed);
1227
1228
return 0;
1229
}
1230
1231
static int ieee80211_set_txq_params(struct wiphy *wiphy,
1232
struct ieee80211_txq_params *params)
1233
{
1234
struct ieee80211_local *local = wiphy_priv(wiphy);
1235
struct ieee80211_tx_queue_params p;
1236
1237
if (!local->ops->conf_tx)
1238
return -EOPNOTSUPP;
1239
1240
memset(&p, 0, sizeof(p));
1241
p.aifs = params->aifs;
1242
p.cw_max = params->cwmax;
1243
p.cw_min = params->cwmin;
1244
p.txop = params->txop;
1245
1246
/*
1247
* Setting tx queue params disables u-apsd because it's only
1248
* called in master mode.
1249
*/
1250
p.uapsd = false;
1251
1252
if (drv_conf_tx(local, params->queue, &p)) {
1253
wiphy_debug(local->hw.wiphy,
1254
"failed to set TX queue parameters for queue %d\n",
1255
params->queue);
1256
return -EINVAL;
1257
}
1258
1259
return 0;
1260
}
1261
1262
static int ieee80211_set_channel(struct wiphy *wiphy,
1263
struct net_device *netdev,
1264
struct ieee80211_channel *chan,
1265
enum nl80211_channel_type channel_type)
1266
{
1267
struct ieee80211_local *local = wiphy_priv(wiphy);
1268
struct ieee80211_sub_if_data *sdata = NULL;
1269
struct ieee80211_channel *old_oper;
1270
enum nl80211_channel_type old_oper_type;
1271
enum nl80211_channel_type old_vif_oper_type= NL80211_CHAN_NO_HT;
1272
1273
if (netdev)
1274
sdata = IEEE80211_DEV_TO_SUB_IF(netdev);
1275
1276
switch (ieee80211_get_channel_mode(local, NULL)) {
1277
case CHAN_MODE_HOPPING:
1278
return -EBUSY;
1279
case CHAN_MODE_FIXED:
1280
if (local->oper_channel != chan)
1281
return -EBUSY;
1282
if (!sdata && local->_oper_channel_type == channel_type)
1283
return 0;
1284
break;
1285
case CHAN_MODE_UNDEFINED:
1286
break;
1287
}
1288
1289
if (sdata)
1290
old_vif_oper_type = sdata->vif.bss_conf.channel_type;
1291
old_oper_type = local->_oper_channel_type;
1292
1293
if (!ieee80211_set_channel_type(local, sdata, channel_type))
1294
return -EBUSY;
1295
1296
old_oper = local->oper_channel;
1297
local->oper_channel = chan;
1298
1299
/* Update driver if changes were actually made. */
1300
if ((old_oper != local->oper_channel) ||
1301
(old_oper_type != local->_oper_channel_type))
1302
ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_CHANNEL);
1303
1304
if ((sdata && sdata->vif.type != NL80211_IFTYPE_MONITOR) &&
1305
old_vif_oper_type != sdata->vif.bss_conf.channel_type)
1306
ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_HT);
1307
1308
return 0;
1309
}
1310
1311
#ifdef CONFIG_PM
1312
static int ieee80211_suspend(struct wiphy *wiphy,
1313
struct cfg80211_wowlan *wowlan)
1314
{
1315
return __ieee80211_suspend(wiphy_priv(wiphy), wowlan);
1316
}
1317
1318
static int ieee80211_resume(struct wiphy *wiphy)
1319
{
1320
return __ieee80211_resume(wiphy_priv(wiphy));
1321
}
1322
#else
1323
#define ieee80211_suspend NULL
1324
#define ieee80211_resume NULL
1325
#endif
1326
1327
static int ieee80211_scan(struct wiphy *wiphy,
1328
struct net_device *dev,
1329
struct cfg80211_scan_request *req)
1330
{
1331
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1332
1333
switch (ieee80211_vif_type_p2p(&sdata->vif)) {
1334
case NL80211_IFTYPE_STATION:
1335
case NL80211_IFTYPE_ADHOC:
1336
case NL80211_IFTYPE_MESH_POINT:
1337
case NL80211_IFTYPE_P2P_CLIENT:
1338
break;
1339
case NL80211_IFTYPE_P2P_GO:
1340
if (sdata->local->ops->hw_scan)
1341
break;
1342
/*
1343
* FIXME: implement NoA while scanning in software,
1344
* for now fall through to allow scanning only when
1345
* beaconing hasn't been configured yet
1346
*/
1347
case NL80211_IFTYPE_AP:
1348
if (sdata->u.ap.beacon)
1349
return -EOPNOTSUPP;
1350
break;
1351
default:
1352
return -EOPNOTSUPP;
1353
}
1354
1355
return ieee80211_request_scan(sdata, req);
1356
}
1357
1358
static int
1359
ieee80211_sched_scan_start(struct wiphy *wiphy,
1360
struct net_device *dev,
1361
struct cfg80211_sched_scan_request *req)
1362
{
1363
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1364
1365
if (!sdata->local->ops->sched_scan_start)
1366
return -EOPNOTSUPP;
1367
1368
return ieee80211_request_sched_scan_start(sdata, req);
1369
}
1370
1371
static int
1372
ieee80211_sched_scan_stop(struct wiphy *wiphy, struct net_device *dev)
1373
{
1374
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1375
1376
if (!sdata->local->ops->sched_scan_stop)
1377
return -EOPNOTSUPP;
1378
1379
return ieee80211_request_sched_scan_stop(sdata);
1380
}
1381
1382
static int ieee80211_auth(struct wiphy *wiphy, struct net_device *dev,
1383
struct cfg80211_auth_request *req)
1384
{
1385
return ieee80211_mgd_auth(IEEE80211_DEV_TO_SUB_IF(dev), req);
1386
}
1387
1388
static int ieee80211_assoc(struct wiphy *wiphy, struct net_device *dev,
1389
struct cfg80211_assoc_request *req)
1390
{
1391
struct ieee80211_local *local = wiphy_priv(wiphy);
1392
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1393
1394
switch (ieee80211_get_channel_mode(local, sdata)) {
1395
case CHAN_MODE_HOPPING:
1396
return -EBUSY;
1397
case CHAN_MODE_FIXED:
1398
if (local->oper_channel == req->bss->channel)
1399
break;
1400
return -EBUSY;
1401
case CHAN_MODE_UNDEFINED:
1402
break;
1403
}
1404
1405
return ieee80211_mgd_assoc(IEEE80211_DEV_TO_SUB_IF(dev), req);
1406
}
1407
1408
static int ieee80211_deauth(struct wiphy *wiphy, struct net_device *dev,
1409
struct cfg80211_deauth_request *req,
1410
void *cookie)
1411
{
1412
return ieee80211_mgd_deauth(IEEE80211_DEV_TO_SUB_IF(dev),
1413
req, cookie);
1414
}
1415
1416
static int ieee80211_disassoc(struct wiphy *wiphy, struct net_device *dev,
1417
struct cfg80211_disassoc_request *req,
1418
void *cookie)
1419
{
1420
return ieee80211_mgd_disassoc(IEEE80211_DEV_TO_SUB_IF(dev),
1421
req, cookie);
1422
}
1423
1424
static int ieee80211_join_ibss(struct wiphy *wiphy, struct net_device *dev,
1425
struct cfg80211_ibss_params *params)
1426
{
1427
struct ieee80211_local *local = wiphy_priv(wiphy);
1428
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1429
1430
switch (ieee80211_get_channel_mode(local, sdata)) {
1431
case CHAN_MODE_HOPPING:
1432
return -EBUSY;
1433
case CHAN_MODE_FIXED:
1434
if (!params->channel_fixed)
1435
return -EBUSY;
1436
if (local->oper_channel == params->channel)
1437
break;
1438
return -EBUSY;
1439
case CHAN_MODE_UNDEFINED:
1440
break;
1441
}
1442
1443
return ieee80211_ibss_join(sdata, params);
1444
}
1445
1446
static int ieee80211_leave_ibss(struct wiphy *wiphy, struct net_device *dev)
1447
{
1448
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1449
1450
return ieee80211_ibss_leave(sdata);
1451
}
1452
1453
static int ieee80211_set_wiphy_params(struct wiphy *wiphy, u32 changed)
1454
{
1455
struct ieee80211_local *local = wiphy_priv(wiphy);
1456
int err;
1457
1458
if (changed & WIPHY_PARAM_FRAG_THRESHOLD) {
1459
err = drv_set_frag_threshold(local, wiphy->frag_threshold);
1460
1461
if (err)
1462
return err;
1463
}
1464
1465
if (changed & WIPHY_PARAM_COVERAGE_CLASS) {
1466
err = drv_set_coverage_class(local, wiphy->coverage_class);
1467
1468
if (err)
1469
return err;
1470
}
1471
1472
if (changed & WIPHY_PARAM_RTS_THRESHOLD) {
1473
err = drv_set_rts_threshold(local, wiphy->rts_threshold);
1474
1475
if (err)
1476
return err;
1477
}
1478
1479
if (changed & WIPHY_PARAM_RETRY_SHORT)
1480
local->hw.conf.short_frame_max_tx_count = wiphy->retry_short;
1481
if (changed & WIPHY_PARAM_RETRY_LONG)
1482
local->hw.conf.long_frame_max_tx_count = wiphy->retry_long;
1483
if (changed &
1484
(WIPHY_PARAM_RETRY_SHORT | WIPHY_PARAM_RETRY_LONG))
1485
ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_RETRY_LIMITS);
1486
1487
return 0;
1488
}
1489
1490
static int ieee80211_set_tx_power(struct wiphy *wiphy,
1491
enum nl80211_tx_power_setting type, int mbm)
1492
{
1493
struct ieee80211_local *local = wiphy_priv(wiphy);
1494
struct ieee80211_channel *chan = local->hw.conf.channel;
1495
u32 changes = 0;
1496
1497
switch (type) {
1498
case NL80211_TX_POWER_AUTOMATIC:
1499
local->user_power_level = -1;
1500
break;
1501
case NL80211_TX_POWER_LIMITED:
1502
if (mbm < 0 || (mbm % 100))
1503
return -EOPNOTSUPP;
1504
local->user_power_level = MBM_TO_DBM(mbm);
1505
break;
1506
case NL80211_TX_POWER_FIXED:
1507
if (mbm < 0 || (mbm % 100))
1508
return -EOPNOTSUPP;
1509
/* TODO: move to cfg80211 when it knows the channel */
1510
if (MBM_TO_DBM(mbm) > chan->max_power)
1511
return -EINVAL;
1512
local->user_power_level = MBM_TO_DBM(mbm);
1513
break;
1514
}
1515
1516
ieee80211_hw_config(local, changes);
1517
1518
return 0;
1519
}
1520
1521
static int ieee80211_get_tx_power(struct wiphy *wiphy, int *dbm)
1522
{
1523
struct ieee80211_local *local = wiphy_priv(wiphy);
1524
1525
*dbm = local->hw.conf.power_level;
1526
1527
return 0;
1528
}
1529
1530
static int ieee80211_set_wds_peer(struct wiphy *wiphy, struct net_device *dev,
1531
const u8 *addr)
1532
{
1533
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1534
1535
memcpy(&sdata->u.wds.remote_addr, addr, ETH_ALEN);
1536
1537
return 0;
1538
}
1539
1540
static void ieee80211_rfkill_poll(struct wiphy *wiphy)
1541
{
1542
struct ieee80211_local *local = wiphy_priv(wiphy);
1543
1544
drv_rfkill_poll(local);
1545
}
1546
1547
#ifdef CONFIG_NL80211_TESTMODE
1548
static int ieee80211_testmode_cmd(struct wiphy *wiphy, void *data, int len)
1549
{
1550
struct ieee80211_local *local = wiphy_priv(wiphy);
1551
1552
if (!local->ops->testmode_cmd)
1553
return -EOPNOTSUPP;
1554
1555
return local->ops->testmode_cmd(&local->hw, data, len);
1556
}
1557
#endif
1558
1559
int __ieee80211_request_smps(struct ieee80211_sub_if_data *sdata,
1560
enum ieee80211_smps_mode smps_mode)
1561
{
1562
const u8 *ap;
1563
enum ieee80211_smps_mode old_req;
1564
int err;
1565
1566
lockdep_assert_held(&sdata->u.mgd.mtx);
1567
1568
old_req = sdata->u.mgd.req_smps;
1569
sdata->u.mgd.req_smps = smps_mode;
1570
1571
if (old_req == smps_mode &&
1572
smps_mode != IEEE80211_SMPS_AUTOMATIC)
1573
return 0;
1574
1575
/*
1576
* If not associated, or current association is not an HT
1577
* association, there's no need to send an action frame.
1578
*/
1579
if (!sdata->u.mgd.associated ||
1580
sdata->vif.bss_conf.channel_type == NL80211_CHAN_NO_HT) {
1581
mutex_lock(&sdata->local->iflist_mtx);
1582
ieee80211_recalc_smps(sdata->local);
1583
mutex_unlock(&sdata->local->iflist_mtx);
1584
return 0;
1585
}
1586
1587
ap = sdata->u.mgd.associated->bssid;
1588
1589
if (smps_mode == IEEE80211_SMPS_AUTOMATIC) {
1590
if (sdata->u.mgd.powersave)
1591
smps_mode = IEEE80211_SMPS_DYNAMIC;
1592
else
1593
smps_mode = IEEE80211_SMPS_OFF;
1594
}
1595
1596
/* send SM PS frame to AP */
1597
err = ieee80211_send_smps_action(sdata, smps_mode,
1598
ap, ap);
1599
if (err)
1600
sdata->u.mgd.req_smps = old_req;
1601
1602
return err;
1603
}
1604
1605
static int ieee80211_set_power_mgmt(struct wiphy *wiphy, struct net_device *dev,
1606
bool enabled, int timeout)
1607
{
1608
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1609
struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
1610
1611
if (sdata->vif.type != NL80211_IFTYPE_STATION)
1612
return -EOPNOTSUPP;
1613
1614
if (!(local->hw.flags & IEEE80211_HW_SUPPORTS_PS))
1615
return -EOPNOTSUPP;
1616
1617
if (enabled == sdata->u.mgd.powersave &&
1618
timeout == local->dynamic_ps_forced_timeout)
1619
return 0;
1620
1621
sdata->u.mgd.powersave = enabled;
1622
local->dynamic_ps_forced_timeout = timeout;
1623
1624
/* no change, but if automatic follow powersave */
1625
mutex_lock(&sdata->u.mgd.mtx);
1626
__ieee80211_request_smps(sdata, sdata->u.mgd.req_smps);
1627
mutex_unlock(&sdata->u.mgd.mtx);
1628
1629
if (local->hw.flags & IEEE80211_HW_SUPPORTS_DYNAMIC_PS)
1630
ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS);
1631
1632
ieee80211_recalc_ps(local, -1);
1633
1634
return 0;
1635
}
1636
1637
static int ieee80211_set_cqm_rssi_config(struct wiphy *wiphy,
1638
struct net_device *dev,
1639
s32 rssi_thold, u32 rssi_hyst)
1640
{
1641
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1642
struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
1643
struct ieee80211_vif *vif = &sdata->vif;
1644
struct ieee80211_bss_conf *bss_conf = &vif->bss_conf;
1645
1646
if (rssi_thold == bss_conf->cqm_rssi_thold &&
1647
rssi_hyst == bss_conf->cqm_rssi_hyst)
1648
return 0;
1649
1650
bss_conf->cqm_rssi_thold = rssi_thold;
1651
bss_conf->cqm_rssi_hyst = rssi_hyst;
1652
1653
if (!(local->hw.flags & IEEE80211_HW_SUPPORTS_CQM_RSSI)) {
1654
if (sdata->vif.type != NL80211_IFTYPE_STATION)
1655
return -EOPNOTSUPP;
1656
return 0;
1657
}
1658
1659
/* tell the driver upon association, unless already associated */
1660
if (sdata->u.mgd.associated)
1661
ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_CQM);
1662
1663
return 0;
1664
}
1665
1666
static int ieee80211_set_bitrate_mask(struct wiphy *wiphy,
1667
struct net_device *dev,
1668
const u8 *addr,
1669
const struct cfg80211_bitrate_mask *mask)
1670
{
1671
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1672
struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
1673
int i, ret;
1674
1675
if (local->hw.flags & IEEE80211_HW_HAS_RATE_CONTROL) {
1676
ret = drv_set_bitrate_mask(local, sdata, mask);
1677
if (ret)
1678
return ret;
1679
}
1680
1681
for (i = 0; i < IEEE80211_NUM_BANDS; i++)
1682
sdata->rc_rateidx_mask[i] = mask->control[i].legacy;
1683
1684
return 0;
1685
}
1686
1687
static int ieee80211_remain_on_channel_hw(struct ieee80211_local *local,
1688
struct net_device *dev,
1689
struct ieee80211_channel *chan,
1690
enum nl80211_channel_type chantype,
1691
unsigned int duration, u64 *cookie)
1692
{
1693
int ret;
1694
u32 random_cookie;
1695
1696
lockdep_assert_held(&local->mtx);
1697
1698
if (local->hw_roc_cookie)
1699
return -EBUSY;
1700
/* must be nonzero */
1701
random_cookie = random32() | 1;
1702
1703
*cookie = random_cookie;
1704
local->hw_roc_dev = dev;
1705
local->hw_roc_cookie = random_cookie;
1706
local->hw_roc_channel = chan;
1707
local->hw_roc_channel_type = chantype;
1708
local->hw_roc_duration = duration;
1709
ret = drv_remain_on_channel(local, chan, chantype, duration);
1710
if (ret) {
1711
local->hw_roc_channel = NULL;
1712
local->hw_roc_cookie = 0;
1713
}
1714
1715
return ret;
1716
}
1717
1718
static int ieee80211_remain_on_channel(struct wiphy *wiphy,
1719
struct net_device *dev,
1720
struct ieee80211_channel *chan,
1721
enum nl80211_channel_type channel_type,
1722
unsigned int duration,
1723
u64 *cookie)
1724
{
1725
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1726
struct ieee80211_local *local = sdata->local;
1727
1728
if (local->ops->remain_on_channel) {
1729
int ret;
1730
1731
mutex_lock(&local->mtx);
1732
ret = ieee80211_remain_on_channel_hw(local, dev,
1733
chan, channel_type,
1734
duration, cookie);
1735
local->hw_roc_for_tx = false;
1736
mutex_unlock(&local->mtx);
1737
1738
return ret;
1739
}
1740
1741
return ieee80211_wk_remain_on_channel(sdata, chan, channel_type,
1742
duration, cookie);
1743
}
1744
1745
static int ieee80211_cancel_remain_on_channel_hw(struct ieee80211_local *local,
1746
u64 cookie)
1747
{
1748
int ret;
1749
1750
lockdep_assert_held(&local->mtx);
1751
1752
if (local->hw_roc_cookie != cookie)
1753
return -ENOENT;
1754
1755
ret = drv_cancel_remain_on_channel(local);
1756
if (ret)
1757
return ret;
1758
1759
local->hw_roc_cookie = 0;
1760
local->hw_roc_channel = NULL;
1761
1762
ieee80211_recalc_idle(local);
1763
1764
return 0;
1765
}
1766
1767
static int ieee80211_cancel_remain_on_channel(struct wiphy *wiphy,
1768
struct net_device *dev,
1769
u64 cookie)
1770
{
1771
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1772
struct ieee80211_local *local = sdata->local;
1773
1774
if (local->ops->cancel_remain_on_channel) {
1775
int ret;
1776
1777
mutex_lock(&local->mtx);
1778
ret = ieee80211_cancel_remain_on_channel_hw(local, cookie);
1779
mutex_unlock(&local->mtx);
1780
1781
return ret;
1782
}
1783
1784
return ieee80211_wk_cancel_remain_on_channel(sdata, cookie);
1785
}
1786
1787
static enum work_done_result
1788
ieee80211_offchan_tx_done(struct ieee80211_work *wk, struct sk_buff *skb)
1789
{
1790
/*
1791
* Use the data embedded in the work struct for reporting
1792
* here so if the driver mangled the SKB before dropping
1793
* it (which is the only way we really should get here)
1794
* then we don't report mangled data.
1795
*
1796
* If there was no wait time, then by the time we get here
1797
* the driver will likely not have reported the status yet,
1798
* so in that case userspace will have to deal with it.
1799
*/
1800
1801
if (wk->offchan_tx.wait && wk->offchan_tx.frame)
1802
cfg80211_mgmt_tx_status(wk->sdata->dev,
1803
(unsigned long) wk->offchan_tx.frame,
1804
wk->ie, wk->ie_len, false, GFP_KERNEL);
1805
1806
return WORK_DONE_DESTROY;
1807
}
1808
1809
static int ieee80211_mgmt_tx(struct wiphy *wiphy, struct net_device *dev,
1810
struct ieee80211_channel *chan, bool offchan,
1811
enum nl80211_channel_type channel_type,
1812
bool channel_type_valid, unsigned int wait,
1813
const u8 *buf, size_t len, u64 *cookie)
1814
{
1815
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1816
struct ieee80211_local *local = sdata->local;
1817
struct sk_buff *skb;
1818
struct sta_info *sta;
1819
struct ieee80211_work *wk;
1820
const struct ieee80211_mgmt *mgmt = (void *)buf;
1821
u32 flags = IEEE80211_TX_INTFL_NL80211_FRAME_TX |
1822
IEEE80211_TX_CTL_REQ_TX_STATUS;
1823
bool is_offchan = false;
1824
1825
/* Check that we are on the requested channel for transmission */
1826
if (chan != local->tmp_channel &&
1827
chan != local->oper_channel)
1828
is_offchan = true;
1829
if (channel_type_valid &&
1830
(channel_type != local->tmp_channel_type &&
1831
channel_type != local->_oper_channel_type))
1832
is_offchan = true;
1833
1834
if (chan == local->hw_roc_channel) {
1835
/* TODO: check channel type? */
1836
is_offchan = false;
1837
flags |= IEEE80211_TX_CTL_TX_OFFCHAN;
1838
}
1839
1840
if (is_offchan && !offchan)
1841
return -EBUSY;
1842
1843
switch (sdata->vif.type) {
1844
case NL80211_IFTYPE_ADHOC:
1845
case NL80211_IFTYPE_AP:
1846
case NL80211_IFTYPE_AP_VLAN:
1847
case NL80211_IFTYPE_P2P_GO:
1848
case NL80211_IFTYPE_MESH_POINT:
1849
if (!ieee80211_is_action(mgmt->frame_control) ||
1850
mgmt->u.action.category == WLAN_CATEGORY_PUBLIC)
1851
break;
1852
rcu_read_lock();
1853
sta = sta_info_get(sdata, mgmt->da);
1854
rcu_read_unlock();
1855
if (!sta)
1856
return -ENOLINK;
1857
break;
1858
case NL80211_IFTYPE_STATION:
1859
case NL80211_IFTYPE_P2P_CLIENT:
1860
break;
1861
default:
1862
return -EOPNOTSUPP;
1863
}
1864
1865
skb = dev_alloc_skb(local->hw.extra_tx_headroom + len);
1866
if (!skb)
1867
return -ENOMEM;
1868
skb_reserve(skb, local->hw.extra_tx_headroom);
1869
1870
memcpy(skb_put(skb, len), buf, len);
1871
1872
IEEE80211_SKB_CB(skb)->flags = flags;
1873
1874
skb->dev = sdata->dev;
1875
1876
*cookie = (unsigned long) skb;
1877
1878
if (is_offchan && local->ops->offchannel_tx) {
1879
int ret;
1880
1881
IEEE80211_SKB_CB(skb)->band = chan->band;
1882
1883
mutex_lock(&local->mtx);
1884
1885
if (local->hw_offchan_tx_cookie) {
1886
mutex_unlock(&local->mtx);
1887
return -EBUSY;
1888
}
1889
1890
/* TODO: bitrate control, TX processing? */
1891
ret = drv_offchannel_tx(local, skb, chan, channel_type, wait);
1892
1893
if (ret == 0)
1894
local->hw_offchan_tx_cookie = *cookie;
1895
mutex_unlock(&local->mtx);
1896
1897
/*
1898
* Allow driver to return 1 to indicate it wants to have the
1899
* frame transmitted with a remain_on_channel + regular TX.
1900
*/
1901
if (ret != 1)
1902
return ret;
1903
}
1904
1905
if (is_offchan && local->ops->remain_on_channel) {
1906
unsigned int duration;
1907
int ret;
1908
1909
mutex_lock(&local->mtx);
1910
/*
1911
* If the duration is zero, then the driver
1912
* wouldn't actually do anything. Set it to
1913
* 100 for now.
1914
*
1915
* TODO: cancel the off-channel operation
1916
* when we get the SKB's TX status and
1917
* the wait time was zero before.
1918
*/
1919
duration = 100;
1920
if (wait)
1921
duration = wait;
1922
ret = ieee80211_remain_on_channel_hw(local, dev, chan,
1923
channel_type,
1924
duration, cookie);
1925
if (ret) {
1926
kfree_skb(skb);
1927
mutex_unlock(&local->mtx);
1928
return ret;
1929
}
1930
1931
local->hw_roc_for_tx = true;
1932
local->hw_roc_duration = wait;
1933
1934
/*
1935
* queue up frame for transmission after
1936
* ieee80211_ready_on_channel call
1937
*/
1938
1939
/* modify cookie to prevent API mismatches */
1940
*cookie ^= 2;
1941
IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_CTL_TX_OFFCHAN;
1942
local->hw_roc_skb = skb;
1943
local->hw_roc_skb_for_status = skb;
1944
mutex_unlock(&local->mtx);
1945
1946
return 0;
1947
}
1948
1949
/*
1950
* Can transmit right away if the channel was the
1951
* right one and there's no wait involved... If a
1952
* wait is involved, we might otherwise not be on
1953
* the right channel for long enough!
1954
*/
1955
if (!is_offchan && !wait && !sdata->vif.bss_conf.idle) {
1956
ieee80211_tx_skb(sdata, skb);
1957
return 0;
1958
}
1959
1960
wk = kzalloc(sizeof(*wk) + len, GFP_KERNEL);
1961
if (!wk) {
1962
kfree_skb(skb);
1963
return -ENOMEM;
1964
}
1965
1966
wk->type = IEEE80211_WORK_OFFCHANNEL_TX;
1967
wk->chan = chan;
1968
wk->chan_type = channel_type;
1969
wk->sdata = sdata;
1970
wk->done = ieee80211_offchan_tx_done;
1971
wk->offchan_tx.frame = skb;
1972
wk->offchan_tx.wait = wait;
1973
wk->ie_len = len;
1974
memcpy(wk->ie, buf, len);
1975
1976
ieee80211_add_work(wk);
1977
return 0;
1978
}
1979
1980
static int ieee80211_mgmt_tx_cancel_wait(struct wiphy *wiphy,
1981
struct net_device *dev,
1982
u64 cookie)
1983
{
1984
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
1985
struct ieee80211_local *local = sdata->local;
1986
struct ieee80211_work *wk;
1987
int ret = -ENOENT;
1988
1989
mutex_lock(&local->mtx);
1990
1991
if (local->ops->offchannel_tx_cancel_wait &&
1992
local->hw_offchan_tx_cookie == cookie) {
1993
ret = drv_offchannel_tx_cancel_wait(local);
1994
1995
if (!ret)
1996
local->hw_offchan_tx_cookie = 0;
1997
1998
mutex_unlock(&local->mtx);
1999
2000
return ret;
2001
}
2002
2003
if (local->ops->cancel_remain_on_channel) {
2004
cookie ^= 2;
2005
ret = ieee80211_cancel_remain_on_channel_hw(local, cookie);
2006
2007
if (ret == 0) {
2008
kfree_skb(local->hw_roc_skb);
2009
local->hw_roc_skb = NULL;
2010
local->hw_roc_skb_for_status = NULL;
2011
}
2012
2013
mutex_unlock(&local->mtx);
2014
2015
return ret;
2016
}
2017
2018
list_for_each_entry(wk, &local->work_list, list) {
2019
if (wk->sdata != sdata)
2020
continue;
2021
2022
if (wk->type != IEEE80211_WORK_OFFCHANNEL_TX)
2023
continue;
2024
2025
if (cookie != (unsigned long) wk->offchan_tx.frame)
2026
continue;
2027
2028
wk->timeout = jiffies;
2029
2030
ieee80211_queue_work(&local->hw, &local->work_work);
2031
ret = 0;
2032
break;
2033
}
2034
mutex_unlock(&local->mtx);
2035
2036
return ret;
2037
}
2038
2039
static void ieee80211_mgmt_frame_register(struct wiphy *wiphy,
2040
struct net_device *dev,
2041
u16 frame_type, bool reg)
2042
{
2043
struct ieee80211_local *local = wiphy_priv(wiphy);
2044
2045
if (frame_type != (IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_PROBE_REQ))
2046
return;
2047
2048
if (reg)
2049
local->probe_req_reg++;
2050
else
2051
local->probe_req_reg--;
2052
2053
ieee80211_queue_work(&local->hw, &local->reconfig_filter);
2054
}
2055
2056
static int ieee80211_set_antenna(struct wiphy *wiphy, u32 tx_ant, u32 rx_ant)
2057
{
2058
struct ieee80211_local *local = wiphy_priv(wiphy);
2059
2060
if (local->started)
2061
return -EOPNOTSUPP;
2062
2063
return drv_set_antenna(local, tx_ant, rx_ant);
2064
}
2065
2066
static int ieee80211_get_antenna(struct wiphy *wiphy, u32 *tx_ant, u32 *rx_ant)
2067
{
2068
struct ieee80211_local *local = wiphy_priv(wiphy);
2069
2070
return drv_get_antenna(local, tx_ant, rx_ant);
2071
}
2072
2073
static int ieee80211_set_ringparam(struct wiphy *wiphy, u32 tx, u32 rx)
2074
{
2075
struct ieee80211_local *local = wiphy_priv(wiphy);
2076
2077
return drv_set_ringparam(local, tx, rx);
2078
}
2079
2080
static void ieee80211_get_ringparam(struct wiphy *wiphy,
2081
u32 *tx, u32 *tx_max, u32 *rx, u32 *rx_max)
2082
{
2083
struct ieee80211_local *local = wiphy_priv(wiphy);
2084
2085
drv_get_ringparam(local, tx, tx_max, rx, rx_max);
2086
}
2087
2088
struct cfg80211_ops mac80211_config_ops = {
2089
.add_virtual_intf = ieee80211_add_iface,
2090
.del_virtual_intf = ieee80211_del_iface,
2091
.change_virtual_intf = ieee80211_change_iface,
2092
.add_key = ieee80211_add_key,
2093
.del_key = ieee80211_del_key,
2094
.get_key = ieee80211_get_key,
2095
.set_default_key = ieee80211_config_default_key,
2096
.set_default_mgmt_key = ieee80211_config_default_mgmt_key,
2097
.add_beacon = ieee80211_add_beacon,
2098
.set_beacon = ieee80211_set_beacon,
2099
.del_beacon = ieee80211_del_beacon,
2100
.add_station = ieee80211_add_station,
2101
.del_station = ieee80211_del_station,
2102
.change_station = ieee80211_change_station,
2103
.get_station = ieee80211_get_station,
2104
.dump_station = ieee80211_dump_station,
2105
.dump_survey = ieee80211_dump_survey,
2106
#ifdef CONFIG_MAC80211_MESH
2107
.add_mpath = ieee80211_add_mpath,
2108
.del_mpath = ieee80211_del_mpath,
2109
.change_mpath = ieee80211_change_mpath,
2110
.get_mpath = ieee80211_get_mpath,
2111
.dump_mpath = ieee80211_dump_mpath,
2112
.update_mesh_config = ieee80211_update_mesh_config,
2113
.get_mesh_config = ieee80211_get_mesh_config,
2114
.join_mesh = ieee80211_join_mesh,
2115
.leave_mesh = ieee80211_leave_mesh,
2116
#endif
2117
.change_bss = ieee80211_change_bss,
2118
.set_txq_params = ieee80211_set_txq_params,
2119
.set_channel = ieee80211_set_channel,
2120
.suspend = ieee80211_suspend,
2121
.resume = ieee80211_resume,
2122
.scan = ieee80211_scan,
2123
.sched_scan_start = ieee80211_sched_scan_start,
2124
.sched_scan_stop = ieee80211_sched_scan_stop,
2125
.auth = ieee80211_auth,
2126
.assoc = ieee80211_assoc,
2127
.deauth = ieee80211_deauth,
2128
.disassoc = ieee80211_disassoc,
2129
.join_ibss = ieee80211_join_ibss,
2130
.leave_ibss = ieee80211_leave_ibss,
2131
.set_wiphy_params = ieee80211_set_wiphy_params,
2132
.set_tx_power = ieee80211_set_tx_power,
2133
.get_tx_power = ieee80211_get_tx_power,
2134
.set_wds_peer = ieee80211_set_wds_peer,
2135
.rfkill_poll = ieee80211_rfkill_poll,
2136
CFG80211_TESTMODE_CMD(ieee80211_testmode_cmd)
2137
.set_power_mgmt = ieee80211_set_power_mgmt,
2138
.set_bitrate_mask = ieee80211_set_bitrate_mask,
2139
.remain_on_channel = ieee80211_remain_on_channel,
2140
.cancel_remain_on_channel = ieee80211_cancel_remain_on_channel,
2141
.mgmt_tx = ieee80211_mgmt_tx,
2142
.mgmt_tx_cancel_wait = ieee80211_mgmt_tx_cancel_wait,
2143
.set_cqm_rssi_config = ieee80211_set_cqm_rssi_config,
2144
.mgmt_frame_register = ieee80211_mgmt_frame_register,
2145
.set_antenna = ieee80211_set_antenna,
2146
.get_antenna = ieee80211_get_antenna,
2147
.set_ringparam = ieee80211_set_ringparam,
2148
.get_ringparam = ieee80211_get_ringparam,
2149
};
2150
2151