1d66913acSpriyadharshini gowthaman /* 2d66913acSpriyadharshini gowthaman * Sigma Control API DUT (FTM LOC functionality) 3d66913acSpriyadharshini gowthaman * Copyright (c) 2016, Qualcomm Atheros, Inc. 4d66913acSpriyadharshini gowthaman * All Rights Reserved. 5d66913acSpriyadharshini gowthaman * Licensed under the Clear BSD license. See README for more details. 6d66913acSpriyadharshini gowthaman */ 7d66913acSpriyadharshini gowthaman 8d66913acSpriyadharshini gowthaman #include "sigma_dut.h" 9d66913acSpriyadharshini gowthaman #include <sys/stat.h> 10d66913acSpriyadharshini gowthaman #include <regex.h> 110dd682a8Spriyadharshini gowthaman #include "wpa_helpers.h" 12d66913acSpriyadharshini gowthaman 13d66913acSpriyadharshini gowthaman static const char LOC_XML_FILE_PATH[] = "./data/sigma-dut-target.xml"; 14d66913acSpriyadharshini gowthaman 15d66913acSpriyadharshini gowthaman static const char LOC_LOWI_TEST_DISCOVERY[] = "lowi_test -a -b 2 -n 1"; 16d66913acSpriyadharshini gowthaman static const char LOC_LOWI_TEST_RANGING[] = 17d66913acSpriyadharshini gowthaman "lowi_test -r ./data/sigma-dut-target.xml -n 1"; 18d66913acSpriyadharshini gowthaman static const char LOC_LOWI_TEST_NEIGHBOR_RPT_REQ[] = "lowi_test -nrr"; 19d66913acSpriyadharshini gowthaman static const char LOC_LOWI_TEST_ANQP_REQ[] = "lowi_test -anqp -mac "; 200dd682a8Spriyadharshini gowthaman static const char WPA_INTERWORKING_ENABLE[] = 210dd682a8Spriyadharshini gowthaman "SET interworking 1"; 220dd682a8Spriyadharshini gowthaman static const char WPA_INTERWORKING_DISABLE[] = 230dd682a8Spriyadharshini gowthaman "SET interworking 0"; 240dd682a8Spriyadharshini gowthaman static const char WPA_RM_ENABLE[] = 250dd682a8Spriyadharshini gowthaman "VENDOR 1374 74 08000400BD000000"; 260dd682a8Spriyadharshini gowthaman static const char WPA_RM_DISABLE[] = 270dd682a8Spriyadharshini gowthaman "VENDOR 1374 74 0800040000000000"; 280dd682a8Spriyadharshini gowthaman static const char WPA_ADDRESS_3_ENABLE[] = 290dd682a8Spriyadharshini gowthaman "SET gas_address3 1"; 300dd682a8Spriyadharshini gowthaman static const char WPA_ADDRESS_3_DISABLE[] = 310dd682a8Spriyadharshini gowthaman "SET gas_address3 0"; 32d66913acSpriyadharshini gowthaman 33d66913acSpriyadharshini gowthaman #ifndef ETH_ALEN 34d66913acSpriyadharshini gowthaman #define ETH_ALEN 6 35d66913acSpriyadharshini gowthaman #endif 36d66913acSpriyadharshini gowthaman 37d66913acSpriyadharshini gowthaman #define LOC_MAX_RM_FLAGS 10 38d66913acSpriyadharshini gowthaman #define LOC_RM_FLAG_VAL_ARRAY 2 39d66913acSpriyadharshini gowthaman 40d66913acSpriyadharshini gowthaman enum lowi_tst_cmd { 41d66913acSpriyadharshini gowthaman LOWI_TST_RANGING = 0, 42d66913acSpriyadharshini gowthaman LOWI_TST_NEIGHBOR_REPORT_REQ = 1, 43d66913acSpriyadharshini gowthaman LOWI_TST_ANQP_REQ = 2, 44d66913acSpriyadharshini gowthaman }; 45d66913acSpriyadharshini gowthaman 46d66913acSpriyadharshini gowthaman struct capi_loc_cmd { 47d66913acSpriyadharshini gowthaman unsigned int chan; 48d66913acSpriyadharshini gowthaman unsigned int burstExp; 49d66913acSpriyadharshini gowthaman unsigned int burstDur; 50d66913acSpriyadharshini gowthaman unsigned int minDeltaFtm; 51d66913acSpriyadharshini gowthaman unsigned int ptsf; 52d66913acSpriyadharshini gowthaman unsigned int asap; 53d66913acSpriyadharshini gowthaman unsigned int ftmsPerBurst; 54d66913acSpriyadharshini gowthaman unsigned int fmtbw; 55d66913acSpriyadharshini gowthaman unsigned int burstPeriod; 56d66913acSpriyadharshini gowthaman unsigned int locCivic; 57d66913acSpriyadharshini gowthaman unsigned int lci; 58d66913acSpriyadharshini gowthaman }; 59d66913acSpriyadharshini gowthaman 60d66913acSpriyadharshini gowthaman 61d66913acSpriyadharshini gowthaman static int loc_write_xml_file(struct sigma_dut *dut, const char *dst_mac_str, 62d66913acSpriyadharshini gowthaman struct capi_loc_cmd *loc_cmd) 63d66913acSpriyadharshini gowthaman { 64d66913acSpriyadharshini gowthaman FILE *xml; 65d66913acSpriyadharshini gowthaman unsigned int band, bw, preamble, primary_ch, center_freq; 66d66913acSpriyadharshini gowthaman 67d66913acSpriyadharshini gowthaman xml = fopen(LOC_XML_FILE_PATH, "w"); 68d66913acSpriyadharshini gowthaman if (!xml) { 69d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_ERROR, 70d66913acSpriyadharshini gowthaman "%s - Unable to create the XML file", __func__); 71d66913acSpriyadharshini gowthaman return -1; 72d66913acSpriyadharshini gowthaman } 73d66913acSpriyadharshini gowthaman 74d66913acSpriyadharshini gowthaman /* Using this following defaults: 75d66913acSpriyadharshini gowthaman * default value of band 1 76d66913acSpriyadharshini gowthaman * channel 36 77d66913acSpriyadharshini gowthaman * center frequency of 5210 78d66913acSpriyadharshini gowthaman */ 79d66913acSpriyadharshini gowthaman band = 1; 80d66913acSpriyadharshini gowthaman primary_ch = 36; 81d66913acSpriyadharshini gowthaman center_freq = 5210; 82d66913acSpriyadharshini gowthaman 83d66913acSpriyadharshini gowthaman #define FMT_BW_NO_PREF 0 84d66913acSpriyadharshini gowthaman #define FMT_BW_HT_20 9 85d66913acSpriyadharshini gowthaman #define FMT_BW_VHT_20 10 86d66913acSpriyadharshini gowthaman #define FMT_BW_HT_40 11 87d66913acSpriyadharshini gowthaman #define FMT_BW_VHT_40 12 88d66913acSpriyadharshini gowthaman #define FMT_BW_VHT_80 13 89d66913acSpriyadharshini gowthaman 90d66913acSpriyadharshini gowthaman #define LOC_BW_20 0 91d66913acSpriyadharshini gowthaman #define LOC_BW_40 1 92d66913acSpriyadharshini gowthaman #define LOC_BW_80 2 93d66913acSpriyadharshini gowthaman #define LOC_PREAMBLE_HT 1 94d66913acSpriyadharshini gowthaman #define LOC_PREAMBLE_VHT 2 95d66913acSpriyadharshini gowthaman switch (loc_cmd->fmtbw) { 96d66913acSpriyadharshini gowthaman case FMT_BW_NO_PREF: 97d66913acSpriyadharshini gowthaman case FMT_BW_HT_20: 98d66913acSpriyadharshini gowthaman bw = LOC_BW_20; 99d66913acSpriyadharshini gowthaman preamble = LOC_PREAMBLE_HT; 100d66913acSpriyadharshini gowthaman primary_ch = 36; 101d66913acSpriyadharshini gowthaman center_freq = 5180; 102d66913acSpriyadharshini gowthaman break; 103d66913acSpriyadharshini gowthaman case FMT_BW_VHT_20: 104d66913acSpriyadharshini gowthaman bw = LOC_BW_20; 105d66913acSpriyadharshini gowthaman preamble = LOC_PREAMBLE_VHT; 106d66913acSpriyadharshini gowthaman primary_ch = 36; 107d66913acSpriyadharshini gowthaman center_freq = 5180; 108d66913acSpriyadharshini gowthaman break; 109d66913acSpriyadharshini gowthaman case FMT_BW_HT_40: 110d66913acSpriyadharshini gowthaman bw = LOC_BW_40; 111d66913acSpriyadharshini gowthaman preamble = LOC_PREAMBLE_HT; 112d66913acSpriyadharshini gowthaman primary_ch = 36; 113d66913acSpriyadharshini gowthaman center_freq = 5190; 114d66913acSpriyadharshini gowthaman break; 115d66913acSpriyadharshini gowthaman case FMT_BW_VHT_40: 116d66913acSpriyadharshini gowthaman bw = LOC_BW_40; 117d66913acSpriyadharshini gowthaman preamble = LOC_PREAMBLE_VHT; 118d66913acSpriyadharshini gowthaman primary_ch = 36; 119d66913acSpriyadharshini gowthaman center_freq = 5190; 120d66913acSpriyadharshini gowthaman break; 121d66913acSpriyadharshini gowthaman case FMT_BW_VHT_80: 122d66913acSpriyadharshini gowthaman bw = LOC_BW_80; 123d66913acSpriyadharshini gowthaman preamble = LOC_PREAMBLE_VHT; 124d66913acSpriyadharshini gowthaman primary_ch = 36; 125d66913acSpriyadharshini gowthaman center_freq = 5210; 126d66913acSpriyadharshini gowthaman break; 127d66913acSpriyadharshini gowthaman default: 128d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_ERROR, 129d66913acSpriyadharshini gowthaman "%s - Bad Format/BW received", __func__); 130*5fc02a04SSrikanth Marepalli fclose(xml); 131d66913acSpriyadharshini gowthaman return -1; 132d66913acSpriyadharshini gowthaman } 133d66913acSpriyadharshini gowthaman 134d66913acSpriyadharshini gowthaman #define LOC_CAPI_DEFAULT_FTMS_PER_BURST 5 135d66913acSpriyadharshini gowthaman #define LOC_CAPI_DEFAULT_BURST_DUR 10 136d66913acSpriyadharshini gowthaman fprintf(xml, "<body>\n"); 137d66913acSpriyadharshini gowthaman fprintf(xml, " <ranging>\n"); 138d66913acSpriyadharshini gowthaman fprintf(xml, " <ap>\n"); 139d66913acSpriyadharshini gowthaman fprintf(xml, " <band>%u</band>\n", band); 140d66913acSpriyadharshini gowthaman fprintf(xml, " <rttType>3</rttType>\n"); 141d66913acSpriyadharshini gowthaman fprintf(xml, " <numFrames>%u</numFrames>\n", 142d66913acSpriyadharshini gowthaman LOC_CAPI_DEFAULT_FTMS_PER_BURST); 143d66913acSpriyadharshini gowthaman fprintf(xml, " <bw>%u</bw>\n", bw); 144d66913acSpriyadharshini gowthaman fprintf(xml, " <preamble>%u</preamble>\n", preamble); 145d66913acSpriyadharshini gowthaman fprintf(xml, " <asap>%u</asap>\n", loc_cmd->asap); 146d66913acSpriyadharshini gowthaman fprintf(xml, " <lci>%u</lci>\n", loc_cmd->lci); 147d66913acSpriyadharshini gowthaman fprintf(xml, " <civic>%u</civic>\n", loc_cmd->locCivic); 148d66913acSpriyadharshini gowthaman fprintf(xml, " <burstsexp>%u</burstsexp>\n", loc_cmd->burstExp); 149d66913acSpriyadharshini gowthaman fprintf(xml, " <burstduration>%u</burstduration>\n", 150d66913acSpriyadharshini gowthaman LOC_CAPI_DEFAULT_BURST_DUR); 151d66913acSpriyadharshini gowthaman fprintf(xml, " <burstperiod>%u</burstperiod>\n", 0); 152d66913acSpriyadharshini gowthaman /* Use parameters from LOWI cache */ 153d66913acSpriyadharshini gowthaman fprintf(xml, " <paramControl>%u</paramControl>\n", 0); 15426357a04Spriyadharshini gowthaman fprintf(xml, " <ptsftimer>%u</ptsftimer>\n", 0); 155d66913acSpriyadharshini gowthaman fprintf(xml, " <center_freq1>%u</center_freq1>\n", center_freq); 156d66913acSpriyadharshini gowthaman fprintf(xml, " <center_freq2>0</center_freq2>\n"); 157d66913acSpriyadharshini gowthaman fprintf(xml, " <ch>%u</ch>\n", primary_ch); 158d66913acSpriyadharshini gowthaman fprintf(xml, " <mac>%s</mac>\n", dst_mac_str); 159d66913acSpriyadharshini gowthaman fprintf(xml, " </ap>\n"); 160d66913acSpriyadharshini gowthaman fprintf(xml, " </ranging>\n"); 161d66913acSpriyadharshini gowthaman fprintf(xml, " <summary>\n"); 162d66913acSpriyadharshini gowthaman fprintf(xml, " <mac>%s</mac>\n", dst_mac_str); 163d66913acSpriyadharshini gowthaman fprintf(xml, " </summary>\n"); 164d66913acSpriyadharshini gowthaman fprintf(xml, "</body>\n"); 165d66913acSpriyadharshini gowthaman 166d66913acSpriyadharshini gowthaman fclose(xml); 167d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO, 168d66913acSpriyadharshini gowthaman "%s - Successfully created XML file", __func__); 169d66913acSpriyadharshini gowthaman return 0; 170d66913acSpriyadharshini gowthaman } 171d66913acSpriyadharshini gowthaman 172d66913acSpriyadharshini gowthaman 173d66913acSpriyadharshini gowthaman static int pass_request_to_ltest(struct sigma_dut *dut, enum lowi_tst_cmd cmd, 174d66913acSpriyadharshini gowthaman const char *params) 175d66913acSpriyadharshini gowthaman { 176d66913acSpriyadharshini gowthaman #define MAX_ANQP_CMND_SIZE 256 177d66913acSpriyadharshini gowthaman int ret; 178d66913acSpriyadharshini gowthaman const char *cmd_str; 179d66913acSpriyadharshini gowthaman char lowi_anqp_query[MAX_ANQP_CMND_SIZE]; 180d66913acSpriyadharshini gowthaman 181d66913acSpriyadharshini gowthaman switch (cmd) { 182d66913acSpriyadharshini gowthaman case LOWI_TST_RANGING: 183d66913acSpriyadharshini gowthaman cmd_str = LOC_LOWI_TEST_RANGING; 184d66913acSpriyadharshini gowthaman break; 185d66913acSpriyadharshini gowthaman case LOWI_TST_NEIGHBOR_REPORT_REQ: 186d66913acSpriyadharshini gowthaman cmd_str = LOC_LOWI_TEST_NEIGHBOR_RPT_REQ; 187d66913acSpriyadharshini gowthaman break; 188d66913acSpriyadharshini gowthaman case LOWI_TST_ANQP_REQ: 189d66913acSpriyadharshini gowthaman if (!params) { 190d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_ERROR, 191d66913acSpriyadharshini gowthaman "%s - No Destination Mac provided for ANQP Query", 192d66913acSpriyadharshini gowthaman __func__); 193d66913acSpriyadharshini gowthaman return -1; 194d66913acSpriyadharshini gowthaman } 195d66913acSpriyadharshini gowthaman 196d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO, 197d66913acSpriyadharshini gowthaman "%s - Destination Mac provided for ANQP Query: %s", 198d66913acSpriyadharshini gowthaman __func__, params); 199d66913acSpriyadharshini gowthaman 200d66913acSpriyadharshini gowthaman snprintf(lowi_anqp_query, MAX_ANQP_CMND_SIZE, "%s%s", 201d66913acSpriyadharshini gowthaman LOC_LOWI_TEST_ANQP_REQ, params); 202d66913acSpriyadharshini gowthaman cmd_str = lowi_anqp_query; 203d66913acSpriyadharshini gowthaman break; 204d66913acSpriyadharshini gowthaman default: 205d66913acSpriyadharshini gowthaman cmd_str = LOC_LOWI_TEST_DISCOVERY; 206d66913acSpriyadharshini gowthaman break; 207d66913acSpriyadharshini gowthaman } 208d66913acSpriyadharshini gowthaman 209d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO, "%s - 1 - Running command: %s", 210d66913acSpriyadharshini gowthaman __func__, LOC_LOWI_TEST_DISCOVERY); 211d66913acSpriyadharshini gowthaman ret = system(LOC_LOWI_TEST_DISCOVERY); 212d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO, 213d66913acSpriyadharshini gowthaman "%s - Finished Performing Discovery Scan through LOWI_test: ret: %d", 214d66913acSpriyadharshini gowthaman __func__, ret); 215d66913acSpriyadharshini gowthaman sleep(1); 216d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO, "%s - 2 - Running command: %s", 217d66913acSpriyadharshini gowthaman __func__, cmd_str); 218d66913acSpriyadharshini gowthaman ret = system(cmd_str); 219d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO, 220d66913acSpriyadharshini gowthaman "%s - Finished Performing command: %s, got ret: %d", 221d66913acSpriyadharshini gowthaman __func__, cmd_str, ret); 222d66913acSpriyadharshini gowthaman 223d66913acSpriyadharshini gowthaman return ret; 224d66913acSpriyadharshini gowthaman } 225d66913acSpriyadharshini gowthaman 226d66913acSpriyadharshini gowthaman 227d66913acSpriyadharshini gowthaman int loc_cmd_sta_exec_action(struct sigma_dut *dut, struct sigma_conn *conn, 228d66913acSpriyadharshini gowthaman struct sigma_cmd *cmd) 229d66913acSpriyadharshini gowthaman { 230d66913acSpriyadharshini gowthaman const char *params = NULL; 231d66913acSpriyadharshini gowthaman enum lowi_tst_cmd cmnd = LOWI_TST_RANGING; 232e7df6d86Svamsi krishna const char *program = get_param(cmd, "prog"); 233e7df6d86Svamsi krishna const char *loc_op = get_param(cmd, "Trigger"); 234e7df6d86Svamsi krishna const char *interface = get_param(cmd, "interface"); 235d66913acSpriyadharshini gowthaman 236e7df6d86Svamsi krishna const char *destMacStr = get_param(cmd, "destmac"); 237e7df6d86Svamsi krishna const char *burstExp = get_param(cmd, "burstsexponent"); 238e7df6d86Svamsi krishna const char *asap = get_param(cmd, "ASAP"); 239e7df6d86Svamsi krishna const char *fmtbw = get_param(cmd, "formatbwftm"); 240e7df6d86Svamsi krishna const char *locCivic = get_param(cmd, "askforloccivic"); 241e7df6d86Svamsi krishna const char *lci = get_param(cmd, "askforlci"); 242d66913acSpriyadharshini gowthaman struct capi_loc_cmd loc_cmd; 243d66913acSpriyadharshini gowthaman 244d66913acSpriyadharshini gowthaman memset(&loc_cmd, 0, sizeof(loc_cmd)); 245d66913acSpriyadharshini gowthaman 246d66913acSpriyadharshini gowthaman if (!loc_op) { 247d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_ERROR, 248d66913acSpriyadharshini gowthaman "%s - No Operation! - Aborting", __func__); 249d66913acSpriyadharshini gowthaman return -1; 250d66913acSpriyadharshini gowthaman } 251d66913acSpriyadharshini gowthaman 252e7df6d86Svamsi krishna cmnd = strcasecmp(loc_op, "ANQPQuery") == 0 ? 253d66913acSpriyadharshini gowthaman LOWI_TST_ANQP_REQ : LOWI_TST_RANGING; 254d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO, "%s - Going to perform: %s", 255d66913acSpriyadharshini gowthaman __func__, loc_op); 256d66913acSpriyadharshini gowthaman 257d66913acSpriyadharshini gowthaman if (!program) { 258d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_ERROR, 259d66913acSpriyadharshini gowthaman "%s - No Program in Command! - Aborting", 260d66913acSpriyadharshini gowthaman __func__); 261d66913acSpriyadharshini gowthaman return -1; 262d66913acSpriyadharshini gowthaman } 263d66913acSpriyadharshini gowthaman 264d66913acSpriyadharshini gowthaman if (!interface) { 265d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_ERROR, 266d66913acSpriyadharshini gowthaman "%s - Incomplete command in LOC CAPI request", 267d66913acSpriyadharshini gowthaman __func__); 268d66913acSpriyadharshini gowthaman send_resp(dut, conn, SIGMA_ERROR, 269d66913acSpriyadharshini gowthaman "ErrMsg,Incomplete Loc CAPI command - missing interface"); 270d66913acSpriyadharshini gowthaman return 0; 271d66913acSpriyadharshini gowthaman } 272d66913acSpriyadharshini gowthaman 273d66913acSpriyadharshini gowthaman if (!destMacStr) { 274d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_ERROR, 275d66913acSpriyadharshini gowthaman "%s - Incomplete command in LOC CAPI request", 276d66913acSpriyadharshini gowthaman __func__); 277d66913acSpriyadharshini gowthaman send_resp(dut, conn, SIGMA_ERROR, 278d66913acSpriyadharshini gowthaman "ErrMsg,Incomplete Loc CAPI command - missing MAC"); 279d66913acSpriyadharshini gowthaman return 0; 280d66913acSpriyadharshini gowthaman } 281d66913acSpriyadharshini gowthaman 282d66913acSpriyadharshini gowthaman if (cmnd == LOWI_TST_RANGING) { 283d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO, "%s - LOWI_TST_RANGING", 284d66913acSpriyadharshini gowthaman __func__); 285d66913acSpriyadharshini gowthaman if (!burstExp) { 286d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_ERROR, 287d66913acSpriyadharshini gowthaman "%s - Incomplete command in LOC CAPI request", 288d66913acSpriyadharshini gowthaman __func__); 289d66913acSpriyadharshini gowthaman send_resp(dut, conn, SIGMA_ERROR, 290d66913acSpriyadharshini gowthaman "ErrMsg,Incomplete Loc CAPI command - missing Burst Exp"); 291d66913acSpriyadharshini gowthaman return 0; 292d66913acSpriyadharshini gowthaman } 293d66913acSpriyadharshini gowthaman 294d66913acSpriyadharshini gowthaman if (!asap) { 295d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO, 296d66913acSpriyadharshini gowthaman "%s - Incomplete command in LOC CAPI request", 297d66913acSpriyadharshini gowthaman __func__); 298d66913acSpriyadharshini gowthaman send_resp(dut, conn, SIGMA_ERROR, 299d66913acSpriyadharshini gowthaman "ErrMsg,Incomplete Loc CAPI command - missing ASAP"); 300d66913acSpriyadharshini gowthaman return 0; 301d66913acSpriyadharshini gowthaman } 302d66913acSpriyadharshini gowthaman 303d66913acSpriyadharshini gowthaman if (!fmtbw) { 304d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_ERROR, 305d66913acSpriyadharshini gowthaman "%s - Incomplete command in LOC CAPI request", 306d66913acSpriyadharshini gowthaman __func__); 307d66913acSpriyadharshini gowthaman send_resp(dut, conn, SIGMA_ERROR, 308d66913acSpriyadharshini gowthaman "ErrMsg,Incomplete Loc CAPI command - missing Format & BW"); 309d66913acSpriyadharshini gowthaman return 0; 310d66913acSpriyadharshini gowthaman } 311d66913acSpriyadharshini gowthaman 312d66913acSpriyadharshini gowthaman if (!locCivic) { 313d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_ERROR, 314d66913acSpriyadharshini gowthaman "%s - Incomplete command in LOC CAPI request", 315d66913acSpriyadharshini gowthaman __func__); 316d66913acSpriyadharshini gowthaman send_resp(dut, conn, SIGMA_ERROR, 317d66913acSpriyadharshini gowthaman "ErrMsg,Incomplete Loc CAPI command - missing Location Civic"); 318d66913acSpriyadharshini gowthaman return 0; 319d66913acSpriyadharshini gowthaman } 320d66913acSpriyadharshini gowthaman 321d66913acSpriyadharshini gowthaman if (!lci) { 322d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_ERROR, 323d66913acSpriyadharshini gowthaman "%s - Incomplete command in LOC CAPI request", 324d66913acSpriyadharshini gowthaman __func__); 325d66913acSpriyadharshini gowthaman send_resp(dut, conn, SIGMA_ERROR, 326d66913acSpriyadharshini gowthaman "ErrMsg,Incomplete Loc CAPI command - missing LCI"); 327d66913acSpriyadharshini gowthaman return 0; 328d66913acSpriyadharshini gowthaman } 329d66913acSpriyadharshini gowthaman 330e7df6d86Svamsi krishna if (strcasecmp(program, "loc") != 0) { 331d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_ERROR, 332d66913acSpriyadharshini gowthaman "%s - Unsupported Program: %s", 333d66913acSpriyadharshini gowthaman __func__, program); 334d66913acSpriyadharshini gowthaman send_resp(dut, conn, SIGMA_ERROR, 335d66913acSpriyadharshini gowthaman "ErrMsg,Unsupported program"); 336d66913acSpriyadharshini gowthaman return 0; 337d66913acSpriyadharshini gowthaman } 338d66913acSpriyadharshini gowthaman 339e7df6d86Svamsi krishna if (strcasecmp(interface, "wlan0") != 0) { 340d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO, 341d66913acSpriyadharshini gowthaman "%s - Unsupported Interface Type: %s", 342d66913acSpriyadharshini gowthaman __func__, interface); 343d66913acSpriyadharshini gowthaman send_resp(dut, conn, SIGMA_ERROR, 344d66913acSpriyadharshini gowthaman "ErrMsg,Unsupported Interface Type"); 345d66913acSpriyadharshini gowthaman return 0; 346d66913acSpriyadharshini gowthaman } 347d66913acSpriyadharshini gowthaman 348d66913acSpriyadharshini gowthaman sscanf(burstExp, "%u", &loc_cmd.burstExp); 349d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO, "%s - burstExp: %u", 350d66913acSpriyadharshini gowthaman __func__, loc_cmd.burstExp); 351d66913acSpriyadharshini gowthaman sscanf(asap, "%u", &loc_cmd.asap); 352d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO, "%s - asap: %u", 353d66913acSpriyadharshini gowthaman __func__, loc_cmd.asap); 354d66913acSpriyadharshini gowthaman sscanf(fmtbw, "%u", &loc_cmd.fmtbw); 355d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO, "%s - fmtbw: %u", 356d66913acSpriyadharshini gowthaman __func__, loc_cmd.fmtbw); 357d66913acSpriyadharshini gowthaman sscanf(locCivic, "%u", &loc_cmd.locCivic); 358d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO, "%s - locCivic: %u", 359d66913acSpriyadharshini gowthaman __func__, loc_cmd.locCivic); 360d66913acSpriyadharshini gowthaman sscanf(lci, "%u", &loc_cmd.lci); 361d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO, "%s - lci: %u", 362d66913acSpriyadharshini gowthaman __func__, loc_cmd.lci); 363d66913acSpriyadharshini gowthaman 364d66913acSpriyadharshini gowthaman if (loc_write_xml_file(dut, destMacStr, &loc_cmd) < 0) { 365d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_ERROR, 366d66913acSpriyadharshini gowthaman "%s - Failed to write to XML file because of bad command", 367d66913acSpriyadharshini gowthaman __func__); 368d66913acSpriyadharshini gowthaman send_resp(dut, conn, SIGMA_ERROR, 369d66913acSpriyadharshini gowthaman "ErrMsg,Bad CAPI command"); 370d66913acSpriyadharshini gowthaman return 0; 371d66913acSpriyadharshini gowthaman } 372d66913acSpriyadharshini gowthaman } else { 373d66913acSpriyadharshini gowthaman /* ANQP Query */ 374d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO, 375d66913acSpriyadharshini gowthaman "%s - LOWI_TST_ANQP_REQ", __func__); 376d66913acSpriyadharshini gowthaman params = destMacStr; 377d66913acSpriyadharshini gowthaman } 378d66913acSpriyadharshini gowthaman 379d66913acSpriyadharshini gowthaman if (pass_request_to_ltest(dut, cmnd, params) < 0) { 380d66913acSpriyadharshini gowthaman /* Loc operation been failed. */ 381d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_ERROR, 382d66913acSpriyadharshini gowthaman "%s - Failed to initiate Loc command", 383d66913acSpriyadharshini gowthaman __func__); 384d66913acSpriyadharshini gowthaman send_resp(dut, conn, SIGMA_ERROR, 385d66913acSpriyadharshini gowthaman "ErrMsg,Failed to initiate Loc command"); 386d66913acSpriyadharshini gowthaman return 0; 387d66913acSpriyadharshini gowthaman } 388d66913acSpriyadharshini gowthaman 389d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO, 390d66913acSpriyadharshini gowthaman "%s - Succeeded to initiate Loc command", __func__); 391d66913acSpriyadharshini gowthaman send_resp(dut, conn, SIGMA_COMPLETE, NULL); 392d66913acSpriyadharshini gowthaman return 0; 393d66913acSpriyadharshini gowthaman } 394d66913acSpriyadharshini gowthaman 395d66913acSpriyadharshini gowthaman 396d66913acSpriyadharshini gowthaman int loc_cmd_sta_send_frame(struct sigma_dut *dut, struct sigma_conn *conn, 397d66913acSpriyadharshini gowthaman struct sigma_cmd *cmd) 398d66913acSpriyadharshini gowthaman { 3990dd682a8Spriyadharshini gowthaman const char *address3Cmnd = WPA_ADDRESS_3_DISABLE; 400d66913acSpriyadharshini gowthaman enum lowi_tst_cmd cmnd = LOWI_TST_NEIGHBOR_REPORT_REQ; /* Default */ 401d66913acSpriyadharshini gowthaman /* Mandatory arguments */ 402e7df6d86Svamsi krishna const char *interface = get_param(cmd, "interface"); 403e7df6d86Svamsi krishna const char *program = get_param(cmd, "program"); 404e7df6d86Svamsi krishna const char *destMacStr = get_param(cmd, "destmac"); 405e7df6d86Svamsi krishna const char *frameName = get_param(cmd, "FrameName"); 406d66913acSpriyadharshini gowthaman 407d66913acSpriyadharshini gowthaman /* Optional Arguments */ 408e7df6d86Svamsi krishna const char *locCivic = get_param(cmd, "askforloccivic"); 409e7df6d86Svamsi krishna const char *lci = get_param(cmd, "askforlci"); 410e7df6d86Svamsi krishna const char *fqdn = get_param(cmd, "AskForPublicIdentifierURI-FQDN"); 411e7df6d86Svamsi krishna const char *address3 = get_param(cmd, "address3"); 412d66913acSpriyadharshini gowthaman 413d66913acSpriyadharshini gowthaman const char *params = NULL; 414d66913acSpriyadharshini gowthaman 415d66913acSpriyadharshini gowthaman if (!program) { 416d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_ERROR, 417d66913acSpriyadharshini gowthaman "%s - No Program in Command! - Aborting", 418d66913acSpriyadharshini gowthaman __func__); 419d66913acSpriyadharshini gowthaman return -1; 420d66913acSpriyadharshini gowthaman } 421d66913acSpriyadharshini gowthaman 422d66913acSpriyadharshini gowthaman if (!interface) { 423d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_ERROR, 424d66913acSpriyadharshini gowthaman "%s - Incomplete command in LOC CAPI request", 425d66913acSpriyadharshini gowthaman __func__); 426d66913acSpriyadharshini gowthaman send_resp(dut, conn, SIGMA_ERROR, NULL); 427d66913acSpriyadharshini gowthaman return 0; 428d66913acSpriyadharshini gowthaman } 429d66913acSpriyadharshini gowthaman 430d66913acSpriyadharshini gowthaman if (!frameName) { 431d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_ERROR, 432d66913acSpriyadharshini gowthaman "%s - Incomplete command in LOC CAPI request", 433d66913acSpriyadharshini gowthaman __func__); 434d66913acSpriyadharshini gowthaman send_resp(dut, conn, SIGMA_ERROR, NULL); 435d66913acSpriyadharshini gowthaman return 0; 436d66913acSpriyadharshini gowthaman } 437d66913acSpriyadharshini gowthaman 438e7df6d86Svamsi krishna if (strcasecmp(frameName, "AnqpQuery") == 0 && !destMacStr) { 439d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_ERROR, 440d66913acSpriyadharshini gowthaman "%s - Incomplete command in LOC CAPI request", 441d66913acSpriyadharshini gowthaman __func__); 442d66913acSpriyadharshini gowthaman send_resp(dut, conn, SIGMA_ERROR, NULL); 443d66913acSpriyadharshini gowthaman return 0; 444d66913acSpriyadharshini gowthaman } 445d66913acSpriyadharshini gowthaman 446d66913acSpriyadharshini gowthaman if (!locCivic) 447d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_ERROR, 448d66913acSpriyadharshini gowthaman "%s - Command missing LocCivic", __func__); 449d66913acSpriyadharshini gowthaman if (!lci) 450d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_ERROR, 451d66913acSpriyadharshini gowthaman "%s - Command missing LCI", __func__); 452d66913acSpriyadharshini gowthaman if (!fqdn) 453d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_ERROR, 454d66913acSpriyadharshini gowthaman "%s - Command missing FQDN", __func__); 4550dd682a8Spriyadharshini gowthaman if (!address3) { 4560dd682a8Spriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_ERROR, 4570dd682a8Spriyadharshini gowthaman "%s - Command missing address3", __func__); 4580dd682a8Spriyadharshini gowthaman } else { 4590dd682a8Spriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_DEBUG, "%s - address3: %s", 4600dd682a8Spriyadharshini gowthaman __func__, address3); 461e7df6d86Svamsi krishna if (strcasecmp(address3, "FF:FF:FF:FF:FF:FF") == 0) 4620dd682a8Spriyadharshini gowthaman address3Cmnd = WPA_ADDRESS_3_ENABLE; 4630dd682a8Spriyadharshini gowthaman else 4640dd682a8Spriyadharshini gowthaman address3Cmnd = WPA_ADDRESS_3_DISABLE; 4650dd682a8Spriyadharshini gowthaman } 466d66913acSpriyadharshini gowthaman 467e7df6d86Svamsi krishna if (strcasecmp(program, "loc") != 0) { 468d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_ERROR, 469d66913acSpriyadharshini gowthaman "%s - Unsupported Program: %s", __func__, 470d66913acSpriyadharshini gowthaman program); 471d66913acSpriyadharshini gowthaman send_resp(dut, conn, SIGMA_ERROR, NULL); 472d66913acSpriyadharshini gowthaman return 0; 473d66913acSpriyadharshini gowthaman } 474d66913acSpriyadharshini gowthaman 475d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO, "%s - Triggering Frame: %s", 476d66913acSpriyadharshini gowthaman __func__, frameName); 477e7df6d86Svamsi krishna if (strcasecmp(frameName, "AnqpQuery") == 0) { 478d66913acSpriyadharshini gowthaman cmnd = LOWI_TST_ANQP_REQ; 479d66913acSpriyadharshini gowthaman params = destMacStr; 480d66913acSpriyadharshini gowthaman } else { 481d66913acSpriyadharshini gowthaman cmnd = LOWI_TST_NEIGHBOR_REPORT_REQ; 482d66913acSpriyadharshini gowthaman } 483d66913acSpriyadharshini gowthaman 4840dd682a8Spriyadharshini gowthaman if (cmnd == LOWI_TST_ANQP_REQ) { 4850dd682a8Spriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_DEBUG, "%s - Executing command %s", 4860dd682a8Spriyadharshini gowthaman __func__, address3Cmnd); 4870dd682a8Spriyadharshini gowthaman if (wpa_command(get_station_ifname(), address3Cmnd) < 0) { 4880dd682a8Spriyadharshini gowthaman send_resp(dut, conn, SIGMA_ERROR, NULL); 4890dd682a8Spriyadharshini gowthaman return -1; 4900dd682a8Spriyadharshini gowthaman } 4910dd682a8Spriyadharshini gowthaman } 492d66913acSpriyadharshini gowthaman if (pass_request_to_ltest(dut, cmnd, params) < 0) { 493d66913acSpriyadharshini gowthaman /* Loc operation has failed. */ 494d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_ERROR, 495d66913acSpriyadharshini gowthaman "%s - Failed to initiate Loc command", 496d66913acSpriyadharshini gowthaman __func__); 497d66913acSpriyadharshini gowthaman send_resp(dut, conn, SIGMA_ERROR, NULL); 498d66913acSpriyadharshini gowthaman return 0; 499d66913acSpriyadharshini gowthaman } 500d66913acSpriyadharshini gowthaman 501d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO, 502d66913acSpriyadharshini gowthaman "%s - Succeeded to initiate Loc command", __func__); 503d66913acSpriyadharshini gowthaman send_resp(dut, conn, SIGMA_COMPLETE, NULL); 504d66913acSpriyadharshini gowthaman return 0; 505d66913acSpriyadharshini gowthaman } 506d66913acSpriyadharshini gowthaman 507d66913acSpriyadharshini gowthaman 508d66913acSpriyadharshini gowthaman enum e_rm_parse_states { 509d66913acSpriyadharshini gowthaman LOC_LOOKING_FOR_BIT = 0, 510d66913acSpriyadharshini gowthaman LOC_LOOKING_FOR_VAL, 511d66913acSpriyadharshini gowthaman LOC_MAX 512d66913acSpriyadharshini gowthaman }; 513d66913acSpriyadharshini gowthaman 514d66913acSpriyadharshini gowthaman 515d66913acSpriyadharshini gowthaman void parse_rm_bits(struct sigma_dut *dut, const char *rmFlags, 516d66913acSpriyadharshini gowthaman char rmBitFlags[LOC_MAX_RM_FLAGS][LOC_RM_FLAG_VAL_ARRAY]) 517d66913acSpriyadharshini gowthaman { 518d66913acSpriyadharshini gowthaman 519d66913acSpriyadharshini gowthaman unsigned int bitPos = 0; 520d66913acSpriyadharshini gowthaman unsigned int bitVal = 0; 521d66913acSpriyadharshini gowthaman unsigned int idx = 0; 522d66913acSpriyadharshini gowthaman unsigned int i = 0; 523d66913acSpriyadharshini gowthaman enum e_rm_parse_states rmParseStates = LOC_LOOKING_FOR_BIT; 524d66913acSpriyadharshini gowthaman char temp = '\0'; 525d66913acSpriyadharshini gowthaman 526d66913acSpriyadharshini gowthaman if (!rmFlags) { 527d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_ERROR, 528d66913acSpriyadharshini gowthaman "%s - NULL pointer for rmFlags - Aborting", __func__); 529d66913acSpriyadharshini gowthaman return; 530d66913acSpriyadharshini gowthaman } 531d66913acSpriyadharshini gowthaman 532d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO, "%s - rmFlags: %s", 533d66913acSpriyadharshini gowthaman __func__, rmFlags); 534d66913acSpriyadharshini gowthaman while (*rmFlags != '\0' && idx < LOC_MAX_RM_FLAGS) { 535d66913acSpriyadharshini gowthaman temp = *rmFlags; 536d66913acSpriyadharshini gowthaman rmFlags++; 537d66913acSpriyadharshini gowthaman switch (rmParseStates) { 538d66913acSpriyadharshini gowthaman case LOC_LOOKING_FOR_BIT: 539d66913acSpriyadharshini gowthaman if (temp >= '0' && temp <= '9') { 540d66913acSpriyadharshini gowthaman /* Parse Digit for bit Position */ 541d66913acSpriyadharshini gowthaman bitPos = (bitPos * 10) + (temp - '0'); 542d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO, 543d66913acSpriyadharshini gowthaman "%s - LOC_LOOKING_FOR_BIT - parsing: %c, bitPos: %u", 544d66913acSpriyadharshini gowthaman __func__, temp, bitPos); 545d66913acSpriyadharshini gowthaman } else if (temp == ':') { 546d66913acSpriyadharshini gowthaman /* move to Parsing Bit Value */ 547d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO, 548d66913acSpriyadharshini gowthaman "%s - LOC_LOOKING_FOR_BIT - processing: %c, bitPos: %u", 549d66913acSpriyadharshini gowthaman __func__, temp, bitPos); 550d66913acSpriyadharshini gowthaman rmBitFlags[idx][0] = bitPos; 551d66913acSpriyadharshini gowthaman rmParseStates = LOC_LOOKING_FOR_VAL; 552d66913acSpriyadharshini gowthaman } else if (temp == ';') { 553d66913acSpriyadharshini gowthaman /* End of Bit-Value Pair, reset and look for New Bit Position */ 554d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO, 555d66913acSpriyadharshini gowthaman "%s - LOC_LOOKING_FOR_BIT - processing: %c", 556d66913acSpriyadharshini gowthaman __func__, temp); 557d66913acSpriyadharshini gowthaman rmBitFlags[idx][0] = bitPos; 558d66913acSpriyadharshini gowthaman /* rmBitFlags[idx][1] = bitVal; */ 559d66913acSpriyadharshini gowthaman bitPos = 0; 560d66913acSpriyadharshini gowthaman bitVal = 0; 561d66913acSpriyadharshini gowthaman idx++; 562d66913acSpriyadharshini gowthaman } else { /* Ignore */ 563d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO, 564d66913acSpriyadharshini gowthaman "%s - LOC_LOOKING_FOR_BIT - ignoring: %c", 565d66913acSpriyadharshini gowthaman __func__, temp); 566d66913acSpriyadharshini gowthaman } 567d66913acSpriyadharshini gowthaman break; 568d66913acSpriyadharshini gowthaman case LOC_LOOKING_FOR_VAL: 569d66913acSpriyadharshini gowthaman if (temp == '0' || temp == '1') { 570d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO, 571d66913acSpriyadharshini gowthaman "%s - LOC_LOOKING_FOR_VAL - processing: %c", 572d66913acSpriyadharshini gowthaman __func__, temp); 573d66913acSpriyadharshini gowthaman bitVal = temp - '0'; 574d66913acSpriyadharshini gowthaman rmBitFlags[idx][1] = bitVal; 575d66913acSpriyadharshini gowthaman } else if (temp == ';') { 576d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO, 577d66913acSpriyadharshini gowthaman "%s - LOC_LOOKING_FOR_VAL - processing: %c, bitPos: %u, bitVal: %u", 578d66913acSpriyadharshini gowthaman __func__, temp, bitPos, bitVal); 579d66913acSpriyadharshini gowthaman /* rmBitFlags[idx][0] = bitPos; */ 580d66913acSpriyadharshini gowthaman /* rmBitFlags[idx][1] = bitVal; */ 581d66913acSpriyadharshini gowthaman bitPos = 0; 582d66913acSpriyadharshini gowthaman bitVal = 0; 583d66913acSpriyadharshini gowthaman idx++; 584d66913acSpriyadharshini gowthaman rmParseStates = LOC_LOOKING_FOR_BIT; 585d66913acSpriyadharshini gowthaman } else { /* Ignore */ 586d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO, 587d66913acSpriyadharshini gowthaman "%s - LOC_LOOKING_FOR_VAL - ignoring: %c", 588d66913acSpriyadharshini gowthaman __func__, temp); 589d66913acSpriyadharshini gowthaman } 590d66913acSpriyadharshini gowthaman break; 591d66913acSpriyadharshini gowthaman default: /* Ignore */ 592d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO, 593d66913acSpriyadharshini gowthaman "%s - default - ignoring: %c", 594d66913acSpriyadharshini gowthaman __func__, temp); 595d66913acSpriyadharshini gowthaman break; 596d66913acSpriyadharshini gowthaman } 597d66913acSpriyadharshini gowthaman } 598d66913acSpriyadharshini gowthaman 599d66913acSpriyadharshini gowthaman for (i = 0; i < LOC_MAX_RM_FLAGS; i++) { 600d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO, 601d66913acSpriyadharshini gowthaman "%s - Bit Pos: %u : Bit Val: %u", 602d66913acSpriyadharshini gowthaman __func__, rmBitFlags[i][0], 603d66913acSpriyadharshini gowthaman rmBitFlags[i][1]); 604d66913acSpriyadharshini gowthaman } 605d66913acSpriyadharshini gowthaman } 606d66913acSpriyadharshini gowthaman 607d66913acSpriyadharshini gowthaman 608d66913acSpriyadharshini gowthaman int loc_cmd_sta_preset_testparameters(struct sigma_dut *dut, 609d66913acSpriyadharshini gowthaman struct sigma_conn *conn, 610d66913acSpriyadharshini gowthaman struct sigma_cmd *cmd) 611d66913acSpriyadharshini gowthaman { 612e7df6d86Svamsi krishna const char *rmFTMRFlagStr = get_param(cmd, "RMEnabledCapBitmap"); 613e7df6d86Svamsi krishna const char *interworkingEn = get_param(cmd, "Interworking"); 614d66913acSpriyadharshini gowthaman unsigned int rmFTMRFlag = 0; 6150dd682a8Spriyadharshini gowthaman unsigned int i, interworking = 0; 616d66913acSpriyadharshini gowthaman char rmBitFlags[LOC_MAX_RM_FLAGS][LOC_RM_FLAG_VAL_ARRAY]; 617d66913acSpriyadharshini gowthaman 618d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO, "%s", __func__); 619d66913acSpriyadharshini gowthaman 620d66913acSpriyadharshini gowthaman memset(rmBitFlags, 0, sizeof(rmBitFlags)); 621d66913acSpriyadharshini gowthaman 622d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO, "%s - 1", __func__); 623d66913acSpriyadharshini gowthaman /* 6240dd682a8Spriyadharshini gowthaman * This function is used to configure the RM capability bits and 6250dd682a8Spriyadharshini gowthaman * the Interworking bit only. 6260dd682a8Spriyadharshini gowthaman * If these parameters are not present just returning COMPLETE 627d66913acSpriyadharshini gowthaman * because all other parameters are ignored. 628d66913acSpriyadharshini gowthaman */ 6290dd682a8Spriyadharshini gowthaman if (!rmFTMRFlagStr && !interworkingEn) { 630d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO, "%s - 2", __func__); 631d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_ERROR, "%s - Did not get %s", 632e7df6d86Svamsi krishna __func__, "RMEnabledCapBitmap"); 633d66913acSpriyadharshini gowthaman send_resp(dut, conn, SIGMA_COMPLETE, NULL); 634d66913acSpriyadharshini gowthaman return 0; 635d66913acSpriyadharshini gowthaman } 636d66913acSpriyadharshini gowthaman 6370dd682a8Spriyadharshini gowthaman if (rmFTMRFlagStr) { 638d66913acSpriyadharshini gowthaman rmFTMRFlag = 25; /* Default invalid */ 639d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO, "%s - rmFTMRFlagStr: %s", 640d66913acSpriyadharshini gowthaman __func__, rmFTMRFlagStr); 641d66913acSpriyadharshini gowthaman parse_rm_bits(dut, rmFTMRFlagStr, rmBitFlags); 642d66913acSpriyadharshini gowthaman for (i = 0; i < LOC_MAX_RM_FLAGS; i++) { 643d66913acSpriyadharshini gowthaman if (rmBitFlags[i][0] == 34) 644d66913acSpriyadharshini gowthaman rmFTMRFlag = rmBitFlags[i][1]; 645d66913acSpriyadharshini gowthaman } 646d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO, "%s - rmFTMRFlag %u", 647d66913acSpriyadharshini gowthaman __func__, rmFTMRFlag); 648d66913acSpriyadharshini gowthaman if (rmFTMRFlag == 0) { /* Disable RM - FTMRR capability */ 6490dd682a8Spriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO, 6500dd682a8Spriyadharshini gowthaman "%s - Disabling RM - FTMRR", 651d66913acSpriyadharshini gowthaman __func__); 6520dd682a8Spriyadharshini gowthaman if (wpa_command(get_station_ifname(), WPA_RM_DISABLE) < 6530dd682a8Spriyadharshini gowthaman 0) { 654d66913acSpriyadharshini gowthaman send_resp(dut, conn, SIGMA_ERROR, NULL); 655d66913acSpriyadharshini gowthaman return -1; 656d66913acSpriyadharshini gowthaman } 657d66913acSpriyadharshini gowthaman } else if (rmFTMRFlag == 1) { /* Enable RM - FTMRR capability */ 6580dd682a8Spriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO, 6590dd682a8Spriyadharshini gowthaman "%s - Enabling RM - FTMRR", 660d66913acSpriyadharshini gowthaman __func__); 6610dd682a8Spriyadharshini gowthaman if (wpa_command(get_station_ifname(), WPA_RM_ENABLE) < 6620dd682a8Spriyadharshini gowthaman 0) { 663d66913acSpriyadharshini gowthaman send_resp(dut, conn, SIGMA_ERROR, NULL); 664d66913acSpriyadharshini gowthaman return 0; 665d66913acSpriyadharshini gowthaman } 666d66913acSpriyadharshini gowthaman } else { 667d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_ERROR, 6680dd682a8Spriyadharshini gowthaman "%s - No Setting for - FTMRR", 6690dd682a8Spriyadharshini gowthaman __func__); 670d66913acSpriyadharshini gowthaman } 671d66913acSpriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO, 672d66913acSpriyadharshini gowthaman "%s - Succeeded in Enabling/Disabling RM Capability for FTMRR", 673d66913acSpriyadharshini gowthaman __func__); 6740dd682a8Spriyadharshini gowthaman } 6750dd682a8Spriyadharshini gowthaman 6760dd682a8Spriyadharshini gowthaman if (interworkingEn) { 6770dd682a8Spriyadharshini gowthaman sscanf(interworkingEn, "%u", &interworking); 6780dd682a8Spriyadharshini gowthaman sigma_dut_print(dut, DUT_MSG_INFO, "%s - interworking: %u", 6790dd682a8Spriyadharshini gowthaman __func__, interworking); 6800dd682a8Spriyadharshini gowthaman if (interworking) 6810dd682a8Spriyadharshini gowthaman wpa_command(get_station_ifname(), 6820dd682a8Spriyadharshini gowthaman WPA_INTERWORKING_ENABLE); 6830dd682a8Spriyadharshini gowthaman else 6840dd682a8Spriyadharshini gowthaman wpa_command(get_station_ifname(), 6850dd682a8Spriyadharshini gowthaman WPA_INTERWORKING_DISABLE); 6860dd682a8Spriyadharshini gowthaman } 6870dd682a8Spriyadharshini gowthaman 688d66913acSpriyadharshini gowthaman send_resp(dut, conn, SIGMA_COMPLETE, NULL); 689d66913acSpriyadharshini gowthaman return 0; 690d66913acSpriyadharshini gowthaman } 691