tech-net archive

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

Re: checking m->m_pkthdr.csum_flags in ip_output()



On Sun, May 04, 2008 at 12:33:05PM +0900, Takahiro Kambe wrote:
> Hi,
> 
> In message <20080415.203216.41648300.taca%back-street.net@localhost>
>       on Tue, 15 Apr 2008 20:32:16 +0900 (JST),
>       Takahiro Kambe <taca%back-street.net@localhost> wrote:
> > Today, NetBSD 4.0_STABLE machine paniced in ip_output() when
> > forwarding IPv4 multicast packet.  The packet was short (36 octets)
> > UDP/IP pakcet.
> ...
> > The kernel has DIAGNOSTIC option enabled and corresponding code
> > fragments in ip_output().
> > 
> > #ifdef      DIAGNOSTIC
> >     if ((m->m_flags & M_PKTHDR) == 0)
> >             panic("ip_output: no HDR");
> > 
> >     if ((m->m_pkthdr.csum_flags & (M_CSUM_TCPv6|M_CSUM_UDPv6)) != 0) {
> >             panic("ip_output: IPv6 checksum offload flags: %d",
> >                 m->m_pkthdr.csum_flags);
> >     }
> > 
> >     if ((m->m_pkthdr.csum_flags & (M_CSUM_TCPv4|M_CSUM_UDPv4)) ==
> >         (M_CSUM_TCPv4|M_CSUM_UDPv4)) {
> >             panic("ip_output: conflicting checksum offload flags: %d",
> >                 m->m_pkthdr.csum_flags);
> >     }
> > #endif
> > 
> > It seems that this diagnostic code checking M_CSUM_TCPv4 and
> > M_CSUM_UDPv4 are exclusive one.
> I confirmed that bge(4) sets both M_CSUM_TCPv4 and M_CSUM_UDPv4 to
> m->m_pkthdr.csum_flags with usual unicast IP packets.
> 
> I don't know it is bug of bge(4) or above DIAGNOSTIC is wrong or
> obsolete.

Don't know whether relevant, but a 4.99.60/i386 box with bge gave:

uvm_fault(0xcdfae574, 0, 1) -> 0xe
kernel: supervisor trap page fault, code=0
Stopped in pid 22172.1 (dhcpd) at       0xc03a6f25:     movl    0x14(%eax),%eax
db{1}> bt/l
m_length(0,0,cd985abc,c0377c4f,5) at 0xc03a6f25
bpf_mtap(c2d822c0,0,cd985aec,c03a8f5d,cd985a05) at netbsd:bpf_mtap+0x17
bge_start(c2da7004,178,9000003,3,0) at netbsd:bge_start+0x10c
ifq_enqueue(c2da7004,c3111300,c2da7004,2,cdfae574) at netbsd:ifq_enqueue+0x13f
ether_output(c2da7004,c3111300,c06077a0,0,c06077a0) at netbsd:ether_output+0x71e
bpf_write(cdc82300,cdc82300,cd985c60,d5bf99c0,1) at netbsd:bpf_write+0x126
do_filewritev(7,bfbfc668,3,cdc82300,1) at netbsd:do_filewritev+0x270
sys_writev(cdfac900,cd985d04,cd985cfc,cd985d10,c03d0d79) at 
netbsd:sys_writev+0x3f
syscall(cd985d48,b3,ab,bfbf001f,bfbf001f) at netbsd:syscall+0x141

yesterday...

Cheers,

Patrick


Home | Main Index | Thread Index | Old Index