nhrp, zebra, lib: pass exact received neighbor state value to nhrp

As NHRP expects some notification of neighboring entries on GRE
interface, when a new interface notification is encountered, the
exact neighbor state flag is found. Previously, the flag passed
to the upper layer was forced to NDM_STATE which is REACHABLE,
as can be seen on below trace:

2021/08/25 10:58:39 NHRP: [QQ0NK-1H449] Netlink: new-neigh 102.1.1.1 dev gre1 lladdr 10.125.0.2 nud 0x2 cache used 1 type 5

When passing the real value, NHRP received an other value like STALE.

2021/08/25 11:28:44 NHRP: [QQ0NK-1H449] Netlink: new-neigh 102.1.1.1 dev gre1 lladdr 10.125.0.2 nud 0x4 cache used 0 type 5

This flag is important for NHRP, as it permits to monitor the link
layer of NHRP entries.

Fixes: d603c0774e ("nhrp, zebra, lib: enforce usage of zapi_neigh_ip structure")

Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
This commit is contained in:
Philippe Guibert 2021-08-25 11:40:41 +02:00
parent 3e324ff419
commit c4e1fd52a1
4 changed files with 11 additions and 13 deletions

View File

@ -4487,11 +4487,9 @@ static int zclient_neigh_ip_read_entry(struct stream *s, struct ipaddr *add)
return -1;
}
int zclient_neigh_ip_encode(struct stream *s,
uint16_t cmd,
union sockunion *in,
union sockunion *out,
struct interface *ifp)
int zclient_neigh_ip_encode(struct stream *s, uint16_t cmd, union sockunion *in,
union sockunion *out, struct interface *ifp,
int ndm_state)
{
int ret = 0;
@ -4506,7 +4504,7 @@ int zclient_neigh_ip_encode(struct stream *s,
stream_putc(s, AF_UNSPEC);
stream_putl(s, ifp->ifindex);
if (out)
stream_putl(s, ZEBRA_NEIGH_STATE_REACHABLE);
stream_putl(s, ndm_state);
else
stream_putl(s, ZEBRA_NEIGH_STATE_FAILED);
return ret;

View File

@ -867,11 +867,9 @@ struct zapi_neigh_ip {
uint32_t ndm_state;
};
int zclient_neigh_ip_decode(struct stream *s, struct zapi_neigh_ip *api);
int zclient_neigh_ip_encode(struct stream *s,
uint16_t cmd,
union sockunion *in,
union sockunion *out,
struct interface *ifp);
int zclient_neigh_ip_encode(struct stream *s, uint16_t cmd, union sockunion *in,
union sockunion *out, struct interface *ifp,
int ndm_state);
/*
* We reserve the top 4 bits for l2-NHG, everything else

View File

@ -452,7 +452,8 @@ void nhrp_send_zebra_nbr(union sockunion *in,
stream_reset(s);
zclient_neigh_ip_encode(s, out ? ZEBRA_NEIGH_IP_ADD :
ZEBRA_NEIGH_IP_DEL, in, out,
ifp);
ifp, out ? ZEBRA_NEIGH_STATE_REACHABLE
: ZEBRA_NEIGH_STATE_FAILED);
stream_putw_at(s, 0, stream_get_endp(s));
zclient_send_message(zclient);
}

View File

@ -997,7 +997,8 @@ void zsend_nhrp_neighbor_notify(int cmd, struct interface *ifp,
continue;
s = stream_new(ZEBRA_MAX_PACKET_SIZ);
zclient_neigh_ip_encode(s, cmd, &ip, link_layer_ipv4, ifp);
zclient_neigh_ip_encode(s, cmd, &ip, link_layer_ipv4, ifp,
ndm_state);
stream_putw_at(s, 0, stream_get_endp(s));
zserv_send_message(client, s);
}