summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bgpd/bgp_zebra.c37
-rw-r--r--lib/log.c2
-rw-r--r--lib/zclient.c68
-rw-r--r--lib/zclient.h38
4 files changed, 77 insertions, 68 deletions
diff --git a/bgpd/bgp_zebra.c b/bgpd/bgp_zebra.c
index 03d5cd984f..ccb888cf53 100644
--- a/bgpd/bgp_zebra.c
+++ b/bgpd/bgp_zebra.c
@@ -3102,43 +3102,6 @@ int bgp_zebra_update(afi_t afi, safi_t safi, vrf_id_t vrf_id, int type)
}
-int 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;
- default:
- break;
- }
-
- /* Put length at the first point of the stream */
- stream_putw_at(s, 0, stream_get_endp(s));
-
- return zclient_send_message(zclient);
-}
-
/* Send RIB stale timer update */
int bgp_zebra_stale_timer_update(struct bgp *bgp)
{
diff --git a/lib/log.c b/lib/log.c
index 798b776d00..d7034ce930 100644
--- a/lib/log.c
+++ b/lib/log.c
@@ -1094,7 +1094,7 @@ static const struct zebra_desc_table command_types[] = {
DESC_ENTRY(ZEBRA_VXLAN_SG_DEL),
DESC_ENTRY(ZEBRA_VXLAN_SG_REPLAY),
DESC_ENTRY(ZEBRA_ERROR),
-};
+ DESC_ENTRY(ZEBRA_CLIENT_CAPABILITIES)};
#undef DESC_ENTRY
static const struct zebra_desc_table unknown = {0, "unknown", '?'};
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;
}
diff --git a/lib/zclient.h b/lib/zclient.h
index bbc70c3835..9a230d3f34 100644
--- a/lib/zclient.h
+++ b/lib/zclient.h
@@ -73,13 +73,17 @@ typedef uint16_t zebra_size_t;
#define ZEBRA_FEC_REGISTER_LABEL 0x1
#define ZEBRA_FEC_REGISTER_LABEL_INDEX 0x2
-/* Client Graceful Restart */
-#define ZEBRA_CLIENT_GR_CAPABILITIES 0x1
-#define ZEBRA_CLIENT_ROUTE_UPDATE_COMPLETE 0x2
-#define ZEBRA_CLIENT_ROUTE_UPDATE_PENDING 0x3
-#define ZEBRA_CLIENT_GR_DISABLE 0x4
-#define ZEBRA_CLIENT_RIB_STALE_TIME 0x5
-#define ZEBRA_CLIENT_GR_ENABLED(X) (X & ZEBRA_CLIENT_GR_CAPABILITIES)
+/* Client capabilities */
+enum zserv_client_capabilities {
+ ZEBRA_CLIENT_GR_CAPABILITIES = 1,
+ ZEBRA_CLIENT_ROUTE_UPDATE_COMPLETE = 2,
+ ZEBRA_CLIENT_ROUTE_UPDATE_PENDING = 3,
+ ZEBRA_CLIENT_GR_DISABLE = 4,
+ ZEBRA_CLIENT_RIB_STALE_TIME
+};
+
+/* Macro to check if there GR enabled. */
+#define ZEBRA_CLIENT_GR_ENABLED(X) (X == ZEBRA_CLIENT_GR_CAPABILITIES)
extern struct sockaddr_storage zclient_addr;
extern socklen_t zclient_addr_len;
@@ -196,7 +200,7 @@ typedef enum {
} zebra_message_types_t;
enum zebra_error_types {
- ZEBRA_UNKNOWN_ERROR, /* Error of unknown type */
+ ZEBRA_UNKNOWN_ERROR, /* Error of unknown type */
ZEBRA_NO_VRF, /* Vrf in header was not found */
ZEBRA_INVALID_MSG_TYPE, /* No handler found for msg type */
};
@@ -233,11 +237,11 @@ struct zclient_capabilities {
/* Graceful Restart Capabilities message */
struct zapi_cap {
- uint32_t cap;
- uint32_t stale_removal_time;
- afi_t afi;
- safi_t safi;
- vrf_id_t vrf_id;
+ enum zserv_client_capabilities cap;
+ uint32_t stale_removal_time;
+ afi_t afi;
+ safi_t safi;
+ vrf_id_t vrf_id;
};
/* Structure for the zebra client. */
@@ -777,6 +781,11 @@ extern bool zapi_nexthop_update_decode(struct stream *s,
/* Decode the zebra error message */
extern bool zapi_error_decode(struct stream *s, enum zebra_error_types *error);
+/* Encode and decode restart capabilities */
+extern int32_t zclient_capabilities_send(uint32_t cmd, struct zclient *zclient,
+ struct zapi_cap *api);
+extern int32_t zapi_capabilities_decode(struct stream *s, struct zapi_cap *api);
+
static inline void zapi_route_set_blackhole(struct zapi_route *api,
enum blackhole_type bh_type)
{
@@ -794,7 +803,4 @@ extern void zclient_send_mlag_deregister(struct zclient *client);
extern void zclient_send_mlag_data(struct zclient *client,
struct stream *client_s);
-extern int zclient_capabilities_send(uint32_t cmd, struct zclient *zclient,
- struct zapi_cap *api);
-extern int zapi_capabilities_decode(struct stream *s, struct zapi_cap *api);
#endif /* _ZEBRA_ZCLIENT_H */