summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDonald Sharp <sharpd@cumulusnetworks.com>2019-09-19 15:40:57 +0200
committerDonald Sharp <sharpd@cumulusnetworks.com>2019-09-19 19:34:06 +0200
commit3c3c325203848994bae83a85cb606d4e4deeeb25 (patch)
treeac8447eb389883d0f009599cb4ea460401f5af8b
parent*: Convert interface_down to interface down callback (diff)
downloadfrr-3c3c325203848994bae83a85cb606d4e4deeeb25.tar.xz
frr-3c3c325203848994bae83a85cb606d4e4deeeb25.zip
*: Convert zapi->interface_delete to ifp callback
Convert the callback of the interface_delete to the new ifp callback. Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
-rw-r--r--babeld/babel_interface.c22
-rw-r--r--babeld/babel_zebra.c1
-rw-r--r--bfdd/ptm_adapter.c19
-rw-r--r--bgpd/bgp_zebra.c20
-rw-r--r--eigrpd/eigrp_interface.c13
-rw-r--r--eigrpd/eigrp_zebra.c32
-rw-r--r--isisd/isis_circuit.c10
-rw-r--r--isisd/isis_zebra.c27
-rw-r--r--ldpd/ldp_zebra.c19
-rw-r--r--lib/if.c8
-rw-r--r--lib/if.h1
-rw-r--r--lib/zclient.c18
-rw-r--r--lib/zclient.h1
-rw-r--r--nhrpd/nhrp_interface.c17
-rw-r--r--nhrpd/nhrp_route.c1
-rw-r--r--ospf6d/ospf6_interface.c8
-rw-r--r--ospf6d/ospf6_zebra.c20
-rw-r--r--ospfd/ospf_interface.c16
-rw-r--r--ospfd/ospf_interface.h2
-rw-r--r--ospfd/ospf_zebra.c33
-rw-r--r--ospfd/ospf_zebra.h2
-rw-r--r--pbrd/pbr_zebra.c21
-rw-r--r--pimd/pim_iface.c17
-rw-r--r--pimd/pim_zebra.c30
-rw-r--r--ripd/rip_interface.c22
-rw-r--r--ripd/rip_zebra.c1
-rw-r--r--ripngd/ripng_interface.c22
-rw-r--r--ripngd/ripng_zebra.c1
-rw-r--r--sharpd/sharp_zebra.c22
-rw-r--r--staticd/static_zebra.c21
-rw-r--r--vrrpd/vrrp_zebra.c20
31 files changed, 105 insertions, 362 deletions
diff --git a/babeld/babel_interface.c b/babeld/babel_interface.c
index 59d065116..6e6030098 100644
--- a/babeld/babel_interface.c
+++ b/babeld/babel_interface.c
@@ -103,31 +103,18 @@ int babel_ifp_create (struct interface *ifp)
debugf(BABEL_DEBUG_IF, "receive a 'interface add'");
interface_recalculate(ifp);
-
+
return 0;
}
int
-babel_interface_delete (ZAPI_CALLBACK_ARGS)
+babel_ifp_destroy(struct interface *ifp)
{
- struct interface *ifp;
- struct stream *s;
-
debugf(BABEL_DEBUG_IF, "receive a 'interface delete'");
- s = zclient->ibuf;
- ifp = zebra_interface_state_read(s, vrf_id); /* it updates iflist */
-
- if (ifp == NULL)
- return 0;
-
if (IS_ENABLE(ifp))
interface_reset(ifp);
- /* To support pseudo interface do not free interface structure. */
- /* if_delete(ifp); */
- if_set_index(ifp, IFINDEX_INTERNAL);
-
return 0;
}
@@ -1250,11 +1237,6 @@ int babel_ifp_up(struct interface *ifp)
return 0;
}
-int babel_ifp_destroy(struct interface *ifp)
-{
- return 0;
-}
-
void
babel_if_init(void)
{
diff --git a/babeld/babel_zebra.c b/babeld/babel_zebra.c
index fd4e497b9..5a336df7b 100644
--- a/babeld/babel_zebra.c
+++ b/babeld/babel_zebra.c
@@ -240,7 +240,6 @@ void babelz_zebra_init(void)
zclient_init(zclient, ZEBRA_ROUTE_BABEL, 0, &babeld_privs);
zclient->zebra_connected = babel_zebra_connected;
- zclient->interface_delete = babel_interface_delete;
zclient->interface_address_add = babel_interface_address_add;
zclient->interface_address_delete = babel_interface_address_delete;
zclient->redistribute_route_add = babel_zebra_read_route;
diff --git a/bfdd/ptm_adapter.c b/bfdd/ptm_adapter.c
index dc90b4d6e..1b3219c23 100644
--- a/bfdd/ptm_adapter.c
+++ b/bfdd/ptm_adapter.c
@@ -673,19 +673,10 @@ void bfdd_sessions_disable_vrf(struct vrf *vrf)
}
}
-static int bfdd_interface_update(ZAPI_CALLBACK_ARGS)
+static int bfd_ifp_destroy(struct interface *ifp)
{
- struct interface *ifp;
-
- /* Update interface information. */
- ifp = zebra_interface_state_read(zclient->ibuf, vrf_id);
- if (ifp == NULL)
- return 0;
-
bfdd_sessions_disable_interface(ifp);
- if_set_index(ifp, IFINDEX_INTERNAL);
-
return 0;
}
@@ -749,11 +740,6 @@ static int bfd_ifp_create(struct interface *ifp)
return 0;
}
-static int bfd_ifp_destroy(struct interface *ifp)
-{
- return 0;
-}
-
void bfdd_zclient_init(struct zebra_privs_t *bfdd_priv)
{
if_zapi_callbacks(bfd_ifp_create, NULL, NULL, bfd_ifp_destroy);
@@ -771,9 +757,6 @@ void bfdd_zclient_init(struct zebra_privs_t *bfdd_priv)
/* Send replay request on zebra connect. */
zclient->zebra_connected = bfdd_zebra_connected;
- /* Learn interfaces from zebra instead of the OS. */
- zclient->interface_delete = bfdd_interface_update;
-
/* Learn about interface VRF. */
zclient->interface_vrf_update = bfdd_interface_vrf_update;
diff --git a/bgpd/bgp_zebra.c b/bgpd/bgp_zebra.c
index 5efe1087e..de39e295f 100644
--- a/bgpd/bgp_zebra.c
+++ b/bgpd/bgp_zebra.c
@@ -202,28 +202,20 @@ static void bgp_nbr_connected_delete(struct bgp *bgp, struct nbr_connected *ifc,
}
}
-static int bgp_interface_delete(ZAPI_CALLBACK_ARGS)
+static int bgp_ifp_destroy(struct interface *ifp)
{
- struct stream *s;
- struct interface *ifp;
struct bgp *bgp;
- bgp = bgp_lookup_by_vrf_id(vrf_id);
-
- s = zclient->ibuf;
- ifp = zebra_interface_state_read(s, vrf_id);
- if (!ifp) /* This may happen if we've just unregistered for a VRF. */
- return 0;
+ bgp = bgp_lookup_by_vrf_id(ifp->vrf_id);
if (BGP_DEBUG(zebra, ZEBRA))
- zlog_debug("Rx Intf del VRF %u IF %s", vrf_id, ifp->name);
+ zlog_debug("Rx Intf del VRF %u IF %s", bgp->vrf_id, ifp->name);
if (bgp)
bgp_update_interface_nbrs(bgp, ifp, NULL);
bgp_mac_del_mac_entry(ifp);
- if_set_index(ifp, IFINDEX_INTERNAL);
return 0;
}
@@ -2700,11 +2692,6 @@ static int bgp_ifp_create(struct interface *ifp)
return 0;
}
-static int bgp_ifp_destroy(struct interface *ifp)
-{
- return 0;
-}
-
void bgp_zebra_init(struct thread_master *master, unsigned short instance)
{
zclient_num_connects = 0;
@@ -2717,7 +2704,6 @@ void bgp_zebra_init(struct thread_master *master, unsigned short instance)
zclient_init(zclient, ZEBRA_ROUTE_BGP, 0, &bgpd_privs);
zclient->zebra_connected = bgp_zebra_connected;
zclient->router_id_update = bgp_router_id_update;
- zclient->interface_delete = bgp_interface_delete;
zclient->interface_address_add = bgp_interface_address_add;
zclient->interface_address_delete = bgp_interface_address_delete;
zclient->interface_nbr_address_add = bgp_interface_nbr_address_add;
diff --git a/eigrpd/eigrp_interface.c b/eigrpd/eigrp_interface.c
index 9c2ced9ea..6294c0dd0 100644
--- a/eigrpd/eigrp_interface.c
+++ b/eigrpd/eigrp_interface.c
@@ -196,6 +196,19 @@ static int eigrp_ifp_down(struct interface *ifp)
static int eigrp_ifp_destroy(struct interface *ifp)
{
+ if (if_is_up(ifp))
+ zlog_warn("Zebra: got delete of %s, but interface is still up",
+ ifp->name);
+
+ if (IS_DEBUG_EIGRP(zebra, ZEBRA_INTERFACE))
+ zlog_debug(
+ "Zebra: interface delete %s index %d flags %llx metric %d mtu %d",
+ ifp->name, ifp->ifindex, (unsigned long long)ifp->flags,
+ ifp->metric, ifp->mtu);
+
+ if (ifp->info)
+ eigrp_if_free(ifp->info, INTERFACE_DOWN_BY_ZEBRA);
+
return 0;
}
diff --git a/eigrpd/eigrp_zebra.c b/eigrpd/eigrp_zebra.c
index 256906824..9a0fdda0f 100644
--- a/eigrpd/eigrp_zebra.c
+++ b/eigrpd/eigrp_zebra.c
@@ -53,7 +53,6 @@
#include "eigrpd/eigrp_topology.h"
#include "eigrpd/eigrp_fsm.h"
-static int eigrp_interface_delete(ZAPI_CALLBACK_ARGS);
static int eigrp_interface_address_add(ZAPI_CALLBACK_ARGS);
static int eigrp_interface_address_delete(ZAPI_CALLBACK_ARGS);
@@ -109,7 +108,6 @@ void eigrp_zebra_init(void)
zclient_init(zclient, ZEBRA_ROUTE_EIGRP, 0, &eigrpd_privs);
zclient->zebra_connected = eigrp_zebra_connected;
zclient->router_id_update = eigrp_router_id_update_zebra;
- zclient->interface_delete = eigrp_interface_delete;
zclient->interface_address_add = eigrp_interface_address_add;
zclient->interface_address_delete = eigrp_interface_address_delete;
zclient->redistribute_route_add = eigrp_zebra_read_route;
@@ -143,36 +141,6 @@ static int eigrp_zebra_read_route(ZAPI_CALLBACK_ARGS)
return 0;
}
-static int eigrp_interface_delete(ZAPI_CALLBACK_ARGS)
-{
- struct interface *ifp;
- struct stream *s;
-
- s = zclient->ibuf;
- /* zebra_interface_state_read () updates interface structure in iflist
- */
- ifp = zebra_interface_state_read(s, vrf_id);
-
- if (ifp == NULL)
- return 0;
-
- if (if_is_up(ifp))
- zlog_warn("Zebra: got delete of %s, but interface is still up",
- ifp->name);
-
- if (IS_DEBUG_EIGRP(zebra, ZEBRA_INTERFACE))
- zlog_debug(
- "Zebra: interface delete %s index %d flags %llx metric %d mtu %d",
- ifp->name, ifp->ifindex, (unsigned long long)ifp->flags,
- ifp->metric, ifp->mtu);
-
- if (ifp->info)
- eigrp_if_free(ifp->info, INTERFACE_DOWN_BY_ZEBRA);
-
- if_set_index(ifp, IFINDEX_INTERNAL);
- return 0;
-}
-
static int eigrp_interface_address_add(ZAPI_CALLBACK_ARGS)
{
struct connected *c;
diff --git a/isisd/isis_circuit.c b/isisd/isis_circuit.c
index 153e7ec26..29fb725b0 100644
--- a/isisd/isis_circuit.c
+++ b/isisd/isis_circuit.c
@@ -1423,6 +1423,16 @@ static int isis_ifp_down(struct interface *ifp)
static int isis_ifp_destroy(struct interface *ifp)
{
+ if (if_is_operative(ifp))
+ zlog_warn("Zebra: got delete of %s, but interface is still up",
+ ifp->name);
+
+ isis_csm_state_change(IF_DOWN_FROM_Z, circuit_scan_by_ifp(ifp), ifp);
+
+ /* Cannot call if_delete because we should retain the pseudo interface
+ in case there is configuration info attached to it. */
+ if_delete_retain(ifp);
+
return 0;
}
diff --git a/isisd/isis_zebra.c b/isisd/isis_zebra.c
index 2299354b1..bdf6869f5 100644
--- a/isisd/isis_zebra.c
+++ b/isisd/isis_zebra.c
@@ -72,32 +72,6 @@ static int isis_router_id_update_zebra(ZAPI_CALLBACK_ARGS)
return 0;
}
-static int isis_zebra_if_del(ZAPI_CALLBACK_ARGS)
-{
- struct interface *ifp;
- struct stream *s;
-
- s = zclient->ibuf;
- ifp = zebra_interface_state_read(s, vrf_id);
-
- if (!ifp)
- return 0;
-
- if (if_is_operative(ifp))
- zlog_warn("Zebra: got delete of %s, but interface is still up",
- ifp->name);
-
- isis_csm_state_change(IF_DOWN_FROM_Z, circuit_scan_by_ifp(ifp), ifp);
-
- /* Cannot call if_delete because we should retain the pseudo interface
- in case there is configuration info attached to it. */
- if_delete_retain(ifp);
-
- if_set_index(ifp, IFINDEX_INTERNAL);
-
- return 0;
-}
-
static int isis_zebra_if_address_add(ZAPI_CALLBACK_ARGS)
{
struct connected *c;
@@ -339,7 +313,6 @@ void isis_zebra_init(struct thread_master *master)
zclient_init(zclient, PROTO_TYPE, 0, &isisd_privs);
zclient->zebra_connected = isis_zebra_connected;
zclient->router_id_update = isis_router_id_update_zebra;
- zclient->interface_delete = isis_zebra_if_del;
zclient->interface_address_add = isis_zebra_if_address_add;
zclient->interface_address_delete = isis_zebra_if_address_del;
zclient->interface_link_params = isis_zebra_link_params;
diff --git a/ldpd/ldp_zebra.c b/ldpd/ldp_zebra.c
index 37ecc0673..4df1fc030 100644
--- a/ldpd/ldp_zebra.c
+++ b/ldpd/ldp_zebra.c
@@ -39,7 +39,6 @@ static void ifc2kaddr(struct interface *, struct connected *,
struct kaddr *);
static int ldp_zebra_send_mpls_labels(int, struct kroute *);
static int ldp_router_id_update(ZAPI_CALLBACK_ARGS);
-static int ldp_interface_delete(ZAPI_CALLBACK_ARGS);
static int ldp_interface_address_add(ZAPI_CALLBACK_ARGS);
static int ldp_interface_address_delete(ZAPI_CALLBACK_ARGS);
static int ldp_zebra_read_route(ZAPI_CALLBACK_ARGS);
@@ -276,23 +275,13 @@ ldp_ifp_create(struct interface *ifp)
}
static int
-ldp_interface_delete(ZAPI_CALLBACK_ARGS)
+ldp_ifp_destroy(struct interface *ifp)
{
- struct interface *ifp;
struct kif kif;
- /* zebra_interface_state_read() updates interface structure in iflist */
- ifp = zebra_interface_state_read(zclient->ibuf, vrf_id);
- if (ifp == NULL)
- return (0);
-
debug_zebra_in("interface delete %s index %d mtu %d", ifp->name,
ifp->ifindex, ifp->mtu);
- /* To support pseudo interface do not free interface structure. */
- /* if_delete(ifp); */
- if_set_index(ifp, IFINDEX_INTERNAL);
-
ifp2kif(ifp, &kif);
main_imsg_compose_both(IMSG_IFSTATUS, &kif, sizeof(kif));
@@ -529,11 +518,6 @@ ldp_zebra_connected(struct zclient *zclient)
extern struct zebra_privs_t ldpd_privs;
-static int ldp_ifp_destroy(struct interface *ifp)
-{
- return 0;
-}
-
void
ldp_zebra_init(struct thread_master *master)
{
@@ -547,7 +531,6 @@ ldp_zebra_init(struct thread_master *master)
/* set callbacks */
zclient->zebra_connected = ldp_zebra_connected;
zclient->router_id_update = ldp_router_id_update;
- zclient->interface_delete = ldp_interface_delete;
zclient->interface_address_add = ldp_interface_address_add;
zclient->interface_address_delete = ldp_interface_address_delete;
zclient->redistribute_route_add = ldp_zebra_read_route;
diff --git a/lib/if.c b/lib/if.c
index de9ec46ff..5a46a8026 100644
--- a/lib/if.c
+++ b/lib/if.c
@@ -181,6 +181,14 @@ void if_new_via_zapi(struct interface *ifp)
(*ifp_master.create_hook)(ifp);
}
+void if_destroy_via_zapi(struct interface *ifp)
+{
+ if (ifp_master.destroy_hook)
+ (*ifp_master.destroy_hook)(ifp);
+
+ if_set_index(ifp, IFINDEX_INTERNAL);
+}
+
void if_up_via_zapi(struct interface *ifp)
{
if (ifp_master.up_hook)
diff --git a/lib/if.h b/lib/if.h
index bd8eb0b66..a3c6e9ff5 100644
--- a/lib/if.h
+++ b/lib/if.h
@@ -566,6 +566,7 @@ extern void if_zapi_callbacks(int (*create)(struct interface *ifp),
extern void if_new_via_zapi(struct interface *ifp);
extern void if_up_via_zapi(struct interface *ifp);
extern void if_down_via_zapi(struct interface *ifp);
+extern void if_destroy_via_zapi(struct interface *ifp);
extern const struct frr_yang_module_info frr_interface_info;
diff --git a/lib/zclient.c b/lib/zclient.c
index 0540b129b..6ba71eba4 100644
--- a/lib/zclient.c
+++ b/lib/zclient.c
@@ -1592,6 +1592,20 @@ struct interface *zebra_interface_state_read(struct stream *s, vrf_id_t vrf_id)
return ifp;
}
+static void zclient_interface_delete(struct zclient *zclient, vrf_id_t vrf_id)
+{
+ struct interface *ifp;
+ struct stream *s = zclient->ibuf;
+
+ ifp = zebra_interface_state_read(s, vrf_id);
+
+ if (ifp == NULL)
+ return;
+
+ if_destroy_via_zapi(ifp);
+ return;
+}
+
static void zclient_interface_up(struct zclient *zclient, vrf_id_t vrf_id)
{
struct interface *ifp;
@@ -2818,9 +2832,7 @@ static int zclient_read(struct thread *thread)
zclient_interface_add(zclient, vrf_id);
break;
case ZEBRA_INTERFACE_DELETE:
- if (zclient->interface_delete)
- (*zclient->interface_delete)(command, zclient, length,
- vrf_id);
+ zclient_interface_delete(zclient, vrf_id);
break;
case ZEBRA_INTERFACE_ADDRESS_ADD:
if (zclient->interface_address_add)
diff --git a/lib/zclient.h b/lib/zclient.h
index 890fa4aae..37f20a6bf 100644
--- a/lib/zclient.h
+++ b/lib/zclient.h
@@ -240,7 +240,6 @@ struct zclient {
void (*zebra_connected)(struct zclient *);
void (*zebra_capabilities)(struct zclient_capabilities *cap);
int (*router_id_update)(ZAPI_CALLBACK_ARGS);
- int (*interface_delete)(ZAPI_CALLBACK_ARGS);
int (*interface_address_add)(ZAPI_CALLBACK_ARGS);
int (*interface_address_delete)(ZAPI_CALLBACK_ARGS);
int (*interface_link_params)(ZAPI_CALLBACK_ARGS);
diff --git a/nhrpd/nhrp_interface.c b/nhrpd/nhrp_interface.c
index ecf4bd750..e4f614c7c 100644
--- a/nhrpd/nhrp_interface.c
+++ b/nhrpd/nhrp_interface.c
@@ -307,22 +307,12 @@ int nhrp_ifp_create(struct interface *ifp)
return 0;
}
-int nhrp_interface_delete(ZAPI_CALLBACK_ARGS)
+int nhrp_ifp_destroy(struct interface *ifp)
{
- struct interface *ifp;
- struct stream *s;
-
- s = zclient->ibuf;
- ifp = zebra_interface_state_read(s, vrf_id);
- if (ifp == NULL)
- return 0;
-
debugf(NHRP_DEBUG_IF, "if-delete: %s", ifp->name);
nhrp_interface_update(ifp);
- if_set_index(ifp, IFINDEX_INTERNAL);
-
return 0;
}
@@ -418,8 +408,3 @@ void nhrp_interface_set_source(struct interface *ifp, const char *ifname)
nhrp_interface_update_nbma(ifp);
}
-
-int nhrp_ifp_destroy(struct interface *ifp)
-{
- return 0;
-}
diff --git a/nhrpd/nhrp_route.c b/nhrpd/nhrp_route.c
index 84bee5761..cfca86a9b 100644
--- a/nhrpd/nhrp_route.c
+++ b/nhrpd/nhrp_route.c
@@ -345,7 +345,6 @@ void nhrp_zebra_init(void)
zclient = zclient_new(master, &zclient_options_default);
zclient->zebra_connected = nhrp_zebra_connected;
- zclient->interface_delete = nhrp_interface_delete;
zclient->interface_address_add = nhrp_interface_address_add;
zclient->interface_address_delete = nhrp_interface_address_delete;
zclient->redistribute_route_add = nhrp_route_read;
diff --git a/ospf6d/ospf6_interface.c b/ospf6d/ospf6_interface.c
index d4f3f25ac..e62efc5a0 100644
--- a/ospf6d/ospf6_interface.c
+++ b/ospf6d/ospf6_interface.c
@@ -1976,6 +1976,14 @@ static int ospf6_ifp_down(struct interface *ifp)
static int ospf6_ifp_destroy(struct interface *ifp)
{
+ if (if_is_up(ifp))
+ zlog_warn("Zebra: got delete of %s, but interface is still up",
+ ifp->name);
+
+ if (IS_OSPF6_DEBUG_ZEBRA(RECV))
+ zlog_debug("Zebra Interface delete: %s index %d mtu %d",
+ ifp->name, ifp->ifindex, ifp->mtu6);
+
return 0;
}
diff --git a/ospf6d/ospf6_zebra.c b/ospf6d/ospf6_zebra.c
index f2b86e136..d8a6a39e1 100644
--- a/ospf6d/ospf6_zebra.c
+++ b/ospf6d/ospf6_zebra.c
@@ -97,25 +97,6 @@ void ospf6_zebra_no_redistribute(int type)
AFI_IP6, type, 0, VRF_DEFAULT);
}
-static int ospf6_zebra_if_del(ZAPI_CALLBACK_ARGS)
-{
- struct interface *ifp;
-
- if (!(ifp = zebra_interface_state_read(zclient->ibuf, vrf_id)))
- return 0;
-
- if (if_is_up(ifp))
- zlog_warn("Zebra: got delete of %s, but interface is still up",
- ifp->name);
-
- if (IS_OSPF6_DEBUG_ZEBRA(RECV))
- zlog_debug("Zebra Interface delete: %s index %d mtu %d",
- ifp->name, ifp->ifindex, ifp->mtu6);
-
- if_set_index(ifp, IFINDEX_INTERNAL);
- return 0;
-}
-
static int ospf6_zebra_if_address_update_add(ZAPI_CALLBACK_ARGS)
{
struct connected *c;
@@ -551,7 +532,6 @@ void ospf6_zebra_init(struct thread_master *master)
zclient_init(zclient, ZEBRA_ROUTE_OSPF6, 0, &ospf6d_privs);
zclient->zebra_connected = ospf6_zebra_connected;
zclient->router_id_update = ospf6_router_id_update_zebra;
- zclient->interface_delete = ospf6_zebra_if_del;
zclient->interface_address_add = ospf6_zebra_if_address_update_add;
zclient->interface_address_delete =
ospf6_zebra_if_address_update_delete;
diff --git a/ospfd/ospf_interface.c b/ospfd/ospf_interface.c
index 75d6211f8..3407d1bad 100644
--- a/ospfd/ospf_interface.c
+++ b/ospfd/ospf_interface.c
@@ -51,6 +51,7 @@ DEFINE_QOBJ_TYPE(ospf_interface)
DEFINE_HOOK(ospf_vl_add, (struct ospf_vl_data * vd), (vd))
DEFINE_HOOK(ospf_vl_delete, (struct ospf_vl_data * vd), (vd))
DEFINE_HOOK(ospf_if_update, (struct interface * ifp), (ifp))
+DEFINE_HOOK(ospf_if_delete, (struct interface * ifp), (ifp))
int ospf_interface_neighbor_count(struct ospf_interface *oi)
{
@@ -1323,6 +1324,21 @@ static int ospf_ifp_down(struct interface *ifp)
static int ospf_ifp_destroy(struct interface *ifp)
{
+ struct route_node *rn;
+
+ if (IS_DEBUG_OSPF(zebra, ZEBRA_INTERFACE))
+ zlog_debug(
+ "Zebra: interface delete %s vrf %s[%u] index %d flags %llx metric %d mtu %d",
+ ifp->name, ospf_vrf_id_to_name(ifp->vrf_id),
+ ifp->vrf_id, ifp->ifindex,
+ (unsigned long long)ifp->flags, ifp->metric, ifp->mtu);
+
+ hook_call(ospf_if_delete, ifp);
+
+ for (rn = route_top(IF_OIFS(ifp)); rn; rn = route_next(rn))
+ if (rn->info)
+ ospf_if_free((struct ospf_interface *)rn->info);
+
return 0;
}
diff --git a/ospfd/ospf_interface.h b/ospfd/ospf_interface.h
index f8350c48d..cde52dbb9 100644
--- a/ospfd/ospf_interface.h
+++ b/ospfd/ospf_interface.h
@@ -327,4 +327,6 @@ DECLARE_HOOK(ospf_vl_add, (struct ospf_vl_data * vd), (vd))
DECLARE_HOOK(ospf_vl_delete, (struct ospf_vl_data * vd), (vd))
DECLARE_HOOK(ospf_if_update, (struct interface * ifp), (ifp))
+DECLARE_HOOK(ospf_if_delete, (struct interface * ifp), (ifp))
+
#endif /* _ZEBRA_OSPF_INTERFACE_H */
diff --git a/ospfd/ospf_zebra.c b/ospfd/ospf_zebra.c
index dc0501ec6..5678d545b 100644
--- a/ospfd/ospf_zebra.c
+++ b/ospfd/ospf_zebra.c
@@ -55,8 +55,6 @@ DEFINE_MTYPE_STATIC(OSPFD, OSPF_EXTERNAL, "OSPF External route table")
DEFINE_MTYPE_STATIC(OSPFD, OSPF_REDISTRIBUTE, "OSPF Redistriute")
DEFINE_MTYPE_STATIC(OSPFD, OSPF_DIST_ARGS, "OSPF Distribute arguments")
-DEFINE_HOOK(ospf_if_delete, (struct interface * ifp), (ifp))
-
/* Zebra structure to hold current status. */
struct zclient *zclient = NULL;
@@ -96,36 +94,6 @@ static int ospf_router_id_update_zebra(ZAPI_CALLBACK_ARGS)
return 0;
}
-static int ospf_interface_delete(ZAPI_CALLBACK_ARGS)
-{
- struct interface *ifp;
- struct stream *s;
- struct route_node *rn;
-
- s = zclient->ibuf;
- /* zebra_interface_state_read() updates interface structure in iflist */
- ifp = zebra_interface_state_read(s, vrf_id);
-
- if (ifp == NULL)
- return 0;
-
- if (IS_DEBUG_OSPF(zebra, ZEBRA_INTERFACE))
- zlog_debug(
- "Zebra: interface delete %s vrf %s[%u] index %d flags %llx metric %d mtu %d",
- ifp->name, ospf_vrf_id_to_name(ifp->vrf_id),
- ifp->vrf_id, ifp->ifindex,
- (unsigned long long)ifp->flags, ifp->metric, ifp->mtu);
-
- hook_call(ospf_if_delete, ifp);
-
- for (rn = route_top(IF_OIFS(ifp)); rn; rn = route_next(rn))
- if (rn->info)
- ospf_if_free((struct ospf_interface *)rn->info);
-
- if_set_index(ifp, IFINDEX_INTERNAL);
- return 0;
-}
-
static int ospf_interface_address_add(ZAPI_CALLBACK_ARGS)
{
struct connected *c;
@@ -1392,7 +1360,6 @@ void ospf_zebra_init(struct thread_master *master, unsigned short instance)
zclient_init(zclient, ZEBRA_ROUTE_OSPF, instance, &ospfd_privs);
zclient->zebra_connected = ospf_zebra_connected;
zclient->router_id_update = ospf_router_id_update_zebra;
- zclient->interface_delete = ospf_interface_delete;
zclient->interface_address_add = ospf_interface_address_add;
zclient->interface_address_delete = ospf_interface_address_delete;
zclient->interface_link_params = ospf_interface_link_params;
diff --git a/ospfd/ospf_zebra.h b/ospfd/ospf_zebra.h
index 3622d91e0..d3f8a0380 100644
--- a/ospfd/ospf_zebra.h
+++ b/ospfd/ospf_zebra.h
@@ -87,6 +87,4 @@ extern void ospf_zebra_init(struct thread_master *, unsigned short);
extern void ospf_zebra_vrf_register(struct ospf *ospf);
extern void ospf_zebra_vrf_deregister(struct ospf *ospf);
-DECLARE_HOOK(ospf_if_delete, (struct interface * ifp), (ifp))
-
#endif /* _ZEBRA_OSPF_ZEBRA_H */
diff --git a/pbrd/pbr_zebra.c b/pbrd/pbr_zebra.c
index eadc39264..2bba83738 100644
--- a/pbrd/pbr_zebra.c
+++ b/pbrd/pbr_zebra.c
@@ -72,24 +72,11 @@ int pbr_ifp_create(struct interface *ifp)
return 0;
}
-static int interface_delete(ZAPI_CALLBACK_ARGS)
+int pbr_ifp_destroy(struct interface *ifp)
{
- struct interface *ifp;
- struct stream *s;
-
- s = zclient->ibuf;
- /* zebra_interface_state_read () updates interface structure in iflist
- */
- ifp = zebra_interface_state_read(s, vrf_id);
-
- if (ifp == NULL)
- return 0;
-
DEBUGD(&pbr_dbg_zebra,
"%s: %s", __PRETTY_FUNCTION__, ifp->name);
- if_set_index(ifp, IFINDEX_INTERNAL);
-
return 0;
}
@@ -432,7 +419,6 @@ void pbr_zebra_init(void)
zclient_init(zclient, ZEBRA_ROUTE_PBR, 0, &pbr_privs);
zclient->zebra_connected = zebra_connected;
- zclient->interface_delete = interface_delete;
zclient->interface_address_add = interface_address_add;
zclient->interface_address_delete = interface_address_delete;
zclient->route_notify_owner = route_notify_owner;
@@ -561,8 +547,3 @@ void pbr_send_pbr_map(struct pbr_map_sequence *pbrms,
zclient_send_message(zclient);
}
-
-int pbr_ifp_destroy(struct interface *ifp)
-{
- return 0;
-}
diff --git a/pimd/pim_iface.c b/pimd/pim_iface.c
index 5ed5abf03..bc8dedc4f 100644
--- a/pimd/pim_iface.c
+++ b/pimd/pim_iface.c
@@ -1673,5 +1673,22 @@ int pim_ifp_down(struct interface *ifp)
int pim_ifp_destroy(struct interface *ifp)
{
+ struct pim_instance *pim;
+
+ if (PIM_DEBUG_ZEBRA) {
+ zlog_debug(
+ "%s: %s index %d(%u) flags %ld metric %d mtu %d operative %d",
+ __PRETTY_FUNCTION__, ifp->name, ifp->ifindex,
+ ifp->vrf_id, (long)ifp->flags, ifp->metric, ifp->mtu,
+ if_is_operative(ifp));
+ }
+
+ if (!if_is_operative(ifp))
+ pim_if_addr_del_all(ifp);
+
+ pim = pim_get_pim_instance(ifp->vrf_id);
+ if (pim && pim->vxlan.term_if == ifp)
+ pim_vxlan_del_term_dev(pim);
+
return 0;
}
diff --git a/pimd/pim_zebra.c b/pimd/pim_zebra.c
index 128746558..db0aedad6 100644
--- a/pimd/pim_zebra.c
+++ b/pimd/pim_zebra.c
@@ -63,35 +63,6 @@ static int pim_router_id_update_zebra(ZAPI_CALLBACK_ARGS)
return 0;
}
-static int pim_zebra_if_del(ZAPI_CALLBACK_ARGS)
-{
- struct interface *ifp;
- struct pim_instance *pim;
-
- ifp = zebra_interface_state_read(zclient->ibuf, vrf_id);
- if (!ifp)
- return 0;
-
- if (PIM_DEBUG_ZEBRA) {
- zlog_debug(
- "%s: %s index %d(%u) flags %ld metric %d mtu %d operative %d",
- __PRETTY_FUNCTION__, ifp->name, ifp->ifindex, vrf_id,
- (long)ifp->flags, ifp->metric, ifp->mtu,
- if_is_operative(ifp));
- }
-
- if (!if_is_operative(ifp))
- pim_if_addr_del_all(ifp);
-
- if_set_index(ifp, IFINDEX_INTERNAL);
-
- pim = pim_get_pim_instance(vrf_id);
- if (pim && pim->vxlan.term_if == ifp)
- pim_vxlan_del_term_dev(pim);
-
- return 0;
-}
-
static int pim_zebra_interface_vrf_update(ZAPI_CALLBACK_ARGS)
{
struct interface *ifp;
@@ -610,7 +581,6 @@ void pim_zebra_init(void)
zclient->zebra_capabilities = pim_zebra_capabilities;
zclient->zebra_connected = pim_zebra_connected;
zclient->router_id_update = pim_router_id_update_zebra;
- zclient->interface_delete = pim_zebra_if_del;
zclient->interface_address_add = pim_zebra_if_address_add;
zclient->interface_address_delete = pim_zebra_if_address_del;
zclient->interface_vrf_update = pim_zebra_interface_vrf_update;
diff --git a/ripd/rip_interface.c b/ripd/rip_interface.c
index 13b9b874e..3173277ba 100644
--- a/ripd/rip_interface.c
+++ b/ripd/rip_interface.c
@@ -411,19 +411,8 @@ static int rip_ifp_create(struct interface *ifp)
return 0;
}
-int rip_interface_delete(ZAPI_CALLBACK_ARGS)
+static int rip_ifp_destroy(struct interface *ifp)
{
- struct interface *ifp;
- struct stream *s;
-
-
- s = zclient->ibuf;
- /* zebra_interface_state_read() updates interface structure in iflist */
- ifp = zebra_interface_state_read(s, vrf_id);
-
- if (ifp == NULL)
- return 0;
-
rip_interface_sync(ifp);
if (if_is_up(ifp)) {
rip_if_down(ifp);
@@ -434,10 +423,6 @@ int rip_interface_delete(ZAPI_CALLBACK_ARGS)
ifp->name, ifp->vrf_id, ifp->ifindex,
(unsigned long long)ifp->flags, ifp->metric, ifp->mtu);
- /* To support pseudo interface do not free interface structure. */
- /* if_delete(ifp); */
- if_set_index(ifp, IFINDEX_INTERNAL);
-
return 0;
}
@@ -1229,11 +1214,6 @@ static int rip_interface_delete_hook(struct interface *ifp)
return 0;
}
-static int rip_ifp_destroy(struct interface *ifp)
-{
- return 0;
-}
-
/* Allocate and initialize interface vector. */
void rip_if_init(void)
{
diff --git a/ripd/rip_zebra.c b/ripd/rip_zebra.c
index 7b57fc79f..90ee667f0 100644
--- a/ripd/rip_zebra.c
+++ b/ripd/rip_zebra.c
@@ -238,7 +238,6 @@ void rip_zclient_init(struct thread_master *master)
zclient = zclient_new(master, &zclient_options_default);
zclient_init(zclient, ZEBRA_ROUTE_RIP, 0, &ripd_privs);
zclient->zebra_connected = rip_zebra_connected;
- zclient->interface_delete = rip_interface_delete;
zclient->interface_address_add = rip_interface_address_add;
zclient->interface_address_delete = rip_interface_address_delete;
zclient->interface_vrf_update = rip_interface_vrf_update;
diff --git a/ripngd/ripng_interface.c b/ripngd/ripng_interface.c
index 4f238f179..a132f723e 100644
--- a/ripngd/ripng_interface.c
+++ b/ripngd/ripng_interface.c
@@ -256,19 +256,8 @@ static int ripng_ifp_create(struct interface *ifp)
return 0;
}
-int ripng_interface_delete(ZAPI_CALLBACK_ARGS)
+static int ripng_ifp_destroy(struct interface *ifp)
{
- struct interface *ifp;
- struct stream *s;
-
- s = zclient->ibuf;
- /* zebra_interface_state_read() updates interface structure in iflist
- */
- ifp = zebra_interface_state_read(s, vrf_id);
-
- if (ifp == NULL)
- return 0;
-
ripng_interface_sync(ifp);
if (if_is_up(ifp)) {
ripng_if_down(ifp);
@@ -279,10 +268,6 @@ int ripng_interface_delete(ZAPI_CALLBACK_ARGS)
ifp->name, ifp->vrf_id, ifp->ifindex,
(unsigned long long)ifp->flags, ifp->metric, ifp->mtu6);
- /* To support pseudo interface do not free interface structure. */
- /* if_delete(ifp); */
- if_set_index(ifp, IFINDEX_INTERNAL);
-
return 0;
}
@@ -964,11 +949,6 @@ static struct cmd_node interface_node = {
INTERFACE_NODE, "%s(config-if)# ", 1 /* VTYSH */
};
-static int ripng_ifp_destroy(struct interface *ifp)
-{
- return 0;
-}
-
/* Initialization of interface. */
void ripng_if_init(void)
{
diff --git a/ripngd/ripng_zebra.c b/ripngd/ripng_zebra.c
index 227777681..fa61d69ca 100644
--- a/ripngd/ripng_zebra.c
+++ b/ripngd/ripng_zebra.c
@@ -242,7 +242,6 @@ void zebra_init(struct thread_master *master)
zclient_init(zclient, ZEBRA_ROUTE_RIPNG, 0, &ripngd_privs);
zclient->zebra_connected = ripng_zebra_connected;
- zclient->interface_delete = ripng_interface_delete;
zclient->interface_address_add = ripng_interface_address_add;
zclient->interface_address_delete = ripng_interface_address_delete;
zclient->interface_vrf_update = ripng_interface_vrf_update;
diff --git a/sharpd/sharp_zebra.c b/sharpd/sharp_zebra.c
index 5991b84c6..14220830c 100644
--- a/sharpd/sharp_zebra.c
+++ b/sharpd/sharp_zebra.c
@@ -52,27 +52,13 @@ static int sharp_ifp_create(struct interface *ifp)
return 0;
}
-static int interface_delete(ZAPI_CALLBACK_ARGS)
+static int sharp_ifp_destroy(struct interface *ifp)
{
- struct interface *ifp;
- struct stream *s;
-
- s = zclient->ibuf;
- /* zebra_interface_state_read () updates interface structure in iflist
- */
- ifp = zebra_interface_state_read(s, vrf_id);
-
- if (ifp == NULL)
- return 0;
-
- if_set_index(ifp, IFINDEX_INTERNAL);
-
return 0;
}
static int interface_address_add(ZAPI_CALLBACK_ARGS)
{
-
zebra_interface_address_read(cmd, zclient->ibuf, vrf_id);
return 0;
@@ -368,11 +354,6 @@ static int sharp_nexthop_update(ZAPI_CALLBACK_ARGS)
return 0;
}
-static int sharp_ifp_destroy(struct interface *ifp)
-{
- return 0;
-}
-
extern struct zebra_privs_t sharp_privs;
void sharp_zebra_init(void)
@@ -386,7 +367,6 @@ void sharp_zebra_init(void)
zclient_init(zclient, ZEBRA_ROUTE_SHARP, 0, &sharp_privs);
zclient->zebra_connected = zebra_connected;
- zclient->interface_delete = interface_delete;
zclient->interface_address_add = interface_address_add;
zclient->interface_address_delete = interface_address_delete;
zclient->route_notify_owner = route_notify_owner;
diff --git a/staticd/static_zebra.c b/staticd/static_zebra.c
index c494cf6cc..b364dd629 100644
--- a/staticd/static_zebra.c
+++ b/staticd/static_zebra.c
@@ -57,21 +57,8 @@ static int static_ifp_create(struct interface *ifp)
return 0;
}
-static int interface_delete(ZAPI_CALLBACK_ARGS)
+static int static_ifp_destroy(struct interface *ifp)
{
- struct interface *ifp;
- struct stream *s;
-
- s = zclient->ibuf;
- /* zebra_interface_state_read () updates interface structure in iflist
- */
- ifp = zebra_interface_state_read(s, vrf_id);
-
- if (ifp == NULL)
- return 0;
-
- if_set_index(ifp, IFINDEX_INTERNAL);
-
static_ifindex_update(ifp, false);
return 0;
}
@@ -476,11 +463,6 @@ extern void static_zebra_route_add(struct route_node *rn,
zclient, &api);
}
-static int static_ifp_destroy(struct interface *ifp)
-{
- return 0;
-}
-
void static_zebra_init(void)
{
struct zclient_options opt = { .receive_notify = true };
@@ -493,7 +475,6 @@ void static_zebra_init(void)
zclient_init(zclient, ZEBRA_ROUTE_STATIC, 0, &static_privs);
zclient->zebra_capabilities = static_zebra_capabilities;
zclient->zebra_connected = zebra_connected;
- zclient->interface_delete = interface_delete;
zclient->interface_address_add = interface_address_add;
zclient->interface_address_delete = interface_address_delete;
zclient->route_notify_owner = route_notify_owner;
diff --git a/vrrpd/vrrp_zebra.c b/vrrpd/vrrp_zebra.c
index 4678a2333..a6c575f8d 100644
--- a/vrrpd/vrrp_zebra.c
+++ b/vrrpd/vrrp_zebra.c
@@ -89,22 +89,12 @@ int vrrp_ifp_create(struct interface *ifp)
return 0;
}
-static int vrrp_zebra_if_del(int command, struct zclient *zclient,
- zebra_size_t length, vrf_id_t vrf_id)
+int vrrp_ifp_destroy(struct interface *ifp)
{
- struct interface *ifp;
-
- ifp = zebra_interface_state_read(zclient->ibuf, vrf_id);
-
- if (!ifp)
- return 0;
-
- vrrp_zebra_debug_if_state(ifp, vrf_id, __func__);
+ vrrp_zebra_debug_if_state(ifp, ifp->vrf_id, __func__);
vrrp_if_del(ifp);
- if_set_index(ifp, IFINDEX_INTERNAL);
-
return 0;
}
@@ -199,11 +189,6 @@ int vrrp_zclient_send_interface_protodown(struct interface *ifp, bool down)
down);
}
-int vrrp_ifp_destroy(struct interface *ifp)
-{
- return 0;
-}
-
void vrrp_zebra_init(void)
{
if_zapi_callbacks(vrrp_ifp_create, vrrp_ifp_up,
@@ -214,7 +199,6 @@ void vrrp_zebra_init(void)
zclient->zebra_connected = vrrp_zebra_connected;
zclient->router_id_update = vrrp_router_id_update_zebra;
- zclient->interface_delete = vrrp_zebra_if_del;
zclient->interface_address_add = vrrp_zebra_if_address_add;
zclient->interface_address_delete = vrrp_zebra_if_address_del;