]> git.proxmox.com Git - mirror_frr.git/blobdiff - lib/zclient.h
bgpd: dynamic mpls label pool
[mirror_frr.git] / lib / zclient.h
index d8a70c6cf339a263774152eee3f5dfc59b946c0d..e85eac73fb322b57b020f4693ea02047142d2074 100644 (file)
@@ -37,7 +37,7 @@
 #include "pw.h"
 
 /* For input/output buffer to zebra. */
-#define ZEBRA_MAX_PACKET_SIZ          4096
+#define ZEBRA_MAX_PACKET_SIZ          16384
 
 /* Zebra header size. */
 #define ZEBRA_HEADER_SIZE             10
@@ -129,10 +129,16 @@ typedef enum {
        ZEBRA_PW_SET,
        ZEBRA_PW_UNSET,
        ZEBRA_PW_STATUS_UPDATE,
+       ZEBRA_RULE_ADD,
+       ZEBRA_RULE_DELETE,
+       ZEBRA_RULE_NOTIFY_OWNER,
+       ZEBRA_TABLE_MANAGER_CONNECT,
+       ZEBRA_GET_TABLE_CHUNK,
+       ZEBRA_RELEASE_TABLE_CHUNK,
 } zebra_message_types_t;
 
 struct redist_proto {
-       u_char enabled;
+       uint8_t enabled;
        struct list *instances;
 };
 
@@ -170,8 +176,8 @@ struct zclient {
        struct thread *t_write;
 
        /* Redistribute information. */
-       u_char redist_default; /* clients protocol */
-       u_short instance;
+       uint8_t redist_default; /* clients protocol */
+       unsigned short instance;
        struct redist_proto mi_redist[AFI_MAX][ZEBRA_ROUTE_MAX];
        vrf_bitmap_t redist[AFI_MAX][ZEBRA_ROUTE_MAX];
 
@@ -213,8 +219,12 @@ struct zclient {
        int (*local_macip_add)(int, struct zclient *, uint16_t, vrf_id_t);
        int (*local_macip_del)(int, struct zclient *, uint16_t, vrf_id_t);
        int (*pw_status_update)(int, struct zclient *, uint16_t, vrf_id_t);
-       int (*notify_owner)(int command, struct zclient *zclient,
-                           uint16_t length, vrf_id_t vrf_id);
+       int (*route_notify_owner)(int command, struct zclient *zclient,
+                                 uint16_t length, vrf_id_t vrf_id);
+       int (*rule_notify_owner)(int command, struct zclient *zclient,
+                                uint16_t length, vrf_id_t vrf_id);
+       void (*label_chunk)(int command, struct zclient *zclient,
+                               uint16_t length, vrf_id_t vrf_id);
 };
 
 /* Zebra API message flag. */
@@ -225,15 +235,20 @@ struct zclient {
 #define ZAPI_MESSAGE_MTU      0x10
 #define ZAPI_MESSAGE_SRCPFX   0x20
 #define ZAPI_MESSAGE_LABEL    0x40
+/*
+ * This should only be used by a DAEMON that needs to communicate
+ * the table being used is not in the VRF.  You must pass the
+ * default vrf, else this will be ignored.
+ */
+#define ZAPI_MESSAGE_TABLEID  0x80
 
+#define ZSERV_VERSION 5
 /* Zserv protocol message header */
-struct zserv_header {
+struct zmsghdr {
        uint16_t length;
-       uint8_t marker; /* corresponds to command field in old zserv
-                        * always set to 255 in new zserv.
-                        */
+       /* Always set to 255 in new zserv */
+       uint8_t marker;
        uint8_t version;
-#define ZSERV_VERSION  5
        vrf_id_t vrf_id;
        uint16_t command;
 };
@@ -260,12 +275,12 @@ struct zapi_nexthop {
  * to encode/decode.
  */
 struct zapi_route {
-       u_char type;
-       u_short instance;
+       uint8_t type;
+       unsigned short instance;
 
-       u_int32_t flags;
+       uint32_t flags;
 
-       u_char message;
+       uint8_t message;
 
        /*
         * This is an enum but we are going to treat it as a uint8_t
@@ -276,49 +291,51 @@ struct zapi_route {
        struct prefix prefix;
        struct prefix_ipv6 src_prefix;
 
-       u_int16_t nexthop_num;
+       uint16_t nexthop_num;
        struct zapi_nexthop nexthops[MULTIPATH_NUM];
 
-       u_char distance;
+       uint8_t distance;
 
-       u_int32_t metric;
+       uint32_t metric;
 
        route_tag_t tag;
 
-       u_int32_t mtu;
+       uint32_t mtu;
 
        vrf_id_t vrf_id;
 
+       uint32_t tableid;
+
        struct ethaddr rmac;
 };
 
 /* Zebra IPv4 route message API. */
 struct zapi_ipv4 {
-       u_char type;
-       u_short instance;
+       uint8_t type;
+       unsigned short instance;
 
-       u_int32_t flags;
+       uint32_t flags;
 
-       u_char message;
+       uint8_t message;
 
        safi_t safi;
 
-       u_char nexthop_num;
+       uint8_t nexthop_num;
        struct in_addr **nexthop;
 
-       u_char ifindex_num;
+       uint8_t ifindex_num;
        ifindex_t *ifindex;
 
-       u_char label_num;
+       uint8_t label_num;
        unsigned int *label;
 
-       u_char distance;
+       uint8_t distance;
 
-       u_int32_t metric;
+       uint32_t metric;
 
        route_tag_t tag;
 
-       u_int32_t mtu;
+       uint32_t mtu;
 
        vrf_id_t vrf_id;
 };
@@ -346,6 +363,14 @@ enum zapi_route_notify_owner {
        ZAPI_ROUTE_FAIL_INSTALL,
        ZAPI_ROUTE_BETTER_ADMIN_WON,
        ZAPI_ROUTE_INSTALLED,
+       ZAPI_ROUTE_REMOVED,
+       ZAPI_ROUTE_REMOVE_FAIL,
+};
+
+enum zapi_rule_notify_owner {
+       ZAPI_RULE_FAIL_INSTALL,
+       ZAPI_RULE_INSTALLED,
+       ZAPI_RULE_REMOVED,
 };
 
 /* Zebra MAC types */
@@ -359,19 +384,23 @@ struct zclient_options {
 /* Prototypes of zebra client service functions. */
 extern struct zclient *zclient_new(struct thread_master *);
 
-#if CONFDATE > 20181101
+/* clang-format off */
+#if defined(VERSION_TYPE_DEV) && CONFDATE > 20181101
 CPP_NOTICE("zclient_new_notify can take over or zclient_new now");
 #endif
+/* clang-format on */
 
 extern struct zclient_options zclient_options_default;
 
 extern struct zclient *zclient_new_notify(struct thread_master *m,
                                          struct zclient_options *opt);
 
-#define zclient_new(A) zclient_new_notify((A), &zclient_options_default); \
+#define zclient_new(A)                                                         \
+       zclient_new_notify((A), &zclient_options_default);                     \
        CPP_WARN("Please transition to using zclient_new_notify");
 
-extern void zclient_init(struct zclient *, int, u_short, struct zebra_privs_t *privs);
+extern void zclient_init(struct zclient *, int, unsigned short,
+                        struct zebra_privs_t *privs);
 extern int zclient_start(struct zclient *);
 extern void zclient_stop(struct zclient *);
 extern void zclient_reset(struct zclient *);
@@ -379,9 +408,10 @@ extern void zclient_free(struct zclient *);
 
 extern int zclient_socket_connect(struct zclient *);
 
-extern u_short *redist_check_instance(struct redist_proto *, u_short);
-extern void redist_add_instance(struct redist_proto *, u_short);
-extern void redist_del_instance(struct redist_proto *, u_short);
+extern unsigned short *redist_check_instance(struct redist_proto *,
+                                            unsigned short);
+extern void redist_add_instance(struct redist_proto *, unsigned short);
+extern void redist_del_instance(struct redist_proto *, unsigned short);
 
 /*
  * Send to zebra that the specified vrf is using label to resolve
@@ -410,11 +440,12 @@ extern void zclient_send_interface_radv_req(struct zclient *zclient,
 
 /* Send redistribute command to zebra daemon. Do not update zclient state. */
 extern int zebra_redistribute_send(int command, struct zclient *, afi_t,
-                                  int type, u_short instance, vrf_id_t vrf_id);
+                                  int type, unsigned short instance,
+                                  vrf_id_t vrf_id);
 
 /* If state has changed, update state and call zebra_redistribute_send. */
 extern void zclient_redistribute(int command, struct zclient *, afi_t, int type,
-                                u_short instance, vrf_id_t vrf_id);
+                                unsigned short instance, vrf_id_t vrf_id);
 
 /* If state has changed, update state and send the command to zebra. */
 extern void zclient_redistribute_default(int command, struct zclient *,
@@ -426,9 +457,58 @@ extern int zclient_send_message(struct zclient *);
 
 /* create header for command, length to be filled in by user later */
 extern void zclient_create_header(struct stream *, uint16_t, vrf_id_t);
-extern int zclient_read_header(struct stream *s, int sock, u_int16_t *size,
-                              u_char *marker, u_char *version,
-                              vrf_id_t *vrf_id, u_int16_t *cmd);
+/*
+ * Read sizeof(struct zmsghdr) bytes from the provided socket and parse the
+ * received data into the specified fields. If this is successful, read the
+ * rest of the packet into the provided stream.
+ *
+ * s
+ *    The stream to read into
+ *
+ * sock
+ *    The socket to read from
+ *
+ * size
+ *    Parsed message size will be placed in the pointed-at integer
+ *
+ * marker
+ *    Parsed marker will be placed in the pointed-at byte
+ *
+ * version
+ *    Parsed version will be placed in the pointed-at byte
+ *
+ * vrf_id
+ *    Parsed VRF ID will be placed in the pointed-at vrf_id_t
+ *
+ * cmd
+ *    Parsed command number will be placed in the pointed-at integer
+ *
+ * Returns:
+ *    -1 if:
+ *    - insufficient data for header was read
+ *    - a version mismatch was detected
+ *    - a marker mismatch was detected
+ *    - header size field specified more data than could be read
+ */
+extern int zclient_read_header(struct stream *s, int sock, uint16_t *size,
+                              uint8_t *marker, uint8_t *version,
+                              vrf_id_t *vrf_id, uint16_t *cmd);
+/*
+ * Parse header from ZAPI message stream into struct zmsghdr.
+ * This function assumes the stream getp points at the first byte of the header.
+ * If the function is successful then the stream getp will point to the byte
+ * immediately after the last byte of the header.
+ *
+ * zmsg
+ *    The stream containing the header
+ *
+ * hdr
+ *    The header struct to parse into.
+ *
+ * Returns:
+ *    true if parsing succeeded, false otherwise
+ */
+extern bool zapi_parse_header(struct stream *zmsg, struct zmsghdr *hdr);
 
 extern void zclient_interface_set_master(struct zclient *client,
                                         struct interface *master,
@@ -445,22 +525,35 @@ extern struct interface *zebra_interface_vrf_update_read(struct stream *s,
 extern void zebra_interface_if_set_value(struct stream *, struct interface *);
 extern void zebra_router_id_update_read(struct stream *s, struct prefix *rid);
 
-#if CONFDATE > 20180823
+/* clang-format off */
+#if defined(VERSION_TYPE_DEV) && CONFDATE > 20180823
 CPP_NOTICE("zapi_ipv4_route, zapi_ipv6_route, zapi_ipv4_route_ipv6_nexthop as well as the zapi_ipv4 and zapi_ipv6 data structures should be removed now");
 #endif
+/* clang-format on */
 
-extern int zapi_ipv4_route(u_char, struct zclient *, struct prefix_ipv4 *,
+extern int zapi_ipv4_route(uint8_t, struct zclient *, struct prefix_ipv4 *,
                           struct zapi_ipv4 *) __attribute__((deprecated));
 
 extern struct interface *zebra_interface_link_params_read(struct stream *);
 extern size_t zebra_interface_link_params_write(struct stream *,
                                                struct interface *);
+extern int zclient_send_get_label_chunk(
+       struct zclient  *zclient,
+       uint8_t         keep,
+       uint32_t        chunk_size);
+
 extern int lm_label_manager_connect(struct zclient *zclient);
-extern int lm_get_label_chunk(struct zclient *zclient, u_char keep,
+extern int lm_get_label_chunk(struct zclient *zclient, uint8_t keep,
                              uint32_t chunk_size, uint32_t *start,
                              uint32_t *end);
 extern int lm_release_label_chunk(struct zclient *zclient, uint32_t start,
                                  uint32_t end);
+extern int tm_table_manager_connect(struct zclient *zclient);
+extern int tm_get_table_chunk(struct zclient *zclient, uint32_t chunk_size,
+                             uint32_t *start, uint32_t *end);
+extern int tm_release_table_chunk(struct zclient *zclient, uint32_t start,
+                                 uint32_t end);
+
 extern int zebra_send_pw(struct zclient *zclient, int command,
                         struct zapi_pw *pw);
 extern void zebra_read_pw_status_update(int command, struct zclient *zclient,
@@ -470,50 +563,55 @@ extern void zebra_read_pw_status_update(int command, struct zclient *zclient,
 /* IPv6 prefix add and delete function prototype. */
 
 struct zapi_ipv6 {
-       u_char type;
-       u_short instance;
+       uint8_t type;
+       unsigned short instance;
 
-       u_int32_t flags;
+       uint32_t flags;
 
-       u_char message;
+       uint8_t message;
 
        safi_t safi;
 
-       u_char nexthop_num;
+       uint8_t nexthop_num;
        struct in6_addr **nexthop;
 
-       u_char ifindex_num;
+       uint8_t ifindex_num;
        ifindex_t *ifindex;
 
-       u_char label_num;
+       uint8_t label_num;
        unsigned int *label;
 
-       u_char distance;
+       uint8_t distance;
 
-       u_int32_t metric;
+       uint32_t metric;
 
        route_tag_t tag;
 
-       u_int32_t mtu;
+       uint32_t mtu;
 
        vrf_id_t vrf_id;
 };
 
-extern int zapi_ipv6_route(u_char cmd, struct zclient *zclient,
+extern int zapi_ipv6_route(uint8_t cmd, struct zclient *zclient,
                           struct prefix_ipv6 *p, struct prefix_ipv6 *src_p,
                           struct zapi_ipv6 *api) __attribute__((deprecated));
-extern int zapi_ipv4_route_ipv6_nexthop(u_char, struct zclient *,
+extern int zapi_ipv4_route_ipv6_nexthop(uint8_t, struct zclient *,
                                        struct prefix_ipv4 *,
                                        struct zapi_ipv6 *)
        __attribute__((deprecated));
-extern int zclient_route_send(u_char, struct zclient *, struct zapi_route *);
+extern int zclient_route_send(uint8_t, struct zclient *, struct zapi_route *);
 extern int zclient_send_rnh(struct zclient *zclient, int command,
                            struct prefix *p, bool exact_match,
                            vrf_id_t vrf_id);
-extern int zapi_route_encode(u_char, struct stream *, struct zapi_route *);
+extern int zapi_route_encode(uint8_t, struct stream *, struct zapi_route *);
 extern int zapi_route_decode(struct stream *, struct zapi_route *);
 bool zapi_route_notify_decode(struct stream *s, struct prefix *p,
+                             uint32_t *tableid,
                              enum zapi_route_notify_owner *note);
+bool zapi_rule_notify_decode(struct stream *s, uint32_t *seqno,
+                            uint32_t *priority, uint32_t *unique,
+                            ifindex_t *ifindex,
+                            enum zapi_rule_notify_owner *note);
 extern struct nexthop *nexthop_from_zapi_nexthop(struct zapi_nexthop *znh);
 extern bool zapi_nexthop_update_decode(struct stream *s,
                                       struct zapi_route *nhr);