linux-wireless.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/4] Updates for rfkill
@ 2021-01-16 12:51 Markus Theil
  2021-01-16 12:51 ` [PATCH 1/4] rfkill.py: migrate to python3 Markus Theil
                   ` (4 more replies)
  0 siblings, 5 replies; 6+ messages in thread
From: Markus Theil @ 2021-01-16 12:51 UTC (permalink / raw)
  To: johannes; +Cc: linux-wireless, Markus Theil

- Include older patch which updates rfkill.py to use Python 3 as
  the Python patch is based on this change.
- Update rfkill.h to include hard block reasons.
- Include support for hard block reasons to rfkill userspace.

Markus Theil (4):
  rfkill.py: migrate to python3
  rfkill: update rfkill.h
  rfkill: support hard block reason in python code
  rfkill: support hard block reason in C code

 rfkill.c  | 19 +++++++++++---
 rfkill.h  | 18 ++++++++++++-
 rfkill.py | 78 ++++++++++++++++++++++++++++++++++++++-----------------
 3 files changed, 86 insertions(+), 29 deletions(-)

-- 
2.30.0


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH 1/4] rfkill.py: migrate to python3
  2021-01-16 12:51 [PATCH 0/4] Updates for rfkill Markus Theil
@ 2021-01-16 12:51 ` Markus Theil
  2021-01-16 12:51 ` [PATCH 2/4] rfkill: update rfkill.h Markus Theil
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Markus Theil @ 2021-01-16 12:51 UTC (permalink / raw)
  To: johannes; +Cc: linux-wireless, Markus Theil

Signed-off-by: Markus Theil <markus.theil@tu-ilmenau.de>
---
 rfkill.py | 28 +++++++++++++++-------------
 1 file changed, 15 insertions(+), 13 deletions(-)

diff --git a/rfkill.py b/rfkill.py
index 57dcddc..983671f 100755
--- a/rfkill.py
+++ b/rfkill.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 #
 # rfkill control code
 #
@@ -21,12 +21,12 @@ import os
  TYPE_WWAN,
  TYPE_GPS,
  TYPE_FM,
- TYPE_NFC) = range(9)
+ TYPE_NFC) = list(range(9))
 
 (_OP_ADD,
  _OP_DEL,
  _OP_CHANGE,
- _OP_CHANGE_ALL) = range(4)
+ _OP_CHANGE_ALL) = list(range(4))
 
 _type_names = {
     TYPE_ALL: "all",
@@ -84,7 +84,7 @@ class RFKill(object):
     @property
     def soft_blocked(self):
         return self.blocked[0]
-        
+
     @soft_blocked.setter
     def soft_blocked(self, block):
         if block:
@@ -97,28 +97,28 @@ class RFKill(object):
         return self.blocked[1]
 
     def block(self):
-        rfk = open('/dev/rfkill', 'w')
+        rfk = open('/dev/rfkill', 'wb')
         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')
+        rfk = open('/dev/rfkill', 'wb')
         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
+        rfk = open('/dev/rfkill', 'wb')
+        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')
+        rfk = open('/dev/rfkill', 'wb')
         s = struct.pack(_event_struct, 0, t, _OP_CHANGE_ALL, 0, 0)
         rfk.write(s)
         rfk.close()
@@ -126,7 +126,7 @@ class RFKill(object):
     @classmethod
     def list(cls):
         res = []
-        rfk = open('/dev/rfkill', 'r')
+        rfk = open('/dev/rfkill', 'rb')
         fd = rfk.fileno()
         flgs = fcntl.fcntl(fd, fcntl.F_GETFL)
         fcntl.fcntl(fd, fcntl.F_SETFL, flgs | os.O_NONBLOCK)
@@ -141,10 +141,12 @@ class RFKill(object):
                 res.append((r, _s, _h))
             except IOError:
                 break
+            except TypeError:
+                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")
+        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.30.0


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 2/4] rfkill: update rfkill.h
  2021-01-16 12:51 [PATCH 0/4] Updates for rfkill Markus Theil
  2021-01-16 12:51 ` [PATCH 1/4] rfkill.py: migrate to python3 Markus Theil
@ 2021-01-16 12:51 ` Markus Theil
  2021-01-16 12:51 ` [PATCH 3/4] rfkill: support hard block reason in python code Markus Theil
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Markus Theil @ 2021-01-16 12:51 UTC (permalink / raw)
  To: johannes; +Cc: linux-wireless, Markus Theil

Signed-off-by: Markus Theil <markus.theil@tu-ilmenau.de>
---
 rfkill.h | 18 +++++++++++++++++-
 1 file changed, 17 insertions(+), 1 deletion(-)

diff --git a/rfkill.h b/rfkill.h
index 058757f..03e8af8 100644
--- a/rfkill.h
+++ b/rfkill.h
@@ -59,6 +59,8 @@ enum rfkill_type {
  * @RFKILL_OP_DEL: a device was removed
  * @RFKILL_OP_CHANGE: a device's state changed -- userspace changes one device
  * @RFKILL_OP_CHANGE_ALL: userspace changes all devices (of a type, or all)
+ *	into a state, also updating the default state used for devices that
+ *	are hot-plugged later.
  */
 enum rfkill_operation {
 	RFKILL_OP_ADD = 0,
@@ -67,6 +69,16 @@ enum rfkill_operation {
 	RFKILL_OP_CHANGE_ALL,
 };
 
+/**
+ * enum rfkill_hard_block_reasons - hard block reasons
+ * @RFKILL_HARD_BLOCK_SIGNAL: the hardware rfkill signal is active
+ * @RFKILL_HARD_BLOCK_NOT_OWNER: the NIC is not owned by the host
+ */
+enum rfkill_hard_block_reasons {
+	RFKILL_HARD_BLOCK_SIGNAL	= 1 << 0,
+	RFKILL_HARD_BLOCK_NOT_OWNER	= 1 << 1,
+};
+
 /**
  * struct rfkill_event - events for userspace on /dev/rfkill
  * @idx: index of dev rfkill
@@ -74,6 +86,8 @@ enum rfkill_operation {
  * @op: operation code
  * @hard: hard state (0/1)
  * @soft: soft state (0/1)
+ * @hard_block_reasons: valid if hard is set. One or several reasons from
+ *	&enum rfkill_hard_block_reasons.
  *
  * Structure used for userspace communication on /dev/rfkill,
  * used for events from the kernel and control to the kernel.
@@ -82,7 +96,9 @@ struct rfkill_event {
 	__u32 idx;
 	__u8  type;
 	__u8  op;
-	__u8  soft, hard;
+	__u8  soft;
+	__u8  hard;
+	__u8  hard_block_reasons;
 } __attribute__((packed));
 
 /*
-- 
2.30.0


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 3/4] rfkill: support hard block reason in python code
  2021-01-16 12:51 [PATCH 0/4] Updates for rfkill Markus Theil
  2021-01-16 12:51 ` [PATCH 1/4] rfkill.py: migrate to python3 Markus Theil
  2021-01-16 12:51 ` [PATCH 2/4] rfkill: update rfkill.h Markus Theil
@ 2021-01-16 12:51 ` Markus Theil
  2021-01-16 12:51 ` [PATCH 4/4] rfkill: support hard block reason in C code Markus Theil
  2021-01-21 12:24 ` [PATCH 0/4] Updates for rfkill Johannes Berg
  4 siblings, 0 replies; 6+ messages in thread
From: Markus Theil @ 2021-01-16 12:51 UTC (permalink / raw)
  To: johannes; +Cc: linux-wireless, Markus Theil

Signed-off-by: Markus Theil <markus.theil@tu-ilmenau.de>
---
 rfkill.py | 60 ++++++++++++++++++++++++++++++++++++++++---------------
 1 file changed, 44 insertions(+), 16 deletions(-)

diff --git a/rfkill.py b/rfkill.py
index 983671f..57d21b0 100755
--- a/rfkill.py
+++ b/rfkill.py
@@ -28,6 +28,9 @@ import os
  _OP_CHANGE,
  _OP_CHANGE_ALL) = list(range(4))
 
+HARD_BLOCK_SIGNAL = 1 << 0
+HARD_BLOCK_NOT_OWNER = 1 << 1
+
 _type_names = {
     TYPE_ALL: "all",
     TYPE_WLAN: "Wireless LAN",
@@ -40,10 +43,14 @@ _type_names = {
     TYPE_NFC: "NFC",
 }
 
-# idx, type, op, soft, hard
-_event_struct = '@IBBBB'
+# idx, type, op, soft, hard, hard_block_reasons
+_event_struct = '@IBBBBB'
 _event_sz = struct.calcsize(_event_struct)
 
+# idx, type, op, soft, hard
+_event_struct_old = '@IBBBB'
+_event_old_sz = struct.calcsize(_event_struct_old)
+
 class RFKillException(Exception):
     pass
 
@@ -63,7 +70,7 @@ class RFKill(object):
     @property
     def type(self):
         if not self._type:
-            for r, s, h in RFKill.list():
+            for r, s, h, hbr in RFKill.list():
                 if r.idx == self.idx:
                     self._type = r._type
                     break
@@ -76,7 +83,7 @@ class RFKill(object):
     @property
     def blocked(self):
         l = RFKill.list()
-        for r, s, h in l:
+        for r, s, h, hbr in l:
             if r.idx == self.idx:
                 return (s, h)
         raise RFKillException("RFKill instance no longer exists")
@@ -97,48 +104,60 @@ class RFKill(object):
         return self.blocked[1]
 
     def block(self):
-        rfk = open('/dev/rfkill', 'wb')
-        s = struct.pack(_event_struct, self.idx, TYPE_ALL, _OP_CHANGE, 1, 0)
+        rfk = open('/dev/rfkill', 'wb', 0)
+        s = struct.pack(_event_struct, self.idx, TYPE_ALL, _OP_CHANGE, 1, 0, 0)
         rfk.write(s)
         rfk.close()
 
     def unblock(self):
-        rfk = open('/dev/rfkill', 'wb')
-        s = struct.pack(_event_struct, self.idx, TYPE_ALL, _OP_CHANGE, 0, 0)
+        rfk = open('/dev/rfkill', 'wb', 0)
+        s = struct.pack(_event_struct, self.idx, TYPE_ALL, _OP_CHANGE, 0, 0, 0)
         rfk.write(s)
         rfk.close()
 
     @classmethod
     def block_all(cls, t=TYPE_ALL):
-        rfk = open('/dev/rfkill', 'wb')
+        rfk = open('/dev/rfkill', 'wb', 0)
         print(rfk)
-        s = struct.pack(_event_struct, 0, t, _OP_CHANGE_ALL, 1, 0)
+        s = struct.pack(_event_struct, 0, t, _OP_CHANGE_ALL, 1, 0, 0)
         rfk.write(s)
         rfk.close()
 
     @classmethod
     def unblock_all(cls, t=TYPE_ALL):
-        rfk = open('/dev/rfkill', 'wb')
-        s = struct.pack(_event_struct, 0, t, _OP_CHANGE_ALL, 0, 0)
+        rfk = open('/dev/rfkill', 'wb', 0)
+        s = struct.pack(_event_struct, 0, t, _OP_CHANGE_ALL, 0, 0, 0)
         rfk.write(s)
         rfk.close()
 
     @classmethod
     def list(cls):
         res = []
-        rfk = open('/dev/rfkill', 'rb')
+        rfk = open('/dev/rfkill', 'rb', 0)
+
         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)
+                read_len = len(d)
+                assert read_len in [_event_sz, _event_old_sz]
+
+                # init additional fields of newer formats to 'None' here
+                _hbr = None
+
+                # hard block reason included ?
+                if read_len >= _event_sz:
+                    _idx, _t, _op, _s, _h, _hbr = struct.unpack(_event_struct, d)
+                else:
+                    _idx, _t, _op, _s, _h = struct.unpack(_event_struct_old, d)
+
                 if _op != _OP_ADD:
                     continue
                 r = RFKill(_idx)
                 r._type = _t
-                res.append((r, _s, _h))
+                res.append((r, _s, _h, _hbr))
             except IOError:
                 break
             except TypeError:
@@ -146,7 +165,16 @@ class RFKill(object):
         return res
 
 if __name__ == "__main__":
-    for r, s, h in RFKill.list():
+    for r, s, h, hbr 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"))
+        if hbr != None:
+            print("\tHard block reasons: ", end="")
+            if hbr == 0:
+                print("[NONE]", end="")
+            if hbr & HARD_BLOCK_NOT_OWNER:
+                print("[NOT_OWNER]", end="")
+            if hbr & HARD_BLOCK_SIGNAL:
+                print("[SIGNAL]", end="")
+            print()
-- 
2.30.0


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 4/4] rfkill: support hard block reason in C code
  2021-01-16 12:51 [PATCH 0/4] Updates for rfkill Markus Theil
                   ` (2 preceding siblings ...)
  2021-01-16 12:51 ` [PATCH 3/4] rfkill: support hard block reason in python code Markus Theil
@ 2021-01-16 12:51 ` Markus Theil
  2021-01-21 12:24 ` [PATCH 0/4] Updates for rfkill Johannes Berg
  4 siblings, 0 replies; 6+ messages in thread
From: Markus Theil @ 2021-01-16 12:51 UTC (permalink / raw)
  To: johannes; +Cc: linux-wireless, Markus Theil

Signed-off-by: Markus Theil <markus.theil@tu-ilmenau.de>
---
 rfkill.c | 19 +++++++++++++++----
 1 file changed, 15 insertions(+), 4 deletions(-)

diff --git a/rfkill.c b/rfkill.c
index 8cd81fe..7fa5c39 100644
--- a/rfkill.c
+++ b/rfkill.c
@@ -51,15 +51,16 @@ static void rfkill_event(void)
 			break;
 		}
 
-		if (len != RFKILL_EVENT_SIZE_V1) {
+		if (len != RFKILL_EVENT_SIZE_V1 && len != RFKILL_EVENT_SIZE_V1 + 1) {
 			fprintf(stderr, "Wrong size of RFKILL event\n");
 			continue;
 		}
 
 		gettimeofday(&tv, NULL);
-		printf("%ld.%06u: idx %u type %u op %u soft %u hard %u\n",
+		printf("%ld.%06u: idx %u type %u op %u soft %u hard %u hard block reasons 0x%02x\n",
 			(long) tv.tv_sec, (unsigned int) tv.tv_usec,
-			event.idx, event.type, event.op, event.soft, event.hard);
+			event.idx, event.type, event.op, event.soft, event.hard,
+			event.hard_block_reasons);
 		fflush(stdout);
 	}
 
@@ -214,7 +215,7 @@ static int rfkill_list(const char *param)
 			break;
 		}
 
-		if (len != RFKILL_EVENT_SIZE_V1) {
+		if (len != RFKILL_EVENT_SIZE_V1 && len != RFKILL_EVENT_SIZE_V1 + 1) {
 			fprintf(stderr, "Wrong size of RFKILL event\n");
 			continue;
 		}
@@ -242,6 +243,16 @@ static int rfkill_list(const char *param)
 						type2string(event.type));
 		printf("\tSoft blocked: %s\n", event.soft ? "yes" : "no");
 		printf("\tHard blocked: %s\n", event.hard ? "yes" : "no");
+		if (len >= RFKILL_EVENT_SIZE_V1 + 1) {
+			printf("\tHard block reasons: ");
+			if (event.hard_block_reasons == 0)
+				printf("[NONE]");
+			if (event.hard_block_reasons & RFKILL_HARD_BLOCK_NOT_OWNER)
+				printf("[NOT_OWNER]");
+			if (event.hard_block_reasons & RFKILL_HARD_BLOCK_SIGNAL)
+				printf("[SIGNAL]");
+			printf("\n");
+		}
 	}
 
 	close(fd);
-- 
2.30.0


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH 0/4] Updates for rfkill
  2021-01-16 12:51 [PATCH 0/4] Updates for rfkill Markus Theil
                   ` (3 preceding siblings ...)
  2021-01-16 12:51 ` [PATCH 4/4] rfkill: support hard block reason in C code Markus Theil
@ 2021-01-21 12:24 ` Johannes Berg
  4 siblings, 0 replies; 6+ messages in thread
From: Johannes Berg @ 2021-01-21 12:24 UTC (permalink / raw)
  To: Markus Theil; +Cc: linux-wireless

Hi Markus,

Thanks for the patches!

I separately committed a fix for the buffering=0 issue, just so it's
separate and not part of the other changes.

>   rfkill.py: migrate to python3

Applied, but I made some cleanups.

>   rfkill: update rfkill.h
>   rfkill: support hard block reason in python code
>   rfkill: support hard block reason in C code

This is broken, unfortunately. Updating rfkill.h as is causes issues
because we read more data than we are willing to accept, which you've
fixed up in the support for hard block reasons patch. Seems that should
partially be in the original patch - e.g. checking "size >= V1" instead
of "size == V1".

Additionally, the hard block reasons in C patch is wrong because if the
read was short, the field is not initialized. Need to clear the event to
zeroes before reading it, or at least at the beginnning (I guess we can
assume the kernel will not change size between two reads).

The python patch I applied with some fixups.

johannes


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2021-01-21 12:26 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-01-16 12:51 [PATCH 0/4] Updates for rfkill Markus Theil
2021-01-16 12:51 ` [PATCH 1/4] rfkill.py: migrate to python3 Markus Theil
2021-01-16 12:51 ` [PATCH 2/4] rfkill: update rfkill.h Markus Theil
2021-01-16 12:51 ` [PATCH 3/4] rfkill: support hard block reason in python code Markus Theil
2021-01-16 12:51 ` [PATCH 4/4] rfkill: support hard block reason in C code Markus Theil
2021-01-21 12:24 ` [PATCH 0/4] Updates for rfkill Johannes Berg

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).