NAN: sta_exec_action MethodType,DataRequest

Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
diff --git a/nan.c b/nan.c
index f0fa2ac..d773661 100644
--- a/nan.c
+++ b/nan.c
@@ -37,6 +37,7 @@
 
 struct sigma_dut *global_dut = NULL;
 static char global_nan_mac_addr[ETH_ALEN];
+static char global_peer_mac_addr[ETH_ALEN];
 static char global_event_resp_buf[1024];
 
 static int nan_further_availability_tx(struct sigma_dut *dut,
@@ -600,6 +601,150 @@
 }
 
 
+static int sigma_nan_data_request(struct sigma_dut *dut,
+				  struct sigma_conn *conn,
+				  struct sigma_cmd *cmd)
+{
+	const char *ndp_security = get_param(cmd, "DataPathSecurity");
+	const char *ndp_resp_mac = get_param(cmd, "RespNanMac");
+	const char *include_immutable = get_param(cmd, "includeimmutable");
+	const char *avoid_channel = get_param(cmd, "avoidchannel");
+	const char *invalid_nan_schedule = get_param(cmd, "InvalidNANSchedule");
+	const char *map_order = get_param(cmd, "maporder");
+	wifi_error ret;
+	NanDataPathInitiatorRequest init_req;
+	NanDebugParams cfg_debug;
+	int size;
+
+	memset(&init_req, 0, sizeof(NanDataPathInitiatorRequest));
+
+	if (ndp_security) {
+		if (strcasecmp(ndp_security, "open") == 0)
+			init_req.ndp_cfg.security_cfg =
+				NAN_DP_CONFIG_NO_SECURITY;
+		else if (strcasecmp(ndp_security, "secure") == 0)
+			init_req.ndp_cfg.security_cfg = NAN_DP_CONFIG_SECURITY;
+	}
+
+	if (include_immutable) {
+		int include_immutable_val = 0;
+
+		memset(&cfg_debug, 0, sizeof(NanDebugParams));
+		cfg_debug.cmd = NAN_TEST_MODE_CMD_NDP_INCLUDE_IMMUTABLE;
+		include_immutable_val = atoi(include_immutable);
+		memcpy(cfg_debug.debug_cmd_data, &include_immutable_val,
+		       sizeof(int));
+		size = sizeof(u32) + sizeof(int);
+		nan_debug_command_config(0, global_interface_handle,
+		cfg_debug, size);
+	}
+
+	if (avoid_channel) {
+		int avoid_channel_freq = 0;
+
+		memset(&cfg_debug, 0, sizeof(NanDebugParams));
+		avoid_channel_freq = channel_to_freq(atoi(avoid_channel));
+		cfg_debug.cmd = NAN_TEST_MODE_CMD_NDP_AVOID_CHANNEL;
+		memcpy(cfg_debug.debug_cmd_data, &avoid_channel_freq,
+		       sizeof(int));
+		size = sizeof(u32) + sizeof(int);
+		nan_debug_command_config(0, global_interface_handle,
+					 cfg_debug, size);
+	}
+
+	if (invalid_nan_schedule) {
+		int invalid_nan_schedule_type = 0;
+
+		memset(&cfg_debug, 0, sizeof(NanDebugParams));
+		invalid_nan_schedule_type = atoi(invalid_nan_schedule);
+		cfg_debug.cmd = NAN_TEST_MODE_CMD_NAN_SCHED_TYPE;
+		memcpy(cfg_debug.debug_cmd_data,
+		       &invalid_nan_schedule_type, sizeof(int));
+		size = sizeof(u32) + sizeof(int);
+		sigma_dut_print(dut, DUT_MSG_INFO,
+				"%s: invalid schedule type: cmd type = %d and command data = %d",
+				__func__, cfg_debug.cmd,
+				invalid_nan_schedule_type);
+		nan_debug_command_config(0, global_interface_handle,
+					 cfg_debug, size);
+	}
+
+	if (map_order) {
+		int map_order_val = 0;
+
+		memset(&cfg_debug, 0, sizeof(NanDebugParams));
+		cfg_debug.cmd = NAN_TEST_MODE_CMD_NAN_AVAILABILITY_MAP_ORDER;
+		map_order_val = atoi(map_order);
+		memcpy(cfg_debug.debug_cmd_data, &map_order_val, sizeof(int));
+		size = sizeof(u32) + sizeof(int);
+		sigma_dut_print(dut, DUT_MSG_INFO,
+				"%s: map order: cmd type = %d and command data = %d",
+				__func__,
+				cfg_debug.cmd, invalid_nan_schedule_type);
+		nan_debug_command_config(0, global_interface_handle,
+					 cfg_debug, size);
+	}
+
+	/*
+	 * Setting this flag, so that interface for ping6 command
+	 * is set appropriately in traffic_send_ping().
+	 */
+	dut->ndp_enable = 1;
+
+	/*
+	 * Intended sleep after NAN data interface create
+	 * before the NAN data request
+	 */
+	sleep(4);
+
+	init_req.requestor_instance_id = global_match_handle;
+	strlcpy((char *) init_req.ndp_iface, "nan0",
+		sizeof(init_req.ndp_iface));
+
+	if (ndp_resp_mac) {
+		nan_parse_mac_address(dut, ndp_resp_mac,
+				      init_req.peer_disc_mac_addr);
+		sigma_dut_print(
+			dut, DUT_MSG_INFO, "PEER MAC ADDR: " MAC_ADDR_STR,
+			MAC_ADDR_ARRAY(init_req.peer_disc_mac_addr));
+	} else {
+		memcpy(init_req.peer_disc_mac_addr, global_peer_mac_addr,
+		       sizeof(init_req.peer_disc_mac_addr));
+	}
+
+	/* Not requesting the channel and letting FW decide */
+	if (dut->sta_channel == 0) {
+		init_req.channel_request_type = NAN_DP_CHANNEL_NOT_REQUESTED;
+		init_req.channel = 0;
+	} else {
+		init_req.channel_request_type = NAN_DP_FORCE_CHANNEL_SETUP;
+		init_req.channel = channel_to_freq(dut->sta_channel);
+	}
+	sigma_dut_print(dut, DUT_MSG_INFO,
+			"%s: Initiator Request: Channel = %d  Channel Request Type = %d",
+			__func__, init_req.channel,
+			init_req.channel_request_type);
+
+	if (dut->nan_pmk_len == NAN_PMK_INFO_LEN) {
+		memcpy(&init_req.key_info.body.pmk_info.pmk[0],
+		       &dut->nan_pmk[0], NAN_PMK_INFO_LEN);
+		init_req.key_info.body.pmk_info.pmk_len = NAN_PMK_INFO_LEN;
+		sigma_dut_print(dut, DUT_MSG_INFO, "%s: pmk len = %d",
+				__func__,
+				init_req.key_info.body.pmk_info.pmk_len);
+	}
+
+	ret = nan_data_request_initiator(0, global_interface_handle, &init_req);
+	if (ret != WIFI_SUCCESS) {
+		send_resp(dut, conn, SIGMA_ERROR,
+			  "Unable to initiate nan data request");
+		return 0;
+	}
+
+	return 0;
+}
+
+
 int config_post_disc_attr(void)
 {
 	wifi_error ret;
@@ -962,6 +1107,7 @@
 	event_anyresponse = 1;
 	global_header_handle = event->publish_subscribe_id;
 	global_match_handle = event->requestor_instance_id;
+	memcpy(global_peer_mac_addr, event->addr, sizeof(global_peer_mac_addr));
 
 	/* memset(event_resp_buf, 0, sizeof(event_resp_buf)); */
 	/* global_pub_sub_handle = event->header.handle; */
@@ -1327,6 +1473,10 @@
 				sigma_nan_transmit_followup(dut, conn, cmd);
 				send_resp(dut, conn, SIGMA_COMPLETE, "NULL");
 			}
+			if (strcasecmp(method_type, "DataRequest") == 0) {
+				sigma_nan_data_request(dut, conn, cmd);
+				send_resp(dut, conn, SIGMA_COMPLETE, "NULL");
+			}
 		} else {
 			sigma_nan_config_enable(dut, conn, cmd);
 			snprintf(resp_buf, sizeof(resp_buf), "mac,"