Hi Chris, Thanks for responding.
The IPv6 portion of the test is not being executed as you have mentioned. The errors I am seeing on AIX are when it runs the IPv4 portion of the test. The AIX system I am running on has IPv6 enabled but the interface that is being used for the IPv4 test (en0) doesn't have an IPv6/INET6 address configured for it. As can be seen from the output from the 'ifconfig -a' command en0: flags=1e084863,80480<UP,BROADCAST,NOTRAILERS,RUNNING,SIMPLEX,MULTICAST,GROUPRT,64BIT,CHECKSUM_OFFLOAD(ACTIVE),CHAIN> inet 9.xxx.xxx.150 netmask 0xfffffe00 broadcast 9.xxx.xxx.255 tcp_sendspace 262144 tcp_recvspace 262144 rfc1323 1 lo0: flags=e08084b,c0<UP,BROADCAST,LOOPBACK,RUNNING,SIMPLEX,MULTICAST,GROUPRT,64BIT,LARGESEND,CHAIN> inet 127.0.0.1 netmask 0xff000000 broadcast 127.255.255.255 inet6 ::1%1/64 tcp_sendspace 131072 tcp_recvspace 131072 rfc1323 1 The test does the following: try (MulticastSocket soc = new MulticastSocket()) { soc.setNetworkInterface(nif); soc.joinGroup(group); soc.leaveGroup(group); } catch (IOException e) { throw new UncheckedIOException(e); } The issue I am gettiing is when the test calls the following line soc.setNetworkInterface(nif); which basically ends up throwing an exception from the mcast_set_if_by_if_v6 native method in java.base/unix/native/libnet/PlainDatagramSocketImpl.c when it is doing the setsockopt which gets a EADDRNOTAVAIL error and throws an exception. The code is: if (setsockopt(fd, IPPROTO_IPV6, IPV6_MULTICAST_IF, (const char*)&index, sizeof(index)) < 0) { if (errno == EINVAL && index > 0) { JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "IPV6_MULTICAST_IF failed (interface has IPv4 " "address only?)"); } else { JNU_ThrowByNameWithMessageAndLastError (env, JNU_JAVANETPKG "SocketException", "Error setting socket option"); } return; } If I run the test with '-Djava.net.preferIPv4Stack=true` it al works fine. Digging into the java code I can see that when the MulticastSocket is created using try (MulticastSocket soc = new MulticastSocket()) { it ends up in the datagramSocketCreate function in Java_java_net_PlainDatagramSocketImpl_datagramSocketCreate(JNIEnv *env, jobject this) { jobject fdObj = (*env)->GetObjectField(env, this, pdsi_fdID); int arg, fd, t = 1; char tmpbuf[1024]; int domain = ipv6_available() ? AF_INET6 : AF_INET; if (IS_NULL(fdObj)) { JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Socket closed"); return; } if ((fd = socket(domain, SOCK_DGRAM, 0)) == -1) { JNU_ThrowByNameWithMessageAndLastError (env, JNU_JAVANETPKG "SocketException", "Error creating socket"); return; } where it is creating a socket with a family of AF_INET6 because the ipv6_available() function returns true. then later we are trying to configure an interface on that socket that doesnt have an IPv6/INET6 address and hence why I think we get the EADDRNOTAVAIL error. I think I have an Linux system setup with a simarly configured interface (system has IPv6 configured but interface has no IPv6/INET6 address configured) but the test works fine when run on that system. This was why I was asking the question on whether this should work on AIX, or whether it should fail on Linux!!! Hoping that with the description above you might be able to let me know what the expected behaviour is. Thanks Steve Groeger IBM Runtime Technologies Hursley, Winchester Tel: (44) 1962 816911 Mobex: 279990 Mobile: 07718 517 129 Fax (44) 1962 816800 Lotus Notes: Steve Groeger/UK/IBM Internet: groe...@uk.ibm.com Unless stated otherwise above: IBM United Kingdom Limited - Registered in England and Wales with number 741598. Registered office: PO Box 41, North Harbour, Portsmouth, Hampshire PO6 3AU From: Chris Hegarty <chris.hega...@oracle.com> To: Steve Groeger <groe...@uk.ibm.com>, net-dev@openjdk.java.net Cc: ppc-aix-port-...@openjdk.java.net Date: 07/01/2019 14:34 Subject: Re: 8207404: MulticastSocket tests failing on Aix Steve, On 05/12/2018 10:50, Steve Groeger wrote: > Posting this to net-dev as well as ppc-aix-port-dev as this may be a > more appropriate mailing list to get responses about networking. > > I have performed the test Volker mentioned in an earlier post (on xLinux > machine, remove the ipv6 address from the ens32 interface but leaving > inte6 enabled on the system). > With this configuration the jdk/java/net/MulticastSocket/JoinLeave.java > test still passes, whereas on AIX with a similar configuration the test > fails. > For those with knowledge of networking, should this MulticastSocket test > pass if there is no ipv6 address enabled for the interface being used. If there is no interface, that supports multicasting, with an IPv6 address, then the test will not execute the particular IPv6 multicasting scenario. That is fine, the IPv6 portion of the test is effectively skipped, since it cannot be tested on the particular platform. ( One could separate IPv4 from IPv6 in this test, and rather return a jtreg skipped status if a suitable interface with IPv6 is not found. But is does not seem worth while. ) -Chris. Unless stated otherwise above: IBM United Kingdom Limited - Registered in England and Wales with number 741598. Registered office: PO Box 41, North Harbour, Portsmouth, Hampshire PO6 3AU