xref: /wlan-dirver/utils/sigma-dut/nan.c (revision 55854697f06dd089ccd7085f07aff1df403ddd09)
1cd4e3c3eSJouni Malinen /*
2cd4e3c3eSJouni Malinen  * Sigma Control API DUT (NAN functionality)
34b75f96cSRakesh Sunki  * Copyright (c) 2014-2017, Qualcomm Atheros, Inc.
48863ec7cSPeng Xu  * Copyright (c) 2018, The Linux Foundation
5cd4e3c3eSJouni Malinen  * All Rights Reserved.
6cd4e3c3eSJouni Malinen  * Licensed under the Clear BSD license. See README for more details.
7cd4e3c3eSJouni Malinen  */
8cd4e3c3eSJouni Malinen 
9cd4e3c3eSJouni Malinen #include "sigma_dut.h"
10cd4e3c3eSJouni Malinen #include <sys/stat.h>
11cd4e3c3eSJouni Malinen #include "wpa_ctrl.h"
12cd4e3c3eSJouni Malinen #include "wpa_helpers.h"
131854ec6fSAmarnath Hullur Subramanyam #include "nan_cert.h"
14cd4e3c3eSJouni Malinen 
154b75f96cSRakesh Sunki #if NAN_CERT_VERSION >= 2
164b75f96cSRakesh Sunki 
1747d709baSPeng Xu #if ((NAN_MAJOR_VERSION > 2) ||					 \
1847d709baSPeng Xu      (NAN_MAJOR_VERSION == 2 &&					 \
1947d709baSPeng Xu       (NAN_MINOR_VERSION >= 1 || NAN_MICRO_VERSION >= 1))) &&	 \
2047d709baSPeng Xu 	NAN_CERT_VERSION >= 5
2147d709baSPeng Xu #define NAN_NEW_CERT_VERSION
2247d709baSPeng Xu #endif
2347d709baSPeng Xu 
24cd4e3c3eSJouni Malinen pthread_cond_t gCondition;
25cd4e3c3eSJouni Malinen pthread_mutex_t gMutex;
26d51e8980SRakesh Sunki static NanSyncStats global_nan_sync_stats;
27cd4e3c3eSJouni Malinen static int nan_state = 0;
28cd4e3c3eSJouni Malinen static int event_anyresponse = 0;
29cd4e3c3eSJouni Malinen static int is_fam = 0;
30cd4e3c3eSJouni Malinen 
314c086678SRakesh Sunki static uint16_t global_ndp_instance_id = 0;
324d5912dfSRakesh Sunki static uint16_t global_publish_id = 0;
334d5912dfSRakesh Sunki static uint16_t global_subscribe_id = 0;
34cd4e3c3eSJouni Malinen uint16_t global_header_handle = 0;
35cd4e3c3eSJouni Malinen uint32_t global_match_handle = 0;
36cd4e3c3eSJouni Malinen 
37d5e9b4d1SRakesh Sunki #define DEFAULT_SVC "QNanCluster"
38cd4e3c3eSJouni Malinen #define MAC_ADDR_ARRAY(a) (a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5]
39cd4e3c3eSJouni Malinen #define MAC_ADDR_STR "%02x:%02x:%02x:%02x:%02x:%02x"
40cd4e3c3eSJouni Malinen #ifndef ETH_ALEN
41cd4e3c3eSJouni Malinen #define ETH_ALEN 6
42cd4e3c3eSJouni Malinen #endif
43cd4e3c3eSJouni Malinen 
4447d709baSPeng Xu static const u8 nan_wfa_oui[] = { 0x50, 0x6f, 0x9a };
4547d709baSPeng Xu /* TLV header length = tag (1 byte) + length (2 bytes) */
4647d709baSPeng Xu #define WLAN_NAN_TLV_HEADER_SIZE (1 + 2)
4747d709baSPeng Xu #define NAN_INTF_ID_LEN   8
4847d709baSPeng Xu 
49cd4e3c3eSJouni Malinen struct sigma_dut *global_dut = NULL;
50cd4e3c3eSJouni Malinen static char global_nan_mac_addr[ETH_ALEN];
5114cfcd25SRakesh Sunki static char global_peer_mac_addr[ETH_ALEN];
52cd4e3c3eSJouni Malinen static char global_event_resp_buf[1024];
534236368dSRakesh Sunki static u8 global_publish_service_name[NAN_MAX_SERVICE_NAME_LEN];
544236368dSRakesh Sunki static u32 global_publish_service_name_len = 0;
5574f4f992SRakesh Sunki static u8 global_subscribe_service_name[NAN_MAX_SERVICE_NAME_LEN];
5674f4f992SRakesh Sunki static u32 global_subscribe_service_name_len = 0;
57cd4e3c3eSJouni Malinen 
58cd4e3c3eSJouni Malinen static int nan_further_availability_tx(struct sigma_dut *dut,
59cd4e3c3eSJouni Malinen 				       struct sigma_conn *conn,
60cd4e3c3eSJouni Malinen 				       struct sigma_cmd *cmd);
61cd4e3c3eSJouni Malinen static int nan_further_availability_rx(struct sigma_dut *dut,
62cd4e3c3eSJouni Malinen 				       struct sigma_conn *conn,
63cd4e3c3eSJouni Malinen 				       struct sigma_cmd *cmd);
64cd4e3c3eSJouni Malinen 
6547d709baSPeng Xu enum wlan_nan_tlv_type {
6647d709baSPeng Xu 	NAN_TLV_TYPE_IPV6_LINK_LOCAL = 0x00,
6747d709baSPeng Xu 	NAN_TLV_TYPE_SERVICE_INFO = 0x01,
6847d709baSPeng Xu 	NAN_TLV_TYPE_RSVD_START = 0x02,
6947d709baSPeng Xu 	NAN_TLV_TYPE_RSVD_START_END = 0xFF
7047d709baSPeng Xu };
7147d709baSPeng Xu 
7247d709baSPeng Xu enum wlan_nan_service_protocol_type {
7347d709baSPeng Xu 	NAN_TLV_SERVICE_PROTO_TYPE_RSVD1 = 0x00,
7447d709baSPeng Xu 	NAN_TLV_SERVICE_PROTO_TYPE_BONJOUR = 0x01,
7547d709baSPeng Xu 	NAN_TLV_SERVICE_PROTO_TYPE_GENERIC = 0x02,
7647d709baSPeng Xu 	NAN_TLV_SERVICE_PROTO_RSVD2_START = 0x03,
7747d709baSPeng Xu 	NAN_TLV_SERVICE_PROTO_TYPE_RSVD2_END = 0xFF
7847d709baSPeng Xu };
7947d709baSPeng Xu 
8047d709baSPeng Xu enum wlan_nan_generic_service_proto_sub_attr {
8147d709baSPeng Xu 	NAN_GENERIC_SERVICE_PROTO_SUB_ATTR_ID_TRANS_PORT = 0x00,
8247d709baSPeng Xu 	NAN_GENERIC_SERVICE_PROTO_SUB_ATTR_ID_TRANS_PROTO = 0x01,
8347d709baSPeng Xu 	NAN_GENERIC_SERVICE_PROTO_SUB_ATTR_ID_SERVICE_NAME = 0x02,
8447d709baSPeng Xu 	NAN_GENERIC_SERVICE_PROTO_SUB_ATTR_ID_TEXTINFO = 0x04,
8547d709baSPeng Xu 	NAN_GENERIC_SERVICE_PROTO_SUB_ATTR_ID_UUID = 0x05,
8647d709baSPeng Xu 	NAN_GENERIC_SERVICE_PROTO_SUB_ATTR_ID_BLOB = 0x06,
8747d709baSPeng Xu 	NAN_GENERIC_SERVICE_PROTO_SUB_ATTR_ID_RSVD1_START = 0x07,
8847d709baSPeng Xu 	NAN_GENERIC_SERVICE_PROTO_SUB_ATTR_ID_RSVD1_END = 0xDC,
8947d709baSPeng Xu 	NAN_GENERIC_SERVICE_PROTO_SUB_ATTR_ID_VENDOR_SPEC_INFO= 0xDD,
9047d709baSPeng Xu 	NAN_GENERIC_SERVICE_PROTO_SUB_ATTR_ID_RSVD2_START = 0xDE,
9147d709baSPeng Xu 	NAN_GENERIC_SERVICE_PROTO_SUB_ATTR_ID_RSVD2_END = 0xFF
9247d709baSPeng Xu };
9347d709baSPeng Xu 
94cd4e3c3eSJouni Malinen 
nan_hex_dump(struct sigma_dut * dut,uint8_t * data,size_t len)95cd4e3c3eSJouni Malinen void nan_hex_dump(struct sigma_dut *dut, uint8_t *data, size_t len)
96cd4e3c3eSJouni Malinen {
97cd4e3c3eSJouni Malinen 	char buf[512];
98cd4e3c3eSJouni Malinen 	uint16_t index;
99cd4e3c3eSJouni Malinen 	uint8_t *ptr;
100cd4e3c3eSJouni Malinen 	int pos;
101cd4e3c3eSJouni Malinen 
102cd4e3c3eSJouni Malinen 	memset(buf, 0, sizeof(buf));
103cd4e3c3eSJouni Malinen 	ptr = data;
104cd4e3c3eSJouni Malinen 	pos = 0;
105cd4e3c3eSJouni Malinen 	for (index = 0; index < len; index++) {
1066734e239SPeng Xu 		pos += snprintf(&(buf[pos]), sizeof(buf) - pos,
1076734e239SPeng Xu 				"%02x ", *ptr++);
108cd4e3c3eSJouni Malinen 		if (pos > 508)
109cd4e3c3eSJouni Malinen 			break;
110cd4e3c3eSJouni Malinen 	}
111cd4e3c3eSJouni Malinen 	sigma_dut_print(dut, DUT_MSG_INFO, "HEXDUMP len=[%d]", (int) len);
112cd4e3c3eSJouni Malinen 	sigma_dut_print(dut, DUT_MSG_INFO, "buf:%s", buf);
113cd4e3c3eSJouni Malinen }
114cd4e3c3eSJouni Malinen 
115cd4e3c3eSJouni Malinen 
nan_parse_hex(unsigned char c)116cd4e3c3eSJouni Malinen int nan_parse_hex(unsigned char c)
117cd4e3c3eSJouni Malinen {
118cd4e3c3eSJouni Malinen 	if (c >= '0' && c <= '9')
119cd4e3c3eSJouni Malinen 		return c - '0';
120cd4e3c3eSJouni Malinen 	if (c >= 'a' && c <= 'f')
121cd4e3c3eSJouni Malinen 		return c - 'a' + 10;
122cd4e3c3eSJouni Malinen 	if (c >= 'A' && c <= 'F')
123cd4e3c3eSJouni Malinen 		return c - 'A' + 10;
124cd4e3c3eSJouni Malinen 	return 0;
125cd4e3c3eSJouni Malinen }
126cd4e3c3eSJouni Malinen 
127cd4e3c3eSJouni Malinen 
nan_parse_token(const char * tokenIn,u8 * tokenOut,int * filterLen)128cd4e3c3eSJouni Malinen int nan_parse_token(const char *tokenIn, u8 *tokenOut, int *filterLen)
129cd4e3c3eSJouni Malinen {
130cd4e3c3eSJouni Malinen 	int total_len = 0, len = 0;
131cd4e3c3eSJouni Malinen 	char *saveptr = NULL;
132cd4e3c3eSJouni Malinen 
133cd4e3c3eSJouni Malinen 	tokenIn = strtok_r((char *) tokenIn, ":", &saveptr);
134cd4e3c3eSJouni Malinen 	while (tokenIn != NULL) {
135cd4e3c3eSJouni Malinen 		len = strlen(tokenIn);
136cd4e3c3eSJouni Malinen 		if (len == 1 && *tokenIn == '*')
137cd4e3c3eSJouni Malinen 			len = 0;
138cd4e3c3eSJouni Malinen 		tokenOut[total_len++] = (u8) len;
139cd4e3c3eSJouni Malinen 		if (len != 0)
140cd4e3c3eSJouni Malinen 			memcpy((u8 *) tokenOut + total_len, tokenIn, len);
141cd4e3c3eSJouni Malinen 		total_len += len;
142cd4e3c3eSJouni Malinen 		tokenIn = strtok_r(NULL, ":", &saveptr);
143cd4e3c3eSJouni Malinen 	}
144cd4e3c3eSJouni Malinen 	*filterLen = total_len;
145cd4e3c3eSJouni Malinen 	return 0;
146cd4e3c3eSJouni Malinen }
147cd4e3c3eSJouni Malinen 
148cd4e3c3eSJouni Malinen 
nan_parse_mac_address(struct sigma_dut * dut,const char * arg,u8 * addr)149cd4e3c3eSJouni Malinen int nan_parse_mac_address(struct sigma_dut *dut, const char *arg, u8 *addr)
150cd4e3c3eSJouni Malinen {
151cd4e3c3eSJouni Malinen 	if (strlen(arg) != 17) {
152cd4e3c3eSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_ERROR, "Invalid mac address %s",
153cd4e3c3eSJouni Malinen 				arg);
154cd4e3c3eSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_ERROR,
155cd4e3c3eSJouni Malinen 				"expected format xx:xx:xx:xx:xx:xx");
156cd4e3c3eSJouni Malinen 		return -1;
157cd4e3c3eSJouni Malinen 	}
158cd4e3c3eSJouni Malinen 
159cd4e3c3eSJouni Malinen 	addr[0] = nan_parse_hex(arg[0]) << 4 | nan_parse_hex(arg[1]);
160cd4e3c3eSJouni Malinen 	addr[1] = nan_parse_hex(arg[3]) << 4 | nan_parse_hex(arg[4]);
161cd4e3c3eSJouni Malinen 	addr[2] = nan_parse_hex(arg[6]) << 4 | nan_parse_hex(arg[7]);
162cd4e3c3eSJouni Malinen 	addr[3] = nan_parse_hex(arg[9]) << 4 | nan_parse_hex(arg[10]);
163cd4e3c3eSJouni Malinen 	addr[4] = nan_parse_hex(arg[12]) << 4 | nan_parse_hex(arg[13]);
164cd4e3c3eSJouni Malinen 	addr[5] = nan_parse_hex(arg[15]) << 4 | nan_parse_hex(arg[16]);
165cd4e3c3eSJouni Malinen 
166cd4e3c3eSJouni Malinen 	return 0;
167cd4e3c3eSJouni Malinen }
168cd4e3c3eSJouni Malinen 
169cd4e3c3eSJouni Malinen 
nan_parse_mac_address_list(struct sigma_dut * dut,const char * input,u8 * output,u16 max_addr_allowed)170cd4e3c3eSJouni Malinen int nan_parse_mac_address_list(struct sigma_dut *dut, const char *input,
171cd4e3c3eSJouni Malinen 			       u8 *output, u16 max_addr_allowed)
172cd4e3c3eSJouni Malinen {
173cd4e3c3eSJouni Malinen 	/*
174cd4e3c3eSJouni Malinen 	 * Reads a list of mac address separated by space. Each MAC address
175cd4e3c3eSJouni Malinen 	 * should have the format of aa:bb:cc:dd:ee:ff.
176cd4e3c3eSJouni Malinen 	 */
177cd4e3c3eSJouni Malinen 	char *saveptr;
178cd4e3c3eSJouni Malinen 	char *token;
179cd4e3c3eSJouni Malinen 	int i = 0;
180cd4e3c3eSJouni Malinen 
181cd4e3c3eSJouni Malinen 	for (i = 0; i < max_addr_allowed; i++) {
182cd4e3c3eSJouni Malinen 		token = strtok_r((i == 0) ? (char *) input : NULL,
183cd4e3c3eSJouni Malinen 				 " ", &saveptr);
184cd4e3c3eSJouni Malinen 		if (token) {
185cd4e3c3eSJouni Malinen 			nan_parse_mac_address(dut, token, output);
186cd4e3c3eSJouni Malinen 			output += NAN_MAC_ADDR_LEN;
187cd4e3c3eSJouni Malinen 		} else
188cd4e3c3eSJouni Malinen 			break;
189cd4e3c3eSJouni Malinen 	}
190cd4e3c3eSJouni Malinen 
191cd4e3c3eSJouni Malinen 	sigma_dut_print(dut, DUT_MSG_INFO, "Num MacAddress:%d", i);
192cd4e3c3eSJouni Malinen 
193cd4e3c3eSJouni Malinen 	return i;
194cd4e3c3eSJouni Malinen }
195cd4e3c3eSJouni Malinen 
196cd4e3c3eSJouni Malinen 
nan_parse_hex_string(struct sigma_dut * dut,const char * input,u8 * output,int * outputlen)197cd4e3c3eSJouni Malinen int nan_parse_hex_string(struct sigma_dut *dut, const char *input,
198cd4e3c3eSJouni Malinen 			 u8 *output, int *outputlen)
199cd4e3c3eSJouni Malinen {
200cd4e3c3eSJouni Malinen 	int i = 0;
201cd4e3c3eSJouni Malinen 	int j = 0;
202cd4e3c3eSJouni Malinen 
203cd4e3c3eSJouni Malinen 	for (i = 0; i < (int) strlen(input) && j < *outputlen; i += 2) {
204cd4e3c3eSJouni Malinen 		output[j] = nan_parse_hex(input[i]);
205cd4e3c3eSJouni Malinen 		if (i + 1 < (int) strlen(input)) {
206cd4e3c3eSJouni Malinen 			output[j] = ((output[j] << 4) |
207cd4e3c3eSJouni Malinen 				     nan_parse_hex(input[i + 1]));
208cd4e3c3eSJouni Malinen 		}
209cd4e3c3eSJouni Malinen 		j++;
210cd4e3c3eSJouni Malinen 	}
211cd4e3c3eSJouni Malinen 	*outputlen = j;
212cd4e3c3eSJouni Malinen 	sigma_dut_print(dut, DUT_MSG_INFO, "Input:%s inputlen:%d outputlen:%d",
213cd4e3c3eSJouni Malinen 			input, (int) strlen(input), (int) *outputlen);
214cd4e3c3eSJouni Malinen 	return 0;
215cd4e3c3eSJouni Malinen }
216cd4e3c3eSJouni Malinen 
217cd4e3c3eSJouni Malinen 
nan_build_ipv6_link_local_tlv(u8 * p_frame,const u8 * p_ipv6_intf_addr)21847d709baSPeng Xu static size_t nan_build_ipv6_link_local_tlv(u8 *p_frame,
21947d709baSPeng Xu 					    const u8 *p_ipv6_intf_addr)
22047d709baSPeng Xu {
22147d709baSPeng Xu 	/* fill attribute ID */
22247d709baSPeng Xu 	*p_frame++ = NAN_TLV_TYPE_IPV6_LINK_LOCAL;
22347d709baSPeng Xu 
22447d709baSPeng Xu 	/* Fill the length */
22547d709baSPeng Xu 	*p_frame++ = NAN_INTF_ID_LEN & 0xFF;
22647d709baSPeng Xu 	*p_frame++ = NAN_INTF_ID_LEN >> 8;
22747d709baSPeng Xu 
22847d709baSPeng Xu 	/* only the lower 8 bytes is needed */
22947d709baSPeng Xu 	memcpy(p_frame, &p_ipv6_intf_addr[NAN_INTF_ID_LEN], NAN_INTF_ID_LEN);
23047d709baSPeng Xu 
23147d709baSPeng Xu 	return NAN_INTF_ID_LEN + WLAN_NAN_TLV_HEADER_SIZE;
23247d709baSPeng Xu }
23347d709baSPeng Xu 
23447d709baSPeng Xu 
nan_build_service_info_tlv_sub_attr(u8 * p_frame,const u8 * sub_attr,const u16 sub_attr_len,enum wlan_nan_generic_service_proto_sub_attr sub_attr_id)23547d709baSPeng Xu static size_t nan_build_service_info_tlv_sub_attr(
23647d709baSPeng Xu 	u8 *p_frame, const u8 *sub_attr, const u16 sub_attr_len,
23747d709baSPeng Xu 	enum wlan_nan_generic_service_proto_sub_attr sub_attr_id)
23847d709baSPeng Xu {
23947d709baSPeng Xu 	/* Fill Service Subattibute ID */
24047d709baSPeng Xu 	*p_frame++ = (u8) sub_attr_id;
24147d709baSPeng Xu 
24247d709baSPeng Xu 	/* Fill the length */
24347d709baSPeng Xu 	*p_frame++ = sub_attr_len & 0xFF;
24447d709baSPeng Xu 	*p_frame++ = sub_attr_len >> 8;
24547d709baSPeng Xu 
24647d709baSPeng Xu 	/* Fill the value */
24747d709baSPeng Xu 	memcpy(p_frame, sub_attr, sub_attr_len);
24847d709baSPeng Xu 
24947d709baSPeng Xu 	return sub_attr_len + WLAN_NAN_TLV_HEADER_SIZE;
25047d709baSPeng Xu }
25147d709baSPeng Xu 
25247d709baSPeng Xu 
nan_build_service_info_tlv(u8 * p_frame,const NdpIpTransParams * p_ndp_attr)25347d709baSPeng Xu static size_t nan_build_service_info_tlv(u8 *p_frame,
25447d709baSPeng Xu 					 const NdpIpTransParams *p_ndp_attr)
25547d709baSPeng Xu {
25647d709baSPeng Xu 	u16 tlv_len = 0, len = 0;
25747d709baSPeng Xu 	u8 *p_offset_len;
25847d709baSPeng Xu 
25947d709baSPeng Xu 	if (p_ndp_attr->trans_port_present || p_ndp_attr->trans_proto_present) {
26047d709baSPeng Xu 		/* fill attribute ID */
26147d709baSPeng Xu 		*p_frame++ = NAN_TLV_TYPE_SERVICE_INFO;
26247d709baSPeng Xu 
26347d709baSPeng Xu 		p_offset_len = p_frame;
26447d709baSPeng Xu 		p_frame += 2;
26547d709baSPeng Xu 
26647d709baSPeng Xu 		/* Fill WFA Specific OUI */
26747d709baSPeng Xu 		memcpy(p_frame, nan_wfa_oui, sizeof(nan_wfa_oui));
26847d709baSPeng Xu 		p_frame += sizeof(nan_wfa_oui);
26947d709baSPeng Xu 		tlv_len += sizeof(nan_wfa_oui);
27047d709baSPeng Xu 
27147d709baSPeng Xu 		/* Fill Service protocol Type */
27247d709baSPeng Xu 		*p_frame++ = NAN_TLV_SERVICE_PROTO_TYPE_GENERIC;
27347d709baSPeng Xu 		tlv_len += 1;
27447d709baSPeng Xu 
27547d709baSPeng Xu 		if (p_ndp_attr->trans_port_present) {
27647d709baSPeng Xu 			len = nan_build_service_info_tlv_sub_attr(
27747d709baSPeng Xu 				p_frame,
27847d709baSPeng Xu 				(const u8 *) &p_ndp_attr->transport_port,
27947d709baSPeng Xu 				sizeof(p_ndp_attr->transport_port),
28047d709baSPeng Xu 				NAN_GENERIC_SERVICE_PROTO_SUB_ATTR_ID_TRANS_PORT);
28147d709baSPeng Xu 			p_frame += len;
28247d709baSPeng Xu 			tlv_len += len;
28347d709baSPeng Xu 		}
28447d709baSPeng Xu 
28547d709baSPeng Xu 		if (p_ndp_attr->trans_proto_present) {
28647d709baSPeng Xu 			len = nan_build_service_info_tlv_sub_attr(
28747d709baSPeng Xu 				p_frame,
28847d709baSPeng Xu 				(const u8 *) &p_ndp_attr->transport_protocol,
28947d709baSPeng Xu 				sizeof(p_ndp_attr->transport_protocol),
29047d709baSPeng Xu 				NAN_GENERIC_SERVICE_PROTO_SUB_ATTR_ID_TRANS_PROTO);
29147d709baSPeng Xu 			p_frame += len;
29247d709baSPeng Xu 			tlv_len += len;
29347d709baSPeng Xu 		}
29447d709baSPeng Xu 
29547d709baSPeng Xu 		/* Fill the length */
29647d709baSPeng Xu 		*p_offset_len++ = tlv_len  & 0xFF;
29747d709baSPeng Xu 		*p_offset_len = tlv_len >> 8;
29847d709baSPeng Xu 
29947d709baSPeng Xu 		tlv_len += WLAN_NAN_TLV_HEADER_SIZE;
30047d709baSPeng Xu 	}
30147d709baSPeng Xu 
30247d709baSPeng Xu 	return tlv_len;
30347d709baSPeng Xu }
30447d709baSPeng Xu 
30547d709baSPeng Xu 
wait(struct timespec abstime)306cd4e3c3eSJouni Malinen int wait(struct timespec abstime)
307cd4e3c3eSJouni Malinen {
308cd4e3c3eSJouni Malinen 	struct timeval now;
309cd4e3c3eSJouni Malinen 
310cd4e3c3eSJouni Malinen 	gettimeofday(&now, NULL);
311cd4e3c3eSJouni Malinen 
312cd4e3c3eSJouni Malinen 	abstime.tv_sec += now.tv_sec;
313cd4e3c3eSJouni Malinen 	if (((abstime.tv_nsec + now.tv_usec * 1000) > 1000 * 1000 * 1000) ||
314cd4e3c3eSJouni Malinen 	    (abstime.tv_nsec + now.tv_usec * 1000 < 0)) {
315cd4e3c3eSJouni Malinen 		abstime.tv_sec += 1;
316cd4e3c3eSJouni Malinen 		abstime.tv_nsec += now.tv_usec * 1000;
317cd4e3c3eSJouni Malinen 		abstime.tv_nsec -= 1000 * 1000 * 1000;
318cd4e3c3eSJouni Malinen 	} else {
319cd4e3c3eSJouni Malinen 		abstime.tv_nsec  += now.tv_usec * 1000;
320cd4e3c3eSJouni Malinen 	}
321cd4e3c3eSJouni Malinen 
322cd4e3c3eSJouni Malinen 	return pthread_cond_timedwait(&gCondition, &gMutex, &abstime);
323cd4e3c3eSJouni Malinen }
324cd4e3c3eSJouni Malinen 
325cd4e3c3eSJouni Malinen 
nan_cmd_sta_preset_testparameters(struct sigma_dut * dut,struct sigma_conn * conn,struct sigma_cmd * cmd)326cd4e3c3eSJouni Malinen int nan_cmd_sta_preset_testparameters(struct sigma_dut *dut,
327cd4e3c3eSJouni Malinen 				      struct sigma_conn *conn,
328cd4e3c3eSJouni Malinen 				      struct sigma_cmd *cmd)
329cd4e3c3eSJouni Malinen {
3308dd1d88dSRakesh Sunki 	const char *oper_chan = get_param(cmd, "oper_chn");
3317d37f411SRakesh Sunki 	const char *pmk = get_param(cmd, "PMK");
33247d709baSPeng Xu #ifdef NAN_NEW_CERT_VERSION
33357d7ead9SPeng Xu 	const char *ndpe = get_param(cmd, "NDPE");
33457d7ead9SPeng Xu 	const char *trans_proto = get_param(cmd, "TransProtoType");
33557d7ead9SPeng Xu 	const char *ndp_attr = get_param(cmd, "ndpAttr");
33657d7ead9SPeng Xu #endif
337cd4e3c3eSJouni Malinen 
3388dd1d88dSRakesh Sunki 	if (oper_chan) {
3398dd1d88dSRakesh Sunki 		sigma_dut_print(dut, DUT_MSG_INFO, "Operating Channel: %s",
3408dd1d88dSRakesh Sunki 				oper_chan);
341132c6d2bSKantesh Mundaragi 		dut->sta_channel = atoi(oper_chan);
3428dd1d88dSRakesh Sunki 	}
343cd4e3c3eSJouni Malinen 
3447d37f411SRakesh Sunki 	if (pmk) {
3457d37f411SRakesh Sunki 		int pmk_len;
3467d37f411SRakesh Sunki 
3477d37f411SRakesh Sunki 		sigma_dut_print(dut, DUT_MSG_INFO, "%s given string pmk: %s",
3487d37f411SRakesh Sunki 				__func__, pmk);
3497d37f411SRakesh Sunki 		memset(dut->nan_pmk, 0, NAN_PMK_INFO_LEN);
3507d37f411SRakesh Sunki 		dut->nan_pmk_len = 0;
3517d37f411SRakesh Sunki 		pmk_len = NAN_PMK_INFO_LEN;
3527d37f411SRakesh Sunki 		nan_parse_hex_string(dut, &pmk[2], &dut->nan_pmk[0], &pmk_len);
3537d37f411SRakesh Sunki 		dut->nan_pmk_len = pmk_len;
3547d37f411SRakesh Sunki 		sigma_dut_print(dut, DUT_MSG_INFO, "%s: pmk len = %d",
3557d37f411SRakesh Sunki 				__func__, dut->nan_pmk_len);
3567d37f411SRakesh Sunki 		sigma_dut_print(dut, DUT_MSG_INFO, "%s:hex pmk", __func__);
3577d37f411SRakesh Sunki 		nan_hex_dump(dut, &dut->nan_pmk[0], dut->nan_pmk_len);
3587d37f411SRakesh Sunki 	}
3597d37f411SRakesh Sunki 
36047d709baSPeng Xu #ifdef NAN_NEW_CERT_VERSION
36157d7ead9SPeng Xu 	if (ndpe) {
36257d7ead9SPeng Xu 		NanConfigRequest req;
36357d7ead9SPeng Xu 		wifi_error ret;
36457d7ead9SPeng Xu 
36557d7ead9SPeng Xu 		sigma_dut_print(dut, DUT_MSG_DEBUG, "%s: NDPE: %s",
36657d7ead9SPeng Xu 				__func__, ndpe);
36757d7ead9SPeng Xu 		memset(&req, 0, sizeof(NanConfigRequest));
36857d7ead9SPeng Xu 		dut->ndpe = strcasecmp(ndpe, "Enable") == 0;
36957d7ead9SPeng Xu 		req.config_ndpe_attr = 1;
37057d7ead9SPeng Xu 		req.use_ndpe_attr = dut->ndpe;
3712dfb1daeSVinay Gannevaram 		ret = nan_config_request(0, dut->wifi_hal_iface_handle, &req);
37257d7ead9SPeng Xu 		if (ret != WIFI_SUCCESS) {
37357d7ead9SPeng Xu 			send_resp(dut, conn, SIGMA_ERROR,
37457d7ead9SPeng Xu 				  "NAN config request failed");
37557d7ead9SPeng Xu 			return 0;
37657d7ead9SPeng Xu 		}
37757d7ead9SPeng Xu 	}
37857d7ead9SPeng Xu 
37957d7ead9SPeng Xu 	if (trans_proto) {
38057d7ead9SPeng Xu 		sigma_dut_print(dut, DUT_MSG_INFO, "%s: Transport protocol: %s",
38157d7ead9SPeng Xu 				__func__, trans_proto);
38257d7ead9SPeng Xu 		if (strcasecmp(trans_proto, "TCP") == 0) {
38357d7ead9SPeng Xu 			dut->trans_proto = TRANSPORT_PROTO_TYPE_TCP;
38457d7ead9SPeng Xu 		} else if (strcasecmp(trans_proto, "UDP") == 0) {
38557d7ead9SPeng Xu 			dut->trans_proto = TRANSPORT_PROTO_TYPE_UDP;
38657d7ead9SPeng Xu 		} else {
38757d7ead9SPeng Xu 			sigma_dut_print(dut, DUT_MSG_ERROR,
38857d7ead9SPeng Xu 					"%s: Invalid protocol %s, set to TCP",
38957d7ead9SPeng Xu 					__func__, trans_proto);
39057d7ead9SPeng Xu 			dut->trans_proto = TRANSPORT_PROTO_TYPE_TCP;
39157d7ead9SPeng Xu 		}
39257d7ead9SPeng Xu 	}
39357d7ead9SPeng Xu 
39457d7ead9SPeng Xu 	if (dut->ndpe && ndp_attr) {
39557d7ead9SPeng Xu 		NanDebugParams cfg_debug;
39657d7ead9SPeng Xu 		int ndp_attr_val;
39757d7ead9SPeng Xu 		int ret, size;
39857d7ead9SPeng Xu 
39957d7ead9SPeng Xu 		sigma_dut_print(dut, DUT_MSG_DEBUG, "%s: NDP Attr: %s",
40057d7ead9SPeng Xu 				__func__, ndp_attr);
40157d7ead9SPeng Xu 
40257d7ead9SPeng Xu 		memset(&cfg_debug, 0, sizeof(NanDebugParams));
40357d7ead9SPeng Xu 		cfg_debug.cmd = NAN_TEST_MODE_CMD_ENABLE_NDP;
40457d7ead9SPeng Xu 		if (strcasecmp(ndp_attr, "Absent") == 0)
40557d7ead9SPeng Xu 			ndp_attr_val = NAN_NDP_ATTR_ABSENT;
40657d7ead9SPeng Xu 		else
40757d7ead9SPeng Xu 			ndp_attr_val = NAN_NDP_ATTR_PRESENT;
40857d7ead9SPeng Xu 		memcpy(cfg_debug.debug_cmd_data, &ndp_attr_val, sizeof(int));
40957d7ead9SPeng Xu 		size = sizeof(u32) + sizeof(int);
4102dfb1daeSVinay Gannevaram 		ret = nan_debug_command_config(0, dut->wifi_hal_iface_handle,
41157d7ead9SPeng Xu 					       cfg_debug, size);
41257d7ead9SPeng Xu 		if (ret != WIFI_SUCCESS) {
41357d7ead9SPeng Xu 			send_resp(dut, conn, SIGMA_ERROR,
41457d7ead9SPeng Xu 				  "NAN config ndpAttr failed");
41557d7ead9SPeng Xu 			return 0;
41657d7ead9SPeng Xu 		}
41757d7ead9SPeng Xu 	}
41857d7ead9SPeng Xu #endif
41957d7ead9SPeng Xu 
42014bff1dbSRakesh Sunki 	send_resp(dut, conn, SIGMA_COMPLETE, NULL);
421cd4e3c3eSJouni Malinen 	return 0;
422cd4e3c3eSJouni Malinen }
423cd4e3c3eSJouni Malinen 
424cd4e3c3eSJouni Malinen 
nan_print_further_availability_chan(struct sigma_dut * dut,u8 num_chans,NanFurtherAvailabilityChannel * fachan)4251854ec6fSAmarnath Hullur Subramanyam void nan_print_further_availability_chan(struct sigma_dut *dut,
4261854ec6fSAmarnath Hullur Subramanyam 					 u8 num_chans,
4271854ec6fSAmarnath Hullur Subramanyam 					 NanFurtherAvailabilityChannel *fachan)
4281854ec6fSAmarnath Hullur Subramanyam {
4291854ec6fSAmarnath Hullur Subramanyam 	int idx;
4301854ec6fSAmarnath Hullur Subramanyam 
4311854ec6fSAmarnath Hullur Subramanyam 	sigma_dut_print(dut, DUT_MSG_INFO,
4321854ec6fSAmarnath Hullur Subramanyam 			"********Printing FurtherAvailabilityChan Info******");
4331854ec6fSAmarnath Hullur Subramanyam 	sigma_dut_print(dut, DUT_MSG_INFO, "Numchans:%d", num_chans);
4341854ec6fSAmarnath Hullur Subramanyam 	for (idx = 0; idx < num_chans; idx++) {
4351854ec6fSAmarnath Hullur Subramanyam 		sigma_dut_print(dut, DUT_MSG_INFO,
4361854ec6fSAmarnath Hullur Subramanyam 				"[%d]: NanAvailDuration:%d class_val:%02x channel:%d",
4371854ec6fSAmarnath Hullur Subramanyam 				idx, fachan->entry_control,
4381854ec6fSAmarnath Hullur Subramanyam 				fachan->class_val, fachan->channel);
4391854ec6fSAmarnath Hullur Subramanyam 		sigma_dut_print(dut, DUT_MSG_INFO,
4401854ec6fSAmarnath Hullur Subramanyam 				"[%d]: mapid:%d Availability bitmap:%08x",
4411854ec6fSAmarnath Hullur Subramanyam 				idx, fachan->mapid,
4421854ec6fSAmarnath Hullur Subramanyam 				fachan->avail_interval_bitmap);
4431854ec6fSAmarnath Hullur Subramanyam 	}
4441854ec6fSAmarnath Hullur Subramanyam 	sigma_dut_print(dut, DUT_MSG_INFO,
4451854ec6fSAmarnath Hullur Subramanyam 			"*********************Done**********************");
4461854ec6fSAmarnath Hullur Subramanyam }
4471854ec6fSAmarnath Hullur Subramanyam 
4481854ec6fSAmarnath Hullur Subramanyam 
sigma_nan_enable(struct sigma_dut * dut,struct sigma_conn * conn,struct sigma_cmd * cmd)449cd4e3c3eSJouni Malinen int sigma_nan_enable(struct sigma_dut *dut, struct sigma_conn *conn,
450cd4e3c3eSJouni Malinen 		     struct sigma_cmd *cmd)
451cd4e3c3eSJouni Malinen {
452cd4e3c3eSJouni Malinen 	const char *master_pref = get_param(cmd, "MasterPref");
453cd4e3c3eSJouni Malinen 	const char *rand_fac = get_param(cmd, "RandFactor");
454cd4e3c3eSJouni Malinen 	const char *hop_count = get_param(cmd, "HopCount");
455cd4e3c3eSJouni Malinen 	const char *sdftx_band = get_param(cmd, "SDFTxBand");
456cd4e3c3eSJouni Malinen 	const char *oper_chan = get_param(cmd, "oper_chn");
457cd4e3c3eSJouni Malinen 	const char *further_avail_ind = get_param(cmd, "FurtherAvailInd");
458cd4e3c3eSJouni Malinen 	const char *band = get_param(cmd, "Band");
459cd4e3c3eSJouni Malinen 	const char *only_5g = get_param(cmd, "5GOnly");
46038dd72efSRakesh Sunki 	const char *nan_availability = get_param(cmd, "NANAvailability");
46147d709baSPeng Xu #ifdef NAN_NEW_CERT_VERSION
4628863ec7cSPeng Xu 	const char *ndpe = get_param(cmd, "NDPE");
4638863ec7cSPeng Xu #endif
464cd4e3c3eSJouni Malinen 	struct timespec abstime;
465cd4e3c3eSJouni Malinen 	NanEnableRequest req;
466cd4e3c3eSJouni Malinen 
467cd4e3c3eSJouni Malinen 	memset(&req, 0, sizeof(NanEnableRequest));
468cd4e3c3eSJouni Malinen 	req.cluster_low = 0;
469cd4e3c3eSJouni Malinen 	req.cluster_high = 0xFFFF;
4701854ec6fSAmarnath Hullur Subramanyam 	req.master_pref = 100;
471cd4e3c3eSJouni Malinen 
4721854ec6fSAmarnath Hullur Subramanyam 	/* This is a debug hack to beacon in channel 11 */
473cd4e3c3eSJouni Malinen 	if (oper_chan) {
474cd4e3c3eSJouni Malinen 		req.config_2dot4g_support = 1;
475cd4e3c3eSJouni Malinen 		req.support_2dot4g_val = 111;
476cd4e3c3eSJouni Malinen 	}
477cd4e3c3eSJouni Malinen 
478cd4e3c3eSJouni Malinen 	if (master_pref) {
479cd4e3c3eSJouni Malinen 		int master_pref_val = strtoul(master_pref, NULL, 0);
480cd4e3c3eSJouni Malinen 
481cd4e3c3eSJouni Malinen 		req.master_pref = master_pref_val;
482cd4e3c3eSJouni Malinen 	}
483cd4e3c3eSJouni Malinen 
484cd4e3c3eSJouni Malinen 	if (rand_fac) {
485cd4e3c3eSJouni Malinen 		int rand_fac_val = strtoul(rand_fac, NULL, 0);
486cd4e3c3eSJouni Malinen 
487cd4e3c3eSJouni Malinen 		req.config_random_factor_force = 1;
488cd4e3c3eSJouni Malinen 		req.random_factor_force_val = rand_fac_val;
489cd4e3c3eSJouni Malinen 	}
490cd4e3c3eSJouni Malinen 
491cd4e3c3eSJouni Malinen 	if (hop_count) {
492cd4e3c3eSJouni Malinen 		int hop_count_val = strtoul(hop_count, NULL, 0);
493cd4e3c3eSJouni Malinen 
494cd4e3c3eSJouni Malinen 		req.config_hop_count_force = 1;
495cd4e3c3eSJouni Malinen 		req.hop_count_force_val = hop_count_val;
496cd4e3c3eSJouni Malinen 	}
497cd4e3c3eSJouni Malinen 
498cd4e3c3eSJouni Malinen 	if (sdftx_band) {
499cd4e3c3eSJouni Malinen 		if (strcasecmp(sdftx_band, "5G") == 0) {
500cd4e3c3eSJouni Malinen 			req.config_2dot4g_support = 1;
501cd4e3c3eSJouni Malinen 			req.support_2dot4g_val = 0;
502cd4e3c3eSJouni Malinen 		}
503cd4e3c3eSJouni Malinen 	}
504cd4e3c3eSJouni Malinen 
50547d709baSPeng Xu #ifdef NAN_NEW_CERT_VERSION
5068863ec7cSPeng Xu 	if (ndpe) {
5078863ec7cSPeng Xu 		if (strcasecmp(ndpe, "Enable") == 0) {
5088863ec7cSPeng Xu 			dut->ndpe = 1;
5098863ec7cSPeng Xu 			req.config_ndpe_attr = 1;
5108863ec7cSPeng Xu 			req.use_ndpe_attr = 1;
5118863ec7cSPeng Xu 		} else {
5128863ec7cSPeng Xu 			dut->ndpe = 0;
5138863ec7cSPeng Xu 			req.config_ndpe_attr = 1;
5148863ec7cSPeng Xu 			req.use_ndpe_attr = 0;
5158863ec7cSPeng Xu 		}
5168863ec7cSPeng Xu 		req.config_disc_mac_addr_randomization = 1;
5178863ec7cSPeng Xu 		req.disc_mac_addr_rand_interval_sec = 0;
5188863ec7cSPeng Xu 	}
5198863ec7cSPeng Xu #endif
5208863ec7cSPeng Xu 
521cd4e3c3eSJouni Malinen 	sigma_dut_print(dut, DUT_MSG_INFO,
52247a276adSRakesh Sunki 			"%s: Setting dual band 2.4 GHz and 5 GHz by default",
52347a276adSRakesh Sunki 			__func__);
52447a276adSRakesh Sunki 	/* Enable 2.4 GHz support */
525cd4e3c3eSJouni Malinen 	req.config_2dot4g_support = 1;
526cd4e3c3eSJouni Malinen 	req.support_2dot4g_val = 1;
527cd4e3c3eSJouni Malinen 	req.config_2dot4g_beacons = 1;
528cd4e3c3eSJouni Malinen 	req.beacon_2dot4g_val = 1;
5291854ec6fSAmarnath Hullur Subramanyam 	req.config_2dot4g_sdf = 1;
5301854ec6fSAmarnath Hullur Subramanyam 	req.sdf_2dot4g_val = 1;
531cd4e3c3eSJouni Malinen 
53247a276adSRakesh Sunki 	/* Enable 5 GHz support */
53347a276adSRakesh Sunki 	req.config_support_5g = 1;
53447a276adSRakesh Sunki 	req.support_5g_val = 1;
53547a276adSRakesh Sunki 	req.config_5g_beacons = 1;
53647a276adSRakesh Sunki 	req.beacon_5g_val = 1;
53747a276adSRakesh Sunki 	req.config_5g_sdf = 1;
53847a276adSRakesh Sunki 	req.sdf_5g_val = 1;
53947a276adSRakesh Sunki 
54047a276adSRakesh Sunki 	if (band) {
54147a276adSRakesh Sunki 		if (strcasecmp(band, "24G") == 0) {
54247a276adSRakesh Sunki 			sigma_dut_print(dut, DUT_MSG_INFO,
54347a276adSRakesh Sunki 					"Band 2.4 GHz selected, disable 5 GHz");
544cd4e3c3eSJouni Malinen 			/* Disable 5G support */
5451854ec6fSAmarnath Hullur Subramanyam 			req.config_support_5g = 1;
5461854ec6fSAmarnath Hullur Subramanyam 			req.support_5g_val = 0;
547cd4e3c3eSJouni Malinen 			req.config_5g_beacons = 1;
548cd4e3c3eSJouni Malinen 			req.beacon_5g_val = 0;
5491854ec6fSAmarnath Hullur Subramanyam 			req.config_5g_sdf = 1;
5501854ec6fSAmarnath Hullur Subramanyam 			req.sdf_5g_val = 0;
551cd4e3c3eSJouni Malinen 		}
552cd4e3c3eSJouni Malinen 	}
553cd4e3c3eSJouni Malinen 
554cd4e3c3eSJouni Malinen 	if (further_avail_ind) {
555cd4e3c3eSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_INFO, "FAM Test Enabled");
556cd4e3c3eSJouni Malinen 		if (strcasecmp(further_avail_ind, "tx") == 0) {
557cd4e3c3eSJouni Malinen 			is_fam = 1;
558cd4e3c3eSJouni Malinen 			nan_further_availability_tx(dut, conn, cmd);
559cd4e3c3eSJouni Malinen 			return 0;
560cd4e3c3eSJouni Malinen 		} else if (strcasecmp(further_avail_ind, "rx") == 0) {
561cd4e3c3eSJouni Malinen 			nan_further_availability_rx(dut, conn, cmd);
562cd4e3c3eSJouni Malinen 			return 0;
563cd4e3c3eSJouni Malinen 		}
564cd4e3c3eSJouni Malinen 	}
565cd4e3c3eSJouni Malinen 
566cd4e3c3eSJouni Malinen 	if (only_5g && atoi(only_5g)) {
567cd4e3c3eSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_INFO, "5GHz only enabled");
568cd4e3c3eSJouni Malinen 		req.config_2dot4g_support = 1;
569cd4e3c3eSJouni Malinen 		req.support_2dot4g_val = 1;
570cd4e3c3eSJouni Malinen 		req.config_2dot4g_beacons = 1;
571cd4e3c3eSJouni Malinen 		req.beacon_2dot4g_val = 0;
5721854ec6fSAmarnath Hullur Subramanyam 		req.config_2dot4g_sdf = 1;
5731854ec6fSAmarnath Hullur Subramanyam 		req.sdf_2dot4g_val = 1;
574cd4e3c3eSJouni Malinen 	}
575cd4e3c3eSJouni Malinen 
576c2ae961eSAjit Vaishya 	if (if_nametoindex(NAN_AWARE_IFACE))
577c2ae961eSAjit Vaishya 		run_system_wrapper(dut, "ifconfig %s up", NAN_AWARE_IFACE);
578c2ae961eSAjit Vaishya 
5792dfb1daeSVinay Gannevaram 	nan_enable_request(0, dut->wifi_hal_iface_handle, &req);
580116be195SKantesh Mundaragi 
58138dd72efSRakesh Sunki 	if (nan_availability) {
58238dd72efSRakesh Sunki 		int cmd_len, size;
58338dd72efSRakesh Sunki 		NanDebugParams cfg_debug;
58438dd72efSRakesh Sunki 
58538dd72efSRakesh Sunki 		sigma_dut_print(dut, DUT_MSG_INFO,
58638dd72efSRakesh Sunki 				"%s given string nan_availability: %s",
58738dd72efSRakesh Sunki 				__func__, nan_availability);
58838dd72efSRakesh Sunki 		memset(&cfg_debug, 0, sizeof(NanDebugParams));
58938dd72efSRakesh Sunki 		cfg_debug.cmd = NAN_TEST_MODE_CMD_NAN_AVAILABILITY;
59038dd72efSRakesh Sunki 		size = NAN_MAX_DEBUG_MESSAGE_DATA_LEN;
59138dd72efSRakesh Sunki 		nan_parse_hex_string(dut, &nan_availability[2],
59238dd72efSRakesh Sunki 				     &cfg_debug.debug_cmd_data[0], &size);
59338dd72efSRakesh Sunki 		sigma_dut_print(dut, DUT_MSG_INFO, "%s:hex nan_availability",
59438dd72efSRakesh Sunki 				__func__);
59538dd72efSRakesh Sunki 		nan_hex_dump(dut, &cfg_debug.debug_cmd_data[0], size);
59638dd72efSRakesh Sunki 		cmd_len = size + sizeof(u32);
5972dfb1daeSVinay Gannevaram 		nan_debug_command_config(0, dut->wifi_hal_iface_handle,
59838dd72efSRakesh Sunki 					 cfg_debug, cmd_len);
59938dd72efSRakesh Sunki 	}
60038dd72efSRakesh Sunki 
601116be195SKantesh Mundaragi 	/* To ensure sta_get_events to get the events
602116be195SKantesh Mundaragi 	 * only after joining the NAN cluster. */
603116be195SKantesh Mundaragi 	abstime.tv_sec = 30;
604cd4e3c3eSJouni Malinen 	abstime.tv_nsec = 0;
605116be195SKantesh Mundaragi 	wait(abstime);
606116be195SKantesh Mundaragi 
607116be195SKantesh Mundaragi 	return 0;
608cd4e3c3eSJouni Malinen }
609cd4e3c3eSJouni Malinen 
610cd4e3c3eSJouni Malinen 
sigma_nan_disable(struct sigma_dut * dut,struct sigma_conn * conn,struct sigma_cmd * cmd)611cd4e3c3eSJouni Malinen int sigma_nan_disable(struct sigma_dut *dut, struct sigma_conn *conn,
612cd4e3c3eSJouni Malinen 		      struct sigma_cmd *cmd)
613cd4e3c3eSJouni Malinen {
614cd4e3c3eSJouni Malinen 	struct timespec abstime;
615cd4e3c3eSJouni Malinen 
6162dfb1daeSVinay Gannevaram 	nan_disable_request(0, dut->wifi_hal_iface_handle);
617cd4e3c3eSJouni Malinen 
618cd4e3c3eSJouni Malinen 	abstime.tv_sec = 4;
619cd4e3c3eSJouni Malinen 	abstime.tv_nsec = 0;
620116be195SKantesh Mundaragi 	wait(abstime);
621116be195SKantesh Mundaragi 
622116be195SKantesh Mundaragi 	return 0;
623cd4e3c3eSJouni Malinen }
624cd4e3c3eSJouni Malinen 
625cd4e3c3eSJouni Malinen 
sigma_nan_config_enable(struct sigma_dut * dut,struct sigma_conn * conn,struct sigma_cmd * cmd)626cd4e3c3eSJouni Malinen int sigma_nan_config_enable(struct sigma_dut *dut, struct sigma_conn *conn,
627cd4e3c3eSJouni Malinen 			    struct sigma_cmd *cmd)
628cd4e3c3eSJouni Malinen {
629cd4e3c3eSJouni Malinen 	const char *master_pref = get_param(cmd, "MasterPref");
630cd4e3c3eSJouni Malinen 	const char *rand_fac = get_param(cmd, "RandFactor");
631cd4e3c3eSJouni Malinen 	const char *hop_count = get_param(cmd, "HopCount");
632107356c8SRakesh Sunki 	wifi_error ret;
633cd4e3c3eSJouni Malinen 	struct timespec abstime;
634cd4e3c3eSJouni Malinen 	NanConfigRequest req;
635cd4e3c3eSJouni Malinen 
636cd4e3c3eSJouni Malinen 	memset(&req, 0, sizeof(NanConfigRequest));
637cd4e3c3eSJouni Malinen 	req.config_rssi_proximity = 1;
638cd4e3c3eSJouni Malinen 	req.rssi_proximity = 70;
639cd4e3c3eSJouni Malinen 
640cd4e3c3eSJouni Malinen 	if (master_pref) {
641cd4e3c3eSJouni Malinen 		int master_pref_val = strtoul(master_pref, NULL, 0);
642cd4e3c3eSJouni Malinen 
643cd4e3c3eSJouni Malinen 		req.config_master_pref = 1;
644cd4e3c3eSJouni Malinen 		req.master_pref = master_pref_val;
645cd4e3c3eSJouni Malinen 	}
646cd4e3c3eSJouni Malinen 
647cd4e3c3eSJouni Malinen 	if (rand_fac) {
648cd4e3c3eSJouni Malinen 		int rand_fac_val = strtoul(rand_fac, NULL, 0);
649cd4e3c3eSJouni Malinen 
650cd4e3c3eSJouni Malinen 		req.config_random_factor_force = 1;
651cd4e3c3eSJouni Malinen 		req.random_factor_force_val = rand_fac_val;
652cd4e3c3eSJouni Malinen 	}
653cd4e3c3eSJouni Malinen 
654cd4e3c3eSJouni Malinen 	if (hop_count) {
655cd4e3c3eSJouni Malinen 		int hop_count_val = strtoul(hop_count, NULL, 0);
656cd4e3c3eSJouni Malinen 
657cd4e3c3eSJouni Malinen 		req.config_hop_count_force = 1;
658cd4e3c3eSJouni Malinen 		req.hop_count_force_val = hop_count_val;
659cd4e3c3eSJouni Malinen 	}
660cd4e3c3eSJouni Malinen 
6612dfb1daeSVinay Gannevaram 	ret = nan_config_request(0, dut->wifi_hal_iface_handle, &req);
662107356c8SRakesh Sunki 	if (ret != WIFI_SUCCESS)
663107356c8SRakesh Sunki 		send_resp(dut, conn, SIGMA_ERROR, "NAN config request failed");
664cd4e3c3eSJouni Malinen 
665cd4e3c3eSJouni Malinen 	abstime.tv_sec = 4;
666cd4e3c3eSJouni Malinen 	abstime.tv_nsec = 0;
667116be195SKantesh Mundaragi 	wait(abstime);
668cd4e3c3eSJouni Malinen 
669116be195SKantesh Mundaragi 	return 0;
670cd4e3c3eSJouni Malinen }
671cd4e3c3eSJouni Malinen 
672cd4e3c3eSJouni Malinen 
sigma_nan_subscribe_request(struct sigma_dut * dut,struct sigma_conn * conn,struct sigma_cmd * cmd)673cd4e3c3eSJouni Malinen static int sigma_nan_subscribe_request(struct sigma_dut *dut,
674cd4e3c3eSJouni Malinen 				       struct sigma_conn *conn,
675cd4e3c3eSJouni Malinen 				       struct sigma_cmd *cmd)
676cd4e3c3eSJouni Malinen {
677cd4e3c3eSJouni Malinen 	const char *subscribe_type = get_param(cmd, "SubscribeType");
678cd4e3c3eSJouni Malinen 	const char *service_name = get_param(cmd, "ServiceName");
679cd4e3c3eSJouni Malinen 	const char *disc_range = get_param(cmd, "DiscoveryRange");
680cd4e3c3eSJouni Malinen 	const char *rx_match_filter = get_param(cmd, "rxMatchFilter");
681cd4e3c3eSJouni Malinen 	const char *tx_match_filter = get_param(cmd, "txMatchFilter");
682cd4e3c3eSJouni Malinen 	const char *sdftx_dw = get_param(cmd, "SDFTxDW");
683cd4e3c3eSJouni Malinen 	const char *discrange_ltd = get_param(cmd, "DiscRangeLtd");
684cd4e3c3eSJouni Malinen 	const char *include_bit = get_param(cmd, "IncludeBit");
685cd4e3c3eSJouni Malinen 	const char *mac = get_param(cmd, "MAC");
686cd4e3c3eSJouni Malinen 	const char *srf_type = get_param(cmd, "SRFType");
687ff76d8cbSRakesh Sunki #if NAN_CERT_VERSION >= 3
688e6f6683bSRakesh Sunki 	const char *awake_dw_interval = get_param(cmd, "awakeDWint");
689ff76d8cbSRakesh Sunki #endif
690cd4e3c3eSJouni Malinen 	NanSubscribeRequest req;
691e6f6683bSRakesh Sunki 	NanConfigRequest config_req;
692cd4e3c3eSJouni Malinen 	int filter_len_rx = 0, filter_len_tx = 0;
693cd4e3c3eSJouni Malinen 	u8 input_rx[NAN_MAX_MATCH_FILTER_LEN];
694cd4e3c3eSJouni Malinen 	u8 input_tx[NAN_MAX_MATCH_FILTER_LEN];
695107356c8SRakesh Sunki 	wifi_error ret;
696cd4e3c3eSJouni Malinen 
697cd4e3c3eSJouni Malinen 	memset(&req, 0, sizeof(NanSubscribeRequest));
698e6f6683bSRakesh Sunki 	memset(&config_req, 0, sizeof(NanConfigRequest));
699cd4e3c3eSJouni Malinen 	req.ttl = 0;
7004625de76SRakesh Sunki 	req.period = 1;
701cd4e3c3eSJouni Malinen 	req.subscribe_type = 1;
702cd4e3c3eSJouni Malinen 	req.serviceResponseFilter = 1; /* MAC */
703cd4e3c3eSJouni Malinen 	req.serviceResponseInclude = 0;
704cd4e3c3eSJouni Malinen 	req.ssiRequiredForMatchIndication = 0;
7051854ec6fSAmarnath Hullur Subramanyam 	req.subscribe_match_indicator = NAN_MATCH_ALG_MATCH_CONTINUOUS;
706cd4e3c3eSJouni Malinen 	req.subscribe_count = 0;
707cd4e3c3eSJouni Malinen 
70874f4f992SRakesh Sunki 	if (global_subscribe_service_name_len &&
70974f4f992SRakesh Sunki 	    service_name &&
71074f4f992SRakesh Sunki 	    strcasecmp((char *) global_subscribe_service_name,
71174f4f992SRakesh Sunki 		       service_name) == 0 &&
71274f4f992SRakesh Sunki 	    global_subscribe_id) {
71374f4f992SRakesh Sunki 		req.subscribe_id = global_subscribe_id;
71474f4f992SRakesh Sunki 		sigma_dut_print(dut, DUT_MSG_INFO,
71574f4f992SRakesh Sunki 				"%s: updating subscribe_id = %d in subscribe request",
71674f4f992SRakesh Sunki 				__func__, req.subscribe_id);
71774f4f992SRakesh Sunki 	}
71874f4f992SRakesh Sunki 
719cd4e3c3eSJouni Malinen 	if (subscribe_type) {
720cd4e3c3eSJouni Malinen 		if (strcasecmp(subscribe_type, "Active") == 0) {
721cd4e3c3eSJouni Malinen 			req.subscribe_type = 1;
722cd4e3c3eSJouni Malinen 		} else if (strcasecmp(subscribe_type, "Passive") == 0) {
723cd4e3c3eSJouni Malinen 			req.subscribe_type = 0;
724cd4e3c3eSJouni Malinen 		} else if (strcasecmp(subscribe_type, "Cancel") == 0) {
725cd4e3c3eSJouni Malinen 			NanSubscribeCancelRequest req;
726cd4e3c3eSJouni Malinen 
727cd4e3c3eSJouni Malinen 			memset(&req, 0, sizeof(NanSubscribeCancelRequest));
728107356c8SRakesh Sunki 			ret = nan_subscribe_cancel_request(
7292dfb1daeSVinay Gannevaram 				0, dut->wifi_hal_iface_handle, &req);
730107356c8SRakesh Sunki 			if (ret != WIFI_SUCCESS) {
731107356c8SRakesh Sunki 				send_resp(dut, conn, SIGMA_ERROR,
732107356c8SRakesh Sunki 					  "NAN subscribe cancel request failed");
733107356c8SRakesh Sunki 			}
734cd4e3c3eSJouni Malinen 			return 0;
735cd4e3c3eSJouni Malinen 		}
736cd4e3c3eSJouni Malinen 	}
737cd4e3c3eSJouni Malinen 
738cd4e3c3eSJouni Malinen 	if (disc_range)
739cd4e3c3eSJouni Malinen 		req.rssi_threshold_flag = atoi(disc_range);
740cd4e3c3eSJouni Malinen 
741cd4e3c3eSJouni Malinen 	if (sdftx_dw)
742cd4e3c3eSJouni Malinen 		req.subscribe_count = atoi(sdftx_dw);
743cd4e3c3eSJouni Malinen 
744cd4e3c3eSJouni Malinen 	/* Check this once again if config can be called here (TBD) */
745cd4e3c3eSJouni Malinen 	if (discrange_ltd)
746cd4e3c3eSJouni Malinen 		req.rssi_threshold_flag = atoi(discrange_ltd);
747cd4e3c3eSJouni Malinen 
748cd4e3c3eSJouni Malinen 	if (include_bit) {
749cd4e3c3eSJouni Malinen 		int include_bit_val = atoi(include_bit);
750cd4e3c3eSJouni Malinen 
751cd4e3c3eSJouni Malinen 		req.serviceResponseInclude = include_bit_val;
752cd4e3c3eSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_INFO, "Includebit set %d",
753cd4e3c3eSJouni Malinen 				req.serviceResponseInclude);
754cd4e3c3eSJouni Malinen 	}
755cd4e3c3eSJouni Malinen 
756cd4e3c3eSJouni Malinen 	if (srf_type) {
757cd4e3c3eSJouni Malinen 		int srf_type_val = atoi(srf_type);
758cd4e3c3eSJouni Malinen 
759cd4e3c3eSJouni Malinen 		if (srf_type_val == 1)
760cd4e3c3eSJouni Malinen 			req.serviceResponseFilter = 0; /* Bloom */
761cd4e3c3eSJouni Malinen 		else
762cd4e3c3eSJouni Malinen 			req.serviceResponseFilter = 1; /* MAC */
763cd4e3c3eSJouni Malinen 		req.useServiceResponseFilter = 1;
764cd4e3c3eSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_INFO, "srfFilter %d",
765cd4e3c3eSJouni Malinen 				req.serviceResponseFilter);
766cd4e3c3eSJouni Malinen 	}
767cd4e3c3eSJouni Malinen 
768cd4e3c3eSJouni Malinen 	if (mac) {
769cd4e3c3eSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_INFO, "MAC_ADDR List %s", mac);
770cd4e3c3eSJouni Malinen 		req.num_intf_addr_present = nan_parse_mac_address_list(
771cd4e3c3eSJouni Malinen 			dut, mac, &req.intf_addr[0][0],
772cd4e3c3eSJouni Malinen 			NAN_MAX_SUBSCRIBE_MAX_ADDRESS);
773cd4e3c3eSJouni Malinen 	}
774cd4e3c3eSJouni Malinen 
775cd4e3c3eSJouni Malinen 	memset(input_rx, 0, sizeof(input_rx));
776cd4e3c3eSJouni Malinen 	memset(input_tx, 0, sizeof(input_tx));
777cd4e3c3eSJouni Malinen 	if (rx_match_filter) {
778cd4e3c3eSJouni Malinen 		nan_parse_token(rx_match_filter, input_rx, &filter_len_rx);
779cd4e3c3eSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_INFO, "RxFilterLen %d",
780cd4e3c3eSJouni Malinen 				filter_len_rx);
781cd4e3c3eSJouni Malinen 	}
782cd4e3c3eSJouni Malinen 	if (tx_match_filter) {
783cd4e3c3eSJouni Malinen 		nan_parse_token(tx_match_filter, input_tx, &filter_len_tx);
784cd4e3c3eSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_INFO, "TxFilterLen %d",
785cd4e3c3eSJouni Malinen 				filter_len_tx);
786cd4e3c3eSJouni Malinen 	}
787cd4e3c3eSJouni Malinen 
788cd4e3c3eSJouni Malinen 	if (tx_match_filter) {
789cd4e3c3eSJouni Malinen 		req.tx_match_filter_len = filter_len_tx;
790cd4e3c3eSJouni Malinen 		memcpy(req.tx_match_filter, input_tx, filter_len_tx);
791cd4e3c3eSJouni Malinen 		nan_hex_dump(dut, req.tx_match_filter, filter_len_tx);
792cd4e3c3eSJouni Malinen 	}
793cd4e3c3eSJouni Malinen 	if (rx_match_filter) {
794cd4e3c3eSJouni Malinen 		req.rx_match_filter_len = filter_len_rx;
795cd4e3c3eSJouni Malinen 		memcpy(req.rx_match_filter, input_rx, filter_len_rx);
796cd4e3c3eSJouni Malinen 		nan_hex_dump(dut, req.rx_match_filter, filter_len_rx);
797cd4e3c3eSJouni Malinen 	}
798cd4e3c3eSJouni Malinen 
799132c6d2bSKantesh Mundaragi 	if (service_name) {
800cd4e3c3eSJouni Malinen 		strlcpy((char *) req.service_name, service_name,
801cd4e3c3eSJouni Malinen 			strlen(service_name) + 1);
802cd4e3c3eSJouni Malinen 		req.service_name_len = strlen(service_name);
80374f4f992SRakesh Sunki 		strlcpy((char *) global_subscribe_service_name, service_name,
80474f4f992SRakesh Sunki 			sizeof(global_subscribe_service_name));
80574f4f992SRakesh Sunki 		global_subscribe_service_name_len =
80674f4f992SRakesh Sunki 			strlen((char *) global_subscribe_service_name);
807132c6d2bSKantesh Mundaragi 	}
808cd4e3c3eSJouni Malinen 
809ff76d8cbSRakesh Sunki #if NAN_CERT_VERSION >= 3
810e6f6683bSRakesh Sunki 	if (awake_dw_interval) {
811e6f6683bSRakesh Sunki 		int input_dw_interval_val = atoi(awake_dw_interval);
812e6f6683bSRakesh Sunki 		int awake_dw_int = 0;
813e6f6683bSRakesh Sunki 
814e6f6683bSRakesh Sunki 		if (input_dw_interval_val > NAN_MAX_ALLOWED_DW_AWAKE_INTERVAL) {
815e6f6683bSRakesh Sunki 			sigma_dut_print(dut, DUT_MSG_INFO,
816e6f6683bSRakesh Sunki 					"%s: input active dw interval = %d overwritting dw interval to Max allowed dw interval 16",
817e6f6683bSRakesh Sunki 					__func__, input_dw_interval_val);
818e6f6683bSRakesh Sunki 			input_dw_interval_val =
819e6f6683bSRakesh Sunki 				NAN_MAX_ALLOWED_DW_AWAKE_INTERVAL;
820e6f6683bSRakesh Sunki 		}
821e6f6683bSRakesh Sunki 		sigma_dut_print(dut, DUT_MSG_INFO,
822e6f6683bSRakesh Sunki 				"%s: input active DW interval = %d",
823e6f6683bSRakesh Sunki 				__func__, input_dw_interval_val);
824e6f6683bSRakesh Sunki 		/*
825e6f6683bSRakesh Sunki 		 * Indicates the interval for Sync beacons and SDF's in 2.4 GHz
826e6f6683bSRakesh Sunki 		 * or 5 GHz band. Valid values of DW Interval are: 1, 2, 3, 4,
827e6f6683bSRakesh Sunki 		 * and 5; 0 is reserved. The SDF includes in OTA when enabled.
828e6f6683bSRakesh Sunki 		 * The publish/subscribe period values don't override the device
829e6f6683bSRakesh Sunki 		 * level configurations.
830e6f6683bSRakesh Sunki 		 * input_dw_interval_val is provided by the user are in the
831e6f6683bSRakesh Sunki 		 * format 2^n-1 = 1/2/4/8/16. Internal implementation expects n
832e6f6683bSRakesh Sunki 		 * to be passed to indicate the awake_dw_interval.
833e6f6683bSRakesh Sunki 		 */
834e6f6683bSRakesh Sunki 		if (input_dw_interval_val == 1 ||
835e6f6683bSRakesh Sunki 		    input_dw_interval_val % 2 == 0) {
836e6f6683bSRakesh Sunki 			while (input_dw_interval_val > 0) {
837e6f6683bSRakesh Sunki 				input_dw_interval_val >>= 1;
838e6f6683bSRakesh Sunki 				awake_dw_int++;
839e6f6683bSRakesh Sunki 			}
840e6f6683bSRakesh Sunki 		}
841e6f6683bSRakesh Sunki 		sigma_dut_print(dut, DUT_MSG_INFO,
842e6f6683bSRakesh Sunki 				"%s:converted active DW interval = %d",
843e6f6683bSRakesh Sunki 				__func__, awake_dw_int);
844e6f6683bSRakesh Sunki 		config_req.config_dw.config_2dot4g_dw_band = 1;
845e6f6683bSRakesh Sunki 		config_req.config_dw.dw_2dot4g_interval_val = awake_dw_int;
846e6f6683bSRakesh Sunki 		config_req.config_dw.config_5g_dw_band = 1;
847e6f6683bSRakesh Sunki 		config_req.config_dw.dw_5g_interval_val = awake_dw_int;
8482dfb1daeSVinay Gannevaram 		ret = nan_config_request(0, dut->wifi_hal_iface_handle,
849e6f6683bSRakesh Sunki 					 &config_req);
850e6f6683bSRakesh Sunki 		if (ret != WIFI_SUCCESS) {
851e6f6683bSRakesh Sunki 			sigma_dut_print(dut, DUT_MSG_ERROR,
852e6f6683bSRakesh Sunki 					"%s:NAN config request failed",
853e6f6683bSRakesh Sunki 					__func__);
854e6f6683bSRakesh Sunki 			return -2;
855e6f6683bSRakesh Sunki 		}
856e6f6683bSRakesh Sunki 	}
857ff76d8cbSRakesh Sunki #endif
858e6f6683bSRakesh Sunki 
8592dfb1daeSVinay Gannevaram 	ret = nan_subscribe_request(0, dut->wifi_hal_iface_handle, &req);
860107356c8SRakesh Sunki 	if (ret != WIFI_SUCCESS) {
861107356c8SRakesh Sunki 		send_resp(dut, conn, SIGMA_ERROR,
862107356c8SRakesh Sunki 			  "NAN subscribe request failed");
863107356c8SRakesh Sunki 	}
864107356c8SRakesh Sunki 
865cd4e3c3eSJouni Malinen 	return 0;
866cd4e3c3eSJouni Malinen }
867cd4e3c3eSJouni Malinen 
868cd4e3c3eSJouni Malinen 
sigma_ndp_configure_band(struct sigma_dut * dut,struct sigma_conn * conn,struct sigma_cmd * cmd,NdpSupportedBand band_config_val)869d7344c02SRakesh Sunki static int sigma_ndp_configure_band(struct sigma_dut *dut,
870d7344c02SRakesh Sunki 				    struct sigma_conn *conn,
871d7344c02SRakesh Sunki 				    struct sigma_cmd *cmd,
872d7344c02SRakesh Sunki 				    NdpSupportedBand band_config_val)
873d7344c02SRakesh Sunki {
874d7344c02SRakesh Sunki 	wifi_error ret;
875d7344c02SRakesh Sunki 	NanDebugParams cfg_debug;
876d7344c02SRakesh Sunki 	int size;
877d7344c02SRakesh Sunki 
878d7344c02SRakesh Sunki 	memset(&cfg_debug, 0, sizeof(NanDebugParams));
879d7344c02SRakesh Sunki 	cfg_debug.cmd = NAN_TEST_MODE_CMD_NAN_SUPPORTED_BANDS;
880d7344c02SRakesh Sunki 	memcpy(cfg_debug.debug_cmd_data, &band_config_val, sizeof(int));
881d7344c02SRakesh Sunki 	sigma_dut_print(dut, DUT_MSG_INFO, "%s:setting debug cmd=0x%x",
882d7344c02SRakesh Sunki 			__func__, cfg_debug.cmd);
883d7344c02SRakesh Sunki 	size = sizeof(u32) + sizeof(int);
8842dfb1daeSVinay Gannevaram 	ret = nan_debug_command_config(0, dut->wifi_hal_iface_handle, cfg_debug,
885d7344c02SRakesh Sunki 				       size);
886d7344c02SRakesh Sunki 	if (ret != WIFI_SUCCESS)
887d7344c02SRakesh Sunki 		send_resp(dut, conn, SIGMA_ERROR, "Nan config request failed");
888d7344c02SRakesh Sunki 
889d7344c02SRakesh Sunki 	return 0;
890d7344c02SRakesh Sunki }
891d7344c02SRakesh Sunki 
892d7344c02SRakesh Sunki 
sigma_nan_data_request(struct sigma_dut * dut,struct sigma_conn * conn,struct sigma_cmd * cmd)89314cfcd25SRakesh Sunki static int sigma_nan_data_request(struct sigma_dut *dut,
89414cfcd25SRakesh Sunki 				  struct sigma_conn *conn,
89514cfcd25SRakesh Sunki 				  struct sigma_cmd *cmd)
89614cfcd25SRakesh Sunki {
89714cfcd25SRakesh Sunki 	const char *ndp_security = get_param(cmd, "DataPathSecurity");
89814cfcd25SRakesh Sunki 	const char *ndp_resp_mac = get_param(cmd, "RespNanMac");
89914cfcd25SRakesh Sunki 	const char *include_immutable = get_param(cmd, "includeimmutable");
90014cfcd25SRakesh Sunki 	const char *avoid_channel = get_param(cmd, "avoidchannel");
90114cfcd25SRakesh Sunki 	const char *invalid_nan_schedule = get_param(cmd, "InvalidNANSchedule");
90214cfcd25SRakesh Sunki 	const char *map_order = get_param(cmd, "maporder");
9038a4845d0SRakesh Sunki #if NAN_CERT_VERSION >= 3
9048a4845d0SRakesh Sunki 	const char *qos_config = get_param(cmd, "QoS");
9058a4845d0SRakesh Sunki #endif
90647d709baSPeng Xu #ifdef NAN_NEW_CERT_VERSION
907b0c682ceSPeng Xu 	const char *ndpe_enable = get_param(cmd, "Ndpe");
908b0c682ceSPeng Xu 	const char *ndpe_attr = get_param(cmd, "ndpeAttr");
9092486bbeeSPeng Xu 	const char *ndp_attr = get_param(cmd, "ndpAttr");
9107b1b9e14SPeng Xu 	const char *tlv_list = get_param(cmd, "TLVList");
911b0c682ceSPeng Xu #endif
91214cfcd25SRakesh Sunki 	wifi_error ret;
91314cfcd25SRakesh Sunki 	NanDataPathInitiatorRequest init_req;
91414cfcd25SRakesh Sunki 	NanDebugParams cfg_debug;
91514cfcd25SRakesh Sunki 	int size;
91614cfcd25SRakesh Sunki 
91714cfcd25SRakesh Sunki 	memset(&init_req, 0, sizeof(NanDataPathInitiatorRequest));
91814cfcd25SRakesh Sunki 
91914cfcd25SRakesh Sunki 	if (ndp_security) {
92014cfcd25SRakesh Sunki 		if (strcasecmp(ndp_security, "open") == 0)
92114cfcd25SRakesh Sunki 			init_req.ndp_cfg.security_cfg =
92214cfcd25SRakesh Sunki 				NAN_DP_CONFIG_NO_SECURITY;
92314cfcd25SRakesh Sunki 		else if (strcasecmp(ndp_security, "secure") == 0)
92414cfcd25SRakesh Sunki 			init_req.ndp_cfg.security_cfg = NAN_DP_CONFIG_SECURITY;
92514cfcd25SRakesh Sunki 	}
92614cfcd25SRakesh Sunki 
92714cfcd25SRakesh Sunki 	if (include_immutable) {
92814cfcd25SRakesh Sunki 		int include_immutable_val = 0;
92914cfcd25SRakesh Sunki 
93014cfcd25SRakesh Sunki 		memset(&cfg_debug, 0, sizeof(NanDebugParams));
93114cfcd25SRakesh Sunki 		cfg_debug.cmd = NAN_TEST_MODE_CMD_NDP_INCLUDE_IMMUTABLE;
93214cfcd25SRakesh Sunki 		include_immutable_val = atoi(include_immutable);
93314cfcd25SRakesh Sunki 		memcpy(cfg_debug.debug_cmd_data, &include_immutable_val,
93414cfcd25SRakesh Sunki 		       sizeof(int));
93514cfcd25SRakesh Sunki 		size = sizeof(u32) + sizeof(int);
9362dfb1daeSVinay Gannevaram 		nan_debug_command_config(0, dut->wifi_hal_iface_handle,
93714cfcd25SRakesh Sunki 		cfg_debug, size);
93814cfcd25SRakesh Sunki 	}
93914cfcd25SRakesh Sunki 
94014cfcd25SRakesh Sunki 	if (avoid_channel) {
94114cfcd25SRakesh Sunki 		int avoid_channel_freq = 0;
94214cfcd25SRakesh Sunki 
94314cfcd25SRakesh Sunki 		memset(&cfg_debug, 0, sizeof(NanDebugParams));
944093569ffSAlexei Avshalom Lazar 		avoid_channel_freq = channel_to_freq(dut, atoi(avoid_channel));
94514cfcd25SRakesh Sunki 		cfg_debug.cmd = NAN_TEST_MODE_CMD_NDP_AVOID_CHANNEL;
94614cfcd25SRakesh Sunki 		memcpy(cfg_debug.debug_cmd_data, &avoid_channel_freq,
94714cfcd25SRakesh Sunki 		       sizeof(int));
94814cfcd25SRakesh Sunki 		size = sizeof(u32) + sizeof(int);
9492dfb1daeSVinay Gannevaram 		nan_debug_command_config(0, dut->wifi_hal_iface_handle,
95014cfcd25SRakesh Sunki 					 cfg_debug, size);
95114cfcd25SRakesh Sunki 	}
95214cfcd25SRakesh Sunki 
95314cfcd25SRakesh Sunki 	if (invalid_nan_schedule) {
95414cfcd25SRakesh Sunki 		int invalid_nan_schedule_type = 0;
95514cfcd25SRakesh Sunki 
95614cfcd25SRakesh Sunki 		memset(&cfg_debug, 0, sizeof(NanDebugParams));
95714cfcd25SRakesh Sunki 		invalid_nan_schedule_type = atoi(invalid_nan_schedule);
95814cfcd25SRakesh Sunki 		cfg_debug.cmd = NAN_TEST_MODE_CMD_NAN_SCHED_TYPE;
95914cfcd25SRakesh Sunki 		memcpy(cfg_debug.debug_cmd_data,
96014cfcd25SRakesh Sunki 		       &invalid_nan_schedule_type, sizeof(int));
96114cfcd25SRakesh Sunki 		size = sizeof(u32) + sizeof(int);
96214cfcd25SRakesh Sunki 		sigma_dut_print(dut, DUT_MSG_INFO,
96314cfcd25SRakesh Sunki 				"%s: invalid schedule type: cmd type = %d and command data = %d",
96414cfcd25SRakesh Sunki 				__func__, cfg_debug.cmd,
96514cfcd25SRakesh Sunki 				invalid_nan_schedule_type);
9662dfb1daeSVinay Gannevaram 		nan_debug_command_config(0, dut->wifi_hal_iface_handle,
96714cfcd25SRakesh Sunki 					 cfg_debug, size);
96814cfcd25SRakesh Sunki 	}
96914cfcd25SRakesh Sunki 
97014cfcd25SRakesh Sunki 	if (map_order) {
97114cfcd25SRakesh Sunki 		int map_order_val = 0;
97214cfcd25SRakesh Sunki 
97314cfcd25SRakesh Sunki 		memset(&cfg_debug, 0, sizeof(NanDebugParams));
97414cfcd25SRakesh Sunki 		cfg_debug.cmd = NAN_TEST_MODE_CMD_NAN_AVAILABILITY_MAP_ORDER;
97514cfcd25SRakesh Sunki 		map_order_val = atoi(map_order);
97614cfcd25SRakesh Sunki 		memcpy(cfg_debug.debug_cmd_data, &map_order_val, sizeof(int));
97714cfcd25SRakesh Sunki 		size = sizeof(u32) + sizeof(int);
97814cfcd25SRakesh Sunki 		sigma_dut_print(dut, DUT_MSG_INFO,
97914cfcd25SRakesh Sunki 				"%s: map order: cmd type = %d and command data = %d",
98014cfcd25SRakesh Sunki 				__func__,
9819eaa677aSRakesh Sunki 				cfg_debug.cmd, map_order_val);
9822dfb1daeSVinay Gannevaram 		nan_debug_command_config(0, dut->wifi_hal_iface_handle,
98314cfcd25SRakesh Sunki 					 cfg_debug, size);
98414cfcd25SRakesh Sunki 	}
98514cfcd25SRakesh Sunki 
9868a4845d0SRakesh Sunki #if NAN_CERT_VERSION >= 3
9878a4845d0SRakesh Sunki 	if (qos_config) {
9888a4845d0SRakesh Sunki 		u32 qos_config_val = 0;
9898a4845d0SRakesh Sunki 
9908a4845d0SRakesh Sunki 		memset(&cfg_debug, 0, sizeof(NanDebugParams));
9918a4845d0SRakesh Sunki 		cfg_debug.cmd = NAN_TEST_MODE_CMD_CONFIG_QOS;
9928a4845d0SRakesh Sunki 		qos_config_val = atoi(qos_config);
9938a4845d0SRakesh Sunki 		memcpy(cfg_debug.debug_cmd_data, &qos_config_val, sizeof(u32));
9948a4845d0SRakesh Sunki 		size = sizeof(u32) + sizeof(u32);
9958a4845d0SRakesh Sunki 		sigma_dut_print(dut, DUT_MSG_INFO,
9968a4845d0SRakesh Sunki 				"%s: qos config: cmd type = %d and command data = %d",
9978a4845d0SRakesh Sunki 				__func__, cfg_debug.cmd, qos_config_val);
9982dfb1daeSVinay Gannevaram 		nan_debug_command_config(0, dut->wifi_hal_iface_handle,
9998a4845d0SRakesh Sunki 					 cfg_debug, size);
10008a4845d0SRakesh Sunki 	}
10018a4845d0SRakesh Sunki #endif
10028a4845d0SRakesh Sunki 
100347d709baSPeng Xu #ifdef NAN_NEW_CERT_VERSION
1004b0c682ceSPeng Xu 	if (ndpe_enable &&
1005b0c682ceSPeng Xu 	    strcasecmp(ndpe_enable, "Enable") == 0)
1006b0c682ceSPeng Xu 		dut->ndpe = 1;
1007b0c682ceSPeng Xu 
10082486bbeeSPeng Xu 	if (dut->ndpe && ndp_attr) {
10092486bbeeSPeng Xu 		NanDebugParams cfg_debug;
10102486bbeeSPeng Xu 		int ndp_attr_val;
10112486bbeeSPeng Xu 
10122486bbeeSPeng Xu 		memset(&cfg_debug, 0, sizeof(NanDebugParams));
10132486bbeeSPeng Xu 		cfg_debug.cmd = NAN_TEST_MODE_CMD_ENABLE_NDP;
10142486bbeeSPeng Xu 		if (strcasecmp(ndp_attr, "Absent") == 0)
10152486bbeeSPeng Xu 			ndp_attr_val = NAN_NDP_ATTR_ABSENT;
10162486bbeeSPeng Xu 		else
10172486bbeeSPeng Xu 			ndp_attr_val = NAN_NDP_ATTR_PRESENT;
10182486bbeeSPeng Xu 		memcpy(cfg_debug.debug_cmd_data, &ndp_attr_val, sizeof(int));
10192486bbeeSPeng Xu 		size = sizeof(u32) + sizeof(int);
10202dfb1daeSVinay Gannevaram 		ret = nan_debug_command_config(0, dut->wifi_hal_iface_handle,
10212486bbeeSPeng Xu 					       cfg_debug, size);
10222486bbeeSPeng Xu 		if (ret != WIFI_SUCCESS) {
10232486bbeeSPeng Xu 			send_resp(dut, conn, SIGMA_ERROR,
10242486bbeeSPeng Xu 				  "NAN config ndpAttr failed");
10252486bbeeSPeng Xu 			return 0;
10262486bbeeSPeng Xu 		}
10272486bbeeSPeng Xu 	}
10282486bbeeSPeng Xu 
1029b0c682ceSPeng Xu 	if (dut->ndpe && ndpe_attr) {
1030b0c682ceSPeng Xu 		NanDebugParams cfg_debug;
1031b0c682ceSPeng Xu 		int ndpe_attr_val;
1032b0c682ceSPeng Xu 
1033b0c682ceSPeng Xu 		memset(&cfg_debug, 0, sizeof(NanDebugParams));
1034b0c682ceSPeng Xu 		cfg_debug.cmd = NAN_TEST_MODE_CMD_DISABLE_NDPE;
1035b0c682ceSPeng Xu 		if (strcasecmp(ndpe_attr, "Absent") == 0)
1036b0c682ceSPeng Xu 			ndpe_attr_val = NAN_NDPE_ATTR_ABSENT;
1037b0c682ceSPeng Xu 		else
1038b0c682ceSPeng Xu 			ndpe_attr_val = NAN_NDPE_ATTR_PRESENT;
1039b0c682ceSPeng Xu 		memcpy(cfg_debug.debug_cmd_data, &ndpe_attr_val, sizeof(int));
1040b0c682ceSPeng Xu 		size = sizeof(u32) + sizeof(int);
10412dfb1daeSVinay Gannevaram 		ret = nan_debug_command_config(0, dut->wifi_hal_iface_handle,
1042b0c682ceSPeng Xu 					       cfg_debug, size);
1043b0c682ceSPeng Xu 		if (ret != WIFI_SUCCESS) {
1044b0c682ceSPeng Xu 			send_resp(dut, conn, SIGMA_ERROR,
1045b0c682ceSPeng Xu 				  "NAN config ndpeAttr failed");
1046b0c682ceSPeng Xu 			return 0;
1047b0c682ceSPeng Xu 		}
1048b0c682ceSPeng Xu 	}
1049b0c682ceSPeng Xu #endif
1050b0c682ceSPeng Xu 
105114cfcd25SRakesh Sunki 	/*
105214cfcd25SRakesh Sunki 	 * Setting this flag, so that interface for ping6 command
105314cfcd25SRakesh Sunki 	 * is set appropriately in traffic_send_ping().
105414cfcd25SRakesh Sunki 	 */
105514cfcd25SRakesh Sunki 	dut->ndp_enable = 1;
105614cfcd25SRakesh Sunki 
105714cfcd25SRakesh Sunki 	/*
105814cfcd25SRakesh Sunki 	 * Intended sleep after NAN data interface create
105914cfcd25SRakesh Sunki 	 * before the NAN data request
106014cfcd25SRakesh Sunki 	 */
106114cfcd25SRakesh Sunki 	sleep(4);
106214cfcd25SRakesh Sunki 
106314cfcd25SRakesh Sunki 	init_req.requestor_instance_id = global_match_handle;
106414cfcd25SRakesh Sunki 	strlcpy((char *) init_req.ndp_iface, "nan0",
106514cfcd25SRakesh Sunki 		sizeof(init_req.ndp_iface));
106614cfcd25SRakesh Sunki 
106714cfcd25SRakesh Sunki 	if (ndp_resp_mac) {
106814cfcd25SRakesh Sunki 		nan_parse_mac_address(dut, ndp_resp_mac,
106914cfcd25SRakesh Sunki 				      init_req.peer_disc_mac_addr);
107014cfcd25SRakesh Sunki 		sigma_dut_print(
107114cfcd25SRakesh Sunki 			dut, DUT_MSG_INFO, "PEER MAC ADDR: " MAC_ADDR_STR,
107214cfcd25SRakesh Sunki 			MAC_ADDR_ARRAY(init_req.peer_disc_mac_addr));
107314cfcd25SRakesh Sunki 	} else {
107414cfcd25SRakesh Sunki 		memcpy(init_req.peer_disc_mac_addr, global_peer_mac_addr,
107514cfcd25SRakesh Sunki 		       sizeof(init_req.peer_disc_mac_addr));
107614cfcd25SRakesh Sunki 	}
107714cfcd25SRakesh Sunki 
107814cfcd25SRakesh Sunki 	/* Not requesting the channel and letting FW decide */
107914cfcd25SRakesh Sunki 	if (dut->sta_channel == 0) {
108014cfcd25SRakesh Sunki 		init_req.channel_request_type = NAN_DP_CHANNEL_NOT_REQUESTED;
108114cfcd25SRakesh Sunki 		init_req.channel = 0;
108214cfcd25SRakesh Sunki 	} else {
108314cfcd25SRakesh Sunki 		init_req.channel_request_type = NAN_DP_FORCE_CHANNEL_SETUP;
1084093569ffSAlexei Avshalom Lazar 		init_req.channel = channel_to_freq(dut, dut->sta_channel);
108514cfcd25SRakesh Sunki 	}
108614cfcd25SRakesh Sunki 	sigma_dut_print(dut, DUT_MSG_INFO,
108714cfcd25SRakesh Sunki 			"%s: Initiator Request: Channel = %d  Channel Request Type = %d",
108814cfcd25SRakesh Sunki 			__func__, init_req.channel,
108914cfcd25SRakesh Sunki 			init_req.channel_request_type);
109014cfcd25SRakesh Sunki 
109114cfcd25SRakesh Sunki 	if (dut->nan_pmk_len == NAN_PMK_INFO_LEN) {
1092395b0157SRakesh Sunki 		init_req.key_info.key_type = NAN_SECURITY_KEY_INPUT_PMK;
109314cfcd25SRakesh Sunki 		memcpy(&init_req.key_info.body.pmk_info.pmk[0],
109414cfcd25SRakesh Sunki 		       &dut->nan_pmk[0], NAN_PMK_INFO_LEN);
109514cfcd25SRakesh Sunki 		init_req.key_info.body.pmk_info.pmk_len = NAN_PMK_INFO_LEN;
109614cfcd25SRakesh Sunki 		sigma_dut_print(dut, DUT_MSG_INFO, "%s: pmk len = %d",
109714cfcd25SRakesh Sunki 				__func__,
109814cfcd25SRakesh Sunki 				init_req.key_info.body.pmk_info.pmk_len);
109914cfcd25SRakesh Sunki 	}
110014cfcd25SRakesh Sunki 
110147d709baSPeng Xu #ifdef NAN_NEW_CERT_VERSION
1102b0c682ceSPeng Xu 	if (dut->ndpe) {
110347d709baSPeng Xu 		if (dut->device_type == STA_testbed && !tlv_list) {
110447d709baSPeng Xu 			init_req.app_info.ndp_app_info_len = 0;
110547d709baSPeng Xu 			memset(init_req.app_info.ndp_app_info, 0,
110647d709baSPeng Xu 			       sizeof(init_req.app_info.ndp_app_info));
110747d709baSPeng Xu 		} else {
1108b0c682ceSPeng Xu 			size_t addr_len = 0;
110947d709baSPeng Xu 			u8 nan_ipv6_intf_addr[IPV6_ADDR_LEN];
111047d709baSPeng Xu 			unsigned char nan_mac_addr[ETH_ALEN];
1111b0c682ceSPeng Xu 
111247d709baSPeng Xu 			if (get_hwaddr("nan0", nan_mac_addr) < 0) {
111347d709baSPeng Xu 				sigma_dut_print(dut, DUT_MSG_ERROR,
111447d709baSPeng Xu 						"%s:get_hwaddr nan0 failed",
111547d709baSPeng Xu 						__func__);
111647d709baSPeng Xu 				return -1;
111747d709baSPeng Xu 			}
111847d709baSPeng Xu 
111947d709baSPeng Xu 			/* store IPv6 into app_info as TLV */
1120b0c682ceSPeng Xu 			addr_len = convert_mac_addr_to_ipv6_linklocal(
112147d709baSPeng Xu 				nan_mac_addr, &nan_ipv6_intf_addr[0]);
112247d709baSPeng Xu 			init_req.app_info.ndp_app_info_len =
112347d709baSPeng Xu 				nan_build_ipv6_link_local_tlv(
112447d709baSPeng Xu 					init_req.app_info.ndp_app_info,
112547d709baSPeng Xu 					&nan_ipv6_intf_addr[0]);
1126b0c682ceSPeng Xu 			sigma_dut_print(dut, DUT_MSG_DEBUG,
112747d709baSPeng Xu 					"%s: Initiator Request: IPv6:",
112847d709baSPeng Xu 					__func__);
112947d709baSPeng Xu 			nan_hex_dump(dut, &nan_ipv6_intf_addr[0],
113047d709baSPeng Xu 				     IPV6_ADDR_LEN);
113147d709baSPeng Xu 		}
1132b0c682ceSPeng Xu 	}
1133b0c682ceSPeng Xu #endif
1134b0c682ceSPeng Xu 
11352dfb1daeSVinay Gannevaram 	ret = nan_data_request_initiator(0, dut->wifi_hal_iface_handle,
11362dfb1daeSVinay Gannevaram 					 &init_req);
113714cfcd25SRakesh Sunki 	if (ret != WIFI_SUCCESS) {
113814cfcd25SRakesh Sunki 		send_resp(dut, conn, SIGMA_ERROR,
113914cfcd25SRakesh Sunki 			  "Unable to initiate nan data request");
114014cfcd25SRakesh Sunki 		return 0;
114114cfcd25SRakesh Sunki 	}
114214cfcd25SRakesh Sunki 
114314cfcd25SRakesh Sunki 	return 0;
114414cfcd25SRakesh Sunki }
114514cfcd25SRakesh Sunki 
114614cfcd25SRakesh Sunki 
sigma_nan_data_response(struct sigma_dut * dut,struct sigma_conn * conn,struct sigma_cmd * cmd)1147a5cc284dSRakesh Sunki static int sigma_nan_data_response(struct sigma_dut *dut,
1148a5cc284dSRakesh Sunki 				   struct sigma_conn *conn,
1149a5cc284dSRakesh Sunki 				   struct sigma_cmd *cmd)
1150a5cc284dSRakesh Sunki {
1151a5cc284dSRakesh Sunki 	const char *ndl_response = get_param(cmd, "NDLresponse");
1152a5cc284dSRakesh Sunki 	const char *m4_response_type = get_param(cmd, "M4ResponseType");
115347d709baSPeng Xu #ifdef NAN_NEW_CERT_VERSION
1154b0c682ceSPeng Xu 	const char *ndpe_attr = get_param(cmd, "ndpeAttr");
11552486bbeeSPeng Xu 	const char *ndp_attr = get_param(cmd, "ndpAttr");
1156b0c682ceSPeng Xu #endif
1157a5cc284dSRakesh Sunki 	wifi_error ret;
1158a5cc284dSRakesh Sunki 	NanDebugParams cfg_debug;
1159a5cc284dSRakesh Sunki 	int size;
1160a5cc284dSRakesh Sunki 
1161a5cc284dSRakesh Sunki 	if (ndl_response) {
1162a5cc284dSRakesh Sunki 		int auto_responder_mode_val = 0;
1163a5cc284dSRakesh Sunki 
1164a5cc284dSRakesh Sunki 		sigma_dut_print(dut, DUT_MSG_INFO,
1165a5cc284dSRakesh Sunki 				"%s: ndl_response = (%s) is passed",
1166a5cc284dSRakesh Sunki 				__func__, ndl_response);
1167a5cc284dSRakesh Sunki 		memset(&cfg_debug, 0, sizeof(NanDebugParams));
1168a5cc284dSRakesh Sunki 		cfg_debug.cmd = NAN_TEST_MODE_CMD_AUTO_RESPONDER_MODE;
1169a5cc284dSRakesh Sunki 		if (strcasecmp(ndl_response, "Auto") == 0) {
1170a5cc284dSRakesh Sunki 			auto_responder_mode_val = NAN_DATA_RESPONDER_MODE_AUTO;
1171a5cc284dSRakesh Sunki 		} else if (strcasecmp(ndl_response, "Reject") == 0) {
1172a5cc284dSRakesh Sunki 			auto_responder_mode_val =
1173a5cc284dSRakesh Sunki 				NAN_DATA_RESPONDER_MODE_REJECT;
1174a5cc284dSRakesh Sunki 		} else if (strcasecmp(ndl_response, "Accept") == 0) {
1175a5cc284dSRakesh Sunki 			auto_responder_mode_val =
1176a5cc284dSRakesh Sunki 				NAN_DATA_RESPONDER_MODE_ACCEPT;
1177a5cc284dSRakesh Sunki 		} else if (strcasecmp(ndl_response, "Counter") == 0) {
1178a5cc284dSRakesh Sunki 			auto_responder_mode_val =
1179a5cc284dSRakesh Sunki 				NAN_DATA_RESPONDER_MODE_COUNTER;
1180a5cc284dSRakesh Sunki 		} else {
1181a5cc284dSRakesh Sunki 			sigma_dut_print(dut, DUT_MSG_ERROR,
1182a5cc284dSRakesh Sunki 					"%s: Invalid ndl_response",
1183a5cc284dSRakesh Sunki 					__func__);
1184a5cc284dSRakesh Sunki 			return 0;
1185a5cc284dSRakesh Sunki 		}
1186a5cc284dSRakesh Sunki 		memcpy(cfg_debug.debug_cmd_data, &auto_responder_mode_val,
1187a5cc284dSRakesh Sunki 		       sizeof(int));
1188a5cc284dSRakesh Sunki 		size = sizeof(u32) + sizeof(int);
11892dfb1daeSVinay Gannevaram 		ret = nan_debug_command_config(0, dut->wifi_hal_iface_handle,
1190a5cc284dSRakesh Sunki 					       cfg_debug, size);
1191a5cc284dSRakesh Sunki 		if (ret != WIFI_SUCCESS) {
1192a5cc284dSRakesh Sunki 			send_resp(dut, conn, SIGMA_ERROR,
1193a5cc284dSRakesh Sunki 				  "Nan config request failed");
1194a5cc284dSRakesh Sunki 		}
1195a5cc284dSRakesh Sunki 	}
1196a5cc284dSRakesh Sunki 
1197a5cc284dSRakesh Sunki 	if (m4_response_type) {
1198a5cc284dSRakesh Sunki 		int m4_response_type_val = 0;
1199a5cc284dSRakesh Sunki 
1200a5cc284dSRakesh Sunki 		sigma_dut_print(dut, DUT_MSG_INFO,
1201a5cc284dSRakesh Sunki 				"%s: m4_response_type = (%s) is passed",
1202a5cc284dSRakesh Sunki 				__func__, m4_response_type);
1203a5cc284dSRakesh Sunki 		memset(&cfg_debug, 0, sizeof(NanDebugParams));
1204a5cc284dSRakesh Sunki 		cfg_debug.cmd = NAN_TEST_MODE_CMD_M4_RESPONSE_TYPE;
1205a5cc284dSRakesh Sunki 		if (strcasecmp(m4_response_type, "Accept") == 0)
1206a5cc284dSRakesh Sunki 			m4_response_type_val = NAN_DATA_PATH_M4_RESPONSE_ACCEPT;
1207a5cc284dSRakesh Sunki 		else if (strcasecmp(m4_response_type, "Reject") == 0)
1208a5cc284dSRakesh Sunki 			m4_response_type_val = NAN_DATA_PATH_M4_RESPONSE_REJECT;
1209a5cc284dSRakesh Sunki 		else if (strcasecmp(m4_response_type, "BadMic") == 0)
1210a5cc284dSRakesh Sunki 			m4_response_type_val = NAN_DATA_PATH_M4_RESPONSE_BADMIC;
1211a5cc284dSRakesh Sunki 
1212a5cc284dSRakesh Sunki 		memcpy(cfg_debug.debug_cmd_data, &m4_response_type_val,
1213a5cc284dSRakesh Sunki 		       sizeof(int));
1214a5cc284dSRakesh Sunki 		size = sizeof(u32) + sizeof(int);
12152dfb1daeSVinay Gannevaram 		ret = nan_debug_command_config(0, dut->wifi_hal_iface_handle,
1216a5cc284dSRakesh Sunki 					       cfg_debug, size);
1217a5cc284dSRakesh Sunki 		if (ret != WIFI_SUCCESS) {
1218a5cc284dSRakesh Sunki 			send_resp(dut, conn, SIGMA_ERROR,
1219a5cc284dSRakesh Sunki 				  "Nan config request failed");
1220a5cc284dSRakesh Sunki 		}
1221a5cc284dSRakesh Sunki 	}
1222a5cc284dSRakesh Sunki 
122347d709baSPeng Xu #ifdef NAN_NEW_CERT_VERSION
12242486bbeeSPeng Xu 	if (dut->ndpe && ndp_attr) {
12252486bbeeSPeng Xu 		NanDebugParams cfg_debug;
12262486bbeeSPeng Xu 		int ndp_attr_val;
12272486bbeeSPeng Xu 
12282486bbeeSPeng Xu 		memset(&cfg_debug, 0, sizeof(NanDebugParams));
12292486bbeeSPeng Xu 		cfg_debug.cmd = NAN_TEST_MODE_CMD_ENABLE_NDP;
12302486bbeeSPeng Xu 		if (strcasecmp(ndp_attr, "Absent") == 0)
12312486bbeeSPeng Xu 			ndp_attr_val = NAN_NDP_ATTR_ABSENT;
12322486bbeeSPeng Xu 		else
12332486bbeeSPeng Xu 			ndp_attr_val = NAN_NDP_ATTR_PRESENT;
12342486bbeeSPeng Xu 		memcpy(cfg_debug.debug_cmd_data, &ndp_attr_val, sizeof(int));
12352486bbeeSPeng Xu 		size = sizeof(u32) + sizeof(int);
12362dfb1daeSVinay Gannevaram 		ret = nan_debug_command_config(0, dut->wifi_hal_iface_handle,
12372486bbeeSPeng Xu 					       cfg_debug, size);
12382486bbeeSPeng Xu 		if (ret != WIFI_SUCCESS) {
12392486bbeeSPeng Xu 			send_resp(dut, conn, SIGMA_ERROR,
12402486bbeeSPeng Xu 				  "NAN config ndpAttr failed");
12412486bbeeSPeng Xu 			return 0;
12422486bbeeSPeng Xu 		}
12432486bbeeSPeng Xu 	}
12442486bbeeSPeng Xu 
1245b0c682ceSPeng Xu 	if (ndpe_attr && dut->ndpe) {
1246b0c682ceSPeng Xu 		int ndpe_attr_val;
1247b0c682ceSPeng Xu 
1248b0c682ceSPeng Xu 		memset(&cfg_debug, 0, sizeof(NanDebugParams));
1249b0c682ceSPeng Xu 		cfg_debug.cmd = NAN_TEST_MODE_CMD_DISABLE_NDPE;
1250b0c682ceSPeng Xu 		if (strcasecmp(ndpe_attr, "Absent") == 0)
1251b0c682ceSPeng Xu 			ndpe_attr_val = NAN_NDPE_ATTR_ABSENT;
1252b0c682ceSPeng Xu 		else
1253b0c682ceSPeng Xu 			ndpe_attr_val = NAN_NDPE_ATTR_PRESENT;
1254b0c682ceSPeng Xu 		memcpy(cfg_debug.debug_cmd_data, &ndpe_attr_val, sizeof(int));
1255b0c682ceSPeng Xu 		size = sizeof(u32) + sizeof(int);
12562dfb1daeSVinay Gannevaram 		ret = nan_debug_command_config(0, dut->wifi_hal_iface_handle,
1257b0c682ceSPeng Xu 					       cfg_debug, size);
1258b0c682ceSPeng Xu 		if (ret != WIFI_SUCCESS) {
1259b0c682ceSPeng Xu 			send_resp(dut, conn, SIGMA_ERROR,
1260b0c682ceSPeng Xu 				  "NAN config ndpeAttr failed");
1261b0c682ceSPeng Xu 			return 0;
1262b0c682ceSPeng Xu 		}
1263b0c682ceSPeng Xu 	}
1264b0c682ceSPeng Xu #endif
1265b0c682ceSPeng Xu 
1266a5cc284dSRakesh Sunki 	return 0;
1267a5cc284dSRakesh Sunki }
1268a5cc284dSRakesh Sunki 
1269a5cc284dSRakesh Sunki 
sigma_nan_data_end(struct sigma_dut * dut,struct sigma_cmd * cmd)12708a630b8eSRakesh Sunki static int sigma_nan_data_end(struct sigma_dut *dut, struct sigma_cmd *cmd)
12718a630b8eSRakesh Sunki {
12728a630b8eSRakesh Sunki 	const char *nmf_security_config = get_param(cmd, "Security");
12738a630b8eSRakesh Sunki 	NanDataPathEndRequest req;
12748a630b8eSRakesh Sunki 	NanDebugParams cfg_debug;
12758a630b8eSRakesh Sunki 	int size;
12768a630b8eSRakesh Sunki 
12778a630b8eSRakesh Sunki 	memset(&req, 0, sizeof(NanDataPathEndRequest));
12788a630b8eSRakesh Sunki 	memset(&cfg_debug, 0, sizeof(NanDebugParams));
12798a630b8eSRakesh Sunki 	if (nmf_security_config) {
12808a630b8eSRakesh Sunki 		int nmf_security_config_val = 0;
12818a630b8eSRakesh Sunki 
12828a630b8eSRakesh Sunki 		cfg_debug.cmd = NAN_TEST_MODE_CMD_NAN_NMF_CLEAR_CONFIG;
12838a630b8eSRakesh Sunki 		if (strcasecmp(nmf_security_config, "open") == 0)
12848a630b8eSRakesh Sunki 			nmf_security_config_val = NAN_NMF_CLEAR_ENABLE;
12858a630b8eSRakesh Sunki 		else if (strcasecmp(nmf_security_config, "secure") == 0)
12868a630b8eSRakesh Sunki 			nmf_security_config_val = NAN_NMF_CLEAR_DISABLE;
12878a630b8eSRakesh Sunki 		memcpy(cfg_debug.debug_cmd_data,
12888a630b8eSRakesh Sunki 			&nmf_security_config_val, sizeof(int));
12898a630b8eSRakesh Sunki 		size = sizeof(u32) + sizeof(int);
12908a630b8eSRakesh Sunki 		sigma_dut_print(dut, DUT_MSG_INFO,
12918a630b8eSRakesh Sunki 				"%s: nmf_security_config_val -- cmd type = %d and command data = %d",
12928a630b8eSRakesh Sunki 				__func__, cfg_debug.cmd,
12938a630b8eSRakesh Sunki 				nmf_security_config_val);
12942dfb1daeSVinay Gannevaram 		nan_debug_command_config(0, dut->wifi_hal_iface_handle,
12958a630b8eSRakesh Sunki 					 cfg_debug, size);
12968a630b8eSRakesh Sunki 	}
12978a630b8eSRakesh Sunki 
12988a630b8eSRakesh Sunki 	req.num_ndp_instances = 1;
12998a630b8eSRakesh Sunki 	req.ndp_instance_id[0] = global_ndp_instance_id;
13008a630b8eSRakesh Sunki 
13012dfb1daeSVinay Gannevaram 	nan_data_end(0, dut->wifi_hal_iface_handle, &req);
13028a630b8eSRakesh Sunki 	return 0;
13038a630b8eSRakesh Sunki }
13048a630b8eSRakesh Sunki 
13058a630b8eSRakesh Sunki 
sigma_nan_range_request(struct sigma_dut * dut,struct sigma_cmd * cmd)1306d5e9b4d1SRakesh Sunki static int sigma_nan_range_request(struct sigma_dut *dut,
1307d5e9b4d1SRakesh Sunki 				   struct sigma_cmd *cmd)
1308d5e9b4d1SRakesh Sunki {
1309d5e9b4d1SRakesh Sunki 	const char *dest_mac = get_param(cmd, "destmac");
1310d5e9b4d1SRakesh Sunki 	NanSubscribeRequest req;
1311d5e9b4d1SRakesh Sunki 
1312d5e9b4d1SRakesh Sunki 	memset(&req, 0, sizeof(NanSubscribeRequest));
1313d5e9b4d1SRakesh Sunki 	req.period = 1;
13143834be5bSRakesh Sunki 	req.subscribe_type = NAN_SUBSCRIBE_TYPE_PASSIVE;
1315d5e9b4d1SRakesh Sunki 	req.serviceResponseFilter = NAN_SRF_ATTR_BLOOM_FILTER;
1316d5e9b4d1SRakesh Sunki 	req.serviceResponseInclude = NAN_SRF_INCLUDE_RESPOND;
1317d5e9b4d1SRakesh Sunki 	req.ssiRequiredForMatchIndication = NAN_SSI_NOT_REQUIRED_IN_MATCH_IND;
1318d5e9b4d1SRakesh Sunki 	req.subscribe_match_indicator = NAN_MATCH_ALG_MATCH_CONTINUOUS;
1319d5e9b4d1SRakesh Sunki 	req.subscribe_count = 0;
1320d5e9b4d1SRakesh Sunki 	strlcpy((char *) req.service_name, DEFAULT_SVC,
1321d5e9b4d1SRakesh Sunki 		NAN_MAX_SERVICE_NAME_LEN);
1322d5e9b4d1SRakesh Sunki 	req.service_name_len = strlen((char *) req.service_name);
1323d5e9b4d1SRakesh Sunki 
1324d5e9b4d1SRakesh Sunki 	req.subscribe_id = global_subscribe_id;
1325d5e9b4d1SRakesh Sunki 	req.sdea_params.ranging_state = 1;
1326d5e9b4d1SRakesh Sunki 	req.sdea_params.range_report = NAN_ENABLE_RANGE_REPORT;
1327d5e9b4d1SRakesh Sunki 	req.range_response_cfg.requestor_instance_id = global_match_handle;
1328d5e9b4d1SRakesh Sunki 	req.range_response_cfg.ranging_response = NAN_RANGE_REQUEST_ACCEPT;
1329d5e9b4d1SRakesh Sunki 	req.ranging_cfg.config_ranging_indications =
1330d5e9b4d1SRakesh Sunki 		NAN_RANGING_INDICATE_CONTINUOUS_MASK;
1331d5e9b4d1SRakesh Sunki 	if (dest_mac) {
1332d5e9b4d1SRakesh Sunki 		nan_parse_mac_address(dut, dest_mac,
1333d5e9b4d1SRakesh Sunki 				      req.range_response_cfg.peer_addr);
1334d5e9b4d1SRakesh Sunki 		sigma_dut_print(
1335d5e9b4d1SRakesh Sunki 			dut, DUT_MSG_INFO, "peer mac addr: " MAC_ADDR_STR,
1336d5e9b4d1SRakesh Sunki 			MAC_ADDR_ARRAY(req.range_response_cfg.peer_addr));
1337d5e9b4d1SRakesh Sunki 	}
13382dfb1daeSVinay Gannevaram 	nan_subscribe_request(0, dut->wifi_hal_iface_handle, &req);
1339d5e9b4d1SRakesh Sunki 
1340d5e9b4d1SRakesh Sunki 	return 0;
1341d5e9b4d1SRakesh Sunki }
1342d5e9b4d1SRakesh Sunki 
1343d5e9b4d1SRakesh Sunki 
sigma_nan_cancel_range(struct sigma_dut * dut,struct sigma_cmd * cmd)1344d5e9b4d1SRakesh Sunki static int sigma_nan_cancel_range(struct sigma_dut *dut,
1345d5e9b4d1SRakesh Sunki 				  struct sigma_cmd *cmd)
1346d5e9b4d1SRakesh Sunki {
1347d5e9b4d1SRakesh Sunki 	const char *dest_mac = get_param(cmd, "destmac");
1348d5e9b4d1SRakesh Sunki 	NanPublishRequest req;
1349d5e9b4d1SRakesh Sunki 
1350d5e9b4d1SRakesh Sunki 	memset(&req, 0, sizeof(NanPublishRequest));
1351d5e9b4d1SRakesh Sunki 	req.ttl = 0;
1352d5e9b4d1SRakesh Sunki 	req.period = 1;
1353d5e9b4d1SRakesh Sunki 	req.publish_match_indicator = 1;
1354d5e9b4d1SRakesh Sunki 	req.publish_type = NAN_PUBLISH_TYPE_UNSOLICITED;
1355d5e9b4d1SRakesh Sunki 	req.tx_type = NAN_TX_TYPE_BROADCAST;
1356d5e9b4d1SRakesh Sunki 	req.publish_count = 0;
1357d5e9b4d1SRakesh Sunki 	strlcpy((char *) req.service_name, DEFAULT_SVC,
1358d5e9b4d1SRakesh Sunki 		NAN_MAX_SERVICE_NAME_LEN);
1359d5e9b4d1SRakesh Sunki 	req.service_name_len = strlen((char *) req.service_name);
1360d5e9b4d1SRakesh Sunki 	req.publish_id = global_publish_id;
1361d5e9b4d1SRakesh Sunki 	req.range_response_cfg.ranging_response = NAN_RANGE_REQUEST_CANCEL;
1362d5e9b4d1SRakesh Sunki 	if (dest_mac) {
1363d5e9b4d1SRakesh Sunki 		nan_parse_mac_address(dut, dest_mac,
1364d5e9b4d1SRakesh Sunki 				      req.range_response_cfg.peer_addr);
1365d5e9b4d1SRakesh Sunki 		sigma_dut_print(
1366d5e9b4d1SRakesh Sunki 			dut, DUT_MSG_INFO, "peer mac addr: " MAC_ADDR_STR,
1367d5e9b4d1SRakesh Sunki 			MAC_ADDR_ARRAY(req.range_response_cfg.peer_addr));
1368d5e9b4d1SRakesh Sunki 	}
13692dfb1daeSVinay Gannevaram 	nan_publish_request(0, dut->wifi_hal_iface_handle, &req);
1370d5e9b4d1SRakesh Sunki 
1371d5e9b4d1SRakesh Sunki 	return 0;
1372d5e9b4d1SRakesh Sunki }
1373d5e9b4d1SRakesh Sunki 
1374d5e9b4d1SRakesh Sunki 
sigma_nan_schedule_update(struct sigma_dut * dut,struct sigma_cmd * cmd)1375b2b6516cSRakesh Sunki static int sigma_nan_schedule_update(struct sigma_dut *dut,
1376b2b6516cSRakesh Sunki 				     struct sigma_cmd *cmd)
1377b2b6516cSRakesh Sunki {
1378b2b6516cSRakesh Sunki 	const char *schedule_update_type = get_param(cmd, "type");
1379b2b6516cSRakesh Sunki 	const char *channel_availability = get_param(cmd,
1380b2b6516cSRakesh Sunki 						     "ChannelAvailability");
1381b2b6516cSRakesh Sunki 	const char *responder_nmi_mac = get_param(cmd, "ResponderNMI");
1382b2b6516cSRakesh Sunki 	NanDebugParams cfg_debug;
1383b2b6516cSRakesh Sunki 	int size = 0;
1384b2b6516cSRakesh Sunki 
1385b2b6516cSRakesh Sunki 	memset(&cfg_debug, 0, sizeof(NanDebugParams));
1386b2b6516cSRakesh Sunki 
1387b2b6516cSRakesh Sunki 	if (!schedule_update_type)
1388b2b6516cSRakesh Sunki 		return 0;
1389b2b6516cSRakesh Sunki 
1390b2b6516cSRakesh Sunki 	if (strcasecmp(schedule_update_type, "ULWnotify") == 0) {
1391b2b6516cSRakesh Sunki 		cfg_debug.cmd = NAN_TEST_MODE_CMD_NAN_SCHED_UPDATE_ULW_NOTIFY;
1392b2b6516cSRakesh Sunki 		size = sizeof(u32);
1393b2b6516cSRakesh Sunki 		sigma_dut_print(dut, DUT_MSG_INFO,
1394b2b6516cSRakesh Sunki 				"%s: Schedule Update cmd type = %d", __func__,
1395b2b6516cSRakesh Sunki 				cfg_debug.cmd);
1396b2b6516cSRakesh Sunki 		if (channel_availability) {
1397b2b6516cSRakesh Sunki 			int channel_availability_val;
1398b2b6516cSRakesh Sunki 
1399b2b6516cSRakesh Sunki 			channel_availability_val = atoi(channel_availability);
1400b2b6516cSRakesh Sunki 			size += sizeof(int);
1401b2b6516cSRakesh Sunki 			memcpy(cfg_debug.debug_cmd_data,
1402b2b6516cSRakesh Sunki 			       &channel_availability_val, sizeof(int));
1403b2b6516cSRakesh Sunki 			sigma_dut_print(dut, DUT_MSG_INFO,
1404b2b6516cSRakesh Sunki 					"%s: Schedule Update cmd data = %d size = %d",
1405b2b6516cSRakesh Sunki 					__func__, channel_availability_val,
1406b2b6516cSRakesh Sunki 					size);
1407b2b6516cSRakesh Sunki 		}
1408b2b6516cSRakesh Sunki 	} else if (strcasecmp(schedule_update_type, "NDLnegotiate") == 0) {
1409b2b6516cSRakesh Sunki 		cfg_debug.cmd =
1410b2b6516cSRakesh Sunki 			NAN_TEST_MODE_CMD_NAN_SCHED_UPDATE_NDL_NEGOTIATE;
1411b2b6516cSRakesh Sunki 		size = sizeof(u32);
1412b2b6516cSRakesh Sunki 		sigma_dut_print(dut, DUT_MSG_INFO,
1413b2b6516cSRakesh Sunki 				"%s: Schedule Update cmd type = %d", __func__,
1414b2b6516cSRakesh Sunki 				cfg_debug.cmd);
1415b2b6516cSRakesh Sunki 		if (responder_nmi_mac) {
1416b2b6516cSRakesh Sunki 			u8 responder_nmi_mac_addr[NAN_MAC_ADDR_LEN];
1417b2b6516cSRakesh Sunki 
1418b2b6516cSRakesh Sunki 			nan_parse_mac_address(dut, responder_nmi_mac,
1419b2b6516cSRakesh Sunki 					      responder_nmi_mac_addr);
1420b2b6516cSRakesh Sunki 			size += NAN_MAC_ADDR_LEN;
1421b2b6516cSRakesh Sunki 			memcpy(cfg_debug.debug_cmd_data, responder_nmi_mac_addr,
1422b2b6516cSRakesh Sunki 			       NAN_MAC_ADDR_LEN);
1423b2b6516cSRakesh Sunki 			sigma_dut_print(dut, DUT_MSG_INFO,
1424b2b6516cSRakesh Sunki 					"%s: RESPONDER NMI MAC: "MAC_ADDR_STR,
1425b2b6516cSRakesh Sunki 					__func__,
1426b2b6516cSRakesh Sunki 					MAC_ADDR_ARRAY(responder_nmi_mac_addr));
1427b2b6516cSRakesh Sunki 			sigma_dut_print(dut, DUT_MSG_INFO,
1428b2b6516cSRakesh Sunki 					"%s: Schedule Update: cmd size = %d",
1429b2b6516cSRakesh Sunki 					__func__, size);
1430b2b6516cSRakesh Sunki 		}
1431b2b6516cSRakesh Sunki 	} else if (strcasecmp(schedule_update_type, "NDLnotify") == 0) {
1432b2b6516cSRakesh Sunki 		cfg_debug.cmd = NAN_TEST_MODE_CMD_NAN_SCHED_UPDATE_NDL_NOTIFY;
1433b2b6516cSRakesh Sunki 		size = sizeof(u32);
1434b2b6516cSRakesh Sunki 		sigma_dut_print(dut, DUT_MSG_INFO,
1435b2b6516cSRakesh Sunki 				"%s: Schedule Update cmd type = %d", __func__,
1436b2b6516cSRakesh Sunki 				cfg_debug.cmd);
1437b2b6516cSRakesh Sunki 	}
1438b2b6516cSRakesh Sunki 
14392dfb1daeSVinay Gannevaram 	nan_debug_command_config(0, dut->wifi_hal_iface_handle, cfg_debug,
14402dfb1daeSVinay Gannevaram 				 size);
1441b2b6516cSRakesh Sunki 
1442b2b6516cSRakesh Sunki 	return 0;
1443b2b6516cSRakesh Sunki }
1444b2b6516cSRakesh Sunki 
1445b2b6516cSRakesh Sunki 
config_post_disc_attr(struct sigma_dut * dut)14462dfb1daeSVinay Gannevaram int config_post_disc_attr(struct sigma_dut *dut)
1447cd4e3c3eSJouni Malinen {
1448107356c8SRakesh Sunki 	wifi_error ret;
1449cd4e3c3eSJouni Malinen 	NanConfigRequest configReq;
1450cd4e3c3eSJouni Malinen 
1451cd4e3c3eSJouni Malinen 	memset(&configReq, 0, sizeof(NanConfigRequest));
1452cd4e3c3eSJouni Malinen 
1453cd4e3c3eSJouni Malinen 	/* Configure Post disc attr */
1454cd4e3c3eSJouni Malinen 	/* Make these defines and use correct enum */
14551854ec6fSAmarnath Hullur Subramanyam 	configReq.num_config_discovery_attr = 1;
14561854ec6fSAmarnath Hullur Subramanyam 	configReq.discovery_attr_val[0].type = 4; /* Further Nan discovery */
14571854ec6fSAmarnath Hullur Subramanyam 	configReq.discovery_attr_val[0].role = 0;
14581854ec6fSAmarnath Hullur Subramanyam 	configReq.discovery_attr_val[0].transmit_freq = 1;
14591854ec6fSAmarnath Hullur Subramanyam 	configReq.discovery_attr_val[0].duration = 0;
14601854ec6fSAmarnath Hullur Subramanyam 	configReq.discovery_attr_val[0].avail_interval_bitmap = 0x00000008;
1461cd4e3c3eSJouni Malinen 
14622dfb1daeSVinay Gannevaram 	ret = nan_config_request(0, dut->wifi_hal_iface_handle, &configReq);
1463107356c8SRakesh Sunki 	if (ret != WIFI_SUCCESS) {
1464107356c8SRakesh Sunki 		sigma_dut_print(global_dut, DUT_MSG_INFO,
1465107356c8SRakesh Sunki 				"NAN config request failed while configuring post discovery attribute");
1466107356c8SRakesh Sunki 	}
1467107356c8SRakesh Sunki 
1468cd4e3c3eSJouni Malinen 	return 0;
1469cd4e3c3eSJouni Malinen }
1470cd4e3c3eSJouni Malinen 
1471cd4e3c3eSJouni Malinen 
sigma_nan_publish_request(struct sigma_dut * dut,struct sigma_conn * conn,struct sigma_cmd * cmd)1472cd4e3c3eSJouni Malinen int sigma_nan_publish_request(struct sigma_dut *dut, struct sigma_conn *conn,
1473cd4e3c3eSJouni Malinen 			      struct sigma_cmd *cmd)
1474cd4e3c3eSJouni Malinen {
1475cd4e3c3eSJouni Malinen 	const char *publish_type = get_param(cmd, "PublishType");
1476cd4e3c3eSJouni Malinen 	const char *service_name = get_param(cmd, "ServiceName");
1477cd4e3c3eSJouni Malinen 	const char *disc_range = get_param(cmd, "DiscoveryRange");
1478cd4e3c3eSJouni Malinen 	const char *rx_match_filter = get_param(cmd, "rxMatchFilter");
1479cd4e3c3eSJouni Malinen 	const char *tx_match_filter = get_param(cmd, "txMatchFilter");
1480cd4e3c3eSJouni Malinen 	const char *sdftx_dw = get_param(cmd, "SDFTxDW");
1481cd4e3c3eSJouni Malinen 	const char *discrange_ltd = get_param(cmd, "DiscRangeLtd");
14821a5afb93SRakesh Sunki 	const char *ndp_enable = get_param(cmd, "DataPathFlag");
14831a5afb93SRakesh Sunki 	const char *ndp_type = get_param(cmd, "DataPathType");
14841a5afb93SRakesh Sunki 	const char *data_path_security = get_param(cmd, "datapathsecurity");
14854806040cSRakesh Sunki 	const char *range_required = get_param(cmd, "rangerequired");
14868a4845d0SRakesh Sunki #if NAN_CERT_VERSION >= 3
1487ff76d8cbSRakesh Sunki 	const char *awake_dw_interval = get_param(cmd, "awakeDWint");
14888a4845d0SRakesh Sunki 	const char *qos_config = get_param(cmd, "QoS");
14898a4845d0SRakesh Sunki #endif
14908863ec7cSPeng Xu 	const char *ndpe = get_param(cmd, "NDPE");
14918863ec7cSPeng Xu 	const char *trans_proto = get_param(cmd, "TransProtoType");
149247d709baSPeng Xu #ifdef NAN_NEW_CERT_VERSION
14932486bbeeSPeng Xu 	const char *ndp_attr = get_param(cmd, "ndpAttr");
14942486bbeeSPeng Xu #endif
1495cd4e3c3eSJouni Malinen 	NanPublishRequest req;
1496e6f6683bSRakesh Sunki 	NanConfigRequest config_req;
1497cd4e3c3eSJouni Malinen 	int filter_len_rx = 0, filter_len_tx = 0;
1498cd4e3c3eSJouni Malinen 	u8 input_rx[NAN_MAX_MATCH_FILTER_LEN];
1499cd4e3c3eSJouni Malinen 	u8 input_tx[NAN_MAX_MATCH_FILTER_LEN];
1500107356c8SRakesh Sunki 	wifi_error ret;
1501cd4e3c3eSJouni Malinen 
1502cd4e3c3eSJouni Malinen 	memset(&req, 0, sizeof(NanPublishRequest));
1503e6f6683bSRakesh Sunki 	memset(&config_req, 0, sizeof(NanConfigRequest));
1504cd4e3c3eSJouni Malinen 	req.ttl = 0;
15054625de76SRakesh Sunki 	req.period = 1;
15061854ec6fSAmarnath Hullur Subramanyam 	req.publish_match_indicator = 1;
1507cd4e3c3eSJouni Malinen 	req.publish_type = NAN_PUBLISH_TYPE_UNSOLICITED;
1508cd4e3c3eSJouni Malinen 	req.tx_type = NAN_TX_TYPE_BROADCAST;
1509cd4e3c3eSJouni Malinen 	req.publish_count = 0;
15100a0eea88SRakesh Sunki 	req.service_responder_policy = NAN_SERVICE_ACCEPT_POLICY_ALL;
1511132c6d2bSKantesh Mundaragi 
15124236368dSRakesh Sunki 	if (global_publish_service_name_len &&
15134236368dSRakesh Sunki 	    service_name &&
15144236368dSRakesh Sunki 	    strcasecmp((char *) global_publish_service_name,
15154236368dSRakesh Sunki 		       service_name) == 0 &&
15164236368dSRakesh Sunki 	    global_publish_id) {
15174236368dSRakesh Sunki 		req.publish_id = global_publish_id;
15184236368dSRakesh Sunki 		sigma_dut_print(dut, DUT_MSG_INFO,
15194236368dSRakesh Sunki 				"%s: updating publish_id = %d in publish request",
15204236368dSRakesh Sunki 				__func__, req.publish_id);
15214236368dSRakesh Sunki 	}
15224236368dSRakesh Sunki 
1523132c6d2bSKantesh Mundaragi 	if (service_name) {
1524cd4e3c3eSJouni Malinen 		strlcpy((char *) req.service_name, service_name,
15254236368dSRakesh Sunki 			sizeof(req.service_name));
15264236368dSRakesh Sunki 		req.service_name_len = strlen((char *) req.service_name);
15274236368dSRakesh Sunki 		strlcpy((char *) global_publish_service_name, service_name,
15284236368dSRakesh Sunki 			sizeof(global_publish_service_name));
15294236368dSRakesh Sunki 		global_publish_service_name_len =
15304236368dSRakesh Sunki 			strlen((char *) global_publish_service_name);
1531132c6d2bSKantesh Mundaragi 	}
1532cd4e3c3eSJouni Malinen 
1533cd4e3c3eSJouni Malinen 	if (publish_type) {
1534cd4e3c3eSJouni Malinen 		if (strcasecmp(publish_type, "Solicited") == 0) {
1535cd4e3c3eSJouni Malinen 			req.publish_type = NAN_PUBLISH_TYPE_SOLICITED;
153662644abdSRakesh Sunki 		} else if (strcasecmp(publish_type, "Unsolicited") == 0) {
153762644abdSRakesh Sunki 			req.publish_type = NAN_PUBLISH_TYPE_UNSOLICITED;
1538cd4e3c3eSJouni Malinen 		} else if (strcasecmp(publish_type, "Cancel") == 0) {
1539cd4e3c3eSJouni Malinen 			NanPublishCancelRequest req;
1540cd4e3c3eSJouni Malinen 
1541cd4e3c3eSJouni Malinen 			memset(&req, 0, sizeof(NanPublishCancelRequest));
1542107356c8SRakesh Sunki 			ret = nan_publish_cancel_request(
15432dfb1daeSVinay Gannevaram 				0, dut->wifi_hal_iface_handle, &req);
1544107356c8SRakesh Sunki 			if (ret != WIFI_SUCCESS) {
1545107356c8SRakesh Sunki 				send_resp(dut, conn, SIGMA_ERROR,
1546107356c8SRakesh Sunki 					  "Unable to cancel nan publish request");
1547107356c8SRakesh Sunki 			}
1548cd4e3c3eSJouni Malinen 			return 0;
1549cd4e3c3eSJouni Malinen 		}
1550cd4e3c3eSJouni Malinen 	}
1551cd4e3c3eSJouni Malinen 
1552cd4e3c3eSJouni Malinen 	if (disc_range)
1553cd4e3c3eSJouni Malinen 		req.rssi_threshold_flag = atoi(disc_range);
1554cd4e3c3eSJouni Malinen 
1555cd4e3c3eSJouni Malinen 	if (sdftx_dw)
1556cd4e3c3eSJouni Malinen 		req.publish_count = atoi(sdftx_dw);
1557cd4e3c3eSJouni Malinen 
1558cd4e3c3eSJouni Malinen 	if (discrange_ltd)
1559cd4e3c3eSJouni Malinen 		req.rssi_threshold_flag = atoi(discrange_ltd);
1560cd4e3c3eSJouni Malinen 
1561cd4e3c3eSJouni Malinen 	memset(input_rx, 0, sizeof(input_rx));
1562cd4e3c3eSJouni Malinen 	memset(input_tx, 0, sizeof(input_tx));
1563cd4e3c3eSJouni Malinen 	if (rx_match_filter) {
1564cd4e3c3eSJouni Malinen 		nan_parse_token(rx_match_filter, input_rx, &filter_len_rx);
1565cd4e3c3eSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_INFO, "RxFilterLen %d",
1566cd4e3c3eSJouni Malinen 				filter_len_rx);
1567cd4e3c3eSJouni Malinen 	}
1568cd4e3c3eSJouni Malinen 	if (tx_match_filter) {
1569cd4e3c3eSJouni Malinen 		nan_parse_token(tx_match_filter, input_tx, &filter_len_tx);
1570cd4e3c3eSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_INFO, "TxFilterLen %d",
1571cd4e3c3eSJouni Malinen 				filter_len_tx);
1572cd4e3c3eSJouni Malinen 	}
1573cd4e3c3eSJouni Malinen 
1574cd4e3c3eSJouni Malinen 	if (is_fam == 1) {
15752dfb1daeSVinay Gannevaram 		config_post_disc_attr(dut);
1576f680e0fcSRakesh Sunki 		/*
1577f680e0fcSRakesh Sunki 		 * 8-bit bitmap which allows the Host to associate this publish
1578f680e0fcSRakesh Sunki 		 * with a particular Post-NAN Connectivity attribute which has
1579f680e0fcSRakesh Sunki 		 * been sent down in a NanConfigureRequest/NanEnableRequest
1580f680e0fcSRakesh Sunki 		 * message. If the DE fails to find a configured Post-NAN
1581f680e0fcSRakesh Sunki 		 * connectivity attributes referenced by the bitmap, the DE will
1582f680e0fcSRakesh Sunki 		 * return an error code to the Host. If the Publish is
1583f680e0fcSRakesh Sunki 		 * configured to use a Post-NAN Connectivity attribute and the
1584f680e0fcSRakesh Sunki 		 * Host does not refresh the Post-NAN Connectivity attribute the
1585f680e0fcSRakesh Sunki 		 * Publish will be canceled and the Host will be sent a
1586f680e0fcSRakesh Sunki 		 * PublishTerminatedIndication message.
1587f680e0fcSRakesh Sunki 		 */
1588cd4e3c3eSJouni Malinen 		req.connmap = 0x10;
1589cd4e3c3eSJouni Malinen 	}
1590cd4e3c3eSJouni Malinen 
1591cd4e3c3eSJouni Malinen 	if (tx_match_filter) {
1592cd4e3c3eSJouni Malinen 		req.tx_match_filter_len = filter_len_tx;
1593cd4e3c3eSJouni Malinen 		memcpy(req.tx_match_filter, input_tx, filter_len_tx);
1594cd4e3c3eSJouni Malinen 		nan_hex_dump(dut, req.tx_match_filter, filter_len_tx);
1595cd4e3c3eSJouni Malinen 	}
1596cd4e3c3eSJouni Malinen 
1597cd4e3c3eSJouni Malinen 	if (rx_match_filter) {
1598cd4e3c3eSJouni Malinen 		req.rx_match_filter_len = filter_len_rx;
1599cd4e3c3eSJouni Malinen 		memcpy(req.rx_match_filter, input_rx, filter_len_rx);
1600cd4e3c3eSJouni Malinen 		nan_hex_dump(dut, req.rx_match_filter, filter_len_rx);
1601cd4e3c3eSJouni Malinen 	}
1602132c6d2bSKantesh Mundaragi 
1603132c6d2bSKantesh Mundaragi 	if (service_name) {
1604cd4e3c3eSJouni Malinen 		strlcpy((char *) req.service_name, service_name,
1605cd4e3c3eSJouni Malinen 			strlen(service_name) + 1);
1606cd4e3c3eSJouni Malinen 		req.service_name_len = strlen(service_name);
1607132c6d2bSKantesh Mundaragi 	}
1608cd4e3c3eSJouni Malinen 
16091a5afb93SRakesh Sunki 	if (ndp_enable) {
16101a5afb93SRakesh Sunki 		if (strcasecmp(ndp_enable, "enable") == 0)
16111a5afb93SRakesh Sunki 			req.sdea_params.config_nan_data_path = 1;
16121a5afb93SRakesh Sunki 		else
16131a5afb93SRakesh Sunki 			req.sdea_params.config_nan_data_path = 0;
16141a5afb93SRakesh Sunki 
16151a5afb93SRakesh Sunki 		if (ndp_type)
16161a5afb93SRakesh Sunki 			req.sdea_params.ndp_type = atoi(ndp_type);
16171a5afb93SRakesh Sunki 
16181a5afb93SRakesh Sunki 		if (data_path_security) {
16191a5afb93SRakesh Sunki 			if (strcasecmp(data_path_security, "secure") == 0) {
16201a5afb93SRakesh Sunki 				req.sdea_params.security_cfg =
16211a5afb93SRakesh Sunki 					NAN_DP_CONFIG_SECURITY;
16221a5afb93SRakesh Sunki 			} else if (strcasecmp(data_path_security, "open") ==
16231a5afb93SRakesh Sunki 				   0) {
16241a5afb93SRakesh Sunki 				req.sdea_params.security_cfg =
16251a5afb93SRakesh Sunki 					NAN_DP_CONFIG_NO_SECURITY;
16261a5afb93SRakesh Sunki 			}
16271a5afb93SRakesh Sunki 		}
16281a5afb93SRakesh Sunki 
16291a5afb93SRakesh Sunki 		if (dut->nan_pmk_len == NAN_PMK_INFO_LEN) {
1630395b0157SRakesh Sunki 			req.key_info.key_type = NAN_SECURITY_KEY_INPUT_PMK;
16311a5afb93SRakesh Sunki 			memcpy(&req.key_info.body.pmk_info.pmk[0],
16321a5afb93SRakesh Sunki 				&dut->nan_pmk[0], NAN_PMK_INFO_LEN);
16331a5afb93SRakesh Sunki 			req.key_info.body.pmk_info.pmk_len = NAN_PMK_INFO_LEN;
16341a5afb93SRakesh Sunki 			sigma_dut_print(dut, DUT_MSG_INFO, "%s: pmk len = %d",
16351a5afb93SRakesh Sunki 			__func__, req.key_info.body.pmk_info.pmk_len);
16361a5afb93SRakesh Sunki 		}
16371a5afb93SRakesh Sunki 	}
16384806040cSRakesh Sunki 	if (range_required && strcasecmp(range_required, "enable") == 0) {
16394806040cSRakesh Sunki 		req.sdea_params.ranging_state = NAN_RANGING_ENABLE;
16404806040cSRakesh Sunki 		req.sdea_params.range_report = NAN_ENABLE_RANGE_REPORT;
16414806040cSRakesh Sunki 	}
16421a5afb93SRakesh Sunki 
1643ff76d8cbSRakesh Sunki #if NAN_CERT_VERSION >= 3
1644e6f6683bSRakesh Sunki 	if (awake_dw_interval) {
1645e6f6683bSRakesh Sunki 		int input_dw_interval_val = atoi(awake_dw_interval);
1646e6f6683bSRakesh Sunki 		int awake_dw_int = 0;
1647e6f6683bSRakesh Sunki 
1648e6f6683bSRakesh Sunki 		if (input_dw_interval_val > NAN_MAX_ALLOWED_DW_AWAKE_INTERVAL) {
1649e6f6683bSRakesh Sunki 			sigma_dut_print(dut, DUT_MSG_INFO,
1650e6f6683bSRakesh Sunki 					"%s: input active dw interval = %d overwritting dw interval to Max allowed dw interval 16",
1651e6f6683bSRakesh Sunki 					__func__, input_dw_interval_val);
1652e6f6683bSRakesh Sunki 			input_dw_interval_val =
1653e6f6683bSRakesh Sunki 				NAN_MAX_ALLOWED_DW_AWAKE_INTERVAL;
1654e6f6683bSRakesh Sunki 		}
1655e6f6683bSRakesh Sunki 		sigma_dut_print(dut, DUT_MSG_INFO,
1656e6f6683bSRakesh Sunki 				"%s: input active DW interval = %d",
1657e6f6683bSRakesh Sunki 				__func__, input_dw_interval_val);
1658e6f6683bSRakesh Sunki 		/*
1659e6f6683bSRakesh Sunki 		 * Indicates the interval for Sync beacons and SDF's in 2.4 GHz
1660e6f6683bSRakesh Sunki 		 * or 5 GHz band. Valid values of DW Interval are: 1, 2, 3, 4,
1661e6f6683bSRakesh Sunki 		 * and 5; 0 is reserved. The SDF includes in OTA when enabled.
1662e6f6683bSRakesh Sunki 		 * The publish/subscribe period. values don't override the
1663e6f6683bSRakesh Sunki 		 * device level configurations.
1664e6f6683bSRakesh Sunki 		 * input_dw_interval_val is provided by the user are in the
1665e6f6683bSRakesh Sunki 		 * format 2^n-1 = 1/2/4/8/16. Internal implementation expects n
1666e6f6683bSRakesh Sunki 		 * to be passed to indicate the awake_dw_interval.
1667e6f6683bSRakesh Sunki 		 */
1668e6f6683bSRakesh Sunki 		if (input_dw_interval_val == 1 ||
1669e6f6683bSRakesh Sunki 		    input_dw_interval_val % 2 == 0) {
1670e6f6683bSRakesh Sunki 			while (input_dw_interval_val > 0) {
1671e6f6683bSRakesh Sunki 				input_dw_interval_val >>= 1;
1672e6f6683bSRakesh Sunki 				awake_dw_int++;
1673e6f6683bSRakesh Sunki 			}
1674e6f6683bSRakesh Sunki 		}
1675e6f6683bSRakesh Sunki 		sigma_dut_print(dut, DUT_MSG_INFO,
1676e6f6683bSRakesh Sunki 				"%s:converted active DW interval = %d",
1677e6f6683bSRakesh Sunki 				__func__, awake_dw_int);
1678e6f6683bSRakesh Sunki 		config_req.config_dw.config_2dot4g_dw_band = 1;
1679e6f6683bSRakesh Sunki 		config_req.config_dw.dw_2dot4g_interval_val = awake_dw_int;
1680e6f6683bSRakesh Sunki 		config_req.config_dw.config_5g_dw_band = 1;
1681e6f6683bSRakesh Sunki 		config_req.config_dw.dw_5g_interval_val = awake_dw_int;
16822dfb1daeSVinay Gannevaram 		ret = nan_config_request(0, dut->wifi_hal_iface_handle,
1683e6f6683bSRakesh Sunki 					 &config_req);
1684e6f6683bSRakesh Sunki 		if (ret != WIFI_SUCCESS) {
1685e6f6683bSRakesh Sunki 			sigma_dut_print(dut, DUT_MSG_ERROR,
1686e6f6683bSRakesh Sunki 					"%s:NAN config request failed",
1687e6f6683bSRakesh Sunki 					__func__);
1688e6f6683bSRakesh Sunki 			return -2;
1689e6f6683bSRakesh Sunki 		}
1690e6f6683bSRakesh Sunki 	}
1691e6f6683bSRakesh Sunki 
16928a4845d0SRakesh Sunki 	if (qos_config)
16938a4845d0SRakesh Sunki 		req.sdea_params.qos_cfg = (NanQosCfgStatus) atoi(qos_config);
16948a4845d0SRakesh Sunki #endif
16958a4845d0SRakesh Sunki 
16968863ec7cSPeng Xu 	if (ndpe &&
16978863ec7cSPeng Xu 	    strcasecmp(ndpe, "Enable") == 0)
16988863ec7cSPeng Xu 		dut->ndpe = 1;
16998863ec7cSPeng Xu 
17008863ec7cSPeng Xu 	if (trans_proto) {
17018863ec7cSPeng Xu 		if (strcasecmp(trans_proto, "TCP") == 0) {
17028863ec7cSPeng Xu 			dut->trans_proto = TRANSPORT_PROTO_TYPE_TCP;
17038863ec7cSPeng Xu 		} else if (strcasecmp(trans_proto, "UDP") == 0) {
17048863ec7cSPeng Xu 			dut->trans_proto = TRANSPORT_PROTO_TYPE_UDP;
17058863ec7cSPeng Xu 		} else {
17068863ec7cSPeng Xu 			sigma_dut_print(dut, DUT_MSG_ERROR,
17078863ec7cSPeng Xu 					"%s: Invalid protocol %s",
17088863ec7cSPeng Xu 					__func__, trans_proto);
17098863ec7cSPeng Xu 			return -1;
17108863ec7cSPeng Xu 		}
17118863ec7cSPeng Xu 	}
17128863ec7cSPeng Xu 
171347d709baSPeng Xu #ifdef NAN_NEW_CERT_VERSION
17142486bbeeSPeng Xu 	if (dut->ndpe && ndp_attr) {
17152486bbeeSPeng Xu 		NanDebugParams cfg_debug;
17162486bbeeSPeng Xu 		int ndp_attr_val, size;
17172486bbeeSPeng Xu 
17182486bbeeSPeng Xu 		memset(&cfg_debug, 0, sizeof(NanDebugParams));
17192486bbeeSPeng Xu 		cfg_debug.cmd = NAN_TEST_MODE_CMD_ENABLE_NDP;
17202486bbeeSPeng Xu 		if (strcasecmp(ndp_attr, "Absent") == 0)
17212486bbeeSPeng Xu 			ndp_attr_val = NAN_NDP_ATTR_ABSENT;
17222486bbeeSPeng Xu 		else
17232486bbeeSPeng Xu 			ndp_attr_val = NAN_NDP_ATTR_PRESENT;
17242486bbeeSPeng Xu 		memcpy(cfg_debug.debug_cmd_data, &ndp_attr_val, sizeof(int));
17252486bbeeSPeng Xu 		size = sizeof(u32) + sizeof(int);
17262dfb1daeSVinay Gannevaram 		ret = nan_debug_command_config(0, dut->wifi_hal_iface_handle,
17272486bbeeSPeng Xu 					       cfg_debug, size);
17282486bbeeSPeng Xu 		if (ret != WIFI_SUCCESS) {
17292486bbeeSPeng Xu 			send_resp(dut, conn, SIGMA_ERROR,
17302486bbeeSPeng Xu 				  "NAN config ndpAttr failed");
17312486bbeeSPeng Xu 			return 0;
17322486bbeeSPeng Xu 		}
17332486bbeeSPeng Xu 	}
17342486bbeeSPeng Xu 
17358863ec7cSPeng Xu 	if (dut->ndpe) {
17368863ec7cSPeng Xu 		unsigned char nan_mac_addr[ETH_ALEN];
173747d709baSPeng Xu 		size_t len = 0, tlv_len = 0;
17388863ec7cSPeng Xu 		NanDebugParams cfg_debug;
17398863ec7cSPeng Xu 		NdpIpTransParams ndp_ip_trans_param;
174047d709baSPeng Xu 		u8 *p_buf;
17418863ec7cSPeng Xu 
174247d709baSPeng Xu 		if (get_hwaddr("nan0", nan_mac_addr) < 0) {
174347d709baSPeng Xu 			sigma_dut_print(dut, DUT_MSG_ERROR,
174447d709baSPeng Xu 					"%s:get_hwaddr nan0 failed", __func__);
174547d709baSPeng Xu 			return -1;
174647d709baSPeng Xu 		}
174747d709baSPeng Xu 		len = convert_mac_addr_to_ipv6_linklocal(
17488863ec7cSPeng Xu 			nan_mac_addr, ndp_ip_trans_param.ipv6_intf_addr);
17498863ec7cSPeng Xu 		ndp_ip_trans_param.ipv6_addr_present = 1;
17508863ec7cSPeng Xu 
17518863ec7cSPeng Xu 		ndp_ip_trans_param.trans_port_present = 1;
17528863ec7cSPeng Xu 		ndp_ip_trans_param.transport_port = dut->trans_port;
17538863ec7cSPeng Xu 
17548863ec7cSPeng Xu 		ndp_ip_trans_param.trans_proto_present = 1;
17558863ec7cSPeng Xu 		ndp_ip_trans_param.transport_protocol = dut->trans_proto;
17568863ec7cSPeng Xu 
175747d709baSPeng Xu 		/* build TLV blob for cfg_debug cmd */
175847d709baSPeng Xu 		p_buf = cfg_debug.debug_cmd_data;
175947d709baSPeng Xu 
176047d709baSPeng Xu 		/* put IPv6 address tlv into data buffer */
176147d709baSPeng Xu 		len = nan_build_ipv6_link_local_tlv(
176247d709baSPeng Xu 			p_buf, ndp_ip_trans_param.ipv6_intf_addr);
176347d709baSPeng Xu 		tlv_len = len;
176447d709baSPeng Xu 		p_buf += len;
176547d709baSPeng Xu 
176647d709baSPeng Xu 		/* put port and protocol TLV into data buffer */
176747d709baSPeng Xu 		len = nan_build_service_info_tlv(p_buf, &ndp_ip_trans_param);
176847d709baSPeng Xu 		tlv_len += len;
176947d709baSPeng Xu 
17708863ec7cSPeng Xu 		cfg_debug.cmd = NAN_TEST_MODE_CMD_TRANSPORT_IP_PARAM;
17712dfb1daeSVinay Gannevaram 		nan_debug_command_config(0, dut->wifi_hal_iface_handle,
177247d709baSPeng Xu 					 cfg_debug, tlv_len + sizeof(u32));
17738863ec7cSPeng Xu 	}
17748863ec7cSPeng Xu #endif
17758863ec7cSPeng Xu 
17762dfb1daeSVinay Gannevaram 	ret = nan_publish_request(0, dut->wifi_hal_iface_handle, &req);
1777107356c8SRakesh Sunki 	if (ret != WIFI_SUCCESS)
1778107356c8SRakesh Sunki 		send_resp(dut, conn, SIGMA_ERROR, "Unable to publish");
1779cd4e3c3eSJouni Malinen 
17801a5afb93SRakesh Sunki 	if (ndp_enable)
17811a5afb93SRakesh Sunki 		dut->ndp_enable = 1;
17821a5afb93SRakesh Sunki 
1783cd4e3c3eSJouni Malinen 	return 0;
1784cd4e3c3eSJouni Malinen }
1785cd4e3c3eSJouni Malinen 
1786cd4e3c3eSJouni Malinen 
nan_further_availability_rx(struct sigma_dut * dut,struct sigma_conn * conn,struct sigma_cmd * cmd)1787cd4e3c3eSJouni Malinen static int nan_further_availability_rx(struct sigma_dut *dut,
1788cd4e3c3eSJouni Malinen 				       struct sigma_conn *conn,
1789cd4e3c3eSJouni Malinen 				       struct sigma_cmd *cmd)
1790cd4e3c3eSJouni Malinen {
1791cd4e3c3eSJouni Malinen 	const char *master_pref = get_param(cmd, "MasterPref");
1792cd4e3c3eSJouni Malinen 	const char *rand_fac = get_param(cmd, "RandFactor");
1793cd4e3c3eSJouni Malinen 	const char *hop_count = get_param(cmd, "HopCount");
1794107356c8SRakesh Sunki 	wifi_error ret;
1795cd4e3c3eSJouni Malinen 	struct timespec abstime;
1796cd4e3c3eSJouni Malinen 
1797cd4e3c3eSJouni Malinen 	NanEnableRequest req;
1798cd4e3c3eSJouni Malinen 
1799cd4e3c3eSJouni Malinen 	memset(&req, 0, sizeof(NanEnableRequest));
1800cd4e3c3eSJouni Malinen 	req.cluster_low = 0;
1801cd4e3c3eSJouni Malinen 	req.cluster_high = 0xFFFF;
1802cd4e3c3eSJouni Malinen 	req.master_pref = 30;
1803cd4e3c3eSJouni Malinen 
1804cd4e3c3eSJouni Malinen 	if (master_pref)
1805cd4e3c3eSJouni Malinen 		req.master_pref = strtoul(master_pref, NULL, 0);
1806cd4e3c3eSJouni Malinen 
1807cd4e3c3eSJouni Malinen 	if (rand_fac) {
1808cd4e3c3eSJouni Malinen 		int rand_fac_val = strtoul(rand_fac, NULL, 0);
1809cd4e3c3eSJouni Malinen 
1810cd4e3c3eSJouni Malinen 		req.config_random_factor_force = 1;
1811cd4e3c3eSJouni Malinen 		req.random_factor_force_val = rand_fac_val;
1812cd4e3c3eSJouni Malinen 	}
1813cd4e3c3eSJouni Malinen 
1814cd4e3c3eSJouni Malinen 	if (hop_count) {
1815cd4e3c3eSJouni Malinen 		int hop_count_val = strtoul(hop_count, NULL, 0);
1816cd4e3c3eSJouni Malinen 
1817cd4e3c3eSJouni Malinen 		req.config_hop_count_force = 1;
1818cd4e3c3eSJouni Malinen 		req.hop_count_force_val = hop_count_val;
1819cd4e3c3eSJouni Malinen 	}
1820cd4e3c3eSJouni Malinen 
18212dfb1daeSVinay Gannevaram 	ret = nan_enable_request(0, dut->wifi_hal_iface_handle, &req);
1822107356c8SRakesh Sunki 	if (ret != WIFI_SUCCESS) {
1823107356c8SRakesh Sunki 		send_resp(dut, conn, SIGMA_ERROR, "Unable to enable nan");
1824107356c8SRakesh Sunki 		return 0;
1825107356c8SRakesh Sunki 	}
1826116be195SKantesh Mundaragi 
1827cd4e3c3eSJouni Malinen 	abstime.tv_sec = 4;
1828cd4e3c3eSJouni Malinen 	abstime.tv_nsec = 0;
1829cd4e3c3eSJouni Malinen 	wait(abstime);
1830116be195SKantesh Mundaragi 
1831cd4e3c3eSJouni Malinen 	return 0;
1832cd4e3c3eSJouni Malinen }
1833cd4e3c3eSJouni Malinen 
1834cd4e3c3eSJouni Malinen 
nan_further_availability_tx(struct sigma_dut * dut,struct sigma_conn * conn,struct sigma_cmd * cmd)1835cd4e3c3eSJouni Malinen static int nan_further_availability_tx(struct sigma_dut *dut,
1836cd4e3c3eSJouni Malinen 				       struct sigma_conn *conn,
1837cd4e3c3eSJouni Malinen 				       struct sigma_cmd *cmd)
1838cd4e3c3eSJouni Malinen {
1839cd4e3c3eSJouni Malinen 	const char *master_pref = get_param(cmd, "MasterPref");
1840cd4e3c3eSJouni Malinen 	const char *rand_fac = get_param(cmd, "RandFactor");
1841cd4e3c3eSJouni Malinen 	const char *hop_count = get_param(cmd, "HopCount");
1842107356c8SRakesh Sunki 	wifi_error ret;
1843107356c8SRakesh Sunki 
1844cd4e3c3eSJouni Malinen 	NanEnableRequest req;
1845cd4e3c3eSJouni Malinen 	NanConfigRequest configReq;
1846cd4e3c3eSJouni Malinen 
1847cd4e3c3eSJouni Malinen 	memset(&req, 0, sizeof(NanEnableRequest));
1848cd4e3c3eSJouni Malinen 	req.cluster_low = 0;
1849cd4e3c3eSJouni Malinen 	req.cluster_high = 0xFFFF;
1850cd4e3c3eSJouni Malinen 	req.master_pref = 30;
1851cd4e3c3eSJouni Malinen 
1852cd4e3c3eSJouni Malinen 	if (master_pref)
1853cd4e3c3eSJouni Malinen 		req.master_pref = strtoul(master_pref, NULL, 0);
1854cd4e3c3eSJouni Malinen 
1855cd4e3c3eSJouni Malinen 	if (rand_fac) {
1856cd4e3c3eSJouni Malinen 		int rand_fac_val = strtoul(rand_fac, NULL, 0);
1857cd4e3c3eSJouni Malinen 
1858cd4e3c3eSJouni Malinen 		req.config_random_factor_force = 1;
1859cd4e3c3eSJouni Malinen 		req.random_factor_force_val = rand_fac_val;
1860cd4e3c3eSJouni Malinen 	}
1861cd4e3c3eSJouni Malinen 
1862cd4e3c3eSJouni Malinen 	if (hop_count) {
1863cd4e3c3eSJouni Malinen 		int hop_count_val = strtoul(hop_count, NULL, 0);
1864cd4e3c3eSJouni Malinen 
1865cd4e3c3eSJouni Malinen 		req.config_hop_count_force = 1;
1866cd4e3c3eSJouni Malinen 		req.hop_count_force_val = hop_count_val;
1867cd4e3c3eSJouni Malinen 	}
1868cd4e3c3eSJouni Malinen 
18692dfb1daeSVinay Gannevaram 	ret = nan_enable_request(0, dut->wifi_hal_iface_handle, &req);
1870107356c8SRakesh Sunki 	if (ret != WIFI_SUCCESS) {
1871107356c8SRakesh Sunki 		send_resp(dut, conn, SIGMA_ERROR, "Unable to enable nan");
1872107356c8SRakesh Sunki 		return 0;
1873107356c8SRakesh Sunki 	}
1874cd4e3c3eSJouni Malinen 
1875cd4e3c3eSJouni Malinen 	/* Start the config of fam */
1876cd4e3c3eSJouni Malinen 
1877cd4e3c3eSJouni Malinen 	memset(&configReq, 0, sizeof(NanConfigRequest));
1878cd4e3c3eSJouni Malinen 
1879cd4e3c3eSJouni Malinen 	configReq.config_fam = 1;
1880cd4e3c3eSJouni Malinen 	configReq.fam_val.numchans = 1;
18811854ec6fSAmarnath Hullur Subramanyam 	configReq.fam_val.famchan[0].entry_control = 0;
18821854ec6fSAmarnath Hullur Subramanyam 	configReq.fam_val.famchan[0].class_val = 81;
18831854ec6fSAmarnath Hullur Subramanyam 	configReq.fam_val.famchan[0].channel = 6;
18841854ec6fSAmarnath Hullur Subramanyam 	configReq.fam_val.famchan[0].mapid = 0;
18851854ec6fSAmarnath Hullur Subramanyam 	configReq.fam_val.famchan[0].avail_interval_bitmap = 0x7ffffffe;
18861854ec6fSAmarnath Hullur Subramanyam 
18872dfb1daeSVinay Gannevaram 	ret = nan_config_request(0, dut->wifi_hal_iface_handle, &configReq);
1888107356c8SRakesh Sunki 	if (ret != WIFI_SUCCESS)
1889107356c8SRakesh Sunki 		send_resp(dut, conn, SIGMA_ERROR, "Nan config request failed");
1890cd4e3c3eSJouni Malinen 
1891cd4e3c3eSJouni Malinen 	return 0;
1892cd4e3c3eSJouni Malinen }
1893cd4e3c3eSJouni Malinen 
1894cd4e3c3eSJouni Malinen 
sigma_nan_transmit_followup(struct sigma_dut * dut,struct sigma_conn * conn,struct sigma_cmd * cmd)1895cd4e3c3eSJouni Malinen int sigma_nan_transmit_followup(struct sigma_dut *dut,
1896cd4e3c3eSJouni Malinen 				struct sigma_conn *conn,
1897cd4e3c3eSJouni Malinen 				struct sigma_cmd *cmd)
1898cd4e3c3eSJouni Malinen {
1899cd4e3c3eSJouni Malinen 	const char *mac = get_param(cmd, "mac");
1900cd4e3c3eSJouni Malinen 	const char *requestor_id = get_param(cmd, "RemoteInstanceId");
1901cd4e3c3eSJouni Malinen 	const char *local_id = get_param(cmd, "LocalInstanceId");
1902cd4e3c3eSJouni Malinen 	const char *service_name = get_param(cmd, "servicename");
1903107356c8SRakesh Sunki 	wifi_error ret;
1904cd4e3c3eSJouni Malinen 	NanTransmitFollowupRequest req;
1905cd4e3c3eSJouni Malinen 
1906cd4e3c3eSJouni Malinen 	memset(&req, 0, sizeof(NanTransmitFollowupRequest));
19071854ec6fSAmarnath Hullur Subramanyam 	req.requestor_instance_id = global_match_handle;
1908cd4e3c3eSJouni Malinen 	req.addr[0] = 0xFF;
1909cd4e3c3eSJouni Malinen 	req.addr[1] = 0xFF;
1910cd4e3c3eSJouni Malinen 	req.addr[2] = 0xFF;
1911cd4e3c3eSJouni Malinen 	req.addr[3] = 0xFF;
1912cd4e3c3eSJouni Malinen 	req.addr[4] = 0xFF;
1913cd4e3c3eSJouni Malinen 	req.addr[5] = 0xFF;
1914cd4e3c3eSJouni Malinen 	req.priority = NAN_TX_PRIORITY_NORMAL;
1915cd4e3c3eSJouni Malinen 	req.dw_or_faw = 0;
1916132c6d2bSKantesh Mundaragi 
1917132c6d2bSKantesh Mundaragi 	if (service_name)
1918cd4e3c3eSJouni Malinen 		req.service_specific_info_len = strlen(service_name);
1919cd4e3c3eSJouni Malinen 
1920cd4e3c3eSJouni Malinen 	if (requestor_id) {
1921cd4e3c3eSJouni Malinen 		/* int requestor_id_val = atoi(requestor_id); */
1922fa417337SRakesh Sunki 		if (global_match_handle != 0) {
19231854ec6fSAmarnath Hullur Subramanyam 			req.requestor_instance_id = global_match_handle;
1924fa417337SRakesh Sunki 		} else {
1925fa417337SRakesh Sunki 			u32 requestor_id_val = atoi(requestor_id);
1926fa417337SRakesh Sunki 			requestor_id_val =
1927fa417337SRakesh Sunki 					(requestor_id_val << 24) | 0x0000FFFF;
1928fa417337SRakesh Sunki 			req.requestor_instance_id = requestor_id_val;
1929fa417337SRakesh Sunki 		}
1930cd4e3c3eSJouni Malinen 	}
1931cd4e3c3eSJouni Malinen 	if (local_id) {
1932cd4e3c3eSJouni Malinen 		/* int local_id_val = atoi(local_id); */
1933fa417337SRakesh Sunki 		if (global_header_handle != 0)
19341854ec6fSAmarnath Hullur Subramanyam 			req.publish_subscribe_id = global_header_handle;
1935fa417337SRakesh Sunki 		else
1936fa417337SRakesh Sunki 			req.publish_subscribe_id = atoi(local_id);
1937cd4e3c3eSJouni Malinen 	}
1938cd4e3c3eSJouni Malinen 
1939cd4e3c3eSJouni Malinen 	if (mac == NULL) {
1940cd4e3c3eSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_ERROR, "Invalid MAC Address");
1941cd4e3c3eSJouni Malinen 		return -1;
1942cd4e3c3eSJouni Malinen 	}
1943cd4e3c3eSJouni Malinen 	nan_parse_mac_address(dut, mac, req.addr);
1944cd4e3c3eSJouni Malinen 
19452dfb1daeSVinay Gannevaram 	ret = nan_transmit_followup_request(0, dut->wifi_hal_iface_handle,
19462dfb1daeSVinay Gannevaram 					    &req);
1947107356c8SRakesh Sunki 	if (ret != WIFI_SUCCESS) {
1948107356c8SRakesh Sunki 		send_resp(dut, conn, SIGMA_ERROR,
1949107356c8SRakesh Sunki 			  "Unable to complete nan transmit followup");
1950107356c8SRakesh Sunki 	}
19511854ec6fSAmarnath Hullur Subramanyam 
1952cd4e3c3eSJouni Malinen 	return 0;
1953cd4e3c3eSJouni Malinen }
1954cd4e3c3eSJouni Malinen 
1955107356c8SRakesh Sunki 
1956cd4e3c3eSJouni Malinen /* NotifyResponse invoked to notify the status of the Request */
nan_notify_response(transaction_id id,NanResponseMsg * rsp_data)19571854ec6fSAmarnath Hullur Subramanyam void nan_notify_response(transaction_id id, NanResponseMsg *rsp_data)
1958cd4e3c3eSJouni Malinen {
1959cd4e3c3eSJouni Malinen 	sigma_dut_print(global_dut, DUT_MSG_INFO,
1960fdbd60b6SRakesh Sunki 			"%s: status %d response_type %d",
1961fdbd60b6SRakesh Sunki 			__func__, rsp_data->status, rsp_data->response_type);
1962d51e8980SRakesh Sunki 	if (rsp_data->response_type == NAN_RESPONSE_STATS &&
1963d51e8980SRakesh Sunki 	    rsp_data->body.stats_response.stats_type ==
1964d51e8980SRakesh Sunki 	    NAN_STATS_ID_DE_TIMING_SYNC) {
1965d51e8980SRakesh Sunki 		NanSyncStats *pSyncStats;
1966d51e8980SRakesh Sunki 
1967d51e8980SRakesh Sunki 		sigma_dut_print(global_dut, DUT_MSG_INFO,
1968d51e8980SRakesh Sunki 				"%s: stats_type %d", __func__,
19691854ec6fSAmarnath Hullur Subramanyam 				rsp_data->body.stats_response.stats_type);
1970d51e8980SRakesh Sunki 		pSyncStats = &rsp_data->body.stats_response.data.sync_stats;
1971d51e8980SRakesh Sunki 		memcpy(&global_nan_sync_stats, pSyncStats,
1972d51e8980SRakesh Sunki 		       sizeof(NanSyncStats));
1973d51e8980SRakesh Sunki 		pthread_cond_signal(&gCondition);
19744d5912dfSRakesh Sunki 	} else if (rsp_data->response_type == NAN_RESPONSE_PUBLISH) {
19754d5912dfSRakesh Sunki 		sigma_dut_print(global_dut, DUT_MSG_INFO,
19764d5912dfSRakesh Sunki 				"%s: publish_id %d\n",
19774d5912dfSRakesh Sunki 				__func__,
19784d5912dfSRakesh Sunki 				rsp_data->body.publish_response.publish_id);
19794d5912dfSRakesh Sunki 		global_publish_id = rsp_data->body.publish_response.publish_id;
19804d5912dfSRakesh Sunki 	} else if (rsp_data->response_type == NAN_RESPONSE_SUBSCRIBE) {
19814d5912dfSRakesh Sunki 		sigma_dut_print(global_dut, DUT_MSG_INFO,
19824d5912dfSRakesh Sunki 				"%s: subscribe_id %d\n",
19834d5912dfSRakesh Sunki 				__func__,
19844d5912dfSRakesh Sunki 				rsp_data->body.subscribe_response.subscribe_id);
19854d5912dfSRakesh Sunki 		global_subscribe_id =
19864d5912dfSRakesh Sunki 			rsp_data->body.subscribe_response.subscribe_id;
1987cd4e3c3eSJouni Malinen 	}
1988cd4e3c3eSJouni Malinen }
1989cd4e3c3eSJouni Malinen 
1990cd4e3c3eSJouni Malinen 
1991cd4e3c3eSJouni Malinen /* Events Callback */
nan_event_publish_replied(NanPublishRepliedInd * event)1992cd4e3c3eSJouni Malinen void nan_event_publish_replied(NanPublishRepliedInd *event)
1993cd4e3c3eSJouni Malinen {
1994cd4e3c3eSJouni Malinen 	sigma_dut_print(global_dut, DUT_MSG_INFO,
1995cd4e3c3eSJouni Malinen 			"%s: handle %d " MAC_ADDR_STR " rssi:%d",
19961854ec6fSAmarnath Hullur Subramanyam 			__func__, event->requestor_instance_id,
1997cd4e3c3eSJouni Malinen 			MAC_ADDR_ARRAY(event->addr), event->rssi_value);
1998cd4e3c3eSJouni Malinen 	event_anyresponse = 1;
1999cd4e3c3eSJouni Malinen 	snprintf(global_event_resp_buf, sizeof(global_event_resp_buf),
2000fa417337SRakesh Sunki 		 "EventName,Replied,RemoteInstanceID,%d,LocalInstanceID,%d,mac," MAC_ADDR_STR" ",
20011854ec6fSAmarnath Hullur Subramanyam 		 (event->requestor_instance_id >> 24),
2002fa417337SRakesh Sunki 		 (event->requestor_instance_id & 0xFFFF),
20031854ec6fSAmarnath Hullur Subramanyam 		 MAC_ADDR_ARRAY(event->addr));
2004cd4e3c3eSJouni Malinen }
2005cd4e3c3eSJouni Malinen 
2006cd4e3c3eSJouni Malinen 
2007cd4e3c3eSJouni Malinen /* Events Callback */
nan_event_publish_terminated(NanPublishTerminatedInd * event)2008cd4e3c3eSJouni Malinen void nan_event_publish_terminated(NanPublishTerminatedInd *event)
2009cd4e3c3eSJouni Malinen {
20101854ec6fSAmarnath Hullur Subramanyam 	sigma_dut_print(global_dut, DUT_MSG_INFO, "%s: publish_id %d reason %d",
20111854ec6fSAmarnath Hullur Subramanyam 			__func__, event->publish_id, event->reason);
2012cd4e3c3eSJouni Malinen }
2013cd4e3c3eSJouni Malinen 
2014cd4e3c3eSJouni Malinen 
2015cd4e3c3eSJouni Malinen /* Events Callback */
nan_event_match(NanMatchInd * event)2016cd4e3c3eSJouni Malinen void nan_event_match(NanMatchInd *event)
2017cd4e3c3eSJouni Malinen {
2018cd4e3c3eSJouni Malinen 	sigma_dut_print(global_dut, DUT_MSG_INFO,
20191854ec6fSAmarnath Hullur Subramanyam 			"%s: Pub/Sub Id %d remote_requestor_id %08x "
20201854ec6fSAmarnath Hullur Subramanyam 			MAC_ADDR_STR
2021cd4e3c3eSJouni Malinen 			" rssi:%d",
2022cd4e3c3eSJouni Malinen 			__func__,
20231854ec6fSAmarnath Hullur Subramanyam 			event->publish_subscribe_id,
20241854ec6fSAmarnath Hullur Subramanyam 			event->requestor_instance_id,
2025cd4e3c3eSJouni Malinen 			MAC_ADDR_ARRAY(event->addr),
2026cd4e3c3eSJouni Malinen 			event->rssi_value);
2027cd4e3c3eSJouni Malinen 	event_anyresponse = 1;
20281854ec6fSAmarnath Hullur Subramanyam 	global_header_handle = event->publish_subscribe_id;
20291854ec6fSAmarnath Hullur Subramanyam 	global_match_handle = event->requestor_instance_id;
203014cfcd25SRakesh Sunki 	memcpy(global_peer_mac_addr, event->addr, sizeof(global_peer_mac_addr));
20311854ec6fSAmarnath Hullur Subramanyam 
2032cd4e3c3eSJouni Malinen 	/* memset(event_resp_buf, 0, sizeof(event_resp_buf)); */
2033cd4e3c3eSJouni Malinen 	/* global_pub_sub_handle = event->header.handle; */
2034cd4e3c3eSJouni Malinen 	/* Print the SSI */
2035cd4e3c3eSJouni Malinen 	sigma_dut_print(global_dut, DUT_MSG_INFO, "Printing SSI:");
20361854ec6fSAmarnath Hullur Subramanyam 	nan_hex_dump(global_dut, event->service_specific_info,
2037cd4e3c3eSJouni Malinen 		event->service_specific_info_len);
2038cd4e3c3eSJouni Malinen 	snprintf(global_event_resp_buf, sizeof(global_event_resp_buf),
2039cd4e3c3eSJouni Malinen 		 "EventName,DiscoveryResult,RemoteInstanceID,%d,LocalInstanceID,%d,mac,"
20401854ec6fSAmarnath Hullur Subramanyam 		 MAC_ADDR_STR " ", (event->requestor_instance_id >> 24),
20411854ec6fSAmarnath Hullur Subramanyam 		 event->publish_subscribe_id, MAC_ADDR_ARRAY(event->addr));
2042cd4e3c3eSJouni Malinen 
2043cd4e3c3eSJouni Malinen 	/* Print the match filter */
2044cd4e3c3eSJouni Malinen 	sigma_dut_print(global_dut, DUT_MSG_INFO, "Printing sdf match filter:");
20451854ec6fSAmarnath Hullur Subramanyam 	nan_hex_dump(global_dut, event->sdf_match_filter,
20461854ec6fSAmarnath Hullur Subramanyam 		     event->sdf_match_filter_len);
2047cd4e3c3eSJouni Malinen 
2048cd4e3c3eSJouni Malinen 	/* Print the conn_capability */
2049cd4e3c3eSJouni Malinen 	sigma_dut_print(global_dut, DUT_MSG_INFO,
2050cd4e3c3eSJouni Malinen 			"Printing PostConnectivity Capability");
2051cd4e3c3eSJouni Malinen 	if (event->is_conn_capability_valid) {
2052cd4e3c3eSJouni Malinen 		sigma_dut_print(global_dut, DUT_MSG_INFO, "Wfd supported:%s",
2053cd4e3c3eSJouni Malinen 				event->conn_capability.is_wfd_supported ?
2054cd4e3c3eSJouni Malinen 				"yes" : "no");
2055cd4e3c3eSJouni Malinen 		sigma_dut_print(global_dut, DUT_MSG_INFO, "Wfds supported:%s",
2056cd4e3c3eSJouni Malinen 				(event->conn_capability.is_wfds_supported ?
2057cd4e3c3eSJouni Malinen 				 "yes" : "no"));
2058cd4e3c3eSJouni Malinen 		sigma_dut_print(global_dut, DUT_MSG_INFO, "TDLS supported:%s",
2059cd4e3c3eSJouni Malinen 				(event->conn_capability.is_tdls_supported ?
2060cd4e3c3eSJouni Malinen 				 "yes" : "no"));
2061cd4e3c3eSJouni Malinen 		sigma_dut_print(global_dut, DUT_MSG_INFO, "IBSS supported:%s",
2062cd4e3c3eSJouni Malinen 				(event->conn_capability.is_ibss_supported ?
2063cd4e3c3eSJouni Malinen 				 "yes" : "no"));
2064cd4e3c3eSJouni Malinen 		sigma_dut_print(global_dut, DUT_MSG_INFO, "Mesh supported:%s",
2065cd4e3c3eSJouni Malinen 				(event->conn_capability.is_mesh_supported ?
2066cd4e3c3eSJouni Malinen 				 "yes" : "no"));
2067cd4e3c3eSJouni Malinen 		sigma_dut_print(global_dut, DUT_MSG_INFO, "Infra Field:%d",
2068cd4e3c3eSJouni Malinen 				event->conn_capability.wlan_infra_field);
2069cd4e3c3eSJouni Malinen 	} else {
2070cd4e3c3eSJouni Malinen 		sigma_dut_print(global_dut, DUT_MSG_INFO,
2071cd4e3c3eSJouni Malinen 				"PostConnectivity Capability not present");
2072cd4e3c3eSJouni Malinen 	}
2073cd4e3c3eSJouni Malinen 
2074cd4e3c3eSJouni Malinen 	/* Print the discovery_attr */
2075cd4e3c3eSJouni Malinen 	sigma_dut_print(global_dut, DUT_MSG_INFO,
2076cd4e3c3eSJouni Malinen 			"Printing PostDiscovery Attribute");
20771854ec6fSAmarnath Hullur Subramanyam 	if (event->num_rx_discovery_attr) {
20781854ec6fSAmarnath Hullur Subramanyam 		int idx;
20791854ec6fSAmarnath Hullur Subramanyam 
20801854ec6fSAmarnath Hullur Subramanyam 		for (idx = 0; idx < event->num_rx_discovery_attr; idx++) {
20811854ec6fSAmarnath Hullur Subramanyam 			sigma_dut_print(global_dut, DUT_MSG_INFO,
20821854ec6fSAmarnath Hullur Subramanyam 					"PostDiscovery Attribute - %d", idx);
2083cd4e3c3eSJouni Malinen 			sigma_dut_print(global_dut, DUT_MSG_INFO,
2084cd4e3c3eSJouni Malinen 					"Conn Type:%d Device Role:%d"
2085cd4e3c3eSJouni Malinen 					MAC_ADDR_STR,
20861854ec6fSAmarnath Hullur Subramanyam 					event->discovery_attr[idx].type,
20871854ec6fSAmarnath Hullur Subramanyam 					event->discovery_attr[idx].role,
20881854ec6fSAmarnath Hullur Subramanyam 					MAC_ADDR_ARRAY(event->discovery_attr[idx].addr));
20891854ec6fSAmarnath Hullur Subramanyam 			sigma_dut_print(global_dut, DUT_MSG_INFO,
20901854ec6fSAmarnath Hullur Subramanyam 					"Duration:%d MapId:%d "
20911854ec6fSAmarnath Hullur Subramanyam 					"avail_interval_bitmap:%04x",
20921854ec6fSAmarnath Hullur Subramanyam 					event->discovery_attr[idx].duration,
20931854ec6fSAmarnath Hullur Subramanyam 					event->discovery_attr[idx].mapid,
20941854ec6fSAmarnath Hullur Subramanyam 					event->discovery_attr[idx].avail_interval_bitmap);
2095cd4e3c3eSJouni Malinen 			sigma_dut_print(global_dut, DUT_MSG_INFO,
2096cd4e3c3eSJouni Malinen 					"Printing Mesh Id:");
20971854ec6fSAmarnath Hullur Subramanyam 			nan_hex_dump(global_dut,
20981854ec6fSAmarnath Hullur Subramanyam 				     event->discovery_attr[idx].mesh_id,
20991854ec6fSAmarnath Hullur Subramanyam 				     event->discovery_attr[idx].mesh_id_len);
21001854ec6fSAmarnath Hullur Subramanyam 			sigma_dut_print(global_dut, DUT_MSG_INFO,
21011854ec6fSAmarnath Hullur Subramanyam 					"Printing Infrastructure Ssid:");
21021854ec6fSAmarnath Hullur Subramanyam 			nan_hex_dump(global_dut,
21031854ec6fSAmarnath Hullur Subramanyam 				     event->discovery_attr[idx].infrastructure_ssid_val,
21041854ec6fSAmarnath Hullur Subramanyam 				     event->discovery_attr[idx].infrastructure_ssid_len);
21051854ec6fSAmarnath Hullur Subramanyam 		}
2106cd4e3c3eSJouni Malinen 	} else {
2107cd4e3c3eSJouni Malinen 		sigma_dut_print(global_dut, DUT_MSG_INFO,
2108cd4e3c3eSJouni Malinen 				"PostDiscovery attribute not present");
2109cd4e3c3eSJouni Malinen 	}
2110cd4e3c3eSJouni Malinen 
2111cd4e3c3eSJouni Malinen 	/* Print the fam */
21121854ec6fSAmarnath Hullur Subramanyam 	if (event->num_chans) {
21131854ec6fSAmarnath Hullur Subramanyam 		nan_print_further_availability_chan(global_dut,
21141854ec6fSAmarnath Hullur Subramanyam 						    event->num_chans,
21151854ec6fSAmarnath Hullur Subramanyam 						    &event->famchan[0]);
21161854ec6fSAmarnath Hullur Subramanyam 	} else {
21171854ec6fSAmarnath Hullur Subramanyam 		sigma_dut_print(global_dut, DUT_MSG_INFO,
21181854ec6fSAmarnath Hullur Subramanyam 				"Further Availability Map not present");
21191854ec6fSAmarnath Hullur Subramanyam 	}
21201854ec6fSAmarnath Hullur Subramanyam 	if (event->cluster_attribute_len) {
21211854ec6fSAmarnath Hullur Subramanyam 		sigma_dut_print(global_dut, DUT_MSG_INFO,
21221854ec6fSAmarnath Hullur Subramanyam 				"Printing Cluster Attribute:");
21231854ec6fSAmarnath Hullur Subramanyam 		nan_hex_dump(global_dut, event->cluster_attribute,
21241854ec6fSAmarnath Hullur Subramanyam 			     event->cluster_attribute_len);
21251854ec6fSAmarnath Hullur Subramanyam 	} else {
21261854ec6fSAmarnath Hullur Subramanyam 		sigma_dut_print(global_dut, DUT_MSG_INFO,
21271854ec6fSAmarnath Hullur Subramanyam 				"Cluster Attribute not present");
2128cd4e3c3eSJouni Malinen 	}
2129cd4e3c3eSJouni Malinen }
2130cd4e3c3eSJouni Malinen 
2131cd4e3c3eSJouni Malinen 
2132cd4e3c3eSJouni Malinen /* Events Callback */
nan_event_match_expired(NanMatchExpiredInd * event)21331854ec6fSAmarnath Hullur Subramanyam void nan_event_match_expired(NanMatchExpiredInd *event)
2134cd4e3c3eSJouni Malinen {
2135cd4e3c3eSJouni Malinen 	sigma_dut_print(global_dut, DUT_MSG_INFO,
21361854ec6fSAmarnath Hullur Subramanyam 			"%s: publish_subscribe_id %d match_handle %08x",
21371854ec6fSAmarnath Hullur Subramanyam 			__func__, event->publish_subscribe_id,
21381854ec6fSAmarnath Hullur Subramanyam 			event->requestor_instance_id);
2139cd4e3c3eSJouni Malinen }
2140cd4e3c3eSJouni Malinen 
2141cd4e3c3eSJouni Malinen 
2142cd4e3c3eSJouni Malinen /* Events Callback */
nan_event_subscribe_terminated(NanSubscribeTerminatedInd * event)2143cd4e3c3eSJouni Malinen void nan_event_subscribe_terminated(NanSubscribeTerminatedInd *event)
2144cd4e3c3eSJouni Malinen {
21451854ec6fSAmarnath Hullur Subramanyam 	sigma_dut_print(global_dut, DUT_MSG_INFO,
21461854ec6fSAmarnath Hullur Subramanyam 			"%s: Subscribe Id %d reason %d",
21471854ec6fSAmarnath Hullur Subramanyam 			__func__, event->subscribe_id, event->reason);
2148cd4e3c3eSJouni Malinen }
2149cd4e3c3eSJouni Malinen 
2150cd4e3c3eSJouni Malinen 
2151cd4e3c3eSJouni Malinen /* Events Callback */
nan_event_followup(NanFollowupInd * event)2152cd4e3c3eSJouni Malinen void nan_event_followup(NanFollowupInd *event)
2153cd4e3c3eSJouni Malinen {
2154cd4e3c3eSJouni Malinen 	sigma_dut_print(global_dut, DUT_MSG_INFO,
21551854ec6fSAmarnath Hullur Subramanyam 			"%s: Publish/Subscribe Id %d match_handle 0x%08x dw_or_faw %d "
21561854ec6fSAmarnath Hullur Subramanyam 			MAC_ADDR_STR, __func__, event->publish_subscribe_id,
21571854ec6fSAmarnath Hullur Subramanyam 			event->requestor_instance_id, event->dw_or_faw,
2158cd4e3c3eSJouni Malinen 			MAC_ADDR_ARRAY(event->addr));
2159cd4e3c3eSJouni Malinen 
2160fa417337SRakesh Sunki 	global_match_handle = event->requestor_instance_id;
2161fa417337SRakesh Sunki 	global_header_handle = event->publish_subscribe_id;
21621854ec6fSAmarnath Hullur Subramanyam 	sigma_dut_print(global_dut, DUT_MSG_INFO, "%s: Printing SSI", __func__);
21631854ec6fSAmarnath Hullur Subramanyam 	nan_hex_dump(global_dut, event->service_specific_info,
2164cd4e3c3eSJouni Malinen 		     event->service_specific_info_len);
2165cd4e3c3eSJouni Malinen 	event_anyresponse = 1;
2166cd4e3c3eSJouni Malinen 	snprintf(global_event_resp_buf, sizeof(global_event_resp_buf),
2167cd4e3c3eSJouni Malinen 		 "EventName,FollowUp,RemoteInstanceID,%d,LocalInstanceID,%d,mac,"
21681854ec6fSAmarnath Hullur Subramanyam 		 MAC_ADDR_STR " ", event->requestor_instance_id >> 24,
21691854ec6fSAmarnath Hullur Subramanyam 		 event->publish_subscribe_id, MAC_ADDR_ARRAY(event->addr));
2170cd4e3c3eSJouni Malinen }
2171cd4e3c3eSJouni Malinen 
2172cd4e3c3eSJouni Malinen 
2173cd4e3c3eSJouni Malinen /* Events Callback */
nan_event_disceng_event(NanDiscEngEventInd * event)2174cd4e3c3eSJouni Malinen void nan_event_disceng_event(NanDiscEngEventInd *event)
2175cd4e3c3eSJouni Malinen {
21761854ec6fSAmarnath Hullur Subramanyam 	sigma_dut_print(global_dut, DUT_MSG_INFO, "%s: event_type %d",
21771854ec6fSAmarnath Hullur Subramanyam 			__func__, event->event_type);
2178cd4e3c3eSJouni Malinen 
21791854ec6fSAmarnath Hullur Subramanyam 	if (event->event_type == NAN_EVENT_ID_JOINED_CLUSTER) {
2180cd4e3c3eSJouni Malinen 		sigma_dut_print(global_dut, DUT_MSG_INFO, "%s: Joined cluster "
2181cd4e3c3eSJouni Malinen 				MAC_ADDR_STR,
2182cd4e3c3eSJouni Malinen 				__func__,
2183cd4e3c3eSJouni Malinen 				MAC_ADDR_ARRAY(event->data.cluster.addr));
2184116be195SKantesh Mundaragi 		/* To ensure sta_get_events to get the events
2185116be195SKantesh Mundaragi 		 * only after joining the NAN cluster. */
2186116be195SKantesh Mundaragi 		pthread_cond_signal(&gCondition);
2187cd4e3c3eSJouni Malinen 	}
21881854ec6fSAmarnath Hullur Subramanyam 	if (event->event_type == NAN_EVENT_ID_STARTED_CLUSTER) {
2189cd4e3c3eSJouni Malinen 		sigma_dut_print(global_dut, DUT_MSG_INFO,
2190cd4e3c3eSJouni Malinen 				"%s: Started cluster " MAC_ADDR_STR,
2191cd4e3c3eSJouni Malinen 				__func__,
2192cd4e3c3eSJouni Malinen 				MAC_ADDR_ARRAY(event->data.cluster.addr));
2193cd4e3c3eSJouni Malinen 	}
21941854ec6fSAmarnath Hullur Subramanyam 	if (event->event_type == NAN_EVENT_ID_DISC_MAC_ADDR) {
21951854ec6fSAmarnath Hullur Subramanyam 		sigma_dut_print(global_dut, DUT_MSG_INFO,
21961854ec6fSAmarnath Hullur Subramanyam 				"%s: Discovery Mac Address "
2197cd4e3c3eSJouni Malinen 				MAC_ADDR_STR,
2198cd4e3c3eSJouni Malinen 				__func__,
2199cd4e3c3eSJouni Malinen 				MAC_ADDR_ARRAY(event->data.mac_addr.addr));
2200cd4e3c3eSJouni Malinen 		memcpy(global_nan_mac_addr, event->data.mac_addr.addr,
2201cd4e3c3eSJouni Malinen 		       sizeof(global_nan_mac_addr));
2202cd4e3c3eSJouni Malinen 	}
2203cd4e3c3eSJouni Malinen }
2204cd4e3c3eSJouni Malinen 
2205cd4e3c3eSJouni Malinen 
2206cd4e3c3eSJouni Malinen /* Events Callback */
nan_event_disabled(NanDisabledInd * event)2207cd4e3c3eSJouni Malinen void nan_event_disabled(NanDisabledInd *event)
2208cd4e3c3eSJouni Malinen {
22091854ec6fSAmarnath Hullur Subramanyam 	sigma_dut_print(global_dut, DUT_MSG_INFO, "%s: reason %d",
22101854ec6fSAmarnath Hullur Subramanyam 			__func__, event->reason);
2211cd4e3c3eSJouni Malinen 	/* pthread_cond_signal(&gCondition); */
2212c2ae961eSAjit Vaishya 	if (if_nametoindex(NAN_AWARE_IFACE))
2213c2ae961eSAjit Vaishya 		run_system_wrapper(global_dut, "ifconfig %s down",
2214c2ae961eSAjit Vaishya 				   NAN_AWARE_IFACE);
2215cd4e3c3eSJouni Malinen }
2216cd4e3c3eSJouni Malinen 
2217cd4e3c3eSJouni Malinen 
22184c086678SRakesh Sunki /* Events callback */
ndp_event_data_indication(NanDataPathRequestInd * event)22194c086678SRakesh Sunki static void ndp_event_data_indication(NanDataPathRequestInd *event)
22204c086678SRakesh Sunki {
222147d709baSPeng Xu 	u8 *p_frame;
222247d709baSPeng Xu 	u16 ipv6_addr_len = 0;
222347d709baSPeng Xu 	static const u8 ipv6_intf_addr_msb[] = {
222447d709baSPeng Xu 		0xFE, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
222547d709baSPeng Xu 	};
222647d709baSPeng Xu 
22274c086678SRakesh Sunki 	sigma_dut_print(global_dut, DUT_MSG_INFO,
22284c086678SRakesh Sunki 			"%s: Service Instance Id: %d  Peer Discovery MAC ADDR "
22294c086678SRakesh Sunki 			MAC_ADDR_STR
22304c086678SRakesh Sunki 			" NDP Instance Id: %d App Info  len %d App Info %s",
22314c086678SRakesh Sunki 			__func__,
22324c086678SRakesh Sunki 			event->service_instance_id,
22334c086678SRakesh Sunki 			MAC_ADDR_ARRAY(event->peer_disc_mac_addr),
22344c086678SRakesh Sunki 			event->ndp_instance_id,
22354c086678SRakesh Sunki 			event->app_info.ndp_app_info_len,
22364c086678SRakesh Sunki 			event->app_info.ndp_app_info);
22374c086678SRakesh Sunki 
22384c086678SRakesh Sunki 	global_ndp_instance_id = event->ndp_instance_id;
223947d709baSPeng Xu 	memset(global_dut->nan_ipv6_addr, 0, sizeof(global_dut->nan_ipv6_addr));
224047d709baSPeng Xu 	global_dut->nan_ipv6_len = 0;
224147d709baSPeng Xu 
224247d709baSPeng Xu 	if (event->app_info.ndp_app_info_len > 0) {
224347d709baSPeng Xu 		p_frame = event->app_info.ndp_app_info;
224447d709baSPeng Xu 		if (*p_frame == NAN_TLV_TYPE_IPV6_LINK_LOCAL) {
224547d709baSPeng Xu 			p_frame++;
224647d709baSPeng Xu 			ipv6_addr_len = *p_frame++;
224747d709baSPeng Xu 			ipv6_addr_len |= (*p_frame++) << 8;
224847d709baSPeng Xu 			memcpy(global_dut->nan_ipv6_addr, ipv6_intf_addr_msb,
224947d709baSPeng Xu 			       NAN_INTF_ID_LEN);
225047d709baSPeng Xu 			global_dut->nan_ipv6_len = NAN_INTF_ID_LEN;
225147d709baSPeng Xu 			if (ipv6_addr_len > 0 &&
225247d709baSPeng Xu 			    ipv6_addr_len <= NAN_INTF_ID_LEN) {
225347d709baSPeng Xu 				memcpy(global_dut->nan_ipv6_addr +
225447d709baSPeng Xu 				       NAN_INTF_ID_LEN,
225547d709baSPeng Xu 				       p_frame, ipv6_addr_len);
225647d709baSPeng Xu 				global_dut->nan_ipv6_len += ipv6_addr_len;
225747d709baSPeng Xu 			}
225847d709baSPeng Xu 		}
225947d709baSPeng Xu 	}
22604c086678SRakesh Sunki }
22614c086678SRakesh Sunki 
22624c086678SRakesh Sunki 
22634c086678SRakesh Sunki /* Events callback */
ndp_event_data_confirm(NanDataPathConfirmInd * event)22644c086678SRakesh Sunki static void ndp_event_data_confirm(NanDataPathConfirmInd *event)
22654c086678SRakesh Sunki {
22668f8e74b5SRakesh Sunki 	char cmd[200];
22678f8e74b5SRakesh Sunki 	char ipv6_buf[100];
22688f8e74b5SRakesh Sunki 
22694c086678SRakesh Sunki 	sigma_dut_print(global_dut, DUT_MSG_INFO,
22704c086678SRakesh Sunki 			"Received NDP Confirm Indication");
22714c086678SRakesh Sunki 
22728f8e74b5SRakesh Sunki 	memset(cmd, 0, sizeof(cmd));
22738f8e74b5SRakesh Sunki 	memset(ipv6_buf, 0, sizeof(ipv6_buf));
22748f8e74b5SRakesh Sunki 
22754c086678SRakesh Sunki 	global_ndp_instance_id = event->ndp_instance_id;
22768f8e74b5SRakesh Sunki 
22778f8e74b5SRakesh Sunki 	if (event->rsp_code == NAN_DP_REQUEST_ACCEPT) {
22784c086678SRakesh Sunki 		if (system("ifconfig nan0 up") != 0) {
22794c086678SRakesh Sunki 			sigma_dut_print(global_dut, DUT_MSG_ERROR,
22804c086678SRakesh Sunki 					"Failed to set nan interface up");
22814c086678SRakesh Sunki 			return;
22824c086678SRakesh Sunki 		}
228378a3cbd1SPeng Xu 		if (system("ip -6 route replace fe80::/64 dev nan0 table local") !=
22848f8e74b5SRakesh Sunki 		    0) {
22854c086678SRakesh Sunki 			sigma_dut_print(global_dut, DUT_MSG_ERROR,
22864c086678SRakesh Sunki 					"Failed to run:ip -6 route replace fe80::/64 dev nan0 table local");
22878f8e74b5SRakesh Sunki 		}
228847d709baSPeng Xu 
228947d709baSPeng Xu 		if (global_dut->nan_ipv6_len > 0 &&
229047d709baSPeng Xu 		    global_dut->nan_ipv6_len >= IPV6_ADDR_LEN)
229178a3cbd1SPeng Xu 			snprintf(ipv6_buf, sizeof(ipv6_buf),
229278a3cbd1SPeng Xu 				 "fe80::%02x%02x:%02xff:fe%02x:%02x%02x",
229347d709baSPeng Xu 				 global_dut->nan_ipv6_addr[8],
229447d709baSPeng Xu 				 global_dut->nan_ipv6_addr[9],
229547d709baSPeng Xu 				 global_dut->nan_ipv6_addr[10],
229647d709baSPeng Xu 				 global_dut->nan_ipv6_addr[13],
229747d709baSPeng Xu 				 global_dut->nan_ipv6_addr[14],
229847d709baSPeng Xu 				 global_dut->nan_ipv6_addr[15]);
229978a3cbd1SPeng Xu 		else
230078a3cbd1SPeng Xu 			convert_mac_addr_to_ipv6_lladdr(
230178a3cbd1SPeng Xu 				event->peer_ndi_mac_addr,
23028f8e74b5SRakesh Sunki 				ipv6_buf, sizeof(ipv6_buf));
230378a3cbd1SPeng Xu 
23048f8e74b5SRakesh Sunki 		snprintf(cmd, sizeof(cmd),
23058f8e74b5SRakesh Sunki 			 "ip -6 neighbor replace %s lladdr %02x:%02x:%02x:%02x:%02x:%02x nud permanent dev nan0",
23068f8e74b5SRakesh Sunki 			 ipv6_buf, event->peer_ndi_mac_addr[0],
23078f8e74b5SRakesh Sunki 			 event->peer_ndi_mac_addr[1],
23088f8e74b5SRakesh Sunki 			 event->peer_ndi_mac_addr[2],
23098f8e74b5SRakesh Sunki 			 event->peer_ndi_mac_addr[3],
23108f8e74b5SRakesh Sunki 			 event->peer_ndi_mac_addr[4],
23118f8e74b5SRakesh Sunki 			 event->peer_ndi_mac_addr[5]);
23128f8e74b5SRakesh Sunki 		sigma_dut_print(global_dut, DUT_MSG_INFO,
23138f8e74b5SRakesh Sunki 				"neighbor replace cmd = %s", cmd);
23148f8e74b5SRakesh Sunki 		if (system(cmd) != 0) {
23158f8e74b5SRakesh Sunki 			sigma_dut_print(global_dut, DUT_MSG_ERROR,
23168f8e74b5SRakesh Sunki 					"Failed to run: ip -6 neighbor replace");
23174c086678SRakesh Sunki 			return;
23184c086678SRakesh Sunki 		}
23194c086678SRakesh Sunki 	}
23208f8e74b5SRakesh Sunki }
23214c086678SRakesh Sunki 
23224c086678SRakesh Sunki 
2323cd4e3c3eSJouni Malinen static NanCallbackHandler callbackHandler = {
2324cd4e3c3eSJouni Malinen 	.NotifyResponse = nan_notify_response,
2325cd4e3c3eSJouni Malinen 	.EventPublishReplied = nan_event_publish_replied,
2326cd4e3c3eSJouni Malinen 	.EventPublishTerminated = nan_event_publish_terminated,
2327cd4e3c3eSJouni Malinen 	.EventMatch = nan_event_match,
23281854ec6fSAmarnath Hullur Subramanyam 	.EventMatchExpired = nan_event_match_expired,
2329cd4e3c3eSJouni Malinen 	.EventSubscribeTerminated = nan_event_subscribe_terminated,
2330cd4e3c3eSJouni Malinen 	.EventFollowup = nan_event_followup,
2331cd4e3c3eSJouni Malinen 	.EventDiscEngEvent = nan_event_disceng_event,
2332cd4e3c3eSJouni Malinen 	.EventDisabled = nan_event_disabled,
23334c086678SRakesh Sunki 	.EventDataRequest = ndp_event_data_indication,
23344c086678SRakesh Sunki 	.EventDataConfirm = ndp_event_data_confirm,
2335cd4e3c3eSJouni Malinen };
2336cd4e3c3eSJouni Malinen 
2337132c6d2bSKantesh Mundaragi 
nan_init(struct sigma_dut * dut)2338cd4e3c3eSJouni Malinen void nan_init(struct sigma_dut *dut)
2339cd4e3c3eSJouni Malinen {
23402dfb1daeSVinay Gannevaram 	if (wifi_hal_initialize(dut)) {
23412dfb1daeSVinay Gannevaram 		sigma_dut_print(dut, DUT_MSG_ERROR,
23422dfb1daeSVinay Gannevaram 				"%s - wifi hal init failed for - NAN",
23432dfb1daeSVinay Gannevaram 				__func__);
23442dfb1daeSVinay Gannevaram 		exit(0);
2345cd4e3c3eSJouni Malinen 	}
2346cd4e3c3eSJouni Malinen 	pthread_mutex_init(&gMutex, NULL);
2347cd4e3c3eSJouni Malinen 	pthread_cond_init(&gCondition, NULL);
23482dfb1daeSVinay Gannevaram 	if (dut->wifi_hal_iface_handle)
23492dfb1daeSVinay Gannevaram 		nan_register_handler(dut->wifi_hal_iface_handle,
23502dfb1daeSVinay Gannevaram 				     callbackHandler);
2351cd4e3c3eSJouni Malinen }
2352cd4e3c3eSJouni Malinen 
2353cd4e3c3eSJouni Malinen 
nan_cmd_sta_reset_default(struct sigma_dut * dut,struct sigma_conn * conn,struct sigma_cmd * cmd)2354cd4e3c3eSJouni Malinen void nan_cmd_sta_reset_default(struct sigma_dut *dut, struct sigma_conn *conn,
2355cd4e3c3eSJouni Malinen 			       struct sigma_cmd *cmd)
2356cd4e3c3eSJouni Malinen {
2357cd4e3c3eSJouni Malinen 	sigma_dut_print(dut, DUT_MSG_INFO, "NAN sta_reset_default");
2358cd4e3c3eSJouni Malinen 
23592052daa2SAnurag Das #ifdef ANDROID
23602052daa2SAnurag Das 	if (dut->nanservicediscoveryinprogress) {
23612052daa2SAnurag Das 		char *argv[5];
23622052daa2SAnurag Das 		pid_t pid;
23632052daa2SAnurag Das 
23642052daa2SAnurag Das 		argv[0] = "am";
23652052daa2SAnurag Das 		argv[1] = "broadcast";
23662052daa2SAnurag Das 		argv[2] = "-a";
23672052daa2SAnurag Das 		argv[3] = "org.codeaurora.nanservicediscovery.close";
23682052daa2SAnurag Das 		argv[4] = NULL;
23692052daa2SAnurag Das 
23702052daa2SAnurag Das 		pid = fork();
23712052daa2SAnurag Das 		if (pid == -1) {
23722052daa2SAnurag Das 			sigma_dut_print(dut, DUT_MSG_ERROR, "fork: %s",
23732052daa2SAnurag Das 					strerror(errno));
23742052daa2SAnurag Das 		} else if (pid == 0) {
23752052daa2SAnurag Das 			execv("/system/bin/am", argv);
23762052daa2SAnurag Das 			sigma_dut_print(dut, DUT_MSG_ERROR, "execv: %s",
23772052daa2SAnurag Das 					strerror(errno));
23782052daa2SAnurag Das 			exit(0);
23792052daa2SAnurag Das 		}
23802052daa2SAnurag Das 		dut->nanservicediscoveryinprogress = 0;
23812052daa2SAnurag Das 	}
23822052daa2SAnurag Das #endif /* ANDROID */
23832052daa2SAnurag Das 
2384cd4e3c3eSJouni Malinen 	if (nan_state == 0) {
2385cd4e3c3eSJouni Malinen 		nan_init(dut);
2386cd4e3c3eSJouni Malinen 		nan_state = 1;
2387cd4e3c3eSJouni Malinen 	}
2388cd4e3c3eSJouni Malinen 	is_fam = 0;
2389cd4e3c3eSJouni Malinen 	event_anyresponse = 0;
2390cd4e3c3eSJouni Malinen 	global_dut = dut;
23917d37f411SRakesh Sunki 	memset(&dut->nan_pmk[0], 0, NAN_PMK_INFO_LEN);
23927d37f411SRakesh Sunki 	dut->nan_pmk_len = 0;
2393d7344c02SRakesh Sunki 	dut->sta_channel = 0;
23948863ec7cSPeng Xu 	dut->ndpe = 0;
23958863ec7cSPeng Xu 	dut->trans_proto = NAN_TRANSPORT_PROTOCOL_DEFAULT;
23968863ec7cSPeng Xu 	dut->trans_port = NAN_TRANSPORT_PORT_DEFAULT;
2397cd4e3c3eSJouni Malinen 	memset(global_event_resp_buf, 0, sizeof(global_event_resp_buf));
2398d51e8980SRakesh Sunki 	memset(&global_nan_sync_stats, 0, sizeof(global_nan_sync_stats));
23994236368dSRakesh Sunki 	memset(global_publish_service_name, 0,
24004236368dSRakesh Sunki 	       sizeof(global_publish_service_name));
24014236368dSRakesh Sunki 	global_publish_service_name_len = 0;
24024236368dSRakesh Sunki 	global_publish_id = 0;
24030262cb5fSRakesh Sunki 	global_subscribe_id = 0;
24047a40a20aSRakesh Sunki 
24058a630b8eSRakesh Sunki 	sigma_nan_data_end(dut, cmd);
24062dfb1daeSVinay Gannevaram 	nan_data_interface_delete(0, dut->wifi_hal_iface_handle,
24072dfb1daeSVinay Gannevaram 				  (char *) "nan0");
2408cd4e3c3eSJouni Malinen 	sigma_nan_disable(dut, conn, cmd);
2409fa417337SRakesh Sunki 	global_header_handle = 0;
2410fa417337SRakesh Sunki 	global_match_handle = 0;
2411cd4e3c3eSJouni Malinen }
2412cd4e3c3eSJouni Malinen 
2413cd4e3c3eSJouni Malinen 
nan_cmd_sta_exec_action(struct sigma_dut * dut,struct sigma_conn * conn,struct sigma_cmd * cmd)2414cd4e3c3eSJouni Malinen int nan_cmd_sta_exec_action(struct sigma_dut *dut, struct sigma_conn *conn,
2415cd4e3c3eSJouni Malinen 			    struct sigma_cmd *cmd)
2416cd4e3c3eSJouni Malinen {
2417cd4e3c3eSJouni Malinen 	const char *program = get_param(cmd, "Prog");
2418cd4e3c3eSJouni Malinen 	const char *nan_op = get_param(cmd, "NANOp");
2419cd4e3c3eSJouni Malinen 	const char *method_type = get_param(cmd, "MethodType");
2420d7344c02SRakesh Sunki 	const char *band = get_param(cmd, "band");
24212052daa2SAnurag Das 	const char *disc_mac_addr = get_param(cmd, "DiscoveryMacAddress");
2422cd4e3c3eSJouni Malinen 	char resp_buf[100];
24237a40a20aSRakesh Sunki 	wifi_error ret;
2424cd4e3c3eSJouni Malinen 
2425cd4e3c3eSJouni Malinen 	if (program == NULL)
2426cd4e3c3eSJouni Malinen 		return -1;
2427cd4e3c3eSJouni Malinen 
2428cd4e3c3eSJouni Malinen 	if (strcasecmp(program, "NAN") != 0) {
2429cd4e3c3eSJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
2430cd4e3c3eSJouni Malinen 			  "ErrorCode,Unsupported program");
2431cd4e3c3eSJouni Malinen 		return 0;
2432cd4e3c3eSJouni Malinen 	}
2433cd4e3c3eSJouni Malinen 
2434cd4e3c3eSJouni Malinen 	if (nan_op) {
2435b5604ff8SRakesh Sunki #if NAN_CERT_VERSION >= 3
2436b5604ff8SRakesh Sunki 		int size = 0;
2437b5604ff8SRakesh Sunki 		u32 device_type_val = 0;
2438b5604ff8SRakesh Sunki 		NanDebugParams cfg_debug;
2439b5604ff8SRakesh Sunki 
2440b5604ff8SRakesh Sunki 		memset(&cfg_debug, 0, sizeof(NanDebugParams));
2441b5604ff8SRakesh Sunki 		cfg_debug.cmd = NAN_TEST_MODE_CMD_DEVICE_TYPE;
2442b5604ff8SRakesh Sunki 		if (dut->device_type == STA_testbed)
2443b5604ff8SRakesh Sunki 			device_type_val = NAN_DEVICE_TYPE_TEST_BED;
2444b5604ff8SRakesh Sunki 		else if (dut->device_type == STA_dut)
2445b5604ff8SRakesh Sunki 			device_type_val = NAN_DEVICE_TYPE_DUT;
2446b5604ff8SRakesh Sunki 
2447b5604ff8SRakesh Sunki 		memcpy(cfg_debug.debug_cmd_data, &device_type_val, sizeof(u32));
2448b5604ff8SRakesh Sunki 		size = sizeof(u32) + sizeof(u32);
2449*55854697SSunil Dutt 
2450*55854697SSunil Dutt 		if (if_nametoindex(NAN_AWARE_IFACE))
2451*55854697SSunil Dutt 		    run_system_wrapper(dut, "ifconfig %s up", NAN_AWARE_IFACE);
2452*55854697SSunil Dutt 
2453b5604ff8SRakesh Sunki 		sigma_dut_print(dut, DUT_MSG_INFO,
2454b5604ff8SRakesh Sunki 				"%s: Device Type: cmd type = %d and command data = %u",
2455b5604ff8SRakesh Sunki 				__func__, cfg_debug.cmd, device_type_val);
24562dfb1daeSVinay Gannevaram 		nan_debug_command_config(0, dut->wifi_hal_iface_handle,
2457b5604ff8SRakesh Sunki 					 cfg_debug, size);
2458b5604ff8SRakesh Sunki #endif
2459cd4e3c3eSJouni Malinen 		/*
2460cd4e3c3eSJouni Malinen 		 * NANOp has been specified.
2461cd4e3c3eSJouni Malinen 		 * We will build a nan_enable or nan_disable command.
2462cd4e3c3eSJouni Malinen 		*/
2463cd4e3c3eSJouni Malinen 		if (strcasecmp(nan_op, "On") == 0) {
2464cd4e3c3eSJouni Malinen 			if (sigma_nan_enable(dut, conn, cmd) == 0) {
24657a40a20aSRakesh Sunki 				ret = nan_data_interface_create(
24662dfb1daeSVinay Gannevaram 					0, dut->wifi_hal_iface_handle,
24677a40a20aSRakesh Sunki 					(char *) "nan0");
24687a40a20aSRakesh Sunki 				if (ret != WIFI_SUCCESS) {
24697a40a20aSRakesh Sunki 					sigma_dut_print(
24707a40a20aSRakesh Sunki 						global_dut, DUT_MSG_ERROR,
24717a40a20aSRakesh Sunki 						"Unable to create NAN data interface");
24727a40a20aSRakesh Sunki 				}
2473cd4e3c3eSJouni Malinen 				snprintf(resp_buf, sizeof(resp_buf), "mac,"
2474cd4e3c3eSJouni Malinen 					 MAC_ADDR_STR,
2475cd4e3c3eSJouni Malinen 					 MAC_ADDR_ARRAY(global_nan_mac_addr));
2476cd4e3c3eSJouni Malinen 				send_resp(dut, conn, SIGMA_COMPLETE, resp_buf);
2477cd4e3c3eSJouni Malinen 			} else {
2478cd4e3c3eSJouni Malinen 				send_resp(dut, conn, SIGMA_ERROR,
2479cd4e3c3eSJouni Malinen 					  "NAN_ENABLE_FAILED");
2480cd4e3c3eSJouni Malinen 				return -1;
2481cd4e3c3eSJouni Malinen 			}
2482d7344c02SRakesh Sunki 
2483d7344c02SRakesh Sunki 			if (band && strcasecmp(band, "24g") == 0) {
2484d7344c02SRakesh Sunki 				sigma_dut_print(dut, DUT_MSG_INFO,
2485d7344c02SRakesh Sunki 						"%s: Setting band to 2G Only",
2486d7344c02SRakesh Sunki 						__func__);
2487d7344c02SRakesh Sunki 				sigma_ndp_configure_band(
2488d7344c02SRakesh Sunki 					dut, conn, cmd,
2489d7344c02SRakesh Sunki 					NAN_DATA_PATH_SUPPORTED_BAND_2G);
2490d7344c02SRakesh Sunki 			} else if (band && dut->sta_channel > 12) {
2491d7344c02SRakesh Sunki 				sigma_ndp_configure_band(
2492d7344c02SRakesh Sunki 					dut, conn, cmd,
2493d7344c02SRakesh Sunki 					NAN_DATA_PATH_SUPPORT_DUAL_BAND);
2494d7344c02SRakesh Sunki 			}
2495cd4e3c3eSJouni Malinen 		} else if (strcasecmp(nan_op, "Off") == 0) {
2496bcf9ef3eSRakesh Sunki 			nan_data_interface_delete(0,
24972dfb1daeSVinay Gannevaram 				dut->wifi_hal_iface_handle, (char *) "nan0");
2498cd4e3c3eSJouni Malinen 			sigma_nan_disable(dut, conn, cmd);
24994236368dSRakesh Sunki 			memset(global_publish_service_name, 0,
25004236368dSRakesh Sunki 			       sizeof(global_publish_service_name));
25014236368dSRakesh Sunki 			global_publish_service_name_len = 0;
25024236368dSRakesh Sunki 			global_publish_id = 0;
25030262cb5fSRakesh Sunki 			global_subscribe_id = 0;
2504fa417337SRakesh Sunki 			global_header_handle = 0;
2505fa417337SRakesh Sunki 			global_match_handle = 0;
2506cd4e3c3eSJouni Malinen 			send_resp(dut, conn, SIGMA_COMPLETE, "NULL");
2507cd4e3c3eSJouni Malinen 		}
2508cd4e3c3eSJouni Malinen 	}
2509cd4e3c3eSJouni Malinen 	if (nan_state && nan_op == NULL) {
2510cd4e3c3eSJouni Malinen 		if (method_type) {
2511cd4e3c3eSJouni Malinen 			if (strcasecmp(method_type, "Publish") == 0) {
2512cd4e3c3eSJouni Malinen 				sigma_nan_publish_request(dut, conn, cmd);
2513cd4e3c3eSJouni Malinen 				send_resp(dut, conn, SIGMA_COMPLETE, "NULL");
2514cd4e3c3eSJouni Malinen 			}
2515cd4e3c3eSJouni Malinen 			if (strcasecmp(method_type, "Subscribe") == 0) {
2516cd4e3c3eSJouni Malinen 				sigma_nan_subscribe_request(dut, conn, cmd);
2517cd4e3c3eSJouni Malinen 				send_resp(dut, conn, SIGMA_COMPLETE, "NULL");
2518cd4e3c3eSJouni Malinen 			}
2519cd4e3c3eSJouni Malinen 			if (strcasecmp(method_type, "Followup") == 0) {
2520cd4e3c3eSJouni Malinen 				sigma_nan_transmit_followup(dut, conn, cmd);
2521cd4e3c3eSJouni Malinen 				send_resp(dut, conn, SIGMA_COMPLETE, "NULL");
2522cd4e3c3eSJouni Malinen 			}
252314cfcd25SRakesh Sunki 			if (strcasecmp(method_type, "DataRequest") == 0) {
252414cfcd25SRakesh Sunki 				sigma_nan_data_request(dut, conn, cmd);
252514cfcd25SRakesh Sunki 				send_resp(dut, conn, SIGMA_COMPLETE, "NULL");
252614cfcd25SRakesh Sunki 			}
2527a5cc284dSRakesh Sunki 			if (strcasecmp(method_type, "DataResponse") == 0) {
2528a5cc284dSRakesh Sunki 				sigma_dut_print(dut, DUT_MSG_INFO,
2529a5cc284dSRakesh Sunki 						"%s: method_type is DataResponse",
2530a5cc284dSRakesh Sunki 						__func__);
2531a5cc284dSRakesh Sunki 				sigma_nan_data_response(dut, conn, cmd);
2532a5cc284dSRakesh Sunki 				send_resp(dut, conn, SIGMA_COMPLETE, "NULL");
2533a5cc284dSRakesh Sunki 			}
25348a630b8eSRakesh Sunki 			if (strcasecmp(method_type, "DataEnd") == 0) {
25358a630b8eSRakesh Sunki 				sigma_nan_data_end(dut, cmd);
25368a630b8eSRakesh Sunki 				send_resp(dut, conn, SIGMA_COMPLETE, "NULL");
25378a630b8eSRakesh Sunki 			}
2538d5e9b4d1SRakesh Sunki 			if (strcasecmp(method_type, "rangerequest") == 0) {
2539d5e9b4d1SRakesh Sunki 				sigma_dut_print(dut, DUT_MSG_INFO,
2540d5e9b4d1SRakesh Sunki 						"%s: method_type is rangerequest",
2541d5e9b4d1SRakesh Sunki 						__func__);
2542d5e9b4d1SRakesh Sunki 				sigma_nan_range_request(dut, cmd);
2543d5e9b4d1SRakesh Sunki 				send_resp(dut, conn, SIGMA_COMPLETE, "NULL");
2544d5e9b4d1SRakesh Sunki 			}
2545d5e9b4d1SRakesh Sunki 			if (strcasecmp(method_type, "cancelrange") == 0) {
2546d5e9b4d1SRakesh Sunki 				sigma_dut_print(dut, DUT_MSG_INFO,
2547d5e9b4d1SRakesh Sunki 						"%s: method_type is cancelrange",
2548d5e9b4d1SRakesh Sunki 						__func__);
2549d5e9b4d1SRakesh Sunki 				sigma_nan_cancel_range(dut, cmd);
2550d5e9b4d1SRakesh Sunki 				send_resp(dut, conn, SIGMA_COMPLETE, "NULL");
2551d5e9b4d1SRakesh Sunki 			}
2552b2b6516cSRakesh Sunki 			if (strcasecmp(method_type, "SchedUpdate") == 0) {
2553b2b6516cSRakesh Sunki 				sigma_dut_print(dut, DUT_MSG_INFO,
2554b2b6516cSRakesh Sunki 						"%s: method_type is SchedUpdate",
2555b2b6516cSRakesh Sunki 						__func__);
2556b2b6516cSRakesh Sunki 				sigma_nan_schedule_update(dut, cmd);
2557b2b6516cSRakesh Sunki 				send_resp(dut, conn, SIGMA_COMPLETE, "NULL");
2558b2b6516cSRakesh Sunki 			}
25592052daa2SAnurag Das 		} else if (disc_mac_addr &&
25602052daa2SAnurag Das 			   strcasecmp(disc_mac_addr, "GET") == 0) {
25612052daa2SAnurag Das 			snprintf(resp_buf, sizeof(resp_buf), "mac,"
25622052daa2SAnurag Das 				 MAC_ADDR_STR,
25632052daa2SAnurag Das 				 MAC_ADDR_ARRAY(global_nan_mac_addr));
25642052daa2SAnurag Das 			send_resp(dut, conn, SIGMA_COMPLETE, resp_buf);
2565cd4e3c3eSJouni Malinen 		} else {
2566cd4e3c3eSJouni Malinen 			sigma_nan_config_enable(dut, conn, cmd);
2567cd4e3c3eSJouni Malinen 			snprintf(resp_buf, sizeof(resp_buf), "mac,"
2568cd4e3c3eSJouni Malinen 				 MAC_ADDR_STR,
2569cd4e3c3eSJouni Malinen 				 MAC_ADDR_ARRAY(global_nan_mac_addr));
2570cd4e3c3eSJouni Malinen 			send_resp(dut, conn, SIGMA_COMPLETE, resp_buf);
2571cd4e3c3eSJouni Malinen 		}
2572cd4e3c3eSJouni Malinen 	}
2573cd4e3c3eSJouni Malinen 
2574cd4e3c3eSJouni Malinen 	return 0;
2575cd4e3c3eSJouni Malinen }
2576cd4e3c3eSJouni Malinen 
2577cd4e3c3eSJouni Malinen 
nan_cmd_sta_get_parameter(struct sigma_dut * dut,struct sigma_conn * conn,struct sigma_cmd * cmd)2578cd4e3c3eSJouni Malinen int nan_cmd_sta_get_parameter(struct sigma_dut *dut, struct sigma_conn *conn,
2579cd4e3c3eSJouni Malinen 			      struct sigma_cmd *cmd)
2580cd4e3c3eSJouni Malinen {
2581cd4e3c3eSJouni Malinen 
2582cd4e3c3eSJouni Malinen 	const char *program = get_param(cmd, "Program");
2583cd4e3c3eSJouni Malinen 	const char *parameter = get_param(cmd, "Parameter");
2584cd4e3c3eSJouni Malinen 	char resp_buf[100];
2585d51e8980SRakesh Sunki 	NanStatsRequest req;
2586d51e8980SRakesh Sunki 	struct timespec abstime;
2587d51e8980SRakesh Sunki 	u64 master_rank;
2588d51e8980SRakesh Sunki 	u8 master_pref;
2589d51e8980SRakesh Sunki 	u8 random_factor;
2590d51e8980SRakesh Sunki 	u8 hop_count;
2591d51e8980SRakesh Sunki 	u32 beacon_transmit_time;
2592d51e8980SRakesh Sunki 	u32 ndp_channel_freq;
2593d51e8980SRakesh Sunki 	u32 ndp_channel_freq2;
2594a3b5966cSRakesh Sunki #if NAN_CERT_VERSION >= 3
2595a3b5966cSRakesh Sunki 	u32 sched_update_channel_freq;
2596a3b5966cSRakesh Sunki #endif
2597cd4e3c3eSJouni Malinen 
2598cd4e3c3eSJouni Malinen 	if (program == NULL) {
2599cd4e3c3eSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_ERROR, "Invalid Program Name");
2600cd4e3c3eSJouni Malinen 		return -1;
2601cd4e3c3eSJouni Malinen 	}
2602cd4e3c3eSJouni Malinen 	if (strcasecmp(program, "NAN") != 0) {
2603cd4e3c3eSJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
2604cd4e3c3eSJouni Malinen 			  "ErrorCode,Unsupported program");
2605cd4e3c3eSJouni Malinen 		return 0;
2606cd4e3c3eSJouni Malinen 	}
2607cd4e3c3eSJouni Malinen 
2608cd4e3c3eSJouni Malinen 	if (parameter == NULL) {
2609cd4e3c3eSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_ERROR, "Invalid Parameter");
2610cd4e3c3eSJouni Malinen 		return -1;
2611cd4e3c3eSJouni Malinen 	}
2612cd4e3c3eSJouni Malinen 
2613d51e8980SRakesh Sunki 	memset(&req, 0, sizeof(NanStatsRequest));
2614a3b5966cSRakesh Sunki 	memset(resp_buf, 0, sizeof(resp_buf));
2615d51e8980SRakesh Sunki 	req.stats_type = (NanStatsType) NAN_STATS_ID_DE_TIMING_SYNC;
26162dfb1daeSVinay Gannevaram 	nan_stats_request(0, dut->wifi_hal_iface_handle, &req);
2617d51e8980SRakesh Sunki 	/*
2618d51e8980SRakesh Sunki 	 * To ensure sta_get_events to get the events
2619d51e8980SRakesh Sunki 	 * only after joining the NAN cluster
2620d51e8980SRakesh Sunki 	 */
2621d51e8980SRakesh Sunki 	abstime.tv_sec = 4;
2622d51e8980SRakesh Sunki 	abstime.tv_nsec = 0;
2623d51e8980SRakesh Sunki 	wait(abstime);
2624d51e8980SRakesh Sunki 
2625d51e8980SRakesh Sunki 	master_rank = global_nan_sync_stats.myRank;
2626d51e8980SRakesh Sunki 	master_pref = (global_nan_sync_stats.myRank & 0xFF00000000000000) >> 56;
2627d51e8980SRakesh Sunki 	random_factor = (global_nan_sync_stats.myRank & 0x00FF000000000000) >>
2628d51e8980SRakesh Sunki 		48;
2629d51e8980SRakesh Sunki 	hop_count = global_nan_sync_stats.currAmHopCount;
2630d51e8980SRakesh Sunki 	beacon_transmit_time = global_nan_sync_stats.currAmBTT;
2631d51e8980SRakesh Sunki 	ndp_channel_freq = global_nan_sync_stats.ndpChannelFreq;
2632d51e8980SRakesh Sunki 	ndp_channel_freq2 = global_nan_sync_stats.ndpChannelFreq2;
2633a3b5966cSRakesh Sunki #if NAN_CERT_VERSION >= 3
2634a3b5966cSRakesh Sunki 	sched_update_channel_freq =
2635a3b5966cSRakesh Sunki 		global_nan_sync_stats.schedUpdateChannelFreq;
2636d51e8980SRakesh Sunki 
2637cd4e3c3eSJouni Malinen 	sigma_dut_print(dut, DUT_MSG_INFO,
2638a3b5966cSRakesh Sunki 			"%s: NanStatsRequest Master_pref:%02x, Random_factor:%02x, hop_count:%02x beacon_transmit_time:%d ndp_channel_freq:%d ndp_channel_freq2:%d sched_update_channel_freq:%d",
2639a3b5966cSRakesh Sunki 			__func__, master_pref, random_factor,
2640a3b5966cSRakesh Sunki 			hop_count, beacon_transmit_time,
2641a3b5966cSRakesh Sunki 			ndp_channel_freq, ndp_channel_freq2,
2642a3b5966cSRakesh Sunki 			sched_update_channel_freq);
2643a3b5966cSRakesh Sunki #else /* #if NAN_CERT_VERSION >= 3 */
2644a3b5966cSRakesh Sunki 	sigma_dut_print(dut, DUT_MSG_INFO,
2645d51e8980SRakesh Sunki 			"%s: NanStatsRequest Master_pref:%02x, Random_factor:%02x, hop_count:%02x beacon_transmit_time:%d ndp_channel_freq:%d ndp_channel_freq2:%d",
2646d51e8980SRakesh Sunki 			__func__, master_pref, random_factor,
2647d51e8980SRakesh Sunki 			hop_count, beacon_transmit_time,
2648d51e8980SRakesh Sunki 			ndp_channel_freq, ndp_channel_freq2);
2649a3b5966cSRakesh Sunki #endif /* #if NAN_CERT_VERSION >= 3 */
2650cd4e3c3eSJouni Malinen 
2651cd4e3c3eSJouni Malinen 	if (strcasecmp(parameter, "MasterPref") == 0) {
2652cd4e3c3eSJouni Malinen 		snprintf(resp_buf, sizeof(resp_buf), "MasterPref,0x%x",
2653d51e8980SRakesh Sunki 			 master_pref);
2654cd4e3c3eSJouni Malinen 	} else if (strcasecmp(parameter, "MasterRank") == 0) {
2655cd4e3c3eSJouni Malinen 		snprintf(resp_buf, sizeof(resp_buf), "MasterRank,0x%lx",
2656d51e8980SRakesh Sunki 			 master_rank);
2657cd4e3c3eSJouni Malinen 	} else if (strcasecmp(parameter, "RandFactor") == 0) {
2658cd4e3c3eSJouni Malinen 		snprintf(resp_buf, sizeof(resp_buf), "RandFactor,0x%x",
2659d51e8980SRakesh Sunki 			 random_factor);
2660cd4e3c3eSJouni Malinen 	} else if (strcasecmp(parameter, "HopCount") == 0) {
2661cd4e3c3eSJouni Malinen 		snprintf(resp_buf, sizeof(resp_buf), "HopCount,0x%x",
2662d51e8980SRakesh Sunki 			 hop_count);
2663cd4e3c3eSJouni Malinen 	} else if (strcasecmp(parameter, "BeaconTransTime") == 0) {
2664cd4e3c3eSJouni Malinen 		snprintf(resp_buf, sizeof(resp_buf), "BeaconTransTime 0x%x",
2665d51e8980SRakesh Sunki 			 beacon_transmit_time);
2666cd4e3c3eSJouni Malinen 	} else if (strcasecmp(parameter, "NANStatus") == 0) {
2667cd4e3c3eSJouni Malinen 		if (nan_state == 1)
2668cd4e3c3eSJouni Malinen 			snprintf(resp_buf, sizeof(resp_buf), "On");
2669cd4e3c3eSJouni Malinen 		else
2670cd4e3c3eSJouni Malinen 			snprintf(resp_buf, sizeof(resp_buf), "Off");
2671d51e8980SRakesh Sunki 	} else if (strcasecmp(parameter, "NDPChannel") == 0) {
2672d51e8980SRakesh Sunki 		if (ndp_channel_freq != 0 && ndp_channel_freq2 != 0) {
2673d51e8980SRakesh Sunki 			snprintf(resp_buf, sizeof(resp_buf),
2674d51e8980SRakesh Sunki 				 "ndpchannel,%d,ndpchannel,%d",
2675d51e8980SRakesh Sunki 				 freq_to_channel(ndp_channel_freq),
2676d51e8980SRakesh Sunki 				 freq_to_channel(ndp_channel_freq2));
2677d51e8980SRakesh Sunki 		} else if (ndp_channel_freq != 0) {
2678d51e8980SRakesh Sunki 			snprintf(resp_buf, sizeof(resp_buf), "ndpchannel,%d",
2679d51e8980SRakesh Sunki 				 freq_to_channel(ndp_channel_freq));
2680d51e8980SRakesh Sunki 		} else if (ndp_channel_freq2 != 0) {
2681d51e8980SRakesh Sunki 			snprintf(resp_buf, sizeof(resp_buf), "ndpchannel,%d",
2682d51e8980SRakesh Sunki 				 freq_to_channel(ndp_channel_freq2));
2683d51e8980SRakesh Sunki 		} else {
2684d51e8980SRakesh Sunki 			sigma_dut_print(dut, DUT_MSG_ERROR,
2685d51e8980SRakesh Sunki 				"%s: No Negotiated NDP Channels", __func__);
2686d51e8980SRakesh Sunki 		}
2687a3b5966cSRakesh Sunki #if NAN_CERT_VERSION >= 3
2688a3b5966cSRakesh Sunki 	} else if (strcasecmp(parameter, "SchedUpdateChannel") == 0) {
2689a3b5966cSRakesh Sunki 		snprintf(resp_buf, sizeof(resp_buf), "schedupdatechannel,%d",
2690a3b5966cSRakesh Sunki 			 freq_to_channel(sched_update_channel_freq));
2691a3b5966cSRakesh Sunki #endif
2692cd4e3c3eSJouni Malinen 	} else {
2693cd4e3c3eSJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR, "Invalid Parameter");
2694cd4e3c3eSJouni Malinen 		return 0;
2695cd4e3c3eSJouni Malinen 	}
2696cd4e3c3eSJouni Malinen 
2697cd4e3c3eSJouni Malinen 	send_resp(dut, conn, SIGMA_COMPLETE, resp_buf);
2698cd4e3c3eSJouni Malinen 	return 0;
2699cd4e3c3eSJouni Malinen }
2700cd4e3c3eSJouni Malinen 
2701cd4e3c3eSJouni Malinen 
nan_cmd_sta_get_events(struct sigma_dut * dut,struct sigma_conn * conn,struct sigma_cmd * cmd)2702cd4e3c3eSJouni Malinen int nan_cmd_sta_get_events(struct sigma_dut *dut, struct sigma_conn *conn,
2703cd4e3c3eSJouni Malinen 			   struct sigma_cmd *cmd)
2704cd4e3c3eSJouni Malinen {
2705cd4e3c3eSJouni Malinen 	const char *action = get_param(cmd, "Action");
2706cd4e3c3eSJouni Malinen 
2707132c6d2bSKantesh Mundaragi 	if (!action)
2708132c6d2bSKantesh Mundaragi 		return 0;
2709132c6d2bSKantesh Mundaragi 
2710cd4e3c3eSJouni Malinen 	/* Check action for start, stop and get events. */
2711cd4e3c3eSJouni Malinen 	if (strcasecmp(action, "Start") == 0) {
2712cd4e3c3eSJouni Malinen 		memset(global_event_resp_buf, 0, sizeof(global_event_resp_buf));
2713cd4e3c3eSJouni Malinen 		send_resp(dut, conn, SIGMA_COMPLETE, NULL);
2714cd4e3c3eSJouni Malinen 	} else if (strcasecmp(action, "Stop") == 0) {
2715cd4e3c3eSJouni Malinen 		event_anyresponse = 0;
2716cd4e3c3eSJouni Malinen 		memset(global_event_resp_buf, 0, sizeof(global_event_resp_buf));
2717cd4e3c3eSJouni Malinen 		send_resp(dut, conn, SIGMA_COMPLETE, NULL);
2718cd4e3c3eSJouni Malinen 	} else if (strcasecmp(action, "Get") == 0) {
2719cd4e3c3eSJouni Malinen 		if (event_anyresponse == 1) {
2720cd4e3c3eSJouni Malinen 			send_resp(dut, conn, SIGMA_COMPLETE,
2721cd4e3c3eSJouni Malinen 				  global_event_resp_buf);
2722cd4e3c3eSJouni Malinen 		} else {
2723cd4e3c3eSJouni Malinen 			send_resp(dut, conn, SIGMA_COMPLETE, "EventList,NONE");
2724cd4e3c3eSJouni Malinen 		}
2725cd4e3c3eSJouni Malinen 	}
2726cd4e3c3eSJouni Malinen 	return 0;
2727cd4e3c3eSJouni Malinen }
27284b75f96cSRakesh Sunki 
27294b75f96cSRakesh Sunki #else /* #if NAN_CERT_VERSION */
27304b75f96cSRakesh Sunki 
nan_cmd_sta_preset_testparameters(struct sigma_dut * dut,struct sigma_conn * conn,struct sigma_cmd * cmd)27314b75f96cSRakesh Sunki int nan_cmd_sta_preset_testparameters(struct sigma_dut *dut,
27324b75f96cSRakesh Sunki 				      struct sigma_conn *conn,
27334b75f96cSRakesh Sunki 				      struct sigma_cmd *cmd)
27344b75f96cSRakesh Sunki {
27354b75f96cSRakesh Sunki 	return 1;
27364b75f96cSRakesh Sunki }
27374b75f96cSRakesh Sunki 
27384b75f96cSRakesh Sunki 
nan_cmd_sta_get_parameter(struct sigma_dut * dut,struct sigma_conn * conn,struct sigma_cmd * cmd)27394b75f96cSRakesh Sunki int nan_cmd_sta_get_parameter(struct sigma_dut *dut, struct sigma_conn *conn,
27404b75f96cSRakesh Sunki 			      struct sigma_cmd *cmd)
27414b75f96cSRakesh Sunki {
27424b75f96cSRakesh Sunki 	return 0;
27434b75f96cSRakesh Sunki 
27444b75f96cSRakesh Sunki }
27454b75f96cSRakesh Sunki 
27464b75f96cSRakesh Sunki 
nan_cmd_sta_reset_default(struct sigma_dut * dut,struct sigma_conn * conn,struct sigma_cmd * cmd)27474b75f96cSRakesh Sunki void nan_cmd_sta_reset_default(struct sigma_dut *dut, struct sigma_conn *conn,
27484b75f96cSRakesh Sunki 			       struct sigma_cmd *cmd)
27494b75f96cSRakesh Sunki {
27504b75f96cSRakesh Sunki 	return;
27514b75f96cSRakesh Sunki }
27524b75f96cSRakesh Sunki 
27534b75f96cSRakesh Sunki 
nan_cmd_sta_get_events(struct sigma_dut * dut,struct sigma_conn * conn,struct sigma_cmd * cmd)27544b75f96cSRakesh Sunki int nan_cmd_sta_get_events(struct sigma_dut *dut, struct sigma_conn *conn,
27554b75f96cSRakesh Sunki 			   struct sigma_cmd *cmd)
27564b75f96cSRakesh Sunki {
27574b75f96cSRakesh Sunki 	return 0;
27584b75f96cSRakesh Sunki }
27594b75f96cSRakesh Sunki 
27604b75f96cSRakesh Sunki 
nan_cmd_sta_exec_action(struct sigma_dut * dut,struct sigma_conn * conn,struct sigma_cmd * cmd)27614b75f96cSRakesh Sunki int nan_cmd_sta_exec_action(struct sigma_dut *dut, struct sigma_conn *conn,
27624b75f96cSRakesh Sunki 			    struct sigma_cmd *cmd)
27634b75f96cSRakesh Sunki {
27644b75f96cSRakesh Sunki 	return 0;
27654b75f96cSRakesh Sunki }
27664b75f96cSRakesh Sunki 
27674b75f96cSRakesh Sunki #endif /* #if NAN_CERT_VERSION */
2768