summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIgor Ryzhov <iryzhov@nfware.com>2021-07-29 20:21:00 +0300
committerIgor Ryzhov <iryzhov@nfware.com>2021-08-02 18:35:30 +0300
commit1f74d96c418fb36d794ef020144ab286fb363048 (patch)
tree7c4411bee66239bc15f9bc5c875fca08bdf91d6a
parent7543016dbc01093d5fbc7e94bbc9bc24344b3efc (diff)
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 <iryzhov@nfware.com>
-rw-r--r--doc/user/zebra.rst11
-rw-r--r--zebra/zebra_routemap_nb_config.c28
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 <zebra-sysctl>`.
.. 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: