possible fix for broken cmac crypto support

From: Sebastian Gottschall
Date: Mon Jun 10 2019 - 01:15:41 EST


this is no real patch for this mailing list since i havent cloned yet a git tree. take it as a hint
this fixes the BUG WARN if SAE encryption is used (mandatory for mesh / 802.11s crypto)
that will not fix that mesh is not working (likelly just with other vendors), but it will fix crypto at least

Sebastian

Index: main.c
===================================================================
--- main.cÂÂÂÂÂ (revision 4584)
+++ main.cÂÂÂÂÂ (revision 4585)
@@ -180,6 +180,20 @@ static int mt7615_set_key(struct ieee80211_hw *hw,
ÂÂÂÂÂÂÂÂÂÂÂ !(key->flags & IEEE80211_KEY_FLAG_PAIRWISE))
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ return -EOPNOTSUPP;

+ÂÂÂÂÂÂ switch (key->cipher) {
+ÂÂÂÂÂÂ case WLAN_CIPHER_SUITE_WEP40:
+ÂÂÂÂÂÂ case WLAN_CIPHER_SUITE_WEP104:
+ÂÂÂÂÂÂ case WLAN_CIPHER_SUITE_TKIP:
+ÂÂÂÂÂÂ case WLAN_CIPHER_SUITE_CCMP:
+ÂÂÂÂÂÂ case WLAN_CIPHER_SUITE_CCMP_256:
+ÂÂÂÂÂÂ case WLAN_CIPHER_SUITE_GCMP:
+ÂÂÂÂÂÂ case WLAN_CIPHER_SUITE_GCMP_256:
+ÂÂÂÂÂÂ case WLAN_CIPHER_SUITE_SMS4:
+ÂÂÂÂÂÂÂÂÂÂÂÂÂÂ break;
+ÂÂÂÂÂÂ default:
+ÂÂÂÂÂÂÂÂÂÂÂÂÂÂ return -EOPNOTSUPP;
+ÂÂÂÂÂÂ }
+
ÂÂÂÂÂÂÂ if (cmd == SET_KEY) {
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ key->hw_key_idx = wcid->idx;
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ wcid->hw_key_idx = idx;

Am 09.06.2019 um 16:36 schrieb Sebastian Gottschall:
by the way. this big fat kernel warning exists in all operation modes unless anything else but aes-128 ccmp is used. since the chipset is capable of doing gcmp etc. as well
it would be nice if this issue can be fixed. otherwise encryption support can be defined as "broken" for mt7615

Am 06.06.2019 um 18:19 schrieb Lorenzo Bianconi:
i tested your patch against a qca 9984 chipset using SAE and without
encryption. both did not work. the devices are connecting, but no data
connection is possible
Hi Sebastian,

I tested Ryder's patch using mt76x2 as mesh peer and it works fine for me.
Could you please provide some more info?

Regards,
Lorenzo


Sebastian

Am 03.06.2019 um 08:08 schrieb Ryder Lee:
Enable NL80211_IFTYPE_MESH_POINT and update its path.

Signed-off-by: Ryder Lee <ryder.lee@xxxxxxxxxxxx>
---
Changes since v3 - fix a wrong expression
Changes since v2 - remove unused definitions
---
ÂÂ drivers/net/wireless/mediatek/mt76/mt7615/init.c | 6 ++++++
ÂÂ drivers/net/wireless/mediatek/mt76/mt7615/main.c | 1 +
 drivers/net/wireless/mediatek/mt76/mt7615/mcu.c | 4 +++-
 drivers/net/wireless/mediatek/mt76/mt7615/mcu.h | 6 ------
ÂÂ 4 files changed, 10 insertions(+), 7 deletions(-)

diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/init.c b/drivers/net/wireless/mediatek/mt76/mt7615/init.c
index 59f604f3161f..f860af6a42da 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7615/init.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7615/init.c
@@ -133,6 +133,9 @@ static const struct ieee80211_iface_limit if_limits[] = {
ÂÂÂÂÂÂ {
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂ .max = MT7615_MAX_INTERFACES,
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂ .types = BIT(NL80211_IFTYPE_AP) |
+#ifdef CONFIG_MAC80211_MESH
+ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ BIT(NL80211_IFTYPE_MESH_POINT) |
+#endif
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ BIT(NL80211_IFTYPE_STATION)
ÂÂÂÂÂÂ }
ÂÂ };
@@ -195,6 +198,9 @@ int mt7615_register_device(struct mt7615_dev *dev)
ÂÂÂÂÂÂ dev->mt76.antenna_mask = 0xf;

ÂÂÂÂÂÂ wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
+#ifdef CONFIG_MAC80211_MESH
+ BIT(NL80211_IFTYPE_MESH_POINT) |
+#endif
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ BIT(NL80211_IFTYPE_AP);

ÂÂÂÂÂÂ ret = mt76_register_device(&dev->mt76, true, mt7615_rates,
diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/main.c b/drivers/net/wireless/mediatek/mt76/mt7615/main.c
index b0bb7cc12385..585e67fa2728 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7615/main.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7615/main.c
@@ -37,6 +37,7 @@ static int get_omac_idx(enum nl80211_iftype type, u32 mask)

ÂÂÂÂÂÂ switch (type) {
ÂÂÂÂÂÂ case NL80211_IFTYPE_AP:
+ÂÂÂÂ case NL80211_IFTYPE_MESH_POINT:
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂ /* ap use hw bssid 0 and ext bssid */
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂ if (~mask & BIT(HW_BSSID_0))
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ return HW_BSSID_0;
diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7615/mcu.c
index 43f70195244c..e82297048449 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7615/mcu.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7615/mcu.c
@@ -754,6 +754,7 @@ int mt7615_mcu_set_bss_info(struct mt7615_dev *dev,

ÂÂÂÂÂÂ switch (vif->type) {
ÂÂÂÂÂÂ case NL80211_IFTYPE_AP:
+ÂÂÂÂ case NL80211_IFTYPE_MESH_POINT:
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂ tx_wlan_idx = mvif->sta.wcid.idx;
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂ conn_type = CONNECTION_INFRA_AP;
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂ break;
@@ -968,7 +969,7 @@ int mt7615_mcu_add_wtbl(struct mt7615_dev *dev, struct ieee80211_vif *vif,
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂ .rx_wtbl = {
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ .tag = cpu_to_le16(WTBL_RX),
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ .len = cpu_to_le16(sizeof(struct wtbl_rx)),
-ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ .rca1 = vif->type != NL80211_IFTYPE_AP,
+ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ .rca1 = vif->type == NL80211_IFTYPE_STATION,
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ .rca2 = 1,
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ .rv = 1,
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂ },
@@ -1042,6 +1043,7 @@ static void sta_rec_convert_vif_type(enum nl80211_iftype type, u32 *conn_type)
ÂÂ {
ÂÂÂÂÂÂ switch (type) {
ÂÂÂÂÂÂ case NL80211_IFTYPE_AP:
+ÂÂÂÂ case NL80211_IFTYPE_MESH_POINT:
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂ if (conn_type)
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ *conn_type = CONNECTION_INFRA_STA;
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂ break;
diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/mcu.h b/drivers/net/wireless/mediatek/mt76/mt7615/mcu.h
index e96efb13fa4d..0915cb735699 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7615/mcu.h
+++ b/drivers/net/wireless/mediatek/mt76/mt7615/mcu.h
@@ -105,25 +105,19 @@ enum {
ÂÂ #define STA_TYPE_STAÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ BIT(0)
ÂÂ #define STA_TYPE_APÂÂÂÂÂÂÂÂ BIT(1)
ÂÂ #define STA_TYPE_ADHOCÂÂÂÂÂÂÂÂÂÂÂÂÂ BIT(2)
-#define STA_TYPE_TDLSÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ BIT(3)
ÂÂ #define STA_TYPE_WDSÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ BIT(4)
ÂÂ #define STA_TYPE_BCÂÂÂÂÂÂÂÂ BIT(5)

ÂÂ #define NETWORK_INFRAÂÂÂÂÂÂÂÂÂÂÂÂÂÂ BIT(16)
ÂÂ #define NETWORK_P2PÂÂÂÂÂÂÂÂ BIT(17)
ÂÂ #define NETWORK_IBSSÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ BIT(18)
-#define NETWORK_MESHÂÂÂÂÂÂÂÂ BIT(19)
-#define NETWORK_BOWÂÂÂÂÂÂÂÂÂ BIT(20)
ÂÂ #define NETWORK_WDSÂÂÂÂÂÂÂÂ BIT(21)

ÂÂ #define CONNECTION_INFRA_STAÂÂÂÂÂÂÂ (STA_TYPE_STA | NETWORK_INFRA)
ÂÂ #define CONNECTION_INFRA_AP (STA_TYPE_AP | NETWORK_INFRA)
ÂÂ #define CONNECTION_P2P_GCÂÂ (STA_TYPE_STA | NETWORK_P2P)
ÂÂ #define CONNECTION_P2P_GOÂÂ (STA_TYPE_AP | NETWORK_P2P)
-#define CONNECTION_MESH_STAÂ (STA_TYPE_STA | NETWORK_MESH)
-#define CONNECTION_MESH_APÂÂ (STA_TYPE_AP | NETWORK_MESH)
ÂÂ #define CONNECTION_IBSS_ADHOCÂÂÂÂÂÂ (STA_TYPE_ADHOC | NETWORK_IBSS)
-#define CONNECTION_TDLSÂÂÂÂÂÂÂÂÂÂÂÂÂ (STA_TYPE_STA | NETWORK_INFRA | STA_TYPE_TDLS)
ÂÂ #define CONNECTION_WDSÂÂÂÂÂÂÂÂÂÂÂÂÂ (STA_TYPE_WDS | NETWORK_WDS)
ÂÂ #define CONNECTION_INFRA_BC (STA_TYPE_BC | NETWORK_INFRA)