[erlang-questions] Local IP address in UDP packets

Serge Aleynikov serge@REDACTED
Mon Oct 16 15:06:50 CEST 2006


Kenneth,

See in-line.

Kenneth Lundin (AS/EAB) wrote:
>> -----Original Message-----
>> From: Serge Aleynikov [mailto:serge@REDACTED] 
>> Sent: den 10 oktober 2006 18:08
>> To: Erlang Users' List
>> Subject: Local IP address in UDP packets
>>
>> Hi,
>>
>> We have a UDP server process that starts listening on the 
>> {0,0,0,0} address of a host with multiple IPs.  It needs to 
>> know the local destination IP address that a UDP packet was 
>> received on,
 >
> Why can't you explicitly receive on a specific IP address and by that
> knowing
> the IP address the UDP packet was received on?

A typical use case for this is as following.  Two hosts are configured 
with Virtual IP (VIP) balancing software (using a project like 
http://linux-ha.org).  This way a VIP can be migrated from one host to 
another based on network conditions or operator action.  It may not be 
possible to receive notifications from such a process indicating that a 
VIP was activated on current host.  Additionally, there might be 
multiple VIPs balanced between N hosts, where each VIP may get 
dynamically assigned to any host in the subnet.

I would like to have a UDP server listening on 0.0.0.0 address.  This 
way a turn up of a new VIP won't require to change any server properties 
nor restart the server - packets received on *any* IP address on that 
host (on a given port) will get delivered to the server process.  This 
adds a requirement to know which IP a packet was received on.

[...]
> We discussed this, here are our initial thoughts:
> - That the presence of an option ("local_address") changes the format of
> received packages
> is not good. In that case we would prefer to introduce a new generic
> format for received packages
> where data which is inly present if a certain option is set is put in a
> separate list with 
> optional data.  Like this : {udp_packet, Socket, IP, InPortNo, Packet,
> OptionalData}
> Optional data would in your example a) above look like this:
> [{toip,ToIp}].

I agree, this indeed sounds like a better idea.

> - On how many platforms can the option 'local_address' be supported?
> (Windows?, Linux, MacOSx?, Solaris?) 

Knowing the target local IP on reception of a packet seems to be 
available on many platforms (though via distinct stack-specific API).
We only checked that sending packets from a specific local IP is 
supported on Linux, and partially on Solaris (Solaris =< 10 doesn't 
allow to specify the local IP address.  This Solaris limitation seemed 
to be fixed in the OpenSolaris project, but we haven't checked if 
Solaris 11 fixes the issue as well).

> And what should happen on platforms that don't support the
> option?
> An error when the option is set? or silently swallow the option without
> any, ... no that is not good.

I think returning an error would be a better choice.

> - What is the real usecase when the option is needed? You explain above,
> but why do you want/need to do like that?

See above.

We are planning to patch inet_drv.c for enabling this feature some time 
this or next week.  If you are interested I can send you the patch.

Regards,

Serge



More information about the erlang-questions mailing list