https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=212005

            Bug ID: 212005
           Summary: [panic] [net80211] age -4
           Product: Base System
           Version: CURRENT
          Hardware: Any
                OS: Any
            Status: New
          Severity: Affects Only Me
          Priority: ---
         Component: wireless
          Assignee: freebsd-wireless@FreeBSD.org
          Reporter: ma...@freebsd.org

I use if_run(4) in hostap mode. The system using it has now panicked twice in
ieee80211_pwrsave() at the age >= 0 assertion. Both times it happened after I
woke up a Windows laptop that automatically associates to the AP:

#0  __curthread () at ./machine/pcpu.h:221
#1  doadump (textdump=1) at
/home/mark/src/freebsd-dev/sys/kern/kern_shutdown.c:298
#2  0xffffffff806c2545 in kern_reboot (howto=<optimized out>) at
/home/mark/src/freebsd-dev/sys/kern/kern_shutdown.c:366
#3  0xffffffff806c2b1b in vpanic (fmt=<optimized out>, ap=0xfffffe0469185600)
    at /home/mark/src/freebsd-dev/sys/kern/kern_shutdown.c:759
#4  0xffffffff806c2956 in kassert_panic (fmt=0xffffffff80b6c114 "age %d")
    at /home/mark/src/freebsd-dev/sys/kern/kern_shutdown.c:649
#5  0xffffffff808109cb in ieee80211_pwrsave (ni=0xfffffe0026178000,
m=0xfffff802fb50bb00)
    at /home/mark/src/freebsd-dev/sys/net80211/ieee80211_power.c:392
#6  0xffffffff8080a0fb in ieee80211_vap_pkt_send_dest (vap=0xfffff80027d65000,
m=0xfffff802fb50bb00, ni=0xfffffe0026178000)
    at /home/mark/src/freebsd-dev/sys/net80211/ieee80211_output.c:136
#7  0xffffffff8080b5c4 in ieee80211_start_pkt (vap=0xfffff80027d65000,
m=0xfffff802fb50bb00)
    at /home/mark/src/freebsd-dev/sys/net80211/ieee80211_output.c:435
#8  ieee80211_vap_transmit (ifp=<optimized out>, m=<optimized out>)
    at /home/mark/src/freebsd-dev/sys/net80211/ieee80211_output.c:495
#9  0xffffffff807bc0ff in ether_output_frame (ifp=<optimized out>,
m=<unavailable>)
    at /home/mark/src/freebsd-dev/sys/net/if_ethersubr.c:457
#10 ether_output (ifp=<optimized out>, m=<optimized out>,
dst=0xfffffe0469185810, ro=<optimized out>)
    at /home/mark/src/freebsd-dev/sys/net/if_ethersubr.c:429
#11 0xffffffff807a5692 in bpfwrite (dev=<optimized out>, uio=<optimized out>,
ioflag=<optimized out>)
    at /home/mark/src/freebsd-dev/sys/net/bpf.c:1173
#12 0xffffffff80598157 in devfs_write_f (fp=0xfffff8001999bb90,
uio=0xfffffe0469185970, cred=0xfffff8002709c500, flags=0, 
    td=<optimized out>) at
/home/mark/src/freebsd-dev/sys/fs/devfs/devfs_vnops.c:1773
#13 0xffffffff80727414 in fo_write (fp=<optimized out>, uio=0xfffffe0469185970,
active_cred=<unavailable>, flags=0, 
    td=<optimized out>) at /home/mark/src/freebsd-dev/sys/sys/file.h:311
#14 dofilewrite (td=0xfffff8002709c500, fd=4, fp=0xfffff8001999bb90,
auio=0xfffffe0469185970, offset=<optimized out>, 
    flags=0) at /home/mark/src/freebsd-dev/sys/kern/sys_generic.c:593
#15 0xffffffff807270b8 in kern_writev (td=0xfffff8002709c500, fd=4,
auio=0xfffffe0469185970)
    at /home/mark/src/freebsd-dev/sys/kern/sys_generic.c:508
#16 0xffffffff80727044 in sys_write (td=<unavailable>, uap=<optimized out>)
    at /home/mark/src/freebsd-dev/sys/kern/sys_generic.c:421
#17 0xffffffff809fabab in syscallenter (td=0xfffff8002709c500, sa=<optimized
out>)
    at /home/mark/src/freebsd-dev/sys/amd64/amd64/../../kern/subr_syscall.c:135
#18 amd64_syscall (td=0xfffff8002709c500, traced=0) at
/home/mark/src/freebsd-dev/sys/amd64/amd64/trap.c:942

It looks like there were already two packets in the low-priority aging queue:

(kgdb) frame 5
#5  0xffffffff808109cb in ieee80211_pwrsave (ni=0xfffffe0026178000,
m=0xfffff802fb50bb00)
    at /home/mark/src/freebsd-dev/sys/net80211/ieee80211_power.c:392
warning: Source file is more recent than executable.
392             KASSERT(age >= 0, ("age %d", age));
(kgdb) p ni->ni_psq->psq_head[0]
$1 = {head = 0x0, tail = 0x0, len = 0}
(kgdb) p ni->ni_psq->psq_head[1]
$2 = {head = 0xfffff8027be5f400, tail = 0xfffff80027b7de00, len = 2}

age was 0:

(kgdb) p ni->ni_intval
$3 = 1
(kgdb) p ni->ni_ic->ic_bintval 
$4 = 100

and the first packet in the queue has age 4:

(kgdb) p ni->ni_psq->psq_head[1].head->m_pkthdr.PH_per.thirtytwo[1]
$5 = 4

... so this code sets age to -4, tripping the assertion:

388         } else {                          
389                 qhead->tail->m_nextpkt = m;
390                 age -= M_AGE_GET(qhead->head);                  
391         }

I can provide more info from the core if that's helpful.

-- 
You are receiving this mail because:
You are the assignee for the bug.
_______________________________________________
freebsd-wireless@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/freebsd-wireless
To unsubscribe, send any mail to "freebsd-wireless-unsubscr...@freebsd.org"

Reply via email to