}
-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)
{
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", '?'};
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;
}
#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;
} 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 */
};
/* 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. */
/* 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)
{
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 */