HE: Add support for noack configuration in WCN driver
noack parameter present in sta_preset_parameters was not being
honored for WCN driver. This commit adds the support for honoring
the same.
Signed-off-by: Jouni Malinen <jouni@codeaurora.org>
diff --git a/sta.c b/sta.c
index 704c046..e0ae341 100644
--- a/sta.c
+++ b/sta.c
@@ -3619,6 +3619,7 @@
#ifdef NL80211_SUPPORT
+
static int sta_set_he_fragmentation(struct sigma_dut *dut, const char *intf,
enum he_fragmentation_val frag)
{
@@ -3661,6 +3662,78 @@
}
return ret;
}
+
+
+static int nlvendor_sta_set_noack(struct sigma_dut *dut, const char *intf,
+ int noack, enum qca_wlan_ac_type ac)
+{
+ struct nl_msg *msg;
+ int ret = 0;
+ struct nlattr *params;
+ int ifindex;
+
+ ifindex = if_nametoindex(intf);
+ if (ifindex == 0) {
+ sigma_dut_print(dut, DUT_MSG_ERROR,
+ "%s: Index for interface %s failed",
+ __func__, intf);
+ return -1;
+ }
+
+ if (!(msg = nl80211_drv_msg(dut, dut->nl_ctx, ifindex, 0,
+ NL80211_CMD_VENDOR)) ||
+ nla_put_u32(msg, NL80211_ATTR_IFINDEX, ifindex) ||
+ nla_put_u32(msg, NL80211_ATTR_VENDOR_ID, OUI_QCA) ||
+ nla_put_u32(msg, NL80211_ATTR_VENDOR_SUBCMD,
+ QCA_NL80211_VENDOR_SUBCMD_WIFI_TEST_CONFIGURATION) ||
+ !(params = nla_nest_start(msg, NL80211_ATTR_VENDOR_DATA)) ||
+ nla_put_u8(msg, QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_ENABLE_NO_ACK,
+ noack) ||
+ nla_put_u8(msg, QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_NO_ACK_AC,
+ ac)) {
+ sigma_dut_print(dut, DUT_MSG_ERROR,
+ "%s: err in adding vendor_cmd and vendor_data",
+ __func__);
+ nlmsg_free(msg);
+ return -1;
+ }
+ nla_nest_end(msg, params);
+
+ ret = send_and_recv_msgs(dut, dut->nl_ctx, msg, NULL, NULL);
+ if (ret) {
+ sigma_dut_print(dut, DUT_MSG_ERROR,
+ "%s: err in send_and_recv_msgs, ret=%d",
+ __func__, ret);
+ }
+ return ret;
+}
+
+
+static void wcn_sta_set_noack(struct sigma_dut *dut, const char *intf,
+ const char *val)
+{
+ int noack, ret;
+ char token[100];
+ char *result;
+ char *saveptr;
+ enum qca_wlan_ac_type ac = QCA_WLAN_AC_BE;
+
+ strlcpy(token, val, sizeof(token));
+ token[sizeof(token) - 1] = '\0';
+ result = strtok_r(token, ":", &saveptr);
+ while (result) {
+ noack = strcasecmp(result, "Disable") != 0;
+ ret = nlvendor_sta_set_noack(dut, intf, noack, ac);
+ if (ret) {
+ sigma_dut_print(dut, DUT_MSG_ERROR,
+ "nlvendor_sta_set_noack failed for ac:%d, ret:%d",
+ ac, ret);
+ }
+ result = strtok_r(NULL, ":", &saveptr);
+ ac++;
+ }
+}
+
#endif /* NL80211_SUPPORT */
@@ -3879,6 +3952,11 @@
case DRIVER_ATHEROS:
ath_sta_set_noack(dut, intf, val);
break;
+#ifdef NL80211_SUPPORT
+ case DRIVER_WCN:
+ wcn_sta_set_noack(dut, intf, val);
+ break;
+#endif /* NL80211_SUPPORT */
default:
send_resp(dut, conn, SIGMA_ERROR,
"ErrorCode,Setting NoAck not supported");