]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
wifi: mac80211: Add processing of TTLM teardown frame
authorIlan Peer <ilan.peer@intel.com>
Wed, 5 Feb 2025 09:39:15 +0000 (11:39 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Tue, 11 Feb 2025 10:59:06 +0000 (11:59 +0100)
Add processing of negotiated TTLM tear down frame.
Handle this frame similar to the way a locally initiated
tear down is handled.

Signed-off-by: Ilan Peer <ilan.peer@intel.com>
Reviewed-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
Link: https://patch.msgid.link/20250205110958.860691076786.I32df71182c25c5f84e4534f40efe1316926b8249@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/ieee80211_i.h
net/mac80211/iface.c
net/mac80211/mlme.c
net/mac80211/rx.c

index b6c769fc9abf6f1f67baddd7cbcad221e6f87367..df7c803134fd8e5859a4475db4c9483ed70a1c53 100644 (file)
@@ -2777,6 +2777,7 @@ void ieee80211_process_neg_ttlm_res(struct ieee80211_sub_if_data *sdata,
                                    struct ieee80211_mgmt *mgmt, size_t len);
 int ieee80211_req_neg_ttlm(struct ieee80211_sub_if_data *sdata,
                           struct cfg80211_ttlm_params *params);
+void ieee80211_process_ttlm_teardown(struct ieee80211_sub_if_data *sdata);
 
 void ieee80211_check_wbrf_support(struct ieee80211_local *local);
 void ieee80211_add_wbrf(struct ieee80211_local *local, struct cfg80211_chan_def *chandef);
index 56fde5afe79a86a7a658ee1e708012011a431fcf..edb4ca333528d26f98546eec4fa7b0a9605bc7b5 100644 (file)
@@ -1552,6 +1552,9 @@ static void ieee80211_iface_process_skb(struct ieee80211_local *local,
                                ieee80211_process_neg_ttlm_res(sdata, mgmt,
                                                               skb->len);
                                break;
+                       case WLAN_PROTECTED_EHT_ACTION_TTLM_TEARDOWN:
+                               ieee80211_process_ttlm_teardown(sdata);
+                               break;
                        case WLAN_PROTECTED_EHT_ACTION_LINK_RECONFIG_RESP:
                                ieee80211_process_ml_reconf_resp(sdata, mgmt,
                                                                 skb->len);
index aaf84c52cd2d82d1282f9082a75dcab2955814de..04e1ea43b2df8599fbd851916114fdac01c96d88 100644 (file)
@@ -7705,13 +7705,9 @@ void ieee80211_process_neg_ttlm_res(struct ieee80211_sub_if_data *sdata,
                __ieee80211_disconnect(sdata);
 }
 
-static void ieee80211_teardown_ttlm_work(struct wiphy *wiphy,
-                                        struct wiphy_work *work)
+void ieee80211_process_ttlm_teardown(struct ieee80211_sub_if_data *sdata)
 {
        u16 new_dormant_links;
-       struct ieee80211_sub_if_data *sdata =
-               container_of(work, struct ieee80211_sub_if_data,
-                            u.mgd.teardown_ttlm_work);
 
        if (!sdata->vif.neg_ttlm.valid)
                return;
@@ -7726,6 +7722,16 @@ static void ieee80211_teardown_ttlm_work(struct wiphy *wiphy,
                                               BSS_CHANGED_MLD_VALID_LINKS);
 }
 
+static void ieee80211_teardown_ttlm_work(struct wiphy *wiphy,
+                                        struct wiphy_work *work)
+{
+       struct ieee80211_sub_if_data *sdata =
+               container_of(work, struct ieee80211_sub_if_data,
+                            u.mgd.teardown_ttlm_work);
+
+       ieee80211_process_ttlm_teardown(sdata);
+}
+
 void ieee80211_send_teardown_neg_ttlm(struct ieee80211_vif *vif)
 {
        struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
index 1790e7221a145a62d27750f5f037e747bc53d63e..f40e2ea1b09ac2408371c35b8da559794e418654 100644 (file)
@@ -3811,6 +3811,14 @@ ieee80211_rx_h_action(struct ieee80211_rx_data *rx)
                                              u.action.u.ttlm_res))
                                goto invalid;
                        goto queue;
+               case WLAN_PROTECTED_EHT_ACTION_TTLM_TEARDOWN:
+                       if (sdata->vif.type != NL80211_IFTYPE_STATION)
+                               break;
+
+                       if (len < offsetofend(typeof(*mgmt),
+                                             u.action.u.ttlm_tear_down))
+                               goto invalid;
+                       goto queue;
                case WLAN_PROTECTED_EHT_ACTION_LINK_RECONFIG_RESP:
                        if (sdata->vif.type != NL80211_IFTYPE_STATION)
                                break;