From owner-freebsd-hackers@FreeBSD.ORG Sat Jun 25 11:40:37 2011 Return-Path: Delivered-To: freebsd-hackers@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 4B9F4106564A; Sat, 25 Jun 2011 11:40:37 +0000 (UTC) (envelope-from prvs=1157d11ea9=killing@multiplay.co.uk) Received: from mail1.multiplay.co.uk (mail1.multiplay.co.uk [85.236.96.23]) by mx1.freebsd.org (Postfix) with ESMTP id 729F78FC0A; Sat, 25 Jun 2011 11:40:36 +0000 (UTC) X-MDAV-Processed: mail1.multiplay.co.uk, Sat, 25 Jun 2011 12:28:28 +0100 X-Spam-Processed: mail1.multiplay.co.uk, Sat, 25 Jun 2011 12:28:28 +0100 X-Spam-Checker-Version: SpamAssassin 3.2.5 (2008-06-10) on mail1.multiplay.co.uk X-Spam-Level: X-Spam-Status: No, score=-5.0 required=6.0 tests=USER_IN_WHITELIST shortcircuit=ham autolearn=disabled version=3.2.5 Received: from r2d2 ([188.220.16.49]) by mail1.multiplay.co.uk (mail1.multiplay.co.uk [85.236.96.23]) (MDaemon PRO v10.0.4) with ESMTP id md50013864816.msg; Sat, 25 Jun 2011 12:28:26 +0100 X-MDRemoteIP: 188.220.16.49 X-Return-Path: prvs=1157d11ea9=killing@multiplay.co.uk X-Envelope-From: killing@multiplay.co.uk Message-ID: <512CB9DD5802403BA3ACC48FE3AE63F5@multiplay.co.uk> From: "Steven Hartland" To: "Matthias Andree" References: <9585F512F239475B8145C3D344F6EC62@multiplay.co.uk> <4E051576.7090505@gmx.de> Date: Sat, 25 Jun 2011 12:28:44 +0100 MIME-Version: 1.0 Content-Type: text/plain; format=flowed; charset="iso-8859-1"; reply-type=original Content-Transfer-Encoding: 7bit X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2900.5931 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.6090 Cc: freebsd-net@freebsd.org, freebsd-java@freebsd.org, freebsd-hackers@freebsd.org Subject: Re: IPv4 socket bind using IPv6 socket on openjdk6 breaks udp send X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 25 Jun 2011 11:40:37 -0000 ----- Original Message ----- From: "Matthias Andree" I'm adding back in -java as based on you comments it may well be something in the jdk passing invalid values down to the kernel syscall. >> The socket bind works fine and the packets sent to the server arrive >> and are processed by the app but when it tries to reply using >> send the result is:- >> java.io.IOException: Invalid argument >> at java.net.PlainDatagramSocketImpl.send(Native Method) >> at java.net.DatagramSocket.send(DatagramSocket.java:629) >> >> using truss we see the following:- >> socket(PF_INET6,SOCK_DGRAM,0) = 20 (0x14) >> setsockopt(0x14,0x29,0x1b,0x7ffffedf0318,0x4,0x0) = 0 (0x0) >> setsockopt(0x14,0xffff,0x20,0x7ffffedf031c,0x4,0x0) = 0 (0x0) >> bind(20,{ AF_INET6 [3800::10:0:0:0]:20736 },28) = 0 (0x0) >> .. >> sendto(20,"\M^?\M^?\M^?\M^?I\aMultiplay :: "...,82,0x0,{ AF_INET6 >> [3800::10:0:0:0]:20736 },0x1c) ERR#22 'Invalid argument' > > You're trying to send to your own address, but you're likely not using > the loopback interface for that. Is that permitted by your firewall > configuration and routing? No I'm not its replying to the sender. In the java code we have:- socket.send( new DatagramPacket( data, data.length, src.getSocketAddress() ) ); Where src is the src packet. This works fine on IPv4 only machines and when the jdk is told to use only IPv4 stack. So its not a problem with the java code itself but could well be an issue with the > >> sockstat shows it binding correctly >> root java 894 21 tcp4 85.236.109.212:25675 *:* > > This is unrelated, as it has fd #21 not #20 as in the socket/bind/sendto > calls. You've quoted the wrong line from sockstat output. Oops sorry cut and paste error (wrong line) heres the correct line. root java 894 20 udp4 85.236.109.212:25675 *:* 21 is the tcp port created in the same manor (ipv6 socket) which works fine. > >> Note: net.inet6.ip6.v6only was set to the default 1 but changing >> it to 0 has no effect on the issue. > > You aren't using IPv4 mapped addresses, and you haven't stated whether > you're using wildcard listeners. Only in that case would it matter. I'm not, its a bound port, as shown above now I have the correct line ;-) > inet6(4) reads: > > IPV6CTL_V6ONLY (ip6.v6only) Boolean: enable/disable the prohib- > ited use of IPv4 mapped address on AF_INET6 sock- > ets. Defaults to on. The jvm automatically sets this on all sockets for compatibility for this exact reason. I'm not rulling out an issue with the IPv6 -> v4 routing in the kernel though. > Are you sure that's what you seeing? It's not a match for what you give > above, but anyways it's an implementation artifact because the tcp code > for v4 and v6 used to be shared and the udp code separate. Thats not how the jdk works, its ment to be 100% transparent but isn't. See the following for some interesting details:- http://diario.beerensalat.info/2008/10/12/java_and_ipv6_on_bsd.html > It is best to set up one IPv4 and one IPv6 listening socket. I don't believe there is any way to do this in java it either uses the IPv4 stack only or the IPv6 stack only hence relies on the kernel routing IPv4 packets through the IPv6 stack. Thats the reason the jdk explicitly enables this for all the ports it creates, which was added as a back port of the jdk7 fixes which can be seen here:- http://www.freebsd.org/cgi/cvsweb.cgi/ports/java/openjdk6/files/patch-set > Check the URL above, perhaps that helps your understanding a bit. I > presume 3800::10:0:0:0 is your server? Not that I'm aware of, here's the output from ifconfig if anyone can tell me different, as I'm new to IPv6 and don't follow how its mapped yet. ifconfig igb0: flags=8843 metric 0 mtu 1500 options=1bb ether 00:25:90:2c:3c:b0 inet 85.236.109.212 netmask 0xffffff00 broadcast 85.236.109.255 inet6 fe80::225:90ff:fe2c:3cb0%igb0 prefixlen 64 scopeid 0x1 inet6 2001:4db0:20:2::1337 prefixlen 64 nd6 options=3 media: Ethernet autoselect (1000baseSX ) status: active igb1: flags=8802 metric 0 mtu 1500 options=1bb ether 00:25:90:2c:3c:b1 media: Ethernet autoselect (1000baseSX ) status: active lo0: flags=8049 metric 0 mtu 16384 options=3 inet 127.0.0.1 netmask 0xff000000 inet6 ::1 prefixlen 128 inet6 fe80::1%lo0 prefixlen 64 scopeid 0x3 nd6 options=3 This is currently running on 8.2-RELEASE with openjdk6-b22_5 Regards Steve ================================================ This e.mail is private and confidential between Multiplay (UK) Ltd. and the person or entity to whom it is addressed. In the event of misdirection, the recipient is prohibited from using, copying, printing or otherwise disseminating it or any information contained in it. In the event of misdirection, illegible or incomplete transmission please telephone +44 845 868 1337 or return the E.mail to postmaster@multiplay.co.uk.