|
@@ -7147,6 +7147,9 @@ static int nl80211_tx_mgmt(struct sk_buff *skb, struct genl_info *info)
|
|
|
return -EOPNOTSUPP;
|
|
|
|
|
|
switch (wdev->iftype) {
|
|
|
+ case NL80211_IFTYPE_P2P_DEVICE:
|
|
|
+ if (!info->attrs[NL80211_ATTR_WIPHY_FREQ])
|
|
|
+ return -EINVAL;
|
|
|
case NL80211_IFTYPE_STATION:
|
|
|
case NL80211_IFTYPE_ADHOC:
|
|
|
case NL80211_IFTYPE_P2P_CLIENT:
|
|
@@ -7154,7 +7157,6 @@ static int nl80211_tx_mgmt(struct sk_buff *skb, struct genl_info *info)
|
|
|
case NL80211_IFTYPE_AP_VLAN:
|
|
|
case NL80211_IFTYPE_MESH_POINT:
|
|
|
case NL80211_IFTYPE_P2P_GO:
|
|
|
- case NL80211_IFTYPE_P2P_DEVICE:
|
|
|
break;
|
|
|
default:
|
|
|
return -EOPNOTSUPP;
|
|
@@ -7182,9 +7184,18 @@ static int nl80211_tx_mgmt(struct sk_buff *skb, struct genl_info *info)
|
|
|
|
|
|
no_cck = nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]);
|
|
|
|
|
|
- err = nl80211_parse_chandef(rdev, info, &chandef);
|
|
|
- if (err)
|
|
|
- return err;
|
|
|
+ /* get the channel if any has been specified, otherwise pass NULL to
|
|
|
+ * the driver. The latter will use the current one
|
|
|
+ */
|
|
|
+ chandef.chan = NULL;
|
|
|
+ if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
|
|
|
+ err = nl80211_parse_chandef(rdev, info, &chandef);
|
|
|
+ if (err)
|
|
|
+ return err;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!chandef.chan && offchan)
|
|
|
+ return -EINVAL;
|
|
|
|
|
|
if (!dont_wait_for_ack) {
|
|
|
msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
|