From 1f74d96c418fb36d794ef020144ab286fb363048 Mon Sep 17 00:00:00 2001 From: Igor Ryzhov Date: Thu, 29 Jul 2021 20:21:00 +0300 Subject: [PATCH] zebra: remove checks for src address existence when using "set src" 1. This check is absolutely useless. Nothing keeps user from deleting the address right after this check. 2. This check prevents zebra from correctly reading the user config with "set src" because of a race with interface startup (see #4249). 3. NO OPERATIONAL DATA USAGE ON VALIDATION STAGE. Fixes #7319. Signed-off-by: Igor Ryzhov --- doc/user/zebra.rst | 11 +++++++---- zebra/zebra_routemap_nb_config.c | 28 ---------------------------- 2 files changed, 7 insertions(+), 32 deletions(-) diff --git a/doc/user/zebra.rst b/doc/user/zebra.rst index 3654801100..1d88fbe37d 100644 --- a/doc/user/zebra.rst +++ b/doc/user/zebra.rst @@ -908,10 +908,11 @@ IPv6 example for OSPFv3. .. note:: - For both IPv4 and IPv6, the IP address has to exist at the point the - route-map is created. Be wary of race conditions if the interface is - not created at startup. On Debian, FRR might start before ifupdown - completes. Consider a reboot test. + For both IPv4 and IPv6, the IP address has to exist on some interface when + the route is getting installed into the system. Otherwise, kernel rejects + the route. To solve the problem of disappearing IPv6 addresses when the + interface goes down, use ``net.ipv6.conf.all.keep_addr_on_down`` + :ref:`sysctl option `. .. clicmd:: zebra route-map delay-timer (0-600) @@ -1232,6 +1233,8 @@ For protocols requiring an IPv6 router-id, the following commands are available: Display the user configured IPv6 router-id. +.. _zebra-sysctl: + Expected sysctl settings ======================== diff --git a/zebra/zebra_routemap_nb_config.c b/zebra/zebra_routemap_nb_config.c index 8f5660610f..5bcfb720e1 100644 --- a/zebra/zebra_routemap_nb_config.c +++ b/zebra/zebra_routemap_nb_config.c @@ -247,9 +247,7 @@ lib_route_map_entry_set_action_rmap_set_action_ipv4_src_address_modify( struct nb_cb_modify_args *args) { struct routemap_hook_context *rhc; - struct interface *pif = NULL; const char *source; - struct vrf *vrf; struct prefix p; int rv; @@ -262,18 +260,6 @@ lib_route_map_entry_set_action_rmap_set_action_ipv4_src_address_modify( yang_dnode_get_string(args->dnode, NULL)); return NB_ERR_VALIDATION; } - - RB_FOREACH(vrf, vrf_id_head, &vrfs_by_id) { - pif = if_lookup_exact_address(&p.u.prefix4, AF_INET, - vrf->vrf_id); - if (pif != NULL) - break; - } - if (pif == NULL) { - zlog_warn("%s: is not a local address: %s", __func__, - yang_dnode_get_string(args->dnode, NULL)); - return NB_ERR_VALIDATION; - } return NB_OK; case NB_EV_PREPARE: case NB_EV_ABORT: @@ -325,9 +311,7 @@ lib_route_map_entry_set_action_rmap_set_action_ipv6_src_address_modify( struct nb_cb_modify_args *args) { struct routemap_hook_context *rhc; - struct interface *pif = NULL; const char *source; - struct vrf *vrf; struct prefix p; int rv; @@ -340,18 +324,6 @@ lib_route_map_entry_set_action_rmap_set_action_ipv6_src_address_modify( yang_dnode_get_string(args->dnode, NULL)); return NB_ERR_VALIDATION; } - - RB_FOREACH(vrf, vrf_id_head, &vrfs_by_id) { - pif = if_lookup_exact_address(&p.u.prefix6, AF_INET6, - vrf->vrf_id); - if (pif != NULL) - break; - } - if (pif == NULL) { - zlog_warn("%s: is not a local address: %s", __func__, - yang_dnode_get_string(args->dnode, NULL)); - return NB_ERR_VALIDATION; - } return NB_OK; case NB_EV_PREPARE: case NB_EV_ABORT: -- 2.39.5