summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/zclient.c8
-rw-r--r--pimd/pim_zebra.c22
-rw-r--r--zebra/redistribute.c25
-rw-r--r--zebra/zapi_msg.c11
-rw-r--r--zebra/zebra_ptm_redistribute.c4
-rw-r--r--zebra/zserv.c2
-rw-r--r--zebra/zserv.h3
7 files changed, 35 insertions, 40 deletions
diff --git a/lib/zclient.c b/lib/zclient.c
index a01da77669..9db1dd74f2 100644
--- a/lib/zclient.c
+++ b/lib/zclient.c
@@ -414,9 +414,6 @@ void zclient_send_reg_requests(struct zclient *zclient, vrf_id_t vrf_id)
/* We need router-id information. */
zebra_message_send(zclient, ZEBRA_ROUTER_ID_ADD, vrf_id);
- /* We need interface information. */
- zebra_message_send(zclient, ZEBRA_INTERFACE_ADD, vrf_id);
-
/* Set unwanted redistribute route. */
for (afi = AFI_IP; afi < AFI_MAX; afi++)
vrf_bitmap_set(zclient->redist[afi][zclient->redist_default],
@@ -481,9 +478,6 @@ void zclient_send_dereg_requests(struct zclient *zclient, vrf_id_t vrf_id)
/* We need router-id information. */
zebra_message_send(zclient, ZEBRA_ROUTER_ID_DELETE, vrf_id);
- /* We need interface information. */
- zebra_message_send(zclient, ZEBRA_INTERFACE_DELETE, vrf_id);
-
/* Set unwanted redistribute route. */
for (afi = AFI_IP; afi < AFI_MAX; afi++)
vrf_bitmap_unset(zclient->redist[afi][zclient->redist_default],
@@ -596,6 +590,8 @@ int zclient_start(struct zclient *zclient)
zebra_hello_send(zclient);
+ zebra_message_send(zclient, ZEBRA_INTERFACE_ADD, VRF_DEFAULT);
+
/* Inform the successful connection. */
if (zclient->zebra_connected)
(*zclient->zebra_connected)(zclient);
diff --git a/pimd/pim_zebra.c b/pimd/pim_zebra.c
index b7111cf7bf..11ca6e8a10 100644
--- a/pimd/pim_zebra.c
+++ b/pimd/pim_zebra.c
@@ -267,6 +267,27 @@ static int pim_zebra_if_state_down(int command, struct zclient *zclient,
return 0;
}
+static int pim_zebra_interface_vrf_update(int command, struct zclient *zclient,
+ zebra_size_t length, vrf_id_t vrf_id)
+{
+ struct interface *ifp;
+ vrf_id_t new_vrf_id;
+
+ ifp = zebra_interface_vrf_update_read(zclient->ibuf, vrf_id,
+ &new_vrf_id);
+ if (!ifp)
+ return 0;
+
+ if (PIM_DEBUG_ZEBRA)
+ zlog_debug("%s: %s updating from %u to %u",
+ __PRETTY_FUNCTION__,
+ ifp->name, vrf_id, new_vrf_id);
+
+ if_update_to_new_vrf(ifp, new_vrf_id);
+
+ return 0;
+}
+
#ifdef PIM_DEBUG_IFADDR_DUMP
static void dump_if_address(struct interface *ifp)
{
@@ -762,6 +783,7 @@ void pim_zebra_init(void)
zclient->interface_down = pim_zebra_if_state_down;
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;
zclient->nexthop_update = pim_parse_nexthop_update;
zclient_init(zclient, ZEBRA_ROUTE_PIM, 0, &pimd_privs);
diff --git a/zebra/redistribute.c b/zebra/redistribute.c
index 9c3002e775..f98a4c02c3 100644
--- a/zebra/redistribute.c
+++ b/zebra/redistribute.c
@@ -406,12 +406,11 @@ void zebra_interface_up_update(struct interface *ifp)
if (ifp->ptm_status || !ifp->ptm_enable) {
for (ALL_LIST_ELEMENTS(zrouter.client_list, node, nnode,
- client))
- if (vrf_bitmap_check(client->ifinfo, ifp->vrf_id)) {
- zsend_interface_update(ZEBRA_INTERFACE_UP,
- client, ifp);
- zsend_interface_link_params(client, ifp);
- }
+ client)) {
+ zsend_interface_update(ZEBRA_INTERFACE_UP,
+ client, ifp);
+ zsend_interface_link_params(client, ifp);
+ }
}
}
@@ -440,12 +439,11 @@ void zebra_interface_add_update(struct interface *ifp)
zlog_debug("MESSAGE: ZEBRA_INTERFACE_ADD %s(%u)", ifp->name,
ifp->vrf_id);
- for (ALL_LIST_ELEMENTS(zrouter.client_list, node, nnode, client))
- if (vrf_bitmap_check(client->ifinfo, ifp->vrf_id)) {
- client->ifadd_cnt++;
- zsend_interface_add(client, ifp);
- zsend_interface_link_params(client, ifp);
- }
+ for (ALL_LIST_ELEMENTS(zrouter.client_list, node, nnode, client)) {
+ client->ifadd_cnt++;
+ zsend_interface_add(client, ifp);
+ zsend_interface_link_params(client, ifp);
+ }
}
void zebra_interface_delete_update(struct interface *ifp)
@@ -814,6 +812,5 @@ void zebra_interface_parameters_update(struct interface *ifp)
ifp->name, ifp->vrf_id);
for (ALL_LIST_ELEMENTS(zrouter.client_list, node, nnode, client))
- if (vrf_bitmap_check(client->ifinfo, ifp->vrf_id))
- zsend_interface_link_params(client, ifp);
+ zsend_interface_link_params(client, ifp);
}
diff --git a/zebra/zapi_msg.c b/zebra/zapi_msg.c
index 611d859aaa..3bf03039b1 100644
--- a/zebra/zapi_msg.c
+++ b/zebra/zapi_msg.c
@@ -209,12 +209,6 @@ int zsend_interface_link_params(struct zserv *client, struct interface *ifp)
{
struct stream *s = stream_new(ZEBRA_MAX_PACKET_SIZ);
- /* Check this client need interface information. */
- if (!vrf_bitmap_check(client->ifinfo, ifp->vrf_id)) {
- stream_free(s);
- return 0;
- }
-
if (!ifp->link_params) {
stream_free(s);
return 0;
@@ -1317,9 +1311,6 @@ static void zread_interface_add(ZAPI_HANDLER_ARGS)
struct vrf *vrf;
struct interface *ifp;
- /* Interface information is needed. */
- vrf_bitmap_set(client->ifinfo, zvrf_id(zvrf));
-
RB_FOREACH (vrf, vrf_id_head, &vrfs_by_id) {
FOR_ALL_INTERFACES (vrf, ifp) {
/* Skip pseudo interface. */
@@ -1336,7 +1327,6 @@ static void zread_interface_add(ZAPI_HANDLER_ARGS)
/* Unregister zebra server interface information. */
static void zread_interface_delete(ZAPI_HANDLER_ARGS)
{
- vrf_bitmap_unset(client->ifinfo, zvrf_id(zvrf));
}
void zserv_nexthop_num_warn(const char *caller, const struct prefix *p,
@@ -1731,7 +1721,6 @@ static void zread_vrf_unregister(ZAPI_HANDLER_ARGS)
vrf_bitmap_unset(client->redist[afi][i], zvrf_id(zvrf));
vrf_bitmap_unset(client->redist_default[afi], zvrf_id(zvrf));
}
- vrf_bitmap_unset(client->ifinfo, zvrf_id(zvrf));
vrf_bitmap_unset(client->ridinfo, zvrf_id(zvrf));
}
diff --git a/zebra/zebra_ptm_redistribute.c b/zebra/zebra_ptm_redistribute.c
index 0c24c732a4..01d5114b9f 100644
--- a/zebra/zebra_ptm_redistribute.c
+++ b/zebra/zebra_ptm_redistribute.c
@@ -36,10 +36,6 @@ static int zsend_interface_bfd_update(int cmd, struct zserv *client,
int blen;
struct stream *s;
- /* Check this client need interface information. */
- if (!vrf_bitmap_check(client->ifinfo, ifp->vrf_id))
- return 0;
-
s = stream_new(ZEBRA_MAX_PACKET_SIZ);
zclient_create_header(s, cmd, vrf_id);
diff --git a/zebra/zserv.c b/zebra/zserv.c
index e4fc348b1a..ad052d6a70 100644
--- a/zebra/zserv.c
+++ b/zebra/zserv.c
@@ -626,7 +626,6 @@ static void zserv_client_free(struct zserv *client)
vrf_bitmap_free(client->redist_default[afi]);
}
- vrf_bitmap_free(client->ifinfo);
vrf_bitmap_free(client->ridinfo);
XFREE(MTYPE_TMP, client);
@@ -710,7 +709,6 @@ static struct zserv *zserv_client_create(int sock)
client->redist[afi][i] = vrf_bitmap_init();
client->redist_default[afi] = vrf_bitmap_init();
}
- client->ifinfo = vrf_bitmap_init();
client->ridinfo = vrf_bitmap_init();
/* by default, it's not a synchronous client */
diff --git a/zebra/zserv.h b/zebra/zserv.h
index f7c4e3df73..ac016e65f3 100644
--- a/zebra/zserv.h
+++ b/zebra/zserv.h
@@ -89,9 +89,6 @@ struct zserv {
/* Redistribute default route flag. */
vrf_bitmap_t redist_default[AFI_MAX];
- /* Interface information. */
- vrf_bitmap_t ifinfo;
-
/* Router-id information. */
vrf_bitmap_t ridinfo;