mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-07 17:18:56 +00:00
Zebra: Default route distribute handling.
When default route is requested from client, default route is sent to client if present. When route gets deleted then delete is sent to clients. Signed-off-by: Santosh P K <sapk@vmware.com>
This commit is contained in:
parent
cd05906c41
commit
14fe366eab
@ -150,6 +150,43 @@ static void zebra_redistribute(struct zserv *client, int type,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Function to check if prefix is candidate for
|
||||||
|
* redistribute.
|
||||||
|
*/
|
||||||
|
static bool zebra_redistribute_check(const struct route_entry *re,
|
||||||
|
struct zserv *client,
|
||||||
|
const struct prefix *p, int afi)
|
||||||
|
{
|
||||||
|
/* Process only if there is valid re */
|
||||||
|
if (!re)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
/* If default route and redistributed */
|
||||||
|
if (is_default_prefix(p)
|
||||||
|
&& vrf_bitmap_check(client->redist_default[afi], re->vrf_id))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
/* If redistribute in enabled for zebra route all */
|
||||||
|
if (vrf_bitmap_check(client->redist[afi][ZEBRA_ROUTE_ALL], re->vrf_id))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If multi-instance then check for route
|
||||||
|
* redistribution for given instance.
|
||||||
|
*/
|
||||||
|
if (re->instance
|
||||||
|
&& redist_check_instance(&client->mi_redist[afi][re->type],
|
||||||
|
re->instance))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
/* If redistribution is enabled for give route type. */
|
||||||
|
if (vrf_bitmap_check(client->redist[afi][re->type], re->vrf_id))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/* Either advertise a route for redistribution to registered clients or */
|
/* Either advertise a route for redistribution to registered clients or */
|
||||||
/* withdraw redistribution if add cannot be done for client */
|
/* withdraw redistribution if add cannot be done for client */
|
||||||
void redistribute_update(const struct prefix *p, const struct prefix *src_p,
|
void redistribute_update(const struct prefix *p, const struct prefix *src_p,
|
||||||
@ -158,7 +195,6 @@ void redistribute_update(const struct prefix *p, const struct prefix *src_p,
|
|||||||
{
|
{
|
||||||
struct listnode *node, *nnode;
|
struct listnode *node, *nnode;
|
||||||
struct zserv *client;
|
struct zserv *client;
|
||||||
int send_redistribute;
|
|
||||||
int afi;
|
int afi;
|
||||||
char buf[PREFIX_STRLEN];
|
char buf[PREFIX_STRLEN];
|
||||||
|
|
||||||
@ -185,25 +221,7 @@ void redistribute_update(const struct prefix *p, const struct prefix *src_p,
|
|||||||
|
|
||||||
|
|
||||||
for (ALL_LIST_ELEMENTS(zrouter.client_list, node, nnode, client)) {
|
for (ALL_LIST_ELEMENTS(zrouter.client_list, node, nnode, client)) {
|
||||||
send_redistribute = 0;
|
if (zebra_redistribute_check(re, client, p, afi)) {
|
||||||
|
|
||||||
if (is_default_prefix(p)
|
|
||||||
&& vrf_bitmap_check(client->redist_default[afi],
|
|
||||||
re->vrf_id))
|
|
||||||
send_redistribute = 1;
|
|
||||||
else if (vrf_bitmap_check(client->redist[afi][ZEBRA_ROUTE_ALL],
|
|
||||||
re->vrf_id))
|
|
||||||
send_redistribute = 1;
|
|
||||||
else if (re->instance
|
|
||||||
&& redist_check_instance(
|
|
||||||
&client->mi_redist[afi][re->type],
|
|
||||||
re->instance))
|
|
||||||
send_redistribute = 1;
|
|
||||||
else if (vrf_bitmap_check(client->redist[afi][re->type],
|
|
||||||
re->vrf_id))
|
|
||||||
send_redistribute = 1;
|
|
||||||
|
|
||||||
if (send_redistribute) {
|
|
||||||
if (IS_ZEBRA_DEBUG_RIB) {
|
if (IS_ZEBRA_DEBUG_RIB) {
|
||||||
zlog_debug(
|
zlog_debug(
|
||||||
"%s: client %s %s(%u), type=%d, distance=%d, metric=%d",
|
"%s: client %s %s(%u), type=%d, distance=%d, metric=%d",
|
||||||
@ -215,18 +233,9 @@ void redistribute_update(const struct prefix *p, const struct prefix *src_p,
|
|||||||
}
|
}
|
||||||
zsend_redistribute_route(ZEBRA_REDISTRIBUTE_ROUTE_ADD,
|
zsend_redistribute_route(ZEBRA_REDISTRIBUTE_ROUTE_ADD,
|
||||||
client, p, src_p, re);
|
client, p, src_p, re);
|
||||||
} else if (prev_re
|
} else if (zebra_redistribute_check(prev_re, client, p, afi))
|
||||||
&& ((re->instance
|
|
||||||
&& redist_check_instance(
|
|
||||||
&client->mi_redist[afi]
|
|
||||||
[prev_re->type],
|
|
||||||
re->instance))
|
|
||||||
|| vrf_bitmap_check(
|
|
||||||
client->redist[afi][prev_re->type],
|
|
||||||
re->vrf_id))) {
|
|
||||||
zsend_redistribute_route(ZEBRA_REDISTRIBUTE_ROUTE_DEL,
|
zsend_redistribute_route(ZEBRA_REDISTRIBUTE_ROUTE_DEL,
|
||||||
client, p, src_p, prev_re);
|
client, p, src_p, prev_re);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -294,46 +303,21 @@ void redistribute_delete(const struct prefix *p, const struct prefix *src_p,
|
|||||||
/* Do not send unsolicited messages to synchronous clients. */
|
/* Do not send unsolicited messages to synchronous clients. */
|
||||||
if (client->synchronous)
|
if (client->synchronous)
|
||||||
continue;
|
continue;
|
||||||
|
/*
|
||||||
if (new_re) {
|
* Skip this client if it will receive an update for the
|
||||||
/* Skip this client if it will receive an update for the
|
* 'new' re
|
||||||
* 'new' re
|
*/
|
||||||
*/
|
if (zebra_redistribute_check(new_re, client, p, afi))
|
||||||
if (is_default_prefix(p)
|
continue;
|
||||||
&& vrf_bitmap_check(client->redist_default[afi],
|
|
||||||
new_re->vrf_id))
|
|
||||||
continue;
|
|
||||||
else if (vrf_bitmap_check(
|
|
||||||
client->redist[afi][ZEBRA_ROUTE_ALL],
|
|
||||||
new_re->vrf_id))
|
|
||||||
continue;
|
|
||||||
else if (new_re->instance
|
|
||||||
&& redist_check_instance(
|
|
||||||
&client->mi_redist[afi][new_re->type],
|
|
||||||
new_re->instance))
|
|
||||||
continue;
|
|
||||||
else if (vrf_bitmap_check(
|
|
||||||
client->redist[afi][new_re->type],
|
|
||||||
new_re->vrf_id))
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Send a delete for the 'old' re to any subscribed client. */
|
/* Send a delete for the 'old' re to any subscribed client. */
|
||||||
if (old_re
|
if (zebra_redistribute_check(old_re, client, p, afi))
|
||||||
&& (vrf_bitmap_check(client->redist[afi][ZEBRA_ROUTE_ALL],
|
|
||||||
old_re->vrf_id)
|
|
||||||
|| (old_re->instance
|
|
||||||
&& redist_check_instance(
|
|
||||||
&client->mi_redist[afi][old_re->type],
|
|
||||||
old_re->instance))
|
|
||||||
|| vrf_bitmap_check(client->redist[afi][old_re->type],
|
|
||||||
old_re->vrf_id))) {
|
|
||||||
zsend_redistribute_route(ZEBRA_REDISTRIBUTE_ROUTE_DEL,
|
zsend_redistribute_route(ZEBRA_REDISTRIBUTE_ROUTE_DEL,
|
||||||
client, p, src_p, old_re);
|
client, p, src_p, old_re);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void zebra_redistribute_add(ZAPI_HANDLER_ARGS)
|
void zebra_redistribute_add(ZAPI_HANDLER_ARGS)
|
||||||
{
|
{
|
||||||
afi_t afi = 0;
|
afi_t afi = 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user