RFR: 8302659: Modernize Windows native code for NetworkInterface [v2]

Daniel Fuchs dfuchs at openjdk.org
Thu Feb 16 21:51:19 UTC 2023


On Thu, 16 Feb 2023 20:22:17 GMT, Rich DiCroce <duke at openjdk.org> wrote:

>> ok so here goes: your patch changes the order in which the interfaces are returned; the original code returned them in order of increasing indexes, the new code appears to sort interfaces by LUID.
>> The failing test uses the first interface for which supportsMulticast returns true. I get `supportsMulticast` = `true` on all interfaces even with the old code.
>> 
>> The interface that happened to be on the first position of my list was:
>> 
>> 67 name:ethernet_0 (Hyper-V Virtual Switch Extension Adapter-Hyper-V Virtual Switch Extension Filter-0000)
>>  ifup: true isP2P: false isLoopback: false macAddr: null MTU: 1500 supportsMulticast: true
>> 
>> it has no associated IP addresses, and is not usable with IP_MULTICAST_IF.
>> (Also it's a filter interface, which means that the old code returned ifUp = false).
>> 
>> Well that would explain how `supportsMulticast` is meant to be used; now we just need to figure out which interfaces can be used for multicasting.
>
> Note that the new code doesn't attempt to sort anything. If it happens to be sorted by LUID, that's the underlying API at work. The MS docs don't say anything about ordering, so this is probably an implementation detail and I wouldn't assume it will always be true.
> 
> I'm still running jdk_net, but I can already see that test failing on my machine. Though it has a different error:
> 
> 
> java.io.IOException: Network interface not configured for IPv4
> 	at java.base/sun.nio.ch.DatagramChannelImpl.setOption(DatagramChannelImpl.java:389)
> 	at java.base/sun.nio.ch.DatagramSocketAdaptor.setOption(DatagramSocketAdaptor.java:431)
> 	at java.base/java.net.DatagramSocket.setOption(DatagramSocket.java:1207)
> 	at OptionsTest.test(OptionsTest.java:155)
> 	at OptionsTest.doMulticastSocketTests(OptionsTest.java:235)
> 	at OptionsTest.main(OptionsTest.java:337)
> 	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
> 	at java.base/java.lang.reflect.Method.invoke(Method.java:578)
> 	at com.sun.javatest.regtest.agent.MainWrapper$MainThread.run(MainWrapper.java:125)
> 	at java.base/java.lang.Thread.run(Thread.java:1623)
> 
> 
> So I think when picking the interface to use for the test, we need to also check that isUp = true and that the list of IP addresses contains at least one IPv4 address.

Though it's more complicated than that. Some machines may have both IPv6 and IPv4, some machine may only have IPv4, and some machine may only have IPv6. I haven't looked at the test yet, but picking up the right interface on the various platforms has always been an issue for our tests.

-------------

PR: https://git.openjdk.org/jdk/pull/12593



More information about the build-dev mailing list