]> git.puffer.fish Git - mirror/frr.git/commitdiff
staticd: static route config should fail if gw configured as its local ip. 4302/head
authorrgirada <rgirada@vmware.com>
Fri, 10 May 2019 05:35:48 +0000 (22:35 -0700)
committerrgirada <rgirada@vmware.com>
Sat, 7 Sep 2019 15:11:14 +0000 (08:11 -0700)
Fix:
Added a check in staticd upon receiving nexthop update from zebra such that
it will fail to resolve the nexthop if the connected address added as nexthop.

But still allowing to add to staticd database and appears in running config.
Throwing an warning massage to user if such misconfig issued.

Signed-off-by: Rajesh Girada <rgirada@vmware.com>
staticd/static_vty.c
staticd/static_zebra.c

index 3a9e4e8fa4671c933c7464fef325a248e25991e0..f926e1d9cd2ad4f967770260046816bb178876ff 100644 (file)
@@ -35,7 +35,6 @@
 #ifndef VTYSH_EXTRACT_PL
 #include "staticd/static_vty_clippy.c"
 #endif
-
 static struct static_vrf *static_vty_get_unknown_vrf(struct vty *vty,
                                                     const char *vrf_name)
 {
@@ -479,6 +478,23 @@ static int static_route_leak(
                        return CMD_WARNING_CONFIG_FAILED;
                }
                gatep = &gate;
+
+               if (afi == AFI_IP && !negate) {
+                       if (if_lookup_exact_address(&gatep->ipv4, AF_INET,
+                                                       svrf->vrf->vrf_id))
+                               if (vty)
+                                       vty_out(vty,
+                                               "%% Warning!! Local connected address is configured as Gateway IP(%s)\n",
+                                               gate_str);
+               } else if (afi == AFI_IP6 && !negate) {
+                       if (if_lookup_exact_address(&gatep->ipv6, AF_INET6,
+                                                       svrf->vrf->vrf_id))
+                               if (vty)
+                                       vty_out(vty,
+                                               "%% Warning!! Local connected address is configured as Gateway IPv6(%s)\n",
+                                               gate_str);
+               }
+
        }
 
        if (gate_str == NULL && ifname == NULL)
index 27605da63fafbc11b1fd290a19571509ef47e07c..1965c2968ef3deea29cd3c1820ca5e0b10a862b7 100644 (file)
@@ -200,6 +200,25 @@ struct static_nht_data {
        uint8_t nh_num;
 };
 
+/* API to check whether the configured nexthop address is
+ * one of its local connected address or not.
+ */
+static bool
+static_nexthop_is_local(vrf_id_t vrfid, struct prefix *addr, int family)
+{
+       if (family == AF_INET) {
+               if (if_lookup_exact_address(&addr->u.prefix4,
+                                       AF_INET,
+                                       vrfid))
+                       return true;
+       } else if (family == AF_INET6) {
+               if (if_lookup_exact_address(&addr->u.prefix6,
+                                       AF_INET6,
+                                       vrfid))
+                       return true;
+       }
+       return false;
+}
 static int static_zebra_nexthop_update(ZAPI_CALLBACK_ARGS)
 {
        struct static_nht_data *nhtd, lookup;
@@ -214,6 +233,12 @@ static int static_zebra_nexthop_update(ZAPI_CALLBACK_ARGS)
        if (nhr.prefix.family == AF_INET6)
                afi = AFI_IP6;
 
+       if (nhr.type == ZEBRA_ROUTE_CONNECT) {
+               if (static_nexthop_is_local(vrf_id, &nhr.prefix,
+                                       nhr.prefix.family))
+                       nhr.nexthop_num = 0;
+       }
+
        memset(&lookup, 0, sizeof(lookup));
        lookup.nh = &nhr.prefix;
        lookup.nh_vrf_id = vrf_id;