Date: Sun, 14 Jul 2002 18:39:02 +0200 (CEST) From: Jean-Luc Richier <Jean-Luc.Richier@imag.fr> To: FreeBSD-gnats-submit@FreeBSD.org Cc: Jean-Luc Richier <Jean-Luc.Richier@imag.fr> Subject: kern/40558: UDP6 sockets do not receive responses of sendto to IPv4mapped address Message-ID: <200207141639.g6EGd2Jv092933@luna.imag.fr>
index | next in thread | raw e-mail
>Number: 40558
>Category: kern
>Synopsis: UDP6 sockets do not receive responses of sendto to IPv4mapped address
>Confidential: no
>Severity: serious
>Priority: high
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Sun Jul 14 09:50:01 PDT 2002
>Closed-Date:
>Last-Modified:
>Originator: Jean-Luc Richier
>Release: FreeBSD 4.6-RELEASE i386
>Organization:
LSR-IMAG, Grenoble, France
>Environment:
System: FreeBSD luna.imag.fr 4.6-RELEASE FreeBSD 4.6-RELEASE #6: Wed Jun 12 18:55:37 GMT 2002 richier@luna.imag.fr:/usr/src/sys/compile/VLAN i386
also FreeBSD current (June, 24 2002)
and KAME FreeBSD (kame-20020708-freebsd46-snap.tgz)
Description:
An UDP PF_INET6 socket which is implicitely binded using sento to
an IPv6 IPv4mapped address (::FFFF:x.y.z.t) will not receive the
IPv4 packets sent in response
How-To-Repeat:
+ On a machine with IPv4 address x.y.z.t, validate the udp4 echo service
in /etc/inetd.conf
+ Write and execute the following test program:
- s = socket(PF_INET6, SOCK_DGRAM, 0);
- getaddrinfo("0:ffff:x.y.z.t","echo", &hints, &res);
- sento(s, "data", 4, 0, res->ai_addr, res->ai_addrlen);
- recvfrom(s, buf, sizeof buf, 0, (struct sockaddr *)&from, &fromlen);
The recvfrom will not receives any packet
Fix:
The bug is the udp sendto code. INET6 sendto udp code does not set
the INP_IPV4 flag on the inpcb of the socket. Therefore the received
IPv4 packets are not matched against this pcb.
To correct apply the following patch:
--- /sys/netinet6/udp6_usrreq.c.DIST Sun Apr 28 07:40:27 2002
+++ /sys/netinet6/udp6_usrreq.c Wed May 29 19:23:23 2002
@@ -713,6 +713,7 @@
if (sin6)
in6_sin6_2_sin_in_sock(addr);
+ inp->inp_vflag |= INP_IPV4;
pru = inetsw[ip_protox[IPPROTO_UDP]].pr_usrreqs;
error = ((*pru->pru_send)(so, flags, m, addr, control,
p));
>Description:
>How-To-Repeat:
>Fix:
>Release-Note:
>Audit-Trail:
>Unformatted:
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message
help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200207141639.g6EGd2Jv092933>
