From f20b478ef3d25e153939516a473bb2e80603cbd5 Mon Sep 17 00:00:00 2001 From: Renato Westphal Date: Fri, 18 Jan 2019 16:06:00 -0200 Subject: [PATCH] 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 --- zebra/redistribute.c | 6 +++--- zebra/zapi_msg.c | 2 +- zebra/zebra_ptm_redistribute.c | 2 +- 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); -- 2.39.5