]> git.proxmox.com Git - mirror_frr.git/commitdiff
zebra: fix broken label manager proxy mode.
authorFredi Raspall <fredi@voltanet.io>
Wed, 25 Apr 2018 10:18:10 +0000 (12:18 +0200)
committerFredi Raspall <fredi@voltanet.io>
Fri, 27 Apr 2018 18:10:39 +0000 (20:10 +0200)
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 <fredi@voltanet.io>
zebra/label_manager.c
zebra/label_manager.h
zebra/zapi_msg.c

index 190ac1e57f7ec7571f4306a7fb1fe3642bd30e16..4ae8fde0c2dbe43c51c54e826b1c0980f1ed4d2a 100644 (file)
@@ -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);
 }
index b998372224ad02cc679cfd19c6e7aeb8e51dafab..37d5e25abad42f132a3ef60a3cf760be49eb00f6 100644 (file)
@@ -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,
index 2ff660b3f92b138d26639fa0587ec95cbff33302..9353d7133e3e88aaf08117a4595d7e14e4a19eed 100644 (file)
@@ -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)