test_wpas_ap.py 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386
  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. from utils import HwsimSkip
  11. from test_p2p_channel import set_country
  12. def wait_ap_ready(dev):
  13. ev = dev.wait_event(["CTRL-EVENT-CONNECTED"])
  14. if ev is None:
  15. raise Exception("AP failed to start")
  16. def test_wpas_ap_open(dev):
  17. """wpa_supplicant AP mode - open network"""
  18. if "FAIL" not in dev[0].request("DEAUTHENTICATE 00:11:22:33:44:55"):
  19. raise Exception("Unexpected DEAUTHENTICATE accepted")
  20. if "FAIL" not in dev[0].request("DISASSOCIATE 00:11:22:33:44:55"):
  21. raise Exception("Unexpected DISASSOCIATE accepted")
  22. if "FAIL" not in dev[0].request("CHAN_SWITCH 0 2432"):
  23. raise Exception("Unexpected CHAN_SWITCH accepted")
  24. id = dev[0].add_network()
  25. dev[0].set_network(id, "mode", "2")
  26. dev[0].set_network_quoted(id, "ssid", "wpas-ap-open")
  27. dev[0].set_network(id, "key_mgmt", "NONE")
  28. dev[0].set_network(id, "frequency", "2412")
  29. dev[0].set_network(id, "scan_freq", "2412")
  30. dev[0].select_network(id)
  31. wait_ap_ready(dev[0])
  32. if "FAIL" not in dev[0].request("DEAUTHENTICATE foo"):
  33. raise Exception("Invalid DEAUTHENTICATE accepted")
  34. if "FAIL" not in dev[0].request("DISASSOCIATE foo"):
  35. raise Exception("Invalid DISASSOCIATE accepted")
  36. dev[1].connect("wpas-ap-open", key_mgmt="NONE", scan_freq="2412")
  37. dev[2].connect("wpas-ap-open", key_mgmt="NONE", scan_freq="2412")
  38. hwsim_utils.test_connectivity(dev[0], dev[1])
  39. hwsim_utils.test_connectivity(dev[1], dev[2])
  40. addr1 = dev[1].p2p_interface_addr()
  41. addr2 = dev[2].p2p_interface_addr()
  42. addrs = [ addr1, addr2 ]
  43. sta = dev[0].get_sta(None)
  44. if sta['addr'] not in addrs:
  45. raise Exception("Unexpected STA address")
  46. sta1 = dev[0].get_sta(sta['addr'])
  47. if sta1['addr'] not in addrs:
  48. raise Exception("Unexpected STA address")
  49. sta2 = dev[0].get_sta(sta['addr'], next=True)
  50. if sta2['addr'] not in addrs:
  51. raise Exception("Unexpected STA2 address")
  52. sta3 = dev[0].get_sta(sta2['addr'], next=True)
  53. if len(sta3) != 0:
  54. raise Exception("Unexpected STA iteration result (did not stop)")
  55. status = dev[0].get_status()
  56. if status['mode'] != "AP":
  57. raise Exception("Unexpected status mode")
  58. dev[1].dump_monitor()
  59. dev[2].dump_monitor()
  60. dev[0].request("DEAUTHENTICATE " + addr1)
  61. dev[0].request("DISASSOCIATE " + addr2)
  62. dev[1].wait_disconnected(timeout=10)
  63. dev[2].wait_disconnected(timeout=10)
  64. dev[1].wait_connected(timeout=10, error="Reconnection timed out")
  65. dev[2].wait_connected(timeout=10, error="Reconnection timed out")
  66. dev[1].request("DISCONNECT")
  67. dev[2].request("DISCONNECT")
  68. def test_wpas_ap_wep(dev):
  69. """wpa_supplicant AP mode - WEP"""
  70. id = dev[0].add_network()
  71. dev[0].set_network(id, "mode", "2")
  72. dev[0].set_network_quoted(id, "ssid", "wpas-ap-wep")
  73. dev[0].set_network(id, "key_mgmt", "NONE")
  74. dev[0].set_network(id, "frequency", "2412")
  75. dev[0].set_network(id, "scan_freq", "2412")
  76. dev[0].set_network_quoted(id, "wep_key0", "hello")
  77. dev[0].select_network(id)
  78. wait_ap_ready(dev[0])
  79. dev[1].connect("wpas-ap-wep", key_mgmt="NONE", wep_key0='"hello"',
  80. scan_freq="2412")
  81. hwsim_utils.test_connectivity(dev[0], dev[1])
  82. dev[1].request("DISCONNECT")
  83. def test_wpas_ap_no_ssid(dev):
  84. """wpa_supplicant AP mode - invalid network configuration"""
  85. id = dev[0].add_network()
  86. dev[0].set_network(id, "mode", "2")
  87. dev[0].set_network(id, "key_mgmt", "NONE")
  88. dev[0].set_network(id, "frequency", "2412")
  89. dev[0].set_network(id, "scan_freq", "2412")
  90. dev[0].select_network(id)
  91. ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED"], timeout=1)
  92. if ev is not None:
  93. raise Exception("Unexpected AP start")
  94. def test_wpas_ap_default_frequency(dev):
  95. """wpa_supplicant AP mode - default frequency"""
  96. id = dev[0].add_network()
  97. dev[0].set_network(id, "mode", "2")
  98. dev[0].set_network_quoted(id, "ssid", "wpas-ap-open")
  99. dev[0].set_network(id, "key_mgmt", "NONE")
  100. dev[0].set_network(id, "scan_freq", "2412")
  101. dev[0].select_network(id)
  102. wait_ap_ready(dev[0])
  103. dev[1].connect("wpas-ap-open", key_mgmt="NONE", scan_freq="2462")
  104. dev[1].request("DISCONNECT")
  105. def test_wpas_ap_invalid_frequency(dev):
  106. """wpa_supplicant AP mode - invalid frequency configuration"""
  107. id = dev[0].add_network()
  108. dev[0].set_network(id, "mode", "2")
  109. dev[0].set_network_quoted(id, "ssid", "wpas-ap-open")
  110. dev[0].set_network(id, "key_mgmt", "NONE")
  111. dev[0].set_network(id, "frequency", "2413")
  112. dev[0].set_network(id, "scan_freq", "2412")
  113. dev[0].select_network(id)
  114. ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED"], timeout=1)
  115. if ev is not None:
  116. raise Exception("Unexpected AP start")
  117. def test_wpas_ap_wps(dev):
  118. """wpa_supplicant AP mode - WPS operations"""
  119. id = dev[0].add_network()
  120. dev[0].set_network(id, "mode", "2")
  121. dev[0].set_network_quoted(id, "ssid", "wpas-ap-wps")
  122. dev[0].set_network_quoted(id, "psk", "1234567890")
  123. dev[0].set_network(id, "frequency", "2412")
  124. dev[0].set_network(id, "scan_freq", "2412")
  125. dev[0].select_network(id)
  126. wait_ap_ready(dev[0])
  127. bssid = dev[0].p2p_interface_addr()
  128. logger.info("Test PBC mode start/stop")
  129. if "FAIL" not in dev[0].request("WPS_CANCEL"):
  130. raise Exception("Unexpected WPS_CANCEL success")
  131. dev[0].request("WPS_PBC")
  132. ev = dev[0].wait_event(["WPS-PBC-ACTIVE"])
  133. if ev is None:
  134. raise Exception("PBC mode start timeout")
  135. if "OK" not in dev[0].request("WPS_CANCEL"):
  136. raise Exception("Unexpected WPS_CANCEL failure")
  137. ev = dev[0].wait_event(["WPS-TIMEOUT"])
  138. if ev is None:
  139. raise Exception("PBC mode disabling timeout")
  140. logger.info("Test PBC protocol run")
  141. dev[0].request("WPS_PBC")
  142. ev = dev[0].wait_event(["WPS-PBC-ACTIVE"])
  143. if ev is None:
  144. raise Exception("PBC mode start timeout")
  145. dev[1].request("WPS_PBC")
  146. dev[1].wait_connected(timeout=30, error="WPS PBC operation timed out")
  147. hwsim_utils.test_connectivity(dev[0], dev[1])
  148. logger.info("Test AP PIN to learn configuration")
  149. pin = dev[0].request("WPS_AP_PIN random")
  150. if "FAIL" in pin:
  151. raise Exception("Could not generate random AP PIN")
  152. if pin not in dev[0].request("WPS_AP_PIN get"):
  153. raise Exception("Could not fetch current AP PIN")
  154. dev[2].wps_reg(bssid, pin)
  155. hwsim_utils.test_connectivity(dev[1], dev[2])
  156. dev[1].request("REMOVE_NETWORK all")
  157. dev[2].request("REMOVE_NETWORK all")
  158. logger.info("Test AP PIN operations")
  159. dev[0].request("WPS_AP_PIN disable")
  160. dev[0].request("WPS_AP_PIN set " + pin + " 1")
  161. time.sleep(1.1)
  162. if "FAIL" not in dev[0].request("WPS_AP_PIN get"):
  163. raise Exception("AP PIN unexpectedly still enabled")
  164. pin = dev[1].wps_read_pin()
  165. dev[0].request("WPS_PIN any " + pin)
  166. dev[1].request("WPS_PIN any " + pin)
  167. dev[1].wait_connected(timeout=30)
  168. dev[1].request("REMOVE_NETWORK all")
  169. dev[1].dump_monitor()
  170. dev[0].request("WPS_PIN any " + pin + " 100")
  171. dev[1].request("WPS_PIN any " + pin)
  172. dev[1].wait_connected(timeout=30)
  173. dev[1].request("REMOVE_NETWORK all")
  174. dev[1].dump_monitor()
  175. dev[0].request("WPS_AP_PIN set 12345670")
  176. dev[0].dump_monitor()
  177. runs = ("88887777", "12340000", "00000000", "12345670")
  178. for pin in runs:
  179. logger.info("Try AP PIN " + pin)
  180. dev[2].dump_monitor()
  181. dev[2].request("WPS_REG " + bssid + " " + pin)
  182. ev = dev[2].wait_event(["WPS-SUCCESS", "WPS-FAIL msg"], timeout=15)
  183. if ev is None:
  184. raise Exception("WPS operation timed out")
  185. if "WPS-SUCCESS" in ev:
  186. raise Exception("WPS operation succeeded unexpectedly")
  187. dev[2].wait_disconnected(timeout=10)
  188. dev[2].request("WPS_CANCEL")
  189. dev[2].request("REMOVE_NETWORK all")
  190. ev = dev[0].wait_event(["WPS-AP-SETUP-LOCKED"])
  191. if ev is None:
  192. raise Exception("WPS AP PIN not locked")
  193. dev[0].dump_monitor()
  194. logger.info("Test random AP PIN timeout")
  195. pin = dev[0].request("WPS_AP_PIN random 1")
  196. if "FAIL" in pin:
  197. raise Exception("Could not generate random AP PIN")
  198. res = dev[0].request("WPS_AP_PIN get")
  199. if pin not in res:
  200. raise Exception("Could not fetch current AP PIN")
  201. for i in range(10):
  202. time.sleep(0.2)
  203. res = dev[0].request("WPS_AP_PIN get")
  204. if "FAIL" in res:
  205. break
  206. if "FAIL" not in res:
  207. raise Exception("WPS_AP_PIN random timeout did not work")
  208. if "FAIL" not in dev[0].request("WPS_AP_PIN foo"):
  209. raise Exception("Invalid WPS_AP_PIN command not rejected")
  210. if "FAIL" not in dev[0].request("WPS_AP_PIN set"):
  211. raise Exception("Invalid WPS_AP_PIN command not rejected")
  212. def test_wpas_ap_wps_pbc_overlap(dev):
  213. """wpa_supplicant AP mode - WPS operations with PBC overlap"""
  214. id = dev[0].add_network()
  215. dev[0].set_network(id, "mode", "2")
  216. dev[0].set_network_quoted(id, "ssid", "wpas-ap-wps")
  217. dev[0].set_network_quoted(id, "psk", "1234567890")
  218. dev[0].set_network(id, "frequency", "2412")
  219. dev[0].set_network(id, "scan_freq", "2412")
  220. dev[0].select_network(id)
  221. wait_ap_ready(dev[0])
  222. bssid = dev[0].p2p_interface_addr()
  223. dev[1].scan_for_bss(bssid, freq="2412")
  224. dev[1].dump_monitor()
  225. dev[2].scan_for_bss(bssid, freq="2412")
  226. dev[2].dump_monitor()
  227. dev[0].request("WPS_PBC")
  228. dev[1].request("WPS_PBC " + bssid)
  229. dev[2].request("WPS_PBC " + bssid)
  230. ev = dev[1].wait_event(["WPS-M2D"], timeout=15)
  231. if ev is None:
  232. raise Exception("PBC session overlap not detected (dev1)")
  233. if "config_error=12" not in ev:
  234. raise Exception("PBC session overlap not correctly reported (dev1)")
  235. ev = dev[2].wait_event(["WPS-M2D"], timeout=15)
  236. if ev is None:
  237. raise Exception("PBC session overlap not detected (dev2)")
  238. if "config_error=12" not in ev:
  239. raise Exception("PBC session overlap not correctly reported (dev2)")
  240. if "FAIL-PBC-OVERLAP" not in dev[0].request("WPS_PBC"):
  241. raise Exception("WPS_PBC(AP) accepted during overlap")
  242. if "FAIL-PBC-OVERLAP" not in dev[0].request("WPS_PBC any"):
  243. raise Exception("WPS_PBC(AP) accepted during overlap")
  244. dev[0].request("WPS_CANCEL")
  245. dev[1].request("WPS_CANCEL")
  246. dev[2].request("WPS_CANCEL")
  247. def test_wpas_ap_dfs(dev):
  248. """wpa_supplicant AP mode - DFS"""
  249. try:
  250. _test_wpas_ap_dfs(dev)
  251. finally:
  252. set_country("00")
  253. dev[0].request("SET country 00")
  254. dev[1].flush_scan_cache()
  255. def _test_wpas_ap_dfs(dev):
  256. set_country("US")
  257. dev[0].request("SET country US")
  258. id = dev[0].add_network()
  259. dev[0].set_network(id, "mode", "2")
  260. dev[0].set_network_quoted(id, "ssid", "wpas-ap-dfs")
  261. dev[0].set_network(id, "key_mgmt", "NONE")
  262. dev[0].set_network(id, "frequency", "5260")
  263. dev[0].set_network(id, "scan_freq", "5260")
  264. dev[0].select_network(id)
  265. ev = dev[0].wait_event(["DFS-CAC-START"])
  266. if ev is None:
  267. # For now, assume DFS is not supported by all kernel builds.
  268. raise HwsimSkip("CAC did not start - assume not supported")
  269. ev = dev[0].wait_event(["DFS-CAC-COMPLETED"], timeout=70)
  270. if ev is None:
  271. raise Exception("CAC did not complete")
  272. if "success=1" not in ev:
  273. raise Exception("CAC failed")
  274. if "freq=5260" not in ev:
  275. raise Exception("Unexpected DFS freq result")
  276. ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED"])
  277. if ev is None:
  278. raise Exception("AP failed to start")
  279. dev[1].connect("wpas-ap-dfs", key_mgmt="NONE")
  280. def test_wpas_ap_disable(dev):
  281. """wpa_supplicant AP mode - DISABLE_NETWORK"""
  282. id = dev[0].add_network()
  283. dev[0].set_network(id, "mode", "2")
  284. dev[0].set_network_quoted(id, "ssid", "wpas-ap-open")
  285. dev[0].set_network(id, "key_mgmt", "NONE")
  286. dev[0].set_network(id, "scan_freq", "2412")
  287. dev[0].select_network(id)
  288. ev = dev[0].wait_event(["AP-ENABLED"])
  289. if ev is None:
  290. raise Exception("AP-ENABLED event not seen")
  291. wait_ap_ready(dev[0])
  292. dev[0].request("DISABLE_NETWORK %d" % id)
  293. ev = dev[0].wait_event(["AP-DISABLED"])
  294. if ev is None:
  295. raise Exception("AP-DISABLED event not seen")
  296. dev[0].wait_disconnected()
  297. def test_wpas_ap_acs(dev):
  298. """wpa_supplicant AP mode - ACS"""
  299. res = dev[0].get_capability("acs")
  300. if res is None or "ACS" not in res:
  301. raise HwsimSkip("ACS not supported")
  302. id = dev[0].add_network()
  303. dev[0].set_network(id, "mode", "2")
  304. dev[0].set_network_quoted(id, "ssid", "wpas-ap-open")
  305. dev[0].set_network(id, "key_mgmt", "NONE")
  306. dev[0].set_network(id, "frequency", "2417")
  307. dev[0].set_network(id, "scan_freq", "2417")
  308. dev[0].set_network(id, "acs", "1")
  309. dev[0].select_network(id)
  310. wait_ap_ready(dev[0])
  311. # ACS prefers channels 1, 6, 11
  312. freq = dev[0].get_status_field('freq')
  313. if freq == "2417":
  314. raise Exception("Unexpected operating channel selected")
  315. dev[1].connect("wpas-ap-open", key_mgmt="NONE", scan_freq=freq)
  316. def test_wpas_ap_and_assoc_req_p2p_ie(dev):
  317. """wpa_supplicant AP mode - unexpected P2P IE in Association Request"""
  318. try:
  319. _test_wpas_ap_and_assoc_req_p2p_ie(dev)
  320. finally:
  321. dev[1].request("VENDOR_ELEM_REMOVE 13 *")
  322. dev[0].request("P2P_SET disabled 0")
  323. def _test_wpas_ap_and_assoc_req_p2p_ie(dev):
  324. dev[0].request("P2P_SET disabled 1")
  325. id = dev[0].add_network()
  326. dev[0].set_network(id, "mode", "2")
  327. dev[0].set_network_quoted(id, "ssid", "wpas-ap-open")
  328. dev[0].set_network(id, "key_mgmt", "NONE")
  329. dev[0].set_network(id, "frequency", "2412")
  330. dev[0].set_network(id, "scan_freq", "2412")
  331. dev[0].select_network(id)
  332. wait_ap_ready(dev[0])
  333. dev[1].request("VENDOR_ELEM_ADD 13 dd04506f9a09")
  334. dev[1].connect("wpas-ap-open", key_mgmt="NONE", scan_freq="2412")
  335. dev[1].request("DISCONNECT")
  336. dev[1].wait_disconnected()
  337. dev[0].request("DISCONNECT")
  338. dev[0].wait_disconnected()