xref: /wlan-dirver/utils/sigma-dut/atheros.c (revision 829f82c83351fb7bd37b683fd5a644b0ca322340)
1 /*
2  * Sigma Control API DUT (station/AP)
3  * Copyright (c) 2010, Atheros Communications, Inc.
4  * Copyright (c) 2019, The Linux Foundation
5  * All Rights Reserved.
6  * Licensed under the Clear BSD license. See README for more details.
7  */
8 
9 #include "sigma_dut.h"
10 #include "wpa_helpers.h"
11 
12 
cmd_sta_atheros(struct sigma_dut * dut,struct sigma_conn * conn,struct sigma_cmd * cmd)13 static enum sigma_cmd_result cmd_sta_atheros(struct sigma_dut *dut,
14 					     struct sigma_conn *conn,
15 					     struct sigma_cmd *cmd)
16 {
17 	char buf[2048], *pos;
18 	int i;
19 	const char *intf, *c;
20 	char resp[200];
21 
22 	intf = get_param(cmd, "interface");
23 	c = get_param(cmd, "cmd");
24 	if (c == NULL)
25 		return INVALID_SEND_STATUS;
26 
27 	buf[0] = '\0';
28 	if (strncmp(c, "ctrl=", 5) == 0) {
29 		size_t rlen;
30 		c += 5;
31 		if (wpa_command_resp(intf, c, buf, sizeof(buf)) < 0)
32 			return ERROR_SEND_STATUS;
33 		rlen = strlen(buf);
34 		if (rlen > 0 && buf[rlen - 1] == '\n')
35 			buf[rlen - 1] = '\0';
36 	} else if (strncmp(c, "timeout=", 8) == 0) {
37 		unsigned int timeout;
38 		timeout = atoi(c + 8);
39 		if (timeout == 0)
40 			return INVALID_SEND_STATUS;
41 		dut->default_timeout = timeout;
42 		sigma_dut_print(dut, DUT_MSG_INFO, "Set DUT default timeout "
43 				"to %u seconds", dut->default_timeout);
44 		snprintf(buf, sizeof(buf), "OK");
45 	} else
46 		return ERROR_SEND_STATUS;
47 
48 	i = snprintf(resp, sizeof(resp), "resp,");
49 	if (i < 0)
50 		return ERROR_SEND_STATUS;
51 	pos = buf;
52 	while (*pos && i + 1 < (int) sizeof(resp)) {
53 		char c = *pos++;
54 		if (c == '\n' || c == '\r' || c == ',')
55 			c = '^';
56 		resp[i++] = c;
57 	}
58 	resp[i] = '\0';
59 
60 	send_resp(dut, conn, SIGMA_COMPLETE, resp);
61 	return STATUS_SENT;
62 }
63 
64 
req_intf(struct sigma_cmd * cmd)65 static int req_intf(struct sigma_cmd *cmd)
66 {
67 	return get_param(cmd, "interface") == NULL ? -1 : 0;
68 }
69 
70 
71 #ifdef NL80211_SUPPORT
cmd_atheros_config_scan(struct sigma_dut * dut,struct sigma_conn * conn,struct sigma_cmd * cmd)72 static enum sigma_cmd_result cmd_atheros_config_scan(struct sigma_dut *dut,
73 						     struct sigma_conn *conn,
74 						     struct sigma_cmd *cmd)
75 {
76 	struct nl_msg *msg;
77 	int ret;
78 	struct nlattr *params;
79 	const char *val;
80 	int ifindex;
81 
82 	val = get_param(cmd, "enable");
83 	if (!val)
84 		return INVALID_SEND_STATUS;
85 	ifindex = if_nametoindex("wlan0");
86 	if (!(msg = nl80211_drv_msg(dut, dut->nl_ctx, ifindex, 0,
87 				    NL80211_CMD_VENDOR)) ||
88 	    nla_put_u32(msg, NL80211_ATTR_IFINDEX, ifindex) ||
89 	    nla_put_u32(msg, NL80211_ATTR_VENDOR_ID, OUI_QCA) ||
90 	    nla_put_u32(msg, NL80211_ATTR_VENDOR_SUBCMD,
91 			QCA_NL80211_VENDOR_SUBCMD_SET_WIFI_CONFIGURATION) ||
92 	    !(params = nla_nest_start(msg, NL80211_ATTR_VENDOR_DATA)) ||
93 	    nla_put_u8(msg,
94 		       QCA_WLAN_VENDOR_ATTR_CONFIG_SCAN_ENABLE,
95 		       atoi(val))) {
96 		sigma_dut_print(dut, DUT_MSG_ERROR,
97 				"%s: err in adding vendor_cmd and vendor_data",
98 				__func__);
99 		nlmsg_free(msg);
100 		return ERROR_SEND_STATUS;
101 	}
102 	nla_nest_end(msg, params);
103 
104 	ret = send_and_recv_msgs(dut, dut->nl_ctx, msg, NULL, NULL);
105 	if (ret) {
106 		sigma_dut_print(dut, DUT_MSG_ERROR,
107 				"%s: err in send_and_recv_msgs, ret=%d",
108 				__func__, ret);
109 		return ERROR_SEND_STATUS;
110 	}
111 
112 	return STATUS_SENT;
113 }
114 #endif /* NL80211_SUPPORT */
115 
116 
atheros_register_cmds(void)117 void atheros_register_cmds(void)
118 {
119 	sigma_dut_reg_cmd("sta_atheros", req_intf, cmd_sta_atheros);
120 #ifdef NL80211_SUPPORT
121 	sigma_dut_reg_cmd("atheros_config_scan", NULL, cmd_atheros_config_scan);
122 #endif /* NL80211_SUPPORT */
123 }
124