wifi: cfg80211: make TDLS management link-aware
authorMukesh Sisodiya <mukesh.sisodiya@intel.com>
Fri, 16 Jun 2023 06:53:50 +0000 (09:53 +0300)
committerJohannes Berg <johannes.berg@intel.com>
Mon, 19 Jun 2023 10:05:27 +0000 (12:05 +0200)
For multi-link operation(MLO) TDLS management
frames need to be transmitted on a specific link.
The TDLS setup request will add BSSID along with
peer address and userspace will pass the link-id
based on BSSID value to the driver(or mac80211).

Signed-off-by: Mukesh Sisodiya <mukesh.sisodiya@intel.com>
Signed-off-by: Gregory Greenman <gregory.greenman@intel.com>
Link: https://lore.kernel.org/r/20230616094948.cb3d87c22812.Ia3d15ac4a9a182145bf2d418bcb3ddf4539cd0a7@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
drivers/net/wireless/marvell/mwifiex/cfg80211.c
include/net/cfg80211.h
net/mac80211/ieee80211_i.h
net/mac80211/tdls.c
net/wireless/nl80211.c
net/wireless/rdev-ops.h
net/wireless/trace.h

index bcd564d..1ef89cd 100644 (file)
@@ -3753,10 +3753,10 @@ static int mwifiex_cfg80211_set_coalesce(struct wiphy *wiphy,
  */
 static int
 mwifiex_cfg80211_tdls_mgmt(struct wiphy *wiphy, struct net_device *dev,
-                          const u8 *peer, u8 action_code, u8 dialog_token,
-                          u16 status_code, u32 peer_capability,
-                          bool initiator, const u8 *extra_ies,
-                          size_t extra_ies_len)
+                          const u8 *peer, int link_id, u8 action_code,
+                          u8 dialog_token, u16 status_code,
+                          u32 peer_capability, bool initiator,
+                          const u8 *extra_ies, size_t extra_ies_len)
 {
        struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
        int ret;
index 388f2a3..3ca5818 100644 (file)
@@ -4607,9 +4607,10 @@ struct cfg80211_ops {
                                  struct cfg80211_gtk_rekey_data *data);
 
        int     (*tdls_mgmt)(struct wiphy *wiphy, struct net_device *dev,
-                            const u8 *peer, u8 action_code,  u8 dialog_token,
-                            u16 status_code, u32 peer_capability,
-                            bool initiator, const u8 *buf, size_t len);
+                            const u8 *peer, int link_id,
+                            u8 action_code, u8 dialog_token, u16 status_code,
+                            u32 peer_capability, bool initiator,
+                            const u8 *buf, size_t len);
        int     (*tdls_oper)(struct wiphy *wiphy, struct net_device *dev,
                             const u8 *peer, enum nl80211_tdls_operation oper);
 
index 4afd509..ca8a1e1 100644 (file)
@@ -2565,10 +2565,10 @@ void ieee80211_recalc_chanctx_chantype(struct ieee80211_local *local,
 
 /* TDLS */
 int ieee80211_tdls_mgmt(struct wiphy *wiphy, struct net_device *dev,
-                       const u8 *peer, u8 action_code, u8 dialog_token,
-                       u16 status_code, u32 peer_capability,
-                       bool initiator, const u8 *extra_ies,
-                       size_t extra_ies_len);
+                       const u8 *peer, int link_id,
+                       u8 action_code, u8 dialog_token, u16 status_code,
+                       u32 peer_capability, bool initiator,
+                       const u8 *extra_ies, size_t extra_ies_len);
 int ieee80211_tdls_oper(struct wiphy *wiphy, struct net_device *dev,
                        const u8 *peer, enum nl80211_tdls_operation oper);
 void ieee80211_tdls_peer_del_work(struct work_struct *wk);
index 52c4767..6575b28 100644 (file)
@@ -6,7 +6,7 @@
  * Copyright 2014, Intel Corporation
  * Copyright 2014  Intel Mobile Communications GmbH
  * Copyright 2015 - 2016 Intel Deutschland GmbH
- * Copyright (C) 2019, 2021-2022 Intel Corporation
+ * Copyright (C) 2019, 2021-2023 Intel Corporation
  */
 
 #include <linux/ieee80211.h>
@@ -1185,10 +1185,10 @@ ieee80211_tdls_mgmt_teardown(struct wiphy *wiphy, struct net_device *dev,
 }
 
 int ieee80211_tdls_mgmt(struct wiphy *wiphy, struct net_device *dev,
-                       const u8 *peer, u8 action_code, u8 dialog_token,
-                       u16 status_code, u32 peer_capability,
-                       bool initiator, const u8 *extra_ies,
-                       size_t extra_ies_len)
+                       const u8 *peer, int link_id,
+                       u8 action_code, u8 dialog_token, u16 status_code,
+                       u32 peer_capability, bool initiator,
+                       const u8 *extra_ies, size_t extra_ies_len)
 {
        struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
        int ret;
index ec7d467..7b547ae 100644 (file)
@@ -12262,6 +12262,7 @@ static int nl80211_tdls_mgmt(struct sk_buff *skb, struct genl_info *info)
        u32 peer_capability = 0;
        u16 status_code;
        u8 *peer;
+       int link_id;
        bool initiator;
 
        if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS) ||
@@ -12283,8 +12284,9 @@ static int nl80211_tdls_mgmt(struct sk_buff *skb, struct genl_info *info)
        if (info->attrs[NL80211_ATTR_TDLS_PEER_CAPABILITY])
                peer_capability =
                        nla_get_u32(info->attrs[NL80211_ATTR_TDLS_PEER_CAPABILITY]);
+       link_id = nl80211_link_id_or_invalid(info->attrs);
 
-       return rdev_tdls_mgmt(rdev, dev, peer, action_code,
+       return rdev_tdls_mgmt(rdev, dev, peer, link_id, action_code,
                              dialog_token, status_code, peer_capability,
                              initiator,
                              nla_data(info->attrs[NL80211_ATTR_IE]),
@@ -17151,7 +17153,8 @@ static const struct genl_small_ops nl80211_small_ops[] = {
                .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
                .doit = nl80211_tdls_mgmt,
                .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_TDLS_OPER,
index 69b5087..f8c3108 100644 (file)
@@ -899,17 +899,18 @@ static inline int rdev_set_rekey_data(struct cfg80211_registered_device *rdev,
 
 static inline int rdev_tdls_mgmt(struct cfg80211_registered_device *rdev,
                                 struct net_device *dev, u8 *peer,
-                                u8 action_code, u8 dialog_token,
-                                u16 status_code, u32 peer_capability,
-                                bool initiator, const u8 *buf, size_t len)
+                                int link_id, u8 action_code,
+                                u8 dialog_token, u16 status_code,
+                                u32 peer_capability, bool initiator,
+                                const u8 *buf, size_t len)
 {
        int ret;
-       trace_rdev_tdls_mgmt(&rdev->wiphy, dev, peer, action_code,
+       trace_rdev_tdls_mgmt(&rdev->wiphy, dev, peer, link_id, action_code,
                             dialog_token, status_code, peer_capability,
                             initiator, buf, len);
-       ret = rdev->ops->tdls_mgmt(&rdev->wiphy, dev, peer, action_code,
-                                  dialog_token, status_code, peer_capability,
-                                  initiator, buf, len);
+       ret = rdev->ops->tdls_mgmt(&rdev->wiphy, dev, peer, link_id,
+                                  action_code, dialog_token, status_code,
+                                  peer_capability, initiator, buf, len);
        trace_rdev_return_int(&rdev->wiphy, ret);
        return ret;
 }
index a00da3e..73a4f8f 100644 (file)
@@ -1779,15 +1779,16 @@ DEFINE_EVENT(wiphy_netdev_id_evt, rdev_sched_scan_stop,
 
 TRACE_EVENT(rdev_tdls_mgmt,
        TP_PROTO(struct wiphy *wiphy, struct net_device *netdev,
-                u8 *peer, u8 action_code, u8 dialog_token,
+                u8 *peer, int link_id, u8 action_code, u8 dialog_token,
                 u16 status_code, u32 peer_capability,
                 bool initiator, const u8 *buf, size_t len),
-       TP_ARGS(wiphy, netdev, peer, action_code, dialog_token, status_code,
-               peer_capability, initiator, buf, len),
+       TP_ARGS(wiphy, netdev, peer, link_id, action_code, dialog_token,
+               status_code, peer_capability, initiator, buf, len),
        TP_STRUCT__entry(
                WIPHY_ENTRY
                NETDEV_ENTRY
                MAC_ENTRY(peer)
+               __field(int, link_id)
                __field(u8, action_code)
                __field(u8, dialog_token)
                __field(u16, status_code)
@@ -1799,6 +1800,7 @@ TRACE_EVENT(rdev_tdls_mgmt,
                WIPHY_ASSIGN;
                NETDEV_ASSIGN;
                MAC_ASSIGN(peer, peer);
+               __entry->link_id = link_id;
                __entry->action_code = action_code;
                __entry->dialog_token = dialog_token;
                __entry->status_code = status_code;
@@ -1806,11 +1808,12 @@ TRACE_EVENT(rdev_tdls_mgmt,
                __entry->initiator = initiator;
                memcpy(__get_dynamic_array(buf), buf, len);
        ),
-       TP_printk(WIPHY_PR_FMT ", " NETDEV_PR_FMT ", %pM, action_code: %u, "
+       TP_printk(WIPHY_PR_FMT ", " NETDEV_PR_FMT ", %pM"
+                 ", link_id: %d, action_code: %u "
                  "dialog_token: %u, status_code: %u, peer_capability: %u "
                  "initiator: %s buf: %#.2x ",
                  WIPHY_PR_ARG, NETDEV_PR_ARG, __entry->peer,
-                 __entry->action_code, __entry->dialog_token,
+                 __entry->link_id, __entry->action_code, __entry->dialog_token,
                  __entry->status_code, __entry->peer_capability,
                  BOOL_TO_STR(__entry->initiator),
                  ((u8 *)__get_dynamic_array(buf))[0])