test_p2p_concurrency.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  1. # P2P concurrency test cases
  2. # Copyright (c) 2013-2015, Jouni Malinen <j@w1.fi>
  3. #
  4. # This software may be distributed under the terms of the BSD license.
  5. # See README for more details.
  6. import logging
  7. logger = logging.getLogger()
  8. import subprocess
  9. import time
  10. import hwsim_utils
  11. import hostapd
  12. from test_p2p_grpform import go_neg_pin_authorized
  13. from test_p2p_grpform import go_neg_pbc
  14. from test_p2p_grpform import check_grpform_results
  15. from test_p2p_grpform import remove_group
  16. from test_p2p_persistent import form
  17. from test_p2p_persistent import invite_from_cli
  18. from test_p2p_persistent import invite_from_go
  19. from test_p2p_persistent import invite
  20. from test_ap_ht import clear_scan_cache
  21. from utils import HwsimSkip
  22. def test_concurrent_autogo(dev, apdev):
  23. """Concurrent P2P autonomous GO"""
  24. logger.info("Connect to an infrastructure AP")
  25. dev[0].request("P2P_SET cross_connect 0")
  26. hapd = hostapd.add_ap(apdev[0]['ifname'], { "ssid": "test-open" })
  27. dev[0].connect("test-open", key_mgmt="NONE", scan_freq="2412")
  28. hwsim_utils.test_connectivity(dev[0], hapd)
  29. logger.info("Start a P2P group while associated to an AP")
  30. dev[0].request("SET p2p_no_group_iface 0")
  31. dev[0].p2p_start_go()
  32. pin = dev[1].wps_read_pin()
  33. dev[0].p2p_go_authorize_client(pin)
  34. dev[1].p2p_connect_group(dev[0].p2p_dev_addr(), pin, timeout=60,
  35. social=True)
  36. hwsim_utils.test_connectivity_p2p(dev[0], dev[1])
  37. dev[0].remove_group()
  38. dev[1].wait_go_ending_session()
  39. logger.info("Confirm AP connection after P2P group removal")
  40. hwsim_utils.test_connectivity(dev[0], hapd)
  41. def test_concurrent_autogo_5ghz_ht40(dev, apdev):
  42. """Concurrent P2P autonomous GO on 5 GHz and HT40 co-ex"""
  43. clear_scan_cache(apdev[1]['ifname'])
  44. try:
  45. hapd = None
  46. hapd2 = None
  47. params = { "ssid": "ht40",
  48. "hw_mode": "a",
  49. "channel": "153",
  50. "country_code": "US",
  51. "ht_capab": "[HT40-]" }
  52. hapd2 = hostapd.add_ap(apdev[1]['ifname'], params)
  53. params = { "ssid": "test-open-5",
  54. "hw_mode": "a",
  55. "channel": "149",
  56. "country_code": "US" }
  57. hapd = hostapd.add_ap(apdev[0]['ifname'], params)
  58. dev[0].request("P2P_SET cross_connect 0")
  59. dev[0].scan_for_bss(apdev[0]['bssid'], freq=5745)
  60. dev[0].scan_for_bss(apdev[1]['bssid'], freq=5765)
  61. dev[0].connect("test-open-5", key_mgmt="NONE", scan_freq="5745")
  62. dev[0].request("SET p2p_no_group_iface 0")
  63. if "OK" not in dev[0].global_request("P2P_GROUP_ADD ht40"):
  64. raise Exception("P2P_GROUP_ADD failed")
  65. ev = dev[0].wait_global_event(["P2P-GROUP-STARTED"], timeout=5)
  66. if ev is None:
  67. raise Exception("GO start up timed out")
  68. dev[0].group_form_result(ev)
  69. pin = dev[1].wps_read_pin()
  70. dev[0].p2p_go_authorize_client(pin)
  71. dev[1].p2p_find(freq=5745)
  72. addr0 = dev[0].p2p_dev_addr()
  73. count = 0
  74. while count < 10:
  75. time.sleep(0.25)
  76. count += 1
  77. if dev[1].peer_known(addr0):
  78. break
  79. dev[1].p2p_connect_group(addr0, pin, timeout=60)
  80. dev[0].remove_group()
  81. dev[1].wait_go_ending_session()
  82. finally:
  83. dev[0].request("REMOVE_NETWORK all")
  84. if hapd:
  85. hapd.request("DISABLE")
  86. if hapd2:
  87. hapd2.request("DISABLE")
  88. subprocess.call(['iw', 'reg', 'set', '00'])
  89. dev[0].flush_scan_cache()
  90. dev[1].flush_scan_cache()
  91. def test_concurrent_autogo_crossconnect(dev, apdev):
  92. """Concurrent P2P autonomous GO"""
  93. dev[0].global_request("P2P_SET cross_connect 1")
  94. hapd = hostapd.add_ap(apdev[0]['ifname'], { "ssid": "test-open" })
  95. dev[0].connect("test-open", key_mgmt="NONE", scan_freq="2412")
  96. dev[0].global_request("SET p2p_no_group_iface 0")
  97. dev[0].p2p_start_go(no_event_clear=True)
  98. ev = dev[0].wait_global_event("P2P-CROSS-CONNECT-ENABLE", timeout=10)
  99. if ev is None:
  100. raise Exception("Timeout on cross connection enabled event")
  101. if dev[0].group_ifname + " " + dev[0].ifname not in ev:
  102. raise Exception("Unexpected interfaces: " + ev)
  103. dev[0].dump_monitor()
  104. dev[0].global_request("P2P_SET cross_connect 0")
  105. ev = dev[0].wait_global_event("P2P-CROSS-CONNECT-DISABLE", timeout=10)
  106. if ev is None:
  107. raise Exception("Timeout on cross connection disabled event")
  108. if dev[0].group_ifname + " " + dev[0].ifname not in ev:
  109. raise Exception("Unexpected interfaces: " + ev)
  110. dev[0].remove_group()
  111. dev[0].global_request("P2P_SET cross_connect 1")
  112. dev[0].p2p_start_go(no_event_clear=True)
  113. ev = dev[0].wait_global_event("P2P-CROSS-CONNECT-ENABLE", timeout=10)
  114. if ev is None:
  115. raise Exception("Timeout on cross connection enabled event")
  116. if dev[0].group_ifname + " " + dev[0].ifname not in ev:
  117. raise Exception("Unexpected interfaces: " + ev)
  118. dev[0].dump_monitor()
  119. dev[0].remove_group()
  120. ev = dev[0].wait_global_event("P2P-CROSS-CONNECT-DISABLE", timeout=10)
  121. if ev is None:
  122. raise Exception("Timeout on cross connection disabled event")
  123. dev[0].global_request("P2P_SET cross_connect 0")
  124. def test_concurrent_p2pcli(dev, apdev):
  125. """Concurrent P2P client join"""
  126. logger.info("Connect to an infrastructure AP")
  127. hapd = hostapd.add_ap(apdev[0]['ifname'], { "ssid": "test-open" })
  128. dev[0].connect("test-open", key_mgmt="NONE", scan_freq="2412")
  129. hwsim_utils.test_connectivity(dev[0], hapd)
  130. logger.info("Join a P2P group while associated to an AP")
  131. dev[0].request("SET p2p_no_group_iface 0")
  132. dev[1].p2p_start_go(freq=2412)
  133. pin = dev[0].wps_read_pin()
  134. dev[1].p2p_go_authorize_client(pin)
  135. dev[0].p2p_connect_group(dev[1].p2p_dev_addr(), pin, timeout=60,
  136. social=True)
  137. hwsim_utils.test_connectivity_p2p(dev[0], dev[1])
  138. dev[1].remove_group()
  139. dev[0].wait_go_ending_session()
  140. logger.info("Confirm AP connection after P2P group removal")
  141. hwsim_utils.test_connectivity(dev[0], hapd)
  142. def test_concurrent_grpform_go(dev, apdev):
  143. """Concurrent P2P group formation to become GO"""
  144. logger.info("Connect to an infrastructure AP")
  145. hapd = hostapd.add_ap(apdev[0]['ifname'], { "ssid": "test-open" })
  146. dev[0].connect("test-open", key_mgmt="NONE", scan_freq="2412")
  147. hwsim_utils.test_connectivity(dev[0], hapd)
  148. logger.info("Form a P2P group while associated to an AP")
  149. dev[0].request("SET p2p_no_group_iface 0")
  150. [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=15,
  151. r_dev=dev[1], r_intent=0)
  152. check_grpform_results(i_res, r_res)
  153. remove_group(dev[0], dev[1])
  154. logger.info("Confirm AP connection after P2P group removal")
  155. hwsim_utils.test_connectivity(dev[0], hapd)
  156. def test_concurrent_grpform_cli(dev, apdev):
  157. """Concurrent P2P group formation to become P2P Client"""
  158. logger.info("Connect to an infrastructure AP")
  159. hapd = hostapd.add_ap(apdev[0]['ifname'], { "ssid": "test-open" })
  160. dev[0].connect("test-open", key_mgmt="NONE", scan_freq="2412")
  161. hwsim_utils.test_connectivity(dev[0], hapd)
  162. logger.info("Form a P2P group while associated to an AP")
  163. dev[0].request("SET p2p_no_group_iface 0")
  164. [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=0,
  165. r_dev=dev[1], r_intent=15)
  166. check_grpform_results(i_res, r_res)
  167. remove_group(dev[0], dev[1])
  168. logger.info("Confirm AP connection after P2P group removal")
  169. hwsim_utils.test_connectivity(dev[0], hapd)
  170. def test_concurrent_grpform_while_connecting(dev, apdev):
  171. """Concurrent P2P group formation while connecting to an AP"""
  172. logger.info("Start connection to an infrastructure AP")
  173. hapd = hostapd.add_ap(apdev[0]['ifname'], { "ssid": "test-open" })
  174. dev[0].connect("test-open", key_mgmt="NONE", wait_connect=False)
  175. logger.info("Form a P2P group while connecting to an AP")
  176. dev[0].request("SET p2p_no_group_iface 0")
  177. [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_freq=2412,
  178. r_dev=dev[1], r_freq=2412)
  179. check_grpform_results(i_res, r_res)
  180. remove_group(dev[0], dev[1])
  181. logger.info("Confirm AP connection after P2P group removal")
  182. hwsim_utils.test_connectivity(dev[0], hapd)
  183. def test_concurrent_grpform_while_connecting2(dev, apdev):
  184. """Concurrent P2P group formation while connecting to an AP (2)"""
  185. logger.info("Start connection to an infrastructure AP")
  186. hapd = hostapd.add_ap(apdev[0]['ifname'], { "ssid": "test-open" })
  187. dev[0].connect("test-open", key_mgmt="NONE", wait_connect=False)
  188. dev[1].flush_scan_cache()
  189. logger.info("Form a P2P group while connecting to an AP")
  190. dev[0].request("SET p2p_no_group_iface 0")
  191. [i_res, r_res] = go_neg_pbc(i_dev=dev[0], i_intent=15, i_freq=2412,
  192. r_dev=dev[1], r_intent=0, r_freq=2412)
  193. check_grpform_results(i_res, r_res)
  194. remove_group(dev[0], dev[1])
  195. logger.info("Confirm AP connection after P2P group removal")
  196. dev[0].wait_completed()
  197. hwsim_utils.test_connectivity(dev[0], hapd)
  198. def test_concurrent_grpform_while_connecting3(dev, apdev):
  199. """Concurrent P2P group formation while connecting to an AP (3)"""
  200. logger.info("Start connection to an infrastructure AP")
  201. hapd = hostapd.add_ap(apdev[0]['ifname'], { "ssid": "test-open" })
  202. dev[0].connect("test-open", key_mgmt="NONE", wait_connect=False)
  203. logger.info("Form a P2P group while connecting to an AP")
  204. dev[0].request("SET p2p_no_group_iface 0")
  205. [i_res, r_res] = go_neg_pbc(i_dev=dev[1], i_intent=15, i_freq=2412,
  206. r_dev=dev[0], r_intent=0, r_freq=2412)
  207. check_grpform_results(i_res, r_res)
  208. remove_group(dev[0], dev[1])
  209. logger.info("Confirm AP connection after P2P group removal")
  210. dev[0].wait_completed()
  211. hwsim_utils.test_connectivity(dev[0], hapd)
  212. def test_concurrent_persistent_group(dev, apdev):
  213. """Concurrent P2P persistent group"""
  214. logger.info("Connect to an infrastructure AP")
  215. hostapd.add_ap(apdev[0]['ifname'], { "ssid": "test-open", "channel": "2" })
  216. dev[0].global_request("SET p2p_no_group_iface 0")
  217. dev[0].connect("test-open", key_mgmt="NONE", scan_freq="2417")
  218. logger.info("Run persistent group test while associated to an AP")
  219. form(dev[0], dev[1])
  220. [go_res, cli_res] = invite_from_cli(dev[0], dev[1])
  221. if go_res['freq'] != '2417':
  222. raise Exception("Unexpected channel selected: " + go_res['freq'])
  223. [go_res, cli_res] = invite_from_go(dev[0], dev[1])
  224. if go_res['freq'] != '2417':
  225. raise Exception("Unexpected channel selected: " + go_res['freq'])
  226. def test_concurrent_invitation_channel_mismatch(dev, apdev):
  227. """P2P persistent group invitation and channel mismatch"""
  228. if dev[0].get_mcc() > 1:
  229. raise HwsimSkip("Skip due to MCC being enabled")
  230. form(dev[0], dev[1])
  231. dev[0].dump_monitor()
  232. dev[1].dump_monitor()
  233. logger.info("Connect to an infrastructure AP")
  234. hostapd.add_ap(apdev[0]['ifname'], { "ssid": "test-open", "channel": "2" })
  235. dev[0].global_request("SET p2p_no_group_iface 0")
  236. dev[0].connect("test-open", key_mgmt="NONE", scan_freq="2417")
  237. invite(dev[1], dev[0], extra="freq=2412")
  238. ev = dev[1].wait_global_event(["P2P-INVITATION-RESULT"], timeout=15)
  239. if ev is None:
  240. raise Exception("P2P invitation result not received")
  241. if "status=7" not in ev:
  242. raise Exception("Unexpected P2P invitation result: " + ev)