It looks like setting and getting the IP_TOS values on the java.net Sockets is currently broken for some scenarios. It's not possible to set the value on a ServerSocket via the jdk.net.Sockets.setOption API. See below for a webrev I'm proposing. It basically makes best efforts to set the IP_TOS value by mapping it to the IPV6_TCLASS option in an IPV6 enabled environment. NIO follows a similar approach.

Some of the comments in NET_SetSockOpt seem to be legacy and I've removed the no-op that was in place for IP_TOS. A corner case of setting of IP_TOS was found on Solaris. It doesn't seem to support setting the value once the socket is connected. I've handled this via catching of exception and we should be ok with this since the spec doesn't make any promises in this area if the socket is connected.

I've been testing various fixes across IPv4/v6 sockets on Solaris, Linux and macosx. So far, the proposed changes seem to work and wireshark traces help to confirm that TOS/TCLASS values are being set.

I still need to see if I can improve the getOpt logic for IP_TOS. At the moment, it can return a cached value which may not represent the true value in place at kernel socket level. I'll also improve test coverage in this area.

bug report : https://bugs.openjdk.java.net/browse/JDK-8072384
webrev : http://cr.openjdk.java.net/~coffeys/webrev.8072384.jdk9.v1/webrev/

regards,
Sean.


Reply via email to