]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
wifi: rtw89: Add encryption support for MLO connections
authorPo-Hao Huang <phhuang@realtek.com>
Tue, 22 Oct 2024 08:31:03 +0000 (16:31 +0800)
committerPing-Ke Shih <pkshih@realtek.com>
Tue, 29 Oct 2024 03:25:36 +0000 (11:25 +0800)
In order to make encryption/decryption work properly with MLO
connections, MLD address needs to be filled in so circuits can
operate with the correct information.

Signed-off-by: Po-Hao Huang <phhuang@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Link: https://patch.msgid.link/20241022083106.149252-3-pkshih@realtek.com
drivers/net/wireless/realtek/rtw89/cam.c
drivers/net/wireless/realtek/rtw89/cam.h

index 8d140b94cb440367be2c9a3f07b36cee6fe1d418..8ef59994c0dbd95600c2d76d28e0ca15856a2399 100644 (file)
@@ -961,16 +961,24 @@ void rtw89_cam_fill_dctl_sec_cam_info_v2(struct rtw89_dev *rtwdev,
                                         struct rtw89_sta_link *rtwsta_link,
                                         struct rtw89_h2c_dctlinfo_ud_v2 *h2c)
 {
+       struct ieee80211_sta *sta = rtwsta_link_to_sta_safe(rtwsta_link);
+       struct ieee80211_vif *vif = rtwvif_to_vif(rtwvif_link->rtwvif);
+       struct rtw89_vif *rtwvif = rtwvif_link->rtwvif;
        struct rtw89_addr_cam_entry *addr_cam =
                rtw89_get_addr_cam_of(rtwvif_link, rtwsta_link);
+       bool is_mld = sta ? sta->mlo : ieee80211_vif_is_mld(vif);
        struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
        u8 *ptk_tx_iv = rtw_wow->key_info.ptk_tx_iv;
+       u8 *mld_sma, *mld_tma, *mld_bssid;
 
        h2c->c0 = le32_encode_bits(rtwsta_link ? rtwsta_link->mac_id :
                                                 rtwvif_link->mac_id,
                                   DCTLINFO_V2_C0_MACID) |
                  le32_encode_bits(1, DCTLINFO_V2_C0_OP);
 
+       h2c->w2 = le32_encode_bits(is_mld, DCTLINFO_V2_W2_IS_MLD);
+       h2c->m2 = cpu_to_le32(DCTLINFO_V2_W2_IS_MLD);
+
        h2c->w4 = le32_encode_bits(addr_cam->sec_ent_keyid[0],
                                   DCTLINFO_V2_W4_SEC_ENT0_KEYID) |
                  le32_encode_bits(addr_cam->sec_ent_keyid[1],
@@ -1036,4 +1044,47 @@ void rtw89_cam_fill_dctl_sec_cam_info_v2(struct rtw89_dev *rtwdev,
                                            DCTLINFO_V2_W4_SEC_KEY_ID);
                h2c->m4 |= cpu_to_le32(DCTLINFO_V2_W4_SEC_KEY_ID);
        }
+
+       if (!is_mld)
+               return;
+
+       if (rtwvif_link->net_type == RTW89_NET_TYPE_INFRA) {
+               mld_sma = rtwvif->mac_addr;
+               mld_tma = vif->cfg.ap_addr;
+               mld_bssid = vif->cfg.ap_addr;
+       } else if (rtwvif_link->net_type == RTW89_NET_TYPE_AP_MODE && sta) {
+               mld_sma = rtwvif->mac_addr;
+               mld_tma = sta->addr;
+               mld_bssid = rtwvif->mac_addr;
+       } else {
+               return;
+       }
+
+       h2c->w8 = le32_encode_bits(mld_sma[0], DCTLINFO_V2_W8_MLD_SMA_0) |
+                 le32_encode_bits(mld_sma[1], DCTLINFO_V2_W8_MLD_SMA_1) |
+                 le32_encode_bits(mld_sma[2], DCTLINFO_V2_W8_MLD_SMA_2) |
+                 le32_encode_bits(mld_sma[3], DCTLINFO_V2_W8_MLD_SMA_3);
+       h2c->m8 = cpu_to_le32(DCTLINFO_V2_W8_ALL);
+
+       h2c->w9 = le32_encode_bits(mld_sma[4], DCTLINFO_V2_W9_MLD_SMA_4) |
+                 le32_encode_bits(mld_sma[5], DCTLINFO_V2_W9_MLD_SMA_5) |
+                 le32_encode_bits(mld_tma[0], DCTLINFO_V2_W9_MLD_TMA_0) |
+                 le32_encode_bits(mld_tma[1], DCTLINFO_V2_W9_MLD_TMA_1);
+       h2c->m9 = cpu_to_le32(DCTLINFO_V2_W9_ALL);
+
+       h2c->w10 = le32_encode_bits(mld_tma[2], DCTLINFO_V2_W10_MLD_TMA_2) |
+                  le32_encode_bits(mld_tma[3], DCTLINFO_V2_W10_MLD_TMA_3) |
+                  le32_encode_bits(mld_tma[4], DCTLINFO_V2_W10_MLD_TMA_4) |
+                  le32_encode_bits(mld_tma[5], DCTLINFO_V2_W10_MLD_TMA_5);
+       h2c->m10 = cpu_to_le32(DCTLINFO_V2_W10_ALL);
+
+       h2c->w11 = le32_encode_bits(mld_bssid[0], DCTLINFO_V2_W11_MLD_BSSID_0) |
+                  le32_encode_bits(mld_bssid[1], DCTLINFO_V2_W11_MLD_BSSID_1) |
+                  le32_encode_bits(mld_bssid[2], DCTLINFO_V2_W11_MLD_BSSID_2) |
+                  le32_encode_bits(mld_bssid[3], DCTLINFO_V2_W11_MLD_BSSID_3);
+       h2c->m11 = cpu_to_le32(DCTLINFO_V2_W11_ALL);
+
+       h2c->w12 = le32_encode_bits(mld_bssid[4], DCTLINFO_V2_W12_MLD_BSSID_4) |
+                  le32_encode_bits(mld_bssid[5], DCTLINFO_V2_W12_MLD_BSSID_5);
+       h2c->m12 = cpu_to_le32(DCTLINFO_V2_W12_ALL);
 }
index a6f72edd30fe3a54608fa419158cbfe45ff74799..3134ebf0882586668af3208f1934656b22b0b172 100644 (file)
@@ -514,16 +514,28 @@ struct rtw89_h2c_dctlinfo_ud_v2 {
 #define DCTLINFO_V2_W7_SEC_ENT7 GENMASK(23, 16)
 #define DCTLINFO_V2_W7_SEC_ENT8 GENMASK(31, 24)
 #define DCTLINFO_V2_W7_ALL GENMASK(31, 0)
-#define DCTLINFO_V2_W8_MLD_SMA_L_V1 GENMASK(31, 0)
+#define DCTLINFO_V2_W8_MLD_SMA_0 GENMASK(7, 0)
+#define DCTLINFO_V2_W8_MLD_SMA_1 GENMASK(15, 8)
+#define DCTLINFO_V2_W8_MLD_SMA_2 GENMASK(23, 16)
+#define DCTLINFO_V2_W8_MLD_SMA_3 GENMASK(31, 24)
 #define DCTLINFO_V2_W8_ALL GENMASK(31, 0)
-#define DCTLINFO_V2_W9_MLD_SMA_H_V1 GENMASK(15, 0)
-#define DCTLINFO_V2_W9_MLD_TMA_L_V1 GENMASK(31, 16)
+#define DCTLINFO_V2_W9_MLD_SMA_4 GENMASK(7, 0)
+#define DCTLINFO_V2_W9_MLD_SMA_5 GENMASK(15, 8)
+#define DCTLINFO_V2_W9_MLD_TMA_0 GENMASK(23, 16)
+#define DCTLINFO_V2_W9_MLD_TMA_1 GENMASK(31, 24)
 #define DCTLINFO_V2_W9_ALL GENMASK(31, 0)
-#define DCTLINFO_V2_W10_MLD_TMA_H_V1 GENMASK(31, 0)
+#define DCTLINFO_V2_W10_MLD_TMA_2 GENMASK(7, 0)
+#define DCTLINFO_V2_W10_MLD_TMA_3 GENMASK(15, 8)
+#define DCTLINFO_V2_W10_MLD_TMA_4 GENMASK(23, 16)
+#define DCTLINFO_V2_W10_MLD_TMA_5 GENMASK(31, 24)
 #define DCTLINFO_V2_W10_ALL GENMASK(31, 0)
-#define DCTLINFO_V2_W11_MLD_TA_BSSID_L_V1 GENMASK(31, 0)
+#define DCTLINFO_V2_W11_MLD_BSSID_0 GENMASK(7, 0)
+#define DCTLINFO_V2_W11_MLD_BSSID_1 GENMASK(15, 8)
+#define DCTLINFO_V2_W11_MLD_BSSID_2 GENMASK(23, 16)
+#define DCTLINFO_V2_W11_MLD_BSSID_3 GENMASK(31, 24)
 #define DCTLINFO_V2_W11_ALL GENMASK(31, 0)
-#define DCTLINFO_V2_W12_MLD_TA_BSSID_H_V1 GENMASK(15, 0)
+#define DCTLINFO_V2_W12_MLD_BSSID_4 GENMASK(7, 0)
+#define DCTLINFO_V2_W12_MLD_BSSID_5 GENMASK(15, 8)
 #define DCTLINFO_V2_W12_ALL GENMASK(15, 0)
 
 int rtw89_cam_init(struct rtw89_dev *rtwdev, struct rtw89_vif_link *vif);