From nobody Mon Aug 29 10:23:48 2022 X-Original-To: dev-commits-src-all@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 4MGRP06LQCz4Zp6Z; Mon, 29 Aug 2022 10:23:48 +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 4MGRP059xTz3tW8; Mon, 29 Aug 2022 10:23:48 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1661768628; 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=25W11GHVbV2bZUwtoEM6rtH3X6LdXk6ydBhaEbnAeFw=; b=FPAWn0C2ajfVU0TlW2ruvd/mCUXc+3iGsWELlDmwWPWk4XarwPeuH8xqECw3lluMWRlraQ 1Epth8jcTOBPN1baqJNlILYhCpEWWXGGNMl9Lu1Qg0AodS2ewTqsqq5XikNqiWZBv3kL6e RzL5rDiPuDC5R9nvBb9wRl4ZR3of495wQDnffJp9ZmYEIKF6Uggx/zwy5csNSOeJKi2ALe yLqt1g+5rz4YaMKOTt9O8vlG5r1QIUupS68ZKqtSqIyyvSHYKU754YBDhibC2MVks87Yh7 /b3gGHr7UdBLxLIn8ogi118SdygNkTxfZYdWe930F/JuY0MWMd5Tc/JGMrGj9g== 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 4MGRP03XbdzPKK; Mon, 29 Aug 2022 10:23:48 +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 27TANmnZ015034; Mon, 29 Aug 2022 10:23:48 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 27TANmJa015033; Mon, 29 Aug 2022 10:23:48 GMT (envelope-from git) Date: Mon, 29 Aug 2022 10:23:48 GMT Message-Id: <202208291023.27TANmJa015033@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: d8b2693414ae - main - routing: add rib_add_default_route() wrapper List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@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/main X-Git-Reftype: branch X-Git-Commit: d8b2693414ae5cebdbd4c64c9559275c4baff11e Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1661768628; 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=25W11GHVbV2bZUwtoEM6rtH3X6LdXk6ydBhaEbnAeFw=; b=iYuyRoSf2SSTqOIwQl8VTXNsbiNX2pJMLEWHo3QEmhGc7/phqJoo7pNZkNBLbXS9PpS6K1 760V8K2FDWG0P2kJ1sN8JHSKb6VG4E5w+or2JtsglkDs1Tb8sRKRi5rfeVhiH/eybPv1v0 j9ibT1ZNCXRFjRQbT0dKwO01iG7VyYgoTB0muo1N7jWkKcDTwoZuNQK8l89JcRjk1Jf0SV Psgm8HPQ6yF1aTxgBZOLOPvfkqaZ2ok/U7d5o2nTbKYIYPirA+tSTzsU3b50YHT7IwUnxJ P6HnIkHpT+vjD+TNplQROjSAgXZh/3yEBRsVcHPPv9jtmeqUMzuj+S2RtoVGUA== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1661768628; a=rsa-sha256; cv=none; b=Tm1ruXTlStDfCl8MnW0qoU940Nn5kCeZ4FJMNuphTWuNJRqR3KdrvJ5a1RW3MdMoK3V6Tm bgnKB2T2KuMFCuKjoflOZzp6RAGlii9DU8ZCVGRjJnV6rDWTLPFSCBsJTphMDQZZT6kwgP TG4nB6+SCebUk9euxaJOq0okw0rlQHBysDS//VhTDblEw5gtm5nWGI1NEolhbMnTx2rlJ+ sbwU+y7d4QB5R74l/fZIWpR5VJQ6KAEh93xcnetqn00Qc3mgIpBEuYH/lyT+xcZyLwak3S rvs3N2COUtfhTs37pp5n9B7k1AHpHb2tWVddhFcMuT11s0IksOCG4kQOp7jKCA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by melifaro: URL: https://cgit.FreeBSD.org/src/commit/?id=d8b2693414ae5cebdbd4c64c9559275c4baff11e commit d8b2693414ae5cebdbd4c64c9559275c4baff11e Author: Alexander V. Chernikov AuthorDate: 2022-08-09 13:34:28 +0000 Commit: Alexander V. Chernikov CommitDate: 2022-08-29 10:08:24 +0000 routing: add rib_add_default_route() wrapper Multiple consumers in the kernel space want to install IPv4 or IPv6 default route. Provide convenient wrapper to simplify the code inside the customers. MFC after: 1 month Differential Revision: https://reviews.freebsd.org/D36167 --- sys/net/route/route_ctl.h | 4 ++-- sys/net/route/route_helpers.c | 56 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+), 2 deletions(-) diff --git a/sys/net/route/route_ctl.h b/sys/net/route/route_ctl.h index 2d43679ad183..530a8fb5c8f0 100644 --- a/sys/net/route/route_ctl.h +++ b/sys/net/route/route_ctl.h @@ -83,8 +83,8 @@ int rib_del_kernel_px(uint32_t fibnum, struct sockaddr *dst, int plen, int rib_match_gw(const struct rtentry *rt, const struct nhop_object *nh, void *_data); -int rib_match_gw(const struct rtentry *rt, const struct nhop_object *nh, - void *gw_sa); +int rib_add_default_route(uint32_t fibnum, int family, struct ifnet *ifp, + struct sockaddr *gw, struct rib_cmd_info *rc); typedef void route_notification_t(struct rib_cmd_info *rc, void *); void rib_decompose_notification(struct rib_cmd_info *rc, diff --git a/sys/net/route/route_helpers.c b/sys/net/route/route_helpers.c index 9f18b9bfcc63..a9d21ebfb507 100644 --- a/sys/net/route/route_helpers.c +++ b/sys/net/route/route_helpers.c @@ -409,6 +409,62 @@ rib_decompose_notification(struct rib_cmd_info *rc, route_notification_t *cb, } #endif +union sockaddr_union { + struct sockaddr sa; + struct sockaddr_in sin; + struct sockaddr_in6 sin6; + char _buf[32]; +}; + +/* + * Creates nexhops suitable for using as a default route nhop. + * Helper for the various kernel subsystems adding/changing default route. + */ +int +rib_add_default_route(uint32_t fibnum, int family, struct ifnet *ifp, + struct sockaddr *gw, struct rib_cmd_info *rc) +{ + struct route_nhop_data rnd = { .rnd_weight = RT_DEFAULT_WEIGHT }; + union sockaddr_union saun = {}; + struct sockaddr *dst = &saun.sa; + int error; + + switch (family) { +#ifdef INET + case AF_INET: + saun.sin.sin_family = AF_INET; + saun.sin.sin_len = sizeof(struct sockaddr_in); + break; +#endif +#ifdef INET6 + case AF_INET6: + saun.sin6.sin6_family = AF_INET6; + saun.sin6.sin6_len = sizeof(struct sockaddr_in6); + break; +#endif + default: + return (EAFNOSUPPORT); + } + + struct ifaddr *ifa = ifaof_ifpforaddr(gw, ifp); + if (ifa == NULL) + return (ENOENT); + + struct nhop_object *nh = nhop_alloc(fibnum, family); + if (nh == NULL) + return (ENOMEM); + + nhop_set_gw(nh, gw, true); + nhop_set_transmit_ifp(nh, ifp); + nhop_set_src(nh, ifa); + nhop_set_pxtype_flag(nh, NHF_DEFAULT); + rnd.rnd_nhop = nhop_get_nhop(nh, &error); + + if (error == 0) + error = rib_add_route_px(fibnum, dst, 0, &rnd, RTM_F_CREATE, rc); + return (error); +} + #ifdef INET /* * Checks if the found key in the trie contains (<=) a prefix covering