Skip site navigation (1)Skip section navigation (2)
Date:      8 Aug 1995 00:30:46 +0800
From:      peter@haywire.dialix.com (Peter Wemm)
To:        freebsd-current@freebsd.org
Subject:   Re: workaround for talk's address problem
Message-ID:  <405f3m$l4h$1@haywire.DIALix.COM>
References:  <199508061603.SAA07779@uriah.heep.sax.de>

next in thread | previous in thread | raw e-mail | index | archive | help
j@uriah.heep.sax.de (J Wunsch) writes:

>talk(1) has problems with multi-homed hosts.  To negotiate the
>connection with the remote peer, it uses the first address as returned
>by a call to gethostbyname().  This will cause the connection to hang
>for machines where not all interfaces are reachable from the Internet.
>This is often the case for the typical dialup user: he's got a SLIP
>interface with (e.g.) 111.222.111.33, and an ethernet interface with
>192.168.3.4.  The call to gethostbyname() will cause the name server
>to return 192.168.3.4 as the first address (since the name server
>believes this is the `most local' one), so talk will only be able to
>contact hosts inside the (not externally routed) 192.168.3 network.

>The correct solution would be asking the routing socket to see which
>interface address must be used to get in contact with the remote peer.
>Unfortunately, the interface to the routing socket is somewhat ugly to
>use and it requires root privileges.  Hence i'm suggesting the
>following workaround.  It introduces an option `-a' followed by a
>(dotted-quad) address to use for the negotiation.  This address will
>be checked against the address list as returned from gethostbyname()
>to avoid abusing foreign addresses.

>If nobody objects (or promises to implement the routing socket
>scenario), i'd going to commit this change.

Hmm. I have an idea.. sort-of..

Currently, you can "bind()" and "connect()" udp sockets..  bind
associates it with the local address, and connect associates the
remote address..

If it does not already do this, would this be a serious semantics
break if connect()ing to the remote address actually caused an
implicit bind()?

ie: connect(remote_address)
    getsockname(s, &local_addr);
    bind(s, INADDR_ANY) /* void the association */?

Or perhaps implement a special bind() 'feature' so that if you happen to
bind() an INADDR_ANY of a "connected" udp socket will actually choose
the correct local address corresponding to the remote..  or if you
bind to INADDR_NONE..  Whatever..

Of course, none of this will help if your default route points outside
on one interface, and the replies come back on another.. (one of our
network links has a peculiar load balancing arrangement where this
happens)

I suspect the easiest answer is to only use registered IP addresses,
and make sure you can do IP forwarding.. 

Cheers,
-Peter



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?405f3m$l4h$1>