|
@@ -10524,7 +10524,8 @@ nla_put_failure:
|
|
static void nl80211_send_mlme_event(struct cfg80211_registered_device *rdev,
|
|
static void nl80211_send_mlme_event(struct cfg80211_registered_device *rdev,
|
|
struct net_device *netdev,
|
|
struct net_device *netdev,
|
|
const u8 *buf, size_t len,
|
|
const u8 *buf, size_t len,
|
|
- enum nl80211_commands cmd, gfp_t gfp)
|
|
|
|
|
|
+ enum nl80211_commands cmd, gfp_t gfp,
|
|
|
|
+ int uapsd_queues)
|
|
{
|
|
{
|
|
struct sk_buff *msg;
|
|
struct sk_buff *msg;
|
|
void *hdr;
|
|
void *hdr;
|
|
@@ -10544,6 +10545,19 @@ static void nl80211_send_mlme_event(struct cfg80211_registered_device *rdev,
|
|
nla_put(msg, NL80211_ATTR_FRAME, len, buf))
|
|
nla_put(msg, NL80211_ATTR_FRAME, len, buf))
|
|
goto nla_put_failure;
|
|
goto nla_put_failure;
|
|
|
|
|
|
|
|
+ if (uapsd_queues >= 0) {
|
|
|
|
+ struct nlattr *nla_wmm =
|
|
|
|
+ nla_nest_start(msg, NL80211_ATTR_STA_WME);
|
|
|
|
+ if (!nla_wmm)
|
|
|
|
+ goto nla_put_failure;
|
|
|
|
+
|
|
|
|
+ if (nla_put_u8(msg, NL80211_STA_WME_UAPSD_QUEUES,
|
|
|
|
+ uapsd_queues))
|
|
|
|
+ goto nla_put_failure;
|
|
|
|
+
|
|
|
|
+ nla_nest_end(msg, nla_wmm);
|
|
|
|
+ }
|
|
|
|
+
|
|
genlmsg_end(msg, hdr);
|
|
genlmsg_end(msg, hdr);
|
|
|
|
|
|
genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
|
|
genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
|
|
@@ -10560,15 +10574,15 @@ void nl80211_send_rx_auth(struct cfg80211_registered_device *rdev,
|
|
size_t len, gfp_t gfp)
|
|
size_t len, gfp_t gfp)
|
|
{
|
|
{
|
|
nl80211_send_mlme_event(rdev, netdev, buf, len,
|
|
nl80211_send_mlme_event(rdev, netdev, buf, len,
|
|
- NL80211_CMD_AUTHENTICATE, gfp);
|
|
|
|
|
|
+ NL80211_CMD_AUTHENTICATE, gfp, -1);
|
|
}
|
|
}
|
|
|
|
|
|
void nl80211_send_rx_assoc(struct cfg80211_registered_device *rdev,
|
|
void nl80211_send_rx_assoc(struct cfg80211_registered_device *rdev,
|
|
struct net_device *netdev, const u8 *buf,
|
|
struct net_device *netdev, const u8 *buf,
|
|
- size_t len, gfp_t gfp)
|
|
|
|
|
|
+ size_t len, gfp_t gfp, int uapsd_queues)
|
|
{
|
|
{
|
|
nl80211_send_mlme_event(rdev, netdev, buf, len,
|
|
nl80211_send_mlme_event(rdev, netdev, buf, len,
|
|
- NL80211_CMD_ASSOCIATE, gfp);
|
|
|
|
|
|
+ NL80211_CMD_ASSOCIATE, gfp, uapsd_queues);
|
|
}
|
|
}
|
|
|
|
|
|
void nl80211_send_deauth(struct cfg80211_registered_device *rdev,
|
|
void nl80211_send_deauth(struct cfg80211_registered_device *rdev,
|
|
@@ -10576,7 +10590,7 @@ void nl80211_send_deauth(struct cfg80211_registered_device *rdev,
|
|
size_t len, gfp_t gfp)
|
|
size_t len, gfp_t gfp)
|
|
{
|
|
{
|
|
nl80211_send_mlme_event(rdev, netdev, buf, len,
|
|
nl80211_send_mlme_event(rdev, netdev, buf, len,
|
|
- NL80211_CMD_DEAUTHENTICATE, gfp);
|
|
|
|
|
|
+ NL80211_CMD_DEAUTHENTICATE, gfp, -1);
|
|
}
|
|
}
|
|
|
|
|
|
void nl80211_send_disassoc(struct cfg80211_registered_device *rdev,
|
|
void nl80211_send_disassoc(struct cfg80211_registered_device *rdev,
|
|
@@ -10584,7 +10598,7 @@ void nl80211_send_disassoc(struct cfg80211_registered_device *rdev,
|
|
size_t len, gfp_t gfp)
|
|
size_t len, gfp_t gfp)
|
|
{
|
|
{
|
|
nl80211_send_mlme_event(rdev, netdev, buf, len,
|
|
nl80211_send_mlme_event(rdev, netdev, buf, len,
|
|
- NL80211_CMD_DISASSOCIATE, gfp);
|
|
|
|
|
|
+ NL80211_CMD_DISASSOCIATE, gfp, -1);
|
|
}
|
|
}
|
|
|
|
|
|
void cfg80211_rx_unprot_mlme_mgmt(struct net_device *dev, const u8 *buf,
|
|
void cfg80211_rx_unprot_mlme_mgmt(struct net_device *dev, const u8 *buf,
|
|
@@ -10605,7 +10619,7 @@ void cfg80211_rx_unprot_mlme_mgmt(struct net_device *dev, const u8 *buf,
|
|
cmd = NL80211_CMD_UNPROT_DISASSOCIATE;
|
|
cmd = NL80211_CMD_UNPROT_DISASSOCIATE;
|
|
|
|
|
|
trace_cfg80211_rx_unprot_mlme_mgmt(dev, buf, len);
|
|
trace_cfg80211_rx_unprot_mlme_mgmt(dev, buf, len);
|
|
- nl80211_send_mlme_event(rdev, dev, buf, len, cmd, GFP_ATOMIC);
|
|
|
|
|
|
+ nl80211_send_mlme_event(rdev, dev, buf, len, cmd, GFP_ATOMIC, -1);
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(cfg80211_rx_unprot_mlme_mgmt);
|
|
EXPORT_SYMBOL(cfg80211_rx_unprot_mlme_mgmt);
|
|
|
|
|