diff options
author | Erich E. Hoover <ehoover@mines.edu> | 2012-02-08 09:11:07 +0000 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-02-08 15:52:45 -0500 |
commit | 76e21053b5bf33a07c76f99d27a74238310e3c71 (patch) | |
tree | 70ac2a67be8f19da96896950447567e156975149 /include/linux/in.h | |
parent | 43480aecb1f538d4f6dd8b2c5d2b71fb98659072 (diff) | |
download | op-kernel-dev-76e21053b5bf33a07c76f99d27a74238310e3c71.zip op-kernel-dev-76e21053b5bf33a07c76f99d27a74238310e3c71.tar.gz |
ipv4: Implement IP_UNICAST_IF socket option.
The IP_UNICAST_IF feature is needed by the Wine project. This patch
implements the feature by setting the outgoing interface in a similar
fashion to that of IP_MULTICAST_IF. A separate option is needed to
handle this feature since the existing options do not provide all of
the characteristics required by IP_UNICAST_IF, a summary is provided
below.
SO_BINDTODEVICE:
* SO_BINDTODEVICE requires administrative privileges, IP_UNICAST_IF
does not. From reading some old mailing list articles my
understanding is that SO_BINDTODEVICE requires administrative
privileges because it can override the administrator's routing
settings.
* The SO_BINDTODEVICE option restricts both outbound and inbound
traffic, IP_UNICAST_IF only impacts outbound traffic.
IP_PKTINFO:
* Since IP_PKTINFO and IP_UNICAST_IF are independent options,
implementing IP_UNICAST_IF with IP_PKTINFO will likely break some
applications.
* Implementing IP_UNICAST_IF on top of IP_PKTINFO significantly
complicates the Wine codebase and reduces the socket performance
(doing this requires a lot of extra communication between the
"server" and "user" layers).
bind():
* bind() does not work on broadcast packets, IP_UNICAST_IF is
specifically intended to work with broadcast packets.
* Like SO_BINDTODEVICE, bind() restricts both outbound and inbound
traffic.
Signed-off-by: Erich E. Hoover <ehoover@mines.edu>
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/linux/in.h')
-rw-r--r-- | include/linux/in.h | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/include/linux/in.h b/include/linux/in.h index 01129c0..e0337f1 100644 --- a/include/linux/in.h +++ b/include/linux/in.h @@ -111,6 +111,7 @@ struct in_addr { #define MCAST_LEAVE_SOURCE_GROUP 47 #define MCAST_MSFILTER 48 #define IP_MULTICAST_ALL 49 +#define IP_UNICAST_IF 50 #define MCAST_EXCLUDE 0 #define MCAST_INCLUDE 1 |