From mboxrd@z Thu Jan 1 00:00:00 1970 From: David Ahern Subject: [PATCH RFC net-next 0/7] net/ipv6: Fix route append and replace use cases Date: Mon, 14 May 2018 19:51:05 -0700 Message-ID: <20180515025112.16647-1-dsahern@gmail.com> Cc: Thomas.Winter@alliedtelesis.co.nz, idosch@mellanox.com, sharpd@cumulusnetworks.com, roopa@cumulusnetworks.com, David Ahern To: netdev@vger.kernel.org Return-path: Received: from mail-pg0-f48.google.com ([74.125.83.48]:35440 "EHLO mail-pg0-f48.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752072AbeEOCvW (ORCPT ); Mon, 14 May 2018 22:51:22 -0400 Received: by mail-pg0-f48.google.com with SMTP id n1-v6so6330066pgs.2 for ; Mon, 14 May 2018 19:51:22 -0700 (PDT) Sender: netdev-owner@vger.kernel.org List-ID: This patch set fixes a few append and replace uses cases for IPv6 and adds test cases that codifies the expectations of how append and replace are expected to work. In paricular it allows a multipath route to have a dev-only nexthop, something Thomas tried to accomplish with commit edd7ceb78296 ("ipv6: Allow non-gateway ECMP for IPv6") which had to be reverted because of breakage, and to replace an existing FIB entry with a reject route. There are a number of inconsistent and surprising aspects to the Linux API for adding, deleting, replacing and changing FIB entries. For example, with IPv4 NLM_F_APPEND means insert the route after any existing entries with the same key (prefix + priority + TOS for IPv4) and NLM_F_CREATE without the append flag inserts the new route before any existing entries. IPv6 on the other hand attempts to guess whether a new route should be appended to an existing one, possibly creating a multipath route, or to add a new entry after any existing ones. This applies to both the 'append' (NLM_F_CREATE + NLM_F_APPEND) and 'prepend' (NLM_F_CREATE only) cases meaning for IPv6 the NLM_F_APPEND is basically ignored. This guessing whether the route should be added to a multipath route (gateway routes) or inserted after existing entries (non-gateway based routes) means a multipath route can not have a dev only nexthop (potentially required in some cases - tunnels or VRF route leaking for example) and route 'replace' is a bit adhoc treating gateway based routes and dev-only / reject routes differently. This has led to frustration with developers working on routing suites such as FRR where workarounds such as delete and add. After this patch set there are 2 differences between IPv4 and IPv6: 1. 'ip ro prepend' = NLM_F_CREATE only IPv4 adds the new route before any existing ones IPv6 adds new route after any existing ones 2. 'ip ro append' = NLM_F_CREATE|NLM_F_APPEND IPv4 adds the new route after any existing ones IPv6 adds the nexthop to existing routes converting to multipath For the former, there are cases where we want same prefix routes added after existing ones (e.g., multicast, prefix routes for macvlan when used for virtual router redundancy). Requiring the APPEND flag to add a new route to an existing one helps here but is a slight change in behavior since prepend with gateway routes now create a separate entry. For the latter IPv6 behavior is preferred - appending a route for the same prefix and metric to make a multipath route, so really IPv4 not allowing an existing route to be updated is the limiter. This will be fixed when nexthops become separate objects - a future patch set. Thank you to Thomas and Ido for testing earlier versions of this set, and to Ido for providing an update to the mlxsw driver. David Ahern (7): mlxsw: spectrum_router: Add support for route append net/ipv6: Simplify appending route into multipath route selftests: fib_tests: Add success-fail counts selftests: fib_tests: Add command line options selftests: fib_tests: Add option to pause after each test selftests: fib_tests: Add ipv6 route add append replace tests selftests: fib_tests: Add ipv4 route add append replace tests .../net/ethernet/mellanox/mlxsw/spectrum_router.c | 2 + include/net/ip6_route.h | 6 - net/ipv6/ip6_fib.c | 157 +++-- net/ipv6/route.c | 3 +- tools/testing/selftests/net/fib_tests.sh | 673 ++++++++++++++++++++- 5 files changed, 737 insertions(+), 104 deletions(-) -- 2.11.0