test_wnm.py 5.9 KB

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