Message ID | 6c8b53108816a8d0d5705ae37bdc5a8322b5e3d9.1686153846.git.gnault@redhat.com (mailing list archive) |
---|---|
State | Accepted |
Commit | 91ffd1bae1dafbb9e34b46813f5b058581d9144d |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | [net] ping6: Fix send to link-local addresses with VRF. | expand |
Context | Check | Description |
---|---|---|
netdev/series_format | success | Single patches do not need cover letters |
netdev/tree_selection | success | Clearly marked for net |
netdev/fixes_present | success | Fixes tag present in non-next series |
netdev/header_inline | success | No static functions without inline keyword in header files |
netdev/build_32bit | success | Errors and warnings before: 8 this patch: 8 |
netdev/cc_maintainers | success | CCed 7 of 7 maintainers |
netdev/build_clang | success | Errors and warnings before: 8 this patch: 8 |
netdev/verify_signedoff | success | Signed-off-by tag matches author and committer |
netdev/deprecated_api | success | None detected |
netdev/check_selftest | success | No net selftest shell script |
netdev/verify_fixes | success | Fixes tag looks correct |
netdev/build_allmodconfig_warn | success | Errors and warnings before: 8 this patch: 8 |
netdev/checkpatch | warning | WARNING: line length of 87 exceeds 80 columns |
netdev/kdoc | success | Errors and warnings before: 0 this patch: 0 |
netdev/source_inline | success | Was 0 now: 0 |
On 6/7/23 10:05 AM, Guillaume Nault wrote: > Ping sockets can't send packets when they're bound to a VRF master > device and the output interface is set to a slave device. > > For example, when net.ipv4.ping_group_range is properly set, so that > ping6 can use ping sockets, the following kind of commands fails: > $ ip vrf exec red ping6 fe80::854:e7ff:fe88:4bf1%eth1 > > What happens is that sk->sk_bound_dev_if is set to the VRF master > device, but 'oif' is set to the real output device. Since both are set > but different, ping_v6_sendmsg() sees their value as inconsistent and > fails. > > Fix this by allowing 'oif' to be a slave device of ->sk_bound_dev_if. > > This fixes the following kselftest failure: > $ ./fcnal-test.sh -t ipv6_ping > [...] > TEST: ping out, vrf device+address bind - ns-B IPv6 LLA [FAIL] Thank you for resolving that one. > > Reported-by: Mirsad Todorovac <mirsad.todorovac@alu.unizg.hr> > Closes: https://lore.kernel.org/netdev/b6191f90-ffca-dbca-7d06-88a9788def9c@alu.unizg.hr/ > Tested-by: Mirsad Todorovac <mirsad.todorovac@alu.unizg.hr> > Fixes: 5e457896986e ("net: ipv6: Fix ping to link-local addresses.") > Signed-off-by: Guillaume Nault <gnault@redhat.com> > --- > net/ipv6/ping.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/net/ipv6/ping.c b/net/ipv6/ping.c > index c4835dbdfcff..f804c11e2146 100644 > --- a/net/ipv6/ping.c > +++ b/net/ipv6/ping.c > @@ -114,7 +114,8 @@ static int ping_v6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) > addr_type = ipv6_addr_type(daddr); > if ((__ipv6_addr_needs_scope_id(addr_type) && !oif) || > (addr_type & IPV6_ADDR_MAPPED) || > - (oif && sk->sk_bound_dev_if && oif != sk->sk_bound_dev_if)) > + (oif && sk->sk_bound_dev_if && oif != sk->sk_bound_dev_if && > + l3mdev_master_ifindex_by_index(sock_net(sk), oif) != sk->sk_bound_dev_if)) > return -EINVAL; > > ipcm6_init_sk(&ipc6, np); Reviewed-by: David Ahern <dsahern@kernel.org>
Hello: This patch was applied to netdev/net.git (main) by Jakub Kicinski <kuba@kernel.org>: On Wed, 7 Jun 2023 18:05:02 +0200 you wrote: > Ping sockets can't send packets when they're bound to a VRF master > device and the output interface is set to a slave device. > > For example, when net.ipv4.ping_group_range is properly set, so that > ping6 can use ping sockets, the following kind of commands fails: > $ ip vrf exec red ping6 fe80::854:e7ff:fe88:4bf1%eth1 > > [...] Here is the summary with links: - [net] ping6: Fix send to link-local addresses with VRF. https://git.kernel.org/netdev/net/c/91ffd1bae1da You are awesome, thank you!
diff --git a/net/ipv6/ping.c b/net/ipv6/ping.c index c4835dbdfcff..f804c11e2146 100644 --- a/net/ipv6/ping.c +++ b/net/ipv6/ping.c @@ -114,7 +114,8 @@ static int ping_v6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) addr_type = ipv6_addr_type(daddr); if ((__ipv6_addr_needs_scope_id(addr_type) && !oif) || (addr_type & IPV6_ADDR_MAPPED) || - (oif && sk->sk_bound_dev_if && oif != sk->sk_bound_dev_if)) + (oif && sk->sk_bound_dev_if && oif != sk->sk_bound_dev_if && + l3mdev_master_ifindex_by_index(sock_net(sk), oif) != sk->sk_bound_dev_if)) return -EINVAL; ipcm6_init_sk(&ipc6, np);