]> git.ipfire.org Git - thirdparty/kernel/linux.git/blobdiff - net/wireless/nl80211.c
Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next
[thirdparty/kernel/linux.git] / net / wireless / nl80211.c
index 30ff9a47081348d1b14d1db520aeedf9c9ffdd09..3c0bca4238d357c01b6fe92bb0f2b2b8a2917725 100644 (file)
@@ -8116,7 +8116,8 @@ static int nl80211_req_set_reg(struct sk_buff *skb, struct genl_info *info)
                        is_indoor = true;
                }
 
-               return regulatory_hint_indoor(is_indoor, owner_nlportid);
+               regulatory_hint_indoor(is_indoor, owner_nlportid);
+               return 0;
        default:
                return -EINVAL;
        }
@@ -9162,6 +9163,7 @@ static int nl80211_trigger_scan(struct sk_buff *skb, struct genl_info *info)
        struct wiphy *wiphy;
        int err, tmp, n_ssids = 0, n_channels, i;
        size_t ie_len, size;
+       size_t ssids_offset, ie_offset;
 
        wiphy = &rdev->wiphy;
 
@@ -9207,21 +9209,20 @@ static int nl80211_trigger_scan(struct sk_buff *skb, struct genl_info *info)
                return -EINVAL;
 
        size = struct_size(request, channels, n_channels);
+       ssids_offset = size;
        size = size_add(size, array_size(sizeof(*request->ssids), n_ssids));
+       ie_offset = size;
        size = size_add(size, ie_len);
        request = kzalloc(size, GFP_KERNEL);
        if (!request)
                return -ENOMEM;
+       request->n_channels = n_channels;
 
        if (n_ssids)
-               request->ssids = (void *)&request->channels[n_channels];
+               request->ssids = (void *)request + ssids_offset;
        request->n_ssids = n_ssids;
-       if (ie_len) {
-               if (n_ssids)
-                       request->ie = (void *)(request->ssids + n_ssids);
-               else
-                       request->ie = (void *)(request->channels + n_channels);
-       }
+       if (ie_len)
+               request->ie = (void *)request + ie_offset;
 
        i = 0;
        if (scan_freqs) {
@@ -16031,6 +16032,7 @@ static int nl80211_color_change(struct sk_buff *skb, struct genl_info *info)
                params.counter_offset_presp = offset;
        }
 
+       params.link_id = nl80211_link_id(info->attrs);
        err = rdev_color_change(rdev, dev, &params);
 
 out:
@@ -17433,7 +17435,8 @@ static const struct genl_small_ops nl80211_small_ops[] = {
                .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
                .doit = nl80211_color_change,
                .flags = GENL_UNS_ADMIN_PERM,
-               .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
+               .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP |
+                                        NL80211_FLAG_MLO_VALID_LINK_ID),
        },
        {
                .cmd = NL80211_CMD_SET_FILS_AAD,
@@ -19455,7 +19458,7 @@ EXPORT_SYMBOL(cfg80211_ch_switch_started_notify);
 
 int cfg80211_bss_color_notify(struct net_device *dev,
                              enum nl80211_commands cmd, u8 count,
-                             u64 color_bitmap)
+                             u64 color_bitmap, u8 link_id)
 {
        struct wireless_dev *wdev = dev->ieee80211_ptr;
        struct wiphy *wiphy = wdev->wiphy;
@@ -19478,6 +19481,10 @@ int cfg80211_bss_color_notify(struct net_device *dev,
        if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex))
                goto nla_put_failure;
 
+       if (wdev->valid_links &&
+           nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link_id))
+               goto nla_put_failure;
+
        if (cmd == NL80211_CMD_COLOR_CHANGE_STARTED &&
            nla_put_u32(msg, NL80211_ATTR_COLOR_CHANGE_COUNT, count))
                goto nla_put_failure;