Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src-draft/trunk]: src/sys/dev/usb Fix the old style beacon handling to avoid...



details:   https://anonhg.NetBSD.org/src-all/rev/e54a37becf1d
branches:  trunk
changeset: 377971:e54a37becf1d
user:      Martin Husemann <martin%NetBSD.org@localhost>
date:      Sun Feb 20 15:39:53 2022 +0100

description:
Fix the old style beacon handling to avoid crashes at least.
Will be replaced with something less expensive soon.

diffstat:

 sys/dev/usb/if_urtwn.c |  30 ++++++++++++++----------------
 1 files changed, 14 insertions(+), 16 deletions(-)

diffs (53 lines):

diff -r 95d74b69ba04 -r e54a37becf1d sys/dev/usb/if_urtwn.c
--- a/sys/dev/usb/if_urtwn.c    Sun Feb 20 11:17:30 2022 +0100
+++ b/sys/dev/usb/if_urtwn.c    Sun Feb 20 15:39:53 2022 +0100
@@ -669,35 +669,33 @@ urtwn_task(void *arg)
 {
        struct urtwn_softc *sc = arg;
        struct ieee80211com *ic = usbwifi_ic(&sc->sc_uw);
-       struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
-/* XXX VAP is wrong */
+       struct ieee80211vap *vap;
        struct urtwn_host_cmd_ring *ring = &sc->cmdq;
        struct urtwn_host_cmd *cmd;
        int s;
 
        URTWNHIST_FUNC(); URTWNHIST_CALLED();
 
-       if (vap->iv_state == IEEE80211_S_RUN && 
-           (ic->ic_opmode == IEEE80211_M_HOSTAP ||
-           ic->ic_opmode == IEEE80211_M_IBSS)) {
+       usbwifi_lock_ic(&sc->sc_uw);
+       /* handling beacon frames here is way too expensive! */
+       TAILQ_FOREACH(vap, &ic->ic_vaps, iv_next) {
+               if (vap->iv_state != IEEE80211_S_RUN ||
+                   (vap->iv_opmode != IEEE80211_M_HOSTAP &&
+                   vap->iv_opmode != IEEE80211_M_IBSS &&
+                   vap->iv_opmode != IEEE80211_M_MBSS))
+                       continue;
+
+               /* Send a beacon frame. */
                struct mbuf *m = ieee80211_beacon_alloc(vap->iv_bss);
                if (m == NULL) {
                        aprint_error_dev(sc->sc_uw.uw_dev,
                            "could not allocate beacon");
                }
-
-               /*
-                * Send a beacon frame.
-                * XXX - old code used to bypass all queueing - is that
-                * needed here?
-                * XXX - can we get rid of the whole urtwn_task?
-                */
                if (ic->ic_raw_xmit(vap->iv_bss, m, NULL) != 0)
-                       aprint_error_dev(sc->sc_uw.uw_dev, "could not send beacon\n");
-
-               /* beacon is no longer needed */
-               m_freem(m);
+                       aprint_error_dev(sc->sc_uw.uw_dev,
+                           "could not send beacon\n");
        }
+       usbwifi_unlock_ic(&sc->sc_uw);
 
        /* Process host commands. */
        s = splusb();



Home | Main Index | Thread Index | Old Index