All of lore.kernel.org
 help / color / mirror / Atom feed
From: igor.mitsyanko.os@quantenna.com
To: linux-wireless@vger.kernel.org
Cc: sergey.matyukevich.os@quantenna.com, avinashp@quantenna.com,
	johannes@sipsolutions.net,
	Igor Mitsyanko <igor.mitsyanko.os@quantenna.com>
Subject: [PATCH 27/27] qtnfmac: pass all CONNECT cmd params to wireless card for processing
Date: Thu, 24 Aug 2017 19:30:24 -0700	[thread overview]
Message-ID: <20170825023024.10565-28-igor.mitsyanko.os@quantenna.com> (raw)
In-Reply-To: <20170825023024.10565-1-igor.mitsyanko.os@quantenna.com>

From: Igor Mitsyanko <igor.mitsyanko.os@quantenna.com>

Specifically, following parameters are needed for wireless device
configuration but were not available to it before:
- HT/VHT capabilities and capabilities masks.
- full channel info (not just IEEE number)
- BSSID hint
- previous BSSID for reassoc request

Move Management Frame Protection setting from common encr info
structure into STA-specific .connect command parameters.

Make sure that all new qlink structure definitions are alignment-safe.

Signed-off-by: Igor Mitsyanko <igor.mitsyanko.os@quantenna.com>
---
 drivers/net/wireless/quantenna/qtnfmac/commands.c | 63 +++++++++++++++--------
 drivers/net/wireless/quantenna/qtnfmac/qlink.h    | 32 +++++++++---
 2 files changed, 65 insertions(+), 30 deletions(-)

diff --git a/drivers/net/wireless/quantenna/qtnfmac/commands.c b/drivers/net/wireless/quantenna/qtnfmac/commands.c
index dde2013..c8de438 100644
--- a/drivers/net/wireless/quantenna/qtnfmac/commands.c
+++ b/drivers/net/wireless/quantenna/qtnfmac/commands.c
@@ -221,7 +221,6 @@ int qtnf_cmd_send_start_ap(struct qtnf_vif *vif,
 	aen = &cmd->aen;
 	aen->auth_type = s->auth_type;
 	aen->privacy = !!s->privacy;
-	aen->mfp = 0;
 	aen->wpa_versions = cpu_to_le32(s->crypto.wpa_versions);
 	aen->cipher_group = cpu_to_le32(s->crypto.cipher_group);
 	aen->n_ciphers_pairwise = cpu_to_le32(s->crypto.n_ciphers_pairwise);
@@ -2027,17 +2026,36 @@ int qtnf_cmd_send_del_sta(struct qtnf_vif *vif,
 	return ret;
 }
 
+static void qtnf_cmd_channel_tlv_add(struct sk_buff *cmd_skb,
+				     const struct ieee80211_channel *sc)
+{
+	struct qlink_tlv_channel *qchan;
+	u32 flags = 0;
+
+	qchan = skb_put_zero(cmd_skb, sizeof(*qchan));
+	qchan->hdr.type = cpu_to_le16(QTN_TLV_ID_CHANNEL);
+	qchan->hdr.len = cpu_to_le16(sizeof(*qchan) - sizeof(qchan->hdr));
+	qchan->center_freq = cpu_to_le16(sc->center_freq);
+	qchan->hw_value = cpu_to_le16(sc->hw_value);
+
+	if (sc->flags & IEEE80211_CHAN_NO_IR)
+		flags |= QLINK_CHAN_NO_IR;
+
+	if (sc->flags & IEEE80211_CHAN_RADAR)
+		flags |= QLINK_CHAN_RADAR;
+
+	qchan->flags = cpu_to_le32(flags);
+}
+
 int qtnf_cmd_send_scan(struct qtnf_wmac *mac)
 {
 	struct sk_buff *cmd_skb;
 	u16 res_code = QLINK_CMD_RESULT_OK;
 	struct ieee80211_channel *sc;
 	struct cfg80211_scan_request *scan_req = mac->scan_req;
-	struct qlink_tlv_channel *qchan;
 	int n_channels;
 	int count = 0;
 	int ret;
-	u32 flags;
 
 	if (scan_req->n_ssids > QTNF_MAX_SSID_LIST_LENGTH) {
 		pr_err("MAC%u: too many SSIDs in scan request\n", mac->macid);
@@ -2079,22 +2097,8 @@ int qtnf_cmd_send_scan(struct qtnf_wmac *mac)
 			pr_debug("MAC%u: scan chan=%d, freq=%d, flags=%#x\n",
 				 mac->macid, sc->hw_value, sc->center_freq,
 				 sc->flags);
-			qchan = skb_put_zero(cmd_skb, sizeof(*qchan));
-			flags = 0;
-
-			qchan->hdr.type = cpu_to_le16(QTN_TLV_ID_CHANNEL);
-			qchan->hdr.len = cpu_to_le16(sizeof(*qchan) -
-					sizeof(struct qlink_tlv_hdr));
-			qchan->center_freq = cpu_to_le16(sc->center_freq);
-			qchan->hw_value = cpu_to_le16(sc->hw_value);
-
-			if (sc->flags & IEEE80211_CHAN_NO_IR)
-				flags |= QLINK_CHAN_NO_IR;
 
-			if (sc->flags & IEEE80211_CHAN_RADAR)
-				flags |= QLINK_CHAN_RADAR;
-
-			qchan->flags = cpu_to_le32(flags);
+			qtnf_cmd_channel_tlv_add(cmd_skb, sc);
 			n_channels--;
 			count++;
 		}
@@ -2138,10 +2142,15 @@ int qtnf_cmd_send_connect(struct qtnf_vif *vif,
 
 	ether_addr_copy(cmd->bssid, vif->bssid);
 
-	if (sme->channel)
-		cmd->channel = cpu_to_le16(sme->channel->hw_value);
+	if (sme->bssid_hint)
+		ether_addr_copy(cmd->bssid_hint, sme->bssid_hint);
 	else
-		cmd->channel = 0;
+		eth_zero_addr(cmd->bssid_hint);
+
+	if (sme->prev_bssid)
+		ether_addr_copy(cmd->prev_bssid, sme->prev_bssid);
+	else
+		eth_zero_addr(cmd->prev_bssid);
 
 	if ((sme->bg_scan_period > 0) &&
 	    (sme->bg_scan_period <= QTNF_MAX_BG_SCAN_PERIOD))
@@ -2159,11 +2168,18 @@ int qtnf_cmd_send_connect(struct qtnf_vif *vif,
 		connect_flags |= QLINK_STA_CONNECT_USE_RRM;
 
 	cmd->flags = cpu_to_le32(connect_flags);
+	memcpy(&cmd->ht_capa, &sme->ht_capa, sizeof(cmd->ht_capa));
+	memcpy(&cmd->ht_capa_mask, &sme->ht_capa_mask,
+	       sizeof(cmd->ht_capa_mask));
+	memcpy(&cmd->vht_capa, &sme->vht_capa, sizeof(cmd->vht_capa));
+	memcpy(&cmd->vht_capa_mask, &sme->vht_capa_mask,
+	       sizeof(cmd->vht_capa_mask));
+	cmd->pbss = sme->pbss;
 
 	aen = &cmd->aen;
 	aen->auth_type = sme->auth_type;
 	aen->privacy = !!sme->privacy;
-	aen->mfp = sme->mfp;
+	cmd->mfp = sme->mfp;
 	aen->wpa_versions = cpu_to_le32(sme->crypto.wpa_versions);
 	aen->cipher_group = cpu_to_le32(sme->crypto.cipher_group);
 	aen->n_ciphers_pairwise = cpu_to_le32(sme->crypto.n_ciphers_pairwise);
@@ -2190,6 +2206,9 @@ int qtnf_cmd_send_connect(struct qtnf_vif *vif,
 		qtnf_cmd_tlv_ie_set_add(cmd_skb, QLINK_IE_SET_ASSOC_REQ,
 					sme->ie, sme->ie_len);
 
+	if (sme->channel)
+		qtnf_cmd_channel_tlv_add(cmd_skb, sme->channel);
+
 	qtnf_bus_lock(vif->mac->bus);
 
 	ret = qtnf_cmd_send(vif->mac->bus, cmd_skb, &res_code);
diff --git a/drivers/net/wireless/quantenna/qtnfmac/qlink.h b/drivers/net/wireless/quantenna/qtnfmac/qlink.h
index 9a913b6..e45fc87 100644
--- a/drivers/net/wireless/quantenna/qtnfmac/qlink.h
+++ b/drivers/net/wireless/quantenna/qtnfmac/qlink.h
@@ -19,7 +19,7 @@
 
 #include <linux/ieee80211.h>
 
-#define QLINK_PROTO_VER		5
+#define QLINK_PROTO_VER		6
 
 #define QLINK_MACID_RSVD		0xFF
 #define QLINK_VIFID_RSVD		0xFF
@@ -139,9 +139,9 @@ struct qlink_auth_encr {
 	__le16 control_port_ethertype;
 	u8 auth_type;
 	u8 privacy;
-	u8 mfp;
 	u8 control_port;
 	u8 control_port_no_encrypt;
+	u8 rsvd[2];
 } __packed;
 
 /* QLINK Command messages related definitions
@@ -395,20 +395,36 @@ enum qlink_sta_connect_flags {
 /**
  * struct qlink_cmd_connect - data for QLINK_CMD_CONNECT command
  *
- * @flags: for future use.
- * @channel: channel which should be used to connect.
+ * @bssid: BSSID of the BSS to connect to.
+ * @bssid_hint: recommended AP BSSID for initial connection to the BSS or
+ *	00:00:00:00:00:00 if not specified.
+ * @prev_bssid: previous BSSID, if specified (not 00:00:00:00:00:00) indicates
+ *	a request to reassociate.
  * @bg_scan_period: period of background scan.
+ * @flags: one of &enum qlink_sta_connect_flags.
+ * @ht_capa: HT Capabilities overrides.
+ * @ht_capa_mask: The bits of ht_capa which are to be used.
+ * @vht_capa: VHT Capability overrides
+ * @vht_capa_mask: The bits of vht_capa which are to be used.
  * @aen: authentication information.
- * @bssid: BSSID of the BSS to connect to.
+ * @mfp: whether to use management frame protection.
  * @payload: variable portion of connection request.
  */
 struct qlink_cmd_connect {
 	struct qlink_cmd chdr;
-	__le32 flags;
-	__le16 channel;
+	u8 bssid[ETH_ALEN];
+	u8 bssid_hint[ETH_ALEN];
+	u8 prev_bssid[ETH_ALEN];
 	__le16 bg_scan_period;
+	__le32 flags;
+	struct ieee80211_ht_cap ht_capa;
+	struct ieee80211_ht_cap ht_capa_mask;
+	struct ieee80211_vht_cap vht_capa;
+	struct ieee80211_vht_cap vht_capa_mask;
 	struct qlink_auth_encr aen;
-	u8 bssid[ETH_ALEN];
+	u8 mfp;
+	u8 pbss;
+	u8 rsvd[2];
 	u8 payload[0];
 } __packed;
 
-- 
2.9.5

  parent reply	other threads:[~2017-08-25  2:31 UTC|newest]

Thread overview: 46+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-08-25  2:29 [PATCH 00/27] qtnfmac: allow to configure channel, BW, HT/VHT caps igor.mitsyanko.os
2017-08-25  2:29 ` [PATCH 01/27] qtnfmac: qlink: convert channel width from bitfiled to simple enum igor.mitsyanko.os
2017-08-25  2:29 ` [PATCH 02/27] qtnfmac: make "Channel change" event report full channel info igor.mitsyanko.os
2017-08-29 14:31   ` Sergey Matyukevich
2017-08-30  1:45     ` Igor Mitsyanko
2017-08-25  2:30 ` [PATCH 03/27] qtnfmac: retreive current channel info from EP igor.mitsyanko.os
2017-08-29 14:42   ` Sergey Matyukevich
2017-08-30  1:39     ` Igor Mitsyanko
2017-08-25  2:30 ` [PATCH 04/27] qtnfmac: do not cache AP settings in driver structures igor.mitsyanko.os
2017-08-25  2:30 ` [PATCH 05/27] qtnfmac: pass all AP settings to wireless card for processing igor.mitsyanko.os
2017-08-25  2:30 ` [PATCH 06/27] qtnfmac: pass full channel definition to device on start_ap command igor.mitsyanko.os
2017-08-30 14:02   ` Sergey Matyukevich
2017-08-25  2:30 ` [PATCH 07/27] qtnfmac: get rid of QTNF_STATE_AP_CONFIG igor.mitsyanko.os
2017-08-25  2:30 ` [PATCH 08/27] qtnfmac: get rid of QTNF_STATE_AP_START usage igor.mitsyanko.os
2017-08-25  2:30 ` [PATCH 09/27] qtnfmac: do not cache BSS state in per-VIF structure igor.mitsyanko.os
2017-08-25  2:30 ` [PATCH 10/27] qtnfmac: do not cache channel info from "connect" command igor.mitsyanko.os
2017-08-25  2:30 ` [PATCH 11/27] qtnfmac: make encryption info a part of " igor.mitsyanko.os
2017-08-25  2:30 ` [PATCH 12/27] qtnfmac: let wifi card handle channel switch request to the same chan igor.mitsyanko.os
2017-08-25  2:30 ` [PATCH 13/27] qtnfmac: pass VIF info to SendChannel command igor.mitsyanko.os
2017-08-25  2:30 ` [PATCH 14/27] qtnfmac: do not cache CSA chandef info igor.mitsyanko.os
2017-08-29 15:44   ` Sergey Matyukevich
2017-08-30  1:48     ` Igor Mitsyanko
2017-08-30  8:05       ` Sergey Matyukevich
2017-08-25  2:30 ` [PATCH 15/27] qtnfmac: remove unused mac::status field igor.mitsyanko.os
2017-08-29 15:47   ` Sergey Matyukevich
2017-08-25  2:30 ` [PATCH 16/27] qtnfmac: stop using private driver info about current channel igor.mitsyanko.os
2017-08-25  2:30 ` [PATCH 17/27] qtnfmac: do not report channel changes until wiphy is registered igor.mitsyanko.os
2017-08-25  2:30 ` [PATCH 18/27] qtnfmac: use per-band HT/VHT info from wireless device igor.mitsyanko.os
2017-08-25  2:30 ` [PATCH 19/27] qtnfmac: initialize HT/VHT caps "can override" masks igor.mitsyanko.os
2017-08-25  2:30 ` [PATCH 20/27] qtnfmac: get rid of PHYMODE capabilities flags igor.mitsyanko.os
2017-08-25  2:30 ` [PATCH 21/27] qtnfmac: extend "IE set" TLV to include frame type info igor.mitsyanko.os
2017-08-30 12:07   ` Sergey Matyukevich
2017-08-30 12:20     ` Sergey Matyukevich
2017-08-25  2:30 ` [PATCH 22/27] qtnfmac: SCAN results: retreive frame type information from "IE set" TLV igor.mitsyanko.os
2017-08-25  2:30 ` [PATCH 23/27] qtnfmac: convert "Append IEs" command to QTN_TLV_ID_IE_SET usage igor.mitsyanko.os
2017-08-30 12:35   ` Sergey Matyukevich
2017-08-25  2:30 ` [PATCH 24/27] qtnfmac: configure and start AP interface with a single command igor.mitsyanko.os
2017-08-30 13:07   ` Sergey Matyukevich
2017-08-25  2:30 ` [PATCH 25/27] nl80211: look for HT/VHT capabilities in beacon's tail igor.mitsyanko.os
2017-08-25  2:30 ` [PATCH 26/27] qtnfmac: include HTCAP and VHTCAP into config AP command igor.mitsyanko.os
2017-08-25  2:30 ` igor.mitsyanko.os [this message]
2017-08-30 16:16 ` [PATCH 00/27] qtnfmac: allow to configure channel, BW, HT/VHT caps Kalle Valo
2017-08-30 16:22   ` Kalle Valo
2017-08-30 16:28     ` Kalle Valo
2017-08-30 18:22       ` Igor Mitsyanko
2017-08-30 18:20   ` Igor Mitsyanko

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20170825023024.10565-28-igor.mitsyanko.os@quantenna.com \
    --to=igor.mitsyanko.os@quantenna.com \
    --cc=avinashp@quantenna.com \
    --cc=johannes@sipsolutions.net \
    --cc=linux-wireless@vger.kernel.org \
    --cc=sergey.matyukevich.os@quantenna.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.