diff options
| author | Donald Sharp <sharpd@cumulusnetworks.com> | 2018-06-18 14:56:15 -0400 | 
|---|---|---|
| committer | Quentin Young <qlyoung@cumulusnetworks.com> | 2018-08-14 20:02:05 +0000 | 
| commit | 54ece69899efe2a5713f3e28c7afa2075990d405 (patch) | |
| tree | 197ca853121f7db27afc60eb372b28842619d952 | |
| parent | 38937bd540f3c867af21935578c264905c7846cd (diff) | |
isisd: Add isis_errors and generate custom Error Codes
Generate appropriate error codes for ISIS.
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
| -rw-r--r-- | isisd/isis_circuit.c | 8 | ||||
| -rw-r--r-- | isisd/isis_csm.c | 7 | ||||
| -rw-r--r-- | isisd/isis_errors.c | 48 | ||||
| -rw-r--r-- | isisd/isis_errors.h | 33 | ||||
| -rw-r--r-- | isisd/isis_events.c | 7 | ||||
| -rw-r--r-- | isisd/isis_lsp.c | 10 | ||||
| -rw-r--r-- | isisd/isis_main.c | 2 | ||||
| -rw-r--r-- | isisd/isis_pdu.c | 69 | ||||
| -rw-r--r-- | isisd/subdir.am | 2 | 
9 files changed, 147 insertions, 39 deletions
diff --git a/isisd/isis_circuit.c b/isisd/isis_circuit.c index 42041a7c46..04247e8e15 100644 --- a/isisd/isis_circuit.c +++ b/isisd/isis_circuit.c @@ -57,6 +57,7 @@  #include "isisd/isis_events.h"  #include "isisd/isis_te.h"  #include "isisd/isis_mt.h" +#include "isisd/isis_errors.h"  DEFINE_QOBJ_TYPE(isis_circuit) @@ -566,7 +567,8 @@ int isis_circuit_up(struct isis_circuit *circuit)  		return ISIS_OK;  	if (circuit->area->lsp_mtu > isis_circuit_pdu_size(circuit)) { -		zlog_err( +		zlog_ferr( +			ISIS_ERR_CONFIG,  			"Interface MTU %zu on %s is too low to support area lsp mtu %u!",  			isis_circuit_pdu_size(circuit),  			circuit->interface->name, circuit->area->lsp_mtu); @@ -577,7 +579,9 @@ int isis_circuit_up(struct isis_circuit *circuit)  	if (circuit->circ_type == CIRCUIT_T_BROADCAST) {  		circuit->circuit_id = isis_circuit_id_gen(isis, circuit->interface);  		if (!circuit->circuit_id) { -			zlog_err("There are already 255 broadcast circuits active!"); +			zlog_ferr( +				ISIS_ERR_CONFIG, +				"There are already 255 broadcast circuits active!");  			return ISIS_ERROR;  		} diff --git a/isisd/isis_csm.c b/isisd/isis_csm.c index 10870d5c50..691d2a43f9 100644 --- a/isisd/isis_csm.c +++ b/isisd/isis_csm.c @@ -47,6 +47,7 @@  #include "isisd/isisd.h"  #include "isisd/isis_csm.h"  #include "isisd/isis_events.h" +#include "isisd/isis_errors.h"  extern struct isis *isis; @@ -137,10 +138,12 @@ isis_csm_state_change(int event, struct isis_circuit *circuit, void *arg)  		case IF_UP_FROM_Z:  			isis_circuit_if_add(circuit, (struct interface *)arg);  			if (isis_circuit_up(circuit) != ISIS_OK) { -				zlog_err( +				zlog_ferr( +					ISIS_ERR_CONFIG,  					"Could not bring up %s because of invalid config.",  					circuit->interface->name); -				zlog_err( +				zlog_ferr( +					ISIS_ERR_CONFIG,  					"Clearing config for %s. Please re-examine it.",  					circuit->interface->name);  				if (circuit->ip_router) { diff --git a/isisd/isis_errors.c b/isisd/isis_errors.c new file mode 100644 index 0000000000..154ba2bb5b --- /dev/null +++ b/isisd/isis_errors.c @@ -0,0 +1,48 @@ +/* + * isis_errors - code for error messages that may occur in the + *              isis process + * Copyright (C) 2018 Cumulus Networks, Inc. + *               Donald Sharp + * + * FRR is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2, or (at your option) any + * later version. + * + * FRR is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; see the file COPYING; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#include <zebra.h> + +#include "isis_errors.h" + +static struct ferr_ref ferr_isis_err[] = { +	{ +		.code = ISIS_ERR_PACKET, +		.title = "ISIS Packet Error", +		.description = "Isis has detected an error with a packet from a peer", +		.suggestion = "Gather log information and open an issue then restart FRR" +	}, +	{ +		.code = ISIS_ERR_CONFIG, +		.title = "ISIS Configuration Error", +		.description = "Isis has detected an error within configuration for the router", +		.suggestion = "Ensure configuration is correct" +	}, +	{ +		.code = END_FERR, +	} +}; + +void isis_error_init(void) +{ +	ferr_ref_init(); + +	ferr_ref_add(ferr_isis_err); +} diff --git a/isisd/isis_errors.h b/isisd/isis_errors.h new file mode 100644 index 0000000000..d92a4e4038 --- /dev/null +++ b/isisd/isis_errors.h @@ -0,0 +1,33 @@ +/* + * isis_errors - header for error messages that may occur in the isis process + * Copyright (C) 2018 Cumulus Networks, Inc. + *               Donald Sharp + * + * FRR is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2, or (at your option) any + * later version. + * + * FRR is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; see the file COPYING; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#ifndef __ISIS_ERRORS_H__ +#define __ISIS_ERRORS_H__ + +#include "ferr.h" +#include "isis_errors.h" + +enum isis_ferr_refs { +	ISIS_ERR_PACKET = ISIS_FERR_START, +	ISIS_ERR_CONFIG, +}; + +extern void isis_error_init(void); + +#endif diff --git a/isisd/isis_events.c b/isisd/isis_events.c index 349ec262c0..ad0fbc97e3 100644 --- a/isisd/isis_events.c +++ b/isisd/isis_events.c @@ -48,6 +48,7 @@  #include "isisd/isis_csm.h"  #include "isisd/isis_events.h"  #include "isisd/isis_spf.h" +#include "isisd/isis_errors.h"  /* debug isis-spf spf-events   4w4d: ISIS-Spf (tlt): L2 SPF needed, new adjacency, from 0x609229F4 @@ -156,9 +157,9 @@ void isis_circuit_is_type_set(struct isis_circuit *circuit, int newtype)  		return; /* No change */  	if (!(newtype & circuit->area->is_type)) { -		zlog_err( -			"ISIS-Evt (%s) circuit type change - invalid level %s because" -			" area is %s", +		zlog_ferr( +			ISIS_ERR_CONFIG, +			"ISIS-Evt (%s) circuit type change - invalid level %s because area is %s",  			circuit->area->area_tag, circuit_t2string(newtype),  			circuit_t2string(circuit->area->is_type));  		return; diff --git a/isisd/isis_lsp.c b/isisd/isis_lsp.c index 63f7776551..14a88e9e8f 100644 --- a/isisd/isis_lsp.c +++ b/isisd/isis_lsp.c @@ -1244,8 +1244,9 @@ static int lsp_regenerate(struct isis_area *area, int level)  	lsp = lsp_search(lspid, lspdb);  	if (!lsp) { -		zlog_err("ISIS-Upd (%s): lsp_regenerate: no L%d LSP found!", -			 area->area_tag, level); +		zlog_ferr(LIB_ERR_DEVELOPMENT, +			  "ISIS-Upd (%s): lsp_regenerate: no L%d LSP found!", +			  area->area_tag, level);  		return ISIS_ERROR;  	} @@ -1612,8 +1613,9 @@ static int lsp_regenerate_pseudo(struct isis_circuit *circuit, int level)  	lsp = lsp_search(lsp_id, lspdb);  	if (!lsp) { -		zlog_err("lsp_regenerate_pseudo: no l%d LSP %s found!", level, -			 rawlspid_print(lsp_id)); +		zlog_ferr(LIB_ERR_DEVELOPMENT, +			  "lsp_regenerate_pseudo: no l%d LSP %s found!", level, +			  rawlspid_print(lsp_id));  		return ISIS_ERROR;  	} diff --git a/isisd/isis_main.c b/isisd/isis_main.c index ec6b0922bb..5b18ab0a2c 100644 --- a/isisd/isis_main.c +++ b/isisd/isis_main.c @@ -53,6 +53,7 @@  #include "isisd/isis_routemap.h"  #include "isisd/isis_zebra.h"  #include "isisd/isis_te.h" +#include "isisd/isis_errors.h"  /* Default configuration file name */  #define ISISD_DEFAULT_CONFIG "isisd.conf" @@ -189,6 +190,7 @@ int main(int argc, char **argv, char **envp)  	/*  	 *  initializations  	 */ +	isis_error_init();  	access_list_init();  	vrf_init(NULL, NULL, NULL, NULL);  	prefix_list_init(); diff --git a/isisd/isis_pdu.c b/isisd/isis_pdu.c index 1753ea22f6..c9cf87508e 100644 --- a/isisd/isis_pdu.c +++ b/isisd/isis_pdu.c @@ -55,6 +55,7 @@  #include "isisd/isis_te.h"  #include "isisd/isis_mt.h"  #include "isisd/isis_tlvs.h" +#include "isisd/isis_errors.h"  static int ack_lsp(struct isis_lsp_hdr *hdr, struct isis_circuit *circuit,  		   int level) @@ -87,9 +88,10 @@ static int ack_lsp(struct isis_lsp_hdr *hdr, struct isis_circuit *circuit,  	retval = circuit->tx(circuit, level);  	if (retval != ISIS_OK) -		zlog_err("ISIS-Upd (%s): Send L%d LSP PSNP on %s failed", -			 circuit->area->area_tag, level, -			 circuit->interface->name); +		zlog_ferr(ISIS_ERR_PACKET, +			  "ISIS-Upd (%s): Send L%d LSP PSNP on %s failed", +			  circuit->area->area_tag, level, +			  circuit->interface->name);  	return retval;  } @@ -615,8 +617,9 @@ static int process_hello(uint8_t pdu_type, struct isis_circuit *circuit,  	}  	if (!p2p_hello && !(level & iih.circ_type)) { -		zlog_err("Level %d LAN Hello with Circuit Type %d", level, -			 iih.circ_type); +		zlog_ferr(ISIS_ERR_PACKET, +			  "Level %d LAN Hello with Circuit Type %d", level, +			  iih.circ_type);  		return ISIS_ERROR;  	} @@ -1351,7 +1354,7 @@ int isis_handle_pdu(struct isis_circuit *circuit, uint8_t *ssnpa)  	/* Verify that at least the 8 bytes fixed header have been received */  	if (stream_get_endp(circuit->rcv_stream) < ISIS_FIXED_HDR_LEN) { -		zlog_err("PDU is too short to be IS-IS."); +		zlog_ferr(ISIS_ERR_PACKET, "PDU is too short to be IS-IS.");  		return ISIS_ERROR;  	} @@ -1372,7 +1375,8 @@ int isis_handle_pdu(struct isis_circuit *circuit, uint8_t *ssnpa)  	}  	if (idrp != ISO10589_ISIS) { -		zlog_err("Not an IS-IS packet IDRP=%" PRIx8, idrp); +		zlog_ferr(ISIS_ERR_PACKET, "Not an IS-IS packet IDRP=%" PRIx8, +			  idrp);  		return ISIS_ERROR;  	} @@ -1382,7 +1386,8 @@ int isis_handle_pdu(struct isis_circuit *circuit, uint8_t *ssnpa)  	}  	if (id_len != 0 && id_len != ISIS_SYS_ID_LEN) { -		zlog_err( +		zlog_ferr( +			ISIS_ERR_PACKET,  			"IDFieldLengthMismatch: ID Length field in a received PDU  %" PRIu8  			", while the parameter for this IS is %u",  			id_len, ISIS_SYS_ID_LEN); @@ -1396,14 +1401,16 @@ int isis_handle_pdu(struct isis_circuit *circuit, uint8_t *ssnpa)  	}  	if (length != expected_length) { -		zlog_err("Exepected fixed header length = %" PRIu8 -			 " but got %" PRIu8, -			 expected_length, length); +		zlog_ferr(ISIS_ERR_PACKET, +			  "Exepected fixed header length = %" PRIu8 +			  " but got %" PRIu8, +			  expected_length, length);  		return ISIS_ERROR;  	}  	if (stream_get_endp(circuit->rcv_stream) < length) { -		zlog_err( +		zlog_ferr( +			ISIS_ERR_PACKET,  			"PDU is too short to contain fixed header of given PDU type.");  		return ISIS_ERROR;  	} @@ -1421,7 +1428,8 @@ int isis_handle_pdu(struct isis_circuit *circuit, uint8_t *ssnpa)  	/* either 3 or 0 */  	if (max_area_addrs != 0 && max_area_addrs != isis->max_area_addrs) { -		zlog_err( +		zlog_ferr( +			ISIS_ERR_PACKET,  			"maximumAreaAddressesMismatch: maximumAreaAdresses in a received PDU %" PRIu8  			" while the parameter for this IS is %u",  			max_area_addrs, isis->max_area_addrs); @@ -1645,9 +1653,10 @@ int send_hello(struct isis_circuit *circuit, int level)  	retval = circuit->tx(circuit, level);  	if (retval != ISIS_OK) -		zlog_err("ISIS-Adj (%s): Send L%d IIH on %s failed", -			 circuit->area->area_tag, level, -			 circuit->interface->name); +		zlog_ferr(ISIS_ERR_PACKET, +			  "ISIS-Adj (%s): Send L%d IIH on %s failed", +			  circuit->area->area_tag, level, +			  circuit->interface->name);  	return retval;  } @@ -1842,9 +1851,10 @@ int send_csnp(struct isis_circuit *circuit, int level)  		int retval = circuit->tx(circuit, level);  		if (retval != ISIS_OK) { -			zlog_err("ISIS-Snp (%s): Send L%d CSNP on %s failed", -				 circuit->area->area_tag, level, -				 circuit->interface->name); +			zlog_ferr(ISIS_ERR_PACKET, +				  "ISIS-Snp (%s): Send L%d CSNP on %s failed", +				  circuit->area->area_tag, level, +				  circuit->interface->name);  			isis_free_tlvs(tlvs);  			return retval;  		} @@ -2006,9 +2016,10 @@ static int send_psnp(int level, struct isis_circuit *circuit)  		int retval = circuit->tx(circuit, level);  		if (retval != ISIS_OK) { -			zlog_err("ISIS-Snp (%s): Send L%d PSNP on %s failed", -				 circuit->area->area_tag, level, -				 circuit->interface->name); +			zlog_ferr(ISIS_ERR_PACKET, +				  "ISIS-Snp (%s): Send L%d PSNP on %s failed", +				  circuit->area->area_tag, level, +				  circuit->interface->name);  			isis_free_tlvs(tlvs);  			return retval;  		} @@ -2113,7 +2124,8 @@ int send_lsp(struct thread *thread)  	 * than  	 * the circuit's MTU. So handle and log this case here. */  	if (stream_get_endp(lsp->pdu) > stream_get_size(circuit->snd_stream)) { -		zlog_err( +		zlog_ferr( +			ISIS_ERR_PACKET,  			"ISIS-Upd (%s): Can't send L%d LSP %s, seq 0x%08" PRIx32  			", cksum 0x%04" PRIx16 ", lifetime %" PRIu16  			"s on %s. LSP Size is %zu while interface stream size is %zu.", @@ -2148,11 +2160,12 @@ int send_lsp(struct thread *thread)  	clear_srm = 0;  	retval = circuit->tx(circuit, lsp->level);  	if (retval != ISIS_OK) { -		zlog_err("ISIS-Upd (%s): Send L%d LSP on %s failed %s", -			 circuit->area->area_tag, lsp->level, -			 circuit->interface->name, -			 (retval == ISIS_WARNING) ? "temporarily" -						  : "permanently"); +		zlog_ferr(ISIS_ERR_PACKET, +			  "ISIS-Upd (%s): Send L%d LSP on %s failed %s", +			  circuit->area->area_tag, lsp->level, +			  circuit->interface->name, +			  (retval == ISIS_WARNING) ? "temporarily" +						   : "permanently");  	}  out: diff --git a/isisd/subdir.am b/isisd/subdir.am index 7b56715fa9..7b8be46167 100644 --- a/isisd/subdir.am +++ b/isisd/subdir.am @@ -15,6 +15,7 @@ isisd_libisis_a_SOURCES = \  	isisd/isis_csm.c \  	isisd/isis_dr.c \  	isisd/isis_dynhn.c \ +	isisd/isis_errors.c \  	isisd/isis_events.c \  	isisd/isis_flags.c \  	isisd/isis_lsp.c \ @@ -44,6 +45,7 @@ noinst_HEADERS += \  	isisd/isis_csm.h \  	isisd/isis_dr.h \  	isisd/isis_dynhn.h \ +	isisd/isis_errors.h \  	isisd/isis_events.h \  	isisd/isis_flags.h \  	isisd/isis_lsp.h \  | 
