diff mbox series

[v2,3/3] auto-t: add fallback to reassociate test

Message ID 20230829145116.279949-3-prestwoj@gmail.com (mailing list archive)
State New
Headers show
Series [v2,1/3] ft: track FT auth/action response status | expand

Commit Message

James Prestwood Aug. 29, 2023, 2:51 p.m. UTC
---
 autotests/testPSK-roam/failed_roam_test.py | 90 +++++++++++++++++++++-
 autotests/testPSK-roam/ft-psk-ccmp-1.conf  |  1 +
 autotests/testPSK-roam/ft-psk-ccmp-2.conf  |  1 +
 autotests/testPSK-roam/ft-psk-ccmp-3.conf  |  1 +
 4 files changed, 90 insertions(+), 3 deletions(-)

Comments

James Prestwood Aug. 29, 2023, 2:53 p.m. UTC | #1
Hi, Denis,

On 8/29/23 7:51 AM, James Prestwood wrote:
> ---
>   autotests/testPSK-roam/failed_roam_test.py | 90 +++++++++++++++++++++-
>   autotests/testPSK-roam/ft-psk-ccmp-1.conf  |  1 +
>   autotests/testPSK-roam/ft-psk-ccmp-2.conf  |  1 +
>   autotests/testPSK-roam/ft-psk-ccmp-3.conf  |  1 +
>   4 files changed, 90 insertions(+), 3 deletions(-)

I should have sent as a single patchset or made it clear in the notes, 
but this does depend on the 2 prior autotest patches. Sorry about that.

> 
> diff --git a/autotests/testPSK-roam/failed_roam_test.py b/autotests/testPSK-roam/failed_roam_test.py
> index 8a3db662..09947705 100644
> --- a/autotests/testPSK-roam/failed_roam_test.py
> +++ b/autotests/testPSK-roam/failed_roam_test.py
> @@ -41,9 +41,11 @@ class Test(unittest.TestCase):
>           self.assertRaises(Exception, testutil.test_ifaces_connected,
>                             (prev.ifname, device.name, True, True))
>   
> -
>       # FT-over-Air failure, should stay connected
>       def test_ft_over_air_failure(self):
> +        self.rule2.enabled = True
> +        self.rule3.enabled = True
> +
>           wd = IWD(True)
>   
>           device = wd.list_devices(1)[0]
> @@ -60,12 +62,85 @@ class Test(unittest.TestCase):
>           self.rule0.enabled = False
>   
>           # IWD should then try BSS 2, and succeed
> +        device.wait_for_event('ft-roam', timeout=60)
>           self.verify_roam(wd, device, self.bss_hostapd[0], self.bss_hostapd[2])
>   
>           self.bss_hostapd[2].deauthenticate(device.address)
> +
> +    # FT-over-Air failure with Invalid PMKID, should reassociate
> +    def test_ft_over_air_fallback(self):
> +        self.rule_bss0.signal = -8000
> +        self.rule_bss0.enabled = True
> +        self.rule_bss1.signal = -7500
> +        self.rule_bss1.enabled = True
> +        self.rule_bss2.signal = -6000
> +        self.rule_bss2.enabled = True
> +
> +        # This will cause this BSS to reject any FT roams as its unable to
> +        # get keys from other APs
> +        self.bss_hostapd[2].set_value('ft_psk_generate_local', '0')
> +        self.bss_hostapd[2].reload()
> +
> +        wd = IWD(True)
> +
> +        device = wd.list_devices(1)[0]
> +
> +        self.connect(wd, device, self.bss_hostapd[0])
> +
> +        # IWD should connect, then attempt a roam to BSS 1, which should
> +        # fail and cause a fallback to reassociation
> +        device.wait_for_event('ft-fallback-to-reassoc', timeout=60)
> +        device.wait_for_event('reassoc-roam', timeout=60)
> +
> +        self.verify_roam(wd, device, self.bss_hostapd[0], self.bss_hostapd[2])
> +
> +        # Trigger another roam
> +        self.rule_bss2.signal = -8000
> +
> +        device.wait_for_event('ft-roam', timeout=60)
> +
> +        # Ensure an FT roam back to a properly configured AP works.
> +        self.verify_roam(wd, device, self.bss_hostapd[2], self.bss_hostapd[1])
> +
> +        self.bss_hostapd[1].deauthenticate(device.address)
>           condition = 'obj.state == DeviceState.disconnected'
>           wd.wait_for_object_condition(device, condition)
>   
> +    # FT-over-Air failure with Invalid PMKID. The ranking is such that other
> +    # FT candidates are available so it should FT elsewhere rather than
> +    # retry with reassociation
> +    def test_ft_over_air_fallback_retry_ft(self):
> +        self.rule_bss0.signal = -8000
> +        self.rule_bss0.enabled = True
> +        self.rule_bss1.signal = -7300
> +        self.rule_bss1.enabled = True
> +        self.rule_bss2.signal = -7100
> +        self.rule_bss2.enabled = True
> +
> +        # This will cause this BSS to reject any FT roams as its unable to
> +        # get keys from other APs
> +        self.bss_hostapd[2].set_value('ft_psk_generate_local', '0')
> +        self.bss_hostapd[2].reload()
> +
> +        wd = IWD(True)
> +
> +        device = wd.list_devices(1)[0]
> +
> +        self.connect(wd, device, self.bss_hostapd[0])
> +
> +        # IWD should connect, then attempt a roam to BSS 1, which should
> +        # fail and cause the rank to be re-computed. This shoudl then put
> +        # bss 1 as the next candidate (since the FT factor is removed)
> +        device.wait_for_event('ft-fallback-to-reassoc', timeout=60)
> +        device.wait_for_event('ft-roam', timeout=60)
> +
> +        self.verify_roam(wd, device, self.bss_hostapd[0], self.bss_hostapd[1])
> +
> +        self.bss_hostapd[1].deauthenticate(device.address)
> +        condition = 'obj.state == DeviceState.disconnected'
> +        wd.wait_for_object_condition(device, condition)
> +
> +
>       def tearDown(self):
>           os.system('ip link set "' + self.bss_hostapd[0].ifname + '" down')
>           os.system('ip link set "' + self.bss_hostapd[1].ifname + '" down')
> @@ -75,6 +150,10 @@ class Test(unittest.TestCase):
>           self.rule0.enabled = False
>           self.rule1.enabled = False
>           self.rule2.enabled = False
> +        self.rule3.enabled = False
> +        self.rule_bss0.enabled = False
> +        self.rule_bss1.enabled = False
> +        self.rule_bss2.enabled = False
>   
>           for hapd in self.bss_hostapd:
>               hapd.default()
> @@ -109,13 +188,18 @@ class Test(unittest.TestCase):
>           cls.rule2 = hwsim.rules.create()
>           cls.rule2.source = hwsim.get_radio('rad0').addresses[0]
>           cls.rule2.signal = -8000
> -        cls.rule2.enabled = True
>   
>           # Causes IWD to first prefer BSS 1 to roam, then BSS 2.
>           cls.rule3 = hwsim.rules.create()
>           cls.rule3.source = hwsim.get_radio('rad2').addresses[0]
>           cls.rule3.signal = -7000
> -        cls.rule3.enabled = True
> +
> +        cls.rule_bss0 = hwsim.rules.create()
> +        cls.rule_bss0.source = hwsim.get_radio('rad0').addresses[0]
> +        cls.rule_bss1 = hwsim.rules.create()
> +        cls.rule_bss1.source = hwsim.get_radio('rad1').addresses[0]
> +        cls.rule_bss2 = hwsim.rules.create()
> +        cls.rule_bss2.source = hwsim.get_radio('rad2').addresses[0]
>   
>       @classmethod
>       def tearDownClass(cls):
> diff --git a/autotests/testPSK-roam/ft-psk-ccmp-1.conf b/autotests/testPSK-roam/ft-psk-ccmp-1.conf
> index eec8805f..b46d1f27 100644
> --- a/autotests/testPSK-roam/ft-psk-ccmp-1.conf
> +++ b/autotests/testPSK-roam/ft-psk-ccmp-1.conf
> @@ -33,6 +33,7 @@ pmk_r1_push=0
>   # case.  Only works with FT-PSK, otherwise brctl needs to be installed and
>   # CONFIG_BRIDGE enabled in the kernel.
>   ft_psk_generate_local=1
> +rkh_pull_timeout=50
>   ft_over_ds=0
>   ap_table_expiration_time=36000
>   ap_table_max_size=10
> diff --git a/autotests/testPSK-roam/ft-psk-ccmp-2.conf b/autotests/testPSK-roam/ft-psk-ccmp-2.conf
> index 5992461f..3e215457 100644
> --- a/autotests/testPSK-roam/ft-psk-ccmp-2.conf
> +++ b/autotests/testPSK-roam/ft-psk-ccmp-2.conf
> @@ -33,6 +33,7 @@ pmk_r1_push=0
>   # case.  Only works with FT-PSK, otherwise brctl needs to be installed and
>   # CONFIG_BRIDGE enabled in the kernel.
>   ft_psk_generate_local=1
> +rkh_pull_timeout=50
>   ft_over_ds=0
>   ap_table_expiration_time=36000
>   ap_table_max_size=10
> diff --git a/autotests/testPSK-roam/ft-psk-ccmp-3.conf b/autotests/testPSK-roam/ft-psk-ccmp-3.conf
> index 5992461f..3e215457 100644
> --- a/autotests/testPSK-roam/ft-psk-ccmp-3.conf
> +++ b/autotests/testPSK-roam/ft-psk-ccmp-3.conf
> @@ -33,6 +33,7 @@ pmk_r1_push=0
>   # case.  Only works with FT-PSK, otherwise brctl needs to be installed and
>   # CONFIG_BRIDGE enabled in the kernel.
>   ft_psk_generate_local=1
> +rkh_pull_timeout=50
>   ft_over_ds=0
>   ap_table_expiration_time=36000
>   ap_table_max_size=10
diff mbox series

Patch

diff --git a/autotests/testPSK-roam/failed_roam_test.py b/autotests/testPSK-roam/failed_roam_test.py
index 8a3db662..09947705 100644
--- a/autotests/testPSK-roam/failed_roam_test.py
+++ b/autotests/testPSK-roam/failed_roam_test.py
@@ -41,9 +41,11 @@  class Test(unittest.TestCase):
         self.assertRaises(Exception, testutil.test_ifaces_connected,
                           (prev.ifname, device.name, True, True))
 
-
     # FT-over-Air failure, should stay connected
     def test_ft_over_air_failure(self):
+        self.rule2.enabled = True
+        self.rule3.enabled = True
+
         wd = IWD(True)
 
         device = wd.list_devices(1)[0]
@@ -60,12 +62,85 @@  class Test(unittest.TestCase):
         self.rule0.enabled = False
 
         # IWD should then try BSS 2, and succeed
+        device.wait_for_event('ft-roam', timeout=60)
         self.verify_roam(wd, device, self.bss_hostapd[0], self.bss_hostapd[2])
 
         self.bss_hostapd[2].deauthenticate(device.address)
+
+    # FT-over-Air failure with Invalid PMKID, should reassociate
+    def test_ft_over_air_fallback(self):
+        self.rule_bss0.signal = -8000
+        self.rule_bss0.enabled = True
+        self.rule_bss1.signal = -7500
+        self.rule_bss1.enabled = True
+        self.rule_bss2.signal = -6000
+        self.rule_bss2.enabled = True
+
+        # This will cause this BSS to reject any FT roams as its unable to
+        # get keys from other APs
+        self.bss_hostapd[2].set_value('ft_psk_generate_local', '0')
+        self.bss_hostapd[2].reload()
+
+        wd = IWD(True)
+
+        device = wd.list_devices(1)[0]
+
+        self.connect(wd, device, self.bss_hostapd[0])
+
+        # IWD should connect, then attempt a roam to BSS 1, which should
+        # fail and cause a fallback to reassociation
+        device.wait_for_event('ft-fallback-to-reassoc', timeout=60)
+        device.wait_for_event('reassoc-roam', timeout=60)
+
+        self.verify_roam(wd, device, self.bss_hostapd[0], self.bss_hostapd[2])
+
+        # Trigger another roam
+        self.rule_bss2.signal = -8000
+
+        device.wait_for_event('ft-roam', timeout=60)
+
+        # Ensure an FT roam back to a properly configured AP works.
+        self.verify_roam(wd, device, self.bss_hostapd[2], self.bss_hostapd[1])
+
+        self.bss_hostapd[1].deauthenticate(device.address)
         condition = 'obj.state == DeviceState.disconnected'
         wd.wait_for_object_condition(device, condition)
 
+    # FT-over-Air failure with Invalid PMKID. The ranking is such that other
+    # FT candidates are available so it should FT elsewhere rather than
+    # retry with reassociation
+    def test_ft_over_air_fallback_retry_ft(self):
+        self.rule_bss0.signal = -8000
+        self.rule_bss0.enabled = True
+        self.rule_bss1.signal = -7300
+        self.rule_bss1.enabled = True
+        self.rule_bss2.signal = -7100
+        self.rule_bss2.enabled = True
+
+        # This will cause this BSS to reject any FT roams as its unable to
+        # get keys from other APs
+        self.bss_hostapd[2].set_value('ft_psk_generate_local', '0')
+        self.bss_hostapd[2].reload()
+
+        wd = IWD(True)
+
+        device = wd.list_devices(1)[0]
+
+        self.connect(wd, device, self.bss_hostapd[0])
+
+        # IWD should connect, then attempt a roam to BSS 1, which should
+        # fail and cause the rank to be re-computed. This shoudl then put
+        # bss 1 as the next candidate (since the FT factor is removed)
+        device.wait_for_event('ft-fallback-to-reassoc', timeout=60)
+        device.wait_for_event('ft-roam', timeout=60)
+
+        self.verify_roam(wd, device, self.bss_hostapd[0], self.bss_hostapd[1])
+
+        self.bss_hostapd[1].deauthenticate(device.address)
+        condition = 'obj.state == DeviceState.disconnected'
+        wd.wait_for_object_condition(device, condition)
+
+
     def tearDown(self):
         os.system('ip link set "' + self.bss_hostapd[0].ifname + '" down')
         os.system('ip link set "' + self.bss_hostapd[1].ifname + '" down')
@@ -75,6 +150,10 @@  class Test(unittest.TestCase):
         self.rule0.enabled = False
         self.rule1.enabled = False
         self.rule2.enabled = False
+        self.rule3.enabled = False
+        self.rule_bss0.enabled = False
+        self.rule_bss1.enabled = False
+        self.rule_bss2.enabled = False
 
         for hapd in self.bss_hostapd:
             hapd.default()
@@ -109,13 +188,18 @@  class Test(unittest.TestCase):
         cls.rule2 = hwsim.rules.create()
         cls.rule2.source = hwsim.get_radio('rad0').addresses[0]
         cls.rule2.signal = -8000
-        cls.rule2.enabled = True
 
         # Causes IWD to first prefer BSS 1 to roam, then BSS 2.
         cls.rule3 = hwsim.rules.create()
         cls.rule3.source = hwsim.get_radio('rad2').addresses[0]
         cls.rule3.signal = -7000
-        cls.rule3.enabled = True
+
+        cls.rule_bss0 = hwsim.rules.create()
+        cls.rule_bss0.source = hwsim.get_radio('rad0').addresses[0]
+        cls.rule_bss1 = hwsim.rules.create()
+        cls.rule_bss1.source = hwsim.get_radio('rad1').addresses[0]
+        cls.rule_bss2 = hwsim.rules.create()
+        cls.rule_bss2.source = hwsim.get_radio('rad2').addresses[0]
 
     @classmethod
     def tearDownClass(cls):
diff --git a/autotests/testPSK-roam/ft-psk-ccmp-1.conf b/autotests/testPSK-roam/ft-psk-ccmp-1.conf
index eec8805f..b46d1f27 100644
--- a/autotests/testPSK-roam/ft-psk-ccmp-1.conf
+++ b/autotests/testPSK-roam/ft-psk-ccmp-1.conf
@@ -33,6 +33,7 @@  pmk_r1_push=0
 # case.  Only works with FT-PSK, otherwise brctl needs to be installed and
 # CONFIG_BRIDGE enabled in the kernel.
 ft_psk_generate_local=1
+rkh_pull_timeout=50
 ft_over_ds=0
 ap_table_expiration_time=36000
 ap_table_max_size=10
diff --git a/autotests/testPSK-roam/ft-psk-ccmp-2.conf b/autotests/testPSK-roam/ft-psk-ccmp-2.conf
index 5992461f..3e215457 100644
--- a/autotests/testPSK-roam/ft-psk-ccmp-2.conf
+++ b/autotests/testPSK-roam/ft-psk-ccmp-2.conf
@@ -33,6 +33,7 @@  pmk_r1_push=0
 # case.  Only works with FT-PSK, otherwise brctl needs to be installed and
 # CONFIG_BRIDGE enabled in the kernel.
 ft_psk_generate_local=1
+rkh_pull_timeout=50
 ft_over_ds=0
 ap_table_expiration_time=36000
 ap_table_max_size=10
diff --git a/autotests/testPSK-roam/ft-psk-ccmp-3.conf b/autotests/testPSK-roam/ft-psk-ccmp-3.conf
index 5992461f..3e215457 100644
--- a/autotests/testPSK-roam/ft-psk-ccmp-3.conf
+++ b/autotests/testPSK-roam/ft-psk-ccmp-3.conf
@@ -33,6 +33,7 @@  pmk_r1_push=0
 # case.  Only works with FT-PSK, otherwise brctl needs to be installed and
 # CONFIG_BRIDGE enabled in the kernel.
 ft_psk_generate_local=1
+rkh_pull_timeout=50
 ft_over_ds=0
 ap_table_expiration_time=36000
 ap_table_max_size=10