aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian Haley <brian.haley@hp.com>2007-10-11 17:39:29 -0400
committerDavid S. Miller <davem@davemloft.net>2007-10-11 17:39:29 -0400
commit4953f0fcc06a125f87874743d968c0e185c8b296 (patch)
treef35705517e8f907e5c777c55d5a41c80d3f0e959
parent73aaf9355b71d295fd72dc0b93fcdd275c56648f (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.c13
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;