Skip to content

Commit c39eed4

Browse files
Po-Hao HuangPing-Ke Shih
authored andcommitted
wifi: rtw89: Add encryption support for MLO connections
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 <[email protected]> Signed-off-by: Ping-Ke Shih <[email protected]> Link: https://patch.msgid.link/[email protected]
1 parent b849966 commit c39eed4

File tree

2 files changed

+69
-6
lines changed

2 files changed

+69
-6
lines changed

drivers/net/wireless/realtek/rtw89/cam.c

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -961,16 +961,24 @@ void rtw89_cam_fill_dctl_sec_cam_info_v2(struct rtw89_dev *rtwdev,
961961
struct rtw89_sta_link *rtwsta_link,
962962
struct rtw89_h2c_dctlinfo_ud_v2 *h2c)
963963
{
964+
struct ieee80211_sta *sta = rtwsta_link_to_sta_safe(rtwsta_link);
965+
struct ieee80211_vif *vif = rtwvif_to_vif(rtwvif_link->rtwvif);
966+
struct rtw89_vif *rtwvif = rtwvif_link->rtwvif;
964967
struct rtw89_addr_cam_entry *addr_cam =
965968
rtw89_get_addr_cam_of(rtwvif_link, rtwsta_link);
969+
bool is_mld = sta ? sta->mlo : ieee80211_vif_is_mld(vif);
966970
struct rtw89_wow_param *rtw_wow = &rtwdev->wow;
967971
u8 *ptk_tx_iv = rtw_wow->key_info.ptk_tx_iv;
972+
u8 *mld_sma, *mld_tma, *mld_bssid;
968973

969974
h2c->c0 = le32_encode_bits(rtwsta_link ? rtwsta_link->mac_id :
970975
rtwvif_link->mac_id,
971976
DCTLINFO_V2_C0_MACID) |
972977
le32_encode_bits(1, DCTLINFO_V2_C0_OP);
973978

979+
h2c->w2 = le32_encode_bits(is_mld, DCTLINFO_V2_W2_IS_MLD);
980+
h2c->m2 = cpu_to_le32(DCTLINFO_V2_W2_IS_MLD);
981+
974982
h2c->w4 = le32_encode_bits(addr_cam->sec_ent_keyid[0],
975983
DCTLINFO_V2_W4_SEC_ENT0_KEYID) |
976984
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,
10361044
DCTLINFO_V2_W4_SEC_KEY_ID);
10371045
h2c->m4 |= cpu_to_le32(DCTLINFO_V2_W4_SEC_KEY_ID);
10381046
}
1047+
1048+
if (!is_mld)
1049+
return;
1050+
1051+
if (rtwvif_link->net_type == RTW89_NET_TYPE_INFRA) {
1052+
mld_sma = rtwvif->mac_addr;
1053+
mld_tma = vif->cfg.ap_addr;
1054+
mld_bssid = vif->cfg.ap_addr;
1055+
} else if (rtwvif_link->net_type == RTW89_NET_TYPE_AP_MODE && sta) {
1056+
mld_sma = rtwvif->mac_addr;
1057+
mld_tma = sta->addr;
1058+
mld_bssid = rtwvif->mac_addr;
1059+
} else {
1060+
return;
1061+
}
1062+
1063+
h2c->w8 = le32_encode_bits(mld_sma[0], DCTLINFO_V2_W8_MLD_SMA_0) |
1064+
le32_encode_bits(mld_sma[1], DCTLINFO_V2_W8_MLD_SMA_1) |
1065+
le32_encode_bits(mld_sma[2], DCTLINFO_V2_W8_MLD_SMA_2) |
1066+
le32_encode_bits(mld_sma[3], DCTLINFO_V2_W8_MLD_SMA_3);
1067+
h2c->m8 = cpu_to_le32(DCTLINFO_V2_W8_ALL);
1068+
1069+
h2c->w9 = le32_encode_bits(mld_sma[4], DCTLINFO_V2_W9_MLD_SMA_4) |
1070+
le32_encode_bits(mld_sma[5], DCTLINFO_V2_W9_MLD_SMA_5) |
1071+
le32_encode_bits(mld_tma[0], DCTLINFO_V2_W9_MLD_TMA_0) |
1072+
le32_encode_bits(mld_tma[1], DCTLINFO_V2_W9_MLD_TMA_1);
1073+
h2c->m9 = cpu_to_le32(DCTLINFO_V2_W9_ALL);
1074+
1075+
h2c->w10 = le32_encode_bits(mld_tma[2], DCTLINFO_V2_W10_MLD_TMA_2) |
1076+
le32_encode_bits(mld_tma[3], DCTLINFO_V2_W10_MLD_TMA_3) |
1077+
le32_encode_bits(mld_tma[4], DCTLINFO_V2_W10_MLD_TMA_4) |
1078+
le32_encode_bits(mld_tma[5], DCTLINFO_V2_W10_MLD_TMA_5);
1079+
h2c->m10 = cpu_to_le32(DCTLINFO_V2_W10_ALL);
1080+
1081+
h2c->w11 = le32_encode_bits(mld_bssid[0], DCTLINFO_V2_W11_MLD_BSSID_0) |
1082+
le32_encode_bits(mld_bssid[1], DCTLINFO_V2_W11_MLD_BSSID_1) |
1083+
le32_encode_bits(mld_bssid[2], DCTLINFO_V2_W11_MLD_BSSID_2) |
1084+
le32_encode_bits(mld_bssid[3], DCTLINFO_V2_W11_MLD_BSSID_3);
1085+
h2c->m11 = cpu_to_le32(DCTLINFO_V2_W11_ALL);
1086+
1087+
h2c->w12 = le32_encode_bits(mld_bssid[4], DCTLINFO_V2_W12_MLD_BSSID_4) |
1088+
le32_encode_bits(mld_bssid[5], DCTLINFO_V2_W12_MLD_BSSID_5);
1089+
h2c->m12 = cpu_to_le32(DCTLINFO_V2_W12_ALL);
10391090
}

drivers/net/wireless/realtek/rtw89/cam.h

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -514,16 +514,28 @@ struct rtw89_h2c_dctlinfo_ud_v2 {
514514
#define DCTLINFO_V2_W7_SEC_ENT7 GENMASK(23, 16)
515515
#define DCTLINFO_V2_W7_SEC_ENT8 GENMASK(31, 24)
516516
#define DCTLINFO_V2_W7_ALL GENMASK(31, 0)
517-
#define DCTLINFO_V2_W8_MLD_SMA_L_V1 GENMASK(31, 0)
517+
#define DCTLINFO_V2_W8_MLD_SMA_0 GENMASK(7, 0)
518+
#define DCTLINFO_V2_W8_MLD_SMA_1 GENMASK(15, 8)
519+
#define DCTLINFO_V2_W8_MLD_SMA_2 GENMASK(23, 16)
520+
#define DCTLINFO_V2_W8_MLD_SMA_3 GENMASK(31, 24)
518521
#define DCTLINFO_V2_W8_ALL GENMASK(31, 0)
519-
#define DCTLINFO_V2_W9_MLD_SMA_H_V1 GENMASK(15, 0)
520-
#define DCTLINFO_V2_W9_MLD_TMA_L_V1 GENMASK(31, 16)
522+
#define DCTLINFO_V2_W9_MLD_SMA_4 GENMASK(7, 0)
523+
#define DCTLINFO_V2_W9_MLD_SMA_5 GENMASK(15, 8)
524+
#define DCTLINFO_V2_W9_MLD_TMA_0 GENMASK(23, 16)
525+
#define DCTLINFO_V2_W9_MLD_TMA_1 GENMASK(31, 24)
521526
#define DCTLINFO_V2_W9_ALL GENMASK(31, 0)
522-
#define DCTLINFO_V2_W10_MLD_TMA_H_V1 GENMASK(31, 0)
527+
#define DCTLINFO_V2_W10_MLD_TMA_2 GENMASK(7, 0)
528+
#define DCTLINFO_V2_W10_MLD_TMA_3 GENMASK(15, 8)
529+
#define DCTLINFO_V2_W10_MLD_TMA_4 GENMASK(23, 16)
530+
#define DCTLINFO_V2_W10_MLD_TMA_5 GENMASK(31, 24)
523531
#define DCTLINFO_V2_W10_ALL GENMASK(31, 0)
524-
#define DCTLINFO_V2_W11_MLD_TA_BSSID_L_V1 GENMASK(31, 0)
532+
#define DCTLINFO_V2_W11_MLD_BSSID_0 GENMASK(7, 0)
533+
#define DCTLINFO_V2_W11_MLD_BSSID_1 GENMASK(15, 8)
534+
#define DCTLINFO_V2_W11_MLD_BSSID_2 GENMASK(23, 16)
535+
#define DCTLINFO_V2_W11_MLD_BSSID_3 GENMASK(31, 24)
525536
#define DCTLINFO_V2_W11_ALL GENMASK(31, 0)
526-
#define DCTLINFO_V2_W12_MLD_TA_BSSID_H_V1 GENMASK(15, 0)
537+
#define DCTLINFO_V2_W12_MLD_BSSID_4 GENMASK(7, 0)
538+
#define DCTLINFO_V2_W12_MLD_BSSID_5 GENMASK(15, 8)
527539
#define DCTLINFO_V2_W12_ALL GENMASK(15, 0)
528540

529541
int rtw89_cam_init(struct rtw89_dev *rtwdev, struct rtw89_vif_link *vif);

0 commit comments

Comments
 (0)