[PATCH 1/2] hostapd: dfs: allow switch to available channel

Janusz Dziedzic janusz.dziedzic at gmail.com
Fri Oct 9 09:20:36 EDT 2020


pt., 9 paź 2020 o 14:11 Jouni Malinen <j at w1.fi> napisał(a):
>
> On Fri, Oct 09, 2020 at 01:44:32PM +0200, Janusz Dziedzic wrote:
> > pt., 9 paź 2020 o 10:37 Jouni Malinen <j at w1.fi> napisał(a):
> > >
> > > On Sat, Oct 03, 2020 at 02:00:12PM +0200, Janusz Dziedzic wrote:
> > > > For EU, where preCAC is allowed, we should
> > > > allow switch to DFS available channels, instead
> > > > of restart BSS.
> > >
> > > Could you please clarify how this is supposed to work in regulatory
> > > domains that do not allow previously done CAC results to be used? The
> > > test case added in 2/2 seems to pass even if running the AP with country
> > > US or CA..
> >
> > Test itself choose/force EU country and expect AP-CSA-FINISHED
> > +        # Toggle regulatory - clean all preCAC
> > +        hostapd.cmd_execute(apdev[0], ['iw', 'reg', 'set', "US"])
> > +
> > +        hapd = start_dfs_ap(apdev[0], country="PL")
>
> And that "PL" is indeed what I replaced with "CA" and "US" to confirm
> that patch 1/2 did not enable something that it shouldn't enable..
> However, the test was still passing when the country code was pointing
> to non-ETSI country. Can you please clarify why this is the case and how
> does this protect expected functionality (new CAC required) outside the
> ETSI regulatory domain?
>
Seems I see what is wrong. This is mainly because we cache channels state
in hostapd and my code do fast chan_switch:

CHAN_SWITCH 5 5180 ht
CHAN_SWITCH 5 5260 ht

and we get late DFS-PRE-CAC-EXPIRED

When add 2 second sleep between chan_switch - fail correctly:
@@ -662,7 +662,7 @@ def test_dfs_chan_switch_precac(dev, apdev):
         # Toggle regulatory - clean all preCAC
         hostapd.cmd_execute(apdev[0], ['iw', 'reg', 'set', "US"])

-        hapd = start_dfs_ap(apdev[0], country="PL")
+        hapd = start_dfs_ap(apdev[0], country="US")

         ev = wait_dfs_event(hapd, "DFS-CAC-COMPLETED", 70)
         if "success=1" not in ev:
@@ -692,6 +692,8 @@ def test_dfs_chan_switch_precac(dev, apdev):
         if freq != "5180":
             raise Exception("Unexpected frequency")

+        time.sleep(2)
+

192.168.0.11/wlp2s0: <3>DFS-CAC-START freq=5260 chan=52 sec_chan=0,
width=0, seg0=0, seg1=0, cac_time=60s
192.168.0.11/wlp2s0: CTRL: STATUS
192.168.0.11/wlp2s0: <3>DFS-CAC-COMPLETED success=1 freq=5260
ht_enabled=1 chan_offset=0 chan_width=1 cf1=5260 cf2=0
192.168.0.11/wlp2s0: <3>AP-ENABLED
192.168.0.11/wlp2s0: CTRL: STATUS
192.168.0.11/wlp2s0: CTRL: CHAN_SWITCH 5 5180 ht
192.168.0.11/wlp2s0: <3>CTRL-EVENT-STARTED-CHANNEL-SWITCH freq=5180
ht_enabled=1 ch_offset=0 ch_width=20 MHz cf1=5180 cf2=0 dfs=0
192.168.0.11/wlp2s0: <3>CTRL-EVENT-CHANNEL-SWITCH freq=5180
ht_enabled=1 ch_offset=0 ch_width=20 MHz cf1=5180 cf2=0 dfs=0
192.168.0.11/wlp2s0: <3>AP-CSA-FINISHED freq=5180 dfs=0
192.168.0.11/wlp2s0: CTRL: STATUS
192.168.0.11/wlp2s0: CTRL: CHAN_SWITCH 5 5260 ht
192.168.0.11/wlp2s0: <3>DFS-PRE-CAC-EXPIRED freq=5260 ht_enabled=0
chan_offset=0 chan_width=0 cf1=5260 cf2=0
192.168.0.11/wlp2s0: <3>AP-DISABLED
192.168.0.11/wlp2s0: <3>DFS-CAC-START freq=5260 chan=52 sec_chan=0,
width=0, seg0=0, seg1=0, cac_time=60s
192.168.0.11/wlp2s0: CTRL: DISABLE

Should I send patch with 2 seconds delay between chan_switch and add
negative test also?

But for the future shouldn't we always read channels state from
kernel/driver/lower_layer?
Each time we get some EVENT/CTRL re-read channel states?

BR
Janusz


> > I can add negative test also, where will set (we could pass country as a param)
> > hapd = start_dfs_ap(apdev[0], country="US")
> > and will expect fail - (we will not get AP-CSA-FINISHED - while AP
> > will be restarted).
>
> It would be useful to do that as well especially since I was trying to
> do that exact check just to notice that the expected second CAC did not
> happen.
>
> --
> Jouni Malinen                                            PGP id EFC895FA



--
Janusz Dziedzic



More information about the Hostap mailing list