1cd4e3c3eSJouni Malinen /* 2cd4e3c3eSJouni Malinen * Sigma Control API DUT (station/AP/sniffer) 39c381f59SAmarnath Hullur Subramanyam * Copyright (c) 2011-2013, 2017, Qualcomm Atheros, Inc. 4a7ac56ebSPeng 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" 109c381f59SAmarnath Hullur Subramanyam #include "miracast.h" 11*2052daa2SAnurag Das #include <sys/wait.h> 12*2052daa2SAnurag Das #include "wpa_ctrl.h" 13*2052daa2SAnurag Das #include "wpa_helpers.h" 14cd4e3c3eSJouni Malinen 15cd4e3c3eSJouni Malinen 16cd4e3c3eSJouni Malinen static int cmd_dev_send_frame(struct sigma_dut *dut, struct sigma_conn *conn, 17cd4e3c3eSJouni Malinen struct sigma_cmd *cmd) 18cd4e3c3eSJouni Malinen { 199c381f59SAmarnath Hullur Subramanyam #ifdef MIRACAST 209c381f59SAmarnath Hullur Subramanyam const char *program = get_param(cmd, "Program"); 219c381f59SAmarnath Hullur Subramanyam 229c381f59SAmarnath Hullur Subramanyam if (program && (strcasecmp(program, "WFD") == 0 || 239c381f59SAmarnath Hullur Subramanyam strcasecmp(program, "DisplayR2") == 0)) 249c381f59SAmarnath Hullur Subramanyam return miracast_dev_send_frame(dut, conn, cmd); 259c381f59SAmarnath Hullur Subramanyam #endif /* MIRACAST */ 269c381f59SAmarnath Hullur Subramanyam 27cd4e3c3eSJouni Malinen if (dut->mode == SIGMA_MODE_STATION || 28cd4e3c3eSJouni Malinen dut->mode == SIGMA_MODE_UNKNOWN) { 29cd4e3c3eSJouni Malinen sigma_dut_print(dut, DUT_MSG_DEBUG, "Convert " 30cd4e3c3eSJouni Malinen "dev_send_frame to sta_send_frame"); 31cd4e3c3eSJouni Malinen return cmd_sta_send_frame(dut, conn, cmd); 32cd4e3c3eSJouni Malinen } 33cd4e3c3eSJouni Malinen 34cd4e3c3eSJouni Malinen if (dut->mode == SIGMA_MODE_AP) { 35cd4e3c3eSJouni Malinen sigma_dut_print(dut, DUT_MSG_DEBUG, "Convert " 36cd4e3c3eSJouni Malinen "dev_send_frame to ap_send_frame"); 37cd4e3c3eSJouni Malinen return cmd_ap_send_frame(dut, conn, cmd); 38cd4e3c3eSJouni Malinen } 39cd4e3c3eSJouni Malinen 40cd4e3c3eSJouni Malinen #ifdef CONFIG_WLANTEST 41cd4e3c3eSJouni Malinen sigma_dut_print(dut, DUT_MSG_DEBUG, "Convert dev_send_frame to " 42cd4e3c3eSJouni Malinen "wlantest_send_frame"); 43cd4e3c3eSJouni Malinen return cmd_wlantest_send_frame(dut, conn, cmd); 44cd4e3c3eSJouni Malinen #else /* CONFIG_WLANTEST */ 45cd4e3c3eSJouni Malinen send_resp(dut, conn, SIGMA_ERROR, 46cd4e3c3eSJouni Malinen "errorCode,Unsupported dev_send_frame"); 47cd4e3c3eSJouni Malinen return 0; 48cd4e3c3eSJouni Malinen #endif /* CONFIG_WLANTEST */ 49cd4e3c3eSJouni Malinen } 50cd4e3c3eSJouni Malinen 51cd4e3c3eSJouni Malinen 52cd4e3c3eSJouni Malinen static int cmd_dev_set_parameter(struct sigma_dut *dut, struct sigma_conn *conn, 53cd4e3c3eSJouni Malinen struct sigma_cmd *cmd) 54cd4e3c3eSJouni Malinen { 55cd4e3c3eSJouni Malinen const char *device = get_param(cmd, "Device"); 56cd4e3c3eSJouni Malinen 57cd4e3c3eSJouni Malinen if (device && strcasecmp(device, "STA") == 0) { 58cd4e3c3eSJouni Malinen sigma_dut_print(dut, DUT_MSG_DEBUG, "Convert " 59cd4e3c3eSJouni Malinen "dev_set_parameter to sta_set_parameter"); 60cd4e3c3eSJouni Malinen return cmd_sta_set_parameter(dut, conn, cmd); 61cd4e3c3eSJouni Malinen } 62cd4e3c3eSJouni Malinen 63cd4e3c3eSJouni Malinen return -1; 64cd4e3c3eSJouni Malinen } 65cd4e3c3eSJouni Malinen 66cd4e3c3eSJouni Malinen 679c381f59SAmarnath Hullur Subramanyam static int cmd_dev_exec_action(struct sigma_dut *dut, struct sigma_conn *conn, 689c381f59SAmarnath Hullur Subramanyam struct sigma_cmd *cmd) 699c381f59SAmarnath Hullur Subramanyam { 709c381f59SAmarnath Hullur Subramanyam const char *program = get_param(cmd, "Program"); 719c381f59SAmarnath Hullur Subramanyam 72d86e5828SJouni Malinen #ifdef MIRACAST 739c381f59SAmarnath Hullur Subramanyam if (program && (strcasecmp(program, "WFD") == 0 || 74d86e5828SJouni Malinen strcasecmp(program, "DisplayR2") == 0)) { 75d86e5828SJouni Malinen if (get_param(cmd, "interface") == NULL) 76d86e5828SJouni Malinen return -1; 779c381f59SAmarnath Hullur Subramanyam return miracast_dev_exec_action(dut, conn, cmd); 78d86e5828SJouni Malinen } 799c381f59SAmarnath Hullur Subramanyam #endif /* MIRACAST */ 809c381f59SAmarnath Hullur Subramanyam 81d86e5828SJouni Malinen if (program && strcasecmp(program, "DPP") == 0) 82d86e5828SJouni Malinen return dpp_dev_exec_action(dut, conn, cmd); 83d86e5828SJouni Malinen 849c381f59SAmarnath Hullur Subramanyam return -2; 859c381f59SAmarnath Hullur Subramanyam } 869c381f59SAmarnath Hullur Subramanyam 879c381f59SAmarnath Hullur Subramanyam 883c367e8dSJouni Malinen static int cmd_dev_configure_ie(struct sigma_dut *dut, struct sigma_conn *conn, 893c367e8dSJouni Malinen struct sigma_cmd *cmd) 903c367e8dSJouni Malinen { 913c367e8dSJouni Malinen const char *ie_name = get_param(cmd, "IE_Name"); 923c367e8dSJouni Malinen const char *contents = get_param(cmd, "Contents"); 933c367e8dSJouni Malinen 943c367e8dSJouni Malinen if (!ie_name || !contents) 953c367e8dSJouni Malinen return -1; 963c367e8dSJouni Malinen 973c367e8dSJouni Malinen if (strcasecmp(ie_name, "RSNE") != 0) { 983c367e8dSJouni Malinen send_resp(dut, conn, SIGMA_ERROR, 993c367e8dSJouni Malinen "errorCode,Unsupported IE_Name value"); 1003c367e8dSJouni Malinen return 0; 1013c367e8dSJouni Malinen } 1023c367e8dSJouni Malinen 1033c367e8dSJouni Malinen free(dut->rsne_override); 1043c367e8dSJouni Malinen dut->rsne_override = strdup(contents); 1053c367e8dSJouni Malinen 1063c367e8dSJouni Malinen return dut->rsne_override ? 1 : -1; 1073c367e8dSJouni Malinen } 1083c367e8dSJouni Malinen 1093c367e8dSJouni Malinen 110*2052daa2SAnurag Das static int cmd_dev_ble_action(struct sigma_dut *dut, struct sigma_conn *conn, 111*2052daa2SAnurag Das struct sigma_cmd *cmd) 112*2052daa2SAnurag Das { 113*2052daa2SAnurag Das #ifdef ANDROID 114*2052daa2SAnurag Das char buf[200]; 115*2052daa2SAnurag Das const char *ble_op = get_param(cmd, "BLEOp"); 116*2052daa2SAnurag Das const char *prog = get_param(cmd, "Prog"); 117*2052daa2SAnurag Das const char *service_name = get_param(cmd, "ServiceName"); 118*2052daa2SAnurag Das const char *ble_role = get_param(cmd, "BLERole"); 119*2052daa2SAnurag Das const char *discovery_type = get_param(cmd, "DiscoveryType"); 120*2052daa2SAnurag Das const char *msg_type = get_param(cmd, "messagetype"); 121*2052daa2SAnurag Das const char *action = get_param(cmd, "action"); 122*2052daa2SAnurag Das const char *M2Transmit = get_param(cmd, "M2Transmit"); 123*2052daa2SAnurag Das char *argv[17]; 124*2052daa2SAnurag Das pid_t pid; 125*2052daa2SAnurag Das 126*2052daa2SAnurag Das if (prog && ble_role && action && msg_type) { 127*2052daa2SAnurag Das send_resp(dut, conn, SIGMA_COMPLETE, 128*2052daa2SAnurag Das "OrgID,0x00,TransDataHeader,0x00,BloomFilterElement,NULL"); 129*2052daa2SAnurag Das return 0; 130*2052daa2SAnurag Das } 131*2052daa2SAnurag Das if (!ble_op || !prog || !service_name || !ble_role || !discovery_type) { 132*2052daa2SAnurag Das sigma_dut_print(dut, DUT_MSG_ERROR, "Invalid arguments"); 133*2052daa2SAnurag Das return -1; 134*2052daa2SAnurag Das } 135*2052daa2SAnurag Das 136*2052daa2SAnurag Das if ((strcasecmp(prog, "NAN") != 0)) { 137*2052daa2SAnurag Das sigma_dut_print(dut, DUT_MSG_ERROR, "Program %s not supported", 138*2052daa2SAnurag Das prog); 139*2052daa2SAnurag Das return -1; 140*2052daa2SAnurag Das } 141*2052daa2SAnurag Das 142*2052daa2SAnurag Das if (strcasecmp(ble_role, "seeker") != 0 && 143*2052daa2SAnurag Das strcasecmp(ble_role, "provider") != 0 && 144*2052daa2SAnurag Das strcasecmp(ble_role, "browser") != 0) { 145*2052daa2SAnurag Das sigma_dut_print(dut, DUT_MSG_ERROR, "Invalid BLERole: %s", 146*2052daa2SAnurag Das ble_role); 147*2052daa2SAnurag Das return -1; 148*2052daa2SAnurag Das } 149*2052daa2SAnurag Das 150*2052daa2SAnurag Das if (strcasecmp(discovery_type, "active") != 0 && 151*2052daa2SAnurag Das strcasecmp(discovery_type, "passive") != 0) { 152*2052daa2SAnurag Das sigma_dut_print(dut, DUT_MSG_ERROR, "Invalid DiscoveryType: %s", 153*2052daa2SAnurag Das discovery_type); 154*2052daa2SAnurag Das return -1; 155*2052daa2SAnurag Das } 156*2052daa2SAnurag Das 157*2052daa2SAnurag Das if (!M2Transmit) 158*2052daa2SAnurag Das M2Transmit = "disable"; 159*2052daa2SAnurag Das 160*2052daa2SAnurag Das argv[0] = "am"; 161*2052daa2SAnurag Das argv[1] = "start"; 162*2052daa2SAnurag Das argv[2] = "-n"; 163*2052daa2SAnurag Das argv[3] = "org.codeaurora.nanservicediscovery/org.codeaurora.nanservicediscovery.MainActivity"; 164*2052daa2SAnurag Das argv[4] = "--es"; 165*2052daa2SAnurag Das argv[5] = "service"; 166*2052daa2SAnurag Das argv[6] = (char *) service_name; 167*2052daa2SAnurag Das argv[7] = "--es"; 168*2052daa2SAnurag Das argv[8] = "role"; 169*2052daa2SAnurag Das argv[9] = (char *) ble_role; 170*2052daa2SAnurag Das argv[10] = "--es"; 171*2052daa2SAnurag Das argv[11] = "scantype"; 172*2052daa2SAnurag Das argv[12] = (char *) discovery_type; 173*2052daa2SAnurag Das argv[13] = "--es"; 174*2052daa2SAnurag Das argv[14] = "M2Transmit"; 175*2052daa2SAnurag Das argv[15] = (char *) M2Transmit; 176*2052daa2SAnurag Das argv[16] = NULL; 177*2052daa2SAnurag Das 178*2052daa2SAnurag Das pid = fork(); 179*2052daa2SAnurag Das if (pid == -1) { 180*2052daa2SAnurag Das sigma_dut_print(dut, DUT_MSG_ERROR, "fork: %s", 181*2052daa2SAnurag Das strerror(errno)); 182*2052daa2SAnurag Das return -1; 183*2052daa2SAnurag Das } 184*2052daa2SAnurag Das 185*2052daa2SAnurag Das if (pid == 0) { 186*2052daa2SAnurag Das execv("/system/bin/am", argv); 187*2052daa2SAnurag Das sigma_dut_print(dut, DUT_MSG_ERROR, "execv: %s", 188*2052daa2SAnurag Das strerror(errno)); 189*2052daa2SAnurag Das exit(0); 190*2052daa2SAnurag Das return -1; 191*2052daa2SAnurag Das } 192*2052daa2SAnurag Das 193*2052daa2SAnurag Das dut->nanservicediscoveryinprogress = 1; 194*2052daa2SAnurag Das #endif /* ANDROID */ 195*2052daa2SAnurag Das 196*2052daa2SAnurag Das return 1; 197*2052daa2SAnurag Das } 198*2052daa2SAnurag Das 199*2052daa2SAnurag Das 200*2052daa2SAnurag Das 201a7ac56ebSPeng Xu static int cmd_dev_start_test(struct sigma_dut *dut, struct sigma_conn *conn, 202a7ac56ebSPeng Xu struct sigma_cmd *cmd) 203a7ac56ebSPeng Xu { 204a7ac56ebSPeng Xu return 1; 205a7ac56ebSPeng Xu } 206a7ac56ebSPeng Xu 207a7ac56ebSPeng Xu 208a7ac56ebSPeng Xu static int cmd_dev_stop_test(struct sigma_dut *dut, struct sigma_conn *conn, 209a7ac56ebSPeng Xu struct sigma_cmd *cmd) 210a7ac56ebSPeng Xu { 211a7ac56ebSPeng Xu return 1; 212a7ac56ebSPeng Xu } 213a7ac56ebSPeng Xu 214a7ac56ebSPeng Xu 215a7ac56ebSPeng Xu static int cmd_dev_get_log(struct sigma_dut *dut, struct sigma_conn *conn, 216a7ac56ebSPeng Xu struct sigma_cmd *cmd) 217a7ac56ebSPeng Xu { 218a7ac56ebSPeng Xu return 1; 219a7ac56ebSPeng Xu } 220a7ac56ebSPeng Xu 221a7ac56ebSPeng Xu 2223c367e8dSJouni Malinen static int req_intf(struct sigma_cmd *cmd) 2233c367e8dSJouni Malinen { 2243c367e8dSJouni Malinen return get_param(cmd, "interface") == NULL ? -1 : 0; 2253c367e8dSJouni Malinen } 2263c367e8dSJouni Malinen 2273c367e8dSJouni Malinen 228*2052daa2SAnurag Das static int req_role_svcname(struct sigma_cmd *cmd) 229*2052daa2SAnurag Das { 230*2052daa2SAnurag Das if (!get_param(cmd, "BLERole")) 231*2052daa2SAnurag Das return -1; 232*2052daa2SAnurag Das if (get_param(cmd, "BLEOp") && !get_param(cmd, "ServiceName")) 233*2052daa2SAnurag Das return -1; 234*2052daa2SAnurag Das return 0; 235*2052daa2SAnurag Das } 236*2052daa2SAnurag Das 237*2052daa2SAnurag Das 238cd4e3c3eSJouni Malinen static int req_intf_prog(struct sigma_cmd *cmd) 239cd4e3c3eSJouni Malinen { 240cd4e3c3eSJouni Malinen if (get_param(cmd, "interface") == NULL) 241cd4e3c3eSJouni Malinen return -1; 242cd4e3c3eSJouni Malinen if (get_param(cmd, "program") == NULL) 243cd4e3c3eSJouni Malinen return -1; 244cd4e3c3eSJouni Malinen return 0; 245cd4e3c3eSJouni Malinen } 246cd4e3c3eSJouni Malinen 247cd4e3c3eSJouni Malinen 248d86e5828SJouni Malinen static int req_prog(struct sigma_cmd *cmd) 249d86e5828SJouni Malinen { 250d86e5828SJouni Malinen if (get_param(cmd, "program") == NULL) 251d86e5828SJouni Malinen return -1; 252d86e5828SJouni Malinen return 0; 253d86e5828SJouni Malinen } 254d86e5828SJouni Malinen 255d86e5828SJouni Malinen 256cd4e3c3eSJouni Malinen void dev_register_cmds(void) 257cd4e3c3eSJouni Malinen { 258cd4e3c3eSJouni Malinen sigma_dut_reg_cmd("dev_send_frame", req_intf_prog, cmd_dev_send_frame); 259cd4e3c3eSJouni Malinen sigma_dut_reg_cmd("dev_set_parameter", req_intf_prog, 260cd4e3c3eSJouni Malinen cmd_dev_set_parameter); 261d86e5828SJouni Malinen sigma_dut_reg_cmd("dev_exec_action", req_prog, 2629c381f59SAmarnath Hullur Subramanyam cmd_dev_exec_action); 2633c367e8dSJouni Malinen sigma_dut_reg_cmd("dev_configure_ie", req_intf, cmd_dev_configure_ie); 264a7ac56ebSPeng Xu sigma_dut_reg_cmd("dev_start_test", NULL, cmd_dev_start_test); 265a7ac56ebSPeng Xu sigma_dut_reg_cmd("dev_stop_test", NULL, cmd_dev_stop_test); 266a7ac56ebSPeng Xu sigma_dut_reg_cmd("dev_get_log", NULL, cmd_dev_get_log); 267*2052daa2SAnurag Das sigma_dut_reg_cmd("dev_ble_action", req_role_svcname, 268*2052daa2SAnurag Das cmd_dev_ble_action); 269cd4e3c3eSJouni Malinen } 270