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 24/27] qtnfmac: configure and start AP interface with a single command
Date: Thu, 24 Aug 2017 19:30:21 -0700	[thread overview]
Message-ID: <20170825023024.10565-25-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>

Current logic artificially divides "start AP" procedure into three
stages:
- generic interface configuration (security, channel etc)
- IE's processing
- enable AP mode on interface

This separation would not allow to do a proper device configuration as
first stage needs to use information from IEs that are processed on
a second stage. Which means first and second stages have to be meged.
In that case there is no point anymore to keep third stage either, so
merge all three into a single command.

This new command carries all the same info as contained in
"struct cfg80211_ap_settings".

Signed-off-by: Igor Mitsyanko <igor.mitsyanko.os@quantenna.com>
---
 drivers/net/wireless/quantenna/qtnfmac/cfg80211.c | 17 +-----
 drivers/net/wireless/quantenna/qtnfmac/commands.c | 72 +++++++++++++----------
 drivers/net/wireless/quantenna/qtnfmac/commands.h |  5 +-
 drivers/net/wireless/quantenna/qtnfmac/qlink.h    |  5 +-
 4 files changed, 47 insertions(+), 52 deletions(-)

diff --git a/drivers/net/wireless/quantenna/qtnfmac/cfg80211.c b/drivers/net/wireless/quantenna/qtnfmac/cfg80211.c
index 2497493..d6ddb4d 100644
--- a/drivers/net/wireless/quantenna/qtnfmac/cfg80211.c
+++ b/drivers/net/wireless/quantenna/qtnfmac/cfg80211.c
@@ -266,26 +266,11 @@ static int qtnf_start_ap(struct wiphy *wiphy, struct net_device *dev,
 	struct qtnf_vif *vif = qtnf_netdev_get_priv(dev);
 	int ret;
 
-	ret = qtnf_cmd_send_config_ap(vif, settings);
-	if (ret) {
-		pr_err("VIF%u.%u: failed to push config to FW\n",
-		       vif->mac->macid, vif->vifid);
-		goto out;
-	}
-
-	ret = qtnf_mgmt_set_appie(vif, &settings->beacon);
-	if (ret) {
-		pr_err("VIF%u.%u: failed to add IEs to beacon\n",
-		       vif->mac->macid, vif->vifid);
-		goto out;
-	}
-
-	ret = qtnf_cmd_send_start_ap(vif);
+	ret = qtnf_cmd_send_start_ap(vif, settings);
 	if (ret)
 		pr_err("VIF%u.%u: failed to start AP\n", vif->mac->macid,
 		       vif->vifid);
 
-out:
 	return ret;
 }
 
diff --git a/drivers/net/wireless/quantenna/qtnfmac/commands.c b/drivers/net/wireless/quantenna/qtnfmac/commands.c
index 2e30c26..1965061 100644
--- a/drivers/net/wireless/quantenna/qtnfmac/commands.c
+++ b/drivers/net/wireless/quantenna/qtnfmac/commands.c
@@ -162,56 +162,51 @@ static void qtnf_cmd_tlv_ie_set_add(struct sk_buff *cmd_skb, u8 frame_type,
 		memcpy(tlv->ie_data, buf, len);
 }
 
-int qtnf_cmd_send_start_ap(struct qtnf_vif *vif)
+static bool qtnf_cmd_start_ap_can_fit(const struct qtnf_vif *vif,
+				      const struct cfg80211_ap_settings *s)
 {
-	struct sk_buff *cmd_skb;
-	u16 res_code = QLINK_CMD_RESULT_OK;
-	int ret;
+	unsigned int len = sizeof(struct qlink_cmd_start_ap);
 
-	cmd_skb = qtnf_cmd_alloc_new_cmdskb(vif->mac->macid, vif->vifid,
-					    QLINK_CMD_START_AP,
-					    sizeof(struct qlink_cmd));
-	if (unlikely(!cmd_skb))
-		return -ENOMEM;
+	len += s->ssid_len;
+	len += s->beacon.head_len;
+	len += s->beacon.tail_len;
+	len += s->beacon.beacon_ies_len;
+	len += s->beacon.proberesp_ies_len;
+	len += s->beacon.assocresp_ies_len;
+	len += s->beacon.probe_resp_len;
 
-	qtnf_bus_lock(vif->mac->bus);
-
-	ret = qtnf_cmd_send(vif->mac->bus, cmd_skb, &res_code);
+	if (cfg80211_chandef_valid(&s->chandef))
+		len += sizeof(struct qlink_tlv_chandef);
 
-	if (unlikely(ret))
-		goto out;
-
-	if (unlikely(res_code != QLINK_CMD_RESULT_OK)) {
-		pr_err("VIF%u.%u: CMD failed: %u\n", vif->mac->macid,
-		       vif->vifid, res_code);
-		ret = -EFAULT;
-		goto out;
+	if (len > (sizeof(struct qlink_cmd) + QTNF_MAX_CMD_BUF_SIZE)) {
+		pr_err("VIF%u.%u: can not fit AP settings: %u\n",
+		       vif->mac->macid, vif->vifid, len);
+		return false;
 	}
 
-	netif_carrier_on(vif->netdev);
-
-out:
-	qtnf_bus_unlock(vif->mac->bus);
-	return ret;
+	return true;
 }
 
-int qtnf_cmd_send_config_ap(struct qtnf_vif *vif,
-			    const struct cfg80211_ap_settings *s)
+int qtnf_cmd_send_start_ap(struct qtnf_vif *vif,
+			   const struct cfg80211_ap_settings *s)
 {
 	struct sk_buff *cmd_skb;
-	struct qlink_cmd_config_ap *cmd;
+	struct qlink_cmd_start_ap *cmd;
 	struct qlink_auth_encr *aen;
 	u16 res_code = QLINK_CMD_RESULT_OK;
 	int ret;
 	int i;
 
+	if (!qtnf_cmd_start_ap_can_fit(vif, s))
+		return -E2BIG;
+
 	cmd_skb = qtnf_cmd_alloc_new_cmdskb(vif->mac->macid, vif->vifid,
-					    QLINK_CMD_CONFIG_AP,
+					    QLINK_CMD_START_AP,
 					    sizeof(*cmd));
 	if (unlikely(!cmd_skb))
 		return -ENOMEM;
 
-	cmd = (struct qlink_cmd_config_ap *)cmd_skb->data;
+	cmd = (struct qlink_cmd_start_ap *)cmd_skb->data;
 	cmd->dtim_period = s->dtim_period;
 	cmd->beacon_interval = cpu_to_le16(s->beacon_interval);
 	cmd->hidden_ssid = qlink_hidden_ssid_nl2q(s->hidden_ssid);
@@ -255,6 +250,21 @@ int qtnf_cmd_send_config_ap(struct qtnf_vif *vif,
 		qlink_chandef_cfg2q(&s->chandef, &chtlv->chan);
 	}
 
+	qtnf_cmd_tlv_ie_set_add(cmd_skb, QLINK_IE_SET_BEACON_HEAD,
+				s->beacon.head, s->beacon.head_len);
+	qtnf_cmd_tlv_ie_set_add(cmd_skb, QLINK_IE_SET_BEACON_TAIL,
+				s->beacon.tail, s->beacon.tail_len);
+	qtnf_cmd_tlv_ie_set_add(cmd_skb, QLINK_IE_SET_BEACON_IES,
+				s->beacon.beacon_ies, s->beacon.beacon_ies_len);
+	qtnf_cmd_tlv_ie_set_add(cmd_skb, QLINK_IE_SET_PROBE_RESP,
+				s->beacon.probe_resp, s->beacon.probe_resp_len);
+	qtnf_cmd_tlv_ie_set_add(cmd_skb, QLINK_IE_SET_PROBE_RESP_IES,
+				s->beacon.proberesp_ies,
+				s->beacon.proberesp_ies_len);
+	qtnf_cmd_tlv_ie_set_add(cmd_skb, QLINK_IE_SET_ASSOC_RESP,
+				s->beacon.assocresp_ies,
+				s->beacon.assocresp_ies_len);
+
 	qtnf_bus_lock(vif->mac->bus);
 
 	ret = qtnf_cmd_send(vif->mac->bus, cmd_skb, &res_code);
@@ -269,6 +279,8 @@ int qtnf_cmd_send_config_ap(struct qtnf_vif *vif,
 		goto out;
 	}
 
+	netif_carrier_on(vif->netdev);
+
 out:
 	qtnf_bus_unlock(vif->mac->bus);
 	return ret;
diff --git a/drivers/net/wireless/quantenna/qtnfmac/commands.h b/drivers/net/wireless/quantenna/qtnfmac/commands.h
index d6fe3cc..d981a76 100644
--- a/drivers/net/wireless/quantenna/qtnfmac/commands.h
+++ b/drivers/net/wireless/quantenna/qtnfmac/commands.h
@@ -33,9 +33,8 @@ int qtnf_cmd_send_del_intf(struct qtnf_vif *vif);
 int qtnf_cmd_band_info_get(struct qtnf_wmac *mac,
 			   struct ieee80211_supported_band *band);
 int qtnf_cmd_send_regulatory_config(struct qtnf_wmac *mac, const char *alpha2);
-int qtnf_cmd_send_config_ap(struct qtnf_vif *vif,
-			    const struct cfg80211_ap_settings *s);
-int qtnf_cmd_send_start_ap(struct qtnf_vif *vif);
+int qtnf_cmd_send_start_ap(struct qtnf_vif *vif,
+			   const struct cfg80211_ap_settings *s);
 int qtnf_cmd_send_stop_ap(struct qtnf_vif *vif);
 int qtnf_cmd_send_register_mgmt(struct qtnf_vif *vif, u16 frame_type, bool reg);
 int qtnf_cmd_send_mgmt_frame(struct qtnf_vif *vif, u32 cookie, u16 flags,
diff --git a/drivers/net/wireless/quantenna/qtnfmac/qlink.h b/drivers/net/wireless/quantenna/qtnfmac/qlink.h
index eba73fd..9a913b6 100644
--- a/drivers/net/wireless/quantenna/qtnfmac/qlink.h
+++ b/drivers/net/wireless/quantenna/qtnfmac/qlink.h
@@ -183,7 +183,6 @@ enum qlink_cmd_type {
 	QLINK_CMD_BAND_INFO_GET		= 0x001A,
 	QLINK_CMD_CHAN_SWITCH		= 0x001B,
 	QLINK_CMD_CHAN_GET		= 0x001C,
-	QLINK_CMD_CONFIG_AP		= 0x0020,
 	QLINK_CMD_START_AP		= 0x0021,
 	QLINK_CMD_STOP_AP		= 0x0022,
 	QLINK_CMD_GET_STA_INFO		= 0x0030,
@@ -533,7 +532,7 @@ enum qlink_hidden_ssid {
 };
 
 /**
- * struct qlink_cmd_config_ap - data for QLINK_CMD_CONFIG_AP command
+ * struct qlink_cmd_start_ap - data for QLINK_CMD_START_AP command
  *
  * @beacon_interval: beacon interval
  * @inactivity_timeout: station's inactivity period in seconds
@@ -545,7 +544,7 @@ enum qlink_hidden_ssid {
  * @aen: encryption info
  * @info: variable configurations
  */
-struct qlink_cmd_config_ap {
+struct qlink_cmd_start_ap {
 	struct qlink_cmd chdr;
 	__le16 beacon_interval;
 	__le16 inactivity_timeout;
-- 
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 ` igor.mitsyanko.os [this message]
2017-08-30 13:07   ` [PATCH 24/27] qtnfmac: configure and start AP interface with a single command 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 ` [PATCH 27/27] qtnfmac: pass all CONNECT cmd params to wireless card for processing igor.mitsyanko.os
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-25-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.