Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 25 Jun 2011 13:19:13 +0100
From:      "Steven Hartland" <killing@multiplay.co.uk>
To:        "Bjoern A. Zeeb" <bz@FreeBSD.org>
Cc:        freebsd-net@freebsd.org
Subject:   Re: IPv4 socket bind using IPv6 socket on openjdk6 breaks udp send
Message-ID:  <05C71CCF2FEF492D9571F57261FA884F@multiplay.co.uk>
References:  <9585F512F239475B8145C3D344F6EC62@multiplay.co.uk> <75860ED5-B60D-4EF2-90B6-F313BEFA36F7@FreeBSD.org>

next in thread | previous in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format.

------=_NextPart_000_0057_01CC333A.7A3B2D00
Content-Type: text/plain; format=flowed; charset="iso-8859-1";
	reply-type=original
Content-Transfer-Encoding: 7bit


----- Original Message ----- 
From: "Bjoern A. Zeeb" <bz@FreeBSD.org>
To: "Steven Hartland" <killing@multiplay.co.uk>
Cc: <freebsd-net@freebsd.org>
Sent: Saturday, June 25, 2011 10:27 AM
Subject: Re: IPv4 socket bind using IPv6 socket on openjdk6 breaks udp send


On Jun 24, 2011, at 9:11 PM, Steven Hartland wrote:

Hi,

> We're trying to get our machines IPv6 enabled but in doing so this
> seems to break java apps using openjdk6 for UDP sends.
> 
> One of the clues I can give you is:
> http://diario.behrens.de/2008/10/12/java_and_ipv6_on_bsd.html
>
> it's old(er) and I have lately been tolded that openjdk has a problem.
Yer read that but it seems like the jdk7 patch is already in which should
fix it:-
http://www.freebsd.org/cgi/cvsweb.cgi/ports/java/openjdk6/files/patch-set


> 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)
> ..
> recvfrom(20,0x7ffffeaeb580,1460,0x0,0x7ffffeaed580,0x7ffffeaed5ac) ERR#60 'Operation timed out'
> ..
> sendto(20,"\M^?\M^?\M^?\M^?I\aMultiplay :: "...,82,0x0,{ AF_INET6 [3800::10:0:0:0]:20736 },0x1c) ERR#22 'Invalid argument'
> 
> So how much is really between these ...?   If you want, can you send
> me a full output in private email?

Just a load of gettimeofday, clock_gettime, _umtx_op and mprotect calls nothing
of interest.

> Also which version of FreeBSD is this?
8.2-RELEASE

> sockstat shows it binding correctly
> root     java       894   21 tcp4   85.236.109.212:25675  *:*
> 
> That's unfortunately unreleated.

Yer 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.

> The following PR seems relevant but also seems to indicate it was
> fixed back in 2006
> http://www.freebsd.org/cgi/query-pr.cgi?pr=92620

> This doesn't seen to be related to the above as 3800::10:0:0:0 is
> not a v4-mapped-v6 address.  Now there could be the problem really.
> Do you know which address the code above was trying to talk with?

I'm wondering if thats a decode error by truss, as it doesn't seem
to corrispond to anything on the machine and is the same no matter
what ip the socket is bound to. ifconfig output in my last reply if
that helps.

> Also do you have a very simple test program I could try to run if
> I compile openjdk6?

The attached java file demonstrates the behviour.
java Main <ipv4 address>

Then just send any udp packet to <ipv4 address>:25675 it should
respond with pong but on a dual stack machine it just throws as
exception:-
WARNING: IO: Invalid argument
java.io.IOException: Invalid argument
        at java.net.PlainDatagramSocketImpl.send(Native Method)
        at java.net.DatagramSocket.send(DatagramSocket.java:629)
        at Main.main(Main.java:34)

    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.
------=_NextPart_000_0057_01CC333A.7A3B2D00
Content-Type: application/octet-stream;
	name="Main.java"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment;
	filename="Main.java"

import java.io.IOException;=0A=
import java.net.InetAddress;=0A=
import java.net.DatagramSocket;=0A=
import java.net.SocketException;=0A=
import java.net.DatagramPacket;=0A=
import java.util.logging.Logger;=0A=
import java.util.logging.Level;=0A=
=0A=
public class Main {=0A=
=0A=
    public static void main(String[] args) throws java.io.IOException {=0A=
        if (1 !=3D args.length) {=0A=
            System.err.println( "Missing bind IP" );=0A=
            System.exit(1);=0A=
        }=0A=
        int port =3D 25675;=0A=
        InetAddress ipv4Address =3D InetAddress.getByName(args[0]);=0A=
        DatagramSocket socket =3D new DatagramSocket(port, ipv4Address);=0A=
        Logger log =3D Logger.getLogger("MAIN");=0A=
        byte[] buffer =3D new byte[1460];=0A=
=0A=
        log.info( "Running on: " + ipv4Address + ":" + port);=0A=
        DatagramPacket request =3D new DatagramPacket( buffer, =
buffer.length );=0A=
        try=0A=
        {=0A=
            while (true)=0A=
            {=0A=
                try=0A=
                {=0A=
                    socket.receive(request);=0A=
                    log.info("Recieved " + request.getLength() + " bytes =
from: " + request.getSocketAddress());=0A=
                    String response =3D new String("pong");=0A=
                    byte[] bytes =3D response.getBytes();=0A=
                    socket.send(new DatagramPacket(bytes, bytes.length, =
request.getSocketAddress()));=0A=
                    log.info("Sent pong");=0A=
                }=0A=
                catch (SocketException e)=0A=
                {=0A=
                    log.log(Level.WARNING, "Socket: " + e.getMessage(), =
e);=0A=
                }=0A=
                catch (IOException e )=0A=
                {=0A=
                    log.log(Level.WARNING, "IO: " + e.getMessage(), e);=0A=
                }=0A=
            }=0A=
        }=0A=
        finally=0A=
        {=0A=
            if (null !=3D socket)=0A=
            {=0A=
                socket.close();=0A=
                socket =3D null;=0A=
            }=0A=
        }=0A=
    }=0A=
}
------=_NextPart_000_0057_01CC333A.7A3B2D00--




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?05C71CCF2FEF492D9571F57261FA884F>