summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRenato Westphal <renato@opensourcerouting.org>2019-01-18 16:06:00 -0200
committerRenato Westphal <renato@opensourcerouting.org>2019-01-18 16:06:00 -0200
commitf20b478ef3d25e153939516a473bb2e80603cbd5 (patch)
tree019f3bea176957a24c315d658f7a612137ede054
parent70fc94ca1d6063b64449b0971678521c021ac916 (diff)
zebra: fix checking of clients subscribed to receive interface info
client->ifinfo is a VRF bitmap, hence we need to use vrf_bitmap_check() to check if a client is subscribed to receive interface information for a particular VRF. Just checking if the client->ifinfo value is set will always succeed since it's a pointer initialized by zserv_client_create(). With this fix, we'll stop sending interface messages from all VRFs to all clients, even those that didn't subscribe to it. Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
-rw-r--r--zebra/redistribute.c6
-rw-r--r--zebra/zapi_msg.c2
-rw-r--r--zebra/zebra_ptm_redistribute.c2
3 files changed, 5 insertions, 5 deletions
diff --git a/zebra/redistribute.c b/zebra/redistribute.c
index b9c1f0aefd..c5769ae06f 100644
--- a/zebra/redistribute.c
+++ b/zebra/redistribute.c
@@ -405,7 +405,7 @@ void zebra_interface_up_update(struct interface *ifp)
if (ifp->ptm_status || !ifp->ptm_enable) {
for (ALL_LIST_ELEMENTS(zebrad.client_list, node, nnode, client))
- if (client->ifinfo) {
+ if (vrf_bitmap_check(client->ifinfo, ifp->vrf_id)) {
zsend_interface_update(ZEBRA_INTERFACE_UP,
client, ifp);
zsend_interface_link_params(client, ifp);
@@ -439,7 +439,7 @@ void zebra_interface_add_update(struct interface *ifp)
ifp->vrf_id);
for (ALL_LIST_ELEMENTS(zebrad.client_list, node, nnode, client))
- if (client->ifinfo) {
+ if (vrf_bitmap_check(client->ifinfo, ifp->vrf_id)) {
client->ifadd_cnt++;
zsend_interface_add(client, ifp);
zsend_interface_link_params(client, ifp);
@@ -812,6 +812,6 @@ void zebra_interface_parameters_update(struct interface *ifp)
ifp->name, ifp->vrf_id);
for (ALL_LIST_ELEMENTS(zebrad.client_list, node, nnode, client))
- if (client->ifinfo)
+ if (vrf_bitmap_check(client->ifinfo, ifp->vrf_id))
zsend_interface_link_params(client, ifp);
}
diff --git a/zebra/zapi_msg.c b/zebra/zapi_msg.c
index 15f9da0cba..100c9cfac0 100644
--- a/zebra/zapi_msg.c
+++ b/zebra/zapi_msg.c
@@ -209,7 +209,7 @@ 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 (!client->ifinfo) {
+ if (!vrf_bitmap_check(client->ifinfo, ifp->vrf_id)) {
stream_free(s);
return 0;
}
diff --git a/zebra/zebra_ptm_redistribute.c b/zebra/zebra_ptm_redistribute.c
index 420105198b..3acbe3bf2c 100644
--- a/zebra/zebra_ptm_redistribute.c
+++ b/zebra/zebra_ptm_redistribute.c
@@ -37,7 +37,7 @@ static int zsend_interface_bfd_update(int cmd, struct zserv *client,
struct stream *s;
/* Check this client need interface information. */
- if (!client->ifinfo)
+ if (!vrf_bitmap_check(client->ifinfo, ifp->vrf_id))
return 0;
s = stream_new(ZEBRA_MAX_PACKET_SIZ);