]> git.proxmox.com Git - mirror_frr.git/blobdiff - zebra/label_manager.c
eigrpd: eigrp usage of uint32_t to struct in_addr for router_id data
[mirror_frr.git] / zebra / label_manager.c
index 442126e6d6b32b7d36ef885ff562cdcdb1ff4857..bfad8ea643f7aac5cec4e4e43211aa0639644387 100644 (file)
@@ -84,11 +84,27 @@ static int relay_response_back(void)
                                  &vrf_id, &resp_cmd);
        if (ret < 0 && errno != EAGAIN) {
                flog_err(EC_ZEBRA_LM_RESPONSE,
-                         "Error reading Label Manager response: %s",
-                         strerror(errno));
+                        "Error reading Label Manager response: %s",
+                        strerror(errno));
                return -1;
        }
-       zlog_debug("Label Manager response received, %d bytes", size);
+
+       /* do not relay a msg that has nothing to do with LM */
+       switch (resp_cmd) {
+       case ZEBRA_LABEL_MANAGER_CONNECT:
+       case ZEBRA_LABEL_MANAGER_CONNECT_ASYNC: /* should not be seen */
+       case ZEBRA_GET_LABEL_CHUNK:
+       case ZEBRA_RELEASE_LABEL_CHUNK:
+               break;
+       default:
+               zlog_debug("Not relaying '%s' response (size %d) from LM",
+                          zserv_command_string(resp_cmd), size);
+               return -1;
+       }
+
+       zlog_debug("Received '%s' response (size %d) from LM",
+                  zserv_command_string(resp_cmd), size);
+
        if (size == 0)
                return -1;
 
@@ -120,8 +136,8 @@ static int relay_response_back(void)
        ret = writen(zserv->sock, dst->data, stream_get_endp(dst));
        if (ret <= 0) {
                flog_err(EC_ZEBRA_LM_RELAY_FAILED,
-                         "Error relaying LM response to %s instance %u: %s",
-                         proto_str, instance, strerror(errno));
+                        "Error relaying LM response to %s instance %u: %s",
+                        proto_str, instance, strerror(errno));
                return -1;
        }
        zlog_debug("Relayed LM response (%d bytes) to %s instance %u", ret,
@@ -139,6 +155,11 @@ static int lm_zclient_read(struct thread *t)
        /* read response and send it back */
        ret = relay_response_back();
 
+       /* on error, schedule another read */
+       if (ret == -1)
+               if (!zclient->t_read)
+                       thread_add_read(zclient->master, lm_zclient_read, NULL,
+                                       zclient->sock, &zclient->t_read);
        return ret;
 }
 
@@ -188,7 +209,7 @@ int zread_relay_label_manager_request(int cmd, struct zserv *zserv,
 
        if (zclient->sock < 0) {
                flog_err(EC_ZEBRA_LM_NO_SOCKET,
-                         "Unable to relay LM request: no socket");
+                        "Unable to relay LM request: no socket");
                reply_error(cmd, zserv, vrf_id);
                return -1;
        }
@@ -218,8 +239,8 @@ int zread_relay_label_manager_request(int cmd, struct zserv *zserv,
        /* check & set client instance if unset */
        if (zserv->instance && zserv->instance != instance) {
                flog_err(EC_ZEBRA_LM_BAD_INSTANCE,
-                         "Client instance(%u) != msg instance(%u)",
-                         zserv->instance, instance);
+                        "Client instance(%u) != msg instance(%u)",
+                        zserv->instance, instance);
                return -1;
        }
 
@@ -228,8 +249,9 @@ int zread_relay_label_manager_request(int cmd, struct zserv *zserv,
        zserv->proto = proto;
 
        /* in case there's any incoming message enqueued, read and forward it */
-       while (ret == 0)
-               ret = relay_response_back();
+       if (zserv->is_synchronous)
+               while (ret == 0)
+                       ret = relay_response_back();
 
        /* get the msg buffer used toward the 'master' Label Manager */
        dst = zclient->obuf;
@@ -241,8 +263,8 @@ int zread_relay_label_manager_request(int cmd, struct zserv *zserv,
        ret = writen(zclient->sock, dst->data, stream_get_endp(dst));
        if (ret <= 0) {
                flog_err(EC_ZEBRA_LM_RELAY_FAILED,
-                         "Error relaying LM request from %s instance %u: %s",
-                         proto_str, instance, strerror(errno));
+                        "Error relaying LM request from %s instance %u: %s",
+                        proto_str, instance, strerror(errno));
                reply_error(cmd, zserv, vrf_id);
                return -1;
        }
@@ -271,7 +293,7 @@ static int lm_zclient_connect(struct thread *t)
 
        if (zclient_socket_connect(zclient) < 0) {
                flog_err(EC_ZEBRA_LM_CLIENT_CONNECTION_FAILED,
-                         "Error connecting synchronous zclient!");
+                        "Error connecting synchronous zclient!");
                thread_add_timer(zebrad.master, lm_zclient_connect, zclient,
                                 CONNECTION_DELAY, &zclient->t_connect);
                return -1;
@@ -296,7 +318,7 @@ static void lm_zclient_init(char *lm_zserv_path)
                                 lm_zserv_path);
 
        /* Set default values. */
-       zclient = zclient_new_notify(zebrad.master, &zclient_options_default);
+       zclient = zclient_new(zebrad.master, &zclient_options_default);
        zclient->privs = &zserv_privs;
        zclient->sock = -1;
        zclient->t_connect = NULL;
@@ -401,8 +423,8 @@ struct label_manager_chunk *assign_label_chunk(uint8_t proto,
                             + 1;
        if (lmc->start > MPLS_LABEL_UNRESERVED_MAX - size + 1) {
                flog_err(EC_ZEBRA_LM_EXHAUSTED_LABELS,
-                         "Reached max labels. Start: %u, size: %u", lmc->start,
-                         size);
+                        "Reached max labels. Start: %u, size: %u", lmc->start,
+                        size);
                XFREE(MTYPE_LM_CHUNK, lmc);
                return NULL;
        }
@@ -441,7 +463,7 @@ int release_label_chunk(uint8_t proto, unsigned short instance, uint32_t start,
                        continue;
                if (lmc->proto != proto || lmc->instance != instance) {
                        flog_err(EC_ZEBRA_LM_DAEMON_MISMATCH,
-                                 "%s: Daemon mismatch!!", __func__);
+                                "%s: Daemon mismatch!!", __func__);
                        continue;
                }
                lmc->proto = NO_PROTO;
@@ -452,7 +474,7 @@ int release_label_chunk(uint8_t proto, unsigned short instance, uint32_t start,
        }
        if (ret != 0)
                flog_err(EC_ZEBRA_LM_UNRELEASED_CHUNK,
-                         "%s: Label chunk not released!!", __func__);
+                        "%s: Label chunk not released!!", __func__);
 
        return ret;
 }
@@ -460,6 +482,6 @@ 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);
+       list_delete(&lbl_mgr.lc_list);
        stream_free(obuf);
 }