kern/133613: kernel panic in wpi(4)

Colin Percival cperciva at FreeBSD.org
Sat Apr 11 13:40:06 PDT 2009


>Number:         133613
>Category:       kern
>Synopsis:       kernel panic in wpi(4)
>Confidential:   no
>Severity:       serious
>Priority:       high
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Sat Apr 11 20:40:05 UTC 2009
>Closed-Date:
>Last-Modified:
>Originator:     Colin Percival
>Release:        FreeBSD 7.2-BETA1 amd64
>Organization:
>Environment:
FreeBSD 7.2-BETA1 amd64
>Description:

Running wpa_supplicant on a wpi(4) device, I get the following panic:
Fatal trap 12: page fault while in kernel mode
cpuid = 1; apic id = 01
fault virtual address   = 0xffff
fault code              = supervisor read data, page not present
instruction pointer     = 0x8:0xffffffff80d4e64b
stack pointer           = 0x10:0xfffffffe800c9a90
frame pointer           = 0x10:0xfffffffe800c9bc0
code segment            = base 0x0, limit 0xfffff, type 0x1b
                        = DPL 0, pres 1, long 1, def32 0, gran 1
processor eflags        = interrupt enabled, resume, IOPL = 0
current process         = 31 (wpi0 taskq)
trap number             = 12

Looking at the dump, I can see that this is occurring in
sys/dev/wpi/if_wpi.c in wpi_auth:
>How-To-Repeat:
>Fix:

The following patch is a workaround for the panic: It checks to make
sure that there is a channel set before processing the authentication.

Index: if_wpi.c
===================================================================
RCS file: /usr/cvsroot/src/sys/dev/wpi/if_wpi.c,v
retrieving revision 1.5.2.4
diff -p -u -I __FBSDID -I $FreeBSD -r1.5.2.4 if_wpi.c
--- if_wpi.c    18 Mar 2008 18:52:52 -0000      1.5.2.4
+++ if_wpi.c    11 Apr 2009 17:27:44 -0000
@@ -2402,6 +2402,10 @@ wpi_auth(struct wpi_softc *sc)
        struct wpi_node_info node;
        int error;

+        /* Can't authenticate if we don't have a channel set... */
+        if (ni->ni_chan == IEEE80211_CHAN_ANYC) {
+                return (EINVAL);
+        }

        /* update adapter's configuration */
        sc->config.associd = 0;
>Release-Note:
>Audit-Trail:
>Unformatted:
 >>>	if (IEEE80211_IS_CHAN_2GHZ(ni->ni_chan)) {
 		sc->config.flags |= htole32(WPI_CONFIG_AUTO |
 		    WPI_CONFIG_24GHZ);
 	}
 because at this point ni->ni_chan is set to IEEE80211_CHAN_ANYC.
 
 My best guess at what's happening is the following:
 1. wpa_supplicant finds the right channel
 2. wpa_supplicant tells the kernel to authenticate to that channel
 3. the wpi driver queues the authenticate command
 4. wpa_supplicant goes back to scanning
 5. the wpi driver dequeues the command and tries to perform the
 requested authentication, but panics because it's not bound to a
 channel any more.
 


More information about the freebsd-bugs mailing list