Date: Sun, 21 May 2000 23:51:52 -0700 (PDT) From: jgibbons@n2.net To: FreeBSD-gnats-submit@freebsd.org Subject: kern/18741: [PATCH] Multicast loopback interface not receiving packets; checksum errors Message-ID: <200005220651.XAA57598@nike.relcast.com>
next in thread | raw e-mail | index | archive | help
>Number: 18741
>Category: kern
>Synopsis: [PATCH] Multicast loopback interface not receiving packets; checksum errors
>Confidential: no
>Severity: serious
>Priority: medium
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Sun May 21 23:50:01 PDT 2000
>Closed-Date:
>Last-Modified:
>Originator: Jeff Gibbons
>Release: FreeBSD 4.0-STABLE i386
>Organization:
>Environment:
FreeBSD nike.relcast.com 4.0-STABLE FreeBSD 4.0-STABLE #2: Sat May 20 20:36:16 PDT 2000 i386
2 Intel EtherExpress Pro 10/100B Ethernet boards
>Description:
The loopback IP interface does not receive multicast packets
which are sent by the local machine; instead each packet
is counted as a checksum error. This problem began sometime
between about 01 April, 2000 and 20 May, 2000; the problem
does not occur in 4-STABLE prior to 01 April, 2000. I
believe the problem is related to the new "delayed checksum"
code which has been MFCed into the IP and UDP network
routines (ip_input.c, ip_output.c, udp_usrreq.c, etc.).
This problem also probably occurs on current, but I have
not tested that, nor have I tested the fix on any version
of FreeBSD except 4-STABLE.
>How-To-Repeat:
Join a multicast address on an fxp Ethernet interface, then
send packets through that interface to that multicast
address. Your machine (the machine which is sending the
packets) will not receive those packets. Use "netstat -p udp"
before and after sending the packets, and you will see the
number of packets "with bad checksum" increasing for every
packet you send.
>Fix:
The following code, when added to src/sys/netinet/ip_output.c,
cures the problem. It is in the ip_mloopback() routine,
which calls if_simloop() to put a packet onto an input
queue so that it will later be retrieved and processed by
ip_input(). ip_mloopback() is only called when sending a
multicast packet on an interface which belongs to the
destination multicast group. The added code sets flags so
that the udp_input() routine (which eventually receives
and handles the packet) will not attempt to verify the UDP
checksum field.
Note that this may not be the best fix -- someone who
understands the delayed checksum processing should review
this. In particular, I do not know if the added "if"
statement is necessary or desirable; it may be better just
to _always_ set the flags here, since it should never be
necessary to check the checksum of a looped-back packet.
Index: /usr/src/sys/netinet/ip_output.c
===================================================================
RCS file: /home/ncvs/src/sys/netinet/ip_output.c,v
retrieving revision 1.99.2.1
diff -u -r1.99.2.1 ip_output.c
--- /usr/src/sys/netinet/ip_output.c 2000/05/05 13:36:52 1.99.2.1
+++ /usr/src/sys/netinet/ip_output.c 2000/05/22 04:30:46
@@ -1869,6 +1869,12 @@
copym->m_pkthdr.rcvif = ifp;
ip_input(copym);
#else
+ /* tell udp_input() not to check the udp checksum */
+ if (copym->m_pkthdr.csum_flags & CSUM_DELAY_DATA) {
+ copym->m_pkthdr.csum_flags |=
+ CSUM_DATA_VALID | CSUM_PSEUDO_HDR;
+ copym->m_pkthdr.csum_data = 0xffff;
+ }
if_simloop(ifp, copym, (struct sockaddr *)dst, 0);
#endif
}
>Release-Note:
>Audit-Trail:
>Unformatted:
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200005220651.XAA57598>
