FULL PRODUCT VERSION :
js$ java -version
java version "1.7.0_45"
Java(TM) SE Runtime Environment (build 1.7.0_45-b18)
Java HotSpot(TM) 64-Bit Server VM (build 24.45-b08, mixed mode)
ADDITIONAL OS VERSION INFORMATION :
js$ sw_vers
ProductName:Mac OS X
ProductVersion:10.7.5
BuildVersion:11G63b
A DESCRIPTION OF THE PROBLEM :
Subscribing to source-specific multicast with an IP4 configured network address fails with the following exception:
Exception in thread "Thread-1" java.lang.UnsupportedOperationException
at sun.nio.ch.DatagramChannelImpl.innerJoin(DatagramChannelImpl.java:869)
at sun.nio.ch.DatagramChannelImpl.join(DatagramChannelImpl.java:896)
The join method is called with the following Java init code:
NetworkInterface nif = getNetworkInterface();
InetAddress groupa = InetAddress.getByName(ip);
DatagramChannel dc = DatagramChannel.open(StandardProtocolFamily.INET)
.setOption(StandardSocketOptions.SO_REUSEADDR, true)
.bind(new InetSocketAddress(port))
.setOption(StandardSocketOptions.IP_MULTICAST_IF, nif);
dc.configureBlocking(false);
for (String source : sources) {
InetAddress sourcea = InetAddress.getByName(source);
MembershipKey key = dc.join(groupa, nif, sourcea);
}
ip is set to a value such as "232.1.1.5", port is set to a value such as '9991' and source is set to a value such as '10.0.1.200'
javadocs at http://docs.oracle.com/javase/7/docs/api/java/nio/channels/DatagramChannel.html show similar invocation sequence.
The same code works on linux and windows platforms without the exception so it sounds likely the native C code for Java_sun_nio_ch_Net_joinOrDrop4 has specific code for MACOSX.
ADDITIONAL REGRESSION INFORMATION:
Source-Specific Multicast (SSM) via DatagramChannel class is available only in JDK7 so I cannot say this would have ever worked on macos before.
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
My expectation is that no exception would be thrown and subscription via the 3 parameter join() is supported on macos.
ACTUAL -
Exception in thread "Thread-1" java.lang.UnsupportedOperationException
at sun.nio.ch.DatagramChannelImpl.innerJoin(DatagramChannelImpl.java:869)
at sun.nio.ch.DatagramChannelImpl.join(DatagramChannelImpl.java:896)
REPRODUCIBILITY :
This bug can be reproduced always.
CUSTOMER SUBMITTED WORKAROUND :
I have tested this C code to work correctly on macos so I would suggest the same source code would find its way to the Java_sun_nio_ch_Net_joinOrDrop4.c source code for JVM.
struct ip_mreq_source imsr;
memset(&imsr, 0, sizeof(imsr));
imsr.imr_multiaddr.s_addr = inet_addr(g_addr_s);
imsr.imr_sourceaddr.s_addr = inet_addr(s_addr_s);
imsr.imr_interface.s_addr = INADDR_ANY;
err = setsockopt(con->fd, IPPROTO_IP, IP_ADD_SOURCE_MEMBERSHIP,
(char*) &imsr, sizeof(imsr));