xref: /wlan-dirver/utils/sigma-dut/sigma_dut.h (revision ef9bb52b3b5da58a488bbe07eb7751742dc75023)
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