test_ap_tdls.py 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295
  1. #!/usr/bin/python
  2. #
  3. # TDLS tests
  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 time
  9. import subprocess
  10. import logging
  11. logger = logging.getLogger(__name__)
  12. import hwsim_utils
  13. from hostapd import HostapdGlobal
  14. from hostapd import Hostapd
  15. import hostapd
  16. ap_ifname = 'wlan2'
  17. def start_ap_wpa2_psk(ifname):
  18. params = hostapd.wpa2_params(ssid="test-wpa2-psk", passphrase="12345678")
  19. hostapd.add_ap(ifname, params)
  20. def connect_sta(sta, ssid, psk=None, proto=None, key_mgmt=None, wep_key0=None):
  21. logger.info("Connect STA " + sta.ifname + " to AP")
  22. id = sta.add_network()
  23. sta.set_network_quoted(id, "ssid", ssid)
  24. if psk:
  25. sta.set_network_quoted(id, "psk", psk)
  26. if proto:
  27. sta.set_network(id, "proto", proto)
  28. if key_mgmt:
  29. sta.set_network(id, "key_mgmt", key_mgmt)
  30. if wep_key0:
  31. sta.set_network(id, "wep_key0", wep_key0)
  32. sta.connect_network(id)
  33. def connect_2sta(dev, ssid):
  34. connect_sta(dev[0], ssid, psk="12345678")
  35. connect_sta(dev[1], ssid, psk="12345678")
  36. hwsim_utils.test_connectivity_sta(dev[0], dev[1])
  37. hwsim_utils.test_connectivity(dev[0].ifname, "wlan2")
  38. hwsim_utils.test_connectivity(dev[1].ifname, "wlan2")
  39. def connect_2sta_wpa2_psk(dev):
  40. connect_2sta(dev, "test-wpa2-psk")
  41. def connect_2sta_wpa_psk(dev):
  42. connect_2sta(dev, "test-wpa-psk")
  43. def connect_2sta_wpa_psk_mixed(dev):
  44. connect_sta(dev[0], "test-wpa-mixed-psk", psk="12345678", proto="WPA")
  45. connect_sta(dev[1], "test-wpa-mixed-psk", psk="12345678", proto="WPA2")
  46. hwsim_utils.test_connectivity_sta(dev[0], dev[1])
  47. hwsim_utils.test_connectivity(dev[0].ifname, "wlan2")
  48. hwsim_utils.test_connectivity(dev[1].ifname, "wlan2")
  49. def connect_2sta_wep(dev):
  50. connect_sta(dev[0], "test-wep", key_mgmt="NONE", wep_key0='"hello"')
  51. connect_sta(dev[1], "test-wep", key_mgmt="NONE", wep_key0='"hello"')
  52. hwsim_utils.test_connectivity_sta(dev[0], dev[1])
  53. hwsim_utils.test_connectivity(dev[0].ifname, "wlan2")
  54. hwsim_utils.test_connectivity(dev[1].ifname, "wlan2")
  55. def connect_2sta_open(dev):
  56. connect_sta(dev[0], "test-open", key_mgmt="NONE")
  57. connect_sta(dev[1], "test-open", key_mgmt="NONE")
  58. hwsim_utils.test_connectivity_sta(dev[0], dev[1])
  59. hwsim_utils.test_connectivity(dev[0].ifname, "wlan2")
  60. hwsim_utils.test_connectivity(dev[1].ifname, "wlan2")
  61. def wlantest_tdls(field, bssid, addr1, addr2):
  62. res = subprocess.check_output(["../../wlantest/wlantest_cli",
  63. "get_tdls_counter", field, bssid, addr1,
  64. addr2]);
  65. if "FAIL" in res:
  66. raise Exception("wlantest_cli command failed")
  67. return int(res)
  68. def wlantest_tdls_clear(bssid, addr1, addr2):
  69. subprocess.call(["../../wlantest/wlantest_cli",
  70. "clear_tdls_counters", bssid, addr1, addr2]);
  71. def wlantest_setup():
  72. subprocess.call(["../../wlantest/wlantest_cli", "flush"]);
  73. subprocess.call(["../../wlantest/wlantest_cli", "add_passphrase",
  74. "12345678"]);
  75. subprocess.call(["../../wlantest/wlantest_cli", "add_wepkey",
  76. "68656c6c6f"]);
  77. def wlantest_tdls_packet_counters(bssid, addr0, addr1):
  78. dl = wlantest_tdls("valid_direct_link", bssid, addr0, addr1);
  79. inv_dl = wlantest_tdls("invalid_direct_link", bssid, addr0, addr1);
  80. ap = wlantest_tdls("valid_ap_path", bssid, addr0, addr1);
  81. inv_ap = wlantest_tdls("invalid_ap_path", bssid, addr0, addr1);
  82. return [dl,inv_dl,ap,inv_ap]
  83. def tdls_check_dl(sta0, sta1, bssid, addr0, addr1):
  84. wlantest_tdls_clear(bssid, addr0, addr1);
  85. hwsim_utils.test_connectivity_sta(sta0, sta1)
  86. [dl,inv_dl,ap,inv_ap] = wlantest_tdls_packet_counters(bssid, addr0, addr1)
  87. if dl == 0:
  88. raise Exception("No valid frames through direct link")
  89. if inv_dl > 0:
  90. raise Exception("Invalid frames through direct link")
  91. if ap > 0:
  92. raise Exception("Unexpected frames through AP path")
  93. if inv_ap > 0:
  94. raise Exception("Invalid frames through AP path")
  95. def tdls_check_ap(sta0, sta1, bssid, addr0, addr1):
  96. wlantest_tdls_clear(bssid, addr0, addr1);
  97. hwsim_utils.test_connectivity_sta(sta0, sta1)
  98. [dl,inv_dl,ap,inv_ap] = wlantest_tdls_packet_counters(bssid, addr0, addr1)
  99. if dl > 0:
  100. raise Exception("Unexpected frames through direct link")
  101. if inv_dl > 0:
  102. raise Exception("Invalid frames through direct link")
  103. if ap == 0:
  104. raise Exception("No valid frames through AP path")
  105. if inv_ap > 0:
  106. raise Exception("Invalid frames through AP path")
  107. def setup_tdls(sta0, sta1, bssid, reverse=False, expect_fail=False):
  108. logger.info("Setup TDLS")
  109. addr0 = sta0.p2p_interface_addr()
  110. addr1 = sta1.p2p_interface_addr()
  111. wlantest_tdls_clear(bssid, addr0, addr1);
  112. wlantest_tdls_clear(bssid, addr1, addr0);
  113. sta0.tdls_setup(addr1)
  114. time.sleep(1)
  115. if expect_fail:
  116. tdls_check_ap(sta0, sta1, bssid, addr0, addr1)
  117. return
  118. if reverse:
  119. addr1 = sta0.p2p_interface_addr()
  120. addr0 = sta1.p2p_interface_addr()
  121. conf = wlantest_tdls("setup_conf_ok", bssid, addr0, addr1);
  122. if conf == 0:
  123. raise Exception("No TDLS Setup Confirm (success) seen")
  124. tdls_check_dl(sta0, sta1, bssid, addr0, addr1)
  125. def teardown_tdls(sta0, sta1, bssid):
  126. logger.info("Teardown TDLS")
  127. addr0 = sta0.p2p_interface_addr()
  128. addr1 = sta1.p2p_interface_addr()
  129. sta0.tdls_teardown(addr1)
  130. time.sleep(1)
  131. teardown = wlantest_tdls("teardown", bssid, addr0, addr1);
  132. if teardown == 0:
  133. raise Exception("No TDLS Setup Teardown seen")
  134. tdls_check_ap(sta0, sta1, bssid, addr0, addr1)
  135. def test_ap_wpa2_tdls(dev):
  136. """WPA2-PSK AP and two stations using TDLS"""
  137. start_ap_wpa2_psk(ap_ifname)
  138. bssid = "02:00:00:00:02:00"
  139. wlantest_setup()
  140. connect_2sta_wpa2_psk(dev)
  141. setup_tdls(dev[0], dev[1], bssid)
  142. teardown_tdls(dev[0], dev[1], bssid)
  143. setup_tdls(dev[1], dev[0], bssid)
  144. #teardown_tdls(dev[0], dev[1], bssid)
  145. def test_ap_wpa2_tdls_concurrent_init(dev):
  146. """Concurrent TDLS setup initiation"""
  147. start_ap_wpa2_psk(ap_ifname)
  148. bssid = "02:00:00:00:02:00"
  149. wlantest_setup()
  150. connect_2sta_wpa2_psk(dev)
  151. dev[0].request("SET tdls_testing 0x80")
  152. setup_tdls(dev[1], dev[0], bssid, reverse=True)
  153. def test_ap_wpa2_tdls_concurrent_init2(dev):
  154. """Concurrent TDLS setup initiation (reverse)"""
  155. start_ap_wpa2_psk(ap_ifname)
  156. bssid = "02:00:00:00:02:00"
  157. wlantest_setup()
  158. connect_2sta_wpa2_psk(dev)
  159. dev[1].request("SET tdls_testing 0x80")
  160. setup_tdls(dev[0], dev[1], bssid)
  161. def test_ap_wpa2_tdls_decline_resp(dev):
  162. """Decline TDLS Setup Response"""
  163. start_ap_wpa2_psk(ap_ifname)
  164. bssid = "02:00:00:00:02:00"
  165. wlantest_setup()
  166. connect_2sta_wpa2_psk(dev)
  167. dev[1].request("SET tdls_testing 0x200")
  168. setup_tdls(dev[1], dev[0], bssid, expect_fail=True)
  169. def test_ap_wpa2_tdls_long_lifetime(dev):
  170. """TDLS with long TPK lifetime"""
  171. start_ap_wpa2_psk(ap_ifname)
  172. bssid = "02:00:00:00:02:00"
  173. wlantest_setup()
  174. connect_2sta_wpa2_psk(dev)
  175. dev[1].request("SET tdls_testing 0x40")
  176. setup_tdls(dev[1], dev[0], bssid)
  177. def test_ap_wpa2_tdls_long_frame(dev):
  178. """TDLS with long setup/teardown frames"""
  179. start_ap_wpa2_psk(ap_ifname)
  180. bssid = "02:00:00:00:02:00"
  181. wlantest_setup()
  182. connect_2sta_wpa2_psk(dev)
  183. dev[0].request("SET tdls_testing 0x1")
  184. dev[1].request("SET tdls_testing 0x1")
  185. setup_tdls(dev[1], dev[0], bssid)
  186. teardown_tdls(dev[1], dev[0], bssid)
  187. setup_tdls(dev[0], dev[1], bssid)
  188. def test_ap_wpa2_tdls_reneg(dev):
  189. """Renegotiate TDLS link"""
  190. start_ap_wpa2_psk(ap_ifname)
  191. bssid = "02:00:00:00:02:00"
  192. wlantest_setup()
  193. connect_2sta_wpa2_psk(dev)
  194. setup_tdls(dev[1], dev[0], bssid)
  195. setup_tdls(dev[0], dev[1], bssid)
  196. def test_ap_wpa2_tdls_wrong_lifetime_resp(dev):
  197. """Incorrect TPK lifetime in TDLS Setup Response"""
  198. start_ap_wpa2_psk(ap_ifname)
  199. bssid = "02:00:00:00:02:00"
  200. wlantest_setup()
  201. connect_2sta_wpa2_psk(dev)
  202. dev[1].request("SET tdls_testing 0x10")
  203. setup_tdls(dev[0], dev[1], bssid, expect_fail=True)
  204. def test_ap_wpa2_tdls_diff_rsnie(dev):
  205. """TDLS with different RSN IEs"""
  206. start_ap_wpa2_psk(ap_ifname)
  207. bssid = "02:00:00:00:02:00"
  208. wlantest_setup()
  209. connect_2sta_wpa2_psk(dev)
  210. dev[1].request("SET tdls_testing 0x2")
  211. setup_tdls(dev[1], dev[0], bssid)
  212. teardown_tdls(dev[1], dev[0], bssid)
  213. def test_ap_wpa_tdls(dev):
  214. """WPA-PSK AP and two stations using TDLS"""
  215. hostapd.add_ap(ap_ifname, hostapd.wpa_params(ssid="test-wpa-psk", passphrase="12345678"))
  216. bssid = "02:00:00:00:02:00"
  217. wlantest_setup()
  218. connect_2sta_wpa_psk(dev)
  219. setup_tdls(dev[0], dev[1], bssid)
  220. teardown_tdls(dev[0], dev[1], bssid)
  221. setup_tdls(dev[1], dev[0], bssid)
  222. def test_ap_wpa_mixed_tdls(dev):
  223. """WPA+WPA2-PSK AP and two stations using TDLS"""
  224. hostapd.add_ap(ap_ifname, hostapd.wpa_mixed_params(ssid="test-wpa-mixed-psk", passphrase="12345678"))
  225. bssid = "02:00:00:00:02:00"
  226. wlantest_setup()
  227. connect_2sta_wpa_psk_mixed(dev)
  228. setup_tdls(dev[0], dev[1], bssid)
  229. teardown_tdls(dev[0], dev[1], bssid)
  230. setup_tdls(dev[1], dev[0], bssid)
  231. def test_ap_wep_tdls(dev):
  232. """WEP AP and two stations using TDLS"""
  233. hostapd.add_ap(ap_ifname, { "ssid": "test-wep", "wep_key0": '"hello"' })
  234. bssid = "02:00:00:00:02:00"
  235. wlantest_setup()
  236. connect_2sta_wep(dev)
  237. setup_tdls(dev[0], dev[1], bssid)
  238. teardown_tdls(dev[0], dev[1], bssid)
  239. setup_tdls(dev[1], dev[0], bssid)
  240. def test_ap_open_tdls(dev):
  241. """Open AP and two stations using TDLS"""
  242. hostapd.add_ap(ap_ifname, { "ssid": "test-open" })
  243. bssid = "02:00:00:00:02:00"
  244. wlantest_setup()
  245. connect_2sta_open(dev)
  246. setup_tdls(dev[0], dev[1], bssid)
  247. teardown_tdls(dev[0], dev[1], bssid)
  248. setup_tdls(dev[1], dev[0], bssid)
  249. def add_tests(tests):
  250. tests.append(test_ap_wpa2_tdls)
  251. tests.append(test_ap_wpa2_tdls_concurrent_init)
  252. tests.append(test_ap_wpa2_tdls_concurrent_init2)
  253. tests.append(test_ap_wpa2_tdls_decline_resp)
  254. tests.append(test_ap_wpa2_tdls_long_lifetime)
  255. tests.append(test_ap_wpa2_tdls_long_frame)
  256. tests.append(test_ap_wpa2_tdls_reneg)
  257. tests.append(test_ap_wpa2_tdls_wrong_lifetime_resp)
  258. tests.append(test_ap_wpa2_tdls_diff_rsnie)
  259. tests.append(test_ap_wpa_tdls)
  260. tests.append(test_ap_wpa_mixed_tdls)
  261. tests.append(test_ap_wep_tdls)
  262. tests.append(test_ap_open_tdls)