]> git.puffer.fish Git - matthieu/frr.git/commitdiff
nhrpd: shortcut routes installed with nexthop.
authorPhilippe Guibert <philippe.guibert@6wind.com>
Thu, 23 Jul 2020 06:57:05 +0000 (08:57 +0200)
committerPhilippe Guibert <philippe.guibert@6wind.com>
Tue, 9 Feb 2021 16:59:05 +0000 (17:59 +0100)
Previously, when a shortcut entry was created, its associated route was
created on system, with no nexthop, only gre device. eg:

[..]
N>* 192.168.2.0/24 [10/0] is directly connected, gre1, 00:01:04           <--- can not be resolved

[..]
Type     Prefix                   Via                      Identity
dynamic  192.168.2.0/24           10.255.255.2              <---- correct

This situation was forcing neighbor resolution on the first outgoing packet matching the route entry. for instance 192.168.2.1 could not be resolved at link layer, and was going to fail. Instead, nhrp nexthop should have been used.
This is what this commit intends to do, that is to say that when a
shortcut is installed by nhrp, the associated nexthop entry is used.

[..]
N>* 192.168.2.0/24 [10/0] via 10.255.255.2, gre1 onlink, 00:00:31

Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
nhrpd/nhrp_shortcut.c

index 1c2b2b28f2ff78057b73db7bca9edd3bbf71b894..b4abecb4e01dec26554b83ad35ebb34e3f7121a3 100644 (file)
@@ -54,20 +54,26 @@ static void nhrp_shortcut_cache_notify(struct notifier_block *n,
                                       unsigned long cmd)
 {
        char buf[PREFIX_STRLEN];
+       char buf2[PREFIX_STRLEN];
 
        struct nhrp_shortcut *s =
                container_of(n, struct nhrp_shortcut, cache_notifier);
+       struct nhrp_cache *c = s->cache;
 
+       if (c)
+               sockunion2str(&c->remote_addr, buf2, sizeof(buf2));
+       else
+               snprintf(buf2, sizeof(buf2), "(unspec)");
        switch (cmd) {
        case NOTIFY_CACHE_UP:
                if (!s->route_installed) {
                        debugf(NHRP_DEBUG_ROUTE,
-                              "Shortcut: route install %s nh (unspec) dev %s",
-                              prefix2str(s->p, buf, sizeof(buf)),
-                              s->cache->ifp->name);
+                              "Shortcut: route install %s nh %s dev %s",
+                              prefix2str(s->p, buf, sizeof(buf)), buf2,
+                              c && c->ifp ? c->ifp->name : "<unk>");
 
-                       nhrp_route_announce(1, s->type, s->p, s->cache->ifp,
-                                           NULL, 0);
+                       nhrp_route_announce(1, s->type, s->p, c ? c->ifp : NULL,
+                                           c ? &c->remote_addr : NULL, 0);
                        s->route_installed = 1;
                }
                break;