]> git.proxmox.com Git - mirror_frr.git/commitdiff
zebra: remove checks for src address existence when using "set src"
authorIgor Ryzhov <iryzhov@nfware.com>
Thu, 29 Jul 2021 17:21:00 +0000 (20:21 +0300)
committerIgor Ryzhov <iryzhov@nfware.com>
Mon, 2 Aug 2021 15:35:30 +0000 (18:35 +0300)
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>
doc/user/zebra.rst
zebra/zebra_routemap_nb_config.c

index 36548011009c2ebdd4fa62ae8a632fd157ae1960..1d88fbe37d2e1c05b7919e0fdcce08a57cba562a 100644 (file)
@@ -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
 ========================
 
index 8f5660610f5f25f95fa45db6d265f6e99e9cd8f5..5bcfb720e17e2f00995c3bfc1462520a8b9ea970 100644 (file)
@@ -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: