test_p2p_grpform.py 52 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227
  1. # P2P group formation test cases
  2. # Copyright (c) 2013-2014, 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 binascii
  7. import logging
  8. logger = logging.getLogger()
  9. import struct
  10. import time
  11. import threading
  12. import Queue
  13. import os
  14. import hostapd
  15. import hwsim_utils
  16. import utils
  17. from utils import HwsimSkip
  18. from wpasupplicant import WpaSupplicant
  19. from test_p2p_messages import parse_p2p_public_action, p2p_hdr, p2p_attr_capability, p2p_attr_go_intent, p2p_attr_config_timeout, p2p_attr_listen_channel, p2p_attr_intended_interface_addr, p2p_attr_channel_list, p2p_attr_device_info, p2p_attr_operating_channel, ie_p2p, ie_wsc, mgmt_tx, P2P_GO_NEG_REQ
  20. def check_grpform_results(i_res, r_res):
  21. if i_res['result'] != 'success' or r_res['result'] != 'success':
  22. raise Exception("Failed group formation")
  23. if i_res['ssid'] != r_res['ssid']:
  24. raise Exception("SSID mismatch")
  25. if i_res['freq'] != r_res['freq']:
  26. raise Exception("freq mismatch")
  27. if 'go_neg_freq' in r_res and i_res['go_neg_freq'] != r_res['go_neg_freq']:
  28. raise Exception("go_neg_freq mismatch")
  29. if i_res['freq'] != i_res['go_neg_freq']:
  30. raise Exception("freq/go_neg_freq mismatch")
  31. if i_res['role'] != i_res['go_neg_role']:
  32. raise Exception("role/go_neg_role mismatch")
  33. if 'go_neg_role' in r_res and r_res['role'] != r_res['go_neg_role']:
  34. raise Exception("role/go_neg_role mismatch")
  35. if i_res['go_dev_addr'] != r_res['go_dev_addr']:
  36. raise Exception("GO Device Address mismatch")
  37. def go_neg_init(i_dev, r_dev, pin, i_method, i_intent, res):
  38. logger.debug("Initiate GO Negotiation from i_dev")
  39. try:
  40. i_res = i_dev.p2p_go_neg_init(r_dev.p2p_dev_addr(), pin, i_method, timeout=20, go_intent=i_intent)
  41. logger.debug("i_res: " + str(i_res))
  42. except Exception, e:
  43. i_res = None
  44. logger.info("go_neg_init thread caught an exception from p2p_go_neg_init: " + str(e))
  45. res.put(i_res)
  46. def go_neg_pin(i_dev, r_dev, i_intent=None, r_intent=None, i_method='enter', r_method='display'):
  47. r_dev.p2p_listen()
  48. i_dev.p2p_listen()
  49. pin = r_dev.wps_read_pin()
  50. logger.info("Start GO negotiation " + i_dev.ifname + " -> " + r_dev.ifname)
  51. r_dev.dump_monitor()
  52. res = Queue.Queue()
  53. t = threading.Thread(target=go_neg_init, args=(i_dev, r_dev, pin, i_method, i_intent, res))
  54. t.start()
  55. logger.debug("Wait for GO Negotiation Request on r_dev")
  56. ev = r_dev.wait_global_event(["P2P-GO-NEG-REQUEST"], timeout=15)
  57. if ev is None:
  58. raise Exception("GO Negotiation timed out")
  59. r_dev.dump_monitor()
  60. logger.debug("Re-initiate GO Negotiation from r_dev")
  61. r_res = r_dev.p2p_go_neg_init(i_dev.p2p_dev_addr(), pin, r_method, go_intent=r_intent, timeout=20)
  62. logger.debug("r_res: " + str(r_res))
  63. r_dev.dump_monitor()
  64. t.join()
  65. i_res = res.get()
  66. if i_res is None:
  67. raise Exception("go_neg_init thread failed")
  68. logger.debug("i_res: " + str(i_res))
  69. logger.info("Group formed")
  70. hwsim_utils.test_connectivity_p2p(r_dev, i_dev)
  71. i_dev.dump_monitor()
  72. return [i_res, r_res]
  73. def go_neg_pin_authorized(i_dev, r_dev, i_intent=None, r_intent=None, expect_failure=False, i_go_neg_status=None, i_method='enter', r_method='display', test_data=True, i_freq=None, r_freq=None):
  74. i_dev.p2p_listen()
  75. pin = r_dev.wps_read_pin()
  76. logger.info("Start GO negotiation " + i_dev.ifname + " -> " + r_dev.ifname)
  77. r_dev.p2p_go_neg_auth(i_dev.p2p_dev_addr(), pin, r_method, go_intent=r_intent, freq=r_freq)
  78. r_dev.p2p_listen()
  79. i_res = i_dev.p2p_go_neg_init(r_dev.p2p_dev_addr(), pin, i_method, timeout=20, go_intent=i_intent, expect_failure=expect_failure, freq=i_freq)
  80. r_res = r_dev.p2p_go_neg_auth_result(expect_failure=expect_failure)
  81. logger.debug("i_res: " + str(i_res))
  82. logger.debug("r_res: " + str(r_res))
  83. r_dev.dump_monitor()
  84. i_dev.dump_monitor()
  85. if i_go_neg_status:
  86. if i_res['result'] != 'go-neg-failed':
  87. raise Exception("Expected GO Negotiation failure not reported")
  88. if i_res['status'] != i_go_neg_status:
  89. raise Exception("Expected GO Negotiation status not seen")
  90. if expect_failure:
  91. return
  92. logger.info("Group formed")
  93. if test_data:
  94. hwsim_utils.test_connectivity_p2p(r_dev, i_dev)
  95. return [i_res, r_res]
  96. def go_neg_init_pbc(i_dev, r_dev, i_intent, res, freq, provdisc):
  97. logger.debug("Initiate GO Negotiation from i_dev")
  98. try:
  99. i_res = i_dev.p2p_go_neg_init(r_dev.p2p_dev_addr(), None, "pbc",
  100. timeout=20, go_intent=i_intent, freq=freq,
  101. provdisc=provdisc)
  102. logger.debug("i_res: " + str(i_res))
  103. except Exception, e:
  104. i_res = None
  105. logger.info("go_neg_init_pbc thread caught an exception from p2p_go_neg_init: " + str(e))
  106. res.put(i_res)
  107. def go_neg_pbc(i_dev, r_dev, i_intent=None, r_intent=None, i_freq=None, r_freq=None, provdisc=False, r_listen=False):
  108. if r_listen:
  109. r_dev.p2p_listen()
  110. else:
  111. r_dev.p2p_find(social=True)
  112. i_dev.p2p_find(social=True)
  113. logger.info("Start GO negotiation " + i_dev.ifname + " -> " + r_dev.ifname)
  114. r_dev.dump_monitor()
  115. res = Queue.Queue()
  116. t = threading.Thread(target=go_neg_init_pbc, args=(i_dev, r_dev, i_intent, res, i_freq, provdisc))
  117. t.start()
  118. logger.debug("Wait for GO Negotiation Request on r_dev")
  119. ev = r_dev.wait_global_event(["P2P-GO-NEG-REQUEST"], timeout=15)
  120. if ev is None:
  121. raise Exception("GO Negotiation timed out")
  122. r_dev.dump_monitor()
  123. # Allow some time for the GO Neg Resp to go out before initializing new
  124. # GO Negotiation.
  125. time.sleep(0.2)
  126. logger.debug("Re-initiate GO Negotiation from r_dev")
  127. r_res = r_dev.p2p_go_neg_init(i_dev.p2p_dev_addr(), None, "pbc",
  128. go_intent=r_intent, timeout=20, freq=r_freq)
  129. logger.debug("r_res: " + str(r_res))
  130. r_dev.dump_monitor()
  131. t.join()
  132. i_res = res.get()
  133. if i_res is None:
  134. raise Exception("go_neg_init_pbc thread failed")
  135. logger.debug("i_res: " + str(i_res))
  136. logger.info("Group formed")
  137. hwsim_utils.test_connectivity_p2p(r_dev, i_dev)
  138. i_dev.dump_monitor()
  139. return [i_res, r_res]
  140. def go_neg_pbc_authorized(i_dev, r_dev, i_intent=None, r_intent=None,
  141. expect_failure=False, i_freq=None, r_freq=None):
  142. i_dev.p2p_listen()
  143. logger.info("Start GO negotiation " + i_dev.ifname + " -> " + r_dev.ifname)
  144. r_dev.p2p_go_neg_auth(i_dev.p2p_dev_addr(), None, "pbc",
  145. go_intent=r_intent, freq=r_freq)
  146. r_dev.p2p_listen()
  147. i_res = i_dev.p2p_go_neg_init(r_dev.p2p_dev_addr(), None, "pbc", timeout=20,
  148. go_intent=i_intent,
  149. expect_failure=expect_failure, freq=i_freq)
  150. r_res = r_dev.p2p_go_neg_auth_result(expect_failure=expect_failure)
  151. logger.debug("i_res: " + str(i_res))
  152. logger.debug("r_res: " + str(r_res))
  153. r_dev.dump_monitor()
  154. i_dev.dump_monitor()
  155. if expect_failure:
  156. return
  157. logger.info("Group formed")
  158. return [i_res, r_res]
  159. def remove_group(dev1, dev2):
  160. dev1.remove_group()
  161. try:
  162. dev2.remove_group()
  163. except:
  164. pass
  165. def test_grpform(dev):
  166. """P2P group formation using PIN and authorized connection (init -> GO)"""
  167. try:
  168. dev[0].global_request("SET p2p_group_idle 2")
  169. [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=15,
  170. r_dev=dev[1], r_intent=0)
  171. check_grpform_results(i_res, r_res)
  172. dev[1].remove_group()
  173. ev = dev[0].wait_global_event(["P2P-GROUP-REMOVED"], timeout=10)
  174. if ev is None:
  175. raise Exception("GO did not remove group on idle timeout")
  176. if "GO reason=IDLE" not in ev:
  177. raise Exception("Unexpected group removal event: " + ev)
  178. finally:
  179. dev[0].global_request("SET p2p_group_idle 0")
  180. def test_grpform_a(dev):
  181. """P2P group formation using PIN and authorized connection (init -> GO) (init: group iface)"""
  182. dev[0].global_request("SET p2p_no_group_iface 0")
  183. [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=15,
  184. r_dev=dev[1], r_intent=0)
  185. if "p2p-wlan" not in i_res['ifname']:
  186. raise Exception("Unexpected group interface name")
  187. check_grpform_results(i_res, r_res)
  188. remove_group(dev[0], dev[1])
  189. if i_res['ifname'] in utils.get_ifnames():
  190. raise Exception("Group interface netdev was not removed")
  191. def test_grpform_b(dev):
  192. """P2P group formation using PIN and authorized connection (init -> GO) (resp: group iface)"""
  193. dev[1].global_request("SET p2p_no_group_iface 0")
  194. [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=15,
  195. r_dev=dev[1], r_intent=0)
  196. if "p2p-wlan" not in r_res['ifname']:
  197. raise Exception("Unexpected group interface name")
  198. check_grpform_results(i_res, r_res)
  199. remove_group(dev[0], dev[1])
  200. if r_res['ifname'] in utils.get_ifnames():
  201. raise Exception("Group interface netdev was not removed")
  202. def test_grpform_c(dev):
  203. """P2P group formation using PIN and authorized connection (init -> GO) (group iface)"""
  204. dev[0].global_request("SET p2p_no_group_iface 0")
  205. dev[1].global_request("SET p2p_no_group_iface 0")
  206. [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=15,
  207. r_dev=dev[1], r_intent=0)
  208. if "p2p-wlan" not in i_res['ifname']:
  209. raise Exception("Unexpected group interface name")
  210. if "p2p-wlan" not in r_res['ifname']:
  211. raise Exception("Unexpected group interface name")
  212. check_grpform_results(i_res, r_res)
  213. remove_group(dev[0], dev[1])
  214. if i_res['ifname'] in utils.get_ifnames():
  215. raise Exception("Group interface netdev was not removed")
  216. if r_res['ifname'] in utils.get_ifnames():
  217. raise Exception("Group interface netdev was not removed")
  218. def test_grpform2(dev):
  219. """P2P group formation using PIN and authorized connection (resp -> GO)"""
  220. go_neg_pin_authorized(i_dev=dev[0], i_intent=0, r_dev=dev[1], r_intent=15)
  221. remove_group(dev[0], dev[1])
  222. def test_grpform2_c(dev):
  223. """P2P group formation using PIN and authorized connection (resp -> GO) (group iface)"""
  224. dev[0].global_request("SET p2p_no_group_iface 0")
  225. dev[1].global_request("SET p2p_no_group_iface 0")
  226. [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=0, r_dev=dev[1], r_intent=15)
  227. remove_group(dev[0], dev[1])
  228. if i_res['ifname'] in utils.get_ifnames():
  229. raise Exception("Group interface netdev was not removed")
  230. if r_res['ifname'] in utils.get_ifnames():
  231. raise Exception("Group interface netdev was not removed")
  232. def test_grpform3(dev):
  233. """P2P group formation using PIN and re-init GO Negotiation"""
  234. go_neg_pin(i_dev=dev[0], i_intent=15, r_dev=dev[1], r_intent=0)
  235. remove_group(dev[0], dev[1])
  236. def test_grpform3_c(dev):
  237. """P2P group formation using PIN and re-init GO Negotiation (group iface)"""
  238. dev[0].global_request("SET p2p_no_group_iface 0")
  239. dev[1].global_request("SET p2p_no_group_iface 0")
  240. [i_res, r_res] = go_neg_pin(i_dev=dev[0], i_intent=15, r_dev=dev[1], r_intent=0)
  241. remove_group(dev[0], dev[1])
  242. if i_res['ifname'] in utils.get_ifnames():
  243. raise Exception("Group interface netdev was not removed")
  244. if r_res['ifname'] in utils.get_ifnames():
  245. raise Exception("Group interface netdev was not removed")
  246. def test_grpform4(dev):
  247. """P2P group formation response during p2p_find"""
  248. addr1 = dev[1].p2p_dev_addr()
  249. dev[1].p2p_listen()
  250. dev[0].discover_peer(addr1)
  251. dev[1].p2p_find(social=True)
  252. time.sleep(0.4)
  253. dev[0].global_request("P2P_CONNECT " + addr1 + " 12345670 display")
  254. ev = dev[1].wait_global_event(["P2P-GO-NEG-REQUEST"], timeout=15)
  255. if ev is None:
  256. raise Exception("GO Negotiation RX timed out")
  257. time.sleep(0.5)
  258. dev[1].p2p_stop_find()
  259. dev[0].p2p_stop_find()
  260. def test_grpform_pbc(dev):
  261. """P2P group formation using PBC and re-init GO Negotiation"""
  262. [i_res, r_res] = go_neg_pbc(i_dev=dev[0], i_intent=15, r_dev=dev[1], r_intent=0)
  263. check_grpform_results(i_res, r_res)
  264. if i_res['role'] != 'GO' or r_res['role'] != 'client':
  265. raise Exception("Unexpected device roles")
  266. remove_group(dev[0], dev[1])
  267. def test_grpform_pd(dev):
  268. """P2P group formation with PD-before-GO-Neg workaround"""
  269. [i_res, r_res] = go_neg_pbc(i_dev=dev[0], provdisc=True, r_dev=dev[1], r_listen=True)
  270. check_grpform_results(i_res, r_res)
  271. remove_group(dev[0], dev[1])
  272. def test_grpform_ext_listen(dev):
  273. """P2P group formation with extended listen timing enabled"""
  274. addr0 = dev[0].p2p_dev_addr()
  275. try:
  276. if "FAIL" not in dev[0].global_request("P2P_EXT_LISTEN 100"):
  277. raise Exception("Invalid P2P_EXT_LISTEN accepted")
  278. if "OK" not in dev[0].global_request("P2P_EXT_LISTEN 300 1000"):
  279. raise Exception("Failed to set extended listen timing")
  280. if "OK" not in dev[1].global_request("P2P_EXT_LISTEN 200 40000"):
  281. raise Exception("Failed to set extended listen timing")
  282. [i_res, r_res] = go_neg_pbc(i_dev=dev[0], provdisc=True, r_dev=dev[1],
  283. r_listen=True, i_freq="2417", r_freq="2417",
  284. i_intent=1, r_intent=15)
  285. check_grpform_results(i_res, r_res)
  286. peer1 = dev[0].get_peer(dev[1].p2p_dev_addr())
  287. if peer1['ext_listen_interval'] != "40000":
  288. raise Exception("Extended listen interval not discovered correctly")
  289. if peer1['ext_listen_period'] != "200":
  290. raise Exception("Extended listen period not discovered correctly")
  291. peer0 = dev[1].get_peer(dev[0].p2p_dev_addr())
  292. if peer0['ext_listen_interval'] != "1000":
  293. raise Exception("Extended listen interval not discovered correctly")
  294. if peer0['ext_listen_period'] != "300":
  295. raise Exception("Extended listen period not discovered correctly")
  296. if not dev[2].discover_peer(addr0):
  297. raise Exception("Could not discover peer during ext listen")
  298. remove_group(dev[0], dev[1])
  299. finally:
  300. if "OK" not in dev[0].global_request("P2P_EXT_LISTEN"):
  301. raise Exception("Failed to clear extended listen timing")
  302. if "OK" not in dev[1].global_request("P2P_EXT_LISTEN"):
  303. raise Exception("Failed to clear extended listen timing")
  304. def test_grpform_ext_listen_oper(dev):
  305. """P2P extended listen timing operations"""
  306. try:
  307. _test_grpform_ext_listen_oper(dev)
  308. finally:
  309. dev[0].global_request("P2P_EXT_LISTEN")
  310. def _test_grpform_ext_listen_oper(dev):
  311. addr0 = dev[0].p2p_dev_addr()
  312. dev[0].global_request("SET p2p_no_group_iface 0")
  313. wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5')
  314. wpas.interface_add("wlan5")
  315. addr1 = wpas.p2p_dev_addr()
  316. wpas.request("P2P_SET listen_channel 1")
  317. wpas.global_request("SET p2p_no_group_iface 0")
  318. wpas.request("P2P_LISTEN")
  319. if not dev[0].discover_peer(addr1):
  320. raise Exception("Could not discover peer")
  321. dev[0].request("P2P_LISTEN")
  322. if not wpas.discover_peer(addr0):
  323. raise Exception("Could not discover peer (2)")
  324. dev[0].global_request("P2P_EXT_LISTEN 300 500")
  325. dev[0].global_request("P2P_CONNECT " + addr1 + " 12345670 display auth go_intent=0 freq=2417")
  326. wpas.global_request("P2P_CONNECT " + addr0 + " 12345670 enter go_intent=15 freq=2417")
  327. ev = dev[0].wait_global_event(["P2P-GO-NEG-SUCCESS"], timeout=15)
  328. if ev is None:
  329. raise Exception("GO Negotiation failed")
  330. ifaces = wpas.request("INTERFACES").splitlines()
  331. iface = ifaces[0] if "p2p-wlan" in ifaces[0] else ifaces[1]
  332. wpas.group_ifname = iface
  333. if "OK" not in wpas.group_request("STOP_AP"):
  334. raise Exception("STOP_AP failed")
  335. wpas.group_request("SET ext_mgmt_frame_handling 1")
  336. dev[1].p2p_find(social=True)
  337. time.sleep(1)
  338. if dev[1].peer_known(addr0):
  339. raise Exception("Unexpected peer discovery")
  340. ifaces = dev[0].request("INTERFACES").splitlines()
  341. iface = ifaces[0] if "p2p-wlan" in ifaces[0] else ifaces[1]
  342. if "OK" not in dev[0].global_request("P2P_GROUP_REMOVE " + iface):
  343. raise Exception("Failed to request group removal")
  344. wpas.remove_group()
  345. count = 0
  346. timeout = 15
  347. found = False
  348. while count < timeout * 4:
  349. time.sleep(0.25)
  350. count = count + 1
  351. if dev[1].peer_known(addr0):
  352. found = True
  353. break
  354. dev[1].p2p_stop_find()
  355. if not found:
  356. raise Exception("Could not discover peer that was supposed to use extended listen")
  357. def test_both_go_intent_15(dev):
  358. """P2P GO Negotiation with both devices using GO intent 15"""
  359. go_neg_pin_authorized(i_dev=dev[0], i_intent=15, r_dev=dev[1], r_intent=15, expect_failure=True, i_go_neg_status=9)
  360. def test_both_go_neg_display(dev):
  361. """P2P GO Negotiation with both devices trying to display PIN"""
  362. go_neg_pin_authorized(i_dev=dev[0], r_dev=dev[1], expect_failure=True, i_go_neg_status=10, i_method='display', r_method='display')
  363. def test_both_go_neg_enter(dev):
  364. """P2P GO Negotiation with both devices trying to enter PIN"""
  365. go_neg_pin_authorized(i_dev=dev[0], r_dev=dev[1], expect_failure=True, i_go_neg_status=10, i_method='enter', r_method='enter')
  366. def test_go_neg_pbc_vs_pin(dev):
  367. """P2P GO Negotiation with one device using PBC and the other PIN"""
  368. addr0 = dev[0].p2p_dev_addr()
  369. addr1 = dev[1].p2p_dev_addr()
  370. dev[1].p2p_listen()
  371. if not dev[0].discover_peer(addr1):
  372. raise Exception("Could not discover peer")
  373. dev[0].p2p_listen()
  374. if "OK" not in dev[0].request("P2P_CONNECT " + addr1 + " pbc auth"):
  375. raise Exception("Failed to authorize GO Neg")
  376. if not dev[1].discover_peer(addr0):
  377. raise Exception("Could not discover peer")
  378. if "OK" not in dev[1].request("P2P_CONNECT " + addr0 + " 12345670 display"):
  379. raise Exception("Failed to initiate GO Neg")
  380. ev = dev[1].wait_global_event(["P2P-GO-NEG-FAILURE"], timeout=10)
  381. if ev is None:
  382. raise Exception("GO Negotiation failure timed out")
  383. if "status=10" not in ev:
  384. raise Exception("Unexpected failure reason: " + ev)
  385. def test_go_neg_pin_vs_pbc(dev):
  386. """P2P GO Negotiation with one device using PIN and the other PBC"""
  387. addr0 = dev[0].p2p_dev_addr()
  388. addr1 = dev[1].p2p_dev_addr()
  389. dev[1].p2p_listen()
  390. if not dev[0].discover_peer(addr1):
  391. raise Exception("Could not discover peer")
  392. dev[0].p2p_listen()
  393. if "OK" not in dev[0].request("P2P_CONNECT " + addr1 + " 12345670 display auth"):
  394. raise Exception("Failed to authorize GO Neg")
  395. if not dev[1].discover_peer(addr0):
  396. raise Exception("Could not discover peer")
  397. if "OK" not in dev[1].request("P2P_CONNECT " + addr0 + " pbc"):
  398. raise Exception("Failed to initiate GO Neg")
  399. ev = dev[1].wait_global_event(["P2P-GO-NEG-FAILURE"], timeout=10)
  400. if ev is None:
  401. raise Exception("GO Negotiation failure timed out")
  402. if "status=10" not in ev:
  403. raise Exception("Unexpected failure reason: " + ev)
  404. def test_grpform_per_sta_psk(dev):
  405. """P2P group formation with per-STA PSKs"""
  406. dev[0].global_request("P2P_SET per_sta_psk 1")
  407. [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=15, r_dev=dev[1], r_intent=0)
  408. check_grpform_results(i_res, r_res)
  409. pin = dev[2].wps_read_pin()
  410. dev[0].p2p_go_authorize_client(pin)
  411. c_res = dev[2].p2p_connect_group(dev[0].p2p_dev_addr(), pin, timeout=60)
  412. check_grpform_results(i_res, c_res)
  413. if r_res['psk'] == c_res['psk']:
  414. raise Exception("Same PSK assigned for both clients")
  415. hwsim_utils.test_connectivity_p2p(dev[1], dev[2])
  416. dev[0].remove_group()
  417. dev[1].wait_go_ending_session()
  418. dev[2].wait_go_ending_session()
  419. def test_grpform_per_sta_psk_wps(dev):
  420. """P2P group formation with per-STA PSKs with non-P2P WPS STA"""
  421. dev[0].global_request("P2P_SET per_sta_psk 1")
  422. [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=15, r_dev=dev[1], r_intent=0)
  423. check_grpform_results(i_res, r_res)
  424. dev[0].p2p_go_authorize_client_pbc()
  425. dev[2].request("WPS_PBC")
  426. dev[2].wait_connected(timeout=30)
  427. hwsim_utils.test_connectivity_p2p_sta(dev[1], dev[2])
  428. dev[0].remove_group()
  429. dev[2].request("DISCONNECT")
  430. dev[1].wait_go_ending_session()
  431. def test_grpform_force_chan_go(dev):
  432. """P2P group formation forced channel selection by GO"""
  433. [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=15,
  434. i_freq=2432,
  435. r_dev=dev[1], r_intent=0,
  436. test_data=False)
  437. check_grpform_results(i_res, r_res)
  438. if i_res['freq'] != "2432":
  439. raise Exception("Unexpected channel - did not follow GO's forced channel")
  440. remove_group(dev[0], dev[1])
  441. def test_grpform_force_chan_cli(dev):
  442. """P2P group formation forced channel selection by client"""
  443. [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=0,
  444. i_freq=2417,
  445. r_dev=dev[1], r_intent=15,
  446. test_data=False)
  447. check_grpform_results(i_res, r_res)
  448. if i_res['freq'] != "2417":
  449. raise Exception("Unexpected channel - did not follow GO's forced channel")
  450. remove_group(dev[0], dev[1])
  451. def test_grpform_force_chan_conflict(dev):
  452. """P2P group formation fails due to forced channel mismatch"""
  453. go_neg_pin_authorized(i_dev=dev[0], i_intent=0, i_freq=2422,
  454. r_dev=dev[1], r_intent=15, r_freq=2427,
  455. expect_failure=True, i_go_neg_status=7)
  456. def test_grpform_pref_chan_go(dev):
  457. """P2P group formation preferred channel selection by GO"""
  458. dev[0].request("SET p2p_pref_chan 81:7")
  459. [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=15,
  460. r_dev=dev[1], r_intent=0,
  461. test_data=False)
  462. check_grpform_results(i_res, r_res)
  463. if i_res['freq'] != "2442":
  464. raise Exception("Unexpected channel - did not follow GO's p2p_pref_chan")
  465. remove_group(dev[0], dev[1])
  466. def test_grpform_pref_chan_go_overridden(dev):
  467. """P2P group formation preferred channel selection by GO overridden by client"""
  468. dev[1].request("SET p2p_pref_chan 81:7")
  469. [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=0,
  470. i_freq=2422,
  471. r_dev=dev[1], r_intent=15,
  472. test_data=False)
  473. check_grpform_results(i_res, r_res)
  474. if i_res['freq'] != "2422":
  475. raise Exception("Unexpected channel - did not follow client's forced channel")
  476. remove_group(dev[0], dev[1])
  477. def test_grpform_no_go_freq_forcing_chan(dev):
  478. """P2P group formation with no-GO freq forcing channel"""
  479. dev[1].request("SET p2p_no_go_freq 100-200,300,4000-6000")
  480. [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=0,
  481. r_dev=dev[1], r_intent=15,
  482. test_data=False)
  483. check_grpform_results(i_res, r_res)
  484. if int(i_res['freq']) > 4000:
  485. raise Exception("Unexpected channel - did not follow no-GO freq")
  486. remove_group(dev[0], dev[1])
  487. def test_grpform_no_go_freq_conflict(dev):
  488. """P2P group formation fails due to no-GO range forced by client"""
  489. dev[1].request("SET p2p_no_go_freq 2000-3000")
  490. go_neg_pin_authorized(i_dev=dev[0], i_intent=0, i_freq=2422,
  491. r_dev=dev[1], r_intent=15,
  492. expect_failure=True, i_go_neg_status=7)
  493. def test_grpform_no_5ghz_world_roaming(dev):
  494. """P2P group formation with world roaming regulatory"""
  495. [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=0,
  496. r_dev=dev[1], r_intent=15,
  497. test_data=False)
  498. check_grpform_results(i_res, r_res)
  499. if int(i_res['freq']) > 4000:
  500. raise Exception("Unexpected channel - did not follow world roaming rules")
  501. remove_group(dev[0], dev[1])
  502. def test_grpform_no_5ghz_add_cli(dev):
  503. """P2P group formation with passive scan 5 GHz and p2p_add_cli_chan=1"""
  504. dev[0].request("SET p2p_add_cli_chan 1")
  505. dev[1].request("SET p2p_add_cli_chan 1")
  506. [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=0,
  507. r_dev=dev[1], r_intent=14,
  508. test_data=False)
  509. check_grpform_results(i_res, r_res)
  510. if int(i_res['freq']) > 4000:
  511. raise Exception("Unexpected channel - did not follow world roaming rules")
  512. remove_group(dev[0], dev[1])
  513. def test_grpform_no_5ghz_add_cli2(dev):
  514. """P2P group formation with passive scan 5 GHz and p2p_add_cli_chan=1 (reverse)"""
  515. dev[0].request("SET p2p_add_cli_chan 1")
  516. dev[1].request("SET p2p_add_cli_chan 1")
  517. [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=14,
  518. r_dev=dev[1], r_intent=0,
  519. test_data=False)
  520. check_grpform_results(i_res, r_res)
  521. if int(i_res['freq']) > 4000:
  522. raise Exception("Unexpected channel - did not follow world roaming rules")
  523. remove_group(dev[0], dev[1])
  524. def test_grpform_no_5ghz_add_cli3(dev):
  525. """P2P group formation with passive scan 5 GHz and p2p_add_cli_chan=1 (intent 15)"""
  526. dev[0].request("SET p2p_add_cli_chan 1")
  527. dev[1].request("SET p2p_add_cli_chan 1")
  528. [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=0,
  529. r_dev=dev[1], r_intent=15,
  530. test_data=False)
  531. check_grpform_results(i_res, r_res)
  532. if int(i_res['freq']) > 4000:
  533. raise Exception("Unexpected channel - did not follow world roaming rules")
  534. remove_group(dev[0], dev[1])
  535. def test_grpform_no_5ghz_add_cli4(dev):
  536. """P2P group formation with passive scan 5 GHz and p2p_add_cli_chan=1 (reverse; intent 15)"""
  537. dev[0].request("SET p2p_add_cli_chan 1")
  538. dev[1].request("SET p2p_add_cli_chan 1")
  539. [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=15,
  540. r_dev=dev[1], r_intent=0,
  541. test_data=False)
  542. check_grpform_results(i_res, r_res)
  543. if int(i_res['freq']) > 4000:
  544. raise Exception("Unexpected channel - did not follow world roaming rules")
  545. remove_group(dev[0], dev[1])
  546. def test_grpform_incorrect_pin(dev):
  547. """P2P GO Negotiation with incorrect PIN"""
  548. dev[1].p2p_listen()
  549. addr1 = dev[1].p2p_dev_addr()
  550. if not dev[0].discover_peer(addr1):
  551. raise Exception("Peer not found")
  552. res = dev[1].global_request("P2P_CONNECT " + dev[0].p2p_dev_addr() + " pin auth go_intent=0")
  553. if "FAIL" in res:
  554. raise Exception("P2P_CONNECT failed to generate PIN")
  555. logger.info("PIN from P2P_CONNECT: " + res)
  556. dev[0].global_request("P2P_CONNECT " + addr1 + " 00000000 enter go_intent=15")
  557. ev = dev[0].wait_global_event(["P2P-GO-NEG-SUCCESS"], timeout=15)
  558. if ev is None:
  559. raise Exception("GO Negotiation did not complete successfully(0)")
  560. ev = dev[1].wait_global_event(["P2P-GO-NEG-SUCCESS"], timeout=15)
  561. if ev is None:
  562. raise Exception("GO Negotiation did not complete successfully(1)")
  563. ev = dev[1].wait_global_event(["WPS-FAIL"], timeout=15)
  564. if ev is None:
  565. raise Exception("WPS failure not reported(1)")
  566. if "msg=8 config_error=18" not in ev:
  567. raise Exception("Unexpected WPS failure(1): " + ev)
  568. ev = dev[0].wait_global_event(["WPS-FAIL"], timeout=15)
  569. if ev is None:
  570. raise Exception("WPS failure not reported")
  571. if "msg=8 config_error=18" not in ev:
  572. raise Exception("Unexpected WPS failure: " + ev)
  573. ev = dev[1].wait_global_event(["P2P-GROUP-FORMATION-FAILURE"], timeout=10)
  574. if ev is None:
  575. raise Exception("Group formation failure timed out")
  576. ev = dev[0].wait_global_event(["P2P-GROUP-FORMATION-FAILURE"], timeout=5)
  577. if ev is None:
  578. raise Exception("Group formation failure timed out")
  579. def test_grpform_reject(dev):
  580. """User rejecting group formation attempt by a P2P peer"""
  581. addr0 = dev[0].p2p_dev_addr()
  582. dev[0].p2p_listen()
  583. dev[1].p2p_go_neg_init(addr0, None, "pbc")
  584. ev = dev[0].wait_global_event(["P2P-GO-NEG-REQUEST"], timeout=15)
  585. if ev is None:
  586. raise Exception("GO Negotiation timed out")
  587. if "OK" in dev[0].global_request("P2P_REJECT foo"):
  588. raise Exception("Invalid P2P_REJECT accepted")
  589. if "FAIL" in dev[0].global_request("P2P_REJECT " + ev.split(' ')[1]):
  590. raise Exception("P2P_REJECT failed")
  591. dev[1].request("P2P_STOP_FIND")
  592. dev[1].p2p_go_neg_init(addr0, None, "pbc")
  593. ev = dev[1].wait_global_event(["GO-NEG-FAILURE"], timeout=10)
  594. if ev is None:
  595. raise Exception("Rejection not reported")
  596. if "status=11" not in ev:
  597. raise Exception("Unexpected status code in rejection")
  598. def test_grpform_pd_no_probe_resp(dev):
  599. """GO Negotiation after PD, but no Probe Response"""
  600. addr0 = dev[0].p2p_dev_addr()
  601. addr1 = dev[1].p2p_dev_addr()
  602. dev[0].p2p_listen()
  603. if not dev[1].discover_peer(addr0):
  604. raise Exception("Peer not found")
  605. dev[1].p2p_stop_find()
  606. dev[0].p2p_stop_find()
  607. peer = dev[0].get_peer(addr1)
  608. if peer['listen_freq'] == '0':
  609. raise Exception("Peer listen frequency not learned from Probe Request")
  610. time.sleep(0.3)
  611. dev[0].request("P2P_FLUSH")
  612. dev[0].p2p_listen()
  613. dev[1].global_request("P2P_PROV_DISC " + addr0 + " display")
  614. ev = dev[0].wait_global_event(["P2P-PROV-DISC-SHOW-PIN"], timeout=5)
  615. if ev is None:
  616. raise Exception("PD Request timed out")
  617. ev = dev[1].wait_global_event(["P2P-PROV-DISC-ENTER-PIN"], timeout=5)
  618. if ev is None:
  619. raise Exception("PD Response timed out")
  620. peer = dev[0].get_peer(addr1)
  621. if peer['listen_freq'] != '0':
  622. raise Exception("Peer listen frequency learned unexpectedly from PD Request")
  623. pin = dev[0].wps_read_pin()
  624. if "FAIL" in dev[1].global_request("P2P_CONNECT " + addr0 + " " + pin + " enter"):
  625. raise Exception("P2P_CONNECT on initiator failed")
  626. ev = dev[0].wait_global_event(["P2P-GO-NEG-REQUEST"], timeout=5)
  627. if ev is None:
  628. raise Exception("GO Negotiation start timed out")
  629. peer = dev[0].get_peer(addr1)
  630. if peer['listen_freq'] == '0':
  631. raise Exception("Peer listen frequency not learned from PD followed by GO Neg Req")
  632. if "FAIL" in dev[0].global_request("P2P_CONNECT " + addr1 + " " + pin + " display"):
  633. raise Exception("P2P_CONNECT on responder failed")
  634. ev = dev[0].wait_global_event(["P2P-GROUP-STARTED"], timeout=15)
  635. if ev is None:
  636. raise Exception("Group formation timed out")
  637. ev = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=15)
  638. if ev is None:
  639. raise Exception("Group formation timed out")
  640. def test_go_neg_two_peers(dev):
  641. """P2P GO Negotiation rejected due to already started negotiation with another peer"""
  642. addr0 = dev[0].p2p_dev_addr()
  643. addr1 = dev[1].p2p_dev_addr()
  644. addr2 = dev[2].p2p_dev_addr()
  645. dev[1].p2p_listen()
  646. dev[2].p2p_listen()
  647. if not dev[0].discover_peer(addr1):
  648. raise Exception("Could not discover peer")
  649. if not dev[0].discover_peer(addr2):
  650. raise Exception("Could not discover peer")
  651. if "OK" not in dev[0].request("P2P_CONNECT " + addr2 + " pbc auth"):
  652. raise Exception("Failed to authorize GO Neg")
  653. dev[0].p2p_listen()
  654. if not dev[2].discover_peer(addr0):
  655. raise Exception("Could not discover peer")
  656. if "OK" not in dev[0].request("P2P_CONNECT " + addr1 + " pbc"):
  657. raise Exception("Failed to initiate GO Neg")
  658. ev = dev[1].wait_global_event(["P2P-GO-NEG-REQUEST"], timeout=5)
  659. if ev is None:
  660. raise Exception("timeout on GO Neg RX event")
  661. dev[2].request("P2P_CONNECT " + addr0 + " pbc")
  662. ev = dev[2].wait_global_event(["GO-NEG-FAILURE"], timeout=10)
  663. if ev is None:
  664. raise Exception("Rejection not reported")
  665. if "status=5" not in ev:
  666. raise Exception("Unexpected status code in rejection: " + ev)
  667. def clear_pbc_overlap(dev, ifname):
  668. hapd_global = hostapd.HostapdGlobal()
  669. hapd_global.remove(ifname)
  670. dev[0].request("P2P_CANCEL")
  671. dev[1].request("P2P_CANCEL")
  672. dev[0].p2p_stop_find()
  673. dev[1].p2p_stop_find()
  674. dev[0].dump_monitor()
  675. dev[1].dump_monitor()
  676. time.sleep(0.1)
  677. dev[0].flush_scan_cache()
  678. dev[1].flush_scan_cache()
  679. time.sleep(0.1)
  680. def test_grpform_pbc_overlap(dev, apdev):
  681. """P2P group formation during PBC overlap"""
  682. params = { "ssid": "wps", "eap_server": "1", "wps_state": "1" }
  683. hapd = hostapd.add_ap(apdev[0]['ifname'], params)
  684. hapd.request("WPS_PBC")
  685. time.sleep(0.1)
  686. # Since P2P Client scan case is now optimzied to use a specific SSID, the
  687. # WPS AP will not reply to that and the scan after GO Negotiation can quite
  688. # likely miss the AP due to dwell time being short enoguh to miss the Beacon
  689. # frame. This has made the test case somewhat pointless, but keep it here
  690. # for now with an additional scan to confirm that PBC detection works if
  691. # there is a BSS entry for a overlapping AP.
  692. for i in range(0, 5):
  693. dev[0].scan(freq="2412")
  694. if dev[0].get_bss(apdev[0]['bssid']) is not None:
  695. break
  696. addr0 = dev[0].p2p_dev_addr()
  697. addr1 = dev[1].p2p_dev_addr()
  698. dev[0].p2p_listen()
  699. if not dev[1].discover_peer(addr0):
  700. raise Exception("Could not discover peer")
  701. dev[1].p2p_listen()
  702. if not dev[0].discover_peer(addr1):
  703. raise Exception("Could not discover peer")
  704. dev[0].p2p_listen()
  705. if "OK" not in dev[0].global_request("P2P_CONNECT " + addr1 + " pbc auth go_intent=0"):
  706. raise Exception("Failed to authorize GO Neg")
  707. if "OK" not in dev[1].global_request("P2P_CONNECT " + addr0 + " pbc go_intent=15 freq=2412"):
  708. raise Exception("Failed to initiate GO Neg")
  709. ev = dev[0].wait_global_event(["WPS-OVERLAP-DETECTED"], timeout=15)
  710. if ev is None:
  711. raise Exception("PBC overlap not reported")
  712. clear_pbc_overlap(dev, apdev[0]['ifname'])
  713. def test_grpform_pbc_overlap_group_iface(dev, apdev):
  714. """P2P group formation during PBC overlap using group interfaces"""
  715. # Note: Need to include P2P IE from the AP to get the P2P interface BSS
  716. # update use this information.
  717. params = { "ssid": "wps", "eap_server": "1", "wps_state": "1",
  718. "beacon_int": "15", 'manage_p2p': '1' }
  719. hapd = hostapd.add_ap(apdev[0]['ifname'], params)
  720. hapd.request("WPS_PBC")
  721. dev[0].request("SET p2p_no_group_iface 0")
  722. dev[1].request("SET p2p_no_group_iface 0")
  723. addr0 = dev[0].p2p_dev_addr()
  724. addr1 = dev[1].p2p_dev_addr()
  725. dev[0].p2p_listen()
  726. if not dev[1].discover_peer(addr0):
  727. raise Exception("Could not discover peer")
  728. dev[1].p2p_listen()
  729. if not dev[0].discover_peer(addr1):
  730. raise Exception("Could not discover peer")
  731. dev[0].p2p_stop_find()
  732. dev[0].scan(freq="2412")
  733. dev[0].p2p_listen()
  734. if "OK" not in dev[0].global_request("P2P_CONNECT " + addr1 + " pbc auth go_intent=0"):
  735. raise Exception("Failed to authorize GO Neg")
  736. if "OK" not in dev[1].global_request("P2P_CONNECT " + addr0 + " pbc go_intent=15 freq=2412"):
  737. raise Exception("Failed to initiate GO Neg")
  738. ev = dev[0].wait_global_event(["WPS-OVERLAP-DETECTED",
  739. "P2P-GROUP-FORMATION-SUCCESS"], timeout=15)
  740. if ev is None or "WPS-OVERLAP-DETECTED" not in ev:
  741. # Do not report this as failure since the P2P group formation case
  742. # using a separate group interface has limited chances of "seeing" the
  743. # overlapping AP due to a per-SSID scan and no prior scan operations on
  744. # the group interface.
  745. logger.info("PBC overlap not reported")
  746. clear_pbc_overlap(dev, apdev[0]['ifname'])
  747. def test_grpform_goneg_fail_with_group_iface(dev):
  748. """P2P group formation fails while using group interface"""
  749. dev[0].request("SET p2p_no_group_iface 0")
  750. dev[1].p2p_listen()
  751. peer = dev[1].p2p_dev_addr()
  752. if not dev[0].discover_peer(peer):
  753. raise Exception("Peer " + peer + " not found")
  754. if "OK" not in dev[1].request("P2P_REJECT " + dev[0].p2p_dev_addr()):
  755. raise Exception("P2P_REJECT failed")
  756. if "OK" not in dev[0].request("P2P_CONNECT " + peer + " pbc"):
  757. raise Exception("P2P_CONNECT failed")
  758. ev = dev[0].wait_global_event(["P2P-GO-NEG-FAILURE"], timeout=10)
  759. if ev is None:
  760. raise Exception("GO Negotiation failure timed out")
  761. def test_grpform_cred_ready_timeout(dev, apdev, params):
  762. """P2P GO Negotiation wait for credentials to become ready [long]"""
  763. if not params['long']:
  764. raise HwsimSkip("Skip test case with long duration due to --long not specified")
  765. dev[1].p2p_listen()
  766. addr1 = dev[1].p2p_dev_addr()
  767. if not dev[0].discover_peer(addr1):
  768. raise Exception("Peer " + addr1 + " not found")
  769. if not dev[2].discover_peer(addr1):
  770. raise Exception("Peer " + addr1 + " not found(2)")
  771. start = os.times()[4]
  772. cmd = "P2P_CONNECT " + addr1 + " 12345670 display"
  773. if "OK" not in dev[0].global_request(cmd):
  774. raise Exception("Failed to initiate GO Neg")
  775. if "OK" not in dev[2].global_request(cmd):
  776. raise Exception("Failed to initiate GO Neg(2)")
  777. # First, check with p2p_find
  778. ev = dev[2].wait_global_event(["P2P-GO-NEG-FAILURE"], timeout=30)
  779. if ev is not None:
  780. raise Exception("Too early GO Negotiation timeout reported(2)")
  781. dev[2].dump_monitor()
  782. logger.info("Starting p2p_find to change state")
  783. dev[2].p2p_find()
  784. ev = dev[2].wait_global_event(["P2P-GO-NEG-FAILURE"], timeout=100)
  785. if ev is None:
  786. raise Exception("GO Negotiation failure timed out(2)")
  787. dev[2].dump_monitor()
  788. end = os.times()[4]
  789. logger.info("GO Negotiation wait time: {} seconds(2)".format(end - start))
  790. if end - start < 120:
  791. raise Exception("Too short GO Negotiation wait time(2): {}".format(end - start))
  792. wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5')
  793. wpas.interface_add("wlan5")
  794. wpas.p2p_listen()
  795. ev = dev[2].wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
  796. if ev is None:
  797. raise Exception("Did not discover new device after GO Negotiation failure")
  798. if wpas.p2p_dev_addr() not in ev:
  799. raise Exception("Unexpected device found: " + ev)
  800. dev[2].p2p_stop_find()
  801. wpas.p2p_stop_find()
  802. # Finally, verify without p2p_find
  803. ev = dev[0].wait_global_event(["P2P-GO-NEG-FAILURE"], timeout=120)
  804. if ev is None:
  805. raise Exception("GO Negotiation failure timed out")
  806. end = os.times()[4]
  807. logger.info("GO Negotiation wait time: {} seconds".format(end - start))
  808. if end - start < 120:
  809. raise Exception("Too short GO Negotiation wait time: {}".format(end - start))
  810. def test_grpform_no_wsc_done(dev):
  811. """P2P group formation with WSC-Done not sent"""
  812. addr0 = dev[0].p2p_dev_addr()
  813. addr1 = dev[1].p2p_dev_addr()
  814. for i in range(0, 2):
  815. dev[0].request("SET ext_eapol_frame_io 1")
  816. dev[1].request("SET ext_eapol_frame_io 1")
  817. dev[0].p2p_listen()
  818. dev[1].p2p_go_neg_auth(addr0, "12345670", "display", 0)
  819. dev[1].p2p_listen()
  820. dev[0].p2p_go_neg_init(addr1, "12345670", "enter", timeout=20,
  821. go_intent=15, wait_group=False)
  822. mode = None
  823. while True:
  824. ev = dev[0].wait_event(["EAPOL-TX"], timeout=15)
  825. if ev is None:
  826. raise Exception("Timeout on EAPOL-TX from GO")
  827. if not mode:
  828. mode = dev[0].get_status_field("mode")
  829. res = dev[1].request("EAPOL_RX " + addr0 + " " + ev.split(' ')[2])
  830. if "OK" not in res:
  831. raise Exception("EAPOL_RX failed")
  832. ev = dev[1].wait_event(["EAPOL-TX"], timeout=15)
  833. if ev is None:
  834. raise Exception("Timeout on EAPOL-TX from P2P Client")
  835. msg = ev.split(' ')[2]
  836. if msg[46:56] == "102200010f":
  837. logger.info("Drop WSC_Done")
  838. dev[0].request("SET ext_eapol_frame_io 0")
  839. dev[1].request("SET ext_eapol_frame_io 0")
  840. # Fake EAP-Failure to complete session on the client
  841. id = msg[10:12]
  842. dev[1].request("EAPOL_RX " + addr0 + " 0300000404" + id + "0004")
  843. break
  844. res = dev[0].request("EAPOL_RX " + addr1 + " " + msg)
  845. if "OK" not in res:
  846. raise Exception("EAPOL_RX failed")
  847. ev = dev[0].wait_global_event(["P2P-GROUP-STARTED"], timeout=15)
  848. if ev is None:
  849. raise Exception("Group formation timed out on GO")
  850. ev = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=15)
  851. if ev is None:
  852. raise Exception("Group formation timed out on P2P Client")
  853. dev[0].remove_group()
  854. dev[1].wait_go_ending_session()
  855. if mode != "P2P GO - group formation":
  856. raise Exception("Unexpected mode on GO during group formation: " + mode)
  857. def test_grpform_wait_peer(dev):
  858. """P2P group formation wait for peer to become ready"""
  859. addr0 = dev[0].p2p_dev_addr()
  860. addr1 = dev[1].p2p_dev_addr()
  861. dev[1].p2p_listen()
  862. if not dev[0].discover_peer(addr1):
  863. raise Exception("Peer " + addr1 + " not found")
  864. dev[0].request("SET extra_roc_dur 500")
  865. if "OK" not in dev[0].request("P2P_CONNECT " + addr1 + " 12345670 display go_intent=15"):
  866. raise Exception("Failed to initiate GO Neg")
  867. time.sleep(3)
  868. dev[1].request("P2P_CONNECT " + addr0 + " 12345670 enter go_intent=0")
  869. ev = dev[0].wait_global_event(["P2P-GROUP-STARTED"], timeout=15)
  870. if ev is None:
  871. raise Exception("Group formation timed out")
  872. dev[0].group_form_result(ev)
  873. dev[0].request("SET extra_roc_dur 0")
  874. ev = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=15)
  875. if ev is None:
  876. raise Exception("Group formation timed out")
  877. dev[0].remove_group()
  878. def test_invalid_p2p_connect_command(dev):
  879. """P2P_CONNECT error cases"""
  880. id = dev[0].add_network()
  881. for cmd in [ "foo",
  882. "00:11:22:33:44:55",
  883. "00:11:22:33:44:55 pbc persistent=123",
  884. "00:11:22:33:44:55 pbc persistent=%d" % id,
  885. "00:11:22:33:44:55 pbc go_intent=-1",
  886. "00:11:22:33:44:55 pbc go_intent=16",
  887. "00:11:22:33:44:55 pin",
  888. "00:11:22:33:44:55 pbc freq=0" ]:
  889. if "FAIL" not in dev[0].request("P2P_CONNECT " + cmd):
  890. raise Exception("Invalid P2P_CONNECT command accepted: " + cmd)
  891. if "FAIL-INVALID-PIN" not in dev[0].request("P2P_CONNECT 00:11:22:33:44:55 1234567"):
  892. raise Exception("Invalid PIN was not rejected")
  893. if "FAIL-INVALID-PIN" not in dev[0].request("P2P_CONNECT 00:11:22:33:44:55 12345678a"):
  894. raise Exception("Invalid PIN was not rejected")
  895. if "FAIL-CHANNEL-UNSUPPORTED" not in dev[0].request("P2P_CONNECT 00:11:22:33:44:55 pin freq=3000"):
  896. raise Exception("Unsupported channel not reported")
  897. def test_p2p_unauthorize(dev):
  898. """P2P_UNAUTHORIZE to unauthorize a peer"""
  899. if "FAIL" not in dev[0].request("P2P_UNAUTHORIZE foo"):
  900. raise Exception("Invalid P2P_UNAUTHORIZE accepted")
  901. if "FAIL" not in dev[0].request("P2P_UNAUTHORIZE 00:11:22:33:44:55"):
  902. raise Exception("P2P_UNAUTHORIZE for unknown peer accepted")
  903. addr0 = dev[0].p2p_dev_addr()
  904. addr1 = dev[1].p2p_dev_addr()
  905. dev[1].p2p_listen()
  906. pin = dev[0].wps_read_pin()
  907. dev[0].p2p_go_neg_auth(addr1, pin, "display")
  908. dev[0].p2p_listen()
  909. if "OK" not in dev[0].request("P2P_UNAUTHORIZE " + addr1):
  910. raise Exception("P2P_UNAUTHORIZE failed")
  911. dev[1].p2p_go_neg_init(addr0, pin, "keypad", timeout=0)
  912. ev = dev[0].wait_global_event(["P2P-GO-NEG-REQUEST"], timeout=10)
  913. if ev is None:
  914. raise Exception("No GO Negotiation Request RX reported")
  915. def test_grpform_pbc_multiple(dev):
  916. """P2P group formation using PBC multiple times in a row"""
  917. try:
  918. dev[1].request("SET passive_scan 1")
  919. for i in range(5):
  920. [i_res, r_res] = go_neg_pbc_authorized(i_dev=dev[0], i_intent=15,
  921. r_dev=dev[1], r_intent=0)
  922. remove_group(dev[0], dev[1])
  923. finally:
  924. dev[1].request("SET passive_scan 0")
  925. dev[1].flush_scan_cache()
  926. def test_grpform_not_ready(dev):
  927. """Not ready for GO Negotiation (listen)"""
  928. addr0 = dev[0].p2p_dev_addr()
  929. addr2 = dev[2].p2p_dev_addr()
  930. dev[0].p2p_listen()
  931. if not dev[1].discover_peer(addr0):
  932. raise Exception("Could not discover peer")
  933. dev[1].global_request("P2P_CONNECT " + addr0 + " pbc")
  934. ev = dev[0].wait_global_event(["P2P-GO-NEG-REQUEST"], timeout=5)
  935. if ev is None:
  936. raise Exception("No P2P-GO-NEG-REQUEST event")
  937. dev[0].dump_monitor()
  938. time.sleep(5)
  939. if not dev[2].discover_peer(addr0):
  940. raise Exception("Could not discover peer(2)")
  941. for i in range(3):
  942. dev[i].p2p_stop_find()
  943. def test_grpform_not_ready2(dev):
  944. """Not ready for GO Negotiation (search)"""
  945. addr0 = dev[0].p2p_dev_addr()
  946. addr2 = dev[2].p2p_dev_addr()
  947. dev[0].p2p_find(social=True)
  948. if not dev[1].discover_peer(addr0):
  949. raise Exception("Could not discover peer")
  950. dev[1].global_request("P2P_CONNECT " + addr0 + " pbc")
  951. ev = dev[0].wait_global_event(["P2P-GO-NEG-REQUEST"], timeout=5)
  952. if ev is None:
  953. raise Exception("No P2P-GO-NEG-REQUEST event")
  954. dev[0].dump_monitor()
  955. time.sleep(1)
  956. dev[2].p2p_listen()
  957. ev = dev[0].wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
  958. if ev is None:
  959. raise Exception("Peer not discovered after GO Neg Resp(status=1) TX")
  960. if addr2 not in ev:
  961. raise Exception("Unexpected peer discovered: " + ev)
  962. for i in range(3):
  963. dev[i].p2p_stop_find()
  964. def test_grpform_and_scan(dev):
  965. """GO Negotiation and scan operations"""
  966. addr0 = dev[0].p2p_dev_addr()
  967. addr1 = dev[1].p2p_dev_addr()
  968. dev[1].p2p_listen()
  969. if not dev[0].discover_peer(addr1):
  970. raise Exception("Could not discover peer")
  971. dev[0].p2p_stop_find()
  972. dev[1].p2p_stop_find()
  973. if "OK" not in dev[0].request("SCAN TYPE=ONLY freq=2412-2472"):
  974. raise Exception("Could not start scan")
  975. ev = dev[0].wait_event(["CTRL-EVENT-SCAN-STARTED"], timeout=5)
  976. if ev is None:
  977. raise Exception("Scan did not start")
  978. time.sleep(0.1)
  979. # Request PD while the previously started scan is still in progress
  980. if "OK" not in dev[0].request("P2P_PROV_DISC %s pbc" % addr1):
  981. raise Exception("Could not request PD")
  982. ev = dev[0].wait_event(["CTRL-EVENT-SCAN-RESULTS"], timeout=10)
  983. if ev is None:
  984. raise Exception("Scan did not complete")
  985. time.sleep(0.3)
  986. dev[1].p2p_listen()
  987. ev = dev[0].wait_global_event(["P2P-PROV-DISC-PBC-RESP"], timeout=5)
  988. if ev is None:
  989. raise Exception("PD Response not received")
  990. if "OK" not in dev[0].request("SCAN TYPE=ONLY freq=2412-2472"):
  991. raise Exception("Could not start scan")
  992. ev = dev[0].wait_event(["CTRL-EVENT-SCAN-STARTED"], timeout=5)
  993. if ev is None:
  994. raise Exception("Scan did not start")
  995. time.sleep(0.1)
  996. # Request GO Neg while the previously started scan is still in progress
  997. if "OK" not in dev[0].request("P2P_CONNECT %s pbc" % addr1):
  998. raise Exception("Could not request GO Negotiation")
  999. ev = dev[0].wait_event(["CTRL-EVENT-SCAN-RESULTS"], timeout=10)
  1000. if ev is None:
  1001. raise Exception("Scan did not complete")
  1002. ev = dev[1].wait_global_event(["P2P-GO-NEG-REQUEST"], timeout=10)
  1003. if ev is None:
  1004. raise Exception("GO Neg Req RX not reported")
  1005. dev[1].p2p_stop_find()
  1006. if "OK" not in dev[1].request("SCAN TYPE=ONLY freq=2412-2472"):
  1007. raise Exception("Could not start scan")
  1008. ev = dev[1].wait_event(["CTRL-EVENT-SCAN-STARTED"], timeout=5)
  1009. if ev is None:
  1010. raise Exception("Scan did not start")
  1011. time.sleep(0.1)
  1012. dev[1].global_request("P2P_CONNECT " + addr0 + " pbc")
  1013. ev = dev[1].wait_event(["CTRL-EVENT-SCAN-RESULTS"], timeout=10)
  1014. if ev is None:
  1015. raise Exception("Scan did not complete")
  1016. ev0 = dev[0].wait_global_event(["P2P-GROUP-STARTED"], timeout=15)
  1017. if ev0 is None:
  1018. raise Exception("Group formation timed out on dev0")
  1019. dev[0].group_form_result(ev0)
  1020. ev1 = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=15)
  1021. if ev1 is None:
  1022. raise Exception("Group formation timed out on dev1")
  1023. dev[1].group_form_result(ev1)
  1024. dev[0].dump_monitor()
  1025. dev[1].dump_monitor()
  1026. remove_group(dev[0], dev[1])
  1027. dev[0].dump_monitor()
  1028. dev[1].dump_monitor()
  1029. def test_grpform_go_neg_dup_on_restart(dev):
  1030. """Duplicated GO Negotiation Request after GO Neg restart"""
  1031. if dev[0].p2p_dev_addr() > dev[1].p2p_dev_addr():
  1032. higher = dev[0]
  1033. lower = dev[1]
  1034. else:
  1035. higher = dev[1]
  1036. lower = dev[0]
  1037. addr_low = lower.p2p_dev_addr()
  1038. addr_high = higher.p2p_dev_addr()
  1039. higher.p2p_listen()
  1040. if not lower.discover_peer(addr_high):
  1041. raise Exception("Could not discover peer")
  1042. lower.p2p_stop_find()
  1043. if "OK" not in lower.request("P2P_CONNECT %s pbc" % addr_high):
  1044. raise Exception("Could not request GO Negotiation")
  1045. ev = higher.wait_global_event(["P2P-GO-NEG-REQUEST"], timeout=10)
  1046. if ev is None:
  1047. raise Exception("GO Neg Req RX not reported")
  1048. # Wait for GO Negotiation Response (Status=1) to go through
  1049. time.sleep(0.2)
  1050. if "FAIL" in lower.request("SET ext_mgmt_frame_handling 1"):
  1051. raise Exception("Failed to enable external management frame handling")
  1052. higher.p2p_stop_find()
  1053. higher.global_request("P2P_CONNECT " + addr_low + " pbc")
  1054. # Wait for the GO Negotiation Request frame of the restarted GO Negotiation
  1055. rx_msg = lower.mgmt_rx()
  1056. if rx_msg is None:
  1057. raise Exception("MGMT-RX timeout")
  1058. p2p = parse_p2p_public_action(rx_msg['payload'])
  1059. if p2p is None:
  1060. raise Exception("Not a P2P Public Action frame")
  1061. if p2p['subtype'] != 0:
  1062. raise Exception("Unexpected P2P Public Action subtype %d" % p2p['subtype'])
  1063. # Send duplicate GO Negotiation Request from the prior instance of GO
  1064. # Negotiation
  1065. lower.p2p_stop_find()
  1066. peer = higher.get_peer(addr_low)
  1067. msg = p2p_hdr(addr_high, addr_low, type=P2P_GO_NEG_REQ, dialog_token=123)
  1068. attrs = p2p_attr_capability(dev_capab=0x25, group_capab=0x08)
  1069. attrs += p2p_attr_go_intent(go_intent=7, tie_breaker=1)
  1070. attrs += p2p_attr_config_timeout()
  1071. attrs += p2p_attr_listen_channel(chan=(int(peer['listen_freq']) - 2407) / 5)
  1072. attrs += p2p_attr_intended_interface_addr(lower.p2p_dev_addr())
  1073. attrs += p2p_attr_channel_list()
  1074. attrs += p2p_attr_device_info(addr_low, config_methods=0x80, name="Device A")
  1075. attrs += p2p_attr_operating_channel()
  1076. wsc_attrs = struct.pack(">HHH", 0x1012, 2, 4)
  1077. msg['payload'] += ie_p2p(attrs) + ie_wsc(wsc_attrs)
  1078. mgmt_tx(lower, "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr_high, addr_high, peer['listen_freq'], binascii.hexlify(msg['payload'])))
  1079. # Wait for the GO Negotiation Response frame which would have been sent in
  1080. # this case previously, but not anymore after the check for
  1081. # dev->go_neg_req_sent and dev->flags & P2P_DEV_PEER_WAITING_RESPONSE.
  1082. rx_msg = lower.mgmt_rx(timeout=0.2)
  1083. if rx_msg is not None:
  1084. raise Exception("Unexpected management frame")
  1085. if "FAIL" in lower.request("SET ext_mgmt_frame_handling 0"):
  1086. raise Exception("Failed to disable external management frame handling")
  1087. lower.p2p_listen()
  1088. ev = lower.wait_global_event(["P2P-GO-NEG-SUCCESS"], timeout=10)
  1089. if ev is None:
  1090. raise Exception("GO Negotiation did not succeed on dev0")
  1091. ev = higher.wait_global_event(["P2P-GO-NEG-SUCCESS"], timeout=10)
  1092. if ev is None:
  1093. raise Exception("GO Negotiation did not succeed on dev1")
  1094. ev0 = lower.wait_global_event(["P2P-GROUP-STARTED"], timeout=15)
  1095. if ev0 is None:
  1096. raise Exception("Group formation timed out on dev0")
  1097. lower.group_form_result(ev0)
  1098. ev1 = higher.wait_global_event(["P2P-GROUP-STARTED"], timeout=15)
  1099. if ev1 is None:
  1100. raise Exception("Group formation timed out on dev1")
  1101. higher.group_form_result(ev1)
  1102. lower.dump_monitor()
  1103. higher.dump_monitor()
  1104. remove_group(lower, higher)
  1105. lower.dump_monitor()
  1106. higher.dump_monitor()