test_rfkill.py 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. # rfkill tests
  2. # Copyright (c) 2014, 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 logging
  7. logger = logging.getLogger()
  8. import time
  9. import hostapd
  10. from hostapd import HostapdGlobal
  11. import hwsim_utils
  12. from wpasupplicant import WpaSupplicant
  13. from rfkill import RFKill
  14. from utils import HwsimSkip
  15. def get_rfkill(dev):
  16. phy = dev.get_driver_status_field("phyname")
  17. try:
  18. for r, s, h in RFKill.list():
  19. if r.name == phy:
  20. return r
  21. except Exception, e:
  22. raise HwsimSkip("No rfkill available: " + str(e))
  23. raise HwsimSkip("No rfkill match found for the interface")
  24. def test_rfkill_open(dev, apdev):
  25. """rfkill block/unblock during open mode connection"""
  26. rfk = get_rfkill(dev[0])
  27. hapd = hostapd.add_ap(apdev[0]['ifname'], { "ssid": "open" })
  28. dev[0].connect("open", key_mgmt="NONE", scan_freq="2412")
  29. try:
  30. logger.info("rfkill block")
  31. rfk.block()
  32. dev[0].wait_disconnected(timeout=10,
  33. error="Missing disconnection event on rfkill block")
  34. if "FAIL" not in dev[0].request("REASSOCIATE"):
  35. raise Exception("REASSOCIATE accepted while disabled")
  36. if "FAIL" not in dev[0].request("REATTACH"):
  37. raise Exception("REATTACH accepted while disabled")
  38. if "FAIL" not in dev[0].request("RECONNECT"):
  39. raise Exception("RECONNECT accepted while disabled")
  40. if "FAIL" not in dev[0].request("FETCH_OSU"):
  41. raise Exception("FETCH_OSU accepted while disabled")
  42. logger.info("rfkill unblock")
  43. rfk.unblock()
  44. dev[0].wait_connected(timeout=10,
  45. error="Missing connection event on rfkill unblock")
  46. hwsim_utils.test_connectivity(dev[0], hapd)
  47. finally:
  48. rfk.unblock()
  49. def test_rfkill_wpa2_psk(dev, apdev):
  50. """rfkill block/unblock during WPA2-PSK connection"""
  51. rfk = get_rfkill(dev[0])
  52. ssid = "test-wpa2-psk"
  53. passphrase = 'qwertyuiop'
  54. params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
  55. hapd = hostapd.add_ap(apdev[0]['ifname'], params)
  56. dev[0].connect(ssid, psk=passphrase, scan_freq="2412")
  57. try:
  58. logger.info("rfkill block")
  59. rfk.block()
  60. dev[0].wait_disconnected(timeout=10,
  61. error="Missing disconnection event on rfkill block")
  62. logger.info("rfkill unblock")
  63. rfk.unblock()
  64. dev[0].wait_connected(timeout=10,
  65. error="Missing connection event on rfkill unblock")
  66. hwsim_utils.test_connectivity(dev[0], hapd)
  67. finally:
  68. rfk.unblock()
  69. def test_rfkill_autogo(dev, apdev):
  70. """rfkill block/unblock for autonomous P2P GO"""
  71. rfk0 = get_rfkill(dev[0])
  72. rfk1 = get_rfkill(dev[1])
  73. dev[0].p2p_start_go()
  74. dev[1].request("SET p2p_no_group_iface 0")
  75. dev[1].p2p_start_go()
  76. try:
  77. logger.info("rfkill block 0")
  78. rfk0.block()
  79. ev = dev[0].wait_global_event(["P2P-GROUP-REMOVED"], timeout=10)
  80. if ev is None:
  81. raise Exception("Group removal not reported")
  82. if "reason=UNAVAILABLE" not in ev:
  83. raise Exception("Unexpected group removal reason: " + ev)
  84. if "FAIL" not in dev[0].request("P2P_LISTEN 1"):
  85. raise Exception("P2P_LISTEN accepted unexpectedly")
  86. if "FAIL" not in dev[0].request("P2P_LISTEN"):
  87. raise Exception("P2P_LISTEN accepted unexpectedly")
  88. logger.info("rfkill block 1")
  89. rfk1.block()
  90. ev = dev[1].wait_global_event(["P2P-GROUP-REMOVED"], timeout=10)
  91. if ev is None:
  92. raise Exception("Group removal not reported")
  93. if "reason=UNAVAILABLE" not in ev:
  94. raise Exception("Unexpected group removal reason: " + ev)
  95. logger.info("rfkill unblock 0")
  96. rfk0.unblock()
  97. logger.info("rfkill unblock 1")
  98. rfk1.unblock()
  99. time.sleep(1)
  100. finally:
  101. rfk0.unblock()
  102. rfk1.unblock()
  103. def test_rfkill_hostapd(dev, apdev):
  104. """rfkill block/unblock during and prior to hostapd operations"""
  105. hapd = hostapd.add_ap(apdev[0]['ifname'], { "ssid": "open" })
  106. rfk = get_rfkill(hapd)
  107. try:
  108. rfk.block()
  109. ev = hapd.wait_event(["INTERFACE-DISABLED"], timeout=5)
  110. if ev is None:
  111. raise Exception("INTERFACE-DISABLED event not seen")
  112. rfk.unblock()
  113. ev = hapd.wait_event(["INTERFACE-ENABLED"], timeout=5)
  114. if ev is None:
  115. raise Exception("INTERFACE-ENABLED event not seen")
  116. # hostapd does not current re-enable beaconing automatically
  117. hapd.disable()
  118. hapd.enable()
  119. dev[0].connect("open", key_mgmt="NONE", scan_freq="2412")
  120. rfk.block()
  121. ev = hapd.wait_event(["INTERFACE-DISABLED"], timeout=5)
  122. if ev is None:
  123. raise Exception("INTERFACE-DISABLED event not seen")
  124. dev[0].wait_disconnected(timeout=10)
  125. dev[0].request("DISCONNECT")
  126. hapd.disable()
  127. hglobal = HostapdGlobal()
  128. hglobal.flush()
  129. hglobal.remove(apdev[0]['ifname'])
  130. hapd = hostapd.add_ap(apdev[0]['ifname'], { "ssid": "open2" },
  131. no_enable=True)
  132. if "FAIL" not in hapd.request("ENABLE"):
  133. raise Exception("ENABLE succeeded unexpectedly (rfkill)")
  134. finally:
  135. rfk.unblock()
  136. def test_rfkill_wpas(dev, apdev):
  137. """rfkill block prior to wpa_supplicant start"""
  138. wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5')
  139. wpas.interface_add("wlan5")
  140. rfk = get_rfkill(wpas)
  141. wpas.interface_remove("wlan5")
  142. try:
  143. rfk.block()
  144. wpas.interface_add("wlan5")
  145. time.sleep(0.5)
  146. state = wpas.get_status_field("wpa_state")
  147. if state != "INTERFACE_DISABLED":
  148. raise Exception("Unexpected state with rfkill blocked: " + state)
  149. rfk.unblock()
  150. time.sleep(0.5)
  151. state = wpas.get_status_field("wpa_state")
  152. if state == "INTERFACE_DISABLED":
  153. raise Exception("Unexpected state with rfkill unblocked: " + state)
  154. finally:
  155. rfk.unblock()