test_ap_tdls.py 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  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 logging
  10. logger = logging.getLogger(__name__)
  11. import hwsim_utils
  12. from hostapd import HostapdGlobal
  13. from hostapd import Hostapd
  14. import hostapd
  15. from wlantest import Wlantest
  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 connectivity(dev, ap_ifname):
  21. hwsim_utils.test_connectivity_sta(dev[0], dev[1])
  22. hwsim_utils.test_connectivity(dev[0].ifname, ap_ifname)
  23. hwsim_utils.test_connectivity(dev[1].ifname, ap_ifname)
  24. def connect_2sta(dev, ssid):
  25. dev[0].connect(ssid, psk="12345678")
  26. dev[1].connect(ssid, psk="12345678")
  27. connectivity(dev, ap_ifname)
  28. def connect_2sta_wpa2_psk(dev):
  29. connect_2sta(dev, "test-wpa2-psk")
  30. def connect_2sta_wpa_psk(dev):
  31. connect_2sta(dev, "test-wpa-psk")
  32. def connect_2sta_wpa_psk_mixed(dev):
  33. dev[0].connect("test-wpa-mixed-psk", psk="12345678", proto="WPA")
  34. dev[1].connect("test-wpa-mixed-psk", psk="12345678", proto="WPA2")
  35. connectivity(dev, ap_ifname)
  36. def connect_2sta_wep(dev):
  37. dev[0].connect("test-wep", key_mgmt="NONE", wep_key0='"hello"')
  38. dev[1].connect("test-wep", key_mgmt="NONE", wep_key0='"hello"')
  39. connectivity(dev, ap_ifname)
  40. def connect_2sta_open(dev):
  41. dev[0].connect("test-open", key_mgmt="NONE")
  42. dev[1].connect("test-open", key_mgmt="NONE")
  43. connectivity(dev, ap_ifname)
  44. def wlantest_setup():
  45. wt = Wlantest()
  46. wt.flush()
  47. wt.add_passphrase("12345678")
  48. wt.add_wepkey("68656c6c6f")
  49. def wlantest_tdls_packet_counters(bssid, addr0, addr1):
  50. wt = Wlantest()
  51. dl = wt.get_tdls_counter("valid_direct_link", bssid, addr0, addr1)
  52. inv_dl = wt.get_tdls_counter("invalid_direct_link", bssid, addr0, addr1)
  53. ap = wt.get_tdls_counter("valid_ap_path", bssid, addr0, addr1)
  54. inv_ap = wt.get_tdls_counter("invalid_ap_path", bssid, addr0, addr1)
  55. return [dl,inv_dl,ap,inv_ap]
  56. def tdls_check_dl(sta0, sta1, bssid, addr0, addr1):
  57. wt = Wlantest()
  58. wt.tdls_clear(bssid, addr0, addr1)
  59. hwsim_utils.test_connectivity_sta(sta0, sta1)
  60. [dl,inv_dl,ap,inv_ap] = wlantest_tdls_packet_counters(bssid, addr0, addr1)
  61. if dl == 0:
  62. raise Exception("No valid frames through direct link")
  63. if inv_dl > 0:
  64. raise Exception("Invalid frames through direct link")
  65. if ap > 0:
  66. raise Exception("Unexpected frames through AP path")
  67. if inv_ap > 0:
  68. raise Exception("Invalid frames through AP path")
  69. def tdls_check_ap(sta0, sta1, bssid, addr0, addr1):
  70. wt = Wlantest()
  71. wt.tdls_clear(bssid, addr0, addr1);
  72. hwsim_utils.test_connectivity_sta(sta0, sta1)
  73. [dl,inv_dl,ap,inv_ap] = wlantest_tdls_packet_counters(bssid, addr0, addr1)
  74. if dl > 0:
  75. raise Exception("Unexpected frames through direct link")
  76. if inv_dl > 0:
  77. raise Exception("Invalid frames through direct link")
  78. if ap == 0:
  79. raise Exception("No valid frames through AP path")
  80. if inv_ap > 0:
  81. raise Exception("Invalid frames through AP path")
  82. def setup_tdls(sta0, sta1, bssid, reverse=False, expect_fail=False):
  83. logger.info("Setup TDLS")
  84. addr0 = sta0.p2p_interface_addr()
  85. addr1 = sta1.p2p_interface_addr()
  86. wt = Wlantest()
  87. wt.tdls_clear(bssid, addr0, addr1);
  88. wt.tdls_clear(bssid, addr1, addr0);
  89. sta0.tdls_setup(addr1)
  90. time.sleep(1)
  91. if expect_fail:
  92. tdls_check_ap(sta0, sta1, bssid, addr0, addr1)
  93. return
  94. if reverse:
  95. addr1 = sta0.p2p_interface_addr()
  96. addr0 = sta1.p2p_interface_addr()
  97. conf = wt.get_tdls_counter("setup_conf_ok", bssid, addr0, addr1);
  98. if conf == 0:
  99. raise Exception("No TDLS Setup Confirm (success) seen")
  100. tdls_check_dl(sta0, sta1, bssid, addr0, addr1)
  101. def teardown_tdls(sta0, sta1, bssid):
  102. logger.info("Teardown TDLS")
  103. addr0 = sta0.p2p_interface_addr()
  104. addr1 = sta1.p2p_interface_addr()
  105. sta0.tdls_teardown(addr1)
  106. time.sleep(1)
  107. wt = Wlantest()
  108. teardown = wt.get_tdls_counter("teardown", bssid, addr0, addr1);
  109. if teardown == 0:
  110. raise Exception("No TDLS Setup Teardown seen")
  111. tdls_check_ap(sta0, sta1, bssid, addr0, addr1)
  112. def test_ap_wpa2_tdls(dev):
  113. """WPA2-PSK AP and two stations using TDLS"""
  114. start_ap_wpa2_psk(ap_ifname)
  115. bssid = "02:00:00:00:02:00"
  116. wlantest_setup()
  117. connect_2sta_wpa2_psk(dev)
  118. setup_tdls(dev[0], dev[1], bssid)
  119. teardown_tdls(dev[0], dev[1], bssid)
  120. setup_tdls(dev[1], dev[0], bssid)
  121. #teardown_tdls(dev[0], dev[1], bssid)
  122. def test_ap_wpa2_tdls_concurrent_init(dev):
  123. """Concurrent TDLS setup initiation"""
  124. start_ap_wpa2_psk(ap_ifname)
  125. bssid = "02:00:00:00:02:00"
  126. wlantest_setup()
  127. connect_2sta_wpa2_psk(dev)
  128. dev[0].request("SET tdls_testing 0x80")
  129. setup_tdls(dev[1], dev[0], bssid, reverse=True)
  130. def test_ap_wpa2_tdls_concurrent_init2(dev):
  131. """Concurrent TDLS setup initiation (reverse)"""
  132. start_ap_wpa2_psk(ap_ifname)
  133. bssid = "02:00:00:00:02:00"
  134. wlantest_setup()
  135. connect_2sta_wpa2_psk(dev)
  136. dev[1].request("SET tdls_testing 0x80")
  137. setup_tdls(dev[0], dev[1], bssid)
  138. def test_ap_wpa2_tdls_decline_resp(dev):
  139. """Decline TDLS Setup Response"""
  140. start_ap_wpa2_psk(ap_ifname)
  141. bssid = "02:00:00:00:02:00"
  142. wlantest_setup()
  143. connect_2sta_wpa2_psk(dev)
  144. dev[1].request("SET tdls_testing 0x200")
  145. setup_tdls(dev[1], dev[0], bssid, expect_fail=True)
  146. def test_ap_wpa2_tdls_long_lifetime(dev):
  147. """TDLS with long TPK lifetime"""
  148. start_ap_wpa2_psk(ap_ifname)
  149. bssid = "02:00:00:00:02:00"
  150. wlantest_setup()
  151. connect_2sta_wpa2_psk(dev)
  152. dev[1].request("SET tdls_testing 0x40")
  153. setup_tdls(dev[1], dev[0], bssid)
  154. def test_ap_wpa2_tdls_long_frame(dev):
  155. """TDLS with long setup/teardown frames"""
  156. start_ap_wpa2_psk(ap_ifname)
  157. bssid = "02:00:00:00:02:00"
  158. wlantest_setup()
  159. connect_2sta_wpa2_psk(dev)
  160. dev[0].request("SET tdls_testing 0x1")
  161. dev[1].request("SET tdls_testing 0x1")
  162. setup_tdls(dev[1], dev[0], bssid)
  163. teardown_tdls(dev[1], dev[0], bssid)
  164. setup_tdls(dev[0], dev[1], bssid)
  165. def test_ap_wpa2_tdls_reneg(dev):
  166. """Renegotiate TDLS link"""
  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. setup_tdls(dev[1], dev[0], bssid)
  172. setup_tdls(dev[0], dev[1], bssid)
  173. def test_ap_wpa2_tdls_wrong_lifetime_resp(dev):
  174. """Incorrect TPK lifetime in TDLS Setup Response"""
  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 0x10")
  180. setup_tdls(dev[0], dev[1], bssid, expect_fail=True)
  181. def test_ap_wpa2_tdls_diff_rsnie(dev):
  182. """TDLS with different RSN IEs"""
  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[1].request("SET tdls_testing 0x2")
  188. setup_tdls(dev[1], dev[0], bssid)
  189. teardown_tdls(dev[1], dev[0], bssid)
  190. def test_ap_wpa_tdls(dev):
  191. """WPA-PSK AP and two stations using TDLS"""
  192. hostapd.add_ap(ap_ifname, hostapd.wpa_params(ssid="test-wpa-psk", passphrase="12345678"))
  193. bssid = "02:00:00:00:02:00"
  194. wlantest_setup()
  195. connect_2sta_wpa_psk(dev)
  196. setup_tdls(dev[0], dev[1], bssid)
  197. teardown_tdls(dev[0], dev[1], bssid)
  198. setup_tdls(dev[1], dev[0], bssid)
  199. def test_ap_wpa_mixed_tdls(dev):
  200. """WPA+WPA2-PSK AP and two stations using TDLS"""
  201. hostapd.add_ap(ap_ifname, hostapd.wpa_mixed_params(ssid="test-wpa-mixed-psk", passphrase="12345678"))
  202. bssid = "02:00:00:00:02:00"
  203. wlantest_setup()
  204. connect_2sta_wpa_psk_mixed(dev)
  205. setup_tdls(dev[0], dev[1], bssid)
  206. teardown_tdls(dev[0], dev[1], bssid)
  207. setup_tdls(dev[1], dev[0], bssid)
  208. def test_ap_wep_tdls(dev):
  209. """WEP AP and two stations using TDLS"""
  210. hostapd.add_ap(ap_ifname, { "ssid": "test-wep", "wep_key0": '"hello"' })
  211. bssid = "02:00:00:00:02:00"
  212. wlantest_setup()
  213. connect_2sta_wep(dev)
  214. setup_tdls(dev[0], dev[1], bssid)
  215. teardown_tdls(dev[0], dev[1], bssid)
  216. setup_tdls(dev[1], dev[0], bssid)
  217. def test_ap_open_tdls(dev):
  218. """Open AP and two stations using TDLS"""
  219. hostapd.add_ap(ap_ifname, { "ssid": "test-open" })
  220. bssid = "02:00:00:00:02:00"
  221. wlantest_setup()
  222. connect_2sta_open(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)