[Bug 264238] WiFi stops working after upgrade from 13.0 to 13.1, AR9285 (wpa_supplicant)

From: <bugzilla-noreply_at_freebsd.org>
Date: Mon, 13 Jun 2022 23:56:15 UTC
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=264238

--- Comment #67 from Cy Schubert <cy@FreeBSD.org> ---
wpa_driver_bsd_scan() calls set80211param() to set IEEE80211_IOC_ROAMING to
IEEE80211_ROAMING_MANUAL immediately after setting mediaopt to STA. This is
unconditional and if it fails it will issue a message to syslog. All this is
passed to bsd_set80211() which calls ioctl at line 120:

        if (ioctl(drv->global->sock, SIOCS80211, &ireq) < 0) {
                wpa_printf(MSG_ERROR, "ioctl[SIOCS80211, op=%u, val=%u, "
                           "arg_len=%u]: %s", op, val, arg_len,
                           strerror(errno));
                return -1;
        }

It is this error message we see in syslog, which may well be that it's failing
to set IEEE80211_ROAMING_MANUAL. A backtrace would be able to confirm this.

The interesting thing we notice is that op contains various values. I've seen
-1 and 20 so far. op is passed to bsd_set80211() via set80211var() and
set80211param(), each of which is called by numerous other callers.
strerrorr(errno) is "invalid argument."

The question remains, which caller is responsible for this? Once the user can
obtain a dump, the backtrace will tell us which calling path is used and we can
discover where opt and val are set, because both of these are set many frames
above this frame, thus will be on the stack.

The user will need to provide wpa_supplicant.core from the binary I sent her --
because I put an abort() in place of the return.

-- 
You are receiving this mail because:
You are on the CC list for the bug.