test_wpas_ap.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. # wpa_supplicant AP mode tests
  2. # Copyright (c) 2014, Qualcomm Atheros, Inc.
  3. #
  4. # This software may be distributed under the terms of the BSD license.
  5. # See README for more details.
  6. import time
  7. import logging
  8. logger = logging.getLogger()
  9. import hwsim_utils
  10. def wait_ap_ready(dev):
  11. ev = dev.wait_event(["CTRL-EVENT-CONNECTED"])
  12. if ev is None:
  13. raise Exception("AP failed to start")
  14. def test_wpas_ap_open(dev):
  15. """wpa_supplicant AP mode - open network"""
  16. if "FAIL" not in dev[0].request("DEAUTHENTICATE 00:11:22:33:44:55"):
  17. raise Exception("Unexpected DEAUTHENTICATE accepted")
  18. if "FAIL" not in dev[0].request("DISASSOCIATE 00:11:22:33:44:55"):
  19. raise Exception("Unexpected DISASSOCIATE accepted")
  20. if "FAIL" not in dev[0].request("CHAN_SWITCH 0 2432"):
  21. raise Exception("Unexpected CHAN_SWITCH accepted")
  22. id = dev[0].add_network()
  23. dev[0].set_network(id, "mode", "2")
  24. dev[0].set_network_quoted(id, "ssid", "wpas-ap-open")
  25. dev[0].set_network(id, "key_mgmt", "NONE")
  26. dev[0].set_network(id, "frequency", "2412")
  27. dev[0].set_network(id, "scan_freq", "2412")
  28. dev[0].select_network(id)
  29. wait_ap_ready(dev[0])
  30. if "FAIL" not in dev[0].request("DEAUTHENTICATE foo"):
  31. raise Exception("Invalid DEAUTHENTICATE accepted")
  32. if "FAIL" not in dev[0].request("DISASSOCIATE foo"):
  33. raise Exception("Invalid DISASSOCIATE accepted")
  34. dev[1].connect("wpas-ap-open", key_mgmt="NONE", scan_freq="2412")
  35. dev[2].connect("wpas-ap-open", key_mgmt="NONE", scan_freq="2412")
  36. hwsim_utils.test_connectivity(dev[0], dev[1])
  37. hwsim_utils.test_connectivity(dev[1], dev[2])
  38. addr1 = dev[1].p2p_interface_addr()
  39. addr2 = dev[2].p2p_interface_addr()
  40. addrs = [ addr1, addr2 ]
  41. sta = dev[0].get_sta(None)
  42. if sta['addr'] not in addrs:
  43. raise Exception("Unexpected STA address")
  44. sta1 = dev[0].get_sta(sta['addr'])
  45. if sta1['addr'] not in addrs:
  46. raise Exception("Unexpected STA address")
  47. sta2 = dev[0].get_sta(sta['addr'], next=True)
  48. if sta2['addr'] not in addrs:
  49. raise Exception("Unexpected STA2 address")
  50. sta3 = dev[0].get_sta(sta2['addr'], next=True)
  51. if len(sta3) != 0:
  52. raise Exception("Unexpected STA iteration result (did not stop)")
  53. status = dev[0].get_status()
  54. if status['mode'] != "AP":
  55. raise Exception("Unexpected status mode")
  56. dev[1].dump_monitor()
  57. dev[2].dump_monitor()
  58. dev[0].request("DEAUTHENTICATE " + addr1)
  59. dev[0].request("DISASSOCIATE " + addr2)
  60. ev = dev[1].wait_event(["CTRL-EVENT-DISCONNECTED"])
  61. if ev is None:
  62. raise Exception("Disconnection timed out")
  63. ev = dev[2].wait_event(["CTRL-EVENT-DISCONNECTED"])
  64. if ev is None:
  65. raise Exception("Disconnection timed out")
  66. ev = dev[1].wait_event(["CTRL-EVENT-CONNECTED"])
  67. if ev is None:
  68. raise Exception("Reconnection timed out")
  69. ev = dev[2].wait_event(["CTRL-EVENT-CONNECTED"])
  70. if ev is None:
  71. raise Exception("Reconnection timed out")
  72. dev[1].request("DISCONNECT")
  73. dev[2].request("DISCONNECT")
  74. def test_wpas_ap_wep(dev):
  75. """wpa_supplicant AP mode - WEP"""
  76. id = dev[0].add_network()
  77. dev[0].set_network(id, "mode", "2")
  78. dev[0].set_network_quoted(id, "ssid", "wpas-ap-wep")
  79. dev[0].set_network(id, "key_mgmt", "NONE")
  80. dev[0].set_network(id, "frequency", "2412")
  81. dev[0].set_network(id, "scan_freq", "2412")
  82. dev[0].set_network_quoted(id, "wep_key0", "hello")
  83. dev[0].select_network(id)
  84. wait_ap_ready(dev[0])
  85. dev[1].connect("wpas-ap-wep", key_mgmt="NONE", wep_key0='"hello"',
  86. scan_freq="2412")
  87. hwsim_utils.test_connectivity(dev[0], dev[1])
  88. dev[1].request("DISCONNECT")
  89. def test_wpas_ap_no_ssid(dev):
  90. """wpa_supplicant AP mode - invalid network configuration"""
  91. id = dev[0].add_network()
  92. dev[0].set_network(id, "mode", "2")
  93. dev[0].set_network(id, "key_mgmt", "NONE")
  94. dev[0].set_network(id, "frequency", "2412")
  95. dev[0].set_network(id, "scan_freq", "2412")
  96. dev[0].select_network(id)
  97. ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED"], timeout=1)
  98. if ev is not None:
  99. raise Exception("Unexpected AP start")
  100. def test_wpas_ap_default_frequency(dev):
  101. """wpa_supplicant AP mode - default frequency"""
  102. id = dev[0].add_network()
  103. dev[0].set_network(id, "mode", "2")
  104. dev[0].set_network_quoted(id, "ssid", "wpas-ap-open")
  105. dev[0].set_network(id, "key_mgmt", "NONE")
  106. dev[0].set_network(id, "scan_freq", "2412")
  107. dev[0].select_network(id)
  108. wait_ap_ready(dev[0])
  109. dev[1].connect("wpas-ap-open", key_mgmt="NONE", scan_freq="2462")
  110. dev[1].request("DISCONNECT")
  111. def test_wpas_ap_invalid_frequency(dev):
  112. """wpa_supplicant AP mode - invalid frequency configuration"""
  113. id = dev[0].add_network()
  114. dev[0].set_network(id, "mode", "2")
  115. dev[0].set_network_quoted(id, "ssid", "wpas-ap-open")
  116. dev[0].set_network(id, "key_mgmt", "NONE")
  117. dev[0].set_network(id, "frequency", "2413")
  118. dev[0].set_network(id, "scan_freq", "2412")
  119. dev[0].select_network(id)
  120. ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED"], timeout=1)
  121. if ev is not None:
  122. raise Exception("Unexpected AP start")
  123. def test_wpas_ap_wps(dev):
  124. """wpa_supplicant AP mode - WPS operations"""
  125. id = dev[0].add_network()
  126. dev[0].set_network(id, "mode", "2")
  127. dev[0].set_network_quoted(id, "ssid", "wpas-ap-wps")
  128. dev[0].set_network_quoted(id, "psk", "1234567890")
  129. dev[0].set_network(id, "frequency", "2412")
  130. dev[0].set_network(id, "scan_freq", "2412")
  131. dev[0].select_network(id)
  132. wait_ap_ready(dev[0])
  133. bssid = dev[0].p2p_interface_addr()
  134. logger.info("Test PBC mode start/stop")
  135. if "FAIL" not in dev[0].request("WPS_CANCEL"):
  136. raise Exception("Unexpected WPS_CANCEL success")
  137. dev[0].request("WPS_PBC")
  138. ev = dev[0].wait_event(["WPS-PBC-ACTIVE"])
  139. if ev is None:
  140. raise Exception("PBC mode start timeout")
  141. if "OK" not in dev[0].request("WPS_CANCEL"):
  142. raise Exception("Unexpected WPS_CANCEL failure")
  143. ev = dev[0].wait_event(["WPS-TIMEOUT"])
  144. if ev is None:
  145. raise Exception("PBC mode disabling timeout")
  146. logger.info("Test PBC protocol run")
  147. dev[0].request("WPS_PBC")
  148. ev = dev[0].wait_event(["WPS-PBC-ACTIVE"])
  149. if ev is None:
  150. raise Exception("PBC mode start timeout")
  151. dev[1].request("WPS_PBC")
  152. ev = dev[1].wait_event(["CTRL-EVENT-CONNECTED"], timeout=30)
  153. if ev is None:
  154. raise Exception("WPS PBC operation timed out")
  155. hwsim_utils.test_connectivity(dev[0], dev[1])
  156. logger.info("Test AP PIN to learn configuration")
  157. pin = dev[0].request("WPS_AP_PIN random")
  158. if "FAIL" in pin:
  159. raise Exception("Could not generate random AP PIN")
  160. if pin not in dev[0].request("WPS_AP_PIN get"):
  161. raise Exception("Could not fetch current AP PIN")
  162. dev[2].wps_reg(bssid, pin)
  163. hwsim_utils.test_connectivity(dev[1], dev[2])
  164. dev[1].request("REMOVE_NETWORK all")
  165. dev[2].request("REMOVE_NETWORK all")
  166. logger.info("Test AP PIN operations")
  167. dev[0].request("WPS_AP_PIN disable")
  168. dev[0].request("WPS_AP_PIN set " + pin + " 1")
  169. time.sleep(1.1)
  170. if "FAIL" not in dev[0].request("WPS_AP_PIN get"):
  171. raise Exception("AP PIN unexpectedly still enabled")
  172. pin = dev[1].wps_read_pin()
  173. dev[0].request("WPS_PIN any " + pin)
  174. dev[1].request("WPS_PIN any " + pin)
  175. ev = dev[1].wait_event(["CTRL-EVENT-CONNECTED"], timeout=30)
  176. if ev is None:
  177. raise Exception("Association with the AP timed out")
  178. dev[1].request("REMOVE_NETWORK all")
  179. dev[1].dump_monitor()
  180. dev[0].request("WPS_PIN any " + pin + " 100")
  181. dev[1].request("WPS_PIN any " + pin)
  182. ev = dev[1].wait_event(["CTRL-EVENT-CONNECTED"], timeout=30)
  183. if ev is None:
  184. raise Exception("Association with the AP timed out")
  185. dev[1].request("REMOVE_NETWORK all")
  186. dev[1].dump_monitor()
  187. dev[0].request("WPS_AP_PIN set 12345670")
  188. dev[0].dump_monitor()
  189. runs = ("88887777", "12340000", "00000000", "12345670")
  190. for pin in runs:
  191. logger.info("Try AP PIN " + pin)
  192. dev[2].dump_monitor()
  193. dev[2].request("WPS_REG " + bssid + " " + pin)
  194. ev = dev[2].wait_event(["WPS-SUCCESS", "WPS-FAIL msg"], timeout=15)
  195. if ev is None:
  196. raise Exception("WPS operation timed out")
  197. if "WPS-SUCCESS" in ev:
  198. raise Exception("WPS operation succeeded unexpectedly")
  199. ev = dev[2].wait_event(["CTRL-EVENT-DISCONNECTED"])
  200. if ev is None:
  201. raise Exception("Timeout while waiting for disconnection")
  202. dev[2].request("WPS_CANCEL")
  203. dev[2].request("REMOVE_NETWORK all")
  204. ev = dev[0].wait_event(["WPS-AP-SETUP-LOCKED"])
  205. if ev is None:
  206. raise Exception("WPS AP PIN not locked")
  207. dev[0].dump_monitor()
  208. logger.info("Test random AP PIN timeout")
  209. pin = dev[0].request("WPS_AP_PIN random 1")
  210. if "FAIL" in pin:
  211. raise Exception("Could not generate random AP PIN")
  212. res = dev[0].request("WPS_AP_PIN get")
  213. if pin not in res:
  214. raise Exception("Could not fetch current AP PIN")
  215. for i in range(10):
  216. time.sleep(0.2)
  217. res = dev[0].request("WPS_AP_PIN get")
  218. if "FAIL" in res:
  219. break
  220. if "FAIL" not in res:
  221. raise Exception("WPS_AP_PIN random timeout did not work")
  222. if "FAIL" not in dev[0].request("WPS_AP_PIN foo"):
  223. raise Exception("Invalid WPS_AP_PIN command not rejected")
  224. if "FAIL" not in dev[0].request("WPS_AP_PIN set"):
  225. raise Exception("Invalid WPS_AP_PIN command not rejected")
  226. def test_wpas_ap_wps_pbc_overlap(dev):
  227. """wpa_supplicant AP mode - WPS operations with PBC overlap"""
  228. id = dev[0].add_network()
  229. dev[0].set_network(id, "mode", "2")
  230. dev[0].set_network_quoted(id, "ssid", "wpas-ap-wps")
  231. dev[0].set_network_quoted(id, "psk", "1234567890")
  232. dev[0].set_network(id, "frequency", "2412")
  233. dev[0].set_network(id, "scan_freq", "2412")
  234. dev[0].select_network(id)
  235. wait_ap_ready(dev[0])
  236. bssid = dev[0].p2p_interface_addr()
  237. dev[1].scan_for_bss(bssid, freq="2412")
  238. dev[1].dump_monitor()
  239. dev[2].scan_for_bss(bssid, freq="2412")
  240. dev[2].dump_monitor()
  241. dev[0].request("WPS_PBC")
  242. dev[1].request("WPS_PBC " + bssid)
  243. dev[2].request("WPS_PBC " + bssid)
  244. ev = dev[1].wait_event(["WPS-M2D"], timeout=15)
  245. if ev is None:
  246. raise Exception("PBC session overlap not detected (dev1)")
  247. if "config_error=12" not in ev:
  248. raise Exception("PBC session overlap not correctly reported (dev1)")
  249. ev = dev[2].wait_event(["WPS-M2D"], timeout=15)
  250. if ev is None:
  251. raise Exception("PBC session overlap not detected (dev2)")
  252. if "config_error=12" not in ev:
  253. raise Exception("PBC session overlap not correctly reported (dev2)")
  254. if "FAIL-PBC-OVERLAP" not in dev[0].request("WPS_PBC"):
  255. raise Exception("WPS_PBC(AP) accepted during overlap")
  256. if "FAIL-PBC-OVERLAP" not in dev[0].request("WPS_PBC any"):
  257. raise Exception("WPS_PBC(AP) accepted during overlap")
  258. dev[0].request("WPS_CANCEL")
  259. dev[1].request("WPS_CANCEL")
  260. dev[2].request("WPS_CANCEL")