/*
* Version of the ASN.1 infrastructure shipped with compiler.
*/
-int get_asn1c_environment_version() { return ASN1C_ENVIRONMENT_VERSION; }
+int get_asn1c_environment_version(void) { return ASN1C_ENVIRONMENT_VERSION; }
static asn_app_consume_bytes_f _print2fp;
*/
pr_crit("pthread_rwlock_rdlock() returned error code %d. This is too critical for a graceful recovery; I must die now.",
error);
+ return EINVAL; /* Warning shutupper */
}
void
return (error == ENOENT) ? 0 : error;
}
+#ifdef __APPLE__
+ *ims = meta.st_mtime; /* Seriously, Apple? */
+#else
*ims = meta.st_mtim.tv_sec;
+#endif
return 0;
}
}
pr_crit("Unknown address family '%d'", family);
+ return EINVAL; /* Warning shutupper */
}
static int
}
pr_crit("Unknown address family '%d'", family);
+ return EINVAL; /* Warning shutupper */
}
static int
}
pr_crit("Unknown address family '%d'", family);
+ return EINVAL; /* Warning shutupper */
}
static int
struct hashable_roa *tmp;
unsigned int r;
unsigned int roa1_count;
- int error;
r = 0;
roa1_count = HASH_COUNT(roas1);
HASH_ITER(hh, roas1, n1, tmp) {
HASH_FIND(hh, roas2, &n1->data, sizeof(n1->data), n2);
- if (n2 == NULL) {
- error = deltas_add_roa(deltas, &n1->data, op,
- r1type, r, roa1_count);
- if (error)
- return error;
- }
+ if (n2 == NULL)
+ deltas_add_roa(deltas, &n1->data, op, r1type, r,
+ roa1_count);
r++;
}
return 0;
}
-static int
+static void
add_router_key_delta(struct deltas *deltas, struct hashable_key *key, int op)
{
- return deltas_add_router_key(deltas, &key->data, op);
+ deltas_add_router_key(deltas, &key->data, op);
}
/*
*
* (Places the Router Keys that exist in @keys1 but not in @key2 in @deltas.)
*/
-static int
+static void
add_router_key_deltas(struct hashable_key *keys1, struct hashable_key *keys2,
struct deltas *deltas, int op)
{
struct hashable_key *n1; /* A node from @keys1 */
struct hashable_key *n2; /* A node from @keys2 */
- int error;
for (n1 = keys1; n1 != NULL; n1 = n1->hh.next) {
HASH_FIND(hh, keys2, &n1->data, sizeof(n1->data), n2);
- if (n2 == NULL) {
- error = add_router_key_delta(deltas, n1, op);
- if (error)
- return error;
- }
+ if (n2 == NULL)
+ add_router_key_delta(deltas, n1, op);
}
-
- return 0;
}
-int
-compute_deltas(struct db_table *old, struct db_table *new,
- struct deltas **result)
+struct deltas *
+compute_deltas(struct db_table *old, struct db_table *new)
{
- struct deltas *deltas;
- int error;
-
- deltas = deltas_create();
-
- error = add_roa_deltas(new->roas, old->roas, deltas, FLAG_ANNOUNCEMENT,
- 'n');
- if (error)
- goto fail;
- error = add_roa_deltas(old->roas, new->roas, deltas, FLAG_WITHDRAWAL,
- 'o');
- if (error)
- goto fail;
- error = add_router_key_deltas(new->router_keys, old->router_keys,
- deltas, FLAG_ANNOUNCEMENT);
- if (error)
- goto fail;
- error = add_router_key_deltas(old->router_keys, new->router_keys,
- deltas, FLAG_WITHDRAWAL);
- if (error)
- goto fail;
-
- *result = deltas;
- return 0;
+ struct deltas *deltas = deltas_create();
+
+ add_roa_deltas(new->roas, old->roas, deltas, FLAG_ANNOUNCEMENT, 'n');
+ add_roa_deltas(old->roas, new->roas, deltas, FLAG_WITHDRAWAL, 'o');
+ add_router_key_deltas(new->router_keys, old->router_keys, deltas,
+ FLAG_ANNOUNCEMENT);
+ add_router_key_deltas(old->router_keys, new->router_keys, deltas,
+ FLAG_WITHDRAWAL);
+
+ if (deltas_is_empty(deltas)) {
+ deltas_refput(deltas);
+ return NULL;
+ }
-fail:
- deltas_refput(deltas);
- return error;
+ return deltas;
}
struct ipv6_prefix const *, uint8_t);
int rtrhandler_handle_router_key(struct db_table *, unsigned char const *,
uint32_t, unsigned char const *);
-int compute_deltas(struct db_table *, struct db_table *, struct deltas **);
+struct deltas *compute_deltas(struct db_table *, struct db_table *);
#endif /* SRC_RTR_DB_DB_TABLE_H_ */
}
pr_crit("Unknown delta operation: %d", op);
+ return NULL; /* Warning shutupper */
}
static struct deltas_v6 *
}
pr_crit("Unknown delta operation: %d", op);
+ return NULL; /* Warning shutupper */
}
-int
+void
deltas_add_roa(struct deltas *deltas, struct vrp const *vrp, int op,
char r1type, unsigned int roa_counter, unsigned int roa_count)
{
delta.v4.prefix.len = vrp->prefix_length;
delta.v4.max_length = vrp->max_prefix_length;
deltas_v4_add(get_deltas_array4(deltas, op), &delta.v4);
- return 0;
+ return;
case AF_INET6:
delta.v6.as = vrp->asn;
delta.v6.prefix.addr = vrp->prefix.v6;
delta.v6.prefix.len = vrp->prefix_length;
delta.v6.max_length = vrp->max_prefix_length;
deltas_v6_add(get_deltas_array6(deltas, op), &delta.v6);
- return 0;
+ return;
}
pr_crit("Unknown protocol: [%u %s/%u-%u %u] %c %u/%u "
roa_count);
}
-int
+void
deltas_add_router_key(struct deltas *deltas, struct router_key const *key,
int op)
{
switch (op) {
case FLAG_ANNOUNCEMENT:
deltas_rk_add(&deltas->rk.adds, &delta);
- return 0;
+ return;
case FLAG_WITHDRAWAL:
deltas_rk_add(&deltas->rk.removes, &delta);
- return 0;
+ return;
}
pr_crit("Unknown delta operation: %d", op);
void deltas_refget(struct deltas *);
void deltas_refput(struct deltas *);
-int deltas_add_roa(struct deltas *, struct vrp const *, int,
+void deltas_add_roa(struct deltas *, struct vrp const *, int,
char, unsigned int, unsigned int);
-int deltas_add_router_key(struct deltas *, struct router_key const *, int);
+void deltas_add_router_key(struct deltas *, struct router_key const *, int);
bool deltas_is_empty(struct deltas *);
int deltas_foreach(struct deltas *, delta_vrp_foreach_cb,
return 0;
}
-static int
-__compute_deltas(struct db_table *old_base, struct db_table *new_base,
- bool *notify_clients, struct deltas **result)
-{
- int error;
-
- *result = NULL;
- if (notify_clients != NULL)
- *notify_clients = true;
-
- /* First version of the database = No deltas */
- if (old_base == NULL)
- return 0;
-
- error = compute_deltas(old_base, new_base, result);
- if (error)
- return error;
-
- if (deltas_is_empty(*result)) {
- if (notify_clients != NULL)
- *notify_clients = false;
- deltas_refput(*result);
- *result = NULL;
- }
-
- return 0;
-}
-
/*
* High level validator function.
*
struct deltas *new_deltas;
int error;
- if (changed)
+ if (changed != NULL)
*changed = false;
old_base = state.base;
new_base = NULL;
+ new_deltas = NULL;
new_base = perform_standalone_validation();
if (new_base == NULL)
}
/*
- * At this point, new_base is completely valid. Even if we error out
- * later, report the ROAs.
- *
* This is done after the validation, not during it, to prevent
* duplicate ROAs.
*/
output_print_data(new_base);
- error = __compute_deltas(old_base, new_base, changed, &new_deltas);
- if (error) {
- /*
- * Deltas are nice-to haves. As long as state.base is correct,
- * the validator can continue serving the routers.
- * (Albeit less efficiently.)
- * So drop a warning and keep going.
- */
- pr_op_warn("Deltas could not be computed: %s", strerror(error));
+ if (old_base != NULL) {
+ new_deltas = compute_deltas(old_base, new_base);
+ if (new_deltas == NULL) {
+ db_table_destroy(new_base);
+ return 0;
+ }
}
rwlock_write_lock(&state_lock);
if (old_base != NULL)
db_table_destroy(old_base);
+ if (changed != NULL)
+ *changed = true;
return 0;
}
#include "slurm/slurm_loader.h"
+#include <errno.h>
#include "alloc.h"
#include "log.h"
#include "config.h"
}
pr_crit("Unknown addr family type: %u", vrp.addr_fam);
+ return EINVAL; /* Warning shutupper */
}
static int
}
pr_crit("Unknown address family: %u", a->addr_fam);
+ return false; /* Warning shutupper */
}
/* Checks if a's prefix equals or covers b's prefix */
}
pr_crit("Unknown address family: %u", a->addr_fam);
+ return false; /* Warning shutupper */
}
int
static int
vrp_add(struct delta_vrp const *delta, void *arg)
{
- return deltas_add_roa(arg, &delta->vrp, delta->flags, 'a', 0, 0);
+ deltas_add_roa(arg, &delta->vrp, delta->flags, 'a', 0, 0);
+ return 0;
}
static int
rk_add(struct delta_router_key const *delta, void *arg)
{
- return deltas_add_router_key(arg, &delta->router_key, delta->flags);
+ deltas_add_router_key(arg, &delta->router_key, delta->flags);
+ return 0;
}
static void