|
@@ -1661,6 +1661,7 @@ static int nl80211_send_wiphy(struct cfg80211_registered_device *rdev,
|
|
|
NL80211_FEATURE_SUPPORTS_WMM_ADMISSION)
|
|
|
CMD(add_tx_ts, ADD_TX_TS);
|
|
|
CMD(set_multicast_to_unicast, SET_MULTICAST_TO_UNICAST);
|
|
|
+ CMD(update_connect_params, UPDATE_CONNECT_PARAMS);
|
|
|
}
|
|
|
#undef CMD
|
|
|
|
|
@@ -8779,6 +8780,37 @@ static int nl80211_connect(struct sk_buff *skb, struct genl_info *info)
|
|
|
return err;
|
|
|
}
|
|
|
|
|
|
+static int nl80211_update_connect_params(struct sk_buff *skb,
|
|
|
+ struct genl_info *info)
|
|
|
+{
|
|
|
+ struct cfg80211_connect_params connect = {};
|
|
|
+ struct cfg80211_registered_device *rdev = info->user_ptr[0];
|
|
|
+ struct net_device *dev = info->user_ptr[1];
|
|
|
+ struct wireless_dev *wdev = dev->ieee80211_ptr;
|
|
|
+ u32 changed = 0;
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ if (!rdev->ops->update_connect_params)
|
|
|
+ return -EOPNOTSUPP;
|
|
|
+
|
|
|
+ if (info->attrs[NL80211_ATTR_IE]) {
|
|
|
+ if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]))
|
|
|
+ return -EINVAL;
|
|
|
+ connect.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
|
|
|
+ connect.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
|
|
|
+ changed |= UPDATE_ASSOC_IES;
|
|
|
+ }
|
|
|
+
|
|
|
+ wdev_lock(dev->ieee80211_ptr);
|
|
|
+ if (!wdev->current_bss)
|
|
|
+ ret = -ENOLINK;
|
|
|
+ else
|
|
|
+ ret = rdev_update_connect_params(rdev, dev, &connect, changed);
|
|
|
+ wdev_unlock(dev->ieee80211_ptr);
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
static int nl80211_disconnect(struct sk_buff *skb, struct genl_info *info)
|
|
|
{
|
|
|
struct cfg80211_registered_device *rdev = info->user_ptr[0];
|
|
@@ -12231,6 +12263,14 @@ static const struct genl_ops nl80211_ops[] = {
|
|
|
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
|
|
NL80211_FLAG_NEED_RTNL,
|
|
|
},
|
|
|
+ {
|
|
|
+ .cmd = NL80211_CMD_UPDATE_CONNECT_PARAMS,
|
|
|
+ .doit = nl80211_update_connect_params,
|
|
|
+ .policy = nl80211_policy,
|
|
|
+ .flags = GENL_ADMIN_PERM,
|
|
|
+ .internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
|
|
+ NL80211_FLAG_NEED_RTNL,
|
|
|
+ },
|
|
|
{
|
|
|
.cmd = NL80211_CMD_DISCONNECT,
|
|
|
.doit = nl80211_disconnect,
|