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");