test_wnm.py 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. # WNM tests
  2. # Copyright (c) 2013, Jouni Malinen <j@w1.fi>
  3. #
  4. # This software may be distributed under the terms of the BSD license.
  5. # See README for more details.
  6. import time
  7. import logging
  8. logger = logging.getLogger()
  9. import hostapd
  10. def test_wnm_bss_transition_mgmt(dev, apdev):
  11. """WNM BSS Transition Management"""
  12. params = { "ssid": "test-wnm",
  13. "time_advertisement": "2",
  14. "time_zone": "EST5",
  15. "wnm_sleep_mode": "1",
  16. "bss_transition": "1" }
  17. hostapd.add_ap(apdev[0]['ifname'], params)
  18. dev[0].connect("test-wnm", key_mgmt="NONE", scan_freq="2412")
  19. dev[0].request("WNM_BSS_QUERY 0")
  20. def test_wnm_disassoc_imminent(dev, apdev):
  21. """WNM Disassociation Imminent"""
  22. params = { "ssid": "test-wnm",
  23. "time_advertisement": "2",
  24. "time_zone": "EST5",
  25. "wnm_sleep_mode": "1",
  26. "bss_transition": "1" }
  27. hostapd.add_ap(apdev[0]['ifname'], params)
  28. hapd = hostapd.Hostapd(apdev[0]['ifname'])
  29. dev[0].connect("test-wnm", key_mgmt="NONE", scan_freq="2412")
  30. addr = dev[0].p2p_interface_addr()
  31. hapd.request("DISASSOC_IMMINENT " + addr + " 10")
  32. ev = dev[0].wait_event(["WNM: Disassociation Imminent"])
  33. if ev is None:
  34. raise Exception("Timeout while waiting for disassociation imminent")
  35. if "Disassociation Timer 10" not in ev:
  36. raise Exception("Unexpected disassociation imminent contents")
  37. ev = dev[0].wait_event(["CTRL-EVENT-SCAN-RESULTS"])
  38. if ev is None:
  39. raise Exception("Timeout while waiting for re-connection scan")
  40. def test_wnm_ess_disassoc_imminent(dev, apdev):
  41. """WNM ESS Disassociation Imminent"""
  42. params = { "ssid": "test-wnm",
  43. "time_advertisement": "2",
  44. "time_zone": "EST5",
  45. "wnm_sleep_mode": "1",
  46. "bss_transition": "1" }
  47. hostapd.add_ap(apdev[0]['ifname'], params)
  48. hapd = hostapd.Hostapd(apdev[0]['ifname'])
  49. dev[0].connect("test-wnm", key_mgmt="NONE", scan_freq="2412")
  50. addr = dev[0].p2p_interface_addr()
  51. hapd.request("ESS_DISASSOC " + addr + " 10 http://example.com/session-info")
  52. ev = dev[0].wait_event(["ESS-DISASSOC-IMMINENT"])
  53. if ev is None:
  54. raise Exception("Timeout while waiting for ESS disassociation imminent")
  55. if "0 1024 http://example.com/session-info" not in ev:
  56. raise Exception("Unexpected ESS disassociation imminent message contents")
  57. ev = dev[0].wait_event(["CTRL-EVENT-SCAN-RESULTS"])
  58. if ev is None:
  59. raise Exception("Timeout while waiting for re-connection scan")
  60. def test_wnm_ess_disassoc_imminent_pmf(dev, apdev):
  61. """WNM ESS Disassociation Imminent"""
  62. params = hostapd.wpa2_params("test-wnm-rsn", "12345678")
  63. params["wpa_key_mgmt"] = "WPA-PSK-SHA256";
  64. params["ieee80211w"] = "2";
  65. params["bss_transition"] = "1"
  66. hostapd.add_ap(apdev[0]['ifname'], params)
  67. hapd = hostapd.Hostapd(apdev[0]['ifname'])
  68. dev[0].connect("test-wnm-rsn", psk="12345678", ieee80211w="2",
  69. key_mgmt="WPA-PSK-SHA256", proto="WPA2", scan_freq="2412")
  70. addr = dev[0].p2p_interface_addr()
  71. hapd.request("ESS_DISASSOC " + addr + " 10 http://example.com/session-info")
  72. ev = dev[0].wait_event(["ESS-DISASSOC-IMMINENT"])
  73. if ev is None:
  74. raise Exception("Timeout while waiting for ESS disassociation imminent")
  75. if "1 1024 http://example.com/session-info" not in ev:
  76. raise Exception("Unexpected ESS disassociation imminent message contents")
  77. ev = dev[0].wait_event(["CTRL-EVENT-SCAN-RESULTS"])
  78. if ev is None:
  79. raise Exception("Timeout while waiting for re-connection scan")
  80. def check_wnm_sleep_mode_enter_exit(hapd, dev):
  81. addr = dev.p2p_interface_addr()
  82. sta = hapd.get_sta(addr)
  83. if "[WNM_SLEEP_MODE]" in sta['flags']:
  84. raise Exception("Station unexpectedly in WNM-Sleep Mode")
  85. logger.info("Going to WNM Sleep Mode")
  86. dev.request("WNM_SLEEP enter")
  87. time.sleep(0.5)
  88. sta = hapd.get_sta(addr)
  89. if "[WNM_SLEEP_MODE]" not in sta['flags']:
  90. raise Exception("Station failed to enter WNM-Sleep Mode")
  91. logger.info("Waking up from WNM Sleep Mode")
  92. dev.request("WNM_SLEEP exit")
  93. time.sleep(0.5)
  94. sta = hapd.get_sta(addr)
  95. if "[WNM_SLEEP_MODE]" in sta['flags']:
  96. raise Exception("Station failed to exit WNM-Sleep Mode")
  97. def test_wnm_sleep_mode_open(dev, apdev):
  98. """WNM Sleep Mode - open"""
  99. params = { "ssid": "test-wnm",
  100. "time_advertisement": "2",
  101. "time_zone": "EST5",
  102. "wnm_sleep_mode": "1",
  103. "bss_transition": "1" }
  104. hostapd.add_ap(apdev[0]['ifname'], params)
  105. hapd = hostapd.Hostapd(apdev[0]['ifname'])
  106. dev[0].connect("test-wnm", key_mgmt="NONE", scan_freq="2412")
  107. check_wnm_sleep_mode_enter_exit(hapd, dev[0])
  108. def test_wnm_sleep_mode_rsn(dev, apdev):
  109. """WNM Sleep Mode - RSN"""
  110. params = hostapd.wpa2_params("test-wnm-rsn", "12345678")
  111. params["time_advertisement"] = "2"
  112. params["time_zone"] = "EST5"
  113. params["wnm_sleep_mode"] = "1"
  114. params["bss_transition"] = "1"
  115. hostapd.add_ap(apdev[0]['ifname'], params)
  116. hapd = hostapd.Hostapd(apdev[0]['ifname'])
  117. dev[0].connect("test-wnm-rsn", psk="12345678", scan_freq="2412")
  118. check_wnm_sleep_mode_enter_exit(hapd, dev[0])
  119. def test_wnm_sleep_mode_rsn_pmf(dev, apdev):
  120. """WNM Sleep Mode - RSN with PMF"""
  121. params = hostapd.wpa2_params("test-wnm-rsn", "12345678")
  122. params["wpa_key_mgmt"] = "WPA-PSK-SHA256";
  123. params["ieee80211w"] = "2";
  124. params["time_advertisement"] = "2"
  125. params["time_zone"] = "EST5"
  126. params["wnm_sleep_mode"] = "1"
  127. params["bss_transition"] = "1"
  128. hostapd.add_ap(apdev[0]['ifname'], params)
  129. hapd = hostapd.Hostapd(apdev[0]['ifname'])
  130. dev[0].connect("test-wnm-rsn", psk="12345678", ieee80211w="2",
  131. key_mgmt="WPA-PSK-SHA256", proto="WPA2", scan_freq="2412")
  132. check_wnm_sleep_mode_enter_exit(hapd, dev[0])