ppp.core
fileThis was a known problem with ppp set up to negotiate a dynamic local IP number with the peer in auto mode. It is fixed in the latest version - search the man page for iface.
The problem was that when that initial program calls connect(2), the IP number of the tun interface is assigned to the socket endpoint. The kernel creates the first outgoing packet and writes it to the tun device. Ppp then reads the packet and establishes a connection. If, as a result of ppps dynamic IP assignment, the interface address is changed, the original socket endpoint will be invalid. Any subsequent packets sent to the peer will usually be dropped. Even if they aren't, any responses will not route back to the originating machine as the IP number is no longer owned by that machine.
There are several theoretical ways to approach this problem.
It would be nicest if the peer would re-assign the same IP number
if possible :-)
The current version of ppp does this,
but most other implementations don't.
The easiest method from our side would be to never change the
tun interface IP number, but instead to change all outgoing packets
so that the source IP number is changed from the interface IP to
the negotiated IP on the fly. This is essentially what the
iface-alias
option in the latest version of ppp is
doing (with the help of libalias(3)
and ppp's -alias switch) - it's maintaining all previous
interface addresses and aliasing them to the last negotiated address.
Another alternative (and probably the most reliable) would be to implement a system call that changes all bound sockets from one IP to another. Ppp would use this call to modify the sockets of all existing programs when a new IP number is negotiated. The same system call could be used by dhcp clients when they are forced to re-bind() their sockets.
Yet another possibility is to allow an interface to be brought up without an IP number. Outgoing packets would be given an IP number of 255.255.255.255 up until the first SIOCAIFADDR ioctl is done. This would result in fully binding the socket. It would be up to ppp to change the source IP number, but only if it's set to 255.255.255.255, and only the IP number and IP checksum would need to change. This, however is a bit of a hack as the kernel would be sending bad packets to an improperly configured interface, on the assumption that some other mechanism is capable of fixing things retrospectively.
ppp.core
file