# Copyright 2023 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

NAME = 'network_WiFi_Perf.he80_pmf'
METADATA = {
    'contacts': ['chromeos-wifi-champs@google.com'],
    'requirements': ['wifi-gen-0002-v01', 'wifi-proc-0009-v01', 'wifi-proc-0012-v01', 'wifi-proc-0013-v01', 'wifi-proc-0016-v01', 'wifi-proc-0020-v01'],
    # ChromeOS > Platform > Connectivity > WiFi
    'bug_component': 'b:893827',
    # iperf and netperf are used to measure the throughput.
    # Network: WPA2/WPA3 mixed and PMF enabled HE80 802.11ax
    'criteria': 'Measure and verify the maximal receiving and transmitting throughput on a DUT',
    'hw_agnostic': False,
}
ATTRIBUTES = 'suite:wifi_perf_openwrt'
TIME = 'SHORT'
MAX_RESULT_SIZE_KB = 512000
TEST_TYPE = 'Server'
DEPENDENCIES = 'wificell, peripheral_wifi_state:WORKING'


from autotest_lib.client.common_lib.cros.network import xmlrpc_datatypes
from autotest_lib.client.common_lib.cros.network import xmlrpc_security_types
from autotest_lib.server.cros.network import hostap_config

def run(machine):
    n_caps = [hostap_config.HostapConfig.N_CAPABILITY_HT40_PLUS,
              hostap_config.HostapConfig.N_CAPABILITY_LDPC]
    ac_caps = [hostap_config.HostapConfig.AC_CAPABILITY_SHORT_GI_80,
               hostap_config.HostapConfig.AC_CAPABILITY_RXLDPC,
               hostap_config.HostapConfig.AC_CAPABILITY_MAX_A_MPDU_LEN_EXP6]
    wpa_config = xmlrpc_security_types.WPAConfig(
            psk='chromeos',
            wpa_mode=xmlrpc_security_types.WPAConfig.MODE_MIXED_WPA3,
            wpa_ciphers=[xmlrpc_security_types.WPAConfig.CIPHER_CCMP])
    host = hosts.create_host(machine)
    configs = [hostap_config.HostapConfig(
                    channel=channel,
                    mode=hostap_config.HostapConfig.MODE_11AX_MIXED,
                    n_capabilities=n_caps,
                    vht_channel_width=hostap_config.HostapConfig.VHT_CHANNEL_WIDTH_80,
                    vht_center_channel=he_center_channel,
                    ac_capabilities=ac_caps,
                    he_channel_width=hostap_config.HostapConfig.HE_CHANNEL_WIDTH_80,
                    he_center_channel=he_center_channel,
                    ax_capabilities=[],
                    pmf_support=hostap_config.HostapConfig.PMF_SUPPORT_ENABLED,
                    security_config=wpa_config)
               for channel, he_center_channel in [(44, 42), (157, 155)]]
    host = hosts.create_host(machine)
    use_iperf = True
    job.run_test('network_WiFi_Perf', tag=NAME.split('.')[1],
                 host=host, raw_cmdline_args=args,
                 additional_params=(configs, use_iperf))


parallel_simple(run, machines)
