nhrpd: Clear shortcut routes properly for all protocols

Currently when nhrp shortcuts are purged they will not be recreated. This
patch fixes that by ensuring the shortcut routes get purged correctly.

This situation can be reproduced by first allowing a shortcut to be created
then clearing the shortcut:
clear ip nhrp cache
clear ip nhrp shortcuts

Signed-off-by: Reuben Dowle <reuben.dowle@4rf.com>
This commit is contained in:
Gaurav Goyal 2020-11-02 12:11:19 +13:00 committed by Reuben Dowle
parent 46d380217d
commit ddd8d8c845
3 changed files with 21 additions and 4 deletions

17
lib/sockunion.c Normal file → Executable file
View file

@ -708,3 +708,20 @@ static ssize_t printfrr_psu(char *buf, size_t bsz, const char *fmt,
fb.pos[0] = '\0';
return consumed;
}
int sockunion_is_null(const union sockunion *su)
{
unsigned char null_s6_addr[16] = {0};
switch (sockunion_family(su)) {
case AF_UNSPEC:
return 1;
case AF_INET:
return (su->sin.sin_addr.s_addr == 0);
case AF_INET6:
return !memcmp(su->sin6.sin6_addr.s6_addr, null_s6_addr,
sizeof(null_s6_addr));
default:
return 0;
}
}

1
lib/sockunion.h Normal file → Executable file
View file

@ -102,6 +102,7 @@ extern union sockunion *sockunion_getpeername(int);
extern union sockunion *sockunion_dup(const union sockunion *);
extern void sockunion_free(union sockunion *);
extern void sockunion_init(union sockunion *);
extern int sockunion_is_null(const union sockunion *su);
#ifdef _FRR_ATTRIBUTE_PRINTFRR
#pragma FRR printfrr_ext "%pSU" (union sockunion *)

7
nhrpd/nhrp_route.c Normal file → Executable file
View file

@ -56,7 +56,7 @@ static void nhrp_route_update_put(struct route_node *rn)
struct route_info *ri = rn->info;
if (!ri->ifp && !ri->nhrp_ifp
&& sockunion_family(&ri->via) == AF_UNSPEC) {
&& sockunion_is_null(&ri->via)) {
XFREE(MTYPE_NHRP_ROUTE, rn->info);
route_unlock_node(rn);
}
@ -70,8 +70,7 @@ static void nhrp_route_update_zebra(const struct prefix *p,
struct route_node *rn;
struct route_info *ri;
rn = nhrp_route_update_get(
p, (sockunion_family(nexthop) != AF_UNSPEC) || ifp);
rn = nhrp_route_update_get(p, !sockunion_is_null(nexthop) || ifp);
if (rn) {
ri = rn->info;
ri->via = *nexthop;
@ -225,7 +224,7 @@ int nhrp_route_read(ZAPI_CALLBACK_ARGS)
sockunion2str(&nexthop_addr, buf, sizeof(buf)),
ifp ? ifp->name : "(none)");
nhrp_route_update_zebra(&api.prefix, &nexthop_addr, ifp);
nhrp_route_update_zebra(&api.prefix, &nexthop_addr, added ? ifp : NULL);
nhrp_shortcut_prefix_change(&api.prefix, !added);
return 0;