Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 26 Dec 2020 22:51:12 GMT
From:      "Alexander V. Chernikov" <melifaro@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: f733d9701b7e - main - Fix default route handling in radix4_lockless algo. Improve nexthop debugging.
Message-ID:  <202012262251.0BQMpCpQ031848@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by melifaro:

URL: https://cgit.FreeBSD.org/src/commit/?id=f733d9701b7ebe3ebd7b92932ec6fb7e96d3166c

commit f733d9701b7ebe3ebd7b92932ec6fb7e96d3166c
Author:     Alexander V. Chernikov <melifaro@FreeBSD.org>
AuthorDate: 2020-12-26 22:46:43 +0000
Commit:     Alexander V. Chernikov <melifaro@FreeBSD.org>
CommitDate: 2020-12-26 22:51:02 +0000

    Fix default route handling in radix4_lockless algo.
    Improve nexthop debugging.
    
    Reported by:    Florian Smeets <flo at smeets.xyz>
---
 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);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202012262251.0BQMpCpQ031848>