#!/usr/bin/python3.4
#
#   Copyright 2017 - The Android Open Source Project
#
#   Licensed under the Apache License, Version 2.0 (the "License");
#   you may not use this file except in compliance with the License.
#   You may obtain a copy of the License at
#
#       http://www.apache.org/licenses/LICENSE-2.0
#
#   Unless required by applicable law or agreed to in writing, software
#   distributed under the License is distributed on an "AS IS" BASIS,
#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#   See the License for the specific language governing permissions and
#   limitations under the License.

import time

from acts import asserts
from acts.test_decorators import test_tracker_info
from acts_contrib.test_utils.net import connectivity_const as cconsts
from acts_contrib.test_utils.wifi import wifi_test_utils as wutils
from acts_contrib.test_utils.wifi.WifiBaseTest import WifiBaseTest
from acts_contrib.test_utils.wifi.aware import aware_const as aconsts
from acts_contrib.test_utils.wifi.aware import aware_test_utils as autils
from acts_contrib.test_utils.wifi.aware.AwareBaseTest import AwareBaseTest


class DataPathTest(AwareBaseTest):
    """Set of tests for Wi-Fi Aware data-path."""

    # configuration parameters used by tests
    ENCR_TYPE_OPEN = 0
    ENCR_TYPE_PASSPHRASE = 1
    ENCR_TYPE_PMK = 2

    PASSPHRASE = "This is some random passphrase - very very secure!!"
    PASSPHRASE_MIN = "01234567"
    PASSPHRASE_MAX = "012345678901234567890123456789012345678901234567890123456789012"
    PMK = "ODU0YjE3YzdmNDJiNWI4NTQ2NDJjNDI3M2VkZTQyZGU="
    PASSPHRASE2 = "This is some random passphrase - very very secure - but diff!!"
    PMK2 = "MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI="

    PING_MSG = "ping"

    # message re-transmit counter (increases reliability in open-environment)
    # Note: reliability of message transmission is tested elsewhere
    MSG_RETX_COUNT = 5  # hard-coded max value, internal API

    # number of second to 'reasonably' wait to make sure that devices synchronize
    # with each other - useful for OOB test cases, where the OOB discovery would
    # take some time
    WAIT_FOR_CLUSTER = 5

    def create_config(self, dtype):
        """Create a base configuration based on input parameters.

    Args:
      dtype: Publish or Subscribe discovery type

    Returns:
      Discovery configuration object.
    """
        config = {}
        config[aconsts.DISCOVERY_KEY_DISCOVERY_TYPE] = dtype
        config[
            aconsts.DISCOVERY_KEY_SERVICE_NAME] = "GoogleTestServiceDataPath"
        return config

    def request_network(self, dut, ns):
        """Request a Wi-Fi Aware network.

    Args:
      dut: Device
      ns: Network specifier
    Returns: the request key
    """
        network_req = {"TransportType": 5, "NetworkSpecifier": ns}
        return dut.droid.connectivityRequestWifiAwareNetwork(network_req)

    def set_up_discovery(self,
                         ptype,
                         stype,
                         get_peer_id,
                         pub_on_both=False,
                         pub_on_both_same=True):
        """Set up discovery sessions and wait for service discovery.

    Args:
      ptype: Publish discovery type
      stype: Subscribe discovery type
      get_peer_id: Send a message across to get the peer's id
      pub_on_both: If True then set up a publisher on both devices. The second
                   publisher isn't used (existing to test use-case).
      pub_on_both_same: If True then the second publish uses an identical
                        service name, otherwise a different service name.
    """
        p_dut = self.android_devices[0]
        p_dut.pretty_name = "Publisher"
        s_dut = self.android_devices[1]
        s_dut.pretty_name = "Subscriber"

        # Publisher+Subscriber: attach and wait for confirmation
        p_id = p_dut.droid.wifiAwareAttach()
        autils.wait_for_event(p_dut, aconsts.EVENT_CB_ON_ATTACHED)
        time.sleep(self.device_startup_offset)
        s_id = s_dut.droid.wifiAwareAttach()
        autils.wait_for_event(s_dut, aconsts.EVENT_CB_ON_ATTACHED)

        # Publisher: start publish and wait for confirmation
        p_disc_id = p_dut.droid.wifiAwarePublish(p_id,
                                                 self.create_config(ptype))
        autils.wait_for_event(p_dut, aconsts.SESSION_CB_ON_PUBLISH_STARTED)

        # Optionally set up a publish session on the Subscriber device
        if pub_on_both:
            p2_config = self.create_config(ptype)
            if not pub_on_both_same:
                p2_config[aconsts.DISCOVERY_KEY_SERVICE_NAME] = (
                    p2_config[aconsts.DISCOVERY_KEY_SERVICE_NAME] + "-XYZXYZ")
            s_dut.droid.wifiAwarePublish(s_id, p2_config)
            autils.wait_for_event(s_dut, aconsts.SESSION_CB_ON_PUBLISH_STARTED)

        # Subscriber: start subscribe and wait for confirmation
        s_disc_id = s_dut.droid.wifiAwareSubscribe(s_id,
                                                   self.create_config(stype))
        autils.wait_for_event(s_dut, aconsts.SESSION_CB_ON_SUBSCRIBE_STARTED)

        # Subscriber: wait for service discovery
        discovery_event = autils.wait_for_event(
            s_dut, aconsts.SESSION_CB_ON_SERVICE_DISCOVERED)
        peer_id_on_sub = discovery_event["data"][
            aconsts.SESSION_CB_KEY_PEER_ID]

        peer_id_on_pub = None
        if get_peer_id:  # only need message to receive peer ID
            # Subscriber: send message to peer (Publisher - so it knows our address)
            s_dut.droid.wifiAwareSendMessage(s_disc_id, peer_id_on_sub,
                                             self.get_next_msg_id(),
                                             self.PING_MSG,
                                             self.MSG_RETX_COUNT)
            autils.wait_for_event(s_dut, aconsts.SESSION_CB_ON_MESSAGE_SENT)

            # Publisher: wait for received message
            pub_rx_msg_event = autils.wait_for_event(
                p_dut, aconsts.SESSION_CB_ON_MESSAGE_RECEIVED)
            peer_id_on_pub = pub_rx_msg_event["data"][
                aconsts.SESSION_CB_KEY_PEER_ID]

        return (p_dut, s_dut, p_id, s_id, p_disc_id, s_disc_id, peer_id_on_sub,
                peer_id_on_pub)

    def run_ib_data_path_test(self,
                              ptype,
                              stype,
                              encr_type,
                              use_peer_id,
                              passphrase_to_use=None,
                              pub_on_both=False,
                              pub_on_both_same=True,
                              expect_failure=False):
        """Runs the in-band data-path tests.

    Args:
      ptype: Publish discovery type
      stype: Subscribe discovery type
      encr_type: Encryption type, one of ENCR_TYPE_*
      use_peer_id: On Responder (publisher): True to use peer ID, False to
                   accept any request
      passphrase_to_use: The passphrase to use if encr_type=ENCR_TYPE_PASSPHRASE
                         If None then use self.PASSPHRASE
      pub_on_both: If True then set up a publisher on both devices. The second
                   publisher isn't used (existing to test use-case).
      pub_on_both_same: If True then the second publish uses an identical
                        service name, otherwise a different service name.
      expect_failure: If True then don't expect NDP formation, otherwise expect
                      NDP setup to succeed.
    """
        (p_dut, s_dut, p_id, s_id, p_disc_id, s_disc_id, peer_id_on_sub,
         peer_id_on_pub) = self.set_up_discovery(
             ptype,
             stype,
             use_peer_id,
             pub_on_both=pub_on_both,
             pub_on_both_same=pub_on_both_same)

        passphrase = None
        pmk = None
        if encr_type == self.ENCR_TYPE_PASSPHRASE:
            passphrase = (self.PASSPHRASE
                          if passphrase_to_use == None else passphrase_to_use)
        elif encr_type == self.ENCR_TYPE_PMK:
            pmk = self.PMK

        port = 1234
        transport_protocol = 6  # TCP/IP

        # Publisher: request network
        if encr_type == self.ENCR_TYPE_OPEN:
            p_req_key = self.request_network(
                p_dut,
                p_dut.droid.wifiAwareCreateNetworkSpecifier(
                    p_disc_id, peer_id_on_pub
                    if use_peer_id else None, passphrase, pmk))
        else:
            p_req_key = self.request_network(
                p_dut,
                p_dut.droid.wifiAwareCreateNetworkSpecifier(
                    p_disc_id, peer_id_on_pub if use_peer_id else None,
                    passphrase, pmk, port, transport_protocol))

        # Subscriber: request network
        s_req_key = self.request_network(
            s_dut,
            s_dut.droid.wifiAwareCreateNetworkSpecifier(
                s_disc_id, peer_id_on_sub, passphrase, pmk))

        if expect_failure:
            # Publisher & Subscriber: expect unavailable callbacks
            autils.wait_for_event_with_keys(
                p_dut, cconsts.EVENT_NETWORK_CALLBACK,
                autils.EVENT_NDP_TIMEOUT,
                (cconsts.NETWORK_CB_KEY_EVENT, cconsts.NETWORK_CB_UNAVAILABLE))
            autils.wait_for_event_with_keys(
                s_dut, cconsts.EVENT_NETWORK_CALLBACK,
                autils.EVENT_NDP_TIMEOUT,
                (cconsts.NETWORK_CB_KEY_EVENT, cconsts.NETWORK_CB_UNAVAILABLE))
        else:
            # Publisher & Subscriber: wait for network formation
            p_net_event_nc = autils.wait_for_event_with_keys(
                p_dut, cconsts.EVENT_NETWORK_CALLBACK,
                autils.EVENT_NDP_TIMEOUT,
                (cconsts.NETWORK_CB_KEY_EVENT,
                 cconsts.NETWORK_CB_CAPABILITIES_CHANGED),
                (cconsts.NETWORK_CB_KEY_ID, p_req_key))
            s_net_event_nc = autils.wait_for_event_with_keys(
                s_dut, cconsts.EVENT_NETWORK_CALLBACK,
                autils.EVENT_NDP_TIMEOUT,
                (cconsts.NETWORK_CB_KEY_EVENT,
                 cconsts.NETWORK_CB_CAPABILITIES_CHANGED),
                (cconsts.NETWORK_CB_KEY_ID, s_req_key))

            # validate no leak of information
            asserts.assert_false(
                cconsts.NETWORK_CB_KEY_NETWORK_SPECIFIER in p_net_event_nc[
                    "data"], "Network specifier leak!")
            asserts.assert_false(
                cconsts.NETWORK_CB_KEY_NETWORK_SPECIFIER in s_net_event_nc[
                    "data"], "Network specifier leak!")

            # note that Pub <-> Sub since IPv6 are of peer's!
            s_ipv6 = p_net_event_nc["data"][aconsts.NET_CAP_IPV6]
            p_ipv6 = s_net_event_nc["data"][aconsts.NET_CAP_IPV6]

            self.verify_network_info(
                p_net_event_nc["data"], s_net_event_nc["data"],
                encr_type == self.ENCR_TYPE_OPEN, port, transport_protocol)

            p_net_event_lp = autils.wait_for_event_with_keys(
                p_dut, cconsts.EVENT_NETWORK_CALLBACK,
                autils.EVENT_NDP_TIMEOUT,
                (cconsts.NETWORK_CB_KEY_EVENT,
                 cconsts.NETWORK_CB_LINK_PROPERTIES_CHANGED),
                (cconsts.NETWORK_CB_KEY_ID, p_req_key))
            s_net_event_lp = autils.wait_for_event_with_keys(
                s_dut, cconsts.EVENT_NETWORK_CALLBACK,
                autils.EVENT_NDP_TIMEOUT,
                (cconsts.NETWORK_CB_KEY_EVENT,
                 cconsts.NETWORK_CB_LINK_PROPERTIES_CHANGED),
                (cconsts.NETWORK_CB_KEY_ID, s_req_key))

            p_aware_if = p_net_event_lp["data"][
                cconsts.NETWORK_CB_KEY_INTERFACE_NAME]
            s_aware_if = s_net_event_lp["data"][
                cconsts.NETWORK_CB_KEY_INTERFACE_NAME]

            self.log.info("Interface names: p=%s, s=%s", p_aware_if,
                          s_aware_if)
            self.log.info("Interface addresses (IPv6): p=%s, s=%s", p_ipv6,
                          s_ipv6)

            # open sockets to test connection
            asserts.assert_true(
                autils.verify_socket_connect(p_dut, s_dut, p_ipv6, s_ipv6, 0),
                "Failed socket link with Pub as Server")
            asserts.assert_true(
                autils.verify_socket_connect(s_dut, p_dut, s_ipv6, p_ipv6, 0),
                "Failed socket link with Sub as Server")

            # terminate sessions and wait for ON_LOST callbacks
            p_dut.droid.wifiAwareDestroy(p_id)
            s_dut.droid.wifiAwareDestroy(s_id)

            autils.wait_for_event_with_keys(
                p_dut, cconsts.EVENT_NETWORK_CALLBACK,
                autils.EVENT_NDP_TIMEOUT,
                (cconsts.NETWORK_CB_KEY_EVENT, cconsts.NETWORK_CB_LOST),
                (cconsts.NETWORK_CB_KEY_ID, p_req_key))
            autils.wait_for_event_with_keys(
                s_dut, cconsts.EVENT_NETWORK_CALLBACK,
                autils.EVENT_NDP_TIMEOUT,
                (cconsts.NETWORK_CB_KEY_EVENT, cconsts.NETWORK_CB_LOST),
                (cconsts.NETWORK_CB_KEY_ID, s_req_key))

        # clean-up
        p_dut.droid.connectivityUnregisterNetworkCallback(p_req_key)
        s_dut.droid.connectivityUnregisterNetworkCallback(s_req_key)

    def run_oob_data_path_test(self,
                               encr_type,
                               use_peer_id,
                               setup_discovery_sessions=False,
                               expect_failure=False):
        """Runs the out-of-band data-path tests.

    Args:
      encr_type: Encryption type, one of ENCR_TYPE_*
      use_peer_id: On Responder: True to use peer ID, False to accept any
                   request
      setup_discovery_sessions: If True also set up a (spurious) discovery
        session (pub on both sides, sub on Responder side). Validates a corner
        case.
      expect_failure: If True then don't expect NDP formation, otherwise expect
                      NDP setup to succeed.
    """
        init_dut = self.android_devices[0]
        init_dut.pretty_name = "Initiator"
        resp_dut = self.android_devices[1]
        resp_dut.pretty_name = "Responder"

        # Initiator+Responder: attach and wait for confirmation & identity
        init_id = init_dut.droid.wifiAwareAttach(True)
        autils.wait_for_event(init_dut, aconsts.EVENT_CB_ON_ATTACHED)
        init_ident_event = autils.wait_for_event(
            init_dut, aconsts.EVENT_CB_ON_IDENTITY_CHANGED)
        init_mac = init_ident_event["data"]["mac"]
        time.sleep(self.device_startup_offset)
        resp_id = resp_dut.droid.wifiAwareAttach(True)
        autils.wait_for_event(resp_dut, aconsts.EVENT_CB_ON_ATTACHED)
        resp_ident_event = autils.wait_for_event(
            resp_dut, aconsts.EVENT_CB_ON_IDENTITY_CHANGED)
        resp_mac = resp_ident_event["data"]["mac"]

        # wait for for devices to synchronize with each other - there are no other
        # mechanisms to make sure this happens for OOB discovery (except retrying
        # to execute the data-path request)
        time.sleep(self.WAIT_FOR_CLUSTER)

        if setup_discovery_sessions:
            init_dut.droid.wifiAwarePublish(
                init_id, self.create_config(aconsts.PUBLISH_TYPE_UNSOLICITED))
            autils.wait_for_event(init_dut,
                                  aconsts.SESSION_CB_ON_PUBLISH_STARTED)
            resp_dut.droid.wifiAwarePublish(
                resp_id, self.create_config(aconsts.PUBLISH_TYPE_UNSOLICITED))
            autils.wait_for_event(resp_dut,
                                  aconsts.SESSION_CB_ON_PUBLISH_STARTED)
            resp_dut.droid.wifiAwareSubscribe(
                resp_id, self.create_config(aconsts.SUBSCRIBE_TYPE_PASSIVE))
            autils.wait_for_event(resp_dut,
                                  aconsts.SESSION_CB_ON_SUBSCRIBE_STARTED)
            autils.wait_for_event(resp_dut,
                                  aconsts.SESSION_CB_ON_SERVICE_DISCOVERED)

        passphrase = None
        pmk = None
        if encr_type == self.ENCR_TYPE_PASSPHRASE:
            passphrase = self.PASSPHRASE
        elif encr_type == self.ENCR_TYPE_PMK:
            pmk = self.PMK

        # Responder: request network
        resp_req_key = self.request_network(
            resp_dut,
            resp_dut.droid.wifiAwareCreateNetworkSpecifierOob(
                resp_id, aconsts.DATA_PATH_RESPONDER, init_mac
                if use_peer_id else None, passphrase, pmk))

        # Initiator: request network
        init_req_key = self.request_network(
            init_dut,
            init_dut.droid.wifiAwareCreateNetworkSpecifierOob(
                init_id, aconsts.DATA_PATH_INITIATOR, resp_mac, passphrase,
                pmk))

        if expect_failure:
            # Initiator & Responder: expect unavailable callbacks
            autils.wait_for_event_with_keys(
                init_dut, cconsts.EVENT_NETWORK_CALLBACK,
                autils.EVENT_NDP_TIMEOUT,
                (cconsts.NETWORK_CB_KEY_EVENT, cconsts.NETWORK_CB_UNAVAILABLE))
            autils.wait_for_event_with_keys(
                resp_dut, cconsts.EVENT_NETWORK_CALLBACK,
                autils.EVENT_NDP_TIMEOUT,
                (cconsts.NETWORK_CB_KEY_EVENT, cconsts.NETWORK_CB_UNAVAILABLE))
        else:
            # Initiator & Responder: wait for network formation
            init_net_event_nc = autils.wait_for_event_with_keys(
                init_dut, cconsts.EVENT_NETWORK_CALLBACK,
                autils.EVENT_NDP_TIMEOUT,
                (cconsts.NETWORK_CB_KEY_EVENT,
                 cconsts.NETWORK_CB_CAPABILITIES_CHANGED),
                (cconsts.NETWORK_CB_KEY_ID, init_req_key))
            resp_net_event_nc = autils.wait_for_event_with_keys(
                resp_dut, cconsts.EVENT_NETWORK_CALLBACK,
                autils.EVENT_NDP_TIMEOUT,
                (cconsts.NETWORK_CB_KEY_EVENT,
                 cconsts.NETWORK_CB_CAPABILITIES_CHANGED),
                (cconsts.NETWORK_CB_KEY_ID, resp_req_key))

            # validate no leak of information
            asserts.assert_false(
                cconsts.NETWORK_CB_KEY_NETWORK_SPECIFIER in init_net_event_nc[
                    "data"], "Network specifier leak!")
            asserts.assert_false(
                cconsts.NETWORK_CB_KEY_NETWORK_SPECIFIER in resp_net_event_nc[
                    "data"], "Network specifier leak!")

            # note that Init <-> Resp since IPv6 are of peer's!
            init_ipv6 = resp_net_event_nc["data"][aconsts.NET_CAP_IPV6]
            resp_ipv6 = init_net_event_nc["data"][aconsts.NET_CAP_IPV6]

            init_net_event_lp = autils.wait_for_event_with_keys(
                init_dut, cconsts.EVENT_NETWORK_CALLBACK,
                autils.EVENT_NDP_TIMEOUT,
                (cconsts.NETWORK_CB_KEY_EVENT,
                 cconsts.NETWORK_CB_LINK_PROPERTIES_CHANGED),
                (cconsts.NETWORK_CB_KEY_ID, init_req_key))
            resp_net_event_lp = autils.wait_for_event_with_keys(
                resp_dut, cconsts.EVENT_NETWORK_CALLBACK,
                autils.EVENT_NDP_TIMEOUT,
                (cconsts.NETWORK_CB_KEY_EVENT,
                 cconsts.NETWORK_CB_LINK_PROPERTIES_CHANGED),
                (cconsts.NETWORK_CB_KEY_ID, resp_req_key))

            init_aware_if = init_net_event_lp["data"][
                cconsts.NETWORK_CB_KEY_INTERFACE_NAME]
            resp_aware_if = resp_net_event_lp["data"][
                cconsts.NETWORK_CB_KEY_INTERFACE_NAME]

            self.log.info("Interface names: I=%s, R=%s", init_aware_if,
                          resp_aware_if)
            self.log.info("Interface addresses (IPv6): I=%s, R=%s", init_ipv6,
                          resp_ipv6)

            # open sockets to test connection
            asserts.assert_true(
                autils.verify_socket_connect(init_dut, resp_dut, init_ipv6,
                                             resp_ipv6, 0),
                "Failed socket link with Initiator as Server")
            asserts.assert_true(
                autils.verify_socket_connect(resp_dut, init_dut, resp_ipv6,
                                             init_ipv6, 0),
                "Failed socket link with Responder as Server")

            # terminate sessions and wait for ON_LOST callbacks
            init_dut.droid.wifiAwareDestroy(init_id)
            resp_dut.droid.wifiAwareDestroy(resp_id)

            autils.wait_for_event_with_keys(
                init_dut, cconsts.EVENT_NETWORK_CALLBACK,
                autils.EVENT_NDP_TIMEOUT,
                (cconsts.NETWORK_CB_KEY_EVENT, cconsts.NETWORK_CB_LOST),
                (cconsts.NETWORK_CB_KEY_ID, init_req_key))
            autils.wait_for_event_with_keys(
                resp_dut, cconsts.EVENT_NETWORK_CALLBACK,
                autils.EVENT_NDP_TIMEOUT,
                (cconsts.NETWORK_CB_KEY_EVENT, cconsts.NETWORK_CB_LOST),
                (cconsts.NETWORK_CB_KEY_ID, resp_req_key))

        # clean-up
        resp_dut.droid.connectivityUnregisterNetworkCallback(resp_req_key)
        init_dut.droid.connectivityUnregisterNetworkCallback(init_req_key)

    def run_mismatched_ib_data_path_test(self, pub_mismatch, sub_mismatch):
        """Runs the negative in-band data-path tests: mismatched peer ID.

    Args:
      pub_mismatch: Mismatch the publisher's ID
      sub_mismatch: Mismatch the subscriber's ID
    """
        (p_dut, s_dut, p_id, s_id, p_disc_id, s_disc_id, peer_id_on_sub,
         peer_id_on_pub) = self.set_up_discovery(
             aconsts.PUBLISH_TYPE_UNSOLICITED, aconsts.SUBSCRIBE_TYPE_PASSIVE,
             True)

        if pub_mismatch:
            peer_id_on_pub = peer_id_on_pub - 1
        if sub_mismatch:
            peer_id_on_sub = peer_id_on_sub - 1

        # Publisher: request network
        p_req_key = self.request_network(
            p_dut,
            p_dut.droid.wifiAwareCreateNetworkSpecifier(
                p_disc_id, peer_id_on_pub, None))

        # Subscriber: request network
        s_req_key = self.request_network(
            s_dut,
            s_dut.droid.wifiAwareCreateNetworkSpecifier(
                s_disc_id, peer_id_on_sub, None))

        # Publisher & Subscriber:
        # - expect unavailable callbacks on the party with the bad ID
        # - also expect unavailable on the Initiator party (i.e. the
        #   Subscriber) if the Publisher has a bad ID
        # - but a Publisher with a valid ID will keep waiting ...
        autils.wait_for_event_with_keys(
            s_dut, cconsts.EVENT_NETWORK_CALLBACK, autils.EVENT_NDP_TIMEOUT,
            (cconsts.NETWORK_CB_KEY_EVENT, cconsts.NETWORK_CB_UNAVAILABLE))
        if pub_mismatch:
            autils.wait_for_event_with_keys(
                p_dut, cconsts.EVENT_NETWORK_CALLBACK,
                autils.EVENT_NDP_TIMEOUT,
                (cconsts.NETWORK_CB_KEY_EVENT, cconsts.NETWORK_CB_UNAVAILABLE))
        else:
            time.sleep(autils.EVENT_NDP_TIMEOUT)
            autils.fail_on_event_with_keys(
                p_dut, cconsts.EVENT_NETWORK_CALLBACK, 0,
                (cconsts.NETWORK_CB_KEY_ID, p_req_key))

        # clean-up
        p_dut.droid.connectivityUnregisterNetworkCallback(p_req_key)
        s_dut.droid.connectivityUnregisterNetworkCallback(s_req_key)

    def run_mismatched_oob_data_path_test(self,
                                          init_mismatch_mac=False,
                                          resp_mismatch_mac=False,
                                          init_encr_type=ENCR_TYPE_OPEN,
                                          resp_encr_type=ENCR_TYPE_OPEN):
        """Runs the negative out-of-band data-path tests: mismatched information
    between Responder and Initiator.

    Args:
      init_mismatch_mac: True to mismatch the Initiator MAC address
      resp_mismatch_mac: True to mismatch the Responder MAC address
      init_encr_type: Encryption type of Initiator - ENCR_TYPE_*
      resp_encr_type: Encryption type of Responder - ENCR_TYPE_*
    """
        init_dut = self.android_devices[0]
        init_dut.pretty_name = "Initiator"
        resp_dut = self.android_devices[1]
        resp_dut.pretty_name = "Responder"

        # Initiator+Responder: attach and wait for confirmation & identity
        init_id = init_dut.droid.wifiAwareAttach(True)
        autils.wait_for_event(init_dut, aconsts.EVENT_CB_ON_ATTACHED)
        init_ident_event = autils.wait_for_event(
            init_dut, aconsts.EVENT_CB_ON_IDENTITY_CHANGED)
        init_mac = init_ident_event["data"]["mac"]
        time.sleep(self.device_startup_offset)
        resp_id = resp_dut.droid.wifiAwareAttach(True)
        autils.wait_for_event(resp_dut, aconsts.EVENT_CB_ON_ATTACHED)
        resp_ident_event = autils.wait_for_event(
            resp_dut, aconsts.EVENT_CB_ON_IDENTITY_CHANGED)
        resp_mac = resp_ident_event["data"]["mac"]

        if init_mismatch_mac:  # assumes legit ones don't start with "00"
            init_mac = "00" + init_mac[2:]
        if resp_mismatch_mac:
            resp_mac = "00" + resp_mac[2:]

        # wait for for devices to synchronize with each other - there are no other
        # mechanisms to make sure this happens for OOB discovery (except retrying
        # to execute the data-path request)
        time.sleep(self.WAIT_FOR_CLUSTER)

        # set up separate keys: even if types are the same we want a mismatch
        init_passphrase = None
        init_pmk = None
        if init_encr_type == self.ENCR_TYPE_PASSPHRASE:
            init_passphrase = self.PASSPHRASE
        elif init_encr_type == self.ENCR_TYPE_PMK:
            init_pmk = self.PMK

        resp_passphrase = None
        resp_pmk = None
        if resp_encr_type == self.ENCR_TYPE_PASSPHRASE:
            resp_passphrase = self.PASSPHRASE2
        elif resp_encr_type == self.ENCR_TYPE_PMK:
            resp_pmk = self.PMK2

        # Responder: request network
        resp_req_key = self.request_network(
            resp_dut,
            resp_dut.droid.wifiAwareCreateNetworkSpecifierOob(
                resp_id, aconsts.DATA_PATH_RESPONDER, init_mac,
                resp_passphrase, resp_pmk))

        # Initiator: request network
        init_req_key = self.request_network(
            init_dut,
            init_dut.droid.wifiAwareCreateNetworkSpecifierOob(
                init_id, aconsts.DATA_PATH_INITIATOR, resp_mac,
                init_passphrase, init_pmk))

        # Initiator & Responder:
        # - expect unavailable on the Initiator party if the
        #   Initiator and Responder with mac or encryption mismatch
        # - For responder:
        #   - If mac mismatch, responder will keep waiting ...
        #   - If encryption mismatch, responder expect unavailable
        autils.wait_for_event_with_keys(
            init_dut, cconsts.EVENT_NETWORK_CALLBACK, autils.EVENT_NDP_TIMEOUT,
            (cconsts.NETWORK_CB_KEY_EVENT, cconsts.NETWORK_CB_UNAVAILABLE))
        time.sleep(autils.EVENT_NDP_TIMEOUT)
        if init_mismatch_mac or resp_mismatch_mac:
            autils.fail_on_event_with_keys(
                resp_dut, cconsts.EVENT_NETWORK_CALLBACK, 0,
                (cconsts.NETWORK_CB_KEY_ID, resp_req_key))
        else:
            autils.wait_for_event_with_keys(
                resp_dut, cconsts.EVENT_NETWORK_CALLBACK, autils.EVENT_NDP_TIMEOUT,
                (cconsts.NETWORK_CB_KEY_EVENT, cconsts.NETWORK_CB_UNAVAILABLE))

        # clean-up
        resp_dut.droid.connectivityUnregisterNetworkCallback(resp_req_key)
        init_dut.droid.connectivityUnregisterNetworkCallback(init_req_key)

    def verify_network_info(self, p_data, s_data, open, port,
                            transport_protocol):
        """Verify that the port and transport protocol information is correct.
            - should only exist on subscriber (received from publisher)
              and match transmitted values
            - should only exist on an encrypted NDP

        Args:
            p_data, s_data: Pub and Sub (respectively) net cap event data.
            open: True if NDP unencrypted, False if encrypted.
            port: Expected port value.
            transport_protocol: Expected transport protocol value.
        """
        asserts.assert_true(aconsts.NET_CAP_PORT not in p_data,
                            "port info not expected on Pub")
        asserts.assert_true(aconsts.NET_CAP_TRANSPORT_PROTOCOL not in p_data,
                            "transport protocol info not expected on Pub")
        if open:
            asserts.assert_true(aconsts.NET_CAP_PORT not in s_data,
                                "port info not expected on Sub (open NDP)")
            asserts.assert_true(
                aconsts.NET_CAP_TRANSPORT_PROTOCOL not in s_data,
                "transport protocol info not expected on Sub (open NDP)")
        else:
            asserts.assert_equal(s_data[aconsts.NET_CAP_PORT], port,
                                 "Port info does not match on Sub (from Pub)")
            asserts.assert_equal(
                s_data[aconsts.NET_CAP_TRANSPORT_PROTOCOL], transport_protocol,
                "Transport protocol info does not match on Sub (from Pub)")

    #######################################
    # Positive In-Band (IB) tests key:
    #
    # names is: test_ib_<pub_type>_<sub_type>_<encr_type>_<peer_spec>
    # where:
    #
    # pub_type: Type of publish discovery session: unsolicited or solicited.
    # sub_type: Type of subscribe discovery session: passive or active.
    # encr_type: Encription type: open, passphrase
    # peer_spec: Peer specification method: any or specific
    #
    # Note: In-Band means using Wi-Fi Aware for discovery and referring to the
    # peer using the Aware-provided peer handle (as opposed to a MAC address).
    #######################################

    @test_tracker_info(uuid="fa30bedc-d1de-4440-bf25-ec00d10555af")
    @WifiBaseTest.wifi_test_wrap
    def test_ib_unsolicited_passive_open_specific(self):
        """Data-path: in-band, unsolicited/passive, open encryption, specific peer

    Verifies end-to-end discovery + data-path creation.
    """
        self.run_ib_data_path_test(
            ptype=aconsts.PUBLISH_TYPE_UNSOLICITED,
            stype=aconsts.SUBSCRIBE_TYPE_PASSIVE,
            encr_type=self.ENCR_TYPE_OPEN,
            use_peer_id=True)

    @test_tracker_info(uuid="57fc9d53-32ae-470f-a8b1-2fe37893687d")
    @WifiBaseTest.wifi_test_wrap
    def test_ib_unsolicited_passive_open_any(self):
        """Data-path: in-band, unsolicited/passive, open encryption, any peer

    Verifies end-to-end discovery + data-path creation.
    """
        self.run_ib_data_path_test(
            ptype=aconsts.PUBLISH_TYPE_UNSOLICITED,
            stype=aconsts.SUBSCRIBE_TYPE_PASSIVE,
            encr_type=self.ENCR_TYPE_OPEN,
            use_peer_id=False)

    @test_tracker_info(uuid="93b2a23d-8579-448a-936c-7812929464cf")
    @WifiBaseTest.wifi_test_wrap
    def test_ib_unsolicited_passive_passphrase_specific(self):
        """Data-path: in-band, unsolicited/passive, passphrase, specific peer

    Verifies end-to-end discovery + data-path creation.
    """
        self.run_ib_data_path_test(
            ptype=aconsts.PUBLISH_TYPE_UNSOLICITED,
            stype=aconsts.SUBSCRIBE_TYPE_PASSIVE,
            encr_type=self.ENCR_TYPE_PASSPHRASE,
            use_peer_id=True)

    @test_tracker_info(uuid="1736126f-a0ff-4712-acc4-f89b4eef5716")
    @WifiBaseTest.wifi_test_wrap
    def test_ib_unsolicited_passive_passphrase_any(self):
        """Data-path: in-band, unsolicited/passive, passphrase, any peer

    Verifies end-to-end discovery + data-path creation.
    """
        self.run_ib_data_path_test(
            ptype=aconsts.PUBLISH_TYPE_UNSOLICITED,
            stype=aconsts.SUBSCRIBE_TYPE_PASSIVE,
            encr_type=self.ENCR_TYPE_PASSPHRASE,
            use_peer_id=False)

    @test_tracker_info(uuid="b9353d5b-3f77-46bf-bfd9-65d56a7c939a")
    @WifiBaseTest.wifi_test_wrap
    def test_ib_unsolicited_passive_pmk_specific(self):
        """Data-path: in-band, unsolicited/passive, PMK, specific peer

    Verifies end-to-end discovery + data-path creation.
    """
        self.run_ib_data_path_test(
            ptype=aconsts.PUBLISH_TYPE_UNSOLICITED,
            stype=aconsts.SUBSCRIBE_TYPE_PASSIVE,
            encr_type=self.ENCR_TYPE_PMK,
            use_peer_id=True)

    @test_tracker_info(uuid="06f3b2ab-4a10-4398-83a4-6a23851b1662")
    @WifiBaseTest.wifi_test_wrap
    def test_ib_unsolicited_passive_pmk_any(self):
        """Data-path: in-band, unsolicited/passive, PMK, any peer

    Verifies end-to-end discovery + data-path creation.
    """
        self.run_ib_data_path_test(
            ptype=aconsts.PUBLISH_TYPE_UNSOLICITED,
            stype=aconsts.SUBSCRIBE_TYPE_PASSIVE,
            encr_type=self.ENCR_TYPE_PMK,
            use_peer_id=False)

    @test_tracker_info(uuid="0ed7d8b3-a69e-46ba-aeb7-13e507ecf290")
    @WifiBaseTest.wifi_test_wrap
    def test_ib_solicited_active_open_specific(self):
        """Data-path: in-band, solicited/active, open encryption, specific peer

    Verifies end-to-end discovery + data-path creation.
    """
        self.run_ib_data_path_test(
            ptype=aconsts.PUBLISH_TYPE_SOLICITED,
            stype=aconsts.SUBSCRIBE_TYPE_ACTIVE,
            encr_type=self.ENCR_TYPE_OPEN,
            use_peer_id=True)

    @test_tracker_info(uuid="c7ba6d28-5ef6-45d9-95d5-583ad6d981f3")
    @WifiBaseTest.wifi_test_wrap
    def test_ib_solicited_active_open_any(self):
        """Data-path: in-band, solicited/active, open encryption, any peer

    Verifies end-to-end discovery + data-path creation.
    """
        self.run_ib_data_path_test(
            ptype=aconsts.PUBLISH_TYPE_SOLICITED,
            stype=aconsts.SUBSCRIBE_TYPE_ACTIVE,
            encr_type=self.ENCR_TYPE_OPEN,
            use_peer_id=False)

    @test_tracker_info(uuid="388cea99-0e2e-49ea-b00e-f3e56b6236e5")
    @WifiBaseTest.wifi_test_wrap
    def test_ib_solicited_active_passphrase_specific(self):
        """Data-path: in-band, solicited/active, passphrase, specific peer

    Verifies end-to-end discovery + data-path creation.
    """
        self.run_ib_data_path_test(
            ptype=aconsts.PUBLISH_TYPE_SOLICITED,
            stype=aconsts.SUBSCRIBE_TYPE_ACTIVE,
            encr_type=self.ENCR_TYPE_PASSPHRASE,
            use_peer_id=True)

    @test_tracker_info(uuid="fcd3e28a-5eab-4169-8a0c-dc7204dcdc13")
    @WifiBaseTest.wifi_test_wrap
    def test_ib_solicited_active_passphrase_any(self):
        """Data-path: in-band, solicited/active, passphrase, any peer

    Verifies end-to-end discovery + data-path creation.
    """
        self.run_ib_data_path_test(
            ptype=aconsts.PUBLISH_TYPE_SOLICITED,
            stype=aconsts.SUBSCRIBE_TYPE_ACTIVE,
            encr_type=self.ENCR_TYPE_PASSPHRASE,
            use_peer_id=False)

    @test_tracker_info(uuid="9d4eaad7-ba53-4a06-8ce0-e308daea3309")
    @WifiBaseTest.wifi_test_wrap
    def test_ib_solicited_active_pmk_specific(self):
        """Data-path: in-band, solicited/active, PMK, specific peer

    Verifies end-to-end discovery + data-path creation.
    """
        self.run_ib_data_path_test(
            ptype=aconsts.PUBLISH_TYPE_SOLICITED,
            stype=aconsts.SUBSCRIBE_TYPE_ACTIVE,
            encr_type=self.ENCR_TYPE_PMK,
            use_peer_id=True)

    @test_tracker_info(uuid="129d850e-c312-4137-a67b-05ae95fe66cc")
    @WifiBaseTest.wifi_test_wrap
    def test_ib_solicited_active_pmk_any(self):
        """Data-path: in-band, solicited/active, PMK, any peer

    Verifies end-to-end discovery + data-path creation.
    """
        self.run_ib_data_path_test(
            ptype=aconsts.PUBLISH_TYPE_SOLICITED,
            stype=aconsts.SUBSCRIBE_TYPE_ACTIVE,
            encr_type=self.ENCR_TYPE_PMK,
            use_peer_id=False)

    #######################################
    # Positive In-Band (IB) with a publish session running on the subscriber
    # tests key:
    #
    # names is: test_ib_extra_pub_<same|diff>_<pub_type>_<sub_type>
    #                                          _<encr_type>_<peer_spec>
    # where:
    #
    # same|diff: Whether the extra publish session (on the subscriber) is the same
    #            or different from the primary session.
    # pub_type: Type of publish discovery session: unsolicited or solicited.
    # sub_type: Type of subscribe discovery session: passive or active.
    # encr_type: Encryption type: open, passphrase
    # peer_spec: Peer specification method: any or specific
    #
    # Note: In-Band means using Wi-Fi Aware for discovery and referring to the
    # peer using the Aware-provided peer handle (as opposed to a MAC address).
    #######################################

    @test_tracker_info(uuid="e855dd81-45c8-4bb2-a204-7687c48ff843")
    @WifiBaseTest.wifi_test_wrap
    def test_ib_extra_pub_same_unsolicited_passive_open_specific(self):
        """Data-path: in-band, unsolicited/passive, open encryption, specific peer.

    Configuration contains a publisher (for the same service) running on *both*
    devices.

    Verifies end-to-end discovery + data-path creation.
    """
        self.run_ib_data_path_test(
            ptype=aconsts.PUBLISH_TYPE_UNSOLICITED,
            stype=aconsts.SUBSCRIBE_TYPE_PASSIVE,
            encr_type=self.ENCR_TYPE_OPEN,
            use_peer_id=True,
            pub_on_both=True,
            pub_on_both_same=True)

    @test_tracker_info(uuid="228ea657-82e6-44bc-8369-a2c719a5e252")
    @WifiBaseTest.wifi_test_wrap
    def test_ib_extra_pub_same_unsolicited_passive_open_any(self):
        """Data-path: in-band, unsolicited/passive, open encryption, any peer.

    Configuration contains a publisher (for the same service) running on *both*
    devices.

    Verifies end-to-end discovery + data-path creation.
    """
        self.run_ib_data_path_test(
            ptype=aconsts.PUBLISH_TYPE_UNSOLICITED,
            stype=aconsts.SUBSCRIBE_TYPE_PASSIVE,
            encr_type=self.ENCR_TYPE_OPEN,
            use_peer_id=False,
            pub_on_both=True,
            pub_on_both_same=True)

    @test_tracker_info(uuid="7a32f439-d745-4716-a75e-b54109aaaf82")
    @WifiBaseTest.wifi_test_wrap
    def test_ib_extra_pub_diff_unsolicited_passive_open_specific(self):
        """Data-path: in-band, unsolicited/passive, open encryption, specific peer.

    Configuration contains a publisher (for a different service) running on
    *both* devices.

    Verifies end-to-end discovery + data-path creation.
    """
        self.run_ib_data_path_test(
            ptype=aconsts.PUBLISH_TYPE_UNSOLICITED,
            stype=aconsts.SUBSCRIBE_TYPE_PASSIVE,
            encr_type=self.ENCR_TYPE_OPEN,
            use_peer_id=True,
            pub_on_both=True,
            pub_on_both_same=False)

    @test_tracker_info(uuid="a14ddc66-88fd-4b49-ab37-225533867c63")
    @WifiBaseTest.wifi_test_wrap
    def test_ib_extra_pub_diff_unsolicited_passive_open_any(self):
        """Data-path: in-band, unsolicited/passive, open encryption, any peer.

    Configuration contains a publisher (for a different service) running on
    *both* devices.

    Verifies end-to-end discovery + data-path creation.
    """
        self.run_ib_data_path_test(
            ptype=aconsts.PUBLISH_TYPE_UNSOLICITED,
            stype=aconsts.SUBSCRIBE_TYPE_PASSIVE,
            encr_type=self.ENCR_TYPE_OPEN,
            use_peer_id=False,
            pub_on_both=True,
            pub_on_both_same=False)

    #######################################
    # Positive Out-of-Band (OOB) tests key:
    #
    # names is: test_oob_<encr_type>_<peer_spec>
    # where:
    #
    # encr_type: Encryption type: open, passphrase
    # peer_spec: Peer specification method: any or specific
    #
    # Optionally set up an extra discovery session to test coexistence. If so
    # add "ib_coex" to test name.
    #
    # Note: Out-of-Band means using a non-Wi-Fi Aware mechanism for discovery and
    # exchange of MAC addresses and then Wi-Fi Aware for data-path.
    #######################################

    @test_tracker_info(uuid="7db17d8c-1dce-4084-b695-215bbcfe7d41")
    @WifiBaseTest.wifi_test_wrap
    def test_oob_open_specific(self):
        """Data-path: out-of-band, open encryption, specific peer

    Verifies end-to-end discovery + data-path creation.
    """
        self.run_oob_data_path_test(
            encr_type=self.ENCR_TYPE_OPEN, use_peer_id=True)

    @test_tracker_info(uuid="ad416d89-cb95-4a07-8d29-ee213117450b")
    @WifiBaseTest.wifi_test_wrap
    def test_oob_open_any(self):
        """Data-path: out-of-band, open encryption, any peer

    Verifies end-to-end discovery + data-path creation.
    """
        self.run_oob_data_path_test(
            encr_type=self.ENCR_TYPE_OPEN, use_peer_id=False)

    @test_tracker_info(uuid="74937a3a-d524-43e2-8979-4449271cab52")
    @WifiBaseTest.wifi_test_wrap
    def test_oob_passphrase_specific(self):
        """Data-path: out-of-band, passphrase, specific peer

    Verifies end-to-end discovery + data-path creation.
    """
        self.run_oob_data_path_test(
            encr_type=self.ENCR_TYPE_PASSPHRASE, use_peer_id=True)

    @test_tracker_info(uuid="afcbdc7e-d3a9-465b-b1da-ce2e42e3941e")
    @WifiBaseTest.wifi_test_wrap
    def test_oob_passphrase_any(self):
        """Data-path: out-of-band, passphrase, any peer

    Verifies end-to-end discovery + data-path creation.
    """
        self.run_oob_data_path_test(
            encr_type=self.ENCR_TYPE_PASSPHRASE, use_peer_id=False)

    @test_tracker_info(uuid="0d095031-160a-4537-aab5-41b6ad5d55f8")
    @WifiBaseTest.wifi_test_wrap
    def test_oob_pmk_specific(self):
        """Data-path: out-of-band, PMK, specific peer

    Verifies end-to-end discovery + data-path creation.
    """
        self.run_oob_data_path_test(
            encr_type=self.ENCR_TYPE_PMK, use_peer_id=True)

    @test_tracker_info(uuid="e45477bd-66cc-4eb7-88dd-4518c8aa2a74")
    @WifiBaseTest.wifi_test_wrap
    def test_oob_pmk_any(self):
        """Data-path: out-of-band, PMK, any peer

    Verifies end-to-end discovery + data-path creation.
    """
        self.run_oob_data_path_test(
            encr_type=self.ENCR_TYPE_PMK, use_peer_id=False)

    @test_tracker_info(uuid="dd464f24-b404-4eea-955c-d10c9e8adefc")
    @WifiBaseTest.wifi_test_wrap
    def test_oob_ib_coex_open_specific(self):
        """Data-path: out-of-band, open encryption, specific peer - in-band coex:
    set up a concurrent discovery session to verify no impact. The session
    consists of Publisher on both ends, and a Subscriber on the Responder.

    Verifies end-to-end discovery + data-path creation.
    """
        self.run_oob_data_path_test(
            encr_type=self.ENCR_TYPE_OPEN,
            use_peer_id=True,
            setup_discovery_sessions=True)

    @test_tracker_info(uuid="088fcd3a-b015-4179-a9a5-91f782b03e3b")
    @WifiBaseTest.wifi_test_wrap
    def test_oob_ib_coex_open_any(self):
        """Data-path: out-of-band, open encryption, any peer - in-band coex:
    set up a concurrent discovery session to verify no impact. The session
    consists of Publisher on both ends, and a Subscriber on the Responder.

    Verifies end-to-end discovery + data-path creation.
    """
        self.run_oob_data_path_test(
            encr_type=self.ENCR_TYPE_OPEN,
            use_peer_id=False,
            setup_discovery_sessions=True)

    ##############################################################

    @test_tracker_info(uuid="1c2c9805-dc1e-43b5-a1b8-315e8c9a4337")
    @WifiBaseTest.wifi_test_wrap
    def test_passphrase_min(self):
        """Data-path: minimum passphrase length

    Use in-band, unsolicited/passive, any peer combination
    """
        self.run_ib_data_path_test(
            ptype=aconsts.PUBLISH_TYPE_UNSOLICITED,
            stype=aconsts.SUBSCRIBE_TYPE_PASSIVE,
            encr_type=self.ENCR_TYPE_PASSPHRASE,
            use_peer_id=False,
            passphrase_to_use=self.PASSPHRASE_MIN)

    @test_tracker_info(uuid="e696e2b9-87a9-4521-b337-61b9efaa2057")
    @WifiBaseTest.wifi_test_wrap
    def test_passphrase_max(self):
        """Data-path: maximum passphrase length

    Use in-band, unsolicited/passive, any peer combination
    """
        self.run_ib_data_path_test(
            ptype=aconsts.PUBLISH_TYPE_UNSOLICITED,
            stype=aconsts.SUBSCRIBE_TYPE_PASSIVE,
            encr_type=self.ENCR_TYPE_PASSPHRASE,
            use_peer_id=False,
            passphrase_to_use=self.PASSPHRASE_MAX)

    @test_tracker_info(uuid="533cd44c-ff30-4283-ac28-f71fd7b4f02d")
    @WifiBaseTest.wifi_test_wrap
    def test_negative_mismatch_publisher_peer_id(self):
        """Data-path: failure when publisher peer ID is mismatched"""
        self.run_mismatched_ib_data_path_test(
            pub_mismatch=True, sub_mismatch=False)

    @test_tracker_info(uuid="682f275e-722a-4f8b-85e7-0dcea9d25532")
    @WifiBaseTest.wifi_test_wrap
    def test_negative_mismatch_subscriber_peer_id(self):
        """Data-path: failure when subscriber peer ID is mismatched"""
        self.run_mismatched_ib_data_path_test(
            pub_mismatch=False, sub_mismatch=True)

    @test_tracker_info(uuid="7fa82796-7fc9-4d9e-bbbb-84b751788943")
    @WifiBaseTest.wifi_test_wrap
    def test_negative_mismatch_init_mac(self):
        """Data-path: failure when Initiator MAC address mismatch"""
        self.run_mismatched_oob_data_path_test(
            init_mismatch_mac=True, resp_mismatch_mac=False)

    @test_tracker_info(uuid="edeae959-4644-44f9-8d41-bdeb5216954e")
    @WifiBaseTest.wifi_test_wrap
    def test_negative_mismatch_resp_mac(self):
        """Data-path: failure when Responder MAC address mismatch"""
        self.run_mismatched_oob_data_path_test(
            init_mismatch_mac=False, resp_mismatch_mac=True)

    @test_tracker_info(uuid="91f46949-c47f-49f9-a90f-6fae699613a7")
    @WifiBaseTest.wifi_test_wrap
    def test_negative_mismatch_passphrase(self):
        """Data-path: failure when passphrases mismatch"""
        self.run_mismatched_oob_data_path_test(
            init_encr_type=self.ENCR_TYPE_PASSPHRASE,
            resp_encr_type=self.ENCR_TYPE_PASSPHRASE)

    @test_tracker_info(uuid="01c49c2e-dc92-4a27-bb47-c4fc67617c23")
    @WifiBaseTest.wifi_test_wrap
    def test_negative_mismatch_pmk(self):
        """Data-path: failure when PMK mismatch"""
        self.run_mismatched_oob_data_path_test(
            init_encr_type=self.ENCR_TYPE_PMK,
            resp_encr_type=self.ENCR_TYPE_PMK)

    @test_tracker_info(uuid="4d651797-5fbb-408e-a4b6-a6e1944136da")
    @WifiBaseTest.wifi_test_wrap
    def test_negative_mismatch_open_passphrase(self):
        """Data-path: failure when initiator is open, and responder passphrase"""
        self.run_mismatched_oob_data_path_test(
            init_encr_type=self.ENCR_TYPE_OPEN,
            resp_encr_type=self.ENCR_TYPE_PASSPHRASE)

    @test_tracker_info(uuid="1ae697f4-5987-4187-aeef-1e22d07d4a7c")
    @WifiBaseTest.wifi_test_wrap
    def test_negative_mismatch_open_pmk(self):
        """Data-path: failure when initiator is open, and responder PMK"""
        self.run_mismatched_oob_data_path_test(
            init_encr_type=self.ENCR_TYPE_OPEN,
            resp_encr_type=self.ENCR_TYPE_PMK)

    @test_tracker_info(uuid="f027b1cc-0e7a-4075-b880-5e64b288afbd")
    @WifiBaseTest.wifi_test_wrap
    def test_negative_mismatch_pmk_passphrase(self):
        """Data-path: failure when initiator is pmk, and responder passphrase"""
        self.run_mismatched_oob_data_path_test(
            init_encr_type=self.ENCR_TYPE_PMK,
            resp_encr_type=self.ENCR_TYPE_PASSPHRASE)

    @test_tracker_info(uuid="0819bbd4-72ae-49c4-bd46-5448db2b0a06")
    @WifiBaseTest.wifi_test_wrap
    def test_negative_mismatch_passphrase_open(self):
        """Data-path: failure when initiator is passphrase, and responder open"""
        self.run_mismatched_oob_data_path_test(
            init_encr_type=self.ENCR_TYPE_PASSPHRASE,
            resp_encr_type=self.ENCR_TYPE_OPEN)

    @test_tracker_info(uuid="7ef24f62-8e6b-4732-88a3-80a43584dda4")
    @WifiBaseTest.wifi_test_wrap
    def test_negative_mismatch_pmk_open(self):
        """Data-path: failure when initiator is PMK, and responder open"""
        self.run_mismatched_oob_data_path_test(
            init_encr_type=self.ENCR_TYPE_PMK,
            resp_encr_type=self.ENCR_TYPE_OPEN)

    @test_tracker_info(uuid="7b9c9efc-1c06-465e-8a5e-d6a22ac1da97")
    @WifiBaseTest.wifi_test_wrap
    def test_negative_mismatch_passphrase_pmk(self):
        """Data-path: failure when initiator is passphrase, and responder pmk"""
        self.run_mismatched_oob_data_path_test(
            init_encr_type=self.ENCR_TYPE_PASSPHRASE,
            resp_encr_type=self.ENCR_TYPE_OPEN)

    ##########################################################################

    def wait_for_request_responses(self, dut, req_keys, aware_ifs, aware_ipv6):
        """Wait for network request confirmation for all request keys.

    Args:
      dut: Device under test
      req_keys: (in) A list of the network requests
      aware_ifs: (out) A list into which to append the network interface
      aware_ipv6: (out) A list into which to append the network ipv6 address
    """
        num_events = 0  # looking for 2 events per NDP: link-prop + net-cap
        while num_events != 2 * len(req_keys):
            event = autils.wait_for_event(
                dut,
                cconsts.EVENT_NETWORK_CALLBACK,
                timeout=autils.EVENT_NDP_TIMEOUT)
            if (event["data"][cconsts.NETWORK_CB_KEY_EVENT] ==
                    cconsts.NETWORK_CB_LINK_PROPERTIES_CHANGED):
                if event["data"][cconsts.NETWORK_CB_KEY_ID] in req_keys:
                    num_events = num_events + 1
                    aware_ifs.append(
                        event["data"][cconsts.NETWORK_CB_KEY_INTERFACE_NAME])
                else:
                    self.log.info(
                        "Received an unexpected connectivity, the revoked "
                        "network request probably went through -- %s", event)
            elif (event["data"][cconsts.NETWORK_CB_KEY_EVENT] ==
                  cconsts.NETWORK_CB_CAPABILITIES_CHANGED):
                if event["data"][cconsts.NETWORK_CB_KEY_ID] in req_keys:
                    num_events = num_events + 1
                    aware_ipv6.append(event["data"][aconsts.NET_CAP_IPV6])
                else:
                    self.log.info(
                        "Received an unexpected connectivity, the revoked "
                        "network request probably went through -- %s", event)
                # validate no leak of information
                asserts.assert_false(
                    cconsts.NETWORK_CB_KEY_NETWORK_SPECIFIER in event["data"],
                    "Network specifier leak!")

    @test_tracker_info(uuid="2e325e2b-d552-4890-b470-20b40284395d")
    @WifiBaseTest.wifi_test_wrap
    def test_multiple_identical_networks(self):
        """Validate that creating multiple networks between 2 devices, each network
    with identical configuration is supported over a single NDP.

    Verify that the interface and IPv6 address is the same for all networks.
    """
        init_dut = self.android_devices[0]
        init_dut.pretty_name = "Initiator"
        resp_dut = self.android_devices[1]
        resp_dut.pretty_name = "Responder"

        N = 2  # first iteration (must be 2 to give us a chance to cancel the first)
        M = 5  # second iteration

        init_ids = []
        resp_ids = []

        # Initiator+Responder: attach and wait for confirmation & identity
        # create N+M sessions to be used in the different (but identical) NDPs
        for i in range(N + M):
            id, init_mac = autils.attach_with_identity(init_dut)
            init_ids.append(id)
            id, resp_mac = autils.attach_with_identity(resp_dut)
            resp_ids.append(id)

        # wait for for devices to synchronize with each other - there are no other
        # mechanisms to make sure this happens for OOB discovery (except retrying
        # to execute the data-path request)
        time.sleep(autils.WAIT_FOR_CLUSTER)

        resp_req_keys = []
        init_req_keys = []
        resp_aware_ifs = []
        init_aware_ifs = []
        resp_aware_ipv6 = []
        init_aware_ipv6 = []

        # issue N quick requests for identical NDPs - without waiting for result
        # tests whether pre-setup multiple NDP procedure
        for i in range(N):
            # Responder: request network
            resp_req_keys.append(
                autils.request_network(
                    resp_dut,
                    resp_dut.droid.wifiAwareCreateNetworkSpecifierOob(
                        resp_ids[i], aconsts.DATA_PATH_RESPONDER, init_mac,
                        None)))

            # Initiator: request network
            init_req_keys.append(
                autils.request_network(
                    init_dut,
                    init_dut.droid.wifiAwareCreateNetworkSpecifierOob(
                        init_ids[i], aconsts.DATA_PATH_INITIATOR, resp_mac,
                        None)))

        # remove the first request (hopefully before completed) testing that NDP
        # is still created
        resp_dut.droid.connectivityUnregisterNetworkCallback(resp_req_keys[0])
        resp_req_keys.remove(resp_req_keys[0])
        init_dut.droid.connectivityUnregisterNetworkCallback(init_req_keys[0])
        init_req_keys.remove(init_req_keys[0])

        # wait for network formation for all initial requests
        # note: for IPv6 Init <--> Resp since each reports the other's IPv6 address
        #       in it's transport-specific network info
        self.wait_for_request_responses(resp_dut, resp_req_keys,
                                        resp_aware_ifs, init_aware_ipv6)
        self.wait_for_request_responses(init_dut, init_req_keys,
                                        init_aware_ifs, resp_aware_ipv6)

        # issue M more requests for the same NDPs - tests post-setup multiple NDP
        for i in range(M):
            # Responder: request network
            resp_req_keys.append(
                autils.request_network(
                    resp_dut,
                    resp_dut.droid.wifiAwareCreateNetworkSpecifierOob(
                        resp_ids[N + i], aconsts.DATA_PATH_RESPONDER, init_mac,
                        None)))

            # Initiator: request network
            init_req_keys.append(
                autils.request_network(
                    init_dut,
                    init_dut.droid.wifiAwareCreateNetworkSpecifierOob(
                        init_ids[N + i], aconsts.DATA_PATH_INITIATOR, resp_mac,
                        None)))

        # wait for network formation for all subsequent requests
        self.wait_for_request_responses(resp_dut, resp_req_keys[N - 1:],
                                        resp_aware_ifs, init_aware_ipv6)
        self.wait_for_request_responses(init_dut, init_req_keys[N - 1:],
                                        init_aware_ifs, resp_aware_ipv6)

        # determine whether all interfaces and ipv6 addresses are identical
        # (single NDP)
        init_aware_ifs = list(set(init_aware_ifs))
        resp_aware_ifs = list(set(resp_aware_ifs))
        init_aware_ipv6 = list(set(init_aware_ipv6))
        resp_aware_ipv6 = list(set(resp_aware_ipv6))

        self.log.info("Interface names: I=%s, R=%s", init_aware_ifs,
                      resp_aware_ifs)
        self.log.info("Interface IPv6: I=%s, R=%s", init_aware_ipv6,
                      resp_aware_ipv6)
        self.log.info("Initiator requests: %s", init_req_keys)
        self.log.info("Responder requests: %s", resp_req_keys)

        asserts.assert_equal(
            len(init_aware_ifs), 1, "Multiple initiator interfaces")
        asserts.assert_equal(
            len(resp_aware_ifs), 1, "Multiple responder interfaces")
        asserts.assert_equal(
            len(init_aware_ipv6), 1, "Multiple initiator IPv6 addresses")
        asserts.assert_equal(
            len(resp_aware_ipv6), 1, "Multiple responder IPv6 addresses")

        for i in range(
                init_dut.aware_capabilities[aconsts.CAP_MAX_NDI_INTERFACES]):
            # note: using get_ipv6_addr (ifconfig method) since want to verify
            # that interfaces which do not have any NDPs on them do not have
            # an IPv6 link-local address.
            if_name = "%s%d" % (aconsts.AWARE_NDI_PREFIX, i)
            init_ipv6 = autils.get_ipv6_addr(init_dut, if_name)
            resp_ipv6 = autils.get_ipv6_addr(resp_dut, if_name)

            asserts.assert_equal(
                init_ipv6 is None, if_name not in init_aware_ifs,
                "Initiator interface %s in unexpected state" % if_name)
            asserts.assert_equal(
                resp_ipv6 is None, if_name not in resp_aware_ifs,
                "Responder interface %s in unexpected state" % if_name)

        # release requests
        for resp_req_key in resp_req_keys:
            resp_dut.droid.connectivityUnregisterNetworkCallback(resp_req_key)
        for init_req_key in init_req_keys:
            init_dut.droid.connectivityUnregisterNetworkCallback(init_req_key)

    @test_tracker_info(uuid="34cf12e8-5df6-49bd-b384-e9935d89a5b7")
    @WifiBaseTest.wifi_test_wrap
    def test_identical_network_from_both_sides(self):
        """Validate that requesting two identical NDPs (Open) each being initiated
    from a different side, results in the same/single NDP.

    Verify that the interface and IPv6 address is the same for all networks.
    """
        dut1 = self.android_devices[0]
        dut2 = self.android_devices[1]

        id1, mac1 = autils.attach_with_identity(dut1)
        id2, mac2 = autils.attach_with_identity(dut2)

        # wait for for devices to synchronize with each other - there are no other
        # mechanisms to make sure this happens for OOB discovery (except retrying
        # to execute the data-path request)
        time.sleep(autils.WAIT_FOR_CLUSTER)

        # first NDP: DUT1 (Init) -> DUT2 (Resp)
        req_a_resp = autils.request_network(
            dut2,
            dut2.droid.wifiAwareCreateNetworkSpecifierOob(
                id2, aconsts.DATA_PATH_RESPONDER, mac1))

        req_a_init = autils.request_network(
            dut1,
            dut1.droid.wifiAwareCreateNetworkSpecifierOob(
                id1, aconsts.DATA_PATH_INITIATOR, mac2))

        req_a_resp_event_nc = autils.wait_for_event_with_keys(
            dut2, cconsts.EVENT_NETWORK_CALLBACK, autils.EVENT_NDP_TIMEOUT,
            (cconsts.NETWORK_CB_KEY_EVENT,
             cconsts.NETWORK_CB_CAPABILITIES_CHANGED),
            (cconsts.NETWORK_CB_KEY_ID, req_a_resp))
        req_a_init_event_nc = autils.wait_for_event_with_keys(
            dut1, cconsts.EVENT_NETWORK_CALLBACK, autils.EVENT_NDP_TIMEOUT,
            (cconsts.NETWORK_CB_KEY_EVENT,
             cconsts.NETWORK_CB_CAPABILITIES_CHANGED),
            (cconsts.NETWORK_CB_KEY_ID, req_a_init))

        # validate no leak of information
        asserts.assert_false(
            cconsts.NETWORK_CB_KEY_NETWORK_SPECIFIER in req_a_resp_event_nc[
                "data"], "Network specifier leak!")
        asserts.assert_false(
            cconsts.NETWORK_CB_KEY_NETWORK_SPECIFIER in req_a_init_event_nc[
                "data"], "Network specifier leak!")

        # note that Init <-> Resp since IPv6 are of peer's!
        req_a_ipv6_init = req_a_resp_event_nc["data"][aconsts.NET_CAP_IPV6]
        req_a_ipv6_resp = req_a_init_event_nc["data"][aconsts.NET_CAP_IPV6]

        req_a_resp_event_lp = autils.wait_for_event_with_keys(
            dut2, cconsts.EVENT_NETWORK_CALLBACK, autils.EVENT_NDP_TIMEOUT,
            (cconsts.NETWORK_CB_KEY_EVENT,
             cconsts.NETWORK_CB_LINK_PROPERTIES_CHANGED),
            (cconsts.NETWORK_CB_KEY_ID, req_a_resp))
        req_a_init_event_lp = autils.wait_for_event_with_keys(
            dut1, cconsts.EVENT_NETWORK_CALLBACK, autils.EVENT_NDP_TIMEOUT,
            (cconsts.NETWORK_CB_KEY_EVENT,
             cconsts.NETWORK_CB_LINK_PROPERTIES_CHANGED),
            (cconsts.NETWORK_CB_KEY_ID, req_a_init))

        req_a_if_resp = req_a_resp_event_lp["data"][
            cconsts.NETWORK_CB_KEY_INTERFACE_NAME]
        req_a_if_init = req_a_init_event_lp["data"][
            cconsts.NETWORK_CB_KEY_INTERFACE_NAME]

        self.log.info("Interface names for A: I=%s, R=%s", req_a_if_init,
                      req_a_if_resp)
        self.log.info("Interface addresses (IPv6) for A: I=%s, R=%s",
                      req_a_ipv6_init, req_a_ipv6_resp)

        # second NDP: DUT2 (Init) -> DUT1 (Resp)
        req_b_resp = autils.request_network(
            dut1,
            dut1.droid.wifiAwareCreateNetworkSpecifierOob(
                id1, aconsts.DATA_PATH_RESPONDER, mac2))

        req_b_init = autils.request_network(
            dut2,
            dut2.droid.wifiAwareCreateNetworkSpecifierOob(
                id2, aconsts.DATA_PATH_INITIATOR, mac1))

        req_b_resp_event_nc = autils.wait_for_event_with_keys(
            dut1, cconsts.EVENT_NETWORK_CALLBACK, autils.EVENT_NDP_TIMEOUT,
            (cconsts.NETWORK_CB_KEY_EVENT,
             cconsts.NETWORK_CB_CAPABILITIES_CHANGED),
            (cconsts.NETWORK_CB_KEY_ID, req_b_resp))
        req_b_init_event_nc = autils.wait_for_event_with_keys(
            dut2, cconsts.EVENT_NETWORK_CALLBACK, autils.EVENT_NDP_TIMEOUT,
            (cconsts.NETWORK_CB_KEY_EVENT,
             cconsts.NETWORK_CB_CAPABILITIES_CHANGED),
            (cconsts.NETWORK_CB_KEY_ID, req_b_init))

        # validate no leak of information
        asserts.assert_false(
            cconsts.NETWORK_CB_KEY_NETWORK_SPECIFIER in req_b_resp_event_nc[
                "data"], "Network specifier leak!")
        asserts.assert_false(
            cconsts.NETWORK_CB_KEY_NETWORK_SPECIFIER in req_b_init_event_nc[
                "data"], "Network specifier leak!")

        # note that Init <-> Resp since IPv6 are of peer's!
        req_b_ipv6_init = req_b_resp_event_nc["data"][aconsts.NET_CAP_IPV6]
        req_b_ipv6_resp = req_b_init_event_nc["data"][aconsts.NET_CAP_IPV6]

        req_b_resp_event_lp = autils.wait_for_event_with_keys(
            dut1, cconsts.EVENT_NETWORK_CALLBACK, autils.EVENT_NDP_TIMEOUT,
            (cconsts.NETWORK_CB_KEY_EVENT,
             cconsts.NETWORK_CB_LINK_PROPERTIES_CHANGED),
            (cconsts.NETWORK_CB_KEY_ID, req_b_resp))
        req_b_init_event_lp = autils.wait_for_event_with_keys(
            dut2, cconsts.EVENT_NETWORK_CALLBACK, autils.EVENT_NDP_TIMEOUT,
            (cconsts.NETWORK_CB_KEY_EVENT,
             cconsts.NETWORK_CB_LINK_PROPERTIES_CHANGED),
            (cconsts.NETWORK_CB_KEY_ID, req_b_init))

        req_b_if_resp = req_b_resp_event_lp["data"][
            cconsts.NETWORK_CB_KEY_INTERFACE_NAME]
        req_b_if_init = req_b_init_event_lp["data"][
            cconsts.NETWORK_CB_KEY_INTERFACE_NAME]

        self.log.info("Interface names for B: I=%s, R=%s", req_b_if_init,
                      req_b_if_resp)
        self.log.info("Interface addresses (IPv6) for B: I=%s, R=%s",
                      req_b_ipv6_init, req_b_ipv6_resp)

        # validate equality of NDPs (using interface names & ipv6)
        asserts.assert_equal(req_a_if_init, req_b_if_resp,
                             "DUT1 NDPs are on different interfaces")
        asserts.assert_equal(req_a_if_resp, req_b_if_init,
                             "DUT2 NDPs are on different interfaces")
        asserts.assert_equal(req_a_ipv6_init, req_b_ipv6_resp,
                             "DUT1 NDPs are using different IPv6 addresses")
        asserts.assert_equal(req_a_ipv6_resp, req_b_ipv6_init,
                             "DUT2 NDPs are using different IPv6 addresses")

        # release requests
        dut1.droid.connectivityUnregisterNetworkCallback(req_a_init)
        dut1.droid.connectivityUnregisterNetworkCallback(req_b_resp)
        dut2.droid.connectivityUnregisterNetworkCallback(req_a_resp)
        dut2.droid.connectivityUnregisterNetworkCallback(req_b_init)

    ########################################################################

    def run_multiple_ndi(self, sec_configs, flip_init_resp=False):
        """Validate that the device can create and use multiple NDIs.

    The security configuration can be:
    - None: open
    - String: passphrase
    - otherwise: PMK (byte array)

    Args:
      sec_configs: list of security configurations
      flip_init_resp: if True the roles of Initiator and Responder are flipped
                      between the 2 devices, otherwise same devices are always
                      configured in the same role.
    """
        dut1 = self.android_devices[0]
        dut2 = self.android_devices[1]

        asserts.skip_if(
            dut1.aware_capabilities[aconsts.CAP_MAX_NDI_INTERFACES] <
            len(sec_configs)
            or dut2.aware_capabilities[aconsts.CAP_MAX_NDI_INTERFACES] <
            len(sec_configs), "DUTs do not support enough NDIs")

        id1, mac1 = autils.attach_with_identity(dut1)
        id2, mac2 = autils.attach_with_identity(dut2)

        # wait for for devices to synchronize with each other - there are no other
        # mechanisms to make sure this happens for OOB discovery (except retrying
        # to execute the data-path request)
        time.sleep(autils.WAIT_FOR_CLUSTER)

        dut2_req_keys = []
        dut1_req_keys = []
        dut2_aware_ifs = []
        dut1_aware_ifs = []
        dut2_aware_ipv6s = []
        dut1_aware_ipv6s = []

        dut2_type = aconsts.DATA_PATH_RESPONDER
        dut1_type = aconsts.DATA_PATH_INITIATOR
        dut2_is_responder = True
        for sec in sec_configs:
            if dut2_is_responder:
                # DUT2 (Responder): request network
                dut2_req_key = autils.request_network(
                    dut2,
                    autils.get_network_specifier(dut2, id2, dut2_type, mac1,
                                                 sec))
                dut2_req_keys.append(dut2_req_key)

                # DUT1 (Initiator): request network
                dut1_req_key = autils.request_network(
                    dut1,
                    autils.get_network_specifier(dut1, id1, dut1_type, mac2,
                                                 sec))
                dut1_req_keys.append(dut1_req_key)
            else:
                # DUT1 (Responder): request network
                dut1_req_key = autils.request_network(
                    dut1,
                    autils.get_network_specifier(dut1, id1, dut1_type, mac2,
                                                 sec))
                dut1_req_keys.append(dut1_req_key)

                # DUT2 (Initiator): request network
                dut2_req_key = autils.request_network(
                    dut2,
                    autils.get_network_specifier(dut2, id2, dut2_type, mac1,
                                                 sec))
                dut2_req_keys.append(dut2_req_key)

            # Wait for network
            dut1_net_event_nc = autils.wait_for_event_with_keys(
                dut1, cconsts.EVENT_NETWORK_CALLBACK, autils.EVENT_NDP_TIMEOUT,
                (cconsts.NETWORK_CB_KEY_EVENT,
                 cconsts.NETWORK_CB_CAPABILITIES_CHANGED),
                (cconsts.NETWORK_CB_KEY_ID, dut1_req_key))
            dut2_net_event_nc = autils.wait_for_event_with_keys(
                dut2, cconsts.EVENT_NETWORK_CALLBACK, autils.EVENT_NDP_TIMEOUT,
                (cconsts.NETWORK_CB_KEY_EVENT,
                 cconsts.NETWORK_CB_CAPABILITIES_CHANGED),
                (cconsts.NETWORK_CB_KEY_ID, dut2_req_key))

            # validate no leak of information
            asserts.assert_false(
                cconsts.NETWORK_CB_KEY_NETWORK_SPECIFIER in dut1_net_event_nc[
                    "data"], "Network specifier leak!")
            asserts.assert_false(
                cconsts.NETWORK_CB_KEY_NETWORK_SPECIFIER in dut2_net_event_nc[
                    "data"], "Network specifier leak!")

            # Note: dut1 <--> dut2 IPv6's addresses since it is peer's info
            dut2_aware_ipv6 = dut1_net_event_nc["data"][aconsts.NET_CAP_IPV6]
            dut1_aware_ipv6 = dut2_net_event_nc["data"][aconsts.NET_CAP_IPV6]

            dut1_net_event_lp = autils.wait_for_event_with_keys(
                dut1, cconsts.EVENT_NETWORK_CALLBACK, autils.EVENT_NDP_TIMEOUT,
                (cconsts.NETWORK_CB_KEY_EVENT,
                 cconsts.NETWORK_CB_LINK_PROPERTIES_CHANGED),
                (cconsts.NETWORK_CB_KEY_ID, dut1_req_key))
            dut2_net_event_lp = autils.wait_for_event_with_keys(
                dut2, cconsts.EVENT_NETWORK_CALLBACK, autils.EVENT_NDP_TIMEOUT,
                (cconsts.NETWORK_CB_KEY_EVENT,
                 cconsts.NETWORK_CB_LINK_PROPERTIES_CHANGED),
                (cconsts.NETWORK_CB_KEY_ID, dut2_req_key))

            dut2_aware_if = dut2_net_event_lp["data"][
                cconsts.NETWORK_CB_KEY_INTERFACE_NAME]
            dut1_aware_if = dut1_net_event_lp["data"][
                cconsts.NETWORK_CB_KEY_INTERFACE_NAME]

            dut2_aware_ifs.append(dut2_aware_if)
            dut1_aware_ifs.append(dut1_aware_if)
            dut2_aware_ipv6s.append(dut2_aware_ipv6)
            dut1_aware_ipv6s.append(dut1_aware_ipv6)

            if flip_init_resp:
                if dut2_is_responder:
                    dut2_type = aconsts.DATA_PATH_INITIATOR
                    dut1_type = aconsts.DATA_PATH_RESPONDER
                else:
                    dut2_type = aconsts.DATA_PATH_RESPONDER
                    dut1_type = aconsts.DATA_PATH_INITIATOR
                dut2_is_responder = not dut2_is_responder

        # check that we are using 2 NDIs & that they have unique IPv6 addresses
        dut1_aware_ifs = list(set(dut1_aware_ifs))
        dut2_aware_ifs = list(set(dut2_aware_ifs))
        dut1_aware_ipv6s = list(set(dut1_aware_ipv6s))
        dut2_aware_ipv6s = list(set(dut2_aware_ipv6s))

        self.log.info("Interface names: DUT1=%s, DUT2=%s", dut1_aware_ifs,
                      dut2_aware_ifs)
        self.log.info("IPv6 addresses: DUT1=%s, DUT2=%s", dut1_aware_ipv6s,
                      dut2_aware_ipv6s)
        self.log.info("DUT1 requests: %s", dut1_req_keys)
        self.log.info("DUT2 requests: %s", dut2_req_keys)

        asserts.assert_equal(
            len(dut1_aware_ifs), len(sec_configs), "Multiple DUT1 interfaces")
        asserts.assert_equal(
            len(dut2_aware_ifs), len(sec_configs), "Multiple DUT2 interfaces")
        asserts.assert_equal(
            len(dut1_aware_ipv6s), len(sec_configs),
            "Multiple DUT1 IPv6 addresses")
        asserts.assert_equal(
            len(dut2_aware_ipv6s), len(sec_configs),
            "Multiple DUT2 IPv6 addresses")

        for i in range(len(sec_configs)):
            # note: using get_ipv6_addr (ifconfig method) since want to verify
            # that the system information is the same as the reported information
            if_name = "%s%d" % (aconsts.AWARE_NDI_PREFIX, i)
            dut1_ipv6 = autils.get_ipv6_addr(dut1, if_name)
            dut2_ipv6 = autils.get_ipv6_addr(dut2, if_name)

            asserts.assert_equal(
                dut1_ipv6 is None, if_name not in dut1_aware_ifs,
                "DUT1 interface %s in unexpected state" % if_name)
            asserts.assert_equal(
                dut2_ipv6 is None, if_name not in dut2_aware_ifs,
                "DUT2 interface %s in unexpected state" % if_name)

        # release requests
        for dut2_req_key in dut2_req_keys:
            dut2.droid.connectivityUnregisterNetworkCallback(dut2_req_key)
        for dut1_req_key in dut1_req_keys:
            dut1.droid.connectivityUnregisterNetworkCallback(dut1_req_key)

    @test_tracker_info(uuid="2d728163-11cc-46ba-a973-c8e1e71397fc")
    @WifiBaseTest.wifi_test_wrap
    def test_multiple_ndi_open_passphrase(self):
        """Verify that between 2 DUTs can create 2 NDPs with different security
    configuration (one open, one using passphrase). The result should use two
    different NDIs"""
        self.run_multiple_ndi([None, self.PASSPHRASE])

    @test_tracker_info(uuid="5f2c32aa-20b2-41f0-8b1e-d0b68df73ada")
    @WifiBaseTest.wifi_test_wrap
    def test_multiple_ndi_open_pmk(self):
        """Verify that between 2 DUTs can create 2 NDPs with different security
    configuration (one open, one using pmk). The result should use two
    different NDIs"""
        self.run_multiple_ndi([None, self.PMK])

    @test_tracker_info(uuid="34467659-bcfb-40cd-ba25-7e50560fca63")
    @WifiBaseTest.wifi_test_wrap
    def test_multiple_ndi_passphrase_pmk(self):
        """Verify that between 2 DUTs can create 2 NDPs with different security
    configuration (one using passphrase, one using pmk). The result should use
    two different NDIs"""
        self.run_multiple_ndi([self.PASSPHRASE, self.PMK])

    @test_tracker_info(uuid="d9194ce6-45b6-41b1-9cc8-ada79968966d")
    @WifiBaseTest.wifi_test_wrap
    def test_multiple_ndi_passphrases(self):
        """Verify that between 2 DUTs can create 2 NDPs with different security
    configuration (using different passphrases). The result should use two
    different NDIs"""
        self.run_multiple_ndi([self.PASSPHRASE, self.PASSPHRASE2])

    @test_tracker_info(uuid="879df795-62d2-40d4-a862-bd46d8f7e67f")
    @WifiBaseTest.wifi_test_wrap
    def test_multiple_ndi_pmks(self):
        """Verify that between 2 DUTs can create 2 NDPs with different security
    configuration (using different PMKS). The result should use two different
    NDIs"""
        self.run_multiple_ndi([self.PMK, self.PMK2])

    @test_tracker_info(uuid="397d380a-8e41-466e-9ccb-cf8f413d83ba")
    @WifiBaseTest.wifi_test_wrap
    def test_multiple_ndi_open_passphrase_flip(self):
        """Verify that between 2 DUTs can create 2 NDPs with different security
    configuration (one open, one using passphrase). The result should use two
    different NDIs.

    Flip Initiator and Responder roles.
    """
        self.run_multiple_ndi([None, self.PASSPHRASE], flip_init_resp=True)

    @test_tracker_info(uuid="b3a4300b-1514-4cb8-a814-9c2baa449700")
    @WifiBaseTest.wifi_test_wrap
    def test_multiple_ndi_open_pmk_flip(self):
        """Verify that between 2 DUTs can create 2 NDPs with different security
    configuration (one open, one using pmk). The result should use two
    different NDIs

    Flip Initiator and Responder roles.
    """
        self.run_multiple_ndi([None, self.PMK], flip_init_resp=True)

    @test_tracker_info(uuid="0bfea9e4-e57d-417f-8db4-245741e9bbd5")
    @WifiBaseTest.wifi_test_wrap
    def test_multiple_ndi_passphrase_pmk_flip(self):
        """Verify that between 2 DUTs can create 2 NDPs with different security
    configuration (one using passphrase, one using pmk). The result should use
    two different NDIs

    Flip Initiator and Responder roles.
    """
        self.run_multiple_ndi([self.PASSPHRASE, self.PMK], flip_init_resp=True)

    @test_tracker_info(uuid="74023483-5417-431b-a362-991ad4a03ab8")
    @WifiBaseTest.wifi_test_wrap
    def test_multiple_ndi_passphrases_flip(self):
        """Verify that between 2 DUTs can create 2 NDPs with different security
    configuration (using different passphrases). The result should use two
    different NDIs

    Flip Initiator and Responder roles.
    """
        self.run_multiple_ndi(
            [self.PASSPHRASE, self.PASSPHRASE2], flip_init_resp=True)

    @test_tracker_info(uuid="873b2d91-28a1-403f-ae9c-d756bb2f59ee")
    @WifiBaseTest.wifi_test_wrap
    def test_multiple_ndi_pmks_flip(self):
        """Verify that between 2 DUTs can create 2 NDPs with different security
    configuration (using different PMKS). The result should use two different
    NDIs

    Flip Initiator and Responder roles.
    """
        self.run_multiple_ndi([self.PMK, self.PMK2], flip_init_resp=True)

    #######################################

    @test_tracker_info(uuid="2f10a9df-7fbd-490d-a238-3523f47ab54c")
    @WifiBaseTest.wifi_test_wrap
    def test_ib_responder_any_usage(self):
        """Verify that configuring an in-band (Aware discovery) Responder to receive
    an NDP request from any peer is not permitted by current API level. Override
    API check to validate that possible (i.e. that failure at current API level
    is due to an API check and not some underlying failure).
    """

        # configure all devices to override API check and allow a Responder from ANY
        for ad in self.android_devices:
            autils.configure_ndp_allow_any_override(ad, True)
        self.run_ib_data_path_test(
            ptype=aconsts.PUBLISH_TYPE_UNSOLICITED,
            stype=aconsts.SUBSCRIBE_TYPE_PASSIVE,
            encr_type=self.ENCR_TYPE_OPEN,
            use_peer_id=False)

        # configure all devices to respect API check - i.e. disallow a Responder
        # from ANY
        for ad in self.android_devices:
            autils.configure_ndp_allow_any_override(ad, False)
        self.run_ib_data_path_test(
            ptype=aconsts.PUBLISH_TYPE_UNSOLICITED,
            stype=aconsts.SUBSCRIBE_TYPE_PASSIVE,
            encr_type=self.ENCR_TYPE_OPEN,
            use_peer_id=False,
            expect_failure=True)

    @test_tracker_info(uuid="5889cd41-0a72-4b7b-ab82-5b9168b9b5b8")
    @WifiBaseTest.wifi_test_wrap
    def test_oob_responder_any_usage(self):
        """Verify that configuring an out-of-band (Aware discovery) Responder to
    receive an NDP request from any peer is not permitted by current API level.
    Override API check to validate that possible (i.e. that failure at current
    API level is due to an API check and not some underlying failure).
    """

        # configure all devices to override API check and allow a Responder from ANY
        for ad in self.android_devices:
            autils.configure_ndp_allow_any_override(ad, True)
        self.run_oob_data_path_test(
            encr_type=self.ENCR_TYPE_OPEN, use_peer_id=False)

        # configure all devices to respect API check - i.e. disallow a Responder
        # from ANY
        for ad in self.android_devices:
            autils.configure_ndp_allow_any_override(ad, False)
        self.run_oob_data_path_test(
            encr_type=self.ENCR_TYPE_OPEN,
            use_peer_id=False,
            expect_failure=True)

    #######################################

    def run_multiple_regulatory_domains(self, use_ib, init_domain,
                                        resp_domain):
        """Verify that a data-path setup with two conflicting regulatory domains
    works (the result should be run in Channel 6 - but that is not tested).

    Args:
      use_ib: True to use in-band discovery, False to use out-of-band discovery.
      init_domain: The regulatory domain of the Initiator/Subscriber.
      resp_domain: The regulator domain of the Responder/Publisher.
    """
        init_dut = self.android_devices[0]
        resp_dut = self.android_devices[1]

        wutils.set_wifi_country_code(init_dut, init_domain)
        wutils.set_wifi_country_code(resp_dut, resp_domain)

        if use_ib:
            (resp_req_key, init_req_key, resp_aware_if, init_aware_if,
             resp_ipv6, init_ipv6) = autils.create_ib_ndp(
                 resp_dut, init_dut,
                 autils.create_discovery_config(
                     "GoogleTestXyz", aconsts.PUBLISH_TYPE_UNSOLICITED),
                 autils.create_discovery_config(
                     "GoogleTestXyz", aconsts.SUBSCRIBE_TYPE_PASSIVE),
                 self.device_startup_offset)
        else:
            (init_req_key, resp_req_key, init_aware_if, resp_aware_if,
             init_ipv6, resp_ipv6) = autils.create_oob_ndp(init_dut, resp_dut)

        self.log.info("Interface names: I=%s, R=%s", init_aware_if,
                      resp_aware_if)
        self.log.info("Interface addresses (IPv6): I=%s, R=%s", init_ipv6,
                      resp_ipv6)

        # clean-up
        resp_dut.droid.connectivityUnregisterNetworkCallback(resp_req_key)
        init_dut.droid.connectivityUnregisterNetworkCallback(init_req_key)

    @test_tracker_info(uuid="eff53739-35c5-47a6-81f0-d70b51d89c3b")
    @WifiBaseTest.wifi_test_wrap
    def test_multiple_regulator_domains_ib_us_jp(self):
        """Verify data-path setup across multiple regulator domains.

    - Uses in-band discovery
    - Subscriber=US, Publisher=JP
    """
        self.run_multiple_regulatory_domains(
            use_ib=True,
            init_domain=wutils.WifiEnums.CountryCode.US,
            resp_domain=wutils.WifiEnums.CountryCode.JAPAN)

    @test_tracker_info(uuid="19af47cc-3204-40ef-b50f-14cf7b89cf4a")
    @WifiBaseTest.wifi_test_wrap
    def test_multiple_regulator_domains_ib_jp_us(self):
        """Verify data-path setup across multiple regulator domains.

    - Uses in-band discovery
    - Subscriber=JP, Publisher=US
    """
        self.run_multiple_regulatory_domains(
            use_ib=True,
            init_domain=wutils.WifiEnums.CountryCode.JAPAN,
            resp_domain=wutils.WifiEnums.CountryCode.US)

    @test_tracker_info(uuid="65285ab3-977f-4dbd-b663-d5a02f4fc663")
    @WifiBaseTest.wifi_test_wrap
    def test_multiple_regulator_domains_oob_us_jp(self):
        """Verify data-path setup across multiple regulator domains.

    - Uses out-f-band discovery
    - Initiator=US, Responder=JP
    """
        self.run_multiple_regulatory_domains(
            use_ib=False,
            init_domain=wutils.WifiEnums.CountryCode.US,
            resp_domain=wutils.WifiEnums.CountryCode.JAPAN)

    @test_tracker_info(uuid="8a417e24-aaf6-44b9-a089-a07c3ba8d954")
    @WifiBaseTest.wifi_test_wrap
    def test_multiple_regulator_domains_oob_jp_us(self):
        """Verify data-path setup across multiple regulator domains.

    - Uses out-of-band discovery
    - Initiator=JP, Responder=US
    """
        self.run_multiple_regulatory_domains(
            use_ib=False,
            init_domain=wutils.WifiEnums.CountryCode.JAPAN,
            resp_domain=wutils.WifiEnums.CountryCode.US)

    ########################################################################

    def run_mix_ib_oob(self, same_request, ib_first, inits_on_same_dut):
        """Validate that multiple network requests issued using both in-band and
    out-of-band discovery behave as expected.

    The same_request parameter controls whether identical single NDP is
    expected, if True, or whether multiple NDPs on different NDIs are expected,
    if False.

    Args:
      same_request: Issue canonically identical requests (same NMI peer, same
                    passphrase) if True, if False use different passphrases.
      ib_first: If True then the in-band network is requested first, otherwise
                (if False) then the out-of-band network is requested first.
      inits_on_same_dut: If True then the Initiators are run on the same device,
                         otherwise (if False) then the Initiators are run on
                         different devices. Note that Subscribe == Initiator.
    """
        if not same_request:
            asserts.skip_if(
                self.android_devices[0]
                .aware_capabilities[aconsts.CAP_MAX_NDI_INTERFACES] < 2
                or self.android_devices[1]
                .aware_capabilities[aconsts.CAP_MAX_NDI_INTERFACES] < 2,
                "DUTs do not support enough NDIs")

        (p_dut, s_dut, p_id, s_id, p_disc_id, s_disc_id, peer_id_on_sub,
         peer_id_on_pub_null) = self.set_up_discovery(
             aconsts.PUBLISH_TYPE_UNSOLICITED, aconsts.SUBSCRIBE_TYPE_PASSIVE,
             False)

        p_id2, p_mac = autils.attach_with_identity(p_dut)
        s_id2, s_mac = autils.attach_with_identity(s_dut)

        if inits_on_same_dut:
            resp_dut = p_dut
            resp_id = p_id2
            resp_mac = p_mac

            init_dut = s_dut
            init_id = s_id2
            init_mac = s_mac
        else:
            resp_dut = s_dut
            resp_id = s_id2
            resp_mac = s_mac

            init_dut = p_dut
            init_id = p_id2
            init_mac = p_mac

        passphrase = None if same_request else self.PASSPHRASE

        if ib_first:
            # request in-band network (to completion)
            p_req_key = self.request_network(
                p_dut,
                p_dut.droid.wifiAwareCreateNetworkSpecifier(p_disc_id, None))
            s_req_key = self.request_network(
                s_dut,
                s_dut.droid.wifiAwareCreateNetworkSpecifier(
                    s_disc_id, peer_id_on_sub))

            # Publisher & Subscriber: wait for network formation
            p_net_event_nc = autils.wait_for_event_with_keys(
                p_dut, cconsts.EVENT_NETWORK_CALLBACK,
                autils.EVENT_NDP_TIMEOUT,
                (cconsts.NETWORK_CB_KEY_EVENT,
                 cconsts.NETWORK_CB_CAPABILITIES_CHANGED),
                (cconsts.NETWORK_CB_KEY_ID, p_req_key))
            s_net_event_nc = autils.wait_for_event_with_keys(
                s_dut, cconsts.EVENT_NETWORK_CALLBACK,
                autils.EVENT_NDP_TIMEOUT,
                (cconsts.NETWORK_CB_KEY_EVENT,
                 cconsts.NETWORK_CB_CAPABILITIES_CHANGED),
                (cconsts.NETWORK_CB_KEY_ID, s_req_key))
            p_net_event_lp = autils.wait_for_event_with_keys(
                p_dut, cconsts.EVENT_NETWORK_CALLBACK,
                autils.EVENT_NDP_TIMEOUT,
                (cconsts.NETWORK_CB_KEY_EVENT,
                 cconsts.NETWORK_CB_LINK_PROPERTIES_CHANGED),
                (cconsts.NETWORK_CB_KEY_ID, p_req_key))
            s_net_event_lp = autils.wait_for_event_with_keys(
                s_dut, cconsts.EVENT_NETWORK_CALLBACK,
                autils.EVENT_NDP_TIMEOUT,
                (cconsts.NETWORK_CB_KEY_EVENT,
                 cconsts.NETWORK_CB_LINK_PROPERTIES_CHANGED),
                (cconsts.NETWORK_CB_KEY_ID, s_req_key))

            # validate no leak of information
            asserts.assert_false(
                cconsts.NETWORK_CB_KEY_NETWORK_SPECIFIER in p_net_event_nc[
                    "data"], "Network specifier leak!")
            asserts.assert_false(
                cconsts.NETWORK_CB_KEY_NETWORK_SPECIFIER in s_net_event_nc[
                    "data"], "Network specifier leak!")

        # request out-of-band network
        resp_req_key = autils.request_network(
            resp_dut,
            resp_dut.droid.wifiAwareCreateNetworkSpecifierOob(
                resp_id, aconsts.DATA_PATH_RESPONDER, init_mac, passphrase))
        init_req_key = autils.request_network(
            init_dut,
            init_dut.droid.wifiAwareCreateNetworkSpecifierOob(
                init_id, aconsts.DATA_PATH_INITIATOR, resp_mac, passphrase))

        resp_net_event_nc = autils.wait_for_event_with_keys(
            resp_dut, cconsts.EVENT_NETWORK_CALLBACK, autils.EVENT_NDP_TIMEOUT,
            (cconsts.NETWORK_CB_KEY_EVENT,
             cconsts.NETWORK_CB_CAPABILITIES_CHANGED),
            (cconsts.NETWORK_CB_KEY_ID, resp_req_key))
        init_net_event_nc = autils.wait_for_event_with_keys(
            init_dut, cconsts.EVENT_NETWORK_CALLBACK, autils.EVENT_NDP_TIMEOUT,
            (cconsts.NETWORK_CB_KEY_EVENT,
             cconsts.NETWORK_CB_CAPABILITIES_CHANGED),
            (cconsts.NETWORK_CB_KEY_ID, init_req_key))
        resp_net_event_lp = autils.wait_for_event_with_keys(
            resp_dut, cconsts.EVENT_NETWORK_CALLBACK, autils.EVENT_NDP_TIMEOUT,
            (cconsts.NETWORK_CB_KEY_EVENT,
             cconsts.NETWORK_CB_LINK_PROPERTIES_CHANGED),
            (cconsts.NETWORK_CB_KEY_ID, resp_req_key))
        init_net_event_lp = autils.wait_for_event_with_keys(
            init_dut, cconsts.EVENT_NETWORK_CALLBACK, autils.EVENT_NDP_TIMEOUT,
            (cconsts.NETWORK_CB_KEY_EVENT,
             cconsts.NETWORK_CB_LINK_PROPERTIES_CHANGED),
            (cconsts.NETWORK_CB_KEY_ID, init_req_key))

        # validate no leak of information
        asserts.assert_false(
            cconsts.NETWORK_CB_KEY_NETWORK_SPECIFIER in resp_net_event_nc[
                "data"], "Network specifier leak!")
        asserts.assert_false(
            cconsts.NETWORK_CB_KEY_NETWORK_SPECIFIER in init_net_event_nc[
                "data"], "Network specifier leak!")

        if not ib_first:
            # request in-band network (to completion)
            p_req_key = self.request_network(
                p_dut,
                p_dut.droid.wifiAwareCreateNetworkSpecifier(p_disc_id, None))
            s_req_key = self.request_network(
                s_dut,
                s_dut.droid.wifiAwareCreateNetworkSpecifier(
                    s_disc_id, peer_id_on_sub))

            # Publisher & Subscriber: wait for network formation
            p_net_event_nc = autils.wait_for_event_with_keys(
                p_dut, cconsts.EVENT_NETWORK_CALLBACK,
                autils.EVENT_NDP_TIMEOUT,
                (cconsts.NETWORK_CB_KEY_EVENT,
                 cconsts.NETWORK_CB_CAPABILITIES_CHANGED),
                (cconsts.NETWORK_CB_KEY_ID, p_req_key))
            s_net_event_nc = autils.wait_for_event_with_keys(
                s_dut, cconsts.EVENT_NETWORK_CALLBACK,
                autils.EVENT_NDP_TIMEOUT,
                (cconsts.NETWORK_CB_KEY_EVENT,
                 cconsts.NETWORK_CB_CAPABILITIES_CHANGED),
                (cconsts.NETWORK_CB_KEY_ID, s_req_key))
            p_net_event_lp = autils.wait_for_event_with_keys(
                p_dut, cconsts.EVENT_NETWORK_CALLBACK,
                autils.EVENT_NDP_TIMEOUT,
                (cconsts.NETWORK_CB_KEY_EVENT,
                 cconsts.NETWORK_CB_LINK_PROPERTIES_CHANGED),
                (cconsts.NETWORK_CB_KEY_ID, p_req_key))
            s_net_event_lp = autils.wait_for_event_with_keys(
                s_dut, cconsts.EVENT_NETWORK_CALLBACK,
                autils.EVENT_NDP_TIMEOUT,
                (cconsts.NETWORK_CB_KEY_EVENT,
                 cconsts.NETWORK_CB_LINK_PROPERTIES_CHANGED),
                (cconsts.NETWORK_CB_KEY_ID, s_req_key))

            # validate no leak of information
            asserts.assert_false(
                cconsts.NETWORK_CB_KEY_NETWORK_SPECIFIER in p_net_event_nc[
                    "data"], "Network specifier leak!")
            asserts.assert_false(
                cconsts.NETWORK_CB_KEY_NETWORK_SPECIFIER in s_net_event_nc[
                    "data"], "Network specifier leak!")

        # note that Init <-> Resp & Pub <--> Sub since IPv6 are of peer's!
        init_ipv6 = resp_net_event_nc["data"][aconsts.NET_CAP_IPV6]
        resp_ipv6 = init_net_event_nc["data"][aconsts.NET_CAP_IPV6]
        pub_ipv6 = s_net_event_nc["data"][aconsts.NET_CAP_IPV6]
        sub_ipv6 = p_net_event_nc["data"][aconsts.NET_CAP_IPV6]

        # extract net info
        pub_interface = p_net_event_lp["data"][
            cconsts.NETWORK_CB_KEY_INTERFACE_NAME]
        sub_interface = s_net_event_lp["data"][
            cconsts.NETWORK_CB_KEY_INTERFACE_NAME]
        resp_interface = resp_net_event_lp["data"][
            cconsts.NETWORK_CB_KEY_INTERFACE_NAME]
        init_interface = init_net_event_lp["data"][
            cconsts.NETWORK_CB_KEY_INTERFACE_NAME]

        self.log.info("Interface names: Pub=%s, Sub=%s, Resp=%s, Init=%s",
                      pub_interface, sub_interface, resp_interface,
                      init_interface)
        self.log.info(
            "Interface addresses (IPv6): Pub=%s, Sub=%s, Resp=%s, Init=%s",
            pub_ipv6, sub_ipv6, resp_ipv6, init_ipv6)

        # validate NDP/NDI conditions (using interface names & ipv6)
        if same_request:
            asserts.assert_equal(
                pub_interface, resp_interface if inits_on_same_dut else
                init_interface, "NDP interfaces don't match on Pub/other")
            asserts.assert_equal(
                sub_interface, init_interface if inits_on_same_dut else
                resp_interface, "NDP interfaces don't match on Sub/other")

            asserts.assert_equal(pub_ipv6, resp_ipv6
                                 if inits_on_same_dut else init_ipv6,
                                 "NDP IPv6 don't match on Pub/other")
            asserts.assert_equal(sub_ipv6, init_ipv6
                                 if inits_on_same_dut else resp_ipv6,
                                 "NDP IPv6 don't match on Sub/other")
        else:
            asserts.assert_false(
                pub_interface == (resp_interface
                                  if inits_on_same_dut else init_interface),
                "NDP interfaces match on Pub/other")
            asserts.assert_false(
                sub_interface == (init_interface
                                  if inits_on_same_dut else resp_interface),
                "NDP interfaces match on Sub/other")

            asserts.assert_false(
                pub_ipv6 == (resp_ipv6 if inits_on_same_dut else init_ipv6),
                "NDP IPv6 match on Pub/other")
            asserts.assert_false(
                sub_ipv6 == (init_ipv6 if inits_on_same_dut else resp_ipv6),
                "NDP IPv6 match on Sub/other")

        # release requests
        p_dut.droid.connectivityUnregisterNetworkCallback(p_req_key)
        s_dut.droid.connectivityUnregisterNetworkCallback(s_req_key)
        resp_dut.droid.connectivityUnregisterNetworkCallback(resp_req_key)
        init_dut.droid.connectivityUnregisterNetworkCallback(init_req_key)

    @test_tracker_info(uuid="d8a0839d-4ba0-43f2-af93-3cf1382f9f16")
    @WifiBaseTest.wifi_test_wrap
    def test_identical_ndps_mix_ib_oob_ib_first_same_polarity(self):
        """Validate that a single NDP is created for multiple identical requests
    which are issued through either in-band (ib) or out-of-band (oob) APIs.

    The in-band request is issued first. Both Initiators (Sub == Initiator) are
    run on the same device.
    """
        self.run_mix_ib_oob(
            same_request=True, ib_first=True, inits_on_same_dut=True)

    @test_tracker_info(uuid="70bbb811-0bed-4a19-96b3-f2446e777c8a")
    @WifiBaseTest.wifi_test_wrap
    def test_identical_ndps_mix_ib_oob_oob_first_same_polarity(self):
        """Validate that a single NDP is created for multiple identical requests
    which are issued through either in-band (ib) or out-of-band (oob) APIs.

    The out-of-band request is issued first. Both Initiators (Sub == Initiator)
    are run on the same device.
    """
        self.run_mix_ib_oob(
            same_request=True, ib_first=False, inits_on_same_dut=True)

    @test_tracker_info(uuid="d9796da5-f96a-4a51-be0f-89d6f5bfe3ad")
    @WifiBaseTest.wifi_test_wrap
    def test_identical_ndps_mix_ib_oob_ib_first_diff_polarity(self):
        """Validate that a single NDP is created for multiple identical requests
    which are issued through either in-band (ib) or out-of-band (oob) APIs.

    The in-band request is issued first. Initiators (Sub == Initiator) are
    run on different devices.
    """
        self.run_mix_ib_oob(
            same_request=True, ib_first=True, inits_on_same_dut=False)

    @test_tracker_info(uuid="48b9005b-7851-4222-b41c-1fcbefbc704d")
    @WifiBaseTest.wifi_test_wrap
    def test_identical_ndps_mix_ib_oob_oob_first_diff_polarity(self):
        """Validate that a single NDP is created for multiple identical requests
    which are issued through either in-band (ib) or out-of-band (oob) APIs.

    The out-of-band request is issued first. Initiators (Sub == Initiator) are
    run on different devices.
    """
        self.run_mix_ib_oob(
            same_request=True, ib_first=False, inits_on_same_dut=False)

    @test_tracker_info(uuid="51f9581e-c5ee-48a7-84d2-adff4876c3d7")
    @WifiBaseTest.wifi_test_wrap
    def test_multiple_ndis_mix_ib_oob_ib_first_same_polarity(self):
        """Validate that multiple NDIs are created for NDPs which are requested with
    different security configurations. Use a mix of in-band and out-of-band APIs
    to request the different NDPs.

    The in-band request is issued first. Initiators (Sub == Initiator) are
    run on the same device.
    """
        self.run_mix_ib_oob(
            same_request=False, ib_first=True, inits_on_same_dut=True)

    @test_tracker_info(uuid="b1e3070e-4d38-4b31-862d-39b82e0f2853")
    @WifiBaseTest.wifi_test_wrap
    def test_multiple_ndis_mix_ib_oob_oob_first_same_polarity(self):
        """Validate that multiple NDIs are created for NDPs which are requested with
    different security configurations. Use a mix of in-band and out-of-band APIs
    to request the different NDPs.

    The out-of-band request is issued first. Initiators (Sub == Initiator) are
    run on the same device.
    """
        self.run_mix_ib_oob(
            same_request=False, ib_first=False, inits_on_same_dut=True)

    @test_tracker_info(uuid="b1e3070e-4d38-4b31-862d-39b82e0f2853")
    @WifiBaseTest.wifi_test_wrap
    def test_multiple_ndis_mix_ib_oob_ib_first_diff_polarity(self):
        """Validate that multiple NDIs are created for NDPs which are requested with
    different security configurations. Use a mix of in-band and out-of-band APIs
    to request the different NDPs.

    The in-band request is issued first. Initiators (Sub == Initiator) are
    run on different devices.
    """
        self.run_mix_ib_oob(
            same_request=False, ib_first=True, inits_on_same_dut=False)

    @test_tracker_info(uuid="596caadf-028e-494b-bbce-8304ccec2cbb")
    @WifiBaseTest.wifi_test_wrap
    def test_multiple_ndis_mix_ib_oob_oob_first_diff_polarity(self):
        """Validate that multiple NDIs are created for NDPs which are requested with
    different security configurations. Use a mix of in-band and out-of-band APIs
    to request the different NDPs.

    The out-of-band request is issued first. Initiators (Sub == Initiator) are
    run on different devices.
    """
        self.run_mix_ib_oob(
            same_request=False, ib_first=False, inits_on_same_dut=False)

    ########################################################################

    @test_tracker_info(uuid="5ec10bf9-bfda-4093-8344-7ccc7764737e")
    def test_ndp_loop(self):
        """Validate that can create a loop (chain) of N NDPs between N devices,
    where N >= 3, e.g.

    A - B
    B - C
    C - A

    The NDPs are all OPEN (no encryption).
    """
        asserts.skip_if(
            len(self.android_devices) < 3,
            'A minimum of 3 devices is needed to run the test, have %d' % len(
                self.android_devices))

        duts = self.android_devices
        loop_len = len(duts)
        ids = []
        macs = []
        reqs = []
        ifs = []
        ipv6s = []

        for i in range(loop_len):
            duts[i].pretty_name = chr(ord("A") + i)
            reqs.append([])
            ifs.append([])
            ipv6s.append([])

        # start-up 3 devices (attach w/ identity)
        for i in range(loop_len):
            ids.append(duts[i].droid.wifiAwareAttach(True))
            autils.wait_for_event(duts[i], aconsts.EVENT_CB_ON_ATTACHED)
            ident_event = autils.wait_for_event(
                duts[i], aconsts.EVENT_CB_ON_IDENTITY_CHANGED)
            macs.append(ident_event['data']['mac'])

        # wait for for devices to synchronize with each other - there are no other
        # mechanisms to make sure this happens for OOB discovery (except retrying
        # to execute the data-path request)
        time.sleep(autils.WAIT_FOR_CLUSTER)

        # create the N NDPs: i to (i+1) % N
        for i in range(loop_len):
            peer_device = (i + 1) % loop_len

            (init_req_key, resp_req_key, init_aware_if, resp_aware_if,
             init_ipv6, resp_ipv6) = autils.create_oob_ndp_on_sessions(
                 duts[i], duts[peer_device], ids[i], macs[i], ids[peer_device],
                 macs[peer_device])

            reqs[i].append(init_req_key)
            reqs[peer_device].append(resp_req_key)
            ifs[i].append(init_aware_if)
            ifs[peer_device].append(resp_aware_if)
            ipv6s[i].append(init_ipv6)
            ipv6s[peer_device].append(resp_ipv6)

        # clean-up
        for i in range(loop_len):
            for req in reqs[i]:
                duts[i].droid.connectivityUnregisterNetworkCallback(req)

        # info
        self.log.info("MACs: %s", macs)
        self.log.info("Interface names: %s", ifs)
        self.log.info("IPv6 addresses: %s", ipv6s)
        asserts.explicit_pass(
            "NDP loop test", extras={
                "macs": macs,
                "ifs": ifs,
                "ipv6s": ipv6s
            })
