300-pending_work.patch 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764
  1. --- a/net/mac80211/agg-rx.c
  2. +++ b/net/mac80211/agg-rx.c
  3. @@ -204,6 +204,8 @@ static void ieee80211_send_addba_resp(st
  4. memcpy(mgmt->bssid, sdata->u.mgd.bssid, ETH_ALEN);
  5. else if (sdata->vif.type == NL80211_IFTYPE_ADHOC)
  6. memcpy(mgmt->bssid, sdata->u.ibss.bssid, ETH_ALEN);
  7. + else if (sdata->vif.type == NL80211_IFTYPE_WDS)
  8. + memcpy(mgmt->bssid, da, ETH_ALEN);
  9. mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
  10. IEEE80211_STYPE_ACTION);
  11. --- a/net/mac80211/agg-tx.c
  12. +++ b/net/mac80211/agg-tx.c
  13. @@ -81,7 +81,8 @@ static void ieee80211_send_addba_request
  14. memcpy(mgmt->sa, sdata->vif.addr, ETH_ALEN);
  15. if (sdata->vif.type == NL80211_IFTYPE_AP ||
  16. sdata->vif.type == NL80211_IFTYPE_AP_VLAN ||
  17. - sdata->vif.type == NL80211_IFTYPE_MESH_POINT)
  18. + sdata->vif.type == NL80211_IFTYPE_MESH_POINT ||
  19. + sdata->vif.type == NL80211_IFTYPE_WDS)
  20. memcpy(mgmt->bssid, sdata->vif.addr, ETH_ALEN);
  21. else if (sdata->vif.type == NL80211_IFTYPE_STATION)
  22. memcpy(mgmt->bssid, sdata->u.mgd.bssid, ETH_ALEN);
  23. @@ -527,6 +528,7 @@ int ieee80211_start_tx_ba_session(struct
  24. sdata->vif.type != NL80211_IFTYPE_MESH_POINT &&
  25. sdata->vif.type != NL80211_IFTYPE_AP_VLAN &&
  26. sdata->vif.type != NL80211_IFTYPE_AP &&
  27. + sdata->vif.type != NL80211_IFTYPE_WDS &&
  28. sdata->vif.type != NL80211_IFTYPE_ADHOC)
  29. return -EINVAL;
  30. --- a/net/mac80211/debugfs_sta.c
  31. +++ b/net/mac80211/debugfs_sta.c
  32. @@ -66,11 +66,11 @@ static ssize_t sta_flags_read(struct fil
  33. test_sta_flag(sta, WLAN_STA_##flg) ? #flg "\n" : ""
  34. int res = scnprintf(buf, sizeof(buf),
  35. - "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
  36. + "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
  37. TEST(AUTH), TEST(ASSOC), TEST(PS_STA),
  38. TEST(PS_DRIVER), TEST(AUTHORIZED),
  39. TEST(SHORT_PREAMBLE),
  40. - TEST(WME), TEST(WDS), TEST(CLEAR_PS_FILT),
  41. + TEST(WME), TEST(CLEAR_PS_FILT),
  42. TEST(MFP), TEST(BLOCK_BA), TEST(PSPOLL),
  43. TEST(UAPSD), TEST(SP), TEST(TDLS_PEER),
  44. TEST(TDLS_PEER_AUTH), TEST(4ADDR_EVENT),
  45. --- a/net/mac80211/iface.c
  46. +++ b/net/mac80211/iface.c
  47. @@ -463,7 +463,6 @@ int ieee80211_do_open(struct wireless_de
  48. struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
  49. struct net_device *dev = wdev->netdev;
  50. struct ieee80211_local *local = sdata->local;
  51. - struct sta_info *sta;
  52. u32 changed = 0;
  53. int res;
  54. u32 hw_reconf_flags = 0;
  55. @@ -629,30 +628,8 @@ int ieee80211_do_open(struct wireless_de
  56. set_bit(SDATA_STATE_RUNNING, &sdata->state);
  57. - if (sdata->vif.type == NL80211_IFTYPE_WDS) {
  58. - /* Create STA entry for the WDS peer */
  59. - sta = sta_info_alloc(sdata, sdata->u.wds.remote_addr,
  60. - GFP_KERNEL);
  61. - if (!sta) {
  62. - res = -ENOMEM;
  63. - goto err_del_interface;
  64. - }
  65. -
  66. - sta_info_pre_move_state(sta, IEEE80211_STA_AUTH);
  67. - sta_info_pre_move_state(sta, IEEE80211_STA_ASSOC);
  68. - sta_info_pre_move_state(sta, IEEE80211_STA_AUTHORIZED);
  69. -
  70. - res = sta_info_insert(sta);
  71. - if (res) {
  72. - /* STA has been freed */
  73. - goto err_del_interface;
  74. - }
  75. -
  76. - rate_control_rate_init(sta);
  77. - netif_carrier_on(dev);
  78. - } else if (sdata->vif.type == NL80211_IFTYPE_P2P_DEVICE) {
  79. + if (sdata->vif.type == NL80211_IFTYPE_P2P_DEVICE)
  80. rcu_assign_pointer(local->p2p_sdata, sdata);
  81. - }
  82. /*
  83. * set_multicast_list will be invoked by the networking core
  84. @@ -1116,6 +1093,74 @@ static void ieee80211_if_setup(struct ne
  85. dev->destructor = free_netdev;
  86. }
  87. +static void ieee80211_wds_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata,
  88. + struct sk_buff *skb)
  89. +{
  90. + struct ieee80211_local *local = sdata->local;
  91. + struct ieee80211_rx_status *rx_status;
  92. + struct ieee802_11_elems elems;
  93. + struct ieee80211_mgmt *mgmt;
  94. + struct sta_info *sta;
  95. + size_t baselen;
  96. + u32 rates = 0;
  97. + u16 stype;
  98. + bool new = false;
  99. + enum ieee80211_band band;
  100. + struct ieee80211_supported_band *sband;
  101. +
  102. + rx_status = IEEE80211_SKB_RXCB(skb);
  103. + band = rx_status->band;
  104. + sband = local->hw.wiphy->bands[band];
  105. + mgmt = (struct ieee80211_mgmt *) skb->data;
  106. + stype = le16_to_cpu(mgmt->frame_control) & IEEE80211_FCTL_STYPE;
  107. +
  108. + if (stype != IEEE80211_STYPE_BEACON)
  109. + return;
  110. +
  111. + baselen = (u8 *) mgmt->u.probe_resp.variable - (u8 *) mgmt;
  112. + if (baselen > skb->len)
  113. + return;
  114. +
  115. + ieee802_11_parse_elems(mgmt->u.probe_resp.variable,
  116. + skb->len - baselen, false, &elems);
  117. +
  118. + rates = ieee80211_sta_get_rates(local, &elems, band, NULL);
  119. +
  120. + rcu_read_lock();
  121. +
  122. + sta = sta_info_get(sdata, sdata->u.wds.remote_addr);
  123. +
  124. + if (!sta) {
  125. + rcu_read_unlock();
  126. + sta = sta_info_alloc(sdata, sdata->u.wds.remote_addr,
  127. + GFP_KERNEL);
  128. + if (!sta)
  129. + return;
  130. +
  131. + new = true;
  132. + }
  133. +
  134. + sta->last_rx = jiffies;
  135. + sta->sta.supp_rates[band] = rates;
  136. +
  137. + if (elems.ht_cap_elem)
  138. + ieee80211_ht_cap_ie_to_sta_ht_cap(sdata, sband,
  139. + elems.ht_cap_elem, sta);
  140. +
  141. + if (elems.wmm_param)
  142. + set_sta_flag(sta, WLAN_STA_WME);
  143. +
  144. + if (new) {
  145. + sta_info_pre_move_state(sta, IEEE80211_STA_AUTH);
  146. + sta_info_pre_move_state(sta, IEEE80211_STA_ASSOC);
  147. + sta_info_pre_move_state(sta, IEEE80211_STA_AUTHORIZED);
  148. + rate_control_rate_init(sta);
  149. + sta_info_insert_rcu(sta);
  150. + }
  151. +
  152. + rcu_read_unlock();
  153. +}
  154. +
  155. static void ieee80211_iface_work(struct work_struct *work)
  156. {
  157. struct ieee80211_sub_if_data *sdata =
  158. @@ -1220,6 +1265,9 @@ static void ieee80211_iface_work(struct
  159. break;
  160. ieee80211_mesh_rx_queued_mgmt(sdata, skb);
  161. break;
  162. + case NL80211_IFTYPE_WDS:
  163. + ieee80211_wds_rx_queued_mgmt(sdata, skb);
  164. + break;
  165. default:
  166. WARN(1, "frame for unexpected interface type");
  167. break;
  168. --- a/net/mac80211/rc80211_minstrel_ht.c
  169. +++ b/net/mac80211/rc80211_minstrel_ht.c
  170. @@ -804,10 +804,18 @@ minstrel_ht_get_rate(void *priv, struct
  171. sample_group = &minstrel_mcs_groups[sample_idx / MCS_GROUP_RATES];
  172. info->flags |= IEEE80211_TX_CTL_RATE_CTRL_PROBE;
  173. + rate->count = 1;
  174. +
  175. + if (sample_idx / MCS_GROUP_RATES == MINSTREL_CCK_GROUP) {
  176. + int idx = sample_idx % ARRAY_SIZE(mp->cck_rates);
  177. + rate->idx = mp->cck_rates[idx];
  178. + rate->flags = 0;
  179. + return;
  180. + }
  181. +
  182. rate->idx = sample_idx % MCS_GROUP_RATES +
  183. (sample_group->streams - 1) * MCS_GROUP_RATES;
  184. rate->flags = IEEE80211_TX_RC_MCS | sample_group->flags;
  185. - rate->count = 1;
  186. }
  187. static void
  188. --- a/net/mac80211/rx.c
  189. +++ b/net/mac80211/rx.c
  190. @@ -2369,6 +2369,7 @@ ieee80211_rx_h_action(struct ieee80211_r
  191. sdata->vif.type != NL80211_IFTYPE_MESH_POINT &&
  192. sdata->vif.type != NL80211_IFTYPE_AP_VLAN &&
  193. sdata->vif.type != NL80211_IFTYPE_AP &&
  194. + sdata->vif.type != NL80211_IFTYPE_WDS &&
  195. sdata->vif.type != NL80211_IFTYPE_ADHOC)
  196. break;
  197. @@ -2720,14 +2721,15 @@ ieee80211_rx_h_mgmt(struct ieee80211_rx_
  198. if (!ieee80211_vif_is_mesh(&sdata->vif) &&
  199. sdata->vif.type != NL80211_IFTYPE_ADHOC &&
  200. - sdata->vif.type != NL80211_IFTYPE_STATION)
  201. + sdata->vif.type != NL80211_IFTYPE_STATION &&
  202. + sdata->vif.type != NL80211_IFTYPE_WDS)
  203. return RX_DROP_MONITOR;
  204. switch (stype) {
  205. case cpu_to_le16(IEEE80211_STYPE_AUTH):
  206. case cpu_to_le16(IEEE80211_STYPE_BEACON):
  207. case cpu_to_le16(IEEE80211_STYPE_PROBE_RESP):
  208. - /* process for all: mesh, mlme, ibss */
  209. + /* process for all: mesh, mlme, ibss, wds */
  210. break;
  211. case cpu_to_le16(IEEE80211_STYPE_ASSOC_RESP):
  212. case cpu_to_le16(IEEE80211_STYPE_REASSOC_RESP):
  213. @@ -3059,10 +3061,16 @@ static int prepare_for_handlers(struct i
  214. }
  215. break;
  216. case NL80211_IFTYPE_WDS:
  217. - if (bssid || !ieee80211_is_data(hdr->frame_control))
  218. - return 0;
  219. if (!ether_addr_equal(sdata->u.wds.remote_addr, hdr->addr2))
  220. return 0;
  221. +
  222. + if (ieee80211_is_data(hdr->frame_control) ||
  223. + ieee80211_is_action(hdr->frame_control)) {
  224. + if (compare_ether_addr(sdata->vif.addr, hdr->addr1))
  225. + return 0;
  226. + } else if (!ieee80211_is_beacon(hdr->frame_control))
  227. + return 0;
  228. +
  229. break;
  230. case NL80211_IFTYPE_P2P_DEVICE:
  231. if (!ieee80211_is_public_action(hdr, skb->len) &&
  232. --- a/net/mac80211/sta_info.h
  233. +++ b/net/mac80211/sta_info.h
  234. @@ -32,7 +32,6 @@
  235. * @WLAN_STA_SHORT_PREAMBLE: Station is capable of receiving short-preamble
  236. * frames.
  237. * @WLAN_STA_WME: Station is a QoS-STA.
  238. - * @WLAN_STA_WDS: Station is one of our WDS peers.
  239. * @WLAN_STA_CLEAR_PS_FILT: Clear PS filter in hardware (using the
  240. * IEEE80211_TX_CTL_CLEAR_PS_FILT control flag) when the next
  241. * frame to this station is transmitted.
  242. @@ -66,7 +65,6 @@ enum ieee80211_sta_info_flags {
  243. WLAN_STA_AUTHORIZED,
  244. WLAN_STA_SHORT_PREAMBLE,
  245. WLAN_STA_WME,
  246. - WLAN_STA_WDS,
  247. WLAN_STA_CLEAR_PS_FILT,
  248. WLAN_STA_MFP,
  249. WLAN_STA_BLOCK_BA,
  250. --- a/drivers/net/wireless/ath/ath9k/xmit.c
  251. +++ b/drivers/net/wireless/ath/ath9k/xmit.c
  252. @@ -146,6 +146,28 @@ static void ath_set_rates(struct ieee802
  253. ARRAY_SIZE(bf->rates));
  254. }
  255. +static void ath_txq_skb_done(struct ath_softc *sc, struct ath_txq *txq,
  256. + struct sk_buff *skb)
  257. +{
  258. + int q;
  259. +
  260. + q = skb_get_queue_mapping(skb);
  261. + if (txq == sc->tx.uapsdq)
  262. + txq = sc->tx.txq_map[q];
  263. +
  264. + if (txq != sc->tx.txq_map[q])
  265. + return;
  266. +
  267. + if (WARN_ON(--txq->pending_frames < 0))
  268. + txq->pending_frames = 0;
  269. +
  270. + if (txq->stopped &&
  271. + txq->pending_frames < sc->tx.txq_max_pending[q]) {
  272. + ieee80211_wake_queue(sc->hw, q);
  273. + txq->stopped = false;
  274. + }
  275. +}
  276. +
  277. static void ath_tx_flush_tid(struct ath_softc *sc, struct ath_atx_tid *tid)
  278. {
  279. struct ath_txq *txq = tid->ac->txq;
  280. @@ -167,6 +189,7 @@ static void ath_tx_flush_tid(struct ath_
  281. if (!bf) {
  282. bf = ath_tx_setup_buffer(sc, txq, tid, skb);
  283. if (!bf) {
  284. + ath_txq_skb_done(sc, txq, skb);
  285. ieee80211_free_txskb(sc->hw, skb);
  286. continue;
  287. }
  288. @@ -811,6 +834,7 @@ ath_tx_get_tid_subframe(struct ath_softc
  289. if (!bf) {
  290. __skb_unlink(skb, &tid->buf_q);
  291. + ath_txq_skb_done(sc, txq, skb);
  292. ieee80211_free_txskb(sc->hw, skb);
  293. continue;
  294. }
  295. @@ -1824,6 +1848,7 @@ static void ath_tx_send_ampdu(struct ath
  296. bf = ath_tx_setup_buffer(sc, txq, tid, skb);
  297. if (!bf) {
  298. + ath_txq_skb_done(sc, txq, skb);
  299. ieee80211_free_txskb(sc->hw, skb);
  300. return;
  301. }
  302. @@ -2090,6 +2115,7 @@ int ath_tx_start(struct ieee80211_hw *hw
  303. bf = ath_tx_setup_buffer(sc, txq, tid, skb);
  304. if (!bf) {
  305. + ath_txq_skb_done(sc, txq, skb);
  306. if (txctl->paprd)
  307. dev_kfree_skb_any(skb);
  308. else
  309. @@ -2189,7 +2215,7 @@ static void ath_tx_complete(struct ath_s
  310. struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);
  311. struct ath_common *common = ath9k_hw_common(sc->sc_ah);
  312. struct ieee80211_hdr * hdr = (struct ieee80211_hdr *)skb->data;
  313. - int q, padpos, padsize;
  314. + int padpos, padsize;
  315. unsigned long flags;
  316. ath_dbg(common, XMIT, "TX complete: skb: %p\n", skb);
  317. @@ -2225,21 +2251,7 @@ static void ath_tx_complete(struct ath_s
  318. spin_unlock_irqrestore(&sc->sc_pm_lock, flags);
  319. __skb_queue_tail(&txq->complete_q, skb);
  320. -
  321. - q = skb_get_queue_mapping(skb);
  322. - if (txq == sc->tx.uapsdq)
  323. - txq = sc->tx.txq_map[q];
  324. -
  325. - if (txq == sc->tx.txq_map[q]) {
  326. - if (WARN_ON(--txq->pending_frames < 0))
  327. - txq->pending_frames = 0;
  328. -
  329. - if (txq->stopped &&
  330. - txq->pending_frames < sc->tx.txq_max_pending[q]) {
  331. - ieee80211_wake_queue(sc->hw, q);
  332. - txq->stopped = false;
  333. - }
  334. - }
  335. + ath_txq_skb_done(sc, txq, skb);
  336. }
  337. static void ath_tx_complete_buf(struct ath_softc *sc, struct ath_buf *bf,
  338. --- a/drivers/net/wireless/ath/ath9k/main.c
  339. +++ b/drivers/net/wireless/ath/ath9k/main.c
  340. @@ -2094,7 +2094,7 @@ static void ath9k_wow_add_pattern(struct
  341. {
  342. struct ath_hw *ah = sc->sc_ah;
  343. struct ath9k_wow_pattern *wow_pattern = NULL;
  344. - struct cfg80211_wowlan_trig_pkt_pattern *patterns = wowlan->patterns;
  345. + struct cfg80211_pkt_pattern *patterns = wowlan->patterns;
  346. int mask_len;
  347. s8 i = 0;
  348. --- a/drivers/net/wireless/mwifiex/cfg80211.c
  349. +++ b/drivers/net/wireless/mwifiex/cfg80211.c
  350. @@ -2298,8 +2298,7 @@ EXPORT_SYMBOL_GPL(mwifiex_del_virtual_in
  351. #ifdef CONFIG_PM
  352. static bool
  353. -mwifiex_is_pattern_supported(struct cfg80211_wowlan_trig_pkt_pattern *pat,
  354. - s8 *byte_seq)
  355. +mwifiex_is_pattern_supported(struct cfg80211_pkt_pattern *pat, s8 *byte_seq)
  356. {
  357. int j, k, valid_byte_cnt = 0;
  358. bool dont_care_byte = false;
  359. --- a/drivers/net/wireless/ti/wlcore/main.c
  360. +++ b/drivers/net/wireless/ti/wlcore/main.c
  361. @@ -1315,7 +1315,7 @@ static struct sk_buff *wl12xx_alloc_dumm
  362. #ifdef CONFIG_PM
  363. static int
  364. -wl1271_validate_wowlan_pattern(struct cfg80211_wowlan_trig_pkt_pattern *p)
  365. +wl1271_validate_wowlan_pattern(struct cfg80211_pkt_pattern *p)
  366. {
  367. int num_fields = 0, in_field = 0, fields_size = 0;
  368. int i, pattern_len = 0;
  369. @@ -1458,9 +1458,9 @@ void wl1271_rx_filter_flatten_fields(str
  370. * Allocates an RX filter returned through f
  371. * which needs to be freed using rx_filter_free()
  372. */
  373. -static int wl1271_convert_wowlan_pattern_to_rx_filter(
  374. - struct cfg80211_wowlan_trig_pkt_pattern *p,
  375. - struct wl12xx_rx_filter **f)
  376. +static int
  377. +wl1271_convert_wowlan_pattern_to_rx_filter(struct cfg80211_pkt_pattern *p,
  378. + struct wl12xx_rx_filter **f)
  379. {
  380. int i, j, ret = 0;
  381. struct wl12xx_rx_filter *filter;
  382. @@ -1562,7 +1562,7 @@ static int wl1271_configure_wowlan(struc
  383. /* Translate WoWLAN patterns into filters */
  384. for (i = 0; i < wow->n_patterns; i++) {
  385. - struct cfg80211_wowlan_trig_pkt_pattern *p;
  386. + struct cfg80211_pkt_pattern *p;
  387. struct wl12xx_rx_filter *filter = NULL;
  388. p = &wow->patterns[i];
  389. --- a/include/net/cfg80211.h
  390. +++ b/include/net/cfg80211.h
  391. @@ -1698,7 +1698,7 @@ struct cfg80211_pmksa {
  392. };
  393. /**
  394. - * struct cfg80211_wowlan_trig_pkt_pattern - packet pattern
  395. + * struct cfg80211_pkt_pattern - packet pattern
  396. * @mask: bitmask where to match pattern and where to ignore bytes,
  397. * one bit per byte, in same format as nl80211
  398. * @pattern: bytes to match where bitmask is 1
  399. @@ -1708,7 +1708,7 @@ struct cfg80211_pmksa {
  400. * Internal note: @mask and @pattern are allocated in one chunk of
  401. * memory, free @mask only!
  402. */
  403. -struct cfg80211_wowlan_trig_pkt_pattern {
  404. +struct cfg80211_pkt_pattern {
  405. u8 *mask, *pattern;
  406. int pattern_len;
  407. int pkt_offset;
  408. @@ -1770,7 +1770,7 @@ struct cfg80211_wowlan {
  409. bool any, disconnect, magic_pkt, gtk_rekey_failure,
  410. eap_identity_req, four_way_handshake,
  411. rfkill_release;
  412. - struct cfg80211_wowlan_trig_pkt_pattern *patterns;
  413. + struct cfg80211_pkt_pattern *patterns;
  414. struct cfg80211_wowlan_tcp *tcp;
  415. int n_patterns;
  416. };
  417. --- a/include/uapi/linux/nl80211.h
  418. +++ b/include/uapi/linux/nl80211.h
  419. @@ -3060,11 +3060,11 @@ enum nl80211_tx_power_setting {
  420. };
  421. /**
  422. - * enum nl80211_wowlan_packet_pattern_attr - WoWLAN packet pattern attribute
  423. - * @__NL80211_WOWLAN_PKTPAT_INVALID: invalid number for nested attribute
  424. - * @NL80211_WOWLAN_PKTPAT_PATTERN: the pattern, values where the mask has
  425. + * enum nl80211_packet_pattern_attr - packet pattern attribute
  426. + * @__NL80211_PKTPAT_INVALID: invalid number for nested attribute
  427. + * @NL80211_PKTPAT_PATTERN: the pattern, values where the mask has
  428. * a zero bit are ignored
  429. - * @NL80211_WOWLAN_PKTPAT_MASK: pattern mask, must be long enough to have
  430. + * @NL80211_PKTPAT_MASK: pattern mask, must be long enough to have
  431. * a bit for each byte in the pattern. The lowest-order bit corresponds
  432. * to the first byte of the pattern, but the bytes of the pattern are
  433. * in a little-endian-like format, i.e. the 9th byte of the pattern
  434. @@ -3075,23 +3075,23 @@ enum nl80211_tx_power_setting {
  435. * Note that the pattern matching is done as though frames were not
  436. * 802.11 frames but 802.3 frames, i.e. the frame is fully unpacked
  437. * first (including SNAP header unpacking) and then matched.
  438. - * @NL80211_WOWLAN_PKTPAT_OFFSET: packet offset, pattern is matched after
  439. + * @NL80211_PKTPAT_OFFSET: packet offset, pattern is matched after
  440. * these fixed number of bytes of received packet
  441. - * @NUM_NL80211_WOWLAN_PKTPAT: number of attributes
  442. - * @MAX_NL80211_WOWLAN_PKTPAT: max attribute number
  443. + * @NUM_NL80211_PKTPAT: number of attributes
  444. + * @MAX_NL80211_PKTPAT: max attribute number
  445. */
  446. -enum nl80211_wowlan_packet_pattern_attr {
  447. - __NL80211_WOWLAN_PKTPAT_INVALID,
  448. - NL80211_WOWLAN_PKTPAT_MASK,
  449. - NL80211_WOWLAN_PKTPAT_PATTERN,
  450. - NL80211_WOWLAN_PKTPAT_OFFSET,
  451. +enum nl80211_packet_pattern_attr {
  452. + __NL80211_PKTPAT_INVALID,
  453. + NL80211_PKTPAT_MASK,
  454. + NL80211_PKTPAT_PATTERN,
  455. + NL80211_PKTPAT_OFFSET,
  456. - NUM_NL80211_WOWLAN_PKTPAT,
  457. - MAX_NL80211_WOWLAN_PKTPAT = NUM_NL80211_WOWLAN_PKTPAT - 1,
  458. + NUM_NL80211_PKTPAT,
  459. + MAX_NL80211_PKTPAT = NUM_NL80211_PKTPAT - 1,
  460. };
  461. /**
  462. - * struct nl80211_wowlan_pattern_support - pattern support information
  463. + * struct nl80211_pattern_support - packet pattern support information
  464. * @max_patterns: maximum number of patterns supported
  465. * @min_pattern_len: minimum length of each pattern
  466. * @max_pattern_len: maximum length of each pattern
  467. @@ -3101,13 +3101,22 @@ enum nl80211_wowlan_packet_pattern_attr
  468. * that is part of %NL80211_ATTR_WOWLAN_TRIGGERS_SUPPORTED in the
  469. * capability information given by the kernel to userspace.
  470. */
  471. -struct nl80211_wowlan_pattern_support {
  472. +struct nl80211_pattern_support {
  473. __u32 max_patterns;
  474. __u32 min_pattern_len;
  475. __u32 max_pattern_len;
  476. __u32 max_pkt_offset;
  477. } __attribute__((packed));
  478. +/* only for backward compatibility */
  479. +#define __NL80211_WOWLAN_PKTPAT_INVALID __NL80211_PKTPAT_INVALID
  480. +#define NL80211_WOWLAN_PKTPAT_MASK NL80211_PKTPAT_MASK
  481. +#define NL80211_WOWLAN_PKTPAT_PATTERN NL80211_PKTPAT_PATTERN
  482. +#define NL80211_WOWLAN_PKTPAT_OFFSET NL80211_PKTPAT_OFFSET
  483. +#define NUM_NL80211_WOWLAN_PKTPAT NUM_NL80211_PKTPAT
  484. +#define MAX_NL80211_WOWLAN_PKTPAT MAX_NL80211_PKTPAT
  485. +#define nl80211_wowlan_pattern_support nl80211_pattern_support
  486. +
  487. /**
  488. * enum nl80211_wowlan_triggers - WoWLAN trigger definitions
  489. * @__NL80211_WOWLAN_TRIG_INVALID: invalid number for nested attributes
  490. @@ -3127,7 +3136,7 @@ struct nl80211_wowlan_pattern_support {
  491. * pattern matching is done after the packet is converted to the MSDU.
  492. *
  493. * In %NL80211_ATTR_WOWLAN_TRIGGERS_SUPPORTED, it is a binary attribute
  494. - * carrying a &struct nl80211_wowlan_pattern_support.
  495. + * carrying a &struct nl80211_pattern_support.
  496. *
  497. * When reporting wakeup. it is a u32 attribute containing the 0-based
  498. * index of the pattern that caused the wakeup, in the patterns passed
  499. @@ -3284,7 +3293,7 @@ struct nl80211_wowlan_tcp_data_token_fea
  500. * @NL80211_WOWLAN_TCP_WAKE_PAYLOAD: wake packet payload, for advertising a
  501. * u32 attribute holding the maximum length
  502. * @NL80211_WOWLAN_TCP_WAKE_MASK: Wake packet payload mask, not used for
  503. - * feature advertising. The mask works like @NL80211_WOWLAN_PKTPAT_MASK
  504. + * feature advertising. The mask works like @NL80211_PKTPAT_MASK
  505. * but on the TCP payload only.
  506. * @NUM_NL80211_WOWLAN_TCP: number of TCP attributes
  507. * @MAX_NL80211_WOWLAN_TCP: highest attribute number
  508. --- a/net/mac80211/mesh_ps.c
  509. +++ b/net/mac80211/mesh_ps.c
  510. @@ -229,6 +229,10 @@ void ieee80211_mps_sta_status_update(str
  511. enum nl80211_mesh_power_mode pm;
  512. bool do_buffer;
  513. + /* For non-assoc STA, prevent buffering or frame transmission */
  514. + if (sta->sta_state < IEEE80211_STA_ASSOC)
  515. + return;
  516. +
  517. /*
  518. * use peer-specific power mode if peering is established and the
  519. * peer's power mode is known
  520. --- a/net/wireless/nl80211.c
  521. +++ b/net/wireless/nl80211.c
  522. @@ -974,7 +974,7 @@ static int nl80211_send_wowlan(struct sk
  523. return -ENOBUFS;
  524. if (dev->wiphy.wowlan->n_patterns) {
  525. - struct nl80211_wowlan_pattern_support pat = {
  526. + struct nl80211_pattern_support pat = {
  527. .max_patterns = dev->wiphy.wowlan->n_patterns,
  528. .min_pattern_len = dev->wiphy.wowlan->pattern_min_len,
  529. .max_pattern_len = dev->wiphy.wowlan->pattern_max_len,
  530. @@ -1568,8 +1568,10 @@ static int nl80211_dump_wiphy(struct sk_
  531. rtnl_lock();
  532. if (!state) {
  533. state = kzalloc(sizeof(*state), GFP_KERNEL);
  534. - if (!state)
  535. + if (!state) {
  536. + rtnl_unlock();
  537. return -ENOMEM;
  538. + }
  539. state->filter_wiphy = -1;
  540. ret = nl80211_dump_wiphy_parse(skb, cb, state);
  541. if (ret) {
  542. @@ -6615,12 +6617,14 @@ EXPORT_SYMBOL(cfg80211_testmode_alloc_ev
  543. void cfg80211_testmode_event(struct sk_buff *skb, gfp_t gfp)
  544. {
  545. + struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0];
  546. void *hdr = ((void **)skb->cb)[1];
  547. struct nlattr *data = ((void **)skb->cb)[2];
  548. nla_nest_end(skb, data);
  549. genlmsg_end(skb, hdr);
  550. - genlmsg_multicast(skb, 0, nl80211_testmode_mcgrp.id, gfp);
  551. + genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), skb, 0,
  552. + nl80211_testmode_mcgrp.id, gfp);
  553. }
  554. EXPORT_SYMBOL(cfg80211_testmode_event);
  555. #endif
  556. @@ -7593,12 +7597,11 @@ static int nl80211_send_wowlan_patterns(
  557. if (!nl_pat)
  558. return -ENOBUFS;
  559. pat_len = wowlan->patterns[i].pattern_len;
  560. - if (nla_put(msg, NL80211_WOWLAN_PKTPAT_MASK,
  561. - DIV_ROUND_UP(pat_len, 8),
  562. + if (nla_put(msg, NL80211_PKTPAT_MASK, DIV_ROUND_UP(pat_len, 8),
  563. wowlan->patterns[i].mask) ||
  564. - nla_put(msg, NL80211_WOWLAN_PKTPAT_PATTERN,
  565. - pat_len, wowlan->patterns[i].pattern) ||
  566. - nla_put_u32(msg, NL80211_WOWLAN_PKTPAT_OFFSET,
  567. + nla_put(msg, NL80211_PKTPAT_PATTERN, pat_len,
  568. + wowlan->patterns[i].pattern) ||
  569. + nla_put_u32(msg, NL80211_PKTPAT_OFFSET,
  570. wowlan->patterns[i].pkt_offset))
  571. return -ENOBUFS;
  572. nla_nest_end(msg, nl_pat);
  573. @@ -7939,7 +7942,7 @@ static int nl80211_set_wowlan(struct sk_
  574. struct nlattr *pat;
  575. int n_patterns = 0;
  576. int rem, pat_len, mask_len, pkt_offset;
  577. - struct nlattr *pat_tb[NUM_NL80211_WOWLAN_PKTPAT];
  578. + struct nlattr *pat_tb[NUM_NL80211_PKTPAT];
  579. nla_for_each_nested(pat, tb[NL80211_WOWLAN_TRIG_PKT_PATTERN],
  580. rem)
  581. @@ -7958,26 +7961,25 @@ static int nl80211_set_wowlan(struct sk_
  582. nla_for_each_nested(pat, tb[NL80211_WOWLAN_TRIG_PKT_PATTERN],
  583. rem) {
  584. - nla_parse(pat_tb, MAX_NL80211_WOWLAN_PKTPAT,
  585. - nla_data(pat), nla_len(pat), NULL);
  586. + nla_parse(pat_tb, MAX_NL80211_PKTPAT, nla_data(pat),
  587. + nla_len(pat), NULL);
  588. err = -EINVAL;
  589. - if (!pat_tb[NL80211_WOWLAN_PKTPAT_MASK] ||
  590. - !pat_tb[NL80211_WOWLAN_PKTPAT_PATTERN])
  591. + if (!pat_tb[NL80211_PKTPAT_MASK] ||
  592. + !pat_tb[NL80211_PKTPAT_PATTERN])
  593. goto error;
  594. - pat_len = nla_len(pat_tb[NL80211_WOWLAN_PKTPAT_PATTERN]);
  595. + pat_len = nla_len(pat_tb[NL80211_PKTPAT_PATTERN]);
  596. mask_len = DIV_ROUND_UP(pat_len, 8);
  597. - if (nla_len(pat_tb[NL80211_WOWLAN_PKTPAT_MASK]) !=
  598. - mask_len)
  599. + if (nla_len(pat_tb[NL80211_PKTPAT_MASK]) != mask_len)
  600. goto error;
  601. if (pat_len > wowlan->pattern_max_len ||
  602. pat_len < wowlan->pattern_min_len)
  603. goto error;
  604. - if (!pat_tb[NL80211_WOWLAN_PKTPAT_OFFSET])
  605. + if (!pat_tb[NL80211_PKTPAT_OFFSET])
  606. pkt_offset = 0;
  607. else
  608. pkt_offset = nla_get_u32(
  609. - pat_tb[NL80211_WOWLAN_PKTPAT_OFFSET]);
  610. + pat_tb[NL80211_PKTPAT_OFFSET]);
  611. if (pkt_offset > wowlan->max_pkt_offset)
  612. goto error;
  613. new_triggers.patterns[i].pkt_offset = pkt_offset;
  614. @@ -7991,11 +7993,11 @@ static int nl80211_set_wowlan(struct sk_
  615. new_triggers.patterns[i].pattern =
  616. new_triggers.patterns[i].mask + mask_len;
  617. memcpy(new_triggers.patterns[i].mask,
  618. - nla_data(pat_tb[NL80211_WOWLAN_PKTPAT_MASK]),
  619. + nla_data(pat_tb[NL80211_PKTPAT_MASK]),
  620. mask_len);
  621. new_triggers.patterns[i].pattern_len = pat_len;
  622. memcpy(new_triggers.patterns[i].pattern,
  623. - nla_data(pat_tb[NL80211_WOWLAN_PKTPAT_PATTERN]),
  624. + nla_data(pat_tb[NL80211_PKTPAT_PATTERN]),
  625. pat_len);
  626. i++;
  627. }
  628. @@ -10066,7 +10068,8 @@ void cfg80211_mgmt_tx_status(struct wire
  629. genlmsg_end(msg, hdr);
  630. - genlmsg_multicast(msg, 0, nl80211_mlme_mcgrp.id, gfp);
  631. + genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0,
  632. + nl80211_mlme_mcgrp.id, gfp);
  633. return;
  634. nla_put_failure:
  635. --- a/net/wireless/reg.c
  636. +++ b/net/wireless/reg.c
  637. @@ -2279,7 +2279,9 @@ void wiphy_regulatory_deregister(struct
  638. static void reg_timeout_work(struct work_struct *work)
  639. {
  640. REG_DBG_PRINT("Timeout while waiting for CRDA to reply, restoring regulatory settings\n");
  641. + rtnl_lock();
  642. restore_regulatory_settings(true);
  643. + rtnl_unlock();
  644. }
  645. int __init regulatory_init(void)
  646. --- a/net/wireless/sme.c
  647. +++ b/net/wireless/sme.c
  648. @@ -34,8 +34,10 @@ struct cfg80211_conn {
  649. CFG80211_CONN_SCAN_AGAIN,
  650. CFG80211_CONN_AUTHENTICATE_NEXT,
  651. CFG80211_CONN_AUTHENTICATING,
  652. + CFG80211_CONN_AUTH_FAILED,
  653. CFG80211_CONN_ASSOCIATE_NEXT,
  654. CFG80211_CONN_ASSOCIATING,
  655. + CFG80211_CONN_ASSOC_FAILED,
  656. CFG80211_CONN_DEAUTH,
  657. CFG80211_CONN_CONNECTED,
  658. } state;
  659. @@ -164,6 +166,8 @@ static int cfg80211_conn_do_work(struct
  660. NULL, 0,
  661. params->key, params->key_len,
  662. params->key_idx, NULL, 0);
  663. + case CFG80211_CONN_AUTH_FAILED:
  664. + return -ENOTCONN;
  665. case CFG80211_CONN_ASSOCIATE_NEXT:
  666. BUG_ON(!rdev->ops->assoc);
  667. wdev->conn->state = CFG80211_CONN_ASSOCIATING;
  668. @@ -188,10 +192,17 @@ static int cfg80211_conn_do_work(struct
  669. WLAN_REASON_DEAUTH_LEAVING,
  670. false);
  671. return err;
  672. + case CFG80211_CONN_ASSOC_FAILED:
  673. + cfg80211_mlme_deauth(rdev, wdev->netdev, params->bssid,
  674. + NULL, 0,
  675. + WLAN_REASON_DEAUTH_LEAVING, false);
  676. + return -ENOTCONN;
  677. case CFG80211_CONN_DEAUTH:
  678. cfg80211_mlme_deauth(rdev, wdev->netdev, params->bssid,
  679. NULL, 0,
  680. WLAN_REASON_DEAUTH_LEAVING, false);
  681. + /* free directly, disconnected event already sent */
  682. + cfg80211_sme_free(wdev);
  683. return 0;
  684. default:
  685. return 0;
  686. @@ -371,7 +382,7 @@ bool cfg80211_sme_rx_assoc_resp(struct w
  687. return true;
  688. }
  689. - wdev->conn->state = CFG80211_CONN_DEAUTH;
  690. + wdev->conn->state = CFG80211_CONN_ASSOC_FAILED;
  691. schedule_work(&rdev->conn_work);
  692. return false;
  693. }
  694. @@ -383,7 +394,13 @@ void cfg80211_sme_deauth(struct wireless
  695. void cfg80211_sme_auth_timeout(struct wireless_dev *wdev)
  696. {
  697. - cfg80211_sme_free(wdev);
  698. + struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy);
  699. +
  700. + if (!wdev->conn)
  701. + return;
  702. +
  703. + wdev->conn->state = CFG80211_CONN_AUTH_FAILED;
  704. + schedule_work(&rdev->conn_work);
  705. }
  706. void cfg80211_sme_disassoc(struct wireless_dev *wdev)
  707. @@ -399,7 +416,13 @@ void cfg80211_sme_disassoc(struct wirele
  708. void cfg80211_sme_assoc_timeout(struct wireless_dev *wdev)
  709. {
  710. - cfg80211_sme_disassoc(wdev);
  711. + struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy);
  712. +
  713. + if (!wdev->conn)
  714. + return;
  715. +
  716. + wdev->conn->state = CFG80211_CONN_ASSOC_FAILED;
  717. + schedule_work(&rdev->conn_work);
  718. }
  719. static int cfg80211_sme_connect(struct wireless_dev *wdev,