enum driver_type get_driver_type(void) { struct stat s; if (wifi_chip_type == DRIVER_NOT_SET) { /* Check for 60G driver */ ssize_t len; char link[256]; char buf[256]; char *ifname = get_station_ifname(); snprintf(buf, sizeof(buf), "/sys/class/net/%s/device/driver", ifname); len = readlink(buf, link, sizeof(link) - 1); if (len >= 0) { link[len] = '\0'; if (strstr(link, DRIVER_NAME_60G)) return DRIVER_WIL6210; } if (stat("/sys/module/mac80211", &s) == 0) return DRIVER_MAC80211; return DRIVER_ATHEROS; } return wifi_chip_type; }
static int cmd_traffic_send_ping(struct sigma_dut *dut, struct sigma_conn *conn, struct sigma_cmd *cmd) { const char *dst, *val; int size, dur, pkts; int id; char resp[100]; float interval; double rate; FILE *f; char buf[100]; int type = 1; int dscp = 0, use_dscp = 0; char extra[100], int_arg[100], intf_arg[100]; val = get_param(cmd, "Type"); if (!val) val = get_param(cmd, "IPType"); if (val) type = atoi(val); if (type != 1 && type != 2) { send_resp(dut, conn, SIGMA_ERROR, "ErrorCode,Unsupported address type"); return 0; } dst = get_param(cmd, "destination"); if (dst == NULL || (type == 1 && !is_ip_addr(dst)) || (type == 2 && !is_ipv6_addr(dst))) return -1; val = get_param(cmd, "frameSize"); if (val == NULL) return -1; size = atoi(val); val = get_param(cmd, "frameRate"); if (val == NULL) return -1; rate = atof(val); if (rate <= 0) return -1; val = get_param(cmd, "duration"); if (val == NULL) return -1; dur = atoi(val); if (dur <= 0 || dur > 3600) dur = 3600; pkts = dur * rate; interval = (float) 1 / rate; if (interval > 100000) return -1; val = get_param(cmd, "DSCP"); if (val) { dscp = atoi(val); if (dscp < 0 || dscp > 63) { send_resp(dut, conn, SIGMA_ERROR, "ErrorCode,Invalid DSCP value"); return 0; } use_dscp = 1; } id = dut->next_streamid++; snprintf(buf, sizeof(buf), SIGMA_TMPDIR "/sigma_dut-ping.%d", id); unlink(buf); snprintf(buf, sizeof(buf), SIGMA_TMPDIR "/sigma_dut-ping-pid.%d", id); unlink(buf); sigma_dut_print(dut, DUT_MSG_DEBUG, "Send ping: pkts=%d interval=%f " "streamid=%d", pkts, interval, id); f = fopen(SIGMA_TMPDIR "/sigma_dut-ping.sh", "w"); if (f == NULL) return -2; extra[0] = '\0'; if (use_dscp) { snprintf(extra, sizeof(extra), " -Q 0x%02x", dscp << 2); } int_arg[0] = '\0'; if (rate != 1) snprintf(int_arg, sizeof(int_arg), " -i %f", interval); intf_arg[0] = '\0'; if (type == 2) snprintf(intf_arg, sizeof(intf_arg), " -I %s", get_station_ifname()); fprintf(f, "#!" SHELL "\n" "ping%s -c %d%s -s %d%s -q%s %s > " SIGMA_TMPDIR "/sigma_dut-ping.%d &\n" "echo $! > " SIGMA_TMPDIR "/sigma_dut-ping-pid.%d\n", type == 2 ? "6" : "", pkts, int_arg, size, extra, intf_arg, dst, id, id); fclose(f); if (chmod(SIGMA_TMPDIR "/sigma_dut-ping.sh", S_IRUSR | S_IWUSR | S_IXUSR) < 0) return -2; if (system(SIGMA_TMPDIR "/sigma_dut-ping.sh") != 0) { sigma_dut_print(dut, DUT_MSG_ERROR, "Failed to start ping"); return -2; } unlink(SIGMA_TMPDIR "/sigma_dut-ping.sh"); snprintf(resp, sizeof(resp), "streamID,%d", id); send_resp(dut, conn, SIGMA_COMPLETE, resp); return 0; }