test_p2p_persistent.py 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  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(__name__)
  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'):
  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. hwsim_utils.test_connectivity_p2p(r_dev, i_dev)
  28. return [i_res, r_res]
  29. def test_persistent_group(dev):
  30. """P2P persistent group formation and re-invocation"""
  31. addr0 = dev[0].p2p_dev_addr()
  32. addr1 = dev[1].p2p_dev_addr()
  33. logger.info("Form a persistent group")
  34. [i_res, r_res] = go_neg_pin_authorized_persistent(i_dev=dev[0], i_intent=15,
  35. r_dev=dev[1], r_intent=0)
  36. if not i_res['persistent'] or not r_res['persistent']:
  37. raise Exception("Formed group was not persistent")
  38. logger.info("Terminate persistent group")
  39. dev[0].remove_group()
  40. ev = dev[1].wait_event(["P2P-GROUP-REMOVED"], timeout=3)
  41. if ev is None:
  42. raise Exception("Group removal event timed out")
  43. if "reason=GO_ENDING_SESSION" not in ev:
  44. raise Exception("Unexpected group removal reason")
  45. logger.info("Re-invoke persistent group from client")
  46. dev[0].request("SET persistent_reconnect 1")
  47. dev[0].p2p_listen()
  48. if not dev[1].discover_peer(addr0, social=True):
  49. raise Exception("Peer " + peer + " not found")
  50. dev[1].dump_monitor()
  51. peer = dev[1].get_peer(addr0)
  52. dev[1].global_request("P2P_INVITE persistent=" + peer['persistent'] + " peer=" + addr0)
  53. ev = dev[0].wait_global_event(["P2P-GROUP-STARTED"], timeout=30)
  54. if ev is None:
  55. raise Exception("Timeout on group re-invocation (on GO)")
  56. go_res = dev[0].group_form_result(ev)
  57. if go_res['role'] != 'GO':
  58. raise Exception("Persistent group GO did not become GO")
  59. if not go_res['persistent']:
  60. raise Exception("Persistent group not re-invoked as persistent (GO)")
  61. ev = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=30)
  62. if ev is None:
  63. raise Exception("Timeout on group re-invocation (on client)")
  64. cli_res = dev[1].group_form_result(ev)
  65. if cli_res['role'] != 'client':
  66. raise Exception("Persistent group client did not become client")
  67. if not cli_res['persistent']:
  68. raise Exception("Persistent group not re-invoked as persistent (cli)")
  69. hwsim_utils.test_connectivity_p2p(dev[0], dev[1])
  70. logger.info("Terminate persistent group")
  71. dev[0].remove_group()
  72. ev = dev[1].wait_event(["P2P-GROUP-REMOVED"], timeout=3)
  73. if ev is None:
  74. raise Exception("Group removal event timed out")
  75. if "reason=GO_ENDING_SESSION" not in ev:
  76. raise Exception("Unexpected group removal reason")
  77. logger.info("Re-invoke persistent group from GO")
  78. dev[1].request("SET persistent_reconnect 1")
  79. dev[1].p2p_listen()
  80. if not dev[0].discover_peer(addr1, social=True):
  81. raise Exception("Peer " + peer + " not found")
  82. dev[0].dump_monitor()
  83. peer = dev[0].get_peer(addr1)
  84. dev[0].global_request("P2P_INVITE persistent=" + peer['persistent'] + " peer=" + addr1)
  85. ev = dev[0].wait_global_event(["P2P-GROUP-STARTED"], timeout=30)
  86. if ev is None:
  87. raise Exception("Timeout on group re-invocation (on GO)")
  88. go_res = dev[0].group_form_result(ev)
  89. if go_res['role'] != 'GO':
  90. raise Exception("Persistent group GO did not become GO")
  91. if not go_res['persistent']:
  92. raise Exception("Persistent group not re-invoked as persistent (GO)")
  93. ev = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=30)
  94. if ev is None:
  95. raise Exception("Timeout on group re-invocation (on client)")
  96. cli_res = dev[1].group_form_result(ev)
  97. if cli_res['role'] != 'client':
  98. raise Exception("Persistent group client did not become client")
  99. if not cli_res['persistent']:
  100. raise Exception("Persistent group not re-invoked as persistent (cli)")
  101. hwsim_utils.test_connectivity_p2p(dev[0], dev[1])
  102. logger.info("Terminate persistent group")
  103. dev[0].remove_group()
  104. ev = dev[1].wait_event(["P2P-GROUP-REMOVED"], timeout=3)
  105. if ev is None:
  106. raise Exception("Group removal event timed out")
  107. if "reason=GO_ENDING_SESSION" not in ev:
  108. raise Exception("Unexpected group removal reason")
  109. def test_persistent_group_per_sta_psk(dev):
  110. """P2P persistent group formation and re-invocation using per-client PSK"""
  111. addr0 = dev[0].p2p_dev_addr()
  112. addr1 = dev[1].p2p_dev_addr()
  113. addr2 = dev[2].p2p_dev_addr()
  114. dev[0].request("P2P_SET per_sta_psk 1")
  115. logger.info("Form a persistent group")
  116. [i_res, r_res] = go_neg_pin_authorized_persistent(i_dev=dev[0], i_intent=15,
  117. r_dev=dev[1], r_intent=0)
  118. if not i_res['persistent'] or not r_res['persistent']:
  119. raise Exception("Formed group was not persistent")
  120. logger.info("Join another client to the group")
  121. pin = dev[2].wps_read_pin()
  122. dev[0].p2p_go_authorize_client(pin)
  123. c_res = dev[2].p2p_connect_group(addr0, pin, timeout=60)
  124. if not c_res['persistent']:
  125. raise Exception("Joining client did not recognize persistent group")
  126. if r_res['psk'] == c_res['psk']:
  127. raise Exception("Same PSK assigned for both clients")
  128. hwsim_utils.test_connectivity_p2p_sta(dev[1], dev[2])
  129. logger.info("Leave persistent group and rejoin it")
  130. dev[2].remove_group()
  131. ev = dev[2].wait_event(["P2P-GROUP-REMOVED"], timeout=3)
  132. if ev is None:
  133. raise Exception("Group removal event timed out")
  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"], timeout=30)
  140. if ev is None:
  141. raise Exception("Timeout on group restart (on client)")
  142. cli_res = dev[2].group_form_result(ev)
  143. if not cli_res['persistent']:
  144. raise Exception("Persistent group not restarted as persistent (cli)")
  145. hwsim_utils.test_connectivity_p2p(dev[1], dev[2])
  146. logger.info("Remove one of the clients from the group")
  147. dev[0].global_request("P2P_REMOVE_CLIENT " + addr2)
  148. ev = dev[2].wait_event(["P2P-GROUP-REMOVED"], timeout=3)
  149. if ev is None:
  150. raise Exception("Group removal event timed out")
  151. if "reason=GO_ENDING_SESSION" not in ev:
  152. raise Exception("Unexpected group removal reason")
  153. logger.info("Try to reconnect after having been removed from group")
  154. if not dev[2].discover_peer(addr0, social=True):
  155. raise Exception("Peer " + peer + " not found")
  156. dev[2].dump_monitor()
  157. peer = dev[2].get_peer(addr0)
  158. dev[2].global_request("P2P_GROUP_ADD persistent=" + peer['persistent'])
  159. ev = dev[2].wait_global_event(["P2P-GROUP-STARTED","WPA: 4-Way Handshake failed"], timeout=30)
  160. if ev is None:
  161. raise Exception("Timeout on group restart (on client)")
  162. if "P2P-GROUP-STARTED" in ev:
  163. raise Exception("Client managed to connect after being removed")
  164. logger.info("Remove the remaining client from the group")
  165. dev[0].global_request("P2P_REMOVE_CLIENT " + addr1)
  166. ev = dev[1].wait_event(["P2P-GROUP-REMOVED"], timeout=3)
  167. if ev is None:
  168. raise Exception("Group removal event timed out")
  169. if "reason=GO_ENDING_SESSION" not in ev:
  170. raise Exception("Unexpected group removal reason")
  171. logger.info("Terminate persistent group")
  172. dev[0].remove_group()
  173. dev[0].dump_monitor()
  174. logger.info("Try to re-invoke persistent group from client")
  175. dev[0].request("SET persistent_reconnect 1")
  176. dev[0].p2p_listen()
  177. if not dev[1].discover_peer(addr0, social=True):
  178. raise Exception("Peer " + peer + " not found")
  179. dev[1].dump_monitor()
  180. peer = dev[1].get_peer(addr0)
  181. dev[1].global_request("P2P_INVITE persistent=" + peer['persistent'] + " peer=" + addr0)
  182. ev = dev[1].wait_global_event(["P2P-GROUP-STARTED","WPA: 4-Way Handshake failed"], timeout=30)
  183. if ev is None:
  184. raise Exception("Timeout on group restart (on client)")
  185. if "P2P-GROUP-STARTED" in ev:
  186. raise Exception("Client managed to re-invoke after being removed")
  187. dev[0].dump_monitor()
  188. logger.info("Terminate persistent group")
  189. dev[0].remove_group()
  190. dev[0].dump_monitor()