From 881999e64fcf1cf7bac65a74bcc4a6ed7cfdbbbe Mon Sep 17 00:00:00 2001 From: Fredi Raspall Date: Wed, 25 Apr 2018 12:18:10 +0200 Subject: [PATCH] zebra: fix broken label manager proxy mode. In a prior refactor, label manager proxy functionality was broken in two places: 1) in function relay_response_back(), "dst" stream was accidentally replaced by "src". 2) in zread_relay_label_manager_request(), src was set to point to a global struct stream *ibuf that was not used/initialized anywhere. Signed-off-by: Fredi Raspall --- zebra/label_manager.c | 9 +++------ zebra/label_manager.h | 2 +- zebra/zapi_msg.c | 2 +- 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/zebra/label_manager.c b/zebra/label_manager.c index 190ac1e57f..4ae8fde0c2 100644 --- a/zebra/label_manager.c +++ b/zebra/label_manager.c @@ -50,7 +50,6 @@ 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; @@ -89,7 +88,7 @@ static int relay_response_back(struct zserv *zserv) /* send response back */ stream_copy(dst, src); - ret = writen(zserv->sock, src->data, stream_get_endp(src)); + ret = writen(zserv->sock, dst->data, stream_get_endp(dst)); if (ret <= 0) { zlog_err("%s: Error sending Label Manager response back: %s", __func__, strerror(errno)); @@ -148,7 +147,7 @@ static int reply_error(int cmd, struct zserv *zserv, vrf_id_t vrf_id) * @return 0 on success, -1 otherwise */ int zread_relay_label_manager_request(int cmd, struct zserv *zserv, - vrf_id_t vrf_id) + struct stream *msg, vrf_id_t vrf_id) { struct stream *src, *dst; int ret = 0; @@ -166,7 +165,7 @@ int zread_relay_label_manager_request(int cmd, struct zserv *zserv, ret = relay_response_back(zserv); /* Send request to external label manager */ - src = ibuf; + src = msg; dst = zclient->obuf; stream_copy(dst, src); @@ -287,7 +286,6 @@ void label_manager_init(char *lm_zserv_path) lm_zclient_init(lm_zserv_path); } - ibuf = stream_new(ZEBRA_MAX_PACKET_SIZ); obuf = stream_new(ZEBRA_MAX_PACKET_SIZ); hook_register(zapi_client_close, release_daemon_label_chunks); @@ -393,6 +391,5 @@ int release_label_chunk(uint8_t proto, unsigned short instance, uint32_t start, void label_manager_close() { list_delete_and_null(&lbl_mgr.lc_list); - stream_free(ibuf); stream_free(obuf); } diff --git a/zebra/label_manager.h b/zebra/label_manager.h index b998372224..37d5e25aba 100644 --- a/zebra/label_manager.h +++ b/zebra/label_manager.h @@ -64,7 +64,7 @@ struct label_manager { bool lm_is_external; int zread_relay_label_manager_request(int cmd, struct zserv *zserv, - vrf_id_t vrf_id); + struct stream *msg, vrf_id_t vrf_id); void label_manager_init(char *lm_zserv_path); struct label_manager_chunk *assign_label_chunk(uint8_t proto, unsigned short instance, diff --git a/zebra/zapi_msg.c b/zebra/zapi_msg.c index 2ff660b3f9..9353d7133e 100644 --- a/zebra/zapi_msg.c +++ b/zebra/zapi_msg.c @@ -2454,7 +2454,7 @@ static void zread_label_manager_request(ZAPI_HANDLER_ARGS) /* external label manager */ if (lm_is_external) zread_relay_label_manager_request(hdr->command, client, - zvrf_id(zvrf)); + msg, zvrf_id(zvrf)); /* this is a label manager */ else { if (hdr->command == ZEBRA_LABEL_MANAGER_CONNECT) -- 2.39.5