New subject: [PATCH 2/3] auto-t: make spoof_frame more robust
Sometimes scan results can come in with a MAC address which
should be in the first index of addrs[] (42:xx:xx:xx:xx:xx).
This causes a failure to lookup the radio path.
There was also a failure path added if the radio cannot be
found rather than rely on DBus to fail with a None path.
The arguments to SendFrame were also changed to use the
ByteArray DBus type rather than python's internal bytearray.
This shouldn't have any effect, but its more consistent with
how DBus arguments should be used.
---
autotests/util/hwsim.py | 10 +++++++---
1 file changed, 7 insertions(+), 3 deletions(-)
diff --git a/autotests/util/hwsim.py b/autotests/util/hwsim.py
index 9aa14cbc..ad4bec1f 100755
--- a/autotests/util/hwsim.py
+++ b/autotests/util/hwsim.py
@@ -330,15 +330,19 @@ class Hwsim(iwd.AsyncOpAbstract):
obj = objects[path]
for interface in obj:
if interface == HWSIM_INTERFACE_INTERFACE:
- if obj[interface]['Address'] == radio.addresses[0]:
+ if obj[interface]['Address'] == radio.addresses[0] or \
+ obj[interface]['Address'] ==
radio.addresses[1]:
radio_path = path
break
+ if not radio_path:
+ raise Exception("Could not find radio %s" % radio.path)
+
iface = dbus.Interface(self._bus.get_object(HWSIM_SERVICE, radio_path),
HWSIM_INTERFACE_INTERFACE)
- iface.SendFrame(bytearray.fromhex(station.replace(':', '')),
- freq, -30, bytearray.fromhex(frame))
+ iface.SendFrame(dbus.ByteArray.fromhex(station.replace(':',
'')),
+ freq, -30, dbus.ByteArray.fromhex(frame))
def get_radio(self, name):
for path in self.radios:
--
2.26.2
New subject: [PATCH 3/3] auto-t: fix SAQuery-spoofing test
This test occationally failed due to a badly timed DBus scan
triggering right when hwsim tried sending out the spoofed frame.
This caused mac80211_hwsim to reject CMD_FRAME when the timing
was just right.
Rather than always starting a DBus scan we can rely on periodic
scans and only DBus scan if there are no networks in IWD's list.
A scanning check was also added prior to sending out the frame
and if true we wait for not scanning. This is more paranoia than
anything.
---
.../testSAQuery-spoofing/connection_test.py | 16 +++++++---------
1 file changed, 7 insertions(+), 9 deletions(-)
diff --git a/autotests/testSAQuery-spoofing/connection_test.py
b/autotests/testSAQuery-spoofing/connection_test.py
index 7ad96d4f..a1e84de6 100644
--- a/autotests/testSAQuery-spoofing/connection_test.py
+++ b/autotests/testSAQuery-spoofing/connection_test.py
@@ -32,12 +32,7 @@ class Test(unittest.TestCase):
condition = 'not obj.scanning'
wd.wait_for_object_condition(device, condition)
- device.scan()
-
- condition = 'not obj.scanning'
- wd.wait_for_object_condition(device, condition)
-
- ordered_network = device.get_ordered_network('ssidCCMP')
+ ordered_network = device.get_ordered_network('ssidCCMP',
scan_if_needed=True)
self.assertEqual(ordered_network.type, NetworkType.psk)
@@ -49,9 +44,12 @@ class Test(unittest.TestCase):
condition = 'obj.state == DeviceState.connected'
wd.wait_for_object_condition(device, condition)
- # TODO: for some reason hostapd does not respond to SA query if done
- # too soon after connection.
- sleep(1)
+ # Ensure IWD is not scanning. This causes problems with mac80211_hwsim
+ # where CMD_FRAME will fail during a scan. This is due to the frame not
+ # having the same frequency as the radio (since hwsim is off-channel)
+ if device.scanning:
+ condition = 'not obj.scanning'
+ wd.wait_for_object_condition(device, condition)
# Spoof a disassociate frame. This will kick off SA Query procedure.
hwsim.spoof_disassociate(radio, hostapd.get_freq(), device.address)
--
2.26.2