# P2P vendor specific extension tests
# Copyright (c) 2014-2015, Qualcomm Atheros, Inc.
#
# This software may be distributed under the terms of the BSD license.
# See README for more details.

import logging
logger = logging.getLogger()
import os

from tshark import run_tshark
from test_p2p_persistent import form

def test_p2p_ext_discovery(dev):
    """P2P device discovery with vendor specific extensions"""
    addr0 = dev[0].p2p_dev_addr()
    addr1 = dev[1].p2p_dev_addr()

    try:
        if "OK" not in dev[0].request("VENDOR_ELEM_ADD 1 dd050011223344"):
            raise Exception("VENDOR_ELEM_ADD failed")
        res = dev[0].request("VENDOR_ELEM_GET 1")
        if res != "dd050011223344":
            raise Exception("Unexpected VENDOR_ELEM_GET result: " + res)
        if "OK" not in dev[0].request("VENDOR_ELEM_ADD 1 dd06001122335566"):
            raise Exception("VENDOR_ELEM_ADD failed")
        res = dev[0].request("VENDOR_ELEM_GET 1")
        if res != "dd050011223344dd06001122335566":
            raise Exception("Unexpected VENDOR_ELEM_GET result(2): " + res)
        res = dev[0].request("VENDOR_ELEM_GET 2")
        if res != "":
            raise Exception("Unexpected VENDOR_ELEM_GET result(3): " + res)
        if "OK" not in dev[0].request("VENDOR_ELEM_REMOVE 1 dd050011223344"):
            raise Exception("VENDOR_ELEM_REMOVE failed")
        res = dev[0].request("VENDOR_ELEM_GET 1")
        if res != "dd06001122335566":
            raise Exception("Unexpected VENDOR_ELEM_GET result(4): " + res)
        if "OK" not in dev[0].request("VENDOR_ELEM_REMOVE 1 dd06001122335566"):
            raise Exception("VENDOR_ELEM_REMOVE failed")
        res = dev[0].request("VENDOR_ELEM_GET 1")
        if res != "":
            raise Exception("Unexpected VENDOR_ELEM_GET result(5): " + res)
        if "OK" not in dev[0].request("VENDOR_ELEM_ADD 1 dd050011223344dd06001122335566"):
            raise Exception("VENDOR_ELEM_ADD failed(2)")

        if "FAIL" not in dev[0].request("VENDOR_ELEM_REMOVE 1 dd051122334455"):
            raise Exception("Unexpected VENDOR_ELEM_REMOVE success")
        if "FAIL" not in dev[0].request("VENDOR_ELEM_REMOVE 1 dd"):
            raise Exception("Unexpected VENDOR_ELEM_REMOVE success(2)")
        if "FAIL" not in dev[0].request("VENDOR_ELEM_ADD 1 ddff"):
            raise Exception("Unexpected VENDOR_ELEM_ADD success(3)")

        dev[0].p2p_listen()
        if not dev[1].discover_peer(addr0):
            raise Exception("Device discovery timed out")
        if not dev[0].discover_peer(addr1):
            raise Exception("Device discovery timed out")

        peer = dev[1].get_peer(addr0)
        if peer['vendor_elems'] != "dd050011223344dd06001122335566":
            raise Exception("Vendor elements not reported correctly")

        res = dev[0].request("VENDOR_ELEM_GET 1")
        if res != "dd050011223344dd06001122335566":
            raise Exception("Unexpected VENDOR_ELEM_GET result(6): " + res)
        if "OK" not in dev[0].request("VENDOR_ELEM_REMOVE 1 dd06001122335566"):
            raise Exception("VENDOR_ELEM_REMOVE failed")
        res = dev[0].request("VENDOR_ELEM_GET 1")
        if res != "dd050011223344":
            raise Exception("Unexpected VENDOR_ELEM_GET result(7): " + res)
    finally:
        dev[0].request("VENDOR_ELEM_REMOVE 1 *")

def test_p2p_ext_discovery_go(dev):
    """P2P device discovery with vendor specific extensions for GO"""
    addr0 = dev[0].p2p_dev_addr()
    addr1 = dev[1].p2p_dev_addr()

    try:
        if "OK" not in dev[0].request("VENDOR_ELEM_ADD 2 dd050011223344dd06001122335566"):
            raise Exception("VENDOR_ELEM_ADD failed")
        if "OK" not in dev[0].request("VENDOR_ELEM_ADD 3 dd050011223344dd06001122335566"):
            raise Exception("VENDOR_ELEM_ADD failed")
        if "OK" not in dev[0].request("VENDOR_ELEM_ADD 12 dd050011223344dd06001122335566"):
            raise Exception("VENDOR_ELEM_ADD failed")

        dev[0].p2p_start_go(freq="2412")
        if not dev[1].discover_peer(addr0):
            raise Exception("Device discovery timed out")
        peer = dev[1].get_peer(addr0)
        if peer['vendor_elems'] != "dd050011223344dd06001122335566":
            print peer['vendor_elems']
            raise Exception("Vendor elements not reported correctly")
    finally:
        dev[0].request("VENDOR_ELEM_REMOVE 2 *")
        dev[0].request("VENDOR_ELEM_REMOVE 3 *")
        dev[0].request("VENDOR_ELEM_REMOVE 12 *")

def test_p2p_ext_vendor_elem_probe_req(dev):
    """VENDOR_ELEM in P2P Probe Request frames"""
    try:
        _test_p2p_ext_vendor_elem_probe_req(dev)
    finally:
        dev[0].request("VENDOR_ELEM_REMOVE 0 *")

def _test_p2p_ext_vendor_elem_probe_req(dev):
    addr1 = dev[1].p2p_dev_addr()
    if "OK" not in dev[0].request("VENDOR_ELEM_ADD 0 dd050011223300"):
        raise Exception("VENDOR_ELEM_ADD failed")
    dev[1].p2p_listen()
    if not dev[0].discover_peer(addr1):
        raise Exception("Device discovery timed out")
    if "FAIL" in dev[1].request("SET ext_mgmt_frame_handling 1"):
        raise Exception("Failed to enable external management frame handling")
    ev = dev[1].wait_event(["MGMT-RX"], timeout=5)
    if ev is None:
        raise Exception("MGMT-RX timeout")
    if " 40" not in ev:
        raise Exception("Not a Probe Request frame")
    if "dd050011223300" not in ev:
        raise Exception("Vendor element not found from Probe Request frame")
    dev[0].p2p_stop_find()
    dev[1].p2p_stop_find()

def test_p2p_ext_vendor_elem_pd_req(dev):
    """VENDOR_ELEM in PD Request frames"""
    try:
        _test_p2p_ext_vendor_elem_pd_req(dev)
    finally:
        dev[0].request("VENDOR_ELEM_REMOVE 4 *")

def _test_p2p_ext_vendor_elem_pd_req(dev):
    addr0 = dev[0].p2p_dev_addr()
    addr1 = dev[1].p2p_dev_addr()
    if "OK" not in dev[0].request("VENDOR_ELEM_ADD 4 dd050011223301"):
        raise Exception("VENDOR_ELEM_ADD failed")
    dev[1].p2p_listen()
    if not dev[0].discover_peer(addr1):
        raise Exception("Device discovery timed out")
    dev[0].p2p_stop_find()
    if "FAIL" in dev[1].request("SET ext_mgmt_frame_handling 1"):
        raise Exception("Failed to enable external management frame handling")
    dev[0].global_request("P2P_PROV_DISC " + addr1 + " display")
    for i in range(5):
        ev = dev[1].wait_event(["MGMT-RX"], timeout=5)
        if ev is None:
            raise Exception("MGMT-RX timeout")
        if " d0" in ev:
            break
    if "dd050011223301" not in ev:
        raise Exception("Vendor element not found from PD Request frame")
    dev[1].p2p_stop_find()
    dev[0].p2p_stop_find()

def test_p2p_ext_vendor_elem_pd_resp(dev):
    """VENDOR_ELEM in PD Response frames"""
    try:
        _test_p2p_ext_vendor_elem_pd_resp(dev)
    finally:
        dev[0].request("VENDOR_ELEM_REMOVE 5 *")

def _test_p2p_ext_vendor_elem_pd_resp(dev):
    addr0 = dev[0].p2p_dev_addr()
    addr1 = dev[1].p2p_dev_addr()
    if "OK" not in dev[0].request("VENDOR_ELEM_ADD 5 dd050011223302"):
        raise Exception("VENDOR_ELEM_ADD failed")
    dev[0].p2p_listen()
    if not dev[1].discover_peer(addr0):
        raise Exception("Device discovery timed out")
    dev[1].p2p_stop_find()
    if "FAIL" in dev[1].request("SET ext_mgmt_frame_handling 1"):
        raise Exception("Failed to enable external management frame handling")
    dev[1].global_request("P2P_PROV_DISC " + addr0 + " display")
    for i in range(5):
        ev = dev[1].wait_event(["MGMT-RX"], timeout=5)
        if ev is None:
            raise Exception("MGMT-RX timeout")
        if " d0" in ev:
            break
    if "dd050011223302" not in ev:
        raise Exception("Vendor element not found from PD Response frame")
    dev[0].p2p_stop_find()
    dev[1].p2p_stop_find()

def test_p2p_ext_vendor_elem_go_neg_req(dev):
    """VENDOR_ELEM in GO Negotiation Request frames"""
    try:
        _test_p2p_ext_vendor_elem_go_neg_req(dev)
    finally:
        dev[0].request("VENDOR_ELEM_REMOVE 6 *")

def _test_p2p_ext_vendor_elem_go_neg_req(dev):
    addr0 = dev[0].p2p_dev_addr()
    addr1 = dev[1].p2p_dev_addr()
    if "OK" not in dev[0].request("VENDOR_ELEM_ADD 6 dd050011223303"):
        raise Exception("VENDOR_ELEM_ADD failed")
    dev[1].p2p_listen()
    if not dev[0].discover_peer(addr1):
        raise Exception("Device discovery timed out")
    dev[0].p2p_stop_find()
    if "FAIL" in dev[1].request("SET ext_mgmt_frame_handling 1"):
        raise Exception("Failed to enable external management frame handling")
    dev[0].global_request("P2P_CONNECT " + addr1 + " 12345670 display")
    for i in range(5):
        ev = dev[1].wait_event(["MGMT-RX"], timeout=5)
        if ev is None:
            raise Exception("MGMT-RX timeout")
        if " d0" in ev:
            break
    if "dd050011223303" not in ev:
        raise Exception("Vendor element not found from GO Negotiation Request frame")
    dev[1].p2p_stop_find()
    dev[0].p2p_stop_find()

def test_p2p_ext_vendor_elem_go_neg_resp(dev):
    """VENDOR_ELEM in GO Negotiation Response frames"""
    try:
        _test_p2p_ext_vendor_elem_go_neg_resp(dev)
    finally:
        dev[0].request("VENDOR_ELEM_REMOVE 7 *")

def _test_p2p_ext_vendor_elem_go_neg_resp(dev):
    addr0 = dev[0].p2p_dev_addr()
    addr1 = dev[1].p2p_dev_addr()
    if "OK" not in dev[0].request("VENDOR_ELEM_ADD 7 dd050011223304"):
        raise Exception("VENDOR_ELEM_ADD failed")
    dev[0].p2p_listen()
    if not dev[1].discover_peer(addr0):
        raise Exception("Device discovery timed out")
    dev[1].p2p_stop_find()
    if "FAIL" in dev[1].request("SET ext_mgmt_frame_handling 1"):
        raise Exception("Failed to enable external management frame handling")
    dev[1].global_request("P2P_CONNECT " + addr0 + " 12345670 display")
    for i in range(5):
        ev = dev[1].wait_event(["MGMT-RX"], timeout=5)
        if ev is None:
            raise Exception("MGMT-RX timeout")
        if " d0" in ev:
            break
    if "dd050011223304" not in ev:
        raise Exception("Vendor element not found from GO Negotiation Response frame")
    dev[0].p2p_stop_find()
    dev[1].p2p_stop_find()

def test_p2p_ext_vendor_elem_go_neg_conf(dev, apdev, params):
    """VENDOR_ELEM in GO Negotiation Confirm frames"""
    try:
        _test_p2p_ext_vendor_elem_go_neg_conf(dev, apdev, params)
    finally:
        dev[0].request("VENDOR_ELEM_REMOVE 8 *")

def _test_p2p_ext_vendor_elem_go_neg_conf(dev, apdev, params):
    addr0 = dev[0].p2p_dev_addr()
    addr1 = dev[1].p2p_dev_addr()
    if "OK" not in dev[0].request("VENDOR_ELEM_ADD 8 dd050011223305"):
        raise Exception("VENDOR_ELEM_ADD failed")
    dev[0].p2p_listen()
    dev[1].p2p_listen()
    dev[1].p2p_go_neg_auth(addr0, "12345670", "enter")
    dev[0].p2p_go_neg_init(addr1, "12345678", "display")
    dev[1].p2p_go_neg_auth_result(expect_failure=True)

    out = run_tshark(os.path.join(params['logdir'], "hwsim0.pcapng"),
                     "wifi_p2p.public_action.subtype == 2")
    if "Vendor Specific Data: 3305" not in out:
        raise Exception("Vendor element not found from GO Negotiation Confirm frame")

def test_p2p_ext_vendor_elem_invitation(dev):
    """VENDOR_ELEM in Invitation frames"""
    try:
        _test_p2p_ext_vendor_elem_invitation(dev)
    finally:
        dev[0].request("VENDOR_ELEM_REMOVE 9 *")
        dev[0].request("VENDOR_ELEM_REMOVE 10 *")

def _test_p2p_ext_vendor_elem_invitation(dev):
    addr0 = dev[0].p2p_dev_addr()
    addr1 = dev[1].p2p_dev_addr()
    form(dev[0], dev[1])
    if "OK" not in dev[0].request("VENDOR_ELEM_ADD 9 dd050011223306"):
        raise Exception("VENDOR_ELEM_ADD failed")
    if "OK" not in dev[0].request("VENDOR_ELEM_ADD 10 dd050011223307"):
        raise Exception("VENDOR_ELEM_ADD failed")
    dev[1].p2p_listen()
    if not dev[0].discover_peer(addr1):
        raise Exception("Device discovery timed out")
    peer = dev[0].get_peer(addr1)
    dev[0].p2p_stop_find()
    if "FAIL" in dev[1].request("SET ext_mgmt_frame_handling 1"):
        raise Exception("Failed to enable external management frame handling")
    dev[0].global_request("P2P_INVITE persistent=" + peer['persistent'] + " peer=" + addr1)
    for i in range(5):
        ev = dev[1].wait_event(["MGMT-RX"], timeout=5)
        if ev is None:
            raise Exception("MGMT-RX timeout")
        if " d0" in ev:
            break
    if "dd050011223306" not in ev:
        raise Exception("Vendor element not found from Invitation Request frame")
    dev[0].p2p_stop_find()
    dev[1].p2p_stop_find()

    dev[0].p2p_listen()
    if "FAIL" in dev[1].request("SET ext_mgmt_frame_handling 0"):
        raise Exception("Failed to disable external management frame handling")
    if not dev[1].discover_peer(addr0):
        raise Exception("Device discovery timed out")
    peer = dev[1].get_peer(addr0)
    dev[1].p2p_stop_find()
    if "FAIL" in dev[1].request("SET ext_mgmt_frame_handling 1"):
        raise Exception("Failed to enable external management frame handling")
    dev[1].global_request("P2P_INVITE persistent=" + peer['persistent'] + " peer=" + addr0)
    for i in range(5):
        ev = dev[1].wait_event(["MGMT-RX"], timeout=5)
        if ev is None:
            raise Exception("MGMT-RX timeout")
        if " d0" in ev:
            break
    if "dd050011223307" not in ev:
        raise Exception("Vendor element not found from Invitation Response frame")
    dev[0].p2p_stop_find()
    dev[1].p2p_stop_find()

def test_p2p_ext_vendor_elem_assoc(dev, apdev, params):
    """VENDOR_ELEM in Association frames"""
    try:
        _test_p2p_ext_vendor_elem_assoc(dev, apdev, params)
    finally:
        dev[0].request("VENDOR_ELEM_REMOVE 11 *")
        dev[1].request("VENDOR_ELEM_REMOVE 12 *")
        dev[0].request("VENDOR_ELEM_REMOVE 13 *")

def _test_p2p_ext_vendor_elem_assoc(dev, apdev, params):
    addr0 = dev[0].p2p_dev_addr()
    addr1 = dev[1].p2p_dev_addr()
    if "OK" not in dev[0].request("VENDOR_ELEM_ADD 11 dd050011223308"):
        raise Exception("VENDOR_ELEM_ADD failed")
    if "OK" not in dev[1].request("VENDOR_ELEM_ADD 12 dd050011223309"):
        raise Exception("VENDOR_ELEM_ADD failed")
    if "OK" not in dev[0].request("VENDOR_ELEM_ADD 13 dd05001122330a"):
        raise Exception("VENDOR_ELEM_ADD failed")
    dev[0].p2p_listen()
    dev[1].p2p_listen()
    dev[1].p2p_go_neg_auth(addr0, "12345670", "enter", go_intent=15)
    dev[0].p2p_go_neg_init(addr1, "12345670", "display", go_intent=0,
                           timeout=15)
    dev[1].p2p_go_neg_auth_result()
    dev[1].remove_group()
    dev[0].wait_go_ending_session()

    out = run_tshark(os.path.join(params['logdir'], "hwsim0.pcapng"),
                     "wlan.fc.type_subtype == 0x00", wait=False)
    if "Vendor Specific Data: 3308" not in out:
        raise Exception("Vendor element (P2P) not found from Association Request frame")
    if "Vendor Specific Data: 330a" not in out:
        raise Exception("Vendor element (non-P2P) not found from Association Request frame")

    out = run_tshark(os.path.join(params['logdir'], "hwsim0.pcapng"),
                     "wlan.fc.type_subtype == 0x01", wait=False)
    if "Vendor Specific Data: 3309" not in out:
        raise Exception("Vendor element not found from Association Response frame")
