diff options
author | Donald Sharp <sharpd@cumulusnetworks.com> | 2018-06-18 20:08:34 +0200 |
---|---|---|
committer | Quentin Young <qlyoung@cumulusnetworks.com> | 2018-08-14 22:02:05 +0200 |
commit | e33b116cdf983c81fdb1b9716684a888b870899b (patch) | |
tree | 38055319f156ee153f412020c5058a5d17d27efb /babeld | |
parent | babeld: Add BABEL_ERR_XXX error messages. (diff) | |
download | frr-e33b116cdf983c81fdb1b9716684a888b870899b.tar.xz frr-e33b116cdf983c81fdb1b9716684a888b870899b.zip |
babeld: Convert all zlog_err to zlog_ferr and add appropriate info
Convert babeld to use zlog_ferr and add appropriate BABEL_ERR_XXX
information.
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
Diffstat (limited to 'babeld')
-rw-r--r-- | babeld/babel_errors.c | 18 | ||||
-rw-r--r-- | babeld/babel_errors.h | 3 | ||||
-rw-r--r-- | babeld/babel_main.c | 12 | ||||
-rw-r--r-- | babeld/babeld.c | 6 | ||||
-rw-r--r-- | babeld/message.c | 84 | ||||
-rw-r--r-- | babeld/neighbour.c | 4 | ||||
-rw-r--r-- | babeld/route.c | 37 | ||||
-rw-r--r-- | babeld/route.h | 13 | ||||
-rw-r--r-- | babeld/source.c | 3 |
9 files changed, 117 insertions, 63 deletions
diff --git a/babeld/babel_errors.c b/babeld/babel_errors.c index e83b81d8b..ed780ea1b 100644 --- a/babeld/babel_errors.c +++ b/babeld/babel_errors.c @@ -30,6 +30,24 @@ static struct ferr_ref ferr_babel_err[] = { .suggestion = "Find the process that is causing memory shortages and remediate that process\nRestart FRR" }, { + .code = BABEL_ERR_PACKET, + .title = "BABEL Packet Error", + .description = "Babel has detected a packet encode/decode problem", + .suggestion = "Collect relevant log files and file an Issue" + }, + { + .code = BABEL_ERR_CONFIG, + .title = "BABEL Configuration Error", + .description = "Babel has detected a configuration error of some sort", + .suggestion = "Ensure that the configuration is correct" + }, + { + .code = BABEL_ERR_ROUTE, + .title = "BABEL Route Error", + .description = "Babel has detected a routing error and has an inconsistent state", + .suggestion = "Gather data for filing an Issue and then restart FRR" + }, + { .code = END_FERR, } }; diff --git a/babeld/babel_errors.h b/babeld/babel_errors.h index 07a7863b0..a52b19481 100644 --- a/babeld/babel_errors.h +++ b/babeld/babel_errors.h @@ -25,6 +25,9 @@ enum babel_ferr_refs { BABEL_ERR_MEMORY = BABEL_FERR_START, + BABEL_ERR_PACKET, + BABEL_ERR_CONFIG, + BABEL_ERR_ROUTE, }; extern void babel_error_init(void); diff --git a/babeld/babel_main.c b/babeld/babel_main.c index 2a40b4f89..002517449 100644 --- a/babeld/babel_main.c +++ b/babeld/babel_main.c @@ -300,7 +300,7 @@ babel_load_state_file(void) unsigned char sid[8]; rc = parse_eui64(buf2, sid); if(rc < 0) { - zlog_err("Couldn't parse babel-state."); + zlog_ferr(BABEL_ERR_CONFIG, "Couldn't parse babel-state."); } else { struct timeval realnow; debugf(BABEL_DEBUG_COMMON, @@ -310,12 +310,13 @@ babel_load_state_file(void) if(memcmp(sid, myid, 8) == 0) myseqno = seqno_plus(s, 1); else - zlog_err("ID mismatch in babel-state. id=%s; old=%s", + zlog_ferr(BABEL_ERR_CONFIG, + "ID mismatch in babel-state. id=%s; old=%s", format_eui64(myid), format_eui64(sid)); } } else { - zlog_err("Couldn't parse babel-state."); + zlog_ferr(BABEL_ERR_CONFIG, "Couldn't parse babel-state."); } } goto fini; @@ -366,12 +367,13 @@ babel_save_state_file(void) format_eui64(myid), (int)myseqno, (long)realnow.tv_sec); if(rc < 0 || rc >= 100) { - zlog_err("write(babel-state): overflow."); + zlog_ferr(BABEL_ERR_CONFIG, "write(babel-state): overflow."); unlink(state_file); } else { rc = write(fd, buf, rc); if(rc < 0) { - zlog_err("write(babel-state): %s", safe_strerror(errno)); + zlog_ferr(BABEL_ERR_CONFIG, "write(babel-state): %s", + safe_strerror(errno)); unlink(state_file); } fsync(fd); diff --git a/babeld/babeld.c b/babeld/babeld.c index 91f54bfc8..dd0767142 100644 --- a/babeld/babeld.c +++ b/babeld/babeld.c @@ -255,11 +255,13 @@ babel_get_myid(void) return; } - zlog_err("Warning: couldn't find router id -- using random value."); + zlog_ferr(BABEL_ERR_CONFIG, + "Warning: couldn't find router id -- using random value."); rc = read_random_bytes(myid, 8); if(rc < 0) { - zlog_err("read(random): %s (cannot assign an ID)",safe_strerror(errno)); + zlog_ferr(BABEL_ERR_CONFIG, "read(random): %s (cannot assign an ID)", + safe_strerror(errno)); exit(1); } /* Clear group and global bits */ diff --git a/babeld/message.c b/babeld/message.c index 95b4e87cc..c6b72f827 100644 --- a/babeld/message.c +++ b/babeld/message.c @@ -35,6 +35,7 @@ THE SOFTWARE. #include "message.h" #include "kernel.h" #include "babel_main.h" +#include "babel_errors.h" static unsigned char packet_header[4] = {42, 2}; @@ -140,12 +141,12 @@ parse_update_subtlv(const unsigned char *a, int alen, } if(i + 1 > alen) { - zlog_err("Received truncated attributes."); + zlog_ferr(BABEL_ERR_PACKET, "Received truncated attributes."); return; } len = a[i + 1]; if(i + len > alen) { - zlog_err("Received truncated attributes."); + zlog_ferr(BABEL_ERR_PACKET, "Received truncated attributes."); return; } @@ -153,13 +154,14 @@ parse_update_subtlv(const unsigned char *a, int alen, /* Nothing. */ } else if(type == SUBTLV_DIVERSITY) { if(len > DIVERSITY_HOPS) { - zlog_err("Received overlong channel information (%d > %d).n", - len, DIVERSITY_HOPS); + zlog_ferr(BABEL_ERR_PACKET, + "Received overlong channel information (%d > %d).n", + len, DIVERSITY_HOPS); len = DIVERSITY_HOPS; } if(memchr(a + i + 2, 0, len) != NULL) { /* 0 is reserved. */ - zlog_err("Channel information contains 0!"); + zlog_ferr(BABEL_ERR_PACKET, "Channel information contains 0!"); return; } memset(channels, 0, DIVERSITY_HOPS); @@ -187,12 +189,14 @@ parse_hello_subtlv(const unsigned char *a, int alen, } if(i + 1 > alen) { - zlog_err("Received truncated sub-TLV on Hello message."); + zlog_ferr(BABEL_ERR_PACKET, + "Received truncated sub-TLV on Hello message."); return -1; } len = a[i + 1]; if(i + len > alen) { - zlog_err("Received truncated sub-TLV on Hello message."); + zlog_ferr(BABEL_ERR_PACKET, + "Received truncated sub-TLV on Hello message."); return -1; } @@ -203,7 +207,8 @@ parse_hello_subtlv(const unsigned char *a, int alen, DO_NTOHL(*hello_send_us, a + i + 2); ret = 1; } else { - zlog_err("Received incorrect RTT sub-TLV on Hello message."); + zlog_ferr(BABEL_ERR_PACKET, + "Received incorrect RTT sub-TLV on Hello message."); } } else { debugf(BABEL_DEBUG_COMMON, @@ -230,12 +235,14 @@ parse_ihu_subtlv(const unsigned char *a, int alen, } if(i + 1 > alen) { - zlog_err("Received truncated sub-TLV on IHU message."); + zlog_ferr(BABEL_ERR_PACKET, + "Received truncated sub-TLV on IHU message."); return -1; } len = a[i + 1]; if(i + len > alen) { - zlog_err("Received truncated sub-TLV on IHU message."); + zlog_ferr(BABEL_ERR_PACKET, + "Received truncated sub-TLV on IHU message."); return -1; } @@ -248,7 +255,8 @@ parse_ihu_subtlv(const unsigned char *a, int alen, ret = 1; } else { - zlog_err("Received incorrect RTT sub-TLV on IHU message."); + zlog_ferr(BABEL_ERR_PACKET, + "Received incorrect RTT sub-TLV on IHU message."); } } else { debugf(BABEL_DEBUG_COMMON, @@ -337,27 +345,29 @@ parse_packet(const unsigned char *from, struct interface *ifp, } if(!linklocal(from)) { - zlog_err("Received packet from non-local address %s.", - format_address(from)); + zlog_ferr(BABEL_ERR_PACKET, + "Received packet from non-local address %s.", + format_address(from)); return; } if (babel_packet_examin (packet, packetlen)) { - zlog_err("Received malformed packet on %s from %s.", - ifp->name, format_address(from)); + zlog_ferr(BABEL_ERR_PACKET, + "Received malformed packet on %s from %s.", + ifp->name, format_address(from)); return; } neigh = find_neighbour(from, ifp); if(neigh == NULL) { - zlog_err("Couldn't allocate neighbour."); + zlog_ferr(BABEL_ERR_PACKET, "Couldn't allocate neighbour."); return; } DO_NTOHS(bodylen, packet + 2); if(bodylen + 4 > packetlen) { - zlog_err("Received truncated packet (%d + 4 > %d).", + zlog_ferr(BABEL_ERR_PACKET, "Received truncated packet (%d + 4 > %d).", bodylen, packetlen); bodylen = packetlen - 4; } @@ -506,7 +516,8 @@ parse_packet(const unsigned char *from, struct interface *ifp, have_router_id = 1; } if(!have_router_id && message[2] != 0) { - zlog_err("Received prefix with no router id."); + zlog_ferr(BABEL_ERR_PACKET, + "Received prefix with no router id."); goto fail; } debugf(BABEL_DEBUG_COMMON,"Received update%s%s for %s from %s on %s.", @@ -517,7 +528,8 @@ parse_packet(const unsigned char *from, struct interface *ifp, if(message[2] == 0) { if(metric < 0xFFFF) { - zlog_err("Received wildcard update with finite metric."); + zlog_ferr(BABEL_ERR_PACKET, + "Received wildcard update with finite metric."); goto done; } retract_neighbour_routes(neigh); @@ -609,8 +621,9 @@ parse_packet(const unsigned char *from, struct interface *ifp, continue; fail: - zlog_err("Couldn't parse packet (%d, %d) from %s on %s.", - message[0], message[1], format_address(from), ifp->name); + zlog_ferr(BABEL_ERR_PACKET, + "Couldn't parse packet (%d, %d) from %s on %s.", + message[0], message[1], format_address(from), ifp->name); goto done; } @@ -697,7 +710,7 @@ fill_rtt_message(struct interface *ifp) DO_HTONL(babel_ifp->sendbuf + babel_ifp->buffered_hello + 10, time); return 1; } else { - zlog_err("No space left for timestamp sub-TLV " + zlog_ferr(BABEL_ERR_PACKET, "No space left for timestamp sub-TLV " "(this shouldn't happen)"); return -1; } @@ -732,10 +745,11 @@ flushbuf(struct interface *ifp) babel_ifp->sendbuf, babel_ifp->buffered, (struct sockaddr*)&sin6, sizeof(sin6)); if(rc < 0) - zlog_err("send: %s", safe_strerror(errno)); + zlog_ferr(BABEL_ERR_PACKET, "send: %s", safe_strerror(errno)); } else { - zlog_err("Warning: bucket full, dropping packet to %s.", - ifp->name); + zlog_ferr(BABEL_ERR_PACKET, + "Warning: bucket full, dropping packet to %s.", + ifp->name); } } VALGRIND_MAKE_MEM_UNDEFINED(babel_ifp->sendbuf, babel_ifp->bufsize); @@ -856,7 +870,8 @@ start_unicast_message(struct neighbour *neigh, int type, int len) if(!unicast_buffer) unicast_buffer = malloc(UNICAST_BUFSIZE); if(!unicast_buffer) { - zlog_err("malloc(unicast_buffer): %s", safe_strerror(errno)); + zlog_ferr(BABEL_ERR_MEMORY, "malloc(unicast_buffer): %s", + safe_strerror(errno)); return -1; } @@ -992,11 +1007,13 @@ flush_unicast(int dofree) unicast_buffer, unicast_buffered, (struct sockaddr*)&sin6, sizeof(sin6)); if(rc < 0) - zlog_err("send(unicast): %s", safe_strerror(errno)); + zlog_ferr(BABEL_ERR_PACKET, "send(unicast): %s", + safe_strerror(errno)); } else { - zlog_err("Warning: bucket full, dropping unicast packet to %s if %s.", - format_address(unicast_neighbour->address), - unicast_neighbour->ifp->name); + zlog_ferr(BABEL_ERR_PACKET, + "Warning: bucket full, dropping unicast packet to %s if %s.", + format_address(unicast_neighbour->address), + unicast_neighbour->ifp->name); } done: @@ -1301,7 +1318,8 @@ buffer_update(struct interface *ifp, again: babel_ifp->buffered_updates = malloc(n *sizeof(struct buffered_update)); if(babel_ifp->buffered_updates == NULL) { - zlog_err("malloc(buffered_updates): %s", safe_strerror(errno)); + zlog_ferr(BABEL_ERR_MEMORY, "malloc(buffered_updates): %s", + safe_strerror(errno)); if(n > 4) { /* Try again with a tiny buffer. */ n = 4; @@ -1364,7 +1382,7 @@ send_update(struct interface *ifp, int urgent, } route_stream_done(routes); } else { - zlog_err("Couldn't allocate route stream."); + zlog_ferr(BABEL_ERR_MEMORY, "Couldn't allocate route stream."); } set_timeout(&babel_ifp->update_timeout, babel_ifp->update_interval); babel_ifp->last_update_time = babel_now.tv_sec; @@ -1442,7 +1460,7 @@ send_self_update(struct interface *ifp) } xroute_stream_done(xroutes); } else { - zlog_err("Couldn't allocate xroute stream."); + zlog_ferr(BABEL_ERR_MEMORY, "Couldn't allocate xroute stream."); } } diff --git a/babeld/neighbour.c b/babeld/neighbour.c index 3db121fd2..d10ec15a8 100644 --- a/babeld/neighbour.c +++ b/babeld/neighbour.c @@ -38,6 +38,7 @@ THE SOFTWARE. #include "route.h" #include "message.h" #include "resend.h" +#include "babel_errors.h" struct neighbour *neighs = NULL; @@ -89,7 +90,8 @@ find_neighbour(const unsigned char *address, struct interface *ifp) neigh = malloc(sizeof(struct neighbour)); if(neigh == NULL) { - zlog_err("malloc(neighbour): %s", safe_strerror(errno)); + zlog_ferr(BABEL_ERR_MEMORY, "malloc(neighbour): %s", + safe_strerror(errno)); return NULL; } diff --git a/babeld/route.c b/babeld/route.c index bc7590fb3..da2523469 100644 --- a/babeld/route.c +++ b/babeld/route.c @@ -34,13 +34,14 @@ THE SOFTWARE. #include "xroute.h" #include "message.h" #include "resend.h" +#include "babel_errors.h" static void consider_route(struct babel_route *route); struct babel_route **routes = NULL; static int route_slots = 0, max_route_slots = 0; int kernel_metric = 0; -int diversity_kind = DIVERSITY_NONE; +enum babel_diversity diversity_kind = DIVERSITY_NONE; int diversity_factor = BABEL_DEFAULT_DIVERSITY_FACTOR; int keep_unfeasible = 0; @@ -398,15 +399,16 @@ install_route(struct babel_route *route) return; if(!route_feasible(route)) - zlog_err("WARNING: installing unfeasible route " - "(this shouldn't happen)."); + zlog_ferr(BABEL_ERR_ROUTE, "WARNING: installing unfeasible route " + "(this shouldn't happen)."); i = find_route_slot(route->src->prefix, route->src->plen, NULL); assert(i >= 0 && i < route_slots); if(routes[i] != route && routes[i]->installed) { - zlog_err("WARNING: attempting to install duplicate route " - "(this shouldn't happen)."); + zlog_ferr(BABEL_ERR_ROUTE, + "WARNING: attempting to install duplicate route " + "(this shouldn't happen)."); return; } @@ -416,7 +418,8 @@ install_route(struct babel_route *route) metric_to_kernel(route_metric(route)), NULL, 0, 0); if(rc < 0) { int save = errno; - zlog_err("kernel_route(ADD): %s", safe_strerror(errno)); + zlog_ferr(BABEL_ERR_ROUTE, "kernel_route(ADD): %s", + safe_strerror(errno)); if(save != EEXIST) return; } @@ -438,7 +441,8 @@ uninstall_route(struct babel_route *route) route->neigh->ifp->ifindex, metric_to_kernel(route_metric(route)), NULL, 0, 0); if(rc < 0) - zlog_err("kernel_route(FLUSH): %s", safe_strerror(errno)); + zlog_ferr(BABEL_ERR_ROUTE, "kernel_route(FLUSH): %s", + safe_strerror(errno)); route->installed = 0; } @@ -461,8 +465,8 @@ switch_routes(struct babel_route *old, struct babel_route *new) return; if(!route_feasible(new)) - zlog_err("WARNING: switching to unfeasible route " - "(this shouldn't happen)."); + zlog_ferr(BABEL_ERR_ROUTE, "WARNING: switching to unfeasible route " + "(this shouldn't happen)."); rc = kernel_route(ROUTE_MODIFY, old->src->prefix, old->src->plen, old->nexthop, old->neigh->ifp->ifindex, @@ -470,7 +474,8 @@ switch_routes(struct babel_route *old, struct babel_route *new) new->nexthop, new->neigh->ifp->ifindex, metric_to_kernel(route_metric(new))); if(rc < 0) { - zlog_err("kernel_route(MODIFY): %s", safe_strerror(errno)); + zlog_ferr(BABEL_ERR_ROUTE, "kernel_route(MODIFY): %s", + safe_strerror(errno)); return; } @@ -498,7 +503,8 @@ change_route_metric(struct babel_route *route, route->nexthop, route->neigh->ifp->ifindex, new); if(rc < 0) { - zlog_err("kernel_route(MODIFY metric): %s", safe_strerror(errno)); + zlog_ferr(BABEL_ERR_ROUTE, "kernel_route(MODIFY metric): %s", + safe_strerror(errno)); return; } } @@ -581,10 +587,9 @@ route_interferes(struct babel_route *route, struct interface *ifp) } } return 0; - default: - zlog_err("Unknown kind of diversity."); - return 1; } + + return 1; } int @@ -793,7 +798,7 @@ update_route(const unsigned char *router_id, return NULL; if(martian_prefix(prefix, plen)) { - zlog_err("Rejecting martian route to %s through %s.", + zlog_ferr(BABEL_ERR_ROUTE, "Rejecting martian route to %s through %s.", format_prefix(prefix, plen), format_address(nexthop)); return NULL; } @@ -901,7 +906,7 @@ update_route(const unsigned char *router_id, route->next = NULL; new_route = insert_route(route); if(new_route == NULL) { - zlog_err("Couldn't insert route."); + zlog_ferr(BABEL_ERR_ROUTE, "Couldn't insert route."); free(route); return NULL; } diff --git a/babeld/route.h b/babeld/route.h index c2026d176..c994d22a9 100644 --- a/babeld/route.h +++ b/babeld/route.h @@ -27,10 +27,12 @@ THE SOFTWARE. #include "babel_interface.h" #include "source.h" -#define DIVERSITY_NONE 0 -#define DIVERSITY_INTERFACE_1 1 -#define DIVERSITY_CHANNEL_1 2 -#define DIVERSITY_CHANNEL 3 +enum babel_diversity { + DIVERSITY_NONE, + DIVERSITY_INTERFACE_1, + DIVERSITY_CHANNEL_1, + DIVERSITY_CHANNEL, +}; #define DIVERSITY_HOPS 8 @@ -55,7 +57,8 @@ struct route_stream; extern struct babel_route **routes; extern int kernel_metric; -extern int diversity_kind, diversity_factor; +extern enum babel_diversity diversity_kind; +extern int diversity_factor; extern int keep_unfeasible; extern int smoothing_half_life; diff --git a/babeld/source.c b/babeld/source.c index 72396102b..6145743a4 100644 --- a/babeld/source.c +++ b/babeld/source.c @@ -31,6 +31,7 @@ THE SOFTWARE. #include "source.h" #include "babel_interface.h" #include "route.h" +#include "babel_errors.h" struct source *srcs = NULL; @@ -58,7 +59,7 @@ find_source(const unsigned char *id, const unsigned char *p, unsigned char plen, src = malloc(sizeof(struct source)); if(src == NULL) { - zlog_err("malloc(source): %s", safe_strerror(errno)); + zlog_ferr(BABEL_ERR_MEMORY, "malloc(source): %s", safe_strerror(errno)); return NULL; } |