diff options
| author | F. Aragon <paco@voltanet.io> | 2018-09-04 14:37:00 +0200 |
|---|---|---|
| committer | F. Aragon <paco@voltanet.io> | 2018-09-18 17:39:20 +0200 |
| commit | 61eefcadc72839d8e3dc4fdf09eca82d3ff2a26e (patch) | |
| tree | daec8a8283472473cd0a31009330497720891dd7 /zebra/label_manager.c | |
| parent | f533be73f6e73e7c6c2f2093f4bec59862c08dd6 (diff) | |
zebra: filter zebra messages (label manager)
This change makes the zebra acting as label manager proxy not to relay non-LM
messages to clients that a zebra acting in non-proxy mode may send to it. Also,
the existing code does not schedule a rcv in case of relay_response_back
returns -1. This patch re-schedules reads on the socket even in case such a
function returns -1 by calling thread_add_read().
Signed-off-by: F. Aragon <paco@voltanet.io>
Diffstat (limited to 'zebra/label_manager.c')
| -rw-r--r-- | zebra/label_manager.c | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/zebra/label_manager.c b/zebra/label_manager.c index d2aeb2ed28..2b0508099f 100644 --- a/zebra/label_manager.c +++ b/zebra/label_manager.c @@ -88,7 +88,23 @@ static int relay_response_back(void) 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; @@ -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; } |
