1 /* 2 * Sigma Control API DUT (station/AP) 3 * Copyright (c) 2010-2011, Atheros Communications, Inc. 4 * Copyright (c) 2011-2017, Qualcomm Atheros, Inc. 5 * Copyright (c) 2018-2019, The Linux Foundation 6 * All Rights Reserved. 7 * Licensed under the Clear BSD license. See README for more details. 8 */ 9 10 #ifndef SIGMA_DUT_H 11 #define SIGMA_DUT_H 12 13 #ifdef __GNUC__ 14 #define _GNU_SOURCE 1 15 #endif 16 17 #include <stdlib.h> 18 #include <stdio.h> 19 #include <stdarg.h> 20 #include <string.h> 21 #include <errno.h> 22 #include <unistd.h> 23 #include <time.h> 24 #include <sys/time.h> 25 #include <sys/types.h> 26 #include <sys/socket.h> 27 #include <net/if.h> 28 #ifdef __QNXNTO__ 29 #include <sys/select.h> 30 #include <net/if_ether.h> 31 #endif /* __QNXNTO__ */ 32 #include <netinet/in.h> 33 #include <arpa/inet.h> 34 #ifdef CONFIG_TRAFFIC_AGENT 35 #include <pthread.h> 36 #endif /* CONFIG_TRAFFIC_AGENT */ 37 #ifdef NL80211_SUPPORT 38 #include <netlink/genl/family.h> 39 #include <netlink/genl/ctrl.h> 40 #include <netlink/genl/genl.h> 41 #include "qca-vendor_copy.h" 42 #include "nl80211_copy.h" 43 #endif /* NL80211_SUPPORT */ 44 45 46 #ifdef __GNUC__ 47 #define PRINTF_FORMAT(a,b) __attribute__ ((format (printf, (a), (b)))) 48 #else 49 #define PRINTF_FORMAT(a,b) 50 #endif 51 52 #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) 53 54 #ifndef SIGMA_TMPDIR 55 #define SIGMA_TMPDIR "/tmp" 56 #endif /* SIGMA_TMPDIR */ 57 58 #ifndef SIGMA_DUT_VER 59 #define SIGMA_DUT_VER "(unknown)" 60 #endif /* SIGMA_DUT_VER */ 61 62 #ifndef ETH_ALEN 63 #define ETH_ALEN 6 64 #endif 65 66 #ifndef ETH_P_ARP 67 #define ETH_P_ARP 0x0806 68 #endif 69 70 #ifndef ARRAY_SIZE 71 #define ARRAY_SIZE(x) (sizeof((x)) / (sizeof(((x)[0])))) 72 #endif 73 74 struct sigma_dut; 75 76 #define MAX_PARAMS 100 77 #define MAX_RADIO 3 78 79 /* Set default operating channel width 80 MHz */ 80 #define VHT_DEFAULT_OPER_CHWIDTH AP_80_VHT_OPER_CHWIDTH 81 82 typedef unsigned int u32; 83 typedef uint16_t u16; 84 typedef unsigned char u8; 85 86 struct ieee80211_hdr_3addr { 87 uint16_t frame_control; 88 uint16_t duration_id; 89 uint8_t addr1[ETH_ALEN]; 90 uint8_t addr2[ETH_ALEN]; 91 uint8_t addr3[ETH_ALEN]; 92 uint16_t seq_ctrl; 93 } __attribute__((packed)); 94 95 struct wfa_p2p_attribute { 96 uint8_t id; 97 uint16_t len; 98 uint8_t variable[0]; 99 } __attribute__((packed)); 100 101 #define WPA_GET_BE32(a) ((((u32) (a)[0]) << 24) | (((u32) (a)[1]) << 16) | \ 102 (((u32) (a)[2]) << 8) | ((u32) (a)[3])) 103 #define WPA_PUT_BE32(a, val) \ 104 do { \ 105 (a)[0] = (u8) ((((u32) (val)) >> 24) & 0xff); \ 106 (a)[1] = (u8) ((((u32) (val)) >> 16) & 0xff); \ 107 (a)[2] = (u8) ((((u32) (val)) >> 8) & 0xff); \ 108 (a)[3] = (u8) (((u32) (val)) & 0xff); \ 109 } while (0) 110 111 struct sigma_cmd { 112 char *params[MAX_PARAMS]; 113 char *values[MAX_PARAMS]; 114 int count; 115 }; 116 117 #define MAX_CMD_LEN 4096 118 119 struct sigma_conn { 120 int s; 121 struct sockaddr_in addr; 122 socklen_t addrlen; 123 char buf[MAX_CMD_LEN + 5]; 124 int pos; 125 int waiting_completion; 126 }; 127 128 enum sigma_cmd_result { 129 STATUS_SENT_ERROR = -3, 130 ERROR_SEND_STATUS = -2, 131 INVALID_SEND_STATUS = -1, 132 STATUS_SENT = 0, 133 SUCCESS_SEND_STATUS = 1 134 }; 135 136 struct sigma_cmd_handler { 137 struct sigma_cmd_handler *next; 138 char *cmd; 139 int (*validate)(struct sigma_cmd *cmd); 140 /* process return value: 141 * -2 = failed, caller will send status,ERROR 142 * -1 = failed, caller will send status,INVALID 143 * 0 = response already sent 144 * 1 = success, caller will send status,COMPLETE 145 */ 146 enum sigma_cmd_result (*process)(struct sigma_dut *dut, 147 struct sigma_conn *conn, 148 struct sigma_cmd *cmd); 149 }; 150 151 #define P2P_GRP_ID_LEN 128 152 #define IP_ADDR_STR_LEN 16 153 154 struct wfa_cs_p2p_group { 155 struct wfa_cs_p2p_group *next; 156 char ifname[IFNAMSIZ]; 157 int go; 158 char grpid[P2P_GRP_ID_LEN]; 159 char ssid[33]; 160 }; 161 162 #ifdef CONFIG_TRAFFIC_AGENT 163 164 #define MAX_SIGMA_STREAMS 16 165 #define MAX_SIGMA_STATS 6000 166 167 struct sigma_frame_stats { 168 unsigned int seqnum; 169 unsigned int local_sec; 170 unsigned int local_usec; 171 unsigned int remote_sec; 172 unsigned int remote_usec; 173 }; 174 175 struct sigma_stream { 176 enum sigma_stream_profile { 177 SIGMA_PROFILE_FILE_TRANSFER, 178 SIGMA_PROFILE_MULTICAST, 179 SIGMA_PROFILE_IPTV, 180 SIGMA_PROFILE_TRANSACTION, 181 SIGMA_PROFILE_START_SYNC, 182 SIGMA_PROFILE_UAPSD 183 } profile; 184 int sender; 185 struct in_addr dst; 186 int dst_port; 187 struct in_addr src; 188 int src_port; 189 int frame_rate; 190 int duration; 191 unsigned int payload_size; 192 int start_delay; 193 int max_cnt; 194 enum sigma_traffic_class { 195 SIGMA_TC_VOICE, 196 SIGMA_TC_VIDEO, 197 SIGMA_TC_BACKGROUND, 198 SIGMA_TC_BEST_EFFORT 199 } tc; 200 int user_priority; 201 int user_priority_set; 202 int started; 203 int no_timestamps; 204 205 int sock; 206 pthread_t thr; 207 int stop; 208 int ta_send_in_progress; 209 int trans_proto; 210 211 /* Statistics */ 212 int tx_act_frames; /* 213 * Number of frames generated by the traffic 214 * generator application. The name is defined in the 215 * Sigma CAPI spec. 216 */ 217 int tx_frames; 218 int rx_frames; 219 unsigned long long tx_payload_bytes; 220 unsigned long long rx_payload_bytes; 221 int out_of_seq_frames; 222 struct sigma_frame_stats *stats; 223 unsigned int num_stats; 224 unsigned int stream_id; 225 226 /* U-APSD */ 227 unsigned int sta_id; 228 unsigned int rx_cookie; 229 unsigned int uapsd_sta_tc; 230 unsigned int uapsd_rx_state; 231 unsigned int uapsd_tx_state; 232 unsigned int tx_stop_cnt; 233 unsigned int tx_hello_cnt; 234 pthread_t uapsd_send_thr; 235 pthread_cond_t tx_thr_cond; 236 pthread_mutex_t tx_thr_mutex; 237 int reset_rx; 238 int num_retry; 239 char ifname[IFNAMSIZ]; /* ifname from the command */ 240 struct sigma_dut *dut; /* for traffic agent thread to access context */ 241 /* console */ 242 char test_name[9]; /* test case name */ 243 int can_quit; 244 int reset; 245 }; 246 247 #endif /* CONFIG_TRAFFIC_AGENT */ 248 249 /* extended scheduling test */ 250 enum sigma_ese_type { 251 ESE_CBAP, 252 ESE_SP, 253 }; 254 255 struct sigma_ese_alloc { 256 unsigned int percent_bi; 257 enum sigma_ese_type type; 258 unsigned int src_aid, dst_aid; 259 }; 260 261 #define ESE_BCAST_AID 255 262 #define MAX_ESE_ALLOCS 4 263 264 #define NUM_AP_AC 4 265 #define AP_AC_BE 0 266 #define AP_AC_BK 1 267 #define AP_AC_VI 2 268 #define AP_AC_VO 3 269 270 #define MAX_WLAN_TAGS 3 271 #define MBO_MAX_PREF_BSSIDS 10 272 #define MAX_FT_BSS_LIST 10 273 274 #define TRANSPORT_PROTO_TYPE_TCP 0x06 275 #define TRANSPORT_PROTO_TYPE_UDP 0x11 276 #define NAN_TRANSPORT_PORT_DEFAULT 7000 277 #define NAN_TRANSPORT_PROTOCOL_DEFAULT TRANSPORT_PROTO_TYPE_TCP 278 279 enum value_not_set_enabled_disabled { 280 VALUE_NOT_SET, 281 VALUE_ENABLED, 282 VALUE_DISABLED 283 }; 284 285 enum sec_ch_offset { 286 SEC_CH_NO, 287 SEC_CH_40ABOVE, 288 SEC_CH_40BELOW 289 }; 290 291 struct mbo_pref_ap { 292 int ap_ne_class; 293 int ap_ne_op_ch; 294 int ap_ne_pref; 295 unsigned char mac_addr[ETH_ALEN]; 296 }; 297 298 #ifdef NL80211_SUPPORT 299 #define SOCK_BUF_SIZE (32 * 1024) 300 struct nl80211_ctx { 301 struct nl_sock *sock; 302 int netlink_familyid; 303 int nlctrl_familyid; 304 size_t sock_buf_size; 305 }; 306 #endif /* NL80211_SUPPORT */ 307 308 /* hardcoded long WSC IE values to force fragmentation */ 309 #define WPS_LONG_DEVICE_NAME "Qti1234511adtest1234567890123456" 310 #define WPS_LONG_MANUFACTURER "Qti1234511adQti1234511adQti1234511adQti1234511adQti1234511ad" 311 #define WPS_LONG_MODEL_NAME "Qti1234511adtest1234567890123456" 312 #define WPS_LONG_MODEL_NUMBER "11111111111111111111111111111111" 313 #define WPS_LONG_SERIAL_NUMBER "22222222222222222222222222222222" 314 315 enum akm_suite_values { 316 AKM_WPA_EAP = 1, 317 AKM_WPA_PSK = 2, 318 AKM_FT_EAP = 3, 319 AKM_FT_PSK = 4, 320 AKM_EAP_SHA256 = 5, 321 AKM_PSK_SHA256 = 6, 322 AKM_SAE = 8, 323 AKM_FT_SAE = 9, 324 AKM_SUITE_B = 12, 325 AKM_FT_SUITE_B = 13, 326 AKM_FILS_SHA256 = 14, 327 AKM_FILS_SHA384 = 15, 328 AKM_FT_FILS_SHA256 = 16, 329 AKM_FT_FILS_SHA384 = 17, 330 331 }; 332 333 struct sigma_dut { 334 int s; /* server TCP socket */ 335 int debug_level; 336 int stdout_debug; 337 struct sigma_cmd_handler *cmds; 338 int response_sent; 339 340 /* Default timeout value (seconds) for commands */ 341 unsigned int default_timeout; 342 343 int next_streamid; 344 345 const char *bridge; /* bridge interface to use in AP mode */ 346 347 enum sigma_mode { 348 SIGMA_MODE_UNKNOWN, 349 SIGMA_MODE_STATION, 350 SIGMA_MODE_AP, 351 SIGMA_MODE_SNIFFER 352 } mode; 353 354 /* 355 * Local cached values to handle API that does not provide all the 356 * needed information with commands that actually trigger some 357 * operations. 358 */ 359 int listen_chn; 360 int persistent; 361 int intra_bss; 362 int noa_duration; 363 int noa_interval; 364 int noa_count; 365 enum wfa_cs_wps_method { 366 WFA_CS_WPS_NOT_READY, 367 WFA_CS_WPS_PBC, 368 WFA_CS_WPS_PIN_DISPLAY, 369 WFA_CS_WPS_PIN_LABEL, 370 WFA_CS_WPS_PIN_KEYPAD 371 } wps_method; 372 char wps_pin[9]; 373 374 struct wfa_cs_p2p_group *groups; 375 376 char infra_ssid[33]; 377 int infra_network_id; 378 379 enum p2p_mode { 380 P2P_IDLE, P2P_DISCOVER, P2P_LISTEN, P2P_DISABLE 381 } p2p_mode; 382 383 int go; 384 int p2p_client; 385 char *p2p_ifname; 386 387 int client_uapsd; 388 389 char arp_ipaddr[IP_ADDR_STR_LEN]; 390 char arp_ifname[IFNAMSIZ + 1]; 391 392 enum sta_pmf { 393 STA_PMF_DISABLED, 394 STA_PMF_OPTIONAL, 395 STA_PMF_REQUIRED 396 } sta_pmf; 397 398 int no_tpk_expiration; 399 400 int er_oper_performed; 401 char er_oper_bssid[20]; 402 int amsdu_size; 403 int back_rcv_buf; 404 405 int testbed_flag_txsp; 406 int testbed_flag_rxsp; 407 int chwidth; 408 409 unsigned int akm_values; 410 411 /* AP configuration */ 412 char ap_ssid[33]; 413 /* 414 * WLAN-TAG of 1 will use 'ap_' variables; 415 * tag higher than 1 will use 'ap_tag_' variables. 416 */ 417 char ap_tag_ssid[MAX_WLAN_TAGS - 1][33]; 418 enum ap_mode { 419 AP_11a, 420 AP_11g, 421 AP_11b, 422 AP_11na, 423 AP_11ng, 424 AP_11ac, 425 AP_11ad, 426 AP_inval 427 } ap_mode; 428 int ap_channel; 429 int ap_rts; 430 int ap_frgmnt; 431 int ap_bcnint; 432 struct qos_params { 433 int ac; 434 int cwmin; 435 int cwmax; 436 int aifs; 437 int txop; 438 int acm; 439 } ap_qos[NUM_AP_AC], ap_sta_qos[NUM_AP_AC]; 440 enum value_not_set_enabled_disabled ap_noack; 441 enum value_not_set_enabled_disabled ap_ampdu; 442 enum value_not_set_enabled_disabled ap_amsdu; 443 enum value_not_set_enabled_disabled ap_rx_amsdu; 444 int ap_ampdu_exp; 445 enum value_not_set_enabled_disabled ap_addba_reject; 446 int ap_fixed_rate; 447 int ap_mcs; 448 int ap_rx_streams; 449 int ap_tx_streams; 450 unsigned int ap_vhtmcs_map; 451 enum value_not_set_enabled_disabled ap_ldpc; 452 enum value_not_set_enabled_disabled ap_sig_rts; 453 enum ap_chwidth { 454 AP_20, 455 AP_40, 456 AP_80, 457 AP_160, 458 AP_80_80, 459 AP_AUTO 460 } ap_chwidth; 461 enum ap_chwidth default_11na_ap_chwidth; 462 enum ap_chwidth default_11ng_ap_chwidth; 463 int ap_tx_stbc; 464 enum value_not_set_enabled_disabled ap_dyn_bw_sig; 465 int ap_sgi80; 466 int ap_p2p_mgmt; 467 enum ap_key_mgmt { 468 AP_OPEN, 469 AP_WPA2_PSK, 470 AP_WPA_PSK, 471 AP_WPA2_EAP, 472 AP_WPA_EAP, 473 AP_WPA2_EAP_MIXED, 474 AP_WPA2_PSK_MIXED, 475 AP_WPA2_SAE, 476 AP_WPA2_PSK_SAE, 477 AP_SUITEB, 478 AP_WPA2_OWE, 479 AP_WPA2_EAP_OSEN, 480 AP_WPA2_FT_EAP, 481 AP_WPA2_FT_PSK, 482 AP_WPA2_EAP_SHA256, 483 AP_WPA2_PSK_SHA256, 484 AP_WPA2_ENT_FT_EAP, 485 AP_OSEN, 486 } ap_key_mgmt; 487 enum ap_tag_key_mgmt { 488 AP2_OPEN, 489 AP2_OSEN, 490 AP2_WPA2_PSK, 491 AP2_WPA2_OWE, 492 } ap_tag_key_mgmt[MAX_WLAN_TAGS - 1]; 493 int ap_add_sha256; 494 int ap_add_sha384; 495 int ap_rsn_preauth; 496 enum ap_pmf { 497 AP_PMF_DISABLED, 498 AP_PMF_OPTIONAL, 499 AP_PMF_REQUIRED 500 } ap_pmf; 501 enum ap_cipher { 502 AP_NO_GROUP_CIPHER_SET, 503 AP_CCMP, 504 AP_TKIP, 505 AP_WEP, 506 AP_PLAIN, 507 AP_CCMP_TKIP, 508 AP_GCMP_256, 509 AP_GCMP_128, 510 AP_CCMP_256, 511 AP_CCMP_128_GCMP_256, 512 } ap_cipher, ap_group_cipher; 513 enum ap_group_mgmt_cipher { 514 AP_NO_GROUP_MGMT_CIPHER_SET, 515 AP_BIP_GMAC_256, 516 AP_BIP_CMAC_256, 517 AP_BIP_GMAC_128, 518 AP_BIP_CMAC_128, 519 } ap_group_mgmt_cipher; 520 char *ap_sae_groups; 521 int sae_anti_clogging_threshold; 522 int sae_reflection; 523 char ap_passphrase[101]; 524 char ap_psk[65]; 525 char *ap_sae_passwords; 526 char ap_wepkey[27]; 527 char ap_radius_ipaddr[20]; 528 int ap_radius_port; 529 char ap_radius_password[200]; 530 char ap2_radius_ipaddr[20]; 531 int ap2_radius_port; 532 char ap2_radius_password[200]; 533 int ap_tdls_prohibit; 534 int ap_tdls_prohibit_chswitch; 535 int ap_hs2; 536 int ap_dgaf_disable; 537 int ap_p2p_cross_connect; 538 int ap_oper_name; 539 int ap_wan_metrics; 540 int ap_conn_capab; 541 int ap_oper_class; 542 543 int ap_interworking; 544 int ap_access_net_type; 545 int ap_internet; 546 int ap_venue_group; 547 int ap_venue_type; 548 char ap_hessid[20]; 549 char ap_roaming_cons[100]; 550 int ap_venue_name; 551 int ap_net_auth_type; 552 int ap_nai_realm_list; 553 char ap_domain_name_list[1000]; 554 int ap_ip_addr_type_avail; 555 char ap_plmn_mcc[10][4]; 556 char ap_plmn_mnc[10][4]; 557 int ap_gas_cb_delay; 558 int ap_proxy_arp; 559 int ap2_proxy_arp; 560 int ap2_osu; 561 int ap_l2tif; 562 int ap_anqpserver; 563 int ap_anqpserver_on; 564 int ap_osu_provider_list; 565 int ap_osu_provider_nai_list; 566 int ap_qos_map_set; 567 int ap_bss_load; 568 char ap_osu_server_uri[10][256]; 569 char ap_osu_ssid[33]; 570 int ap_osu_method[10]; 571 int ap_osu_icon_tag; 572 int ap_venue_url; 573 int ap_advice_of_charge; 574 int ap_oper_icon_metadata; 575 int ap_tnc_file_name; 576 unsigned int ap_tnc_time_stamp; 577 578 int ap_fake_pkhash; 579 int ap_disable_protection; 580 int ap_allow_vht_wep; 581 int ap_allow_vht_tkip; 582 583 enum ap_vht_chwidth { 584 AP_20_40_VHT_OPER_CHWIDTH, 585 AP_80_VHT_OPER_CHWIDTH, 586 AP_160_VHT_OPER_CHWIDTH 587 } ap_vht_chwidth; 588 int ap_txBF; 589 int ap_mu_txBF; 590 enum ap_regulatory_mode { 591 AP_80211D_MODE_DISABLED, 592 AP_80211D_MODE_ENABLED, 593 } ap_regulatory_mode; 594 enum ap_dfs_mode { 595 AP_DFS_MODE_DISABLED, 596 AP_DFS_MODE_ENABLED, 597 } ap_dfs_mode; 598 int ap_ndpa_frame; 599 600 int ap_lci; 601 char ap_val_lci[33]; 602 char ap_infoz[17]; 603 int ap_lcr; 604 char ap_val_lcr[400]; 605 int ap_rrm; 606 int ap_rtt; 607 int ap_neighap; /* number of configured neighbor APs */ 608 unsigned char ap_val_neighap[3][6]; 609 int ap_opchannel; /* number of oper channels */ 610 int ap_val_opchannel[3]; 611 int ap_scan; 612 int ap_fqdn_held; 613 int ap_fqdn_supl; 614 int ap_msnt_type; 615 616 int ap_mbo; 617 int ap_ne_class; 618 int ap_ne_op_ch; 619 int ap_set_bssidpref; 620 int ap_btmreq_disassoc_imnt; 621 int ap_btmreq_term_bit; 622 int ap_disassoc_timer; 623 int ap_btmreq_bss_term_dur; 624 enum reg_domain { 625 REG_DOMAIN_NOT_SET, 626 REG_DOMAIN_LOCAL, 627 REG_DOMAIN_GLOBAL 628 } ap_reg_domain; 629 char ap_mobility_domain[10]; 630 unsigned char ap_cell_cap_pref; 631 int ap_ft_oa; 632 int ap_name; 633 int ap_interface_5g; 634 int ap_interface_2g; 635 int ap_assoc_delay; 636 int ap_btmreq_bss_term_tsf; 637 int ap_fils_dscv_int; 638 int ap_nairealm_int; 639 char ap_nairealm[33]; 640 int ap_blechanutil; 641 int ap_ble_admit_cap; 642 int ap_datappdudura; 643 int ap_airtimefract; 644 char ap_dhcpserv_ipaddr[20]; 645 int ap_dhcp_stop; 646 int ap_bawinsize; 647 int ap_blestacnt; 648 int ap_ul_availcap; 649 int ap_dl_availcap; 650 int ap_akm; 651 unsigned int ap_akm_values; 652 int ap_pmksa; 653 int ap_pmksa_caching; 654 int ap_80plus80; 655 int ap_oper_chn; 656 657 struct mbo_pref_ap mbo_pref_aps[MBO_MAX_PREF_BSSIDS]; 658 struct mbo_pref_ap mbo_self_ap_tuple; 659 int mbo_pref_ap_cnt; 660 unsigned char ft_bss_mac_list[MAX_FT_BSS_LIST][ETH_ALEN]; 661 int ft_bss_mac_cnt; 662 663 enum value_not_set_enabled_disabled ap_oce; 664 enum value_not_set_enabled_disabled ap_filsdscv; 665 enum value_not_set_enabled_disabled ap_filshlp; 666 enum value_not_set_enabled_disabled ap_broadcast_ssid; 667 enum value_not_set_enabled_disabled ap_rnr; 668 enum value_not_set_enabled_disabled ap_esp; 669 670 enum ppdu { 671 PPDU_NOT_SET, 672 PPDU_MU, 673 PPDU_SU, 674 PPDU_ER, 675 PPDU_TB, 676 } ap_he_ppdu; 677 678 struct sigma_ese_alloc ap_ese_allocs[MAX_ESE_ALLOCS]; 679 int ap_num_ese_allocs; 680 681 const char *hostapd_debug_log; 682 const char *wpa_supplicant_debug_log; 683 684 #ifdef CONFIG_TRAFFIC_AGENT 685 /* Traffic Agent */ 686 struct sigma_stream streams[MAX_SIGMA_STREAMS]; 687 int stream_id; 688 int num_streams; 689 pthread_t thr; 690 #endif /* CONFIG_TRAFFIC_AGENT */ 691 692 unsigned int throughput_pktsize; /* If non-zero, override pktsize for 693 * throughput tests */ 694 int no_timestamps; 695 696 const char *sniffer_ifname; 697 const char *set_macaddr; 698 int tmp_mac_addr; 699 int ap_is_dual; 700 enum ap_mode ap_mode_1; 701 enum ap_chwidth ap_chwidth_1; 702 int ap_channel_1; 703 char ap_countrycode[3]; 704 705 int ap_wpsnfc; 706 707 enum ap_wme { 708 AP_WME_OFF, 709 AP_WME_ON, 710 } ap_wme; 711 712 enum ap_wmmps { 713 AP_WMMPS_OFF, 714 AP_WMMPS_ON, 715 } ap_wmmps; 716 717 enum sec_ch_offset ap_chwidth_offset; 718 719 #ifdef CONFIG_SNIFFER 720 pid_t sniffer_pid; 721 char sniffer_filename[200]; 722 #endif /* CONFIG_SNIFFER */ 723 724 int last_set_ip_config_ipv6; 725 #ifdef MIRACAST 726 pthread_t rtsp_thread_handle; 727 int wfd_device_type; /* 0 for source, 1 for sink */ 728 char peer_mac_address[32]; 729 void *miracast_lib; 730 const char *miracast_lib_path; 731 char mdns_instance_name[64]; 732 #endif /* MIRACAST */ 733 734 int tid_to_handle[8]; /* Mapping of TID to handle */ 735 int dialog_token; /* Used for generating unique handle for an addTs */ 736 737 enum sigma_program { 738 PROGRAM_UNKNOWN = 0, 739 PROGRAM_TDLS, 740 PROGRAM_HS2, 741 PROGRAM_HS2_R2, 742 PROGRAM_WFD, 743 PROGRAM_DISPLAYR2, 744 PROGRAM_PMF, 745 PROGRAM_WPS, 746 PROGRAM_60GHZ, 747 PROGRAM_HT, 748 PROGRAM_VHT, 749 PROGRAM_NAN, 750 PROGRAM_LOC, 751 PROGRAM_MBO, 752 PROGRAM_IOTLP, 753 PROGRAM_DPP, 754 PROGRAM_OCE, 755 PROGRAM_WPA3, 756 PROGRAM_HE, 757 PROGRAM_HS2_R3, 758 } program; 759 760 enum device_type { 761 device_type_unknown, 762 AP_unknown, 763 AP_testbed, 764 AP_dut, 765 STA_unknown, 766 STA_testbed, 767 STA_dut 768 } device_type; 769 770 enum { 771 DEVROLE_UNKNOWN = 0, 772 DEVROLE_STA, 773 DEVROLE_PCP, 774 DEVROLE_STA_CFON, 775 DEVROLE_AP, 776 } dev_role; 777 778 enum wps_band { 779 WPS_BAND_NON_60G = 0, 780 WPS_BAND_60G, 781 } band; 782 783 int wps_disable; /* Used for 60G to disable PCP from sending WPS IE */ 784 int wsc_fragment; /* simulate WSC IE fragmentation */ 785 int eap_fragment; /* simulate EAP fragmentation */ 786 int wps_forced_version; /* Used to force reported WPS version */ 787 enum { 788 /* no change */ 789 FORCE_RSN_IE_NONE = 0, 790 /* if exists, remove and clear privacy bit */ 791 FORCE_RSN_IE_REMOVE, 792 /* if not exists, add and set privacy bit */ 793 FORCE_RSN_IE_ADD, 794 } force_rsn_ie; /* override RSN IE in association request */ 795 796 const char *version; 797 int no_ip_addr_set; 798 int sta_channel; 799 800 const char *summary_log; 801 const char *hostapd_entropy_log; 802 803 int iface_down_on_reset; 804 int write_stats; /* traffic stream e2e*.txt files */ 805 int sim_no_username; /* do not set SIM username to use real SIM */ 806 807 const char *vendor_name; /* device_get_info vendor override */ 808 const char *model_name; /* device_get_info model override */ 809 const char *version_name; /* device_get_info version override */ 810 const char *log_file_dir; /* Directory to generate log file */ 811 FILE *log_file_fd; /* Pointer to log file */ 812 813 int ndp_enable; /* Flag which is set once the NDP is setup */ 814 815 int ndpe; /* Flag indicating NDPE is supported */ 816 u16 trans_port; /* transport port number for TCP/UDP connection */ 817 u8 trans_proto; /* transport protocol, 0x06: TCP, 0x11: UDP */ 818 819 /* Length of nan_pmk in octets */ 820 u8 nan_pmk_len; 821 822 /* 823 * PMK: Info is optional in Discovery phase. PMK info can 824 * be passed during the NDP session. 825 */ 826 u8 nan_pmk[32]; 827 828 enum value_not_set_enabled_disabled wnm_bss_max_feature; 829 int wnm_bss_max_idle_time; 830 enum value_not_set_enabled_disabled wnm_bss_max_protection; 831 832 char *non_pref_ch_list; /* MBO: non-preferred channel report */ 833 char *btm_query_cand_list; /* Candidate list for BTM Query */ 834 835 char *sae_commit_override; 836 char *rsne_override; 837 int sta_associate_wait_connect; 838 char server_cert_hash[65]; 839 int sta_tod_policy; 840 const char *hostapd_bin; 841 int use_hostapd_pid_file; 842 const char *hostapd_ifname; 843 int hostapd_running; 844 845 char *dpp_peer_uri; 846 int dpp_local_bootstrap; 847 int dpp_conf_id; 848 849 u8 fils_hlp; 850 pthread_t hlp_thread; 851 852 #ifdef NL80211_SUPPORT 853 struct nl80211_ctx *nl_ctx; 854 int config_rsnie; 855 #endif /* NL80211_SUPPORT */ 856 857 int sta_nss; 858 859 #ifdef ANDROID 860 int nanservicediscoveryinprogress; 861 #endif /* ANDROID */ 862 863 const char *priv_cmd; /* iwpriv / cfg80211tool command name */ 864 865 unsigned int wpa_log_size; 866 char dev_start_test_runtime_id[100]; 867 }; 868 869 870 enum sigma_dut_print_level { 871 DUT_MSG_DEBUG, DUT_MSG_INFO, DUT_MSG_ERROR 872 }; 873 874 void sigma_dut_print(struct sigma_dut *dut, int level, const char *fmt, ...) 875 PRINTF_FORMAT(3, 4); 876 877 void sigma_dut_summary(struct sigma_dut *dut, const char *fmt, ...) 878 PRINTF_FORMAT(2, 3); 879 880 881 enum sigma_status { 882 SIGMA_RUNNING, SIGMA_INVALID, SIGMA_ERROR, SIGMA_COMPLETE 883 }; 884 885 void send_resp(struct sigma_dut *dut, struct sigma_conn *conn, 886 enum sigma_status status, const char *buf); 887 888 const char * get_param(struct sigma_cmd *cmd, const char *name); 889 const char * get_param_indexed(struct sigma_cmd *cmd, const char *name, 890 int index); 891 892 int sigma_dut_reg_cmd(const char *cmd, 893 int (*validate)(struct sigma_cmd *cmd), 894 enum sigma_cmd_result (*process)(struct sigma_dut *dut, 895 struct sigma_conn *conn, 896 struct sigma_cmd *cmd)); 897 898 void sigma_dut_register_cmds(void); 899 900 enum sigma_cmd_result cmd_sta_send_frame(struct sigma_dut *dut, 901 struct sigma_conn *conn, 902 struct sigma_cmd *cmd); 903 int cmd_sta_set_parameter(struct sigma_dut *dut, struct sigma_conn *conn, 904 struct sigma_cmd *cmd); 905 enum sigma_cmd_result cmd_ap_send_frame(struct sigma_dut *dut, 906 struct sigma_conn *conn, 907 struct sigma_cmd *cmd); 908 enum sigma_cmd_result cmd_wlantest_send_frame(struct sigma_dut *dut, 909 struct sigma_conn *conn, 910 struct sigma_cmd *cmd); 911 int sta_cfon_set_wireless(struct sigma_dut *dut, struct sigma_conn *conn, 912 struct sigma_cmd *cmd); 913 int sta_cfon_get_mac_address(struct sigma_dut *dut, struct sigma_conn *conn, 914 struct sigma_cmd *cmd); 915 int sta_cfon_reset_default(struct sigma_dut *dut, struct sigma_conn *conn, 916 struct sigma_cmd *cmd); 917 918 enum driver_type { 919 DRIVER_NOT_SET, 920 DRIVER_ATHEROS, 921 DRIVER_WCN, 922 DRIVER_MAC80211, 923 DRIVER_AR6003, 924 DRIVER_WIL6210, 925 DRIVER_QNXNTO, 926 DRIVER_OPENWRT, 927 DRIVER_LINUX_WCN, 928 }; 929 930 enum openwrt_driver_type { 931 OPENWRT_DRIVER_NOT_SET, 932 OPENWRT_DRIVER_ATHEROS 933 }; 934 935 #define DRIVER_NAME_60G "wil6210" 936 937 int set_wifi_chip(const char *chip_type); 938 enum driver_type get_driver_type(void); 939 enum openwrt_driver_type get_openwrt_driver_type(void); 940 int file_exists(const char *fname); 941 942 struct wpa_ctrl; 943 944 int wps_connection_event(struct sigma_dut *dut, struct sigma_conn *conn, 945 struct wpa_ctrl *ctrl, const char *intf, int p2p_resp); 946 int ascii2hexstr(const char *str, char *hex); 947 void disconnect_station(struct sigma_dut *dut); 948 void nfc_status(struct sigma_dut *dut, const char *state, const char *oper); 949 int get_ip_config(struct sigma_dut *dut, const char *ifname, char *buf, 950 size_t buf_len); 951 int ath6kl_client_uapsd(struct sigma_dut *dut, const char *intf, int uapsd); 952 int is_ip_addr(const char *str); 953 int run_system(struct sigma_dut *dut, const char *cmd); 954 int run_system_wrapper(struct sigma_dut *dut, const char *cmd, ...); 955 int run_iwpriv(struct sigma_dut *dut, const char *ifname, const char *cmd, ...); 956 enum sigma_cmd_result cmd_wlantest_set_channel(struct sigma_dut *dut, 957 struct sigma_conn *conn, 958 struct sigma_cmd *cmd); 959 void wlantest_register_cmds(void); 960 void sniffer_close(struct sigma_dut *dut); 961 962 /* ap.c */ 963 void ap_register_cmds(void); 964 void ath_disable_txbf(struct sigma_dut *dut, const char *intf); 965 void ath_config_dyn_bw_sig(struct sigma_dut *dut, const char *ifname, 966 const char *val); 967 void novap_reset(struct sigma_dut *dut, const char *ifname); 968 int get_hwaddr(const char *ifname, unsigned char *hwaddr); 969 enum sigma_cmd_result cmd_ap_config_commit(struct sigma_dut *dut, 970 struct sigma_conn *conn, 971 struct sigma_cmd *cmd); 972 int ap_wps_registration(struct sigma_dut *dut, struct sigma_conn *conn, 973 struct sigma_cmd *cmd); 974 975 /* sta.c */ 976 void sta_register_cmds(void); 977 int set_ps(const char *intf, struct sigma_dut *dut, int enabled); 978 void ath_set_zero_crc(struct sigma_dut *dut, const char *val); 979 void ath_set_cts_width(struct sigma_dut *dut, const char *ifname, 980 const char *val); 981 int ath_set_width(struct sigma_dut *dut, struct sigma_conn *conn, 982 const char *intf, const char *val); 983 int sta_set_60g_abft_len(struct sigma_dut *dut, struct sigma_conn *conn, 984 int abft_len); 985 int wil6210_send_frame_60g(struct sigma_dut *dut, struct sigma_conn *conn, 986 struct sigma_cmd *cmd); 987 int hwaddr_aton(const char *txt, unsigned char *addr); 988 int set_ipv4_addr(struct sigma_dut *dut, const char *ifname, 989 const char *ip, const char *mask); 990 int set_ipv4_gw(struct sigma_dut *dut, const char *gw); 991 int send_addba_60g(struct sigma_dut *dut, struct sigma_conn *conn, 992 struct sigma_cmd *cmd, const char *param); 993 int wil6210_set_ese(struct sigma_dut *dut, int count, 994 struct sigma_ese_alloc *allocs); 995 int sta_extract_60g_ese(struct sigma_dut *dut, struct sigma_cmd *cmd, 996 struct sigma_ese_alloc *allocs, int *allocs_size); 997 int wil6210_set_force_mcs(struct sigma_dut *dut, int force, int mcs); 998 999 /* p2p.c */ 1000 void p2p_register_cmds(void); 1001 int p2p_cmd_sta_get_parameter(struct sigma_dut *dut, struct sigma_conn *conn, 1002 struct sigma_cmd *cmd); 1003 void p2p_create_event_thread(struct sigma_dut *dut); 1004 void stop_event_thread(void); 1005 void start_dhcp(struct sigma_dut *dut, const char *group_ifname, int go); 1006 void stop_dhcp(struct sigma_dut *dut, const char *group_ifname, int go); 1007 int p2p_discover_peer(struct sigma_dut *dut, const char *ifname, 1008 const char *peer, int full); 1009 enum sigma_cmd_result cmd_sta_p2p_reset(struct sigma_dut *dut, 1010 struct sigma_conn *conn, 1011 struct sigma_cmd *cmd); 1012 1013 /* basic.c */ 1014 void basic_register_cmds(void); 1015 void get_ver(const char *cmd, char *buf, size_t buflen); 1016 1017 /* utils.c */ 1018 enum sigma_program sigma_program_to_enum(const char *prog); 1019 int hex_byte(const char *str); 1020 int parse_hexstr(const char *hex, unsigned char *buf, size_t buflen); 1021 int parse_mac_address(struct sigma_dut *dut, const char *arg, 1022 unsigned char *addr); 1023 int is_60g_sigma_dut(struct sigma_dut *dut); 1024 unsigned int channel_to_freq(struct sigma_dut *dut, unsigned int channel); 1025 unsigned int freq_to_channel(unsigned int freq); 1026 int is_ipv6_addr(const char *str); 1027 void convert_mac_addr_to_ipv6_lladdr(u8 *mac_addr, char *ipv6_buf, 1028 size_t buf_len); 1029 size_t convert_mac_addr_to_ipv6_linklocal(const u8 *mac_addr, u8 *ipv6); 1030 1031 #ifndef ANDROID 1032 size_t strlcpy(char *dest, const char *src, size_t siz); 1033 size_t strlcat(char *dst, const char *str, size_t size); 1034 #endif /* ANDROID */ 1035 void hex_dump(struct sigma_dut *dut, u8 *data, size_t len); 1036 int get_wps_pin_from_mac(struct sigma_dut *dut, const char *macaddr, 1037 char *pin, size_t len); 1038 void str_remove_chars(char *str, char ch); 1039 1040 int get_wps_forced_version(struct sigma_dut *dut, const char *str); 1041 int base64_encode(const char *src, size_t len, char *out, size_t out_len); 1042 int random_get_bytes(char *buf, size_t len); 1043 1044 /* uapsd_stream.c */ 1045 void receive_uapsd(struct sigma_stream *s); 1046 void send_uapsd_console(struct sigma_stream *s); 1047 1048 /* nan.c */ 1049 int nan_preset_testparameters(struct sigma_dut *dut, struct sigma_conn *conn, 1050 struct sigma_cmd *cmd); 1051 int nan_cmd_sta_get_parameter(struct sigma_dut *dut, struct sigma_conn *conn, 1052 struct sigma_cmd *cmd); 1053 int nan_cmd_sta_exec_action(struct sigma_dut *dut, struct sigma_conn *conn, 1054 struct sigma_cmd *cmd); 1055 int nan_cmd_sta_get_events(struct sigma_dut *dut, struct sigma_conn *conn, 1056 struct sigma_cmd *cmd); 1057 int nan_cmd_sta_transmit_followup(struct sigma_dut *dut, 1058 struct sigma_conn *conn, 1059 struct sigma_cmd *cmd); 1060 void nan_cmd_sta_reset_default(struct sigma_dut *dut, struct sigma_conn *conn, 1061 struct sigma_cmd *cmd); 1062 int nan_cmd_sta_preset_testparameters(struct sigma_dut *dut, 1063 struct sigma_conn *conn, 1064 struct sigma_cmd *cmd); 1065 1066 /* ftm.c */ 1067 int loc_cmd_sta_exec_action(struct sigma_dut *dut, struct sigma_conn *conn, 1068 struct sigma_cmd *cmd); 1069 int loc_cmd_sta_send_frame(struct sigma_dut *dut, struct sigma_conn *conn, 1070 struct sigma_cmd *cmd); 1071 int loc_cmd_sta_preset_testparameters(struct sigma_dut *dut, 1072 struct sigma_conn *conn, 1073 struct sigma_cmd *cmd); 1074 1075 /* dpp.c */ 1076 int dpp_dev_exec_action(struct sigma_dut *dut, struct sigma_conn *conn, 1077 struct sigma_cmd *cmd); 1078 1079 /* dhcp.c */ 1080 void process_fils_hlp(struct sigma_dut *dut); 1081 void hlp_thread_cleanup(struct sigma_dut *dut); 1082 1083 #ifdef NL80211_SUPPORT 1084 struct nl80211_ctx * nl80211_init(struct sigma_dut *dut); 1085 void nl80211_deinit(struct sigma_dut *dut, struct nl80211_ctx *ctx); 1086 struct nl_msg * nl80211_drv_msg(struct sigma_dut *dut, struct nl80211_ctx *ctx, 1087 int ifindex, int flags, 1088 uint8_t cmd); 1089 int send_and_recv_msgs(struct sigma_dut *dut, struct nl80211_ctx *ctx, 1090 struct nl_msg *nlmsg, 1091 int (*valid_handler)(struct nl_msg *, void *), 1092 void *valid_data); 1093 #endif /* NL80211_SUPPORT */ 1094 1095 void traffic_register_cmds(void); 1096 void traffic_agent_register_cmds(void); 1097 void powerswitch_register_cmds(void); 1098 void atheros_register_cmds(void); 1099 void dev_register_cmds(void); 1100 void sniffer_register_cmds(void); 1101 void server_register_cmds(void); 1102 void miracast_register_cmds(void); 1103 1104 #endif /* SIGMA_DUT_H */ 1105