From f733d9701b7ebe3ebd7b92932ec6fb7e96d3166c Mon Sep 17 00:00:00 2001 From: "Alexander V. Chernikov" Date: Sat, 26 Dec 2020 22:46:43 +0000 Subject: Fix default route handling in radix4_lockless algo. Improve nexthop debugging. Reported by: Florian Smeets --- sys/net/route/fib_algo.c | 35 ++++++++++++++++++++++++++--------- sys/netinet/in_fib_algo.c | 7 ++++--- 2 files changed, 30 insertions(+), 12 deletions(-) diff --git a/sys/net/route/fib_algo.c b/sys/net/route/fib_algo.c index afb009d4c8cf..32bafbaca3d1 100644 --- a/sys/net/route/fib_algo.c +++ b/sys/net/route/fib_algo.c @@ -322,6 +322,21 @@ fib_error_clear() } } +static const char * +print_op_result(enum flm_op_result result) +{ + switch (result) { + case FLM_SUCCESS: + return "success"; + case FLM_REBUILD: + return "rebuild"; + case FLM_ERROR: + return "error"; + } + + return "unknown"; +} + static const char * print_family(int family) { @@ -585,18 +600,18 @@ sync_algo_end_cb(struct rib_head *rnh, enum rib_walk_hook stage, void *_data) return; } - if (stage != RIB_WALK_HOOK_POST || w->result != FLM_SUCCESS) - return; - - /* Post-dump hook, dump successful */ - if (fd->hit_nhops) { FD_PRINTF(LOG_INFO, fd, "ran out of nexthops at %u nhops", fd->nh_ref_table->count); - w->result = FLM_REBUILD; + if (w->result == FLM_SUCCESS) + w->result = FLM_REBUILD; return; } + if (stage != RIB_WALK_HOOK_POST || w->result != FLM_SUCCESS) + return; + + /* Post-dump hook, dump successful */ w->result = fd->fd_flm->flm_dump_end_cb(fd->fd_algo_data, &fd->fd_dp); if (w->result == FLM_SUCCESS) { @@ -648,7 +663,8 @@ sync_algo(struct fib_data *fd) rib_walk_ext_internal(fd->fd_rh, true, sync_algo_cb, sync_algo_end_cb, &w); - FD_PRINTF(LOG_INFO, fd, "initial dump completed."); + FD_PRINTF(LOG_INFO, fd, "initial dump completed, result: %s", + print_op_result(w.result)); return (w.result); } @@ -706,7 +722,6 @@ schedule_destroy_fd_instance(struct fib_data *fd, bool in_callout) else callout_drain(&fd->fd_callout); - FD_PRINTF(LOG_INFO, fd, "destroying old instance"); epoch_call(net_epoch_preempt, destroy_fd_instance_epoch, &fd->fd_epoch_ctx); @@ -859,6 +874,7 @@ try_setup_fd_instance(struct fib_lookup_module *flm, struct rib_head *rh, FD_PRINTF(LOG_INFO, fd, "Unable to allocate nhop refcount table (sz:%zu)", size); return (FLM_REBUILD); } + FD_PRINTF(LOG_DEBUG, fd, "Allocated %u nhop indexes", fd->number_nhops); /* Okay, we're ready for algo init */ void *old_algo_data = (old_fd != NULL) ? old_fd->fd_algo_data : NULL; @@ -920,7 +936,8 @@ setup_fd_instance(struct fib_lookup_module *flm, struct rib_head *rh, } NET_EPOCH_EXIT(et); - RH_PRINTF(LOG_INFO, rh, "try %d: fib algo result: %d", i, result); + RH_PRINTF(LOG_INFO, rh, "try %d: fib algo result: %s", i, + print_op_result(result)); if (result == FLM_REBUILD) { prev_fd = new_fd; diff --git a/sys/netinet/in_fib_algo.c b/sys/netinet/in_fib_algo.c index a5048c52b75d..92592a6a286f 100644 --- a/sys/netinet/in_fib_algo.c +++ b/sys/netinet/in_fib_algo.c @@ -590,7 +590,7 @@ lradix4_add_route_cb(struct rtentry *rt, void *_data) struct lradix4_data *lr = (struct lradix4_data *)_data; struct radix4_addr_entry *ae; struct sockaddr_in mask; - struct sockaddr *rt_mask = NULL; + struct sockaddr *rt_mask; struct radix_node *rn; struct in_addr addr4, mask4; uint32_t scopeid; @@ -607,12 +607,13 @@ lradix4_add_route_cb(struct rtentry *rt, void *_data) ae->addr.sin_len = KEY_LEN_INET; ae->addr.sin_addr = addr4; - if (mask4.s_addr != INADDR_ANY) { + if (mask4.s_addr != INADDR_BROADCAST) { bzero(&mask, sizeof(mask)); mask.sin_len = KEY_LEN_INET; mask.sin_addr = mask4; rt_mask = (struct sockaddr *)&mask; - } + } else + rt_mask = NULL; rn = lr->rnh->rnh_addaddr((struct sockaddr *)&ae->addr, rt_mask, &lr->rnh->rh, ae->rn); -- cgit v1.2.3