diff mbox series

tests: query carrier before data test

Message ID 20231212090701.22bcc785bdfc.Iee5320f62b69e57308541dabaef728c0d8b05c6f@changeid
State Accepted
Headers show
Series tests: query carrier before data test | expand

Commit Message

Johannes Berg Dec. 12, 2023, 8:07 a.m. UTC
From: Johannes Berg <johannes.berg@intel.com>

The kernel has an asynchronous work to enable TX, which
hasn't always run by the time we get to TX tests. Do a
sysfs read from the carrier file before TX, on newer
kernels this synchronises the needed state.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
---
 tests/hwsim/hwsim_utils.py | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

Comments

Jouni Malinen Dec. 12, 2023, 7:30 p.m. UTC | #1
On Tue, Dec 12, 2023 at 09:07:02AM +0100, Johannes Berg wrote:
> The kernel has an asynchronous work to enable TX, which
> hasn't always run by the time we get to TX tests. Do a
> sysfs read from the carrier file before TX, on newer
> kernels this synchronises the needed state.

Thanks, applied.
diff mbox series

Patch

diff --git a/tests/hwsim/hwsim_utils.py b/tests/hwsim/hwsim_utils.py
index eb312bf96b2b..da4606e6ca4e 100644
--- a/tests/hwsim/hwsim_utils.py
+++ b/tests/hwsim/hwsim_utils.py
@@ -11,6 +11,24 @@  logger = logging.getLogger()
 
 from wpasupplicant import WpaSupplicant
 
+def _sync_carrier(dev, ifname):
+    ifname = ifname or dev.ifname
+    carrier_p2p = None
+    try:
+        with open(f'/sys/class/net/{ifname}/carrier', 'r') as f:
+            carrier_main = f.read().strip() == '1'
+    except FileNotFoundError:
+        return
+    if (isinstance(dev, WpaSupplicant) and dev.group_ifname and
+        dev.group_ifname != ifname):
+        ifname = dev.group_ifname
+        try:
+            with open(f'/sys/class/net/{ifname}/carrier', 'r') as f:
+                carrier_p2p = f.read().strip() == '1'
+        except FileNotFoundError:
+            pass
+    assert carrier_main or carrier_p2p, "sending data w/o carrier won't work"
+
 def config_data_test(dev1, dev2, dev1group, dev2group, ifname1, ifname2):
     cmd = "DATA_TEST_CONFIG 1"
     if ifname1:
@@ -22,6 +40,8 @@  def config_data_test(dev1, dev2, dev1group, dev2group, ifname1, ifname2):
     if "OK" not in res:
         raise Exception("Failed to enable data test functionality")
 
+    _sync_carrier(dev1, ifname1)
+
     cmd = "DATA_TEST_CONFIG 1"
     if ifname2:
         cmd = cmd + " ifname=" + ifname2
@@ -32,6 +52,8 @@  def config_data_test(dev1, dev2, dev1group, dev2group, ifname1, ifname2):
     if "OK" not in res:
         raise Exception("Failed to enable data test functionality")
 
+    _sync_carrier(dev2, ifname2)
+
 def run_multicast_connectivity_test(dev1, dev2, tos=None,
                                     dev1group=False, dev2group=False,
                                     ifname1=None, ifname2=None,