diff options
| -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 e83b81d8b0..ed780ea1bb 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 07a7863b07..a52b19481b 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 2a40b4f894..0025174492 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 91f54bfc8b..dd07671428 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 95b4e87cc7..c6b72f8273 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 3db121fd26..d10ec15a80 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 bc7590fb39..da2523469a 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 c2026d1765..c994d22a9f 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 72396102b3..6145743a4d 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;      }  | 
