]> err.no Git - linux-2.6/commitdiff
[IPv6]: Update setsockopt(IPV6_MULTICAST_IF) to support RFC 3493, try2
authorBrian Haley <brian.haley@hp.com>
Thu, 11 Oct 2007 21:39:29 +0000 (14:39 -0700)
committerDavid S. Miller <davem@davemloft.net>
Thu, 11 Oct 2007 21:39:29 +0000 (14:39 -0700)
 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>
net/ipv6/ipv6_sockglue.c

index 532425db11fea7729952ac239dfebbf3d9bf3b08..1334fc174bcf72de093eaeff65d2ec64a7239229 100644 (file)
@@ -539,12 +539,15 @@ done:
        case IPV6_MULTICAST_IF:
                if (sk->sk_type == SOCK_STREAM)
                        goto e_inval;
-               if (sk->sk_bound_dev_if && sk->sk_bound_dev_if != val)
-                       goto e_inval;
 
-               if (__dev_get_by_index(&init_net, val) == NULL) {
-                       retv = -ENODEV;
-                       break;
+               if (val) {
+                       if (sk->sk_bound_dev_if && sk->sk_bound_dev_if != val)
+                               goto e_inval;
+
+                       if (__dev_get_by_index(&init_net, val) == NULL) {
+                               retv = -ENODEV;
+                               break;
+                       }
                }
                np->mcast_oif = val;
                retv = 0;