summaryrefslogtreecommitdiff
path: root/zebra/redistribute.c
diff options
context:
space:
mode:
authorSantosh P K <sapk@vmware.com>2020-04-07 07:02:21 -0700
committerSantosh P K <sapk@vmware.com>2020-04-07 10:12:14 -0700
commit14fe366eab6568776e72f1d0df1d56e13d81bd24 (patch)
treee19b65375048de30741cff2f6b9b6757cdf519f8 /zebra/redistribute.c
parentcd05906c41aaaf94e06fa9d14a7634bdffd99ed0 (diff)
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>
Diffstat (limited to 'zebra/redistribute.c')
-rw-r--r--zebra/redistribute.c110
1 files changed, 47 insertions, 63 deletions
diff --git a/zebra/redistribute.c b/zebra/redistribute.c
index 115a69f2c8..4d6346151a 100644
--- a/zebra/redistribute.c
+++ b/zebra/redistribute.c
@@ -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 */
/* withdraw redistribution if add cannot be done for client */
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 zserv *client;
- int send_redistribute;
int afi;
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)) {
- send_redistribute = 0;
-
- 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 (zebra_redistribute_check(re, client, p, afi)) {
if (IS_ZEBRA_DEBUG_RIB) {
zlog_debug(
"%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,
client, p, src_p, re);
- } else if (prev_re
- && ((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))) {
+ } else if (zebra_redistribute_check(prev_re, client, p, afi))
zsend_redistribute_route(ZEBRA_REDISTRIBUTE_ROUTE_DEL,
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. */
if (client->synchronous)
continue;
-
- if (new_re) {
- /* Skip this client if it will receive an update for the
- * 'new' re
- */
- if (is_default_prefix(p)
- && 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;
- }
+ /*
+ * Skip this client if it will receive an update for the
+ * 'new' re
+ */
+ if (zebra_redistribute_check(new_re, client, p, afi))
+ continue;
/* Send a delete for the 'old' re to any subscribed client. */
- if (old_re
- && (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))) {
+ if (zebra_redistribute_check(old_re, client, p, afi))
zsend_redistribute_route(ZEBRA_REDISTRIBUTE_ROUTE_DEL,
client, p, src_p, old_re);
- }
}
}
+
void zebra_redistribute_add(ZAPI_HANDLER_ARGS)
{
afi_t afi = 0;