NetBSD-Bugs archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
kern/55779: NetBSD multicast router sends multicast packet with invalid UDP checksum
>Number: 55779
>Category: kern
>Synopsis: NetBSD multicast router sends multicast packet with invalid UDP checksum
>Confidential: no
>Severity: serious
>Priority: medium
>Responsible: kern-bug-people
>State: open
>Class: sw-bug
>Submitter-Id: net
>Arrival-Date: Mon Nov 02 16:40:00 +0000 2020
>Originator: Frank Kardel
>Release: NetBSD 9.0_STABLE/-current
>Organization:
>Environment:
System: NetBSD sunaj 9.0_STABLE NetBSD 9.0_STABLE (ROUTER) #2: Tue Oct 20 09:55:21 UTC 2020 kardel@sunaj:/src/NetBSD/n9/src/obj.amd64/sys/arch/amd64/compile/ROUTER amd64
Architecture: x86_64
Machine: amd64
>Description:
Configure a kernel to support MROUTING,PIM.
Use a routing suite like FRRouting (FRRouting.org - see wip/frr)
UDP checksumming must be enabled
Start the routing suite just for RIP and observe RIP packets with
invalid checksums being sent.
Analysis:
udp_output() correctly sets up m->m_pkthdr.csum_flags = M_CSUM_UDPv4.
in the ip_output the path following MROUTING section is reached:
if (ip_mrouter && (flags & IP_FORWARDING) == 0) {
if (ip_mforward(m, ifp) != 0) {
m_freem(m);
goto done;
}
}
at this point m->m_pkthdr.csum_flags == M_CSUM_UDPv4. after the
call to ip_mforward m->m_pkthdr.csum_flags is zero.
this is caused by commit 1.112->1.113:
-------
revision 1.113
date: 2008-05-08 08:00:55 +0000; author: taca; state: Exp; lines: +7 -2;
Make sure to clear csum_flags before forward the packet.
This change should be fix DIAGNOSTIC kernel's panic when the machine act
as multicast router.
Advised from tls@ and approved by thorpej@.
-------
The zeroing of m->m_pkthdr.csum_flags directly violates the
guarantee from the boilerplate comment:
* The packet is returned unscathed to the caller, unless it is
* erroneous, in which case a non-zero return value tells the caller to
* discard it.
this is problematic as we lose the M_CSUM_UDPv4 information which
in turn causes *NO UDP checksums* for multicast packets to be
calculated.
>How-To-Repeat:
see Description:
>Fix:
Crude fix 1:
restore m->m_pkthdr.csum_flags after ip_mforward call.
Crude fix 2:
wrap ip_mforward with flag restoration.
Alternate fixes:
Is the diagnostic issue gone after 12 years?
yes - remove the zeroing
no - examine the actual root cause
>Unformatted:
Home |
Main Index |
Thread Index |
Old Index