From 80f6b5faeb62b9d201ddb55af847638dfb88dc8f Mon Sep 17 00:00:00 2001 From: Philippe Guibert Date: Wed, 25 Aug 2021 11:46:42 +0200 Subject: [PATCH] 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 --- lib/zclient.h | 11 ++++++++++- zebra/rt_netlink.c | 15 +++++++++++++-- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/lib/zclient.h b/lib/zclient.h index d24f06b778..71187ccae7 100644 --- a/lib/zclient.h +++ b/lib/zclient.h @@ -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; diff --git a/zebra/rt_netlink.c b/zebra/rt_netlink.c index 48ccf91ec7..a8b4b54d29 100644 --- a/zebra/rt_netlink.c +++ b/zebra/rt_netlink.c @@ -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)