From owner-dev-commits-src-main@freebsd.org Sat Dec 26 22:51:12 2020 Return-Path: Delivered-To: dev-commits-src-main@mailman.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.nyi.freebsd.org (Postfix) with ESMTP id A06534C4CEC; Sat, 26 Dec 2020 22:51:12 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4D3JvN46tLz4nn0; Sat, 26 Dec 2020 22:51:12 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 80DC41C86A; Sat, 26 Dec 2020 22:51:12 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 0BQMpCQa031849; Sat, 26 Dec 2020 22:51:12 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 0BQMpCpQ031848; Sat, 26 Dec 2020 22:51:12 GMT (envelope-from git) Date: Sat, 26 Dec 2020 22:51:12 GMT Message-Id: <202012262251.0BQMpCpQ031848@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: "Alexander V. Chernikov" Subject: git: f733d9701b7e - main - Fix default route handling in radix4_lockless algo. Improve nexthop debugging. MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: melifaro X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: f733d9701b7ebe3ebd7b92932ec6fb7e96d3166c Auto-Submitted: auto-generated X-BeenThere: dev-commits-src-main@freebsd.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: "Commit messages for the main branch of the src repository." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 26 Dec 2020 22:51:12 -0000 The branch main has been updated by melifaro: URL: https://cgit.FreeBSD.org/src/commit/?id=f733d9701b7ebe3ebd7b92932ec6fb7e96d3166c commit f733d9701b7ebe3ebd7b92932ec6fb7e96d3166c Author: Alexander V. Chernikov AuthorDate: 2020-12-26 22:46:43 +0000 Commit: Alexander V. Chernikov CommitDate: 2020-12-26 22:51:02 +0000 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);