[kaffe] IP address autodetection

Timothy Stack stack@cs.utah.edu
Mon Feb 24 08:55:01 2003


> On Sun, Feb 23, 2003 at 02:46:19PM -0700, Timothy Stack wrote:
> > On Sunday, February 23, 2003, at 11:48  AM, Matthew Toseland wrote:
> > >While trying to get freenet working on Kaffe, I discovered a side
> > >issue... we use the attached code to detect the local internet IP
> > >address. Basically, we open a datagram socket to the A-root nameserver
> > >and call getLocalAddress().
> > why not just use InetAddress.getLocalHost()?  Or,=20
> Because it doesn't do what we want, at least in the Sun JVM?

Care to elaborate?

> > useNetworkInterface.getNetworkInterfaces() and handle the=20
> > NoClassDefFoundError with this method.
> Hmmmmm... this is supported by Kaffe? We'd have to have a fallback for
> pre-1.4 JVMs, yeah...

I think its in CVS now.

> > > This returns 0.0.0.0 on Kaffe CVS;
> > Its probably wrong, but its a very gray area and making dependencies on=
> > it doesn't seem like a good idea.  The javadoc for getLocalAddress()=20
> > says it returns "the local address to which the socket is bound, or an=20
> > InetAddress representing any local address."  Since the attached=20
> > example didn't do a bind its technically correct to return the any=20
> > address (0.0.0.0).  Also, connecting a datagram socket discriminates on=
> > the remote address, not the network interface.  So, again, its very=20
> Sorry, I don't understand "connecting... interface".

Suppose the local host is multihomed and it connects a datagram socket to
another host.

		231.42.21.152 (Host A: the remote host)
		      |
		  /---+----\
		  |Internet|
		  \--+--+--/
		     |  |
		  eth0  eth1 (Host B: the local host w/2 ethernet adapters)
	    34.21.12.2  34.21.22.3

Now, when host B connect()'s a datagram socket to host A, some[1]
implementations will trigger a side effect that sets the socket's local IP
address to that of the outgoing NIC.  Basically, its a hacky way of
querying the routing table.

[1] Read Stevens' Unix Network Programming Vol. 1 Second Edition, section
8.14.  Here's an excerpt from page 233:

	Unfortunately, this technique does not work on all
	implementations, notably SVR4-derived kernels.  For example, this
	does not work on HP-UX, Solaris 2.5, and UnixWare, but it works on
	AIX, Digital Unix, Linux, and Solaris 2.6.

> > >Matthew Toseland

tim stack