Hi Arthur,
The idea looks reasonable to me - I believe the changes in
NetworkInterface.c should be OK.
However - I don't think the changes in net_util.c::DEF_JNI_OnLoad
are acceptable.
I'll question whether this is the right place to bail
out. I agree it would be nice to have some diagnostic
that tells us that the native library is non-functioning
because both IPv4 & IPv6 where not available, but I'd rather
have this check at the place where the code actually tries
to e.g. open an IP/TCP socket, and where throwing a regular exception
with a better detailed message is possible, rather than
having the VM fail to start with some cryptic UnsatisfiedLinkError.
best regards,
-- daniel
On 08/05/2019 06:52, Arthur Eubanks wrote:
Bug: https://bugs.openjdk.java.net/browse/JDK-8223532
Webrev: http://cr.openjdk.java.net/~aeubanks/8223532/webrev.00/
There are a couple of functions in
src/java.base/unix/native/libnet/NetworkInterface.c which try to create
IPv4 sockets, then check if errno is EPROTONOSUPPORT. If errno is
EPROTONOSUPPORT, then IPv6 is tried, else it immediately bails.
We have a kernel that returns EAFNOSUPPORT when IPv4 is disabled and
there is an attempt to create an AF_INET socket.
Rather than adding a check for EAFNOSUPPORT, which seems too specific,
just don't bother trying to create an IPv4 socket if IPv4 is not
available. This uses ipv4_available(), introduced in
http://hg.openjdk.java.net/jdk/jdk/rev/22323f20401b.
Since previously the code assumed that we have at least IPv4, now when
initializing ipv4/6_available(), make sure that at least one of them is
available, or else bail. One problem I have with this is that the error
message when neither is present is not descriptive:
Error occurred during initialization of boot layer
java.lang.UnsatisfiedLinkError: unsupported JNI version 0xFFFFFFFF
required by path/to/jdk/build/jdk/lib/libnet.so