lib, zebra: complete the ndm flags on zclient api

Insist on the fact that zclient neighbor state flags are
mapped over netlink state flags. List all the defines
currently known on kernel, and create a netlink API to
convert netlink values to zclient values. The function is
simplified as it is a 1-1 match.

Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
This commit is contained in:
Philippe Guibert 2021-08-25 11:46:42 +02:00
parent c4e1fd52a1
commit 80f6b5faeb
2 changed files with 23 additions and 3 deletions

View File

@ -856,9 +856,18 @@ extern struct zclient_options zclient_options_default;
* ip_in is the underlay IP, ip_out is the tunnel dest
* index stands for the index of the interface
* ndm state stands for the NDM value in netlink
* (see linux/neighbour.h)
*/
#define ZEBRA_NEIGH_STATE_INCOMPLETE (0x01)
#define ZEBRA_NEIGH_STATE_REACHABLE (0x02)
#define ZEBRA_NEIGH_STATE_FAILED (0x20)
#define ZEBRA_NEIGH_STATE_STALE (0x04)
#define ZEBRA_NEIGH_STATE_DELAY (0x08)
#define ZEBRA_NEIGH_STATE_PROBE (0x10)
#define ZEBRA_NEIGH_STATE_FAILED (0x20)
#define ZEBRA_NEIGH_STATE_NOARP (0x40)
#define ZEBRA_NEIGH_STATE_PERMANENT (0x80)
#define ZEBRA_NEIGH_STATE_NONE (0x00)
struct zapi_neigh_ip {
int cmd;
struct ipaddr ip_in;

View File

@ -3658,6 +3658,15 @@ static void netlink_handle_5549(struct ndmsg *ndm, struct zebra_if *zif,
#define NUD_LOCAL_ACTIVE \
(NUD_PERMANENT | NUD_NOARP | NUD_REACHABLE)
static int netlink_nbr_entry_state_to_zclient(int nbr_state)
{
/* an exact match is done between
* - netlink neighbor state values: NDM_XXX (see in linux/neighbour.h)
* - zclient neighbor state values: ZEBRA_NEIGH_STATE_XXX
* (see in lib/zclient.h)
*/
return nbr_state;
}
static int netlink_ipneigh_change(struct nlmsghdr *h, int len, ns_id_t ns_id)
{
struct ndmsg *ndm;
@ -3747,8 +3756,10 @@ static int netlink_ipneigh_change(struct nlmsghdr *h, int len, ns_id_t ns_id)
&mac, l2_len);
} else
sockunion_family(&link_layer_ipv4) = AF_UNSPEC;
zsend_nhrp_neighbor_notify(cmd, ifp, &ip, ndm->ndm_state,
&link_layer_ipv4);
zsend_nhrp_neighbor_notify(
cmd, ifp, &ip,
netlink_nbr_entry_state_to_zclient(ndm->ndm_state),
&link_layer_ipv4);
}
if (h->nlmsg_type == RTM_GETNEIGH)