Why doesn't UDP work for ICSI Netalyzr in INET6 kernels?
Garrett Wollman
wollman at csail.mit.edu
Sat Aug 20 23:18:23 UTC 2011
The ICSI Netalyzr tool (netalyzr.icsi.berkeley.edu) is a Java applet
and standalone Java program that checks for various issues with
network connections. It attempts to use java.net.DatagramSocket.send
to send UDP packets to various destinations it's testing, and fails
with java.io.IOException:
002.097 main| Running test 3: checkUDP
002.097 main| ----------------------------
002.098 test-3| Sending UDP request to n4.netalyzr.icsi.berkeley.edu on port 1947
002.100 test-3| Test aborted due to IO exception:
002.102 test-3| java.io.IOException: Invalid argument
002.102 test-3| at java.net.PlainDatagramSocketImpl.send(Native Method)
002.102 test-3| at java.net.DatagramSocket.send(DatagramSocket.java:675)
002.102 test-3| at Netalyzr.checkUDP(Netalyzr.java:7509)
002.102 test-3| at Netalyzr$5.runImpl(Netalyzr.java:1701)
002.102 test-3| at Netalyzr$Test.run(Netalyzr.java:810)
002.102 test-3| at java.lang.Thread.run(Thread.java:722)
(excerpt from the Netalyzr client log).
I currently have openjdk-7.0.147_1 installed, but I've seen this
problem with recent openjdk6 as well.
Near as I can tell, the relevant system calls are as follows:
54253 java CALL socket(PF_INET6,SOCK_DGRAM,IPPROTO_IP)
54253 java RET socket 10/0xa
54253 java CALL setsockopt(0xa,0x29,0x1b,0x7ffffe7ea4f8,0x4)
54253 java RET setsockopt 0
54253 java CALL setsockopt(0xa,SOL_SOCKET,SO_BROADCAST,0x7ffffe7ea4fc,0x4)
54253 java RET setsockopt 0
54253 java CALL bind(0xa,0x7ffffe7ea460,0x1c)
54253 java STRU struct sockaddr { AF_INET6, [::]:0 }
54253 java RET bind 0
54253 java CALL getsockname(0xa,0x7ffffe7ea460,0x7ffffe7ea47c)
54253 java STRU struct sockaddr { AF_INET6, [::]:49501 }
54253 java RET getsockname 0
54253 java CALL connect(0xa,0x7ffffe7ea490,0x1c)
54253 java STRU struct sockaddr { AF_INET6, [::ffff:67.202.32.138]:1947 }
54253 java RET connect 0
54253 java CALL clock_gettime(0x4,0x7ffffe7e9b30)
54253 java RET clock_gettime 0
54253 java CALL clock_gettime(0x4,0x7ffffe7e9a80)
54253 java RET clock_gettime 0
54253 java CALL stat(0x83f85b460,0x7ffffe7e9090)
54253 java NAMI "/usr/local/openjdk7/jre/lib/amd64/libnet.so"
54253 java STRU struct stat {dev=1265533522, ino=31267, mode=-r--r--r-- , nlink=1, uid=0, gid=0, rdev=0, atime=1313879682.657870435, stime=1311142325.460426000, ctime=1311142337.955051534, birthtime=1311142337.333960566, size=99277, blksize=99328, blocks=195, flags=0x0 }
54253 java RET stat 0
54253 java CALL sendto(0xa,0x7ffffe7da570,0x25,0,0,0)
54253 java RET sendto -1 errno 22 Invalid argument
At this point Netalyzr goes on to try the next thing on its list.
I am unable to figure out which EINVAL return in the kernel it is
hitting. It is not the one related to net.inet6.ip6.v6only -- the
same error happens with it either on or off. Netalyzr works just fine
if the kernel is compiled without options INET6 (so the Java libraries
seem to be correctly detecting the complete lack of IPv6 support, and
when they try to use only PF_INET sockets for IPv4 UDP traffic, it
does work).
The jar file can be downloaded at:
<http://netalyzr.icsi.berkeley.edu/NetalyzrCLI.jar>
-GAWollman
More information about the freebsd-java
mailing list