summaryrefslogtreecommitdiff
path: root/zebra/label_manager.c
diff options
context:
space:
mode:
authorQuentin Young <qlyoung@cumulusnetworks.com>2018-03-06 18:08:37 -0500
committerQuentin Young <qlyoung@cumulusnetworks.com>2018-03-12 14:57:05 -0400
commit1002497af5aedffc661cb457c8775634a65c3a19 (patch)
treeac62e91f373b3d274440861984440aa242fd957b /zebra/label_manager.c
parent89f4e5077bd8162dbda0e10a3bbd594c2c698d77 (diff)
zebra: reorganize zserv, batch i/o
Group send and receive functions together, change handlers to take a message instead of looking at ->ibuf and ->obuf, allow zebra to read multiple packets off the wire at a time. Signed-off-by: Quentin Young <qlyoung@cumulusnetworks.com>
Diffstat (limited to 'zebra/label_manager.c')
-rw-r--r--zebra/label_manager.c22
1 files changed, 16 insertions, 6 deletions
diff --git a/zebra/label_manager.c b/zebra/label_manager.c
index 5bf0fce094..b58f0c9ff8 100644
--- a/zebra/label_manager.c
+++ b/zebra/label_manager.c
@@ -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);
}