summaryrefslogtreecommitdiff
path: root/lib/zclient.c
diff options
context:
space:
mode:
authorSantosh P K <sapk@vmware.com>2020-01-28 22:50:27 -0800
committerSantosh P K <sapk@vmware.com>2020-01-30 10:25:52 -0800
commitbe7bbe529dcab1e63d8de92527030fb17ea2b620 (patch)
tree9b98b8e06f55cf38f84278c56afc3940e8b9946f /lib/zclient.c
parent64d50ba4c4dd6d9e6976b7528cbf9abbbaa9056e (diff)
lib: Adding GR capabilites encode and decode.
For Graceful restart clients have to send GR capabilities library functions are added to encode capabilities and also for zebra to decode client capabilities. Co-authored-by: Santosh P K <sapk@vmware.com> Co-authored-by: Soman K S <somanks@vmware.com> Signed-off-by: Santosh P K <sapk@vmware.com>
Diffstat (limited to 'lib/zclient.c')
-rw-r--r--lib/zclient.c68
1 files changed, 54 insertions, 14 deletions
diff --git a/lib/zclient.c b/lib/zclient.c
index 7ddf0085de..d879063460 100644
--- a/lib/zclient.c
+++ b/lib/zclient.c
@@ -3300,31 +3300,71 @@ void zclient_interface_set_master(struct zclient *client,
zclient_send_message(client);
}
-/* Process capabilities message from zebra */
-int zapi_capabilities_decode(struct stream *s, struct zapi_cap *api)
+/*
+ * Send capabilities message to zebra
+ */
+int32_t zclient_capabilities_send(uint32_t cmd, struct zclient *zclient,
+ struct zapi_cap *api)
{
+
+ struct stream *s;
+
+ if (zclient == NULL)
+ return -1;
+
+ s = zclient->obuf;
+ stream_reset(s);
+ zclient_create_header(s, cmd, 0);
+ stream_putl(s, api->cap);
+
+ switch (api->cap) {
+ case ZEBRA_CLIENT_GR_CAPABILITIES:
+ case ZEBRA_CLIENT_RIB_STALE_TIME:
+ stream_putl(s, api->stale_removal_time);
+ stream_putl(s, api->vrf_id);
+ break;
+ case ZEBRA_CLIENT_ROUTE_UPDATE_COMPLETE:
+ case ZEBRA_CLIENT_ROUTE_UPDATE_PENDING:
+ stream_putl(s, api->afi);
+ stream_putl(s, api->safi);
+ stream_putl(s, api->vrf_id);
+ break;
+ case ZEBRA_CLIENT_GR_DISABLE:
+ stream_putl(s, api->vrf_id);
+ break;
+ }
+
+ /* Put length at the first point of the stream */
+ stream_putw_at(s, 0, stream_get_endp(s));
+
+ return zclient_send_message(zclient);
+}
+
+/*
+ * Process capabilities message from zebra
+ */
+int32_t zapi_capabilities_decode(struct stream *s, struct zapi_cap *api)
+{
+
memset(api, 0, sizeof(*api));
STREAM_GETL(s, api->cap);
switch (api->cap) {
case ZEBRA_CLIENT_GR_CAPABILITIES:
case ZEBRA_CLIENT_RIB_STALE_TIME:
- STREAM_GETL(s, api->stale_removal_time);
- STREAM_GETL(s, api->vrf_id);
- break;
+ STREAM_GETL(s, api->stale_removal_time);
+ STREAM_GETL(s, api->vrf_id);
+ break;
case ZEBRA_CLIENT_ROUTE_UPDATE_COMPLETE:
case ZEBRA_CLIENT_ROUTE_UPDATE_PENDING:
- STREAM_GETL(s, api->afi);
- STREAM_GETL(s, api->safi);
- STREAM_GETL(s, api->vrf_id);
- break;
+ STREAM_GETL(s, api->afi);
+ STREAM_GETL(s, api->safi);
+ STREAM_GETL(s, api->vrf_id);
+ break;
case ZEBRA_CLIENT_GR_DISABLE:
- STREAM_GETL(s, api->vrf_id);
- break;
- default:
- break;
+ STREAM_GETL(s, api->vrf_id);
+ break;
}
-
stream_failure:
return 0;
}