The restricting of data about interfaces was both inconsistent
in application and allowed protocol developers to get into states where
they did not have the expected data about an interface that they
thought that they would. These restrictions and inconsistencies
keep causing bugs that have to be sorted through.
The latest iteration of this bug was that commit:
f20b478ef3d25e153939516a473bb2e80603cbd5
Has caused pim to not receive interface up notifications( but
it knows the interface is back in the vrf and it knows the
relevant ip addresses on the interface as they were changed
as part of an ifdown/ifup cycle ).
Remove this restriction and allow the interface events to
be propagated to all clients.
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
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);
+ }
}
}
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)
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);
}
{
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;
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. */
/* 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,
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));
}
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);
vrf_bitmap_free(client->redist_default[afi]);
}
- vrf_bitmap_free(client->ifinfo);
vrf_bitmap_free(client->ridinfo);
XFREE(MTYPE_TMP, client);
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 */
/* Redistribute default route flag. */
vrf_bitmap_t redist_default[AFI_MAX];
- /* Interface information. */
- vrf_bitmap_t ifinfo;
-
/* Router-id information. */
vrf_bitmap_t ridinfo;