# hwsim testing utilities
# Copyright (c) 2013-2014, Jouni Malinen <j@w1.fi>
#
# This software may be distributed under the terms of the BSD license.
# See README for more details.

import os
import subprocess
import time
import logging
logger = logging.getLogger()

def test_connectivity(ifname1, ifname2, dscp=None, tos=None, max_tries=1):
    if os.path.isfile("../../mac80211_hwsim/tools/hwsim_test"):
        hwsim_test = "../../mac80211_hwsim/tools/hwsim_test"
    else:
        hwsim_test = "hwsim_test"
    cmd = ["sudo",
           hwsim_test,
           ifname1,
           ifname2]
    if dscp:
        cmd.append('-D')
        cmd.append(str(dscp))
    elif tos:
        cmd.append('-t')
        cmd.append(str(tos))
    success = False
    for i in range(0, max_tries):
        try:
            s = subprocess.check_output(cmd)
            logger.debug(s)
            success = True
            break
        except subprocess.CalledProcessError, e:
            logger.info("hwsim failed: " + str(e.returncode))
            logger.info(e.output)
            if i + 1 < max_tries:
                time.sleep(1)
    if not success:
        raise Exception("hwsim_test failed")

def test_connectivity_p2p(dev1, dev2, dscp=None, tos=None):
    ifname1 = dev1.group_ifname if dev1.group_ifname else dev1.ifname
    ifname2 = dev2.group_ifname if dev2.group_ifname else dev2.ifname
    test_connectivity(ifname1, ifname2, dscp, tos)

def test_connectivity_p2p_sta(dev1, dev2, dscp=None, tos=None):
    ifname1 = dev1.group_ifname if dev1.group_ifname else dev1.ifname
    ifname2 = dev2.ifname
    test_connectivity(ifname1, ifname2, dscp, tos)

def test_connectivity_sta(dev1, dev2, dscp=None, tos=None):
    ifname1 = dev1.ifname
    ifname2 = dev2.ifname
    test_connectivity(ifname1, ifname2, dscp, tos)
