From a35bb7e2a89097dc90105a75cbd68618fb74451c Mon Sep 17 00:00:00 2001 From: Donatas Abraitis Date: Tue, 31 Oct 2023 17:09:48 +0200 Subject: [PATCH] zebra: Remove static ARP entries on interface down events Without this patch, static ARP entries remain active even if the interface is down, but the kernel already removed them. Signed-off-by: Donatas Abraitis --- zebra/redistribute.c | 3 +++ zebra/zebra_neigh.c | 13 +++++++++++++ zebra/zebra_neigh.h | 1 + 3 files changed, 17 insertions(+) diff --git a/zebra/redistribute.c b/zebra/redistribute.c index 71e7956324b0..7d3a9617a40a 100644 --- a/zebra/redistribute.c +++ b/zebra/redistribute.c @@ -28,6 +28,7 @@ #include "zebra/zapi_msg.h" #include "zebra/zebra_vxlan.h" #include "zebra/zebra_errors.h" +#include "zebra/zebra_neigh.h" #define ZEBRA_PTM_SUPPORT @@ -522,6 +523,8 @@ void zebra_interface_down_update(struct interface *ifp) zsend_interface_update(ZEBRA_INTERFACE_DOWN, client, ifp); } + + zebra_neigh_del_all(ifp); } /* Interface information update. */ diff --git a/zebra/zebra_neigh.c b/zebra/zebra_neigh.c index 0c3fb97afdf7..941088afd606 100644 --- a/zebra/zebra_neigh.c +++ b/zebra/zebra_neigh.c @@ -152,6 +152,19 @@ void zebra_neigh_del(struct interface *ifp, struct ipaddr *ip) zebra_neigh_free(n); } +/* kernel neigh delete all for a given interface */ +void zebra_neigh_del_all(struct interface *ifp) +{ + struct zebra_neigh_ent *n, *nn; + + if (IS_ZEBRA_DEBUG_NEIGH) + zlog_debug("zebra neigh delete all for interface %s/%d", + ifp->name, ifp->ifindex); + + RB_FOREACH_SAFE (n, zebra_neigh_rb_head, &zneigh_info->neigh_rb_tree, nn) + zebra_neigh_del(ifp, &n->ip); +} + /* kernel neigh add */ void zebra_neigh_add(struct interface *ifp, struct ipaddr *ip, struct ethaddr *mac) diff --git a/zebra/zebra_neigh.h b/zebra/zebra_neigh.h index b957b5efe580..adc5f94f76e1 100644 --- a/zebra/zebra_neigh.h +++ b/zebra/zebra_neigh.h @@ -43,6 +43,7 @@ struct zebra_neigh_info { extern void zebra_neigh_add(struct interface *ifp, struct ipaddr *ip, struct ethaddr *mac); extern void zebra_neigh_del(struct interface *ifp, struct ipaddr *ip); +extern void zebra_neigh_del_all(struct interface *ifp); extern void zebra_neigh_show(struct vty *vty); extern void zebra_neigh_init(void); extern void zebra_neigh_terminate(void);