On Mon, Jan 05, 2026 at 02:32:52PM +0100, Stefan Sperling wrote:
> On Thu, Jan 01, 2026 at 05:44:23PM +0100, Stefan Sperling wrote:
> > On Thu, Jan 01, 2026 at 04:03:54PM +0000, Vitaliy Makkoveev wrote:
> > > On Thu, Jan 01, 2026 at 10:43:21AM +0100, Stefan Sperling wrote:
> > > > My best guess is that this AP is buggy and does not like the
> > > > PFM-capabale bit being set in our assoc request.
> > > > 
> > > > Does this patch help?
> > > > 
> > > 
> > > Yes, this fixed wifi on both machines. Thanks!
> > 
> > Good. I'm glad that we've found out where the problem is.
> > 
> > The code path we are touching here is also used to generate beacons
> > in hostap mode. So I will need to figure out a way to make this change
> > without breaking the use of PMF in hostap mode.
> > None of our drivers combine PMF and hostap right now, but the stack
> > should not prevent hostap and PMF from working together.
> > 
> > I will try to take a closer look at this next week. Currently in
> > vacation mode.
> 
> I am going to commit this:
> 

Works for me. Thanks.

> M  sys/net80211/ieee80211_output.c  |  15+  2-
> 
> 1 file changed, 15 insertions(+), 2 deletions(-)
> 
> commit - 32dd3676ace5111f40a82f0365663c9854d1d8ac
> commit + 8c18b9cd547490538f81e304fa40e1954ae0a5f1
> blob - eda5b7fe673517d2c260850131f5ee732501b3ef
> blob + fc176fc708d69d0f3add4b691f321b3f2971b8ea
> --- sys/net80211/ieee80211_output.c
> +++ sys/net80211/ieee80211_output.c
> @@ -1049,6 +1049,7 @@ ieee80211_add_rsn_body(u_int8_t *frm, struct ieee80211
>       const u_int8_t *oui = wpa ? MICROSOFT_OUI : IEEE80211_OUI;
>       u_int8_t *pcount;
>       u_int16_t count, rsncaps;
> +     int pmf = 0;
>  
>       /* write Version field */
>       LE_WRITE_2(frm, 1); frm += 2;
> @@ -1123,10 +1124,22 @@ ieee80211_add_rsn_body(u_int8_t *frm, struct ieee80211
>       if (wpa)
>               return frm;
>  
> +     if (ic->ic_caps & IEEE80211_C_MFP) {
> +             /*
> +              * When acting as client station, only announce PMF support
> +              * to access points which support PMF. There are access points
> +              * out there which do not support PMF and won't even initiate
> +              * the 4-way handshake with us if the PMF-capable bit is set.
> +              */
> +             if (ic->ic_opmode != IEEE80211_M_STA ||
> +                 (ni->ni_rsncaps & IEEE80211_RSNCAP_MFPC))
> +                     pmf = 1;
> +     }
> +
>       /* write RSN Capabilities field */
>       rsncaps = (ni->ni_rsncaps & (IEEE80211_RSNCAP_PTKSA_RCNT_MASK |
>           IEEE80211_RSNCAP_GTKSA_RCNT_MASK));
> -     if (ic->ic_caps & IEEE80211_C_MFP) {
> +     if (pmf) {
>               rsncaps |= IEEE80211_RSNCAP_MFPC;
>               if (ic->ic_flags & IEEE80211_F_MFPR)
>                       rsncaps |= IEEE80211_RSNCAP_MFPR;
> @@ -1143,7 +1156,7 @@ ieee80211_add_rsn_body(u_int8_t *frm, struct ieee80211
>               frm += IEEE80211_PMKID_LEN;
>       }
>  
> -     if (!(ic->ic_caps & IEEE80211_C_MFP))
> +     if (!pmf)
>               return frm;
>  
>       if ((ni->ni_flags & IEEE80211_NODE_PMKID) == 0) {
> 

Reply via email to