]> git.proxmox.com Git - mirror_frr.git/blobdiff - zebra/label_manager.c
zebra: reorganize zserv, batch i/o
[mirror_frr.git] / zebra / label_manager.c
index 5bf0fce0947d582196d419f3e1bc78614005126f..b58f0c9ff84d84e6eb0e243d4494ce06f015b56b 100644 (file)
@@ -50,6 +50,8 @@ DEFINE_MTYPE_STATIC(LBL_MGR, LM_CHUNK, "Label Manager Chunk");
  * it will be a proxy to relay messages to external label manager
  * This zclient thus is to connect to it
  */
+static struct stream *ibuf;
+static struct stream *obuf;
 static struct zclient *zclient;
 bool lm_is_external;
 
@@ -69,7 +71,7 @@ static int relay_response_back(struct zserv *zserv)
        u_int16_t resp_cmd;
 
        src = zclient->ibuf;
-       dst = zserv->obuf;
+       dst = obuf;
 
        stream_reset(src);
 
@@ -87,7 +89,7 @@ static int relay_response_back(struct zserv *zserv)
 
        /* send response back */
        stream_copy(dst, src);
-       ret = writen(zserv->sock, dst->data, stream_get_endp(dst));
+       ret = writen(zserv->sock, src->data, stream_get_endp(src));
        if (ret <= 0) {
                zlog_err("%s: Error sending Label Manager response back: %s",
                         __func__, strerror(errno));
@@ -116,10 +118,10 @@ static int lm_zclient_read(struct thread *t)
 
 static int reply_error(int cmd, struct zserv *zserv, vrf_id_t vrf_id)
 {
+       int ret;
        struct stream *s;
 
-       s = zserv->obuf;
-       stream_reset(s);
+       s = stream_new(ZEBRA_MAX_PACKET_SIZ);
 
        zclient_create_header(s, cmd, vrf_id);
 
@@ -129,7 +131,10 @@ static int reply_error(int cmd, struct zserv *zserv, vrf_id_t vrf_id)
        /* Write packet size. */
        stream_putw_at(s, 0, stream_get_endp(s));
 
-       return writen(zserv->sock, s->data, stream_get_endp(s));
+       ret = writen(zserv->sock, s->data, stream_get_endp(s));
+
+       stream_free(s);
+       return ret;
 }
 /**
  * Receive a request to get or release a label chunk and forward it to external
@@ -161,7 +166,7 @@ int zread_relay_label_manager_request(int cmd, struct zserv *zserv,
                ret = relay_response_back(zserv);
 
        /* Send request to external label manager */
-       src = zserv->ibuf;
+       src = ibuf;
        dst = zclient->obuf;
 
        stream_copy(dst, src);
@@ -247,6 +252,9 @@ void label_manager_init(char *lm_zserv_path)
                lm_is_external = true;
                lm_zclient_init(lm_zserv_path);
        }
+
+       ibuf = stream_new(ZEBRA_MAX_PACKET_SIZ);
+       obuf = stream_new(ZEBRA_MAX_PACKET_SIZ);
 }
 
 /**
@@ -379,4 +387,6 @@ int release_daemon_chunks(u_char proto, u_short instance)
 void label_manager_close()
 {
        list_delete_and_null(&lbl_mgr.lc_list);
+       stream_free(ibuf);
+       stream_free(obuf);
 }