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;  }  | 
