test_p2p_persistent.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  1. #!/usr/bin/python
  2. #
  3. # P2P persistent group test cases
  4. # Copyright (c) 2013, Jouni Malinen <j@w1.fi>
  5. #
  6. # This software may be distributed under the terms of the BSD license.
  7. # See README for more details.
  8. import logging
  9. logger = logging.getLogger()
  10. import hwsim_utils
  11. def go_neg_pin_authorized_persistent(i_dev, r_dev, i_intent=None, r_intent=None, i_method='enter', r_method='display', test_data=True):
  12. r_dev.p2p_listen()
  13. i_dev.p2p_listen()
  14. pin = r_dev.wps_read_pin()
  15. logger.info("Start GO negotiation " + i_dev.ifname + " -> " + r_dev.ifname)
  16. r_dev.p2p_go_neg_auth(i_dev.p2p_dev_addr(), pin, r_method,
  17. go_intent=r_intent, persistent=True)
  18. i_res = i_dev.p2p_go_neg_init(r_dev.p2p_dev_addr(), pin, i_method,
  19. timeout=20, go_intent=i_intent,
  20. persistent=True)
  21. r_res = r_dev.p2p_go_neg_auth_result()
  22. logger.debug("i_res: " + str(i_res))
  23. logger.debug("r_res: " + str(r_res))
  24. r_dev.dump_monitor()
  25. i_dev.dump_monitor()
  26. logger.info("Group formed")
  27. if test_data:
  28. hwsim_utils.test_connectivity_p2p(r_dev, i_dev)
  29. return [i_res, r_res]
  30. def terminate_group(go, cli):
  31. logger.info("Terminate persistent group")
  32. go.remove_group()
  33. cli.wait_go_ending_session()
  34. def invite(inv, resp, extra=None):
  35. addr = resp.p2p_dev_addr()
  36. resp.request("SET persistent_reconnect 1")
  37. resp.p2p_listen()
  38. if not inv.discover_peer(addr, social=True):
  39. raise Exception("Peer " + addr + " not found")
  40. inv.dump_monitor()
  41. peer = inv.get_peer(addr)
  42. cmd = "P2P_INVITE persistent=" + peer['persistent'] + " peer=" + addr
  43. if extra:
  44. cmd = cmd + " " + extra;
  45. inv.global_request(cmd)
  46. def check_result(go, cli):
  47. ev = go.wait_global_event(["P2P-GROUP-STARTED"], timeout=30)
  48. if ev is None:
  49. raise Exception("Timeout on group re-invocation (on GO)")
  50. if "[PERSISTENT]" not in ev:
  51. raise Exception("Re-invoked group not marked persistent")
  52. go_res = go.group_form_result(ev)
  53. if go_res['role'] != 'GO':
  54. raise Exception("Persistent group GO did not become GO")
  55. if not go_res['persistent']:
  56. raise Exception("Persistent group not re-invoked as persistent (GO)")
  57. ev = cli.wait_global_event(["P2P-GROUP-STARTED"], timeout=30)
  58. if ev is None:
  59. raise Exception("Timeout on group re-invocation (on client)")
  60. if "[PERSISTENT]" not in ev:
  61. raise Exception("Re-invoked group not marked persistent")
  62. cli_res = cli.group_form_result(ev)
  63. if cli_res['role'] != 'client':
  64. raise Exception("Persistent group client did not become client")
  65. if not cli_res['persistent']:
  66. raise Exception("Persistent group not re-invoked as persistent (cli)")
  67. return [go_res, cli_res]
  68. def form(go, cli, test_data=True):
  69. logger.info("Form a persistent group")
  70. [i_res, r_res] = go_neg_pin_authorized_persistent(i_dev=go, i_intent=15,
  71. r_dev=cli, r_intent=0,
  72. test_data=test_data)
  73. if not i_res['persistent'] or not r_res['persistent']:
  74. raise Exception("Formed group was not persistent")
  75. terminate_group(go, cli)
  76. def invite_from_cli(go, cli):
  77. logger.info("Re-invoke persistent group from client")
  78. invite(cli, go)
  79. check_result(go, cli)
  80. hwsim_utils.test_connectivity_p2p(go, cli)
  81. terminate_group(go, cli)
  82. def invite_from_go(go, cli):
  83. logger.info("Re-invoke persistent group from GO")
  84. invite(go, cli)
  85. check_result(go, cli)
  86. hwsim_utils.test_connectivity_p2p(go, cli)
  87. terminate_group(go, cli)
  88. def test_persistent_group(dev):
  89. """P2P persistent group formation and re-invocation"""
  90. form(dev[0], dev[1])
  91. invite_from_cli(dev[0], dev[1])
  92. invite_from_go(dev[0], dev[1])
  93. def test_persistent_group_per_sta_psk(dev):
  94. """P2P persistent group formation and re-invocation using per-client PSK"""
  95. addr0 = dev[0].p2p_dev_addr()
  96. addr1 = dev[1].p2p_dev_addr()
  97. addr2 = dev[2].p2p_dev_addr()
  98. dev[0].request("P2P_SET per_sta_psk 1")
  99. logger.info("Form a persistent group")
  100. [i_res, r_res] = go_neg_pin_authorized_persistent(i_dev=dev[0], i_intent=15,
  101. r_dev=dev[1], r_intent=0)
  102. if not i_res['persistent'] or not r_res['persistent']:
  103. raise Exception("Formed group was not persistent")
  104. logger.info("Join another client to the group")
  105. pin = dev[2].wps_read_pin()
  106. dev[0].p2p_go_authorize_client(pin)
  107. c_res = dev[2].p2p_connect_group(addr0, pin, timeout=60)
  108. if not c_res['persistent']:
  109. raise Exception("Joining client did not recognize persistent group")
  110. if r_res['psk'] == c_res['psk']:
  111. raise Exception("Same PSK assigned for both clients")
  112. hwsim_utils.test_connectivity_p2p_sta(dev[1], dev[2])
  113. logger.info("Leave persistent group and rejoin it")
  114. dev[2].remove_group()
  115. ev = dev[2].wait_event(["P2P-GROUP-REMOVED"], timeout=3)
  116. if ev is None:
  117. raise Exception("Group removal event timed out")
  118. if not dev[2].discover_peer(addr0, social=True):
  119. raise Exception("Peer " + peer + " not found")
  120. dev[2].dump_monitor()
  121. peer = dev[2].get_peer(addr0)
  122. dev[2].global_request("P2P_GROUP_ADD persistent=" + peer['persistent'])
  123. ev = dev[2].wait_global_event(["P2P-GROUP-STARTED"], timeout=30)
  124. if ev is None:
  125. raise Exception("Timeout on group restart (on client)")
  126. cli_res = dev[2].group_form_result(ev)
  127. if not cli_res['persistent']:
  128. raise Exception("Persistent group not restarted as persistent (cli)")
  129. hwsim_utils.test_connectivity_p2p(dev[1], dev[2])
  130. logger.info("Remove one of the clients from the group")
  131. dev[0].global_request("P2P_REMOVE_CLIENT " + addr2)
  132. dev[2].wait_go_ending_session()
  133. logger.info("Try to reconnect after having been removed from group")
  134. if not dev[2].discover_peer(addr0, social=True):
  135. raise Exception("Peer " + peer + " not found")
  136. dev[2].dump_monitor()
  137. peer = dev[2].get_peer(addr0)
  138. dev[2].global_request("P2P_GROUP_ADD persistent=" + peer['persistent'])
  139. ev = dev[2].wait_global_event(["P2P-GROUP-STARTED","WPA: 4-Way Handshake failed"], timeout=30)
  140. if ev is None:
  141. raise Exception("Timeout on group restart (on client)")
  142. if "P2P-GROUP-STARTED" in ev:
  143. raise Exception("Client managed to connect after being removed")
  144. logger.info("Remove the remaining client from the group")
  145. dev[0].global_request("P2P_REMOVE_CLIENT " + addr1)
  146. dev[1].wait_go_ending_session()
  147. logger.info("Terminate persistent group")
  148. dev[0].remove_group()
  149. dev[0].dump_monitor()
  150. logger.info("Try to re-invoke persistent group from client")
  151. dev[0].request("SET persistent_reconnect 1")
  152. dev[0].p2p_listen()
  153. if not dev[1].discover_peer(addr0, social=True):
  154. raise Exception("Peer " + peer + " not found")
  155. dev[1].dump_monitor()
  156. peer = dev[1].get_peer(addr0)
  157. dev[1].global_request("P2P_INVITE persistent=" + peer['persistent'] + " peer=" + addr0)
  158. ev = dev[1].wait_global_event(["P2P-GROUP-STARTED","WPA: 4-Way Handshake failed"], timeout=30)
  159. if ev is None:
  160. raise Exception("Timeout on group restart (on client)")
  161. if "P2P-GROUP-STARTED" in ev:
  162. raise Exception("Client managed to re-invoke after being removed")
  163. dev[0].dump_monitor()
  164. logger.info("Terminate persistent group")
  165. dev[0].remove_group()
  166. dev[0].dump_monitor()
  167. def test_persistent_group_invite_removed_client(dev):
  168. """P2P persistent group client removal and re-invitation"""
  169. addr0 = dev[0].p2p_dev_addr()
  170. addr1 = dev[1].p2p_dev_addr()
  171. dev[0].request("P2P_SET per_sta_psk 1")
  172. logger.info("Form a persistent group")
  173. [i_res, r_res] = go_neg_pin_authorized_persistent(i_dev=dev[0], i_intent=15,
  174. r_dev=dev[1], r_intent=0)
  175. if not i_res['persistent'] or not r_res['persistent']:
  176. raise Exception("Formed group was not persistent")
  177. logger.info("Remove client from the group")
  178. dev[0].global_request("P2P_REMOVE_CLIENT " + addr1)
  179. dev[1].wait_go_ending_session()
  180. logger.info("Re-invite the removed client to join the group")
  181. dev[1].p2p_listen()
  182. if not dev[0].discover_peer(addr1, social=True):
  183. raise Exception("Peer " + peer + " not found")
  184. dev[0].global_request("P2P_INVITE group=" + dev[0].group_ifname + " peer=" + addr1)
  185. ev = dev[1].wait_global_event(["P2P-INVITATION-RECEIVED"], timeout=10)
  186. if ev is None:
  187. raise Exception("Timeout on invitation")
  188. if "sa=" + addr0 + " persistent=" not in ev:
  189. raise Exception("Unexpected invitation event")
  190. [event,addr,persistent] = ev.split(' ', 2)
  191. dev[1].global_request("P2P_GROUP_ADD " + persistent)
  192. ev = dev[1].wait_global_event(["P2P-PERSISTENT-PSK-FAIL"], timeout=30)
  193. if ev is None:
  194. raise Exception("Did not receive PSK failure report")
  195. [tmp,id] = ev.split('=', 1)
  196. ev = dev[1].wait_global_event(["P2P-GROUP-REMOVED"], timeout=10)
  197. if ev is None:
  198. raise Exception("Group removal event timed out")
  199. if "reason=PSK_FAILURE" not in ev:
  200. raise Exception("Unexpected group removal reason")
  201. dev[1].request("REMOVE_NETWORK " + id)
  202. logger.info("Re-invite after client removed persistent group info")
  203. dev[1].p2p_listen()
  204. if not dev[0].discover_peer(addr1, social=True):
  205. raise Exception("Peer " + peer + " not found")
  206. dev[0].global_request("P2P_INVITE group=" + dev[0].group_ifname + " peer=" + addr1)
  207. ev = dev[1].wait_global_event(["P2P-INVITATION-RECEIVED"], timeout=10)
  208. if ev is None:
  209. raise Exception("Timeout on invitation")
  210. if " persistent=" in ev:
  211. raise Exception("Unexpected invitation event")
  212. pin = dev[1].wps_read_pin()
  213. dev[0].p2p_go_authorize_client(pin)
  214. c_res = dev[1].p2p_connect_group(addr0, pin, timeout=60)
  215. if not c_res['persistent']:
  216. raise Exception("Joining client did not recognize persistent group")
  217. if r_res['psk'] == c_res['psk']:
  218. raise Exception("Same PSK assigned on both times")
  219. hwsim_utils.test_connectivity_p2p(dev[0], dev[1])
  220. terminate_group(dev[0], dev[1])
  221. def test_persistent_group_channel(dev):
  222. """P2P persistent group re-invocation with channel selection"""
  223. form(dev[0], dev[1], test_data=False)
  224. logger.info("Re-invoke persistent group from client with forced channel")
  225. invite(dev[1], dev[0], "freq=2427")
  226. [go_res, cli_res] = check_result(dev[0], dev[1])
  227. if go_res['freq'] != "2427":
  228. raise Exception("Persistent group client forced channel not followed")
  229. terminate_group(dev[0], dev[1])
  230. logger.info("Re-invoke persistent group from GO with forced channel")
  231. invite(dev[0], dev[1], "freq=2432")
  232. [go_res, cli_res] = check_result(dev[0], dev[1])
  233. if go_res['freq'] != "2432":
  234. raise Exception("Persistent group GO channel preference not followed")
  235. terminate_group(dev[0], dev[1])
  236. logger.info("Re-invoke persistent group from client with channel preference")
  237. invite(dev[1], dev[0], "pref=2417")
  238. [go_res, cli_res] = check_result(dev[0], dev[1])
  239. if go_res['freq'] != "2417":
  240. raise Exception("Persistent group client channel preference not followed")
  241. terminate_group(dev[0], dev[1])
  242. def test_persistent_group_and_role_change(dev):
  243. """P2P persistent group, auto GO in another role, and re-invocation"""
  244. form(dev[0], dev[1])
  245. logger.info("Start and stop autonomous GO on previous P2P client device")
  246. dev[1].p2p_start_go()
  247. dev[1].remove_group()
  248. dev[1].dump_monitor()
  249. logger.info("Re-invoke the persistent group")
  250. invite_from_go(dev[0], dev[1])