NAN: sta_exec_action MethodType,rangerequest/cancelrange
Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
diff --git a/nan.c b/nan.c
index 0fd3480..746957e 100644
--- a/nan.c
+++ b/nan.c
@@ -29,6 +29,7 @@
uint16_t global_header_handle = 0;
uint32_t global_match_handle = 0;
+#define DEFAULT_SVC "QNanCluster"
#define MAC_ADDR_ARRAY(a) (a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5]
#define MAC_ADDR_STR "%02x:%02x:%02x:%02x:%02x:%02x"
#ifndef ETH_ALEN
@@ -857,6 +858,75 @@
}
+static int sigma_nan_range_request(struct sigma_dut *dut,
+ struct sigma_cmd *cmd)
+{
+ const char *dest_mac = get_param(cmd, "destmac");
+ NanSubscribeRequest req;
+
+ memset(&req, 0, sizeof(NanSubscribeRequest));
+ req.period = 1;
+ req.subscribe_type = NAN_SUBSCRIBE_TYPE_ACTIVE;
+ req.serviceResponseFilter = NAN_SRF_ATTR_BLOOM_FILTER;
+ req.serviceResponseInclude = NAN_SRF_INCLUDE_RESPOND;
+ req.ssiRequiredForMatchIndication = NAN_SSI_NOT_REQUIRED_IN_MATCH_IND;
+ req.subscribe_match_indicator = NAN_MATCH_ALG_MATCH_CONTINUOUS;
+ req.subscribe_count = 0;
+ strlcpy((char *) req.service_name, DEFAULT_SVC,
+ NAN_MAX_SERVICE_NAME_LEN);
+ req.service_name_len = strlen((char *) req.service_name);
+
+ req.subscribe_id = global_subscribe_id;
+ req.sdea_params.ranging_state = 1;
+ req.sdea_params.range_report = NAN_ENABLE_RANGE_REPORT;
+ req.range_response_cfg.requestor_instance_id = global_match_handle;
+ req.range_response_cfg.ranging_response = NAN_RANGE_REQUEST_ACCEPT;
+ req.ranging_cfg.config_ranging_indications =
+ NAN_RANGING_INDICATE_CONTINUOUS_MASK;
+ if (dest_mac) {
+ nan_parse_mac_address(dut, dest_mac,
+ req.range_response_cfg.peer_addr);
+ sigma_dut_print(
+ dut, DUT_MSG_INFO, "peer mac addr: " MAC_ADDR_STR,
+ MAC_ADDR_ARRAY(req.range_response_cfg.peer_addr));
+ }
+ nan_subscribe_request(0, global_interface_handle, &req);
+
+ return 0;
+}
+
+
+static int sigma_nan_cancel_range(struct sigma_dut *dut,
+ struct sigma_cmd *cmd)
+{
+ const char *dest_mac = get_param(cmd, "destmac");
+ NanPublishRequest req;
+
+ memset(&req, 0, sizeof(NanPublishRequest));
+ req.ttl = 0;
+ req.period = 1;
+ req.publish_match_indicator = 1;
+ req.publish_type = NAN_PUBLISH_TYPE_UNSOLICITED;
+ req.tx_type = NAN_TX_TYPE_BROADCAST;
+ req.publish_count = 0;
+ strlcpy((char *) req.service_name, DEFAULT_SVC,
+ NAN_MAX_SERVICE_NAME_LEN);
+ req.service_name_len = strlen((char *) req.service_name);
+ req.publish_id = global_publish_id;
+ req.range_response_cfg.ranging_response = NAN_RANGE_REQUEST_CANCEL;
+ if (dest_mac) {
+ nan_parse_mac_address(dut, dest_mac,
+ req.range_response_cfg.peer_addr);
+ sigma_dut_print(
+ dut, DUT_MSG_INFO, "peer mac addr: " MAC_ADDR_STR,
+ MAC_ADDR_ARRAY(req.range_response_cfg.peer_addr));
+ }
+ nan_publish_request(0, global_interface_handle, &req);
+
+ return 0;
+}
+
+
int config_post_disc_attr(void)
{
wifi_error ret;
@@ -1601,6 +1671,20 @@
sigma_nan_data_end(dut, cmd);
send_resp(dut, conn, SIGMA_COMPLETE, "NULL");
}
+ if (strcasecmp(method_type, "rangerequest") == 0) {
+ sigma_dut_print(dut, DUT_MSG_INFO,
+ "%s: method_type is rangerequest",
+ __func__);
+ sigma_nan_range_request(dut, cmd);
+ send_resp(dut, conn, SIGMA_COMPLETE, "NULL");
+ }
+ if (strcasecmp(method_type, "cancelrange") == 0) {
+ sigma_dut_print(dut, DUT_MSG_INFO,
+ "%s: method_type is cancelrange",
+ __func__);
+ sigma_nan_cancel_range(dut, cmd);
+ send_resp(dut, conn, SIGMA_COMPLETE, "NULL");
+ }
} else {
sigma_nan_config_enable(dut, conn, cmd);
snprintf(resp_buf, sizeof(resp_buf), "mac,"