Re: [PATCH net v3] selftests/fib_tests: Rework fib_rp_filter_test()

From: David Ahern
Date: Wed Dec 01 2021 - 13:00:40 EST


On 11/30/21 5:47 PM, Peilin Ye wrote:
> From: Peilin Ye <peilin.ye@xxxxxxxxxxxxx>
>
> Currently rp_filter tests in fib_tests.sh:fib_rp_filter_test() are
> failing. ping sockets are bound to dummy1 using the "-I" option
> (SO_BINDTODEVICE), but socket lookup is failing when receiving ping
> replies, since the routing table thinks they belong to dummy0.
>
> For example, suppose ping is using a SOCK_RAW socket for ICMP messages.
> When receiving ping replies, in __raw_v4_lookup(), sk->sk_bound_dev_if
> is 3 (dummy1), but dif (skb_rtable(skb)->rt_iif) says 2 (dummy0), so the
> raw_sk_bound_dev_eq() check fails. Similar things happen in
> ping_lookup() for SOCK_DGRAM sockets.
>
> These tests used to pass due to a bug [1] in iputils, where "ping -I"
> actually did not bind ICMP message sockets to device. The bug has been
> fixed by iputils commit f455fee41c07 ("ping: also bind the ICMP socket
> to the specific device") in 2016, which is why our rp_filter tests
> started to fail. See [2] .
>
> Fixing the tests while keeping everything in one netns turns out to be
> nontrivial. Rework the tests and build the following topology:
>
> ┌─────────────────────────────┐ ┌─────────────────────────────┐
> │ network namespace 1 (ns1) │ │ network namespace 2 (ns2) │
> │ │ │ │
> │ ┌────┐ ┌─────┐ │ │ ┌─────┐ ┌────┐ │
> │ │ lo │<───>│veth1│<────────┼────┼─>│veth2│<──────────>│ lo │ │
> │ └────┘ ├─────┴──────┐ │ │ ├─────┴──────┐ └────┘ │
> │ │192.0.2.1/24│ │ │ │192.0.2.1/24│ │
> │ └────────────┘ │ │ └────────────┘ │
> └─────────────────────────────┘ └─────────────────────────────┘
>

if the intention of the tests is to validate that rp_filter = 1 works as
designed, then I suggest a simpler test. 2 namespaces, 2 veth pairs.
Request goes through one interface, and the response comes in the other
via routing in ns2. ns1 would see the response coming in the 'wrong'
interface and drops it.