[PATCH] hwsim tests: add rfkill module
Johannes Berg
johannes
Thu Jan 8 02:16:33 PST 2015
From: Johannes Berg <johannes.berg at intel.com>
This can be used instead of invoking the rfkill binary.
Change-Id: Iedb42656d9658b6e8ac957d0113a309545d4dc39
Signed-off-by: Johannes Berg <johannes.berg at intel.com>
---
tests/hwsim/rfkill.py | 150 ++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 150 insertions(+)
create mode 100755 tests/hwsim/rfkill.py
diff --git a/tests/hwsim/rfkill.py b/tests/hwsim/rfkill.py
new file mode 100755
index 000000000000..cf73f4fb1030
--- /dev/null
+++ b/tests/hwsim/rfkill.py
@@ -0,0 +1,150 @@
+#!/usr/bin/env python
+#
+# rfkill control code
+#
+# Copyright (c) 2015 Intel Corporation
+#
+# Author: Johannes Berg <johannes.berg at intel.com>
+#
+# This software may be distributed under the terms of the BSD license.
+# See README for more details.
+
+import struct
+import fcntl
+import os
+
+(TYPE_ALL,
+ TYPE_WLAN,
+ TYPE_BLUETOOTH,
+ TYPE_UWB,
+ TYPE_WIMAX,
+ TYPE_WWAN,
+ TYPE_GPS,
+ TYPE_FM,
+ TYPE_NFC) = range(9)
+
+(_OP_ADD,
+ _OP_DEL,
+ _OP_CHANGE,
+ _OP_CHANGE_ALL) = range(4)
+
+_type_names = {
+ TYPE_ALL: "all",
+ TYPE_WLAN: "Wireless LAN",
+ TYPE_BLUETOOTH: "Bluetooth",
+ TYPE_UWB: "Ultra-Wideband",
+ TYPE_WIMAX: "WiMAX",
+ TYPE_WWAN: "Wireless WAN",
+ TYPE_GPS: "GPS",
+ TYPE_FM: "FM",
+ TYPE_NFC: "NFC",
+}
+
+# idx, type, op, soft, hard
+_event_struct = '@IBBBB'
+_event_sz = struct.calcsize(_event_struct)
+
+class RFKillException(Exception):
+ pass
+
+class RFKill(object):
+ def __init__(self, idx):
+ self._idx = idx
+ self._type = None
+
+ @property
+ def idx(self):
+ return self._idx
+
+ @property
+ def name(self):
+ return open('/sys/class/rfkill/rfkill%d/name' % self._idx, 'r').read().rstrip()
+
+ @property
+ def type(self):
+ if not self._type:
+ for r, s, h in RFKill.list():
+ if r.idx == self.idx:
+ self._type = r._type
+ break
+ return self._type
+
+ @property
+ def type_name(self):
+ return _type_names.get(self._type, "unknown")
+
+ @property
+ def blocked(self):
+ l = RFKill.list()
+ for r, s, h in l:
+ if r.idx == self.idx:
+ return (s, h)
+ raise RFKillException("RFKill instance no longer exists")
+
+ @property
+ def soft_blocked(self):
+ return self.blocked[0]
+
+ @soft_blocked.setter
+ def soft_blocked(self, block):
+ if block:
+ self.block()
+ else:
+ self.unblock()
+
+ @property
+ def hard_blocked(self):
+ return self.blocked[1]
+
+ def block(self):
+ rfk = open('/dev/rfkill', 'w')
+ s = struct.pack(_event_struct, self.idx, TYPE_ALL, _OP_CHANGE, 1, 0)
+ rfk.write(s)
+ rfk.close()
+
+ def unblock(self):
+ rfk = open('/dev/rfkill', 'w')
+ s = struct.pack(_event_struct, self.idx, TYPE_ALL, _OP_CHANGE, 0, 0)
+ rfk.write(s)
+ rfk.close()
+
+ @classmethod
+ def block_all(cls, t=TYPE_ALL):
+ rfk = open('/dev/rfkill', 'w')
+ print rfk
+ s = struct.pack(_event_struct, 0, t, _OP_CHANGE_ALL, 1, 0)
+ rfk.write(s)
+ rfk.close()
+
+ @classmethod
+ def unblock_all(cls, t=TYPE_ALL):
+ rfk = open('/dev/rfkill', 'w')
+ s = struct.pack(_event_struct, 0, t, _OP_CHANGE_ALL, 0, 0)
+ rfk.write(s)
+ rfk.close()
+
+ @classmethod
+ def list(cls):
+ res = []
+ rfk = open('/dev/rfkill', 'r')
+ fd = rfk.fileno()
+ flgs = fcntl.fcntl(fd, fcntl.F_GETFL)
+ fcntl.fcntl(fd, fcntl.F_SETFL, flgs | os.O_NONBLOCK)
+ while True:
+ try:
+ d = rfk.read(_event_sz)
+ _idx, _t, _op, _s, _h = struct.unpack(_event_struct, d)
+ if _op != _OP_ADD:
+ continue
+ r = RFKill(_idx)
+ r._type = _t
+ res.append((r, _s, _h))
+ except IOError:
+ break
+ return res
+
+if __name__ == "__main__":
+ for r, s, h in RFKill.list():
+ print "%d: %s: %s" % (r.idx, r.name, r.type_name)
+ print "\tSoft blocked: %s" % ("yes" if s else "no")
+ print "\tHard blocked: %s" % ("yes" if h else "no")
--
2.1.1
More information about the Hostap
mailing list