Update setsockopt(IPV6_MULTICAST_IF) to support RFC 3493, try2
Subsystems (3)
Hi,
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.
-Brian
Signed-off-by Brian Haley <[email protected]>
net/ipv6/ipv6_sockglue.c +8 -5
@@ -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 ;
David Stevens
Acked-byAcked-by David L Stevens <[email protected]>
Quoted 27 lines
Signed-off-by Brian Haley <[email protected]>net/ipv6/ipv6_sockglue.c +8
-5@@ -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 ;
From: David Stevens <[email protected]>
Date: Thu, 11 Oct 2007 10:49:14 -0700
Quoted 1 line
Acked-by David L Stevens <[email protected]>
Applied, thanks everyone!