test_ap_tdls.py 9.4 KB

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