diff options
author | Brian Haley <brian.haley@hp.com> | 2007-10-11 17:39:29 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2007-10-11 17:39:29 -0400 |
commit | 4953f0fcc06a125f87874743d968c0e185c8b296 (patch) | |
tree | f35705517e8f907e5c777c55d5a41c80d3f0e959 | |
parent | 73aaf9355b71d295fd72dc0b93fcdd275c56648f (diff) |
[IPv6]: Update setsockopt(IPV6_MULTICAST_IF) to support RFC 3493, try2
From RFC 3493, Section 5.2:
IPV6_MULTICAST_IF
Set the interface to use for outgoing multicast packets. The
argument is the index of the interface to use. If the
interface index is specified as zero, the system selects the
interface (for example, by looking up the address in a routing
table and using the resulting interface).
This patch adds support for (index == 0) to reset the value to it's
original state, allowing the system to choose the best interface. IPv4
already behaves this way.
Signed-off-by: Brian Haley <brian.haley@hp.com>
Acked-by: David L Stevens <dlstevens@us.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | net/ipv6/ipv6_sockglue.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/net/ipv6/ipv6_sockglue.c b/net/ipv6/ipv6_sockglue.c index 532425db11fe..1334fc174bcf 100644 --- a/net/ipv6/ipv6_sockglue.c +++ b/net/ipv6/ipv6_sockglue.c | |||
@@ -539,12 +539,15 @@ done: | |||
539 | case IPV6_MULTICAST_IF: | 539 | case IPV6_MULTICAST_IF: |
540 | if (sk->sk_type == SOCK_STREAM) | 540 | if (sk->sk_type == SOCK_STREAM) |
541 | goto e_inval; | 541 | goto e_inval; |
542 | if (sk->sk_bound_dev_if && sk->sk_bound_dev_if != val) | ||
543 | goto e_inval; | ||
544 | 542 | ||
545 | if (__dev_get_by_index(&init_net, val) == NULL) { | 543 | if (val) { |
546 | retv = -ENODEV; | 544 | if (sk->sk_bound_dev_if && sk->sk_bound_dev_if != val) |
547 | break; | 545 | goto e_inval; |
546 | |||
547 | if (__dev_get_by_index(&init_net, val) == NULL) { | ||
548 | retv = -ENODEV; | ||
549 | break; | ||
550 | } | ||
548 | } | 551 | } |
549 | np->mcast_oif = val; | 552 | np->mcast_oif = val; |
550 | retv = 0; | 553 | retv = 0; |