]> git.proxmox.com Git - mirror_frr.git/blobdiff - lib/zclient.c
lib, zebra: support label chunk requests for SRGB
[mirror_frr.git] / lib / zclient.c
index 96a78efad6d5abe125493d77e3337dba8c610c5e..c02ae5d0e4a1dffc1d69c4ebcb41afcd25ce945f 100644 (file)
@@ -62,10 +62,13 @@ struct zclient *zclient_new(struct thread_master *master,
                            struct zclient_options *opt)
 {
        struct zclient *zclient;
+       size_t stream_size =
+               MAX(ZEBRA_MAX_PACKET_SIZ, sizeof(struct zapi_route));
+
        zclient = XCALLOC(MTYPE_ZCLIENT, sizeof(struct zclient));
 
-       zclient->ibuf = stream_new(ZEBRA_MAX_PACKET_SIZ);
-       zclient->obuf = stream_new(ZEBRA_MAX_PACKET_SIZ);
+       zclient->ibuf = stream_new(stream_size);
+       zclient->obuf = stream_new(stream_size);
        zclient->wb = buffer_new(0);
        zclient->master = master;
 
@@ -555,6 +558,25 @@ void zclient_send_interface_radv_req(struct zclient *zclient, vrf_id_t vrf_id,
        zclient_send_message(zclient);
 }
 
+int zclient_send_interface_protodown(struct zclient *zclient, vrf_id_t vrf_id,
+                                    struct interface *ifp, bool down)
+{
+       struct stream *s;
+
+       if (zclient->sock < 0)
+               return -1;
+
+       s = zclient->obuf;
+       stream_reset(s);
+       zclient_create_header(s, ZEBRA_INTERFACE_SET_PROTODOWN, vrf_id);
+       stream_putl(s, ifp->ifindex);
+       stream_putc(s, !!down);
+       stream_putw_at(s, 0, stream_get_endp(s));
+       zclient_send_message(zclient);
+
+       return 0;
+}
+
 /* Make connection to zebra daemon. */
 int zclient_start(struct zclient *zclient)
 {
@@ -1381,6 +1403,8 @@ stream_failure:
  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  * |  bandwidth                                                    |
  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * |  parent ifindex                                               |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  * |  Link Layer Type                                              |
  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  * |  Harware Address Length                                       |
@@ -1561,6 +1585,7 @@ void zebra_interface_if_set_value(struct stream *s, struct interface *ifp)
        ifp->mtu = stream_getl(s);
        ifp->mtu6 = stream_getl(s);
        ifp->bandwidth = stream_getl(s);
+       ifp->link_ifindex = stream_getl(s);
        ifp->ll_type = stream_getl(s);
        ifp->hw_addr_len = stream_getl(s);
        if (ifp->hw_addr_len)
@@ -1970,10 +1995,11 @@ int lm_label_manager_connect(struct zclient *zclient, int async)
  * @param zclient Zclient used to connect to label manager (zebra)
  * @param keep Avoid garbage collection
  * @param chunk_size Amount of labels requested
+ * @param base Base for the label chunk. if MPLS_LABEL_BASE_ANY we do not care
  * @result 0 on success, -1 otherwise
  */
 int zclient_send_get_label_chunk(struct zclient *zclient, uint8_t keep,
-                                uint32_t chunk_size)
+                                uint32_t chunk_size, uint32_t base)
 {
        struct stream *s;
 
@@ -1993,6 +2019,7 @@ int zclient_send_get_label_chunk(struct zclient *zclient, uint8_t keep,
        stream_putw(s, zclient->instance);
        stream_putc(s, keep);
        stream_putl(s, chunk_size);
+       stream_putl(s, base);
 
        /* Put length at the first point of the stream. */
        stream_putw_at(s, 0, stream_get_endp(s));
@@ -2013,7 +2040,7 @@ int zclient_send_get_label_chunk(struct zclient *zclient, uint8_t keep,
  * @param end To write last assigned chunk label to
  * @result 0 on success, -1 otherwise
  */
-int lm_get_label_chunk(struct zclient *zclient, uint8_t keep,
+int lm_get_label_chunk(struct zclient *zclient, uint8_t keep, uint32_t base,
                       uint32_t chunk_size, uint32_t *start, uint32_t *end)
 {
        int ret;
@@ -2038,6 +2065,8 @@ int lm_get_label_chunk(struct zclient *zclient, uint8_t keep,
        stream_putc(s, keep);
        /* chunk size */
        stream_putl(s, chunk_size);
+       /* requested chunk base */
+       stream_putl(s, base);
        /* Put length at the first point of the stream. */
        stream_putw_at(s, 0, stream_get_endp(s));