From nobody Fri Jan 13 21:25:04 2023 X-Original-To: dev-commits-src-branches@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4NtvZn2p3rz2qklj; Fri, 13 Jan 2023 21:25:05 +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 "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4NtvZm3yFHz41N4; Fri, 13 Jan 2023 21:25:04 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1673645104; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=0Xr1/p48N4kma7mM3a5PajzoIkskzjCBmds5/pqJ60c=; b=Irmv2f/Wmq8hFtRnP3JuhpLhuFuXo0diIOgugZEZAmTeA1BU1uiTKCV4Sa5SQA7ebleFxO 4ig9oPe/0FevkSxZVEHJYITnUEk4h+3zh3lvJn9AMiGULVksZNANWtcuoqetBJGjhw1zlg dV9A4Sw9SzLWYQr8cJnfQt7ToV/PNomzodZ/1eEyxdz8on3/eED9PaUpQT+JwIxj6rAHoq SQthaJwJjl3gBDXaYXgcxn1Qqg3snEU06QJGeiajje5H6QNI+gqeB1deT3JQ9elqxCNd6f XMbD9VbuQ1KOWJHakNvV4ucwXrTbtqu2k26MQAGVEQny+EWCK0u8wrU60q///g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1673645104; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=0Xr1/p48N4kma7mM3a5PajzoIkskzjCBmds5/pqJ60c=; b=Be07qNG31VxcyeM8LboMGuZWxrPi38ZDMlJoxyB2V3L6KVXYHpNt03bIEN0EO+T5M+BFHI qCdm2RilWcAZaGH4pZzGD7AZlUtHtozVr4UaXSaA2kbFrbFdTqt80xMCjK1lOgLseu7yj1 6E5MLfsxk57q5qfebrH4YwbOPkdNhrgEKLToblEl0NYnp7Or05opG5BlGLFArF9Qdmw7sC w1Db5bIVUhrffxGTrTlfLp/ca8XT+u32a2pAinta0mkyk9TFsVOaC/sLLoYIYAGqQ96cK6 8HK/nJRYSDIVgCyMF9UCWQoUEV6SbwfJt5I4QSi+CJCJu6A/W+ROZghaDhLv4A== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1673645104; a=rsa-sha256; cv=none; b=lRcDvP0IcTWW6g3eajlCltJElbqfPbJJE2EUci/fsPz1eAZQ4wnybmErRdibsh/hwsTyir bpjtJMEH7yvTaCqvuvyf1HgNSnFlks7uuviBG5BXmcx8MxT9BvChhLfAXvM2smtLneJ1fA uEz6PZ27JJRm1DJkkRNm4LPsZWy5QlYwH6zAXVucl5Uzn8qtCZfnvQc3lM0jb7/YMyeQcx Rh/Zh1PzGbsoFYuetHilZyRAcVKdX/0NIHT5h2U1+h5xtWy+5vBOwESUSdLp4C6PMrlGIQ 8eI+X9bur33lC6jXbIXpsY1Lxy3eD0E/DKFJrWETIm+9qsLdWplX0UiDcVXdHg== 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 4NtvZm33yXzNGX; Fri, 13 Jan 2023 21:25:04 +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 30DLP4aw041340; Fri, 13 Jan 2023 21:25:04 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 30DLP4Oa041339; Fri, 13 Jan 2023 21:25:04 GMT (envelope-from git) Date: Fri, 13 Jan 2023 21:25:04 GMT Message-Id: <202301132125.30DLP4Oa041339@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: "Alexander V. Chernikov" Subject: git: 844e12bd8c6d - stable/13 - routing: split nexthop creation and rtentry creation. List-Id: Commits to the stable branches of the FreeBSD src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-branches List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-branches@freebsd.org X-BeenThere: dev-commits-src-branches@freebsd.org 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/stable/13 X-Git-Reftype: branch X-Git-Commit: 844e12bd8c6d7be4cbb35c50b08e9ee8369f3946 Auto-Submitted: auto-generated X-ThisMailContainsUnwantedMimeParts: N The branch stable/13 has been updated by melifaro: URL: https://cgit.FreeBSD.org/src/commit/?id=844e12bd8c6d7be4cbb35c50b08e9ee8369f3946 commit 844e12bd8c6d7be4cbb35c50b08e9ee8369f3946 Author: Alexander V. Chernikov AuthorDate: 2022-08-04 12:35:31 +0000 Commit: Alexander V. Chernikov CommitDate: 2023-01-13 21:18:26 +0000 routing: split nexthop creation and rtentry creation. This change is required for the upcoming introduction of the next nexhop-based operations KPI, as it will create rtentry and nexthops at different stages of route table modification. Differential Revision: https://reviews.freebsd.org/D36072 MFC after: 2 weeks (cherry picked from commit 66230639ce311c9fbc3a92e7039b8577a7577b6e) --- sys/net/route.c | 7 ++-- sys/net/route.h | 3 +- sys/net/route/route_ctl.c | 95 ++++++++++++++++++----------------------------- 3 files changed, 42 insertions(+), 63 deletions(-) diff --git a/sys/net/route.c b/sys/net/route.c index e4a56cb8ac2c..7a18acc0c281 100644 --- a/sys/net/route.c +++ b/sys/net/route.c @@ -725,11 +725,12 @@ rt_print(char *buf, int buflen, struct rtentry *rt) #endif void -rt_maskedcopy(struct sockaddr *src, struct sockaddr *dst, struct sockaddr *netmask) +rt_maskedcopy(const struct sockaddr *src, struct sockaddr *dst, + const struct sockaddr *netmask) { - u_char *cp1 = (u_char *)src; + const u_char *cp1 = (const u_char *)src; u_char *cp2 = (u_char *)dst; - u_char *cp3 = (u_char *)netmask; + const u_char *cp3 = (const u_char *)netmask; u_char *cplim = cp2 + *cp3; u_char *cplim2 = cp2 + *cp1; diff --git a/sys/net/route.h b/sys/net/route.h index b181ced9bb2e..53b54493b6c4 100644 --- a/sys/net/route.h +++ b/sys/net/route.h @@ -423,7 +423,8 @@ int rt_addrmsg(int, struct ifaddr *, int); int rt_routemsg(int, struct rtentry *, struct nhop_object *, int); int rt_routemsg_info(int, struct rt_addrinfo *, int); void rt_newmaddrmsg(int, struct ifmultiaddr *); -void rt_maskedcopy(struct sockaddr *, struct sockaddr *, struct sockaddr *); +void rt_maskedcopy(const struct sockaddr *, struct sockaddr *, + const struct sockaddr *); struct rib_head *rt_table_init(int, int, u_int); void rt_table_destroy(struct rib_head *); u_int rt_tables_get_gen(uint32_t table, sa_family_t family); diff --git a/sys/net/route/route_ctl.c b/sys/net/route/route_ctl.c index 34a029746fa1..8f116cd65aa9 100644 --- a/sys/net/route/route_ctl.c +++ b/sys/net/route/route_ctl.c @@ -626,13 +626,38 @@ check_gateway(struct rib_head *rnh, struct sockaddr *dst, * to be stable till the end of the operation (radix rt insertion/change/removal). * return errno otherwise. */ +static struct rtentry * +create_rtentry(struct rib_head *rnh, const struct sockaddr *dst, + struct sockaddr *netmask) +{ + MPASS(dst->sa_len <= sizeof(((struct rtentry *)NULL)->rt_dstb)); + + struct rtentry *rt = uma_zalloc(V_rtzone, M_NOWAIT | M_ZERO); + if (rt == NULL) + return (NULL); + rt->rte_flags = RTF_UP | (netmask == NULL ? RTF_HOST : 0); + + /* Fill in dst, ensuring it's masked if needed. */ + if (netmask != NULL) { + rt_maskedcopy(dst, &rt->rt_dst, netmask); + } else + bcopy(dst, &rt->rt_dst, dst->sa_len); + rt_key(rt) = &rt->rt_dst; + /* Set netmask to the storage from info. It will be updated upon insertion */ + rt_mask(rt) = netmask; + + return (rt); +} + static int -create_rtentry(struct rib_head *rnh, struct rt_addrinfo *info, - struct rtentry **prt) +add_route_byinfo(struct rib_head *rnh, struct rt_addrinfo *info, + struct rib_cmd_info *rc) { - struct sockaddr *dst, *ndst, *gateway, *netmask; - struct rtentry *rt; + struct nhop_object *nh_orig; + struct route_nhop_data rnd_orig, rnd_add; struct nhop_object *nh; + struct rtentry *rt, *rt_orig; + struct sockaddr *dst, *gateway, *netmask; int error, flags; dst = info->rti_info[RTAX_DST]; @@ -663,65 +688,17 @@ create_rtentry(struct rib_head *rnh, struct rt_addrinfo *info, return (error); } - error = nhop_create_from_info(rnh, info, &nh); - if (error != 0) - return (error); - - rt = uma_zalloc(V_rtzone, M_NOWAIT | M_ZERO); - if (rt == NULL) { - nhop_free(nh); + if ((rt = create_rtentry(rnh, dst, netmask)) == NULL) return (ENOBUFS); - } - rt->rte_flags = (RTF_UP | flags) & RTE_RT_FLAG_MASK; - rt->rt_nhop = nh; - - /* Fill in dst */ - memcpy(&rt->rt_dst, dst, dst->sa_len); - rt_key(rt) = &rt->rt_dst; - /* - * point to the (possibly newly malloc'd) dest address. - */ - ndst = (struct sockaddr *)rt_key(rt); - - /* - * make sure it contains the value we want (masked if needed). - */ - if (netmask) { - rt_maskedcopy(dst, ndst, netmask); - } else - bcopy(dst, ndst, dst->sa_len); - /* Set netmask to the storage from info. It will be updated upon insertion */ - rt_mask(rt) = netmask; - - /* - * We use the ifa reference returned by rt_getifa_fib(). - * This moved from below so that rnh->rnh_addaddr() can - * examine the ifa and ifa->ifa_ifp if it so desires. - */ - rt->rt_weight = get_info_weight(info, RT_DEFAULT_WEIGHT); - - *prt = rt; - return (0); -} - -static int -add_route_byinfo(struct rib_head *rnh, struct rt_addrinfo *info, - struct rib_cmd_info *rc) -{ - struct nhop_object *nh_orig; - struct route_nhop_data rnd_orig, rnd_add; - struct nhop_object *nh; - struct rtentry *rt, *rt_orig; - int error; - - error = create_rtentry(rnh, info, &rt); - if (error != 0) + error = nhop_create_from_info(rnh, info, &nh); + if (error != 0) { + uma_zfree(V_rtzone, rt); return (error); + } - rnd_add.rnd_nhop = rt->rt_nhop; - rnd_add.rnd_weight = rt->rt_weight; - nh = rt->rt_nhop; + rnd_add.rnd_nhop = nh; + rnd_add.rnd_weight = get_info_weight(info, RT_DEFAULT_WEIGHT); RIB_WLOCK(rnh); error = add_route(rnh, rt, &rnd_add, rc);