summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDonatas Abraitis <donatas@opensourcerouting.org>2023-10-31 17:09:48 +0200
committerDonatas Abraitis <donatas@opensourcerouting.org>2023-11-06 15:00:59 +0200
commita35bb7e2a89097dc90105a75cbd68618fb74451c (patch)
treea7d89531524eb091432c75fae012f529e9f5fd5b
parentc772c52e625e37af929d65e5e105c6508c9ea6a7 (diff)
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 <donatas@opensourcerouting.org>
-rw-r--r--zebra/redistribute.c3
-rw-r--r--zebra/zebra_neigh.c13
-rw-r--r--zebra/zebra_neigh.h1
3 files changed, 17 insertions, 0 deletions
diff --git a/zebra/redistribute.c b/zebra/redistribute.c
index 71e7956324..7d3a9617a4 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 0c3fb97afd..941088afd6 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 b957b5efe5..adc5f94f76 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);