test_ap_tdls.py 6.7 KB

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