test_ap_tdls.py 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  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 connect_sta(sta):
  26. logger.info("Connect STA " + sta.ifname + " to AP")
  27. id = sta.add_network()
  28. sta.set_network_quoted(id, "ssid", "test-wpa2-psk")
  29. sta.set_network_quoted(id, "psk", "12345678")
  30. sta.connect_network(id)
  31. def connect_2sta(dev):
  32. connect_sta(dev[0])
  33. connect_sta(dev[1])
  34. hwsim_utils.test_connectivity_sta(dev[0], dev[1])
  35. hwsim_utils.test_connectivity(dev[0].ifname, "wlan2")
  36. hwsim_utils.test_connectivity(dev[1].ifname, "wlan2")
  37. def wlantest_tdls(field, bssid, addr1, addr2):
  38. res = subprocess.check_output(["../../wlantest/wlantest_cli",
  39. "get_tdls_counter", field, bssid, addr1,
  40. addr2]);
  41. if "FAIL" in res:
  42. raise Exception("wlantest_cli command failed")
  43. return int(res)
  44. def wlantest_tdls_clear(bssid, addr1, addr2):
  45. subprocess.call(["../../wlantest/wlantest_cli",
  46. "clear_tdls_counters", bssid, addr1, addr2]);
  47. def wlantest_setup():
  48. subprocess.call(["../../wlantest/wlantest_cli", "flush"]);
  49. subprocess.call(["../../wlantest/wlantest_cli", "add_passphrase",
  50. "12345678"]);
  51. def wlantest_tdls_packet_counters(bssid, addr0, addr1):
  52. dl = wlantest_tdls("valid_direct_link", bssid, addr0, addr1);
  53. inv_dl = wlantest_tdls("invalid_direct_link", bssid, addr0, addr1);
  54. ap = wlantest_tdls("valid_ap_path", bssid, addr0, addr1);
  55. inv_ap = wlantest_tdls("invalid_ap_path", bssid, addr0, addr1);
  56. return [dl,inv_dl,ap,inv_ap]
  57. def tdls_check_dl(sta0, sta1, bssid, addr0, addr1):
  58. wlantest_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. wlantest_tdls_clear(bssid, addr0, addr1);
  71. hwsim_utils.test_connectivity_sta(sta0, sta1)
  72. [dl,inv_dl,ap,inv_ap] = wlantest_tdls_packet_counters(bssid, addr0, addr1)
  73. if dl > 0:
  74. raise Exception("Unexpected frames through direct link")
  75. if inv_dl > 0:
  76. raise Exception("Invalid frames through direct link")
  77. if ap == 0:
  78. raise Exception("No valid frames through AP path")
  79. if inv_ap > 0:
  80. raise Exception("Invalid frames through AP path")
  81. def setup_tdls(sta0, sta1, bssid, reverse=False, expect_fail=False):
  82. logger.info("Setup TDLS")
  83. addr0 = sta0.p2p_interface_addr()
  84. addr1 = sta1.p2p_interface_addr()
  85. wlantest_tdls_clear(bssid, addr0, addr1);
  86. wlantest_tdls_clear(bssid, addr1, addr0);
  87. sta0.tdls_setup(addr1)
  88. time.sleep(1)
  89. if expect_fail:
  90. tdls_check_ap(sta0, sta1, bssid, addr0, addr1)
  91. return
  92. if reverse:
  93. addr1 = sta0.p2p_interface_addr()
  94. addr0 = sta1.p2p_interface_addr()
  95. conf = wlantest_tdls("setup_conf_ok", bssid, addr0, addr1);
  96. if conf == 0:
  97. raise Exception("No TDLS Setup Confirm (success) seen")
  98. tdls_check_dl(sta0, sta1, bssid, addr0, addr1)
  99. def teardown_tdls(sta0, sta1, bssid):
  100. logger.info("Teardown TDLS")
  101. addr0 = sta0.p2p_interface_addr()
  102. addr1 = sta1.p2p_interface_addr()
  103. sta0.tdls_teardown(addr1)
  104. time.sleep(1)
  105. teardown = wlantest_tdls("teardown", bssid, addr0, addr1);
  106. if teardown == 0:
  107. raise Exception("No TDLS Setup Teardown seen")
  108. tdls_check_ap(sta0, sta1, bssid, addr0, addr1)
  109. def test_ap_wpa2_tdls(dev):
  110. """WPA2-PSK AP and two stations using TDLS"""
  111. start_ap_wpa2_psk(ap_ifname)
  112. bssid = "02:00:00:00:02:00"
  113. wlantest_setup()
  114. connect_2sta(dev)
  115. setup_tdls(dev[0], dev[1], bssid)
  116. teardown_tdls(dev[0], dev[1], bssid)
  117. setup_tdls(dev[1], dev[0], bssid)
  118. #teardown_tdls(dev[0], dev[1], bssid)
  119. def test_ap_wpa2_tdls_concurrent_init(dev):
  120. """Concurrent TDLS setup initiation"""
  121. start_ap_wpa2_psk(ap_ifname)
  122. bssid = "02:00:00:00:02:00"
  123. wlantest_setup()
  124. connect_2sta(dev)
  125. dev[0].request("SET tdls_testing 0x80")
  126. setup_tdls(dev[1], dev[0], bssid, reverse=True)
  127. def test_ap_wpa2_tdls_concurrent_init2(dev):
  128. """Concurrent TDLS setup initiation (reverse)"""
  129. start_ap_wpa2_psk(ap_ifname)
  130. bssid = "02:00:00:00:02:00"
  131. wlantest_setup()
  132. connect_2sta(dev)
  133. dev[1].request("SET tdls_testing 0x80")
  134. setup_tdls(dev[0], dev[1], bssid)
  135. def test_ap_wpa2_tdls_decline_resp(dev):
  136. """Decline TDLS Setup Response"""
  137. start_ap_wpa2_psk(ap_ifname)
  138. bssid = "02:00:00:00:02:00"
  139. wlantest_setup()
  140. connect_2sta(dev)
  141. dev[1].request("SET tdls_testing 0x200")
  142. setup_tdls(dev[1], dev[0], bssid, expect_fail=True)
  143. def test_ap_wpa2_tdls_long_lifetime(dev):
  144. """TDLS with long TPK lifetime"""
  145. start_ap_wpa2_psk(ap_ifname)
  146. bssid = "02:00:00:00:02:00"
  147. wlantest_setup()
  148. connect_2sta(dev)
  149. dev[1].request("SET tdls_testing 0x40")
  150. setup_tdls(dev[1], dev[0], bssid)
  151. def test_ap_wpa2_tdls_long_frame(dev):
  152. """TDLS with long setup/teardown frames"""
  153. start_ap_wpa2_psk(ap_ifname)
  154. bssid = "02:00:00:00:02:00"
  155. wlantest_setup()
  156. connect_2sta(dev)
  157. dev[0].request("SET tdls_testing 0x1")
  158. dev[1].request("SET tdls_testing 0x1")
  159. setup_tdls(dev[1], dev[0], bssid)
  160. teardown_tdls(dev[1], dev[0], bssid)
  161. setup_tdls(dev[0], dev[1], bssid)
  162. def test_ap_wpa2_tdls_reneg(dev):
  163. """Renegotiate TDLS link"""
  164. start_ap_wpa2_psk(ap_ifname)
  165. bssid = "02:00:00:00:02:00"
  166. wlantest_setup()
  167. connect_2sta(dev)
  168. setup_tdls(dev[1], dev[0], bssid)
  169. setup_tdls(dev[0], dev[1], bssid)
  170. def test_ap_wpa2_tdls_wrong_lifetime_resp(dev):
  171. """Incorrect TPK lifetime in TDLS Setup Response"""
  172. start_ap_wpa2_psk(ap_ifname)
  173. bssid = "02:00:00:00:02:00"
  174. wlantest_setup()
  175. connect_2sta(dev)
  176. dev[1].request("SET tdls_testing 0x10")
  177. setup_tdls(dev[0], dev[1], bssid, expect_fail=True)
  178. def test_ap_wpa2_tdls_diff_rsnie(dev):
  179. """TDLS with different RSN IEs"""
  180. start_ap_wpa2_psk(ap_ifname)
  181. bssid = "02:00:00:00:02:00"
  182. wlantest_setup()
  183. connect_2sta(dev)
  184. dev[1].request("SET tdls_testing 0x2")
  185. setup_tdls(dev[1], dev[0], bssid)
  186. teardown_tdls(dev[1], dev[0], bssid)
  187. def add_tests(tests):
  188. tests.append(test_ap_wpa2_tdls)
  189. tests.append(test_ap_wpa2_tdls_concurrent_init)
  190. tests.append(test_ap_wpa2_tdls_concurrent_init2)
  191. tests.append(test_ap_wpa2_tdls_decline_resp)
  192. tests.append(test_ap_wpa2_tdls_long_lifetime)
  193. tests.append(test_ap_wpa2_tdls_long_frame)
  194. tests.append(test_ap_wpa2_tdls_reneg)
  195. tests.append(test_ap_wpa2_tdls_wrong_lifetime_resp)
  196. tests.append(test_ap_wpa2_tdls_diff_rsnie)