Hi Oliver, On Friday 01 February 2013 03:03:19 am Oliver Lehmann wrote: > Hi, > > I patched openjdk7. Attached you'll find the patch. > It is now possible (at least for me) to use MulticastSocket. > I know the patch is not ready for checkin, but I guess you'll get > the idea and know how to do it properly as I don't know the correct > defines to check. (The first two chunks in the patch are probably > already in HG as the patch is based on u6 code)
Right those parts are already there. > > Basically I just replaced the MACOSX check with __FreeBSD__ and > it works now: The last chunk of the diff is not needed for this problem and is incomplete. It is for the problem described here: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7144274 http://hg.openjdk.java.net/bsd-port/bsd-port/jdk/rev/99cc5c9ef200 I have not yet checked to see if we need this fix in addition to the problem you noted. However, if we do need it then we to change MACOSX to _ALLBSD_SOURCE in both PlainDatagramSocketImpl.c mcast_join_leave() and net_util_md.c setDefaultScopeID() I am attaching patches for both openjdk6 and openjdk7 that should fix the problem you initially reported and will apply to FreeBSD's ports cleanly. Thanks for reporting the problem and tracking the correction down. -Kurt > root@bigoli test> /usr/local/bootstrap-openjdk/bin/javac test.java > root@bigoli test> /usr/local/bootstrap-openjdk/bin/jar -cf test.jar Main.class > root@bigoli test> /usr/local/openjdk7/bin/java -classpath .:test.jar Main > network interface: name:null > interface: /10.0.1.1 > > Java is still not able to detect my network interface name, but this > was also not working in Diablo JRE and I don't need it. At least I'm > now getting the correct Multicast Address back (10.0.1.1 and not 0.0.0.0) > > Please consider fixing this upstream. > > PS: Sorry for top-post but I'm CCing FreeBSDs java@ list > > > Kurt Miller <k...@intricatesoftware.com> wrote: > > > Hi Oliver, > > > > On 01/31/13 13:26, Oliver Lehmann wrote: > >> Hi, > >> > >> I encountered a bug while migrating from FreeBSDs old "Diablo jre" > >> to openjdk-jre version 6. > >> > >> I'm running a software using multicast communication and it fails > >> on FreeBSD when using openjdk6. > >> > >> example code: > >> > >> import java.io.IOException; > >> import java.net.InetAddress; > >> import java.net.MulticastSocket; > >> import java.net.SocketException; > >> import java.net.UnknownHostException; > >> > >> > >> class Main { > >> static String hostname = new String("10.0.1.1"); > >> > >> public static void main(String args[]) throws > >> SocketException, UnknownHostException, IOException{ > >> InetAddress ia = InetAddress.getByName(hostname); > >> MulticastSocket ssdpSocket = new MulticastSocket(); > >> > >> ssdpSocket.setInterface(ia); > >> > >> System.out.println("network interface: " + > >> ssdpSocket.getNetworkInterface()); > >> System.out.println("interface: " + ssdpSocket.getInterface()); > >> } > >> } > >> > >> > >> The output of the old "Diablo JRE" is: > >> > >> network interface: name:null index: -1 addresses: > >> /10.0.1.1; > >> > >> interface: /10.0.1.1 > >> > >> > >> The output of openJDK6 is: > >> > >> network interface: name:null > >> interface: /0.0.0.0 > >> > >> It always returns this information. > >> For comparison - openjdk on Linux: > >> > >> network interface: name:eth0 (eth0) > >> interface: /10.0.1.54 > >> > >> Oracle 7 VM on Windows: > >> > >> network interface: name:eth3 (Realtek PCIe GBE Family Controller) > >> interface: /10.0.1.51 > > > > I can confirm this is a problem for bsd-port (openjdk7) > > on OpenBSD too. > > > >> For me this seems to be an implementation bug of... I don't know? > >> PlainDatagramSocketImpl.c maybe? > >> > >> I tried to debug this further, but did not succeeded to find out if > >> either setInterface() failed to set it correctly, or somewhere in > >> getInterface() an early return() happens. I tried to remotly debug > >> this using Eclipse, but only saw the private variables of ssdpSocket > >> which didn't indicated something obvious. Breakpoints inside > >> java.net.MulticastSocket would have helped ;) > >> > >> > > >
--- jdk/src/solaris/native/java/net/PlainDatagramSocketImpl.c.orig Fri Feb 1 11:16:47 2013 +++ jdk/src/solaris/native/java/net/PlainDatagramSocketImpl.c Fri Feb 1 12:52:14 2013 @@ -1338,7 +1338,7 @@ static void setMulticastInterface(JNIEnv *env, jobject /* * value is an InetAddress. */ -#ifdef __solaris__ +#if defined(__solaris__) || defined(_ALLBSD_SOURCE) if (ipv6_available()) { mcast_set_if_by_addr_v6(env, this, fd, value); } else { @@ -1357,7 +1357,7 @@ static void setMulticastInterface(JNIEnv *env, jobject /* * value is a NetworkInterface. */ -#ifdef __solaris__ +#if defined(__solaris__) || defined(_ALLBSD_SOURCE) if (ipv6_available()) { mcast_set_if_by_if_v6(env, this, fd, value); } else { @@ -1434,7 +1434,7 @@ static void mcast_set_loop_v6(JNIEnv *env, jobject thi */ static void setMulticastLoopbackMode(JNIEnv *env, jobject this, int fd, jint opt, jobject value) { -#ifdef __solaris__ +#if defined(__solaris__) || defined(_ALLBSD_SOURCE) if (ipv6_available()) { mcast_set_loop_v6(env, this, fd, value); } else { @@ -2002,7 +2002,7 @@ Java_java_net_PlainDatagramSocketImpl_setTimeToLive(JN fd = (*env)->GetIntField(env, fdObj, IO_fd_fdID); } /* setsockopt to be correct ttl */ -#ifdef __solaris__ +#if defined(__solaris__) || defined(_ALLBSD_SOURCE) if (ipv6_available()) { setHopLimit(env, fd, ttl); } else {
--- jdk/src/solaris/native/java/net/PlainDatagramSocketImpl.c.orig Fri Feb 1 12:55:19 2013 +++ jdk/src/solaris/native/java/net/PlainDatagramSocketImpl.c Fri Feb 1 12:56:25 2013 @@ -1358,7 +1358,7 @@ static void setMulticastInterface(JNIEnv *env, jobject * value is an InetAddress. */ #ifdef AF_INET6 -#if defined(__solaris__) || defined(MACOSX) +#if defined(__solaris__) || defined(_ALLBSD_SOURCE) if (ipv6_available()) { mcast_set_if_by_addr_v6(env, this, fd, value); } else { @@ -1381,7 +1381,7 @@ static void setMulticastInterface(JNIEnv *env, jobject * value is a NetworkInterface. */ #ifdef AF_INET6 -#if defined(__solaris__) || defined(MACOSX) +#if defined(__solaris__) || defined(_ALLBSD_SOURCE) if (ipv6_available()) { mcast_set_if_by_if_v6(env, this, fd, value); } else { @@ -1464,7 +1464,7 @@ static void mcast_set_loop_v6(JNIEnv *env, jobject thi static void setMulticastLoopbackMode(JNIEnv *env, jobject this, int fd, jint opt, jobject value) { #ifdef AF_INET6 -#if defined(__solaris__) || defined(MACOSX) +#if defined(__solaris__) || defined(_ALLBSD_SOURCE) if (ipv6_available()) { mcast_set_loop_v6(env, this, fd, value); } else { @@ -2038,7 +2038,7 @@ Java_java_net_PlainDatagramSocketImpl_setTimeToLive(JN } /* setsockopt to be correct ttl */ #ifdef AF_INET6 -#if defined(__solaris__) || defined(MACOSX) +#if defined(__solaris__) || defined(_ALLBSD_SOURCE) if (ipv6_available()) { setHopLimit(env, fd, ttl); } else {