test_p2p_persistent.py 8.0 KB

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