]> git.puffer.fish Git - matthieu/frr.git/commitdiff
lib: Adding GR capabilites encode and decode.
authorSantosh P K <sapk@vmware.com>
Wed, 29 Jan 2020 06:50:27 +0000 (22:50 -0800)
committerSantosh P K <sapk@vmware.com>
Thu, 30 Jan 2020 18:25:52 +0000 (10:25 -0800)
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>
bgpd/bgp_zebra.c
lib/log.c
lib/zclient.c
lib/zclient.h

index 03d5cd984fd6c3dddad93ab5cfa37fc5349e6712..ccb888cf53a5b883e481a46a606d5ef09768e5bc 100644 (file)
@@ -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)
 {
index 798b776d0074f479dda58a1f2a4263d403ea21af..d7034ce9308a263c641f0034a656b1aa2e01d591 100644 (file)
--- 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", '?'};
index 7ddf0085dee82257230518cbab5208d1fba7d12e..d879063460569a5f4f4f46af545e8e7da2790526 100644 (file)
@@ -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;
 }
index bbc70c3835989541d4da368b9ad482ec3c7766a7..9a230d3f3491b286ee03b1582c1f825bb84419f3 100644 (file)
@@ -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 */