mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-30 19:51:31 -04:00
Some more work for 4.7, notably:
* completion and fixups of nla_put_64_64bit() work
* remove a/b/g/n from wext nickname to avoid confusion
with 11ac (which wouldn't even fit fully there due to
string length restrictions)
along with some other minor changes/cleanups.
-----BEGIN PGP SIGNATURE-----
iQIcBAABCgAGBQJXNGMwAAoJEGt7eEactAAdrRMP/RGmFd1I8Z7gIsKc7pdknf20
4xLA3v8cqD7c9OtqlfVSfIyIosNl+pMatXK4eSaYzJICmdV9lU8VqgW6eH9lmDuM
q8Eis2/i7ZozzYhANVFQxMRvmSED8MeRm49LOzRofuPg4FHzyTYd8+TRfQ+QGRm9
xlrKTJ4BwH5lZgmH20/cphbffo5j8IyjzjKw0MC/tjikIePww6Am/r1jpCnd0Mwz
rWwRa4pQ9JBV7UzzzdcMpdn3KJkteFq/gJPCpZVDo3Zf+L21UavxP99NoUWiUvUU
bEQ9FzcuB7Zyt/lCAyu3ECBGqLvskqseFg3zmDnUoL7GmCZ1PZlfsnfOhQP0HgpI
t/dyw+TYIu6d4ZHbqGM6q6usjIJLltaxATwvREq3VdWFn5fYFu0Em3CyQ0on1XGn
4anNdkilGxaVEHCFBvfLvMTEfsTj7eycsNsDrZEGYV3NwX/wfz+6thqqu8gXFUsC
4MB1fS+YPg7u72ne+oJSPyJyFofYXDSjdNqnZ6HSQEZHinE+FnDCywZlJesxzDsH
q1ABkKLnmMNIwHxbfRBE0eO8sKXo6kUTJeFmWHtxB8/LcsLsV0/8juUy9H5PPZPU
7TJhn4SZrlJb92xq1DQ0t1xsRxTLonbRuu9PtVVZMUhZP69PpzK9toC6eCo9bovn
XFdSQ2c2xRwRAiSjUpQP
=QNxF
-----END PGP SIGNATURE-----
Merge tag 'mac80211-next-for-davem-2016-05-12' of git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211-next
Johannes Berg says:
====================
Some more work for 4.7, notably:
* completion and fixups of nla_put_64_64bit() work
* remove a/b/g/n from wext nickname to avoid confusion
with 11ac (which wouldn't even fit fully there due to
string length restrictions)
along with some other minor changes/cleanups.
====================
Signed-off-by: David S. Miller <[email protected]>
This commit is contained in:
commit
7fd38193d0
17 changed files with 230 additions and 121 deletions
|
|
@ -2399,6 +2399,11 @@ static void __ieee80211_disconnect(struct ieee80211_sub_if_data *sdata)
|
|||
return;
|
||||
}
|
||||
|
||||
/* AP is probably out of range (or not reachable for another reason) so
|
||||
* remove the bss struct for that AP.
|
||||
*/
|
||||
cfg80211_unlink_bss(local->hw.wiphy, ifmgd->associated);
|
||||
|
||||
ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH,
|
||||
WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY,
|
||||
true, frame_buf);
|
||||
|
|
|
|||
|
|
@ -1319,13 +1319,52 @@ int ieee80211_sta_ps_transition(struct ieee80211_sta *pubsta, bool start)
|
|||
}
|
||||
EXPORT_SYMBOL(ieee80211_sta_ps_transition);
|
||||
|
||||
void ieee80211_sta_pspoll(struct ieee80211_sta *pubsta)
|
||||
{
|
||||
struct sta_info *sta = container_of(pubsta, struct sta_info, sta);
|
||||
|
||||
if (test_sta_flag(sta, WLAN_STA_SP))
|
||||
return;
|
||||
|
||||
if (!test_sta_flag(sta, WLAN_STA_PS_DRIVER))
|
||||
ieee80211_sta_ps_deliver_poll_response(sta);
|
||||
else
|
||||
set_sta_flag(sta, WLAN_STA_PSPOLL);
|
||||
}
|
||||
EXPORT_SYMBOL(ieee80211_sta_pspoll);
|
||||
|
||||
void ieee80211_sta_uapsd_trigger(struct ieee80211_sta *pubsta, u8 tid)
|
||||
{
|
||||
struct sta_info *sta = container_of(pubsta, struct sta_info, sta);
|
||||
u8 ac = ieee802_1d_to_ac[tid & 7];
|
||||
|
||||
/*
|
||||
* If this AC is not trigger-enabled do nothing.
|
||||
*
|
||||
* NB: This could/should check a separate bitmap of trigger-
|
||||
* enabled queues, but for now we only implement uAPSD w/o
|
||||
* TSPEC changes to the ACs, so they're always the same.
|
||||
*/
|
||||
if (!(sta->sta.uapsd_queues & BIT(ac)))
|
||||
return;
|
||||
|
||||
/* if we are in a service period, do nothing */
|
||||
if (test_sta_flag(sta, WLAN_STA_SP))
|
||||
return;
|
||||
|
||||
if (!test_sta_flag(sta, WLAN_STA_PS_DRIVER))
|
||||
ieee80211_sta_ps_deliver_uapsd(sta);
|
||||
else
|
||||
set_sta_flag(sta, WLAN_STA_UAPSD);
|
||||
}
|
||||
EXPORT_SYMBOL(ieee80211_sta_uapsd_trigger);
|
||||
|
||||
static ieee80211_rx_result debug_noinline
|
||||
ieee80211_rx_h_uapsd_and_pspoll(struct ieee80211_rx_data *rx)
|
||||
{
|
||||
struct ieee80211_sub_if_data *sdata = rx->sdata;
|
||||
struct ieee80211_hdr *hdr = (void *)rx->skb->data;
|
||||
struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb);
|
||||
int tid, ac;
|
||||
|
||||
if (!rx->sta)
|
||||
return RX_CONTINUE;
|
||||
|
|
@ -1351,12 +1390,7 @@ ieee80211_rx_h_uapsd_and_pspoll(struct ieee80211_rx_data *rx)
|
|||
return RX_CONTINUE;
|
||||
|
||||
if (unlikely(ieee80211_is_pspoll(hdr->frame_control))) {
|
||||
if (!test_sta_flag(rx->sta, WLAN_STA_SP)) {
|
||||
if (!test_sta_flag(rx->sta, WLAN_STA_PS_DRIVER))
|
||||
ieee80211_sta_ps_deliver_poll_response(rx->sta);
|
||||
else
|
||||
set_sta_flag(rx->sta, WLAN_STA_PSPOLL);
|
||||
}
|
||||
ieee80211_sta_pspoll(&rx->sta->sta);
|
||||
|
||||
/* Free PS Poll skb here instead of returning RX_DROP that would
|
||||
* count as an dropped frame. */
|
||||
|
|
@ -1368,27 +1402,11 @@ ieee80211_rx_h_uapsd_and_pspoll(struct ieee80211_rx_data *rx)
|
|||
ieee80211_has_pm(hdr->frame_control) &&
|
||||
(ieee80211_is_data_qos(hdr->frame_control) ||
|
||||
ieee80211_is_qos_nullfunc(hdr->frame_control))) {
|
||||
u8 tid;
|
||||
|
||||
tid = *ieee80211_get_qos_ctl(hdr) & IEEE80211_QOS_CTL_TID_MASK;
|
||||
ac = ieee802_1d_to_ac[tid & 7];
|
||||
|
||||
/*
|
||||
* If this AC is not trigger-enabled do nothing.
|
||||
*
|
||||
* NB: This could/should check a separate bitmap of trigger-
|
||||
* enabled queues, but for now we only implement uAPSD w/o
|
||||
* TSPEC changes to the ACs, so they're always the same.
|
||||
*/
|
||||
if (!(rx->sta->sta.uapsd_queues & BIT(ac)))
|
||||
return RX_CONTINUE;
|
||||
|
||||
/* if we are in a service period, do nothing */
|
||||
if (test_sta_flag(rx->sta, WLAN_STA_SP))
|
||||
return RX_CONTINUE;
|
||||
|
||||
if (!test_sta_flag(rx->sta, WLAN_STA_PS_DRIVER))
|
||||
ieee80211_sta_ps_deliver_uapsd(rx->sta);
|
||||
else
|
||||
set_sta_flag(rx->sta, WLAN_STA_UAPSD);
|
||||
ieee80211_sta_uapsd_trigger(&rx->sta->sta, tid);
|
||||
}
|
||||
|
||||
return RX_CONTINUE;
|
||||
|
|
|
|||
|
|
@ -519,12 +519,16 @@ ieee80211_crypto_ccmp_decrypt(struct ieee80211_rx_data *rx,
|
|||
return RX_DROP_UNUSABLE;
|
||||
|
||||
if (!(status->flag & RX_FLAG_PN_VALIDATED)) {
|
||||
int res;
|
||||
|
||||
ccmp_hdr2pn(pn, skb->data + hdrlen);
|
||||
|
||||
queue = rx->security_idx;
|
||||
|
||||
if (memcmp(pn, key->u.ccmp.rx_pn[queue],
|
||||
IEEE80211_CCMP_PN_LEN) <= 0) {
|
||||
res = memcmp(pn, key->u.ccmp.rx_pn[queue],
|
||||
IEEE80211_CCMP_PN_LEN);
|
||||
if (res < 0 ||
|
||||
(!res && !(status->flag & RX_FLAG_ALLOW_SAME_PN))) {
|
||||
key->u.ccmp.replays++;
|
||||
return RX_DROP_UNUSABLE;
|
||||
}
|
||||
|
|
@ -745,12 +749,16 @@ ieee80211_crypto_gcmp_decrypt(struct ieee80211_rx_data *rx)
|
|||
return RX_DROP_UNUSABLE;
|
||||
|
||||
if (!(status->flag & RX_FLAG_PN_VALIDATED)) {
|
||||
int res;
|
||||
|
||||
gcmp_hdr2pn(pn, skb->data + hdrlen);
|
||||
|
||||
queue = rx->security_idx;
|
||||
|
||||
if (memcmp(pn, key->u.gcmp.rx_pn[queue],
|
||||
IEEE80211_GCMP_PN_LEN) <= 0) {
|
||||
res = memcmp(pn, key->u.gcmp.rx_pn[queue],
|
||||
IEEE80211_GCMP_PN_LEN);
|
||||
if (res < 0 ||
|
||||
(!res && !(status->flag & RX_FLAG_ALLOW_SAME_PN))) {
|
||||
key->u.gcmp.replays++;
|
||||
return RX_DROP_UNUSABLE;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue