Re: [PATCH net] net: ipv6: Fix ping to link-local addresses.
From: David Ahern <hidden>
Date: 2016-08-12 16:04:18
On 8/12/16 9:45 AM, Lorenzo Colitti wrote:
On Wed, Aug 10, 2016 at 7:44 AM, YOSHIFUJI Hideaki [off-list ref] wrote:quoted
quoted
quoted
I could see a point of view that says when bound_if is in play sending to destinations on/via other interfaces--by any mechanism--should effectively get ENETUNREACH (or something).VRF uses this capability to send on an enslaved interface. ie., socket is bound to VRF device to limit packets to that L3 domain and then uses PKTINFO to force a packet out a particular interface.We could extend our code to allow enslave devices, maybe.So something like this, then? static inline bool inet_check_bound_oif(const struct sock *sk, int oif) { if (!oif || !sk->sk_bound_dev_if || oif == sk->sk_bound_dev_if) return true; #ifdef CONFIG_NET_L3_MASTER_DEV return l3mdev_master_ifindex_by_index(sock_net(sk), oif) == sk->sk_bound_dev_if; #endif return false; }
The ifdef is not needed; it's already in the l3mdev macros. int midx; if (!oif || !sk->sk_bound_dev_if || oif == sk->sk_bound_dev_if) return true; midx = l3mdev_master_ifindex_by_index(sock_net(sk), oif); if (midx && sk->sk_bound_dev_if == midx) return true; return false;
and then in the various sendmsg functions:
if (!inet_check_bound_oif(sk, oif))
return -EINVAL;