From nobody Sun Jun 28 02:50:50 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id BCBFDC433EF for ; Wed, 16 Feb 2022 01:08:44 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S245454AbiBPBIx (ORCPT ); Tue, 15 Feb 2022 20:08:53 -0500 Received: from mxb-00190b01.gslb.pphosted.com ([23.128.96.19]:54730 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S245343AbiBPBHz (ORCPT ); Tue, 15 Feb 2022 20:07:55 -0500 Received: from EUR02-HE1-obe.outbound.protection.outlook.com (mail-eopbgr10111.outbound.protection.outlook.com [40.107.1.111]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 405A8F9FA1; Tue, 15 Feb 2022 17:07:39 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=dwdIGoCLjcV5c7a0VuxMdtUMhLXzpgrXXI7VZy1NsB360qzfiVWiSSTcVdRqj73FJrrBTGx5RUBZfmr1SKkTs7y1tBRfqRGN4eSBNFVy2QiPMhEZqugrvvLCBietkPhNFz1sxWVqq67edZQj8tn2cGPUUbFasW0QQTfTddtuVQnMzIjgx86Qg3r88fOxgkQtWfp4HmnC9sy7+iZFjQK+m9zBdhh2whkGiEdqohyZ7TfCCtAow4HKuYYRpa3Y8W9DXdPeP08+Dpk/cOVit49PBqs4hGLl6v/MD1cDHTkDMQrO1939sI2rXgtcov4D/JGFVoHWXvHIrVxnTiiFDx3xUw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=OxIMZ9YHbefx+KaGMM7Z/e+D9tx6S9Z9HnDaFqgHSbY=; b=SKfujQPwbXhbmzgXf3pecuXzN0ZpAiWbfpq5yaHu/vlU0mFoEUaNJ/x9tTvmw1MdjyKtI4xP8CYdWYcdn7qNNAZS1vrq3tzt60BCp2d2bO+mrotAIKPCTfxhXlXRYuVLaxPSGjS9/Gd8KYagMC9C2zrXjKGFD3JwMeylPxM89vU0xgUPiADstfjDKnGtk6+sLZSciy8CDsR6iR/eKS6O1p/K6WSDp45Nd1NwXJ72Yf75f5hV7PbVZFwEUl+Mn4705Bnzm0OLli6vkGJ4lBbj+QVF9YiJJkiQ9CabeZX4WiNZOgsuHcJ6Z+ekv3nKnyGgxMBrkCLqQ/J4NNA1ILkVfQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=plvision.eu; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=OxIMZ9YHbefx+KaGMM7Z/e+D9tx6S9Z9HnDaFqgHSbY=; b=dzIFKdG0F421Gz5oE/Twfy2KoUUCvJjotSEb/zPjdq/mVTbAPkZFS2ReaTrOxeciDRO1U8Fc0IHV0ErXRnh1t1f2E22VhoRMztz3Onzd1k7KUY147QWqDhDLufskSoSsk+C2gFEjDQcy6ZPQDe/THcBhRrGSE87clzY3u5qhbng= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=plvision.eu; Received: from AM9P190MB1122.EURP190.PROD.OUTLOOK.COM (2603:10a6:20b:262::24) by AM9P190MB1169.EURP190.PROD.OUTLOOK.COM (2603:10a6:20b:266::23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4975.15; Wed, 16 Feb 2022 01:07:35 +0000 Received: from AM9P190MB1122.EURP190.PROD.OUTLOOK.COM ([fe80::c93a:58e1:db16:e117]) by AM9P190MB1122.EURP190.PROD.OUTLOOK.COM ([fe80::c93a:58e1:db16:e117%5]) with mapi id 15.20.4995.014; Wed, 16 Feb 2022 01:07:35 +0000 From: Yevhen Orlov To: netdev@vger.kernel.org Cc: Volodymyr Mytnyk , Taras Chornyi , Mickey Rachamim , Serhiy Pshyk , Yevhen Orlov , Taras Chornyi , Oleksandr Mazur , "David S. Miller" , Jakub Kicinski , linux-kernel@vger.kernel.org Subject: [PATCH net-next 1/3] net: marvell: prestera: Add router LPM ABI Date: Wed, 16 Feb 2022 03:05:55 +0200 Message-Id: <20220216010557.11483-2-yevhen.orlov@plvision.eu> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20220216010557.11483-1-yevhen.orlov@plvision.eu> References: <20220216010557.11483-1-yevhen.orlov@plvision.eu> X-ClientProxiedBy: FR3P281CA0078.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:1f::19) To AM9P190MB1122.EURP190.PROD.OUTLOOK.COM (2603:10a6:20b:262::24) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: c28eaa87-d18d-4091-ab6f-08d9f0e8b77f X-MS-TrafficTypeDiagnostic: AM9P190MB1169:EE_ X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:1060; X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: MgRcX+zbgmjY92HC9dFHOEJ5xUXvcd5YhTLUlF8jSMCCMurwf0QuTX8E4sDI0sKB4xXZ4MkojyqjhBOX+RX5dZK4ZDmODDp+kC3uY0lbEzDST63cBenzwgGFyPoFG32uwLZU1wNk8Cj/cobsViwdBK0gXQRl2i807oARkY/dQGykvIwUIK7txgQ8FJUxce2XLK6nAu+YyJFlkYwdDhO5xeEYzK9mikLWQCeH3+mfk1jx83h+89cEz+AyeNE0vH+q7vA0BwGAZ0D6ssdsXgsGlrDCKrNKt2ZDXjroChehYncynrQLcsQ0rRuP8EOi5KU9FEtsUaBdSGoKN4d3dY3jDVAJ8uaACOzuGSNjqmVIp2HV1GovugyCdmJwxkZMvBsfPxbddVhc2Mo38cxSfHvohaAIG07vB1XhreAC8yDJov3pRq5wM/2tYbe9qGCFkSkakf3j81BUaYYYjnD/j2LxCSzo1H4yJZ2JdkrXP/aVqP82JWfTxPZSavzIXfjQjn8vm+pL87ExCgFw68zDUj1MQ86tQzuG6VaJ/o8CwUGqWr3+VtZKXKRij/fpiYWpuZ9FxrtsQT4K7Z4B7m/IfL5Yaav1/Eyo8U+pGKZKD+m3wtvAm4eMuboDZrtCnw2wSa0GJpn64vXHdO7c3L7INMpoDT1M/wd+gwuhqxE4bXePAeB2tpme3avPC7HF1hnVymXdjoJAMMPY1Ef82VkS5kxnKw== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AM9P190MB1122.EURP190.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230001)(39830400003)(396003)(376002)(346002)(366004)(136003)(6666004)(5660300002)(44832011)(66574015)(36756003)(38350700002)(86362001)(52116002)(6506007)(8936002)(66556008)(66476007)(66946007)(38100700002)(8676002)(54906003)(6916009)(316002)(4326008)(6486002)(508600001)(2616005)(2906002)(83380400001)(186003)(26005)(6512007)(1076003);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?9tz4NzNhjENRtIXN8zGYY661ZU0oRAutTMsSDkB5aYXrc3cYztzLgFo05HJv?= =?us-ascii?Q?m8sJ3PuxNRDhfDZ4FekBlqP4sK/PSDa+ePOLZUxjPK22vlEjsg6IlC9i32Yy?= =?us-ascii?Q?oPe/MatrBsCGnQbWh35B5RbGMBwsYyC46xoZWo8tqHduLTNumky5WHP4edde?= =?us-ascii?Q?9q3QPtS2X7s+PsyrR8UslFGLTinYrA+uCv6ReQcd9v4XWFYQF+5fbiTK2y3C?= =?us-ascii?Q?KkZftzDR1ICcA13CsXy/BF+mS8O15F2oudgnRRg3hvaZY4qS7DZpZCLmRXgR?= =?us-ascii?Q?5+Hy6u74LuDOuK4wb13NOq0kGDADNtncewg6RXmJ3zubIauOfs6JcZ4vZ+4n?= =?us-ascii?Q?ImrmoBBvqsXNAGxrXETWi8FIZSdI983G6n5V1w1jhfHCIYqB3qXaljrlRVL3?= =?us-ascii?Q?X64PgNzQXTNbyrM9WpM3yVHpWVpeQOPyp/2JabvsafezwD5YAUYmrE0afXtV?= =?us-ascii?Q?5rOafVtp4Crb94qOnp8i64YQMJuAsGKgyRUIpqoHCEs6SUCFUYezZh9Y+kFn?= =?us-ascii?Q?Rsjtv4BdYKGRKae3yfYkAi5dmqAyjRoNBnp79RTjzDesD/Nu4yY+0nk/mvvB?= =?us-ascii?Q?lVzbJusRtmVod+Wiimvku4LrNGUSeGMTy1WoWNGVKkflku6EzYgFuR30yLPe?= =?us-ascii?Q?BTd3i3lyZjawxjTAilbnW/s2gugh9Q831UApry2y/vhRRQ+dKt765CA/0QrZ?= =?us-ascii?Q?b0hMuOF/h3vgrxtTk61xWxXvDauBSbcrntzM5DTeC7rysBNOLTcsh8kc3EQD?= =?us-ascii?Q?Pv1OTXhLrzXDIdNqkK66hw5/02qutMba/se4JHvMW7KeM8Qg0Y7rW7cVpM1D?= =?us-ascii?Q?OfrmcgRpix8QjAS/fJA9EzWAT99ix8OJxk5PeA+9d5kHVZXOIAvUtsh8dBcK?= =?us-ascii?Q?mp+kXcWA3Fkd9Icj5376rMTE36DdUu4pbS9W3gluaow5pwRyHq3NiNDYJzfF?= =?us-ascii?Q?4f2OP34j5nkdAphAV89m0La71fesxo2Pjkva2SdQqpOK9pZ7CPkizW/R0VNS?= =?us-ascii?Q?+W/0wqszr7wFe37Q3q7ApTx4P/Jacew7IOOv6nsd1PLwbVExkRH8SqNZuxzA?= =?us-ascii?Q?z6VXCXNifo1D76D8/ZZv4UnHg8esG2fok8QcP2fDpbQuf3Wjpgi/Hf0H1VOq?= =?us-ascii?Q?KYLU0ttUVceb47S2jOme72zUfemA7aH7NYVcmGBGrUXqrZJjQYAX1Qoh6+Yn?= =?us-ascii?Q?PX6n1XZWcyVZCRv/3HKpVjvpFvmueNXXZ8AdFKf7i5M6xcCrxBflFrAXGaqN?= =?us-ascii?Q?3W5SzRTgmAAjMS0LgYbFFfgLfRboxdkhqZO5XHsrng3i15SFLPpsBj5y92LH?= =?us-ascii?Q?wOb0ZwTzjsFS6SvMI9b21NcecooupsD7uh0YT2d7yVjm6tjV4gM0VwsjPIFG?= =?us-ascii?Q?KPTncgqbW5wjnS6/IeLX7RhalaNEvq7iZ1+mdpi8i+HYmXWgaZXS74UuhsmY?= =?us-ascii?Q?upUEiwdO6dDhzNbuCbapjY8t+NWbbaRme7/qrSkhpztiAFxrBm3kP2JKGcyq?= =?us-ascii?Q?GoCeutqAMueH3AveUN7TlD1mFteGsxk5G3mbx17NNQmnh0WxA0cI10GBcq/u?= =?us-ascii?Q?J1Vgc7w8xDOlbIq3rq/TMAxLA6hNAbHofC8caXtzfkHtDAZgB0EGcJ01MdHv?= =?us-ascii?Q?dWS+dy80wQe6E35PGCi6OihDWFJu+nfWLxIYhswru0eakx137dwERVJEvmxW?= =?us-ascii?Q?O6MjQOJGGsX6WXNLkQ5h2Fw+o6o=3D?= X-OriginatorOrg: plvision.eu X-MS-Exchange-CrossTenant-Network-Message-Id: c28eaa87-d18d-4091-ab6f-08d9f0e8b77f X-MS-Exchange-CrossTenant-AuthSource: AM9P190MB1122.EURP190.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 16 Feb 2022 01:07:35.2561 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 03707b74-30f3-46b6-a0e0-ff0a7438c9c4 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: ctg1mZvTueLWLLek/6+J3idrLKEnRKB+RkL2NXarrTYpoO6dk8vvkIwkJS47g3dejz+EwuIKpIbmmT4NKt3s0QM9em86RiTY8lUHI/ve3Lg= X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM9P190MB1169 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add functions to create/delete lpm entry in hw. prestera_hw_lpm_add() take index of allocated virtual router. Also it takes grp_id, which is index of allocated nexthop group. ABI to create nexthop group will be added soon. Co-developed-by: Taras Chornyi Signed-off-by: Taras Chornyi Co-developed-by: Oleksandr Mazur Signed-off-by: Oleksandr Mazur Signed-off-by: Yevhen Orlov --- .../ethernet/marvell/prestera/prestera_hw.c | 49 +++++++++++++++++++ .../ethernet/marvell/prestera/prestera_hw.h | 6 +++ 2 files changed, 55 insertions(+) diff --git a/drivers/net/ethernet/marvell/prestera/prestera_hw.c b/drivers/= net/ethernet/marvell/prestera/prestera_hw.c index e6bfadc874c5..fca25b796cf7 100644 --- a/drivers/net/ethernet/marvell/prestera/prestera_hw.c +++ b/drivers/net/ethernet/marvell/prestera/prestera_hw.c @@ -55,6 +55,8 @@ enum prestera_cmd_type_t { =20 PRESTERA_CMD_TYPE_ROUTER_RIF_CREATE =3D 0x600, PRESTERA_CMD_TYPE_ROUTER_RIF_DELETE =3D 0x601, + PRESTERA_CMD_TYPE_ROUTER_LPM_ADD =3D 0x610, + PRESTERA_CMD_TYPE_ROUTER_LPM_DELETE =3D 0x611, PRESTERA_CMD_TYPE_ROUTER_VR_CREATE =3D 0x630, PRESTERA_CMD_TYPE_ROUTER_VR_DELETE =3D 0x631, =20 @@ -499,6 +501,15 @@ struct prestera_msg_iface { u8 __pad[3]; }; =20 +struct prestera_msg_ip_addr { + union { + __be32 ipv4; + __be32 ipv6[4]; + } u; + u8 v; /* e.g. PRESTERA_IPV4 */ + u8 __pad[3]; +}; + struct prestera_msg_rif_req { struct prestera_msg_cmd cmd; struct prestera_msg_iface iif; @@ -515,6 +526,15 @@ struct prestera_msg_rif_resp { u8 __pad[2]; }; =20 +struct prestera_msg_lpm_req { + struct prestera_msg_cmd cmd; + struct prestera_msg_ip_addr dst; + __le32 grp_id; + __le32 dst_len; + __le16 vr_id; + u8 __pad[2]; +}; + struct prestera_msg_vr_req { struct prestera_msg_cmd cmd; __le16 vr_id; @@ -598,9 +618,11 @@ static void prestera_hw_build_tests(void) BUILD_BUG_ON(sizeof(struct prestera_msg_counter_stats) !=3D 16); BUILD_BUG_ON(sizeof(struct prestera_msg_rif_req) !=3D 36); BUILD_BUG_ON(sizeof(struct prestera_msg_vr_req) !=3D 8); + BUILD_BUG_ON(sizeof(struct prestera_msg_lpm_req) !=3D 36); =20 /* structure that are part of req/resp fw messages */ BUILD_BUG_ON(sizeof(struct prestera_msg_iface) !=3D 16); + BUILD_BUG_ON(sizeof(struct prestera_msg_ip_addr) !=3D 20); =20 /* check responses */ BUILD_BUG_ON(sizeof(struct prestera_msg_common_resp) !=3D 8); @@ -1891,6 +1913,33 @@ int prestera_hw_vr_delete(struct prestera_switch *sw= , u16 vr_id) sizeof(req)); } =20 +int prestera_hw_lpm_add(struct prestera_switch *sw, u16 vr_id, + __be32 dst, u32 dst_len, u32 grp_id) +{ + struct prestera_msg_lpm_req req =3D { + .dst_len =3D __cpu_to_le32(dst_len), + .vr_id =3D __cpu_to_le16(vr_id), + .grp_id =3D __cpu_to_le32(grp_id), + .dst.u.ipv4 =3D dst + }; + + return prestera_cmd(sw, PRESTERA_CMD_TYPE_ROUTER_LPM_ADD, &req.cmd, + sizeof(req)); +} + +int prestera_hw_lpm_del(struct prestera_switch *sw, u16 vr_id, + __be32 dst, u32 dst_len) +{ + struct prestera_msg_lpm_req req =3D { + .dst_len =3D __cpu_to_le32(dst_len), + .vr_id =3D __cpu_to_le16(vr_id), + .dst.u.ipv4 =3D dst + }; + + return prestera_cmd(sw, PRESTERA_CMD_TYPE_ROUTER_LPM_DELETE, &req.cmd, + sizeof(req)); +} + int prestera_hw_rxtx_init(struct prestera_switch *sw, struct prestera_rxtx_params *params) { diff --git a/drivers/net/ethernet/marvell/prestera/prestera_hw.h b/drivers/= net/ethernet/marvell/prestera/prestera_hw.h index 3ff12bae5909..fd896a8838bb 100644 --- a/drivers/net/ethernet/marvell/prestera/prestera_hw.h +++ b/drivers/net/ethernet/marvell/prestera/prestera_hw.h @@ -249,6 +249,12 @@ int prestera_hw_rif_delete(struct prestera_switch *sw,= u16 rif_id, int prestera_hw_vr_create(struct prestera_switch *sw, u16 *vr_id); int prestera_hw_vr_delete(struct prestera_switch *sw, u16 vr_id); =20 +/* LPM PI */ +int prestera_hw_lpm_add(struct prestera_switch *sw, u16 vr_id, + __be32 dst, u32 dst_len, u32 grp_id); +int prestera_hw_lpm_del(struct prestera_switch *sw, u16 vr_id, + __be32 dst, u32 dst_len); + /* Event handlers */ int prestera_hw_event_handler_register(struct prestera_switch *sw, enum prestera_event_type type, --=20 2.17.1 From nobody Sun Jun 28 02:50:50 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 21599C433FE for ; Wed, 16 Feb 2022 01:09:38 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S245539AbiBPBJq (ORCPT ); Tue, 15 Feb 2022 20:09:46 -0500 Received: from mxb-00190b01.gslb.pphosted.com ([23.128.96.19]:55424 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S245391AbiBPBII (ORCPT ); Tue, 15 Feb 2022 20:08:08 -0500 Received: from EUR02-HE1-obe.outbound.protection.outlook.com (mail-eopbgr10111.outbound.protection.outlook.com [40.107.1.111]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 26E47FA22A; Tue, 15 Feb 2022 17:07:42 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=WQGLzfV4IxT82i5vF/ODvaZMp0yJwvJnF3bAb0Lh8sYcZQACwJ4QZq/9iavX5APUaSDqKZ67N6kOviHzx9AHlAB/Z8EJjGYJOcRevYLYCpaP/HKTpIm1CB6g00KkuZcaIDo/g8W8duocKDpuBhRLyrqw8jx+9zDiYQsdEyultgySteYMNXVaIlkKOP1nq9OVtJvQSr1aRhqNksHFwYZm5hTYGjATcteCSMD6w5se0HjwrOwiCh+oyLrIG7T5k74alXMn60BV5DV04mT2OuUyy5HWWol35PMXayRVq9gJCb7UyYTr4WKkqvp/w4prtNXQV2UnqIu5eOIfmHk2z3VnJQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=HQcbTrtWRez8C6Q8T9DjQaxiQHGEGlQLTX26yAMOuAo=; b=WCt88oqQcRrHN39OfyEx4MkBEQLmikBOEve0pAwQGA3hLaRd5lZ+QKYO3JbcjPU50CxJYTsEdLMYxEuEs4mm2W5cdpf03sSjJef9BTY6acxWpeuvh7B95D5Ql4HJfS50nVDC6MUAUMykd2MsGWW3VbYn+StRnLA8QgNX9RJT5wVCq6dvQLIY56nfnoxvNVylAXGRZEYaG/lu/yN+2RvQFg15MSRZYycIY4mGP94I2Xesq5hdKb4zXVdUADQmo5NPheMSnqM8+CpXIP+jHe7H20Y0HZuTGlo0696i7PCScNLRLF/vI7FSyg6yHKwPldfh8XY1/F2zS1Z1P51jp51YrA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=plvision.eu; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=HQcbTrtWRez8C6Q8T9DjQaxiQHGEGlQLTX26yAMOuAo=; b=qx/4OcSYkBH4RXiVTox8/aAJUQIyeNCckFD/pwHVHJ0D6mL8COodwMHixwmCOS6T/hXaIUKnJiisFHFbc96AHZ+LDeyzDvFjRQXGzZzfj02FQ+uv9ydykErKRqc/yCo6HLtwQnI4B/y4iBUIh9pdQ64q/yJqzvYzXLsakXAz56I= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=plvision.eu; Received: from AM9P190MB1122.EURP190.PROD.OUTLOOK.COM (2603:10a6:20b:262::24) by AM9P190MB1169.EURP190.PROD.OUTLOOK.COM (2603:10a6:20b:266::23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4975.15; Wed, 16 Feb 2022 01:07:36 +0000 Received: from AM9P190MB1122.EURP190.PROD.OUTLOOK.COM ([fe80::c93a:58e1:db16:e117]) by AM9P190MB1122.EURP190.PROD.OUTLOOK.COM ([fe80::c93a:58e1:db16:e117%5]) with mapi id 15.20.4995.014; Wed, 16 Feb 2022 01:07:36 +0000 From: Yevhen Orlov To: netdev@vger.kernel.org Cc: Volodymyr Mytnyk , Taras Chornyi , Mickey Rachamim , Serhiy Pshyk , Yevhen Orlov , Taras Chornyi , Oleksandr Mazur , "David S. Miller" , Jakub Kicinski , linux-kernel@vger.kernel.org Subject: [PATCH net-next 2/3] net: marvell: prestera: add hardware router objects accounting for lpm Date: Wed, 16 Feb 2022 03:05:56 +0200 Message-Id: <20220216010557.11483-3-yevhen.orlov@plvision.eu> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20220216010557.11483-1-yevhen.orlov@plvision.eu> References: <20220216010557.11483-1-yevhen.orlov@plvision.eu> X-ClientProxiedBy: FR3P281CA0078.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:1f::19) To AM9P190MB1122.EURP190.PROD.OUTLOOK.COM (2603:10a6:20b:262::24) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 4327a48f-388b-454f-5695-08d9f0e8b85b X-MS-TrafficTypeDiagnostic: AM9P190MB1169:EE_ X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:136; X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: DF0WDFMfB0Q1pTcDU/5O4aA/BIeF7tJOVs0hhIgOB6c9qaPDXMfblDB9Yl9d/rMf4ylplpuSqKRM9ikQ6sRYHLrAxbbph4NaY/b0t8GhDy0wK/0ZLSnkVaZf0SJULpzSWcr5fa42hBUm2DsUSS4FVCCpgZVDUuTy48aIKE2pQxrdl8fE6jYKp/YZGIyydTIlPezAlmYWC9U9FwTLRVNgHHAiGwKrnJCMZg6oQH5gC5nzyvYMOIrr5VXEfdi8jJNmDpaD4ZBrxX1BpMPY63HAK52le3yr2kdOJWIr/YJumfEWxnpEOdRuGWCoBFhbZYeBBOiUqFuwnI9o/BpwqFYrHyP2alcTulqS+9fBPhHHV1B7IOn7wd+v0JiZVkyDQdM0njylJGc/OmX2lDlFs5Eha6kZsQX198IRYzGTStqkf2Lt7WYEkKlfuM6fBG4k9omnm2xVQKwnslv3iglQLTXGyec445gd1sYcJ8fA+WFEfcDMsuZO4/WxFiF3y5vt/6caYPo4fyYEXaMwTNu5P6O1fnGLDYL+iyTE+5aDBSbH4/10ETm3bd2aholAijJTXscCfVrvcrAVRMtAOM26mcZfXiRIK0T2/Qa7BJyPCPUSWUb/zx+mpIL7rOHfBOUZxliTGNqYWnxqJWAT+NAjFVaxH+rMnIb9z3QuyPZelUX8e3xE/cxuazv6AlFxjAF1RMUGfhpak1QoNSt4DhFWf+rnPw== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AM9P190MB1122.EURP190.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230001)(39830400003)(396003)(376002)(346002)(366004)(136003)(6666004)(5660300002)(44832011)(66574015)(36756003)(38350700002)(86362001)(52116002)(6506007)(8936002)(66556008)(66476007)(66946007)(38100700002)(8676002)(54906003)(6916009)(316002)(4326008)(6486002)(508600001)(2616005)(2906002)(83380400001)(186003)(26005)(6512007)(1076003);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?b+AwrkSPpvgw6xzT7uL2xalxqVbMQf1tekOrW5c+vY8DXtPV+OJ7WGLMSdp+?= =?us-ascii?Q?El1rEJd0rli3CCCpEroyl9NHK49O42t05HwjWhBuTuPVMMxgIrw7FBigWn8a?= =?us-ascii?Q?lL+GZoXNqafM4yLDiXi9wDPWuCFXxBviDuW5BtBfKaH+afMy3vOIyH0/L2CT?= =?us-ascii?Q?SUd7T7ONML8KUxAlCZCPRZEqcVQ1fBOx4UGzu46HOfLFU1up2ng6YNsMxLia?= =?us-ascii?Q?9rD+bX7ltdP/wznMMLJR/hbRhQ9zJFNrVBmkMlVfDQyG+7P+/pY+254J1pLT?= =?us-ascii?Q?ZtG7dQdOL0RizSiTHn5UHqH+6UPijt29bDqwC78q9cLOH3FMbC1vdGS4bh9E?= =?us-ascii?Q?y5HilzoBU+y99gMWAnKM9iAUCYNax4tBZg6aacLXTnuZ+qvCxAdQVE0UhFc0?= =?us-ascii?Q?pK9slZtvMt662R7cip8mLzhaw28U5i2//WtXmxoUfhCUYPjsJOleqkcqFyYx?= =?us-ascii?Q?3q23Rm3l3dsPV5YzIq94otWBAD8+tg6xBoWO7Y278LuLgLgZOcmpG930QIbY?= =?us-ascii?Q?NOUS4sF3dw3QQ3Bb5z7MzT3xo2atvNRIRq2EY6WCyBfIOBAasYuze0z8oqID?= =?us-ascii?Q?gEVwvNoQakblH43Rd4mCl4LlTJXld/kiqcwGN57lOc4YM+vJ8XZMzxbnTSdZ?= =?us-ascii?Q?K+KMPudEMaWkOmsbhozG7KCF5lqAWoMVt9zAUJfoysuXobN5mn0V49K5EvTq?= =?us-ascii?Q?XeQDr8l8VSZ3K1MroGXJDWOxOxWDfzMT/3+RGqpBq7RY3+MM8Izo3V6z/DFu?= =?us-ascii?Q?LvociJM5tAHl3lCCFOyMdZ0fifXW9agPVIczbs2iveTWUHazq/BJj1ooTOCz?= =?us-ascii?Q?u4HBUARKBYiBisRoqRKizibCfxG5jE2gnXlalDPNDxiQWrWSNxwECKUBVYta?= =?us-ascii?Q?9QvZGBoSdmHmk6uEEQNjirKF+gauT2+ycmXAjdBApP8iGzXIokJlt7EAVva2?= =?us-ascii?Q?eQiFdmQLG2FcvUrkHQKN6zESsQxFpzRQRo0U/rWmgkduRi3GJA9XiGvWZxHt?= =?us-ascii?Q?L647C0l73Azv2yHQN6ftHe6EjBNNx4FIvUj0Xg129dIpiU9+69E02et09V/L?= =?us-ascii?Q?Xfckm1p3l+i5iOBS8W+nPMHZ6UaaXZ8YZ/lfUjXWGfJBhUicuRU2xYgKqNS1?= =?us-ascii?Q?6WTI40EVoaR+XoCFmVO9Tbu8V97ryp6bOQ0VQJSJrEO4MmCoalGMDP06ewdE?= =?us-ascii?Q?E2/nyiJSrFhQ/rJgYgeCHwQpY4KoZdxrAEvJU2F0Q92JoNDIK5U5WDdKDy7k?= =?us-ascii?Q?I9pcdOD2EATM+xLaTdVgASDIRIqD4pNmzVslFLgAMcBu2ZC/vCru2/QMbbW/?= =?us-ascii?Q?O9cEiC5IsrWmhCMEjKB/B4pv3kTQuI90r+361Lf/RSVmc2KKbveNdNKWVIE5?= =?us-ascii?Q?Osea/w2UEg72zpAXDgKpfsgKldX2bth+x+WityG/twHeTPPR1UD5ydIjdPX0?= =?us-ascii?Q?JeDPCZbfg+lySNMDqqDraps8c/armlEzddVNBUTKGFcwx9YQfYSdLXN3v/t4?= =?us-ascii?Q?lymZuJT5Yfg44oSU1iteQAR4PBjSy7XQnVtvrNnQPAFRdqt32VGKlMP3UXrQ?= =?us-ascii?Q?z5PcaqeNgnSybBQ6eyPDOXYYAOECqbm3bPwIy9vn+ncW/hvLG5nYxwkS2FLK?= =?us-ascii?Q?VBbIxKGoOqqJpSKF9OzxdsqZxzleKnVrrLgDOD27PG/BK72Zo4VcYEITp2jG?= =?us-ascii?Q?Ho5Dsg=3D=3D?= X-OriginatorOrg: plvision.eu X-MS-Exchange-CrossTenant-Network-Message-Id: 4327a48f-388b-454f-5695-08d9f0e8b85b X-MS-Exchange-CrossTenant-AuthSource: AM9P190MB1122.EURP190.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 16 Feb 2022 01:07:36.6958 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 03707b74-30f3-46b6-a0e0-ff0a7438c9c4 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 73hmy2GFJ1F9kMeC53Iv7i5fmT7wAzmjhj61XheVkMSJn6OTBuEtTzA97gqMRDjTXvLnGD8Jh04F1fjOJ7KyXaMWLnTFgUOkdE37R2paWos= X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM9P190MB1169 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add new router_hw object "fib_node". For now it support only DROP and TRAP mode. Co-developed-by: Taras Chornyi Signed-off-by: Taras Chornyi Co-developed-by: Oleksandr Mazur Signed-off-by: Oleksandr Mazur Signed-off-by: Yevhen Orlov --- .../net/ethernet/marvell/prestera/prestera.h | 1 + .../marvell/prestera/prestera_router_hw.c | 132 +++++++++++++++++- .../marvell/prestera/prestera_router_hw.h | 44 ++++++ 3 files changed, 170 insertions(+), 7 deletions(-) diff --git a/drivers/net/ethernet/marvell/prestera/prestera.h b/drivers/net= /ethernet/marvell/prestera/prestera.h index 2fd9ef2fe5d6..dcaddf685d21 100644 --- a/drivers/net/ethernet/marvell/prestera/prestera.h +++ b/drivers/net/ethernet/marvell/prestera/prestera.h @@ -281,6 +281,7 @@ struct prestera_router { struct prestera_switch *sw; struct list_head vr_list; struct list_head rif_entry_list; + struct rhashtable fib_ht; struct notifier_block inetaddr_nb; struct notifier_block inetaddr_valid_nb; }; diff --git a/drivers/net/ethernet/marvell/prestera/prestera_router_hw.c b/d= rivers/net/ethernet/marvell/prestera/prestera_router_hw.c index e5592b69ad37..d62adb970dd5 100644 --- a/drivers/net/ethernet/marvell/prestera/prestera_router_hw.c +++ b/drivers/net/ethernet/marvell/prestera/prestera_router_hw.c @@ -9,23 +9,41 @@ #include "prestera_acl.h" =20 /* +--+ - * +------->|vr| - * | +--+ - * | - * +-+-------+ - * |rif_entry| - * +---------+ - * Rif is + * +------->|vr|<-+ + * | +--+ | + * | | + * +-+-------+ +--+---+-+ + * |rif_entry| |fib_node| + * +---------+ +--------+ + * Rif is Fib - is exit point * used as * entry point * for vr in hw */ =20 +#define PRESTERA_NHGR_UNUSED (0) +#define PRESTERA_NHGR_DROP (0xFFFFFFFF) + +static const struct rhashtable_params __prestera_fib_ht_params =3D { + .key_offset =3D offsetof(struct prestera_fib_node, key), + .head_offset =3D offsetof(struct prestera_fib_node, ht_node), + .key_len =3D sizeof(struct prestera_fib_key), + .automatic_shrinking =3D true, +}; + int prestera_router_hw_init(struct prestera_switch *sw) { + int err; + + err =3D rhashtable_init(&sw->router->fib_ht, + &__prestera_fib_ht_params); + if (err) + goto err_fib_ht_init; + INIT_LIST_HEAD(&sw->router->vr_list); INIT_LIST_HEAD(&sw->router->rif_entry_list); =20 +err_fib_ht_init: return 0; } =20 @@ -33,6 +51,7 @@ void prestera_router_hw_fini(struct prestera_switch *sw) { WARN_ON(!list_empty(&sw->router->vr_list)); WARN_ON(!list_empty(&sw->router->rif_entry_list)); + rhashtable_destroy(&sw->router->fib_ht); } =20 static struct prestera_vr *__prestera_vr_find(struct prestera_switch *sw, @@ -212,3 +231,102 @@ prestera_rif_entry_create(struct prestera_switch *sw, err_kzalloc: return NULL; } + +struct prestera_fib_node * +prestera_fib_node_find(struct prestera_switch *sw, struct prestera_fib_key= *key) +{ + struct prestera_fib_node *fib_node; + + fib_node =3D rhashtable_lookup_fast(&sw->router->fib_ht, key, + __prestera_fib_ht_params); + return IS_ERR(fib_node) ? NULL : fib_node; +} + +static void __prestera_fib_node_destruct(struct prestera_switch *sw, + struct prestera_fib_node *fib_node) +{ + struct prestera_vr *vr; + + vr =3D fib_node->info.vr; + prestera_hw_lpm_del(sw, vr->hw_vr_id, fib_node->key.addr.u.ipv4, + fib_node->key.prefix_len); + switch (fib_node->info.type) { + case PRESTERA_FIB_TYPE_TRAP: + break; + case PRESTERA_FIB_TYPE_DROP: + break; + default: + pr_err("Unknown fib_node->info.type =3D %d", + fib_node->info.type); + } + + prestera_vr_put(sw, vr); +} + +void prestera_fib_node_destroy(struct prestera_switch *sw, + struct prestera_fib_node *fib_node) +{ + __prestera_fib_node_destruct(sw, fib_node); + rhashtable_remove_fast(&sw->router->fib_ht, &fib_node->ht_node, + __prestera_fib_ht_params); + kfree(fib_node); +} + +struct prestera_fib_node * +prestera_fib_node_create(struct prestera_switch *sw, + struct prestera_fib_key *key, + enum prestera_fib_type fib_type) +{ + struct prestera_fib_node *fib_node; + u32 grp_id; + struct prestera_vr *vr; + int err; + + fib_node =3D kzalloc(sizeof(*fib_node), GFP_KERNEL); + if (!fib_node) + goto err_kzalloc; + + memcpy(&fib_node->key, key, sizeof(*key)); + fib_node->info.type =3D fib_type; + + vr =3D prestera_vr_get(sw, key->tb_id, NULL); + if (IS_ERR(vr)) + goto err_vr_get; + + fib_node->info.vr =3D vr; + + switch (fib_type) { + case PRESTERA_FIB_TYPE_TRAP: + grp_id =3D PRESTERA_NHGR_UNUSED; + break; + case PRESTERA_FIB_TYPE_DROP: + grp_id =3D PRESTERA_NHGR_DROP; + break; + default: + pr_err("Unsupported fib_type %d", fib_type); + goto err_nh_grp_get; + } + + err =3D prestera_hw_lpm_add(sw, vr->hw_vr_id, key->addr.u.ipv4, + key->prefix_len, grp_id); + if (err) + goto err_lpm_add; + + err =3D rhashtable_insert_fast(&sw->router->fib_ht, &fib_node->ht_node, + __prestera_fib_ht_params); + if (err) + goto err_ht_insert; + + return fib_node; + +err_ht_insert: + prestera_hw_lpm_del(sw, vr->hw_vr_id, key->addr.u.ipv4, + key->prefix_len); +err_lpm_add: +err_nh_grp_get: + prestera_vr_put(sw, vr); +err_vr_get: + kfree(fib_node); +err_kzalloc: + return NULL; +} diff --git a/drivers/net/ethernet/marvell/prestera/prestera_router_hw.h b/d= rivers/net/ethernet/marvell/prestera/prestera_router_hw.h index b6b028551868..67dbb49c8bd4 100644 --- a/drivers/net/ethernet/marvell/prestera/prestera_router_hw.h +++ b/drivers/net/ethernet/marvell/prestera/prestera_router_hw.h @@ -22,6 +22,42 @@ struct prestera_rif_entry { struct list_head router_node; /* ht */ }; =20 +struct prestera_ip_addr { + union { + __be32 ipv4; + struct in6_addr ipv6; + } u; + enum { + PRESTERA_IPV4 =3D 0, + PRESTERA_IPV6 + } v; +}; + +struct prestera_fib_key { + struct prestera_ip_addr addr; + u32 prefix_len; + u32 tb_id; +}; + +struct prestera_fib_info { + struct prestera_vr *vr; + struct list_head vr_node; + enum prestera_fib_type { + PRESTERA_FIB_TYPE_INVALID =3D 0, + /* It can be connected route + * and will be overlapped with neighbours + */ + PRESTERA_FIB_TYPE_TRAP, + PRESTERA_FIB_TYPE_DROP + } type; +}; + +struct prestera_fib_node { + struct rhash_head ht_node; /* node of prestera_vr */ + struct prestera_fib_key key; + struct prestera_fib_info info; /* action related info */ +}; + struct prestera_rif_entry * prestera_rif_entry_find(const struct prestera_switch *sw, const struct prestera_rif_entry_key *k); @@ -31,6 +67,14 @@ struct prestera_rif_entry * prestera_rif_entry_create(struct prestera_switch *sw, struct prestera_rif_entry_key *k, u32 tb_id, const unsigned char *addr); +struct prestera_fib_node *prestera_fib_node_find(struct prestera_switch *s= w, + struct prestera_fib_key *key); +void prestera_fib_node_destroy(struct prestera_switch *sw, + struct prestera_fib_node *fib_node); +struct prestera_fib_node * +prestera_fib_node_create(struct prestera_switch *sw, + struct prestera_fib_key *key, + enum prestera_fib_type fib_type); int prestera_router_hw_init(struct prestera_switch *sw); void prestera_router_hw_fini(struct prestera_switch *sw); =20 --=20 2.17.1 From nobody Sun Jun 28 02:50:50 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0EB87C433F5 for ; Wed, 16 Feb 2022 01:09:45 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S245334AbiBPBJy (ORCPT ); Tue, 15 Feb 2022 20:09:54 -0500 Received: from mxb-00190b01.gslb.pphosted.com ([23.128.96.19]:35978 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S245455AbiBPBJl (ORCPT ); Tue, 15 Feb 2022 20:09:41 -0500 Received: from EUR02-HE1-obe.outbound.protection.outlook.com (mail-eopbgr10111.outbound.protection.outlook.com [40.107.1.111]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 619AFF956C; Tue, 15 Feb 2022 17:07:48 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Kwvn0Rx7oGkhmusgnzDqlIZxj3yxb8NqtV/dQiXD+poBP1/FZz4pmrxwWFq42pH2JYgdSWxFhgPbjETQNsUI7gs4agjBmbgOZvkNRxs8+/0OILrjrymPKzkHqWnGqKNGYd+KSe01jgzOVUvDlUlQ2Mu2lnQiRBKVWV++pbw/b+fT9P6PDuykSlYPYehHyopGLZyloF7vU+zFVTXJcbHRNj0kWUXHVysAdTlSsi5ntRHQM81GHShWVh/lNEkyt/qw+86mj3D2YALgefcYdO21oTmlXbAN0u66TX2cGGP4RthPISX9nze87y38YfbDO/gE3A6ehYVl7Zhnm+mhN/yxKA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=Ftz9xdn1M/uesl1QFsDsPJPtnIrvpgjlMsjM6YnusxA=; b=CMW+RXEh8qSrNQaW+qU/siyykQ5SDh0W50Ah1EcfhHUXRvZIMLW0kosyaa2Qs0t0kmFlNtSzeXX20aA7U3YDjOhAMAtrWTM5JpU8qm0b+/qU3AeCv+xe5L0y+B6ahOQ2pnLR03uDDj52SANr+aFsvwOxkGH8aXSPoKPq3mXqQSGBTdjm490y0JlfIkmcHomH9vsupZlgyhoBGTaiLJt+xZNcToOKiyFKq8j4QKvuVGsy80hrXqpMh7guqX48HqXM807HS+3aT+fdHsRHgMj3nlL2tJs/P6oy4LudJwBGXB0ww7o1yvRx7ch3aVyY0CxG+icqAfoq/Ofasn1nda0+eg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=plvision.eu; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=Ftz9xdn1M/uesl1QFsDsPJPtnIrvpgjlMsjM6YnusxA=; b=CiCxFADaea6ptl7EryC6WlgUt2NhuGMg2d5vBu36dgA9sgGhs+3A5H/Ds3tT3yPziyFKVGlhLueAoxNQ/rJjmKUITEJhZqTEmrJYltQQUpb5+Sz3a6G9j/3gotw96pQ+0Pt4k35Gr8WAGFYv1Nu/cgBi5y+qCV3RzQv0hTZWt2g= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=plvision.eu; Received: from AM9P190MB1122.EURP190.PROD.OUTLOOK.COM (2603:10a6:20b:262::24) by AM9P190MB1169.EURP190.PROD.OUTLOOK.COM (2603:10a6:20b:266::23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4975.15; Wed, 16 Feb 2022 01:07:38 +0000 Received: from AM9P190MB1122.EURP190.PROD.OUTLOOK.COM ([fe80::c93a:58e1:db16:e117]) by AM9P190MB1122.EURP190.PROD.OUTLOOK.COM ([fe80::c93a:58e1:db16:e117%5]) with mapi id 15.20.4995.014; Wed, 16 Feb 2022 01:07:38 +0000 From: Yevhen Orlov To: netdev@vger.kernel.org Cc: Volodymyr Mytnyk , Taras Chornyi , Mickey Rachamim , Serhiy Pshyk , Yevhen Orlov , Taras Chornyi , Oleksandr Mazur , "David S. Miller" , Jakub Kicinski , linux-kernel@vger.kernel.org Subject: [PATCH net-next 3/3] net: marvell: prestera: handle fib notifications Date: Wed, 16 Feb 2022 03:05:57 +0200 Message-Id: <20220216010557.11483-4-yevhen.orlov@plvision.eu> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20220216010557.11483-1-yevhen.orlov@plvision.eu> References: <20220216010557.11483-1-yevhen.orlov@plvision.eu> X-ClientProxiedBy: FR3P281CA0078.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:1f::19) To AM9P190MB1122.EURP190.PROD.OUTLOOK.COM (2603:10a6:20b:262::24) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: b190159f-b38c-4019-a405-08d9f0e8b936 X-MS-TrafficTypeDiagnostic: AM9P190MB1169:EE_ X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:935; X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 3WRGHZ70t3O/0n5vXCNv4IeWMJNqfD9gM0v0qvRKk4VSV5XcoPvnO2fiFesylSkv/ns7gWpiw8qnK3G4NUC5BYnLi7Oy/pqGB79TOpzI9dwph29OXktLPiHotTX4JmMpagFJblhHFytCMSxExN3I5a9ebx8sJ+IU2+ZQQf/Yh+jMse6YcQBCGoSTVkyCNHX4jzF7f9IK6qRFZy4Pfu0R5x51suE7VvzmithLRmkdLALu+8yammHDVcklvC9gv9bVxOmRtKbG2okDLmrULMBa1M/EyXlZtxD1+dpcIj0gZzwPJoHF3EyfqhWnoKpe+V9i8a21hXNgBe5YEYbMWoBggfFyenYPXTimqfkEZifvJaEoYFoRtiKwm2thUfK64lK8MTfFwnadfKSl8uwRjPQxoEeTsoNjiZRvnCeUtEUhq92EtIZMfr8OVCaD8r+XOfGh3bHx5n4Zee+OAWP09+7ty2nifufxn5QjKjGjdC3I/Ympuz3PdFxP6SFd/ELum5qDo7KpqVpHMrNaWihDCN7ZNwuXVgSHO6+JErjIicPefK40IbyPk/Je2VxNa25NhU43NJlKvQ1GzXeblPUCbcS3hqWxlWYDsG/jHfGd8CIhjaaH+ULJc4540YFGhpzBYJ/nWEwLVnw54ZRQQwWunpB7utUGNRwBs7+EVYesAV/ogzNMESQ15K8itgUgCwd7WBNMYa3IPyfpAvZcxhGmTVjwWA== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AM9P190MB1122.EURP190.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230001)(39830400003)(396003)(376002)(346002)(366004)(136003)(6666004)(5660300002)(44832011)(66574015)(36756003)(38350700002)(86362001)(52116002)(6506007)(8936002)(66556008)(66476007)(66946007)(38100700002)(30864003)(8676002)(54906003)(6916009)(316002)(4326008)(6486002)(508600001)(2616005)(2906002)(83380400001)(186003)(26005)(6512007)(1076003);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?GQQzDwawQrAJLKQwl9A6wQhjr+WlLSwiyRL9p9maDpNDmpWUD3vp6cCkAL9x?= =?us-ascii?Q?+vpYNZOx7BclvZkyfKz4dNLoVR4WRJLUeQfkawY+3ZaRFrfqm+2jX71iAvNu?= =?us-ascii?Q?1QoZrKgdoWwNjyvg5MMLDgYL487UnvN5AEemZe0xo8gsctEN5i0P6EOI+12c?= =?us-ascii?Q?9qPjq1IFsNkuvx7l4XEDtQM5YMUYtfx+TlzkxLzNsOg+4shhCyXX+mqL/WH3?= =?us-ascii?Q?pSQiu+ZO8YQ+X14FO0wtfFWitbgvt7zPzmbq6Vzgj7ZnnXRmFiLx6LbKbnGk?= =?us-ascii?Q?yKyug0GrtktIit19emG/2QCSVUzK99pr+0j9XoJt14Xn+MCn+oKj/sOBWFE4?= =?us-ascii?Q?GKVahDQumGxtCboJI3oXhPkcCQpAFxQO6WyMdgncNLkQay/D+uD8F9XCF2cf?= =?us-ascii?Q?ZVNYYP10BSVMp8gFCbgBRUsj6yTtMQTbJzQa5aLgD0BofEMF+7L+wId5QcGV?= =?us-ascii?Q?6i58QPKSsh7bcX2DWAV7DK5mVFOXvt+tsQfjOmRBzmYN5iCqc5v65DVpHATx?= =?us-ascii?Q?ysDh4bCaC9n/VwGAI9xbtWR9jF04t8lvi+d5K03aAH1rdbAEHd3ALcs9R2WP?= =?us-ascii?Q?oSh/yh/zqsxbNUCeyFD+prEffYehKvyftMWDQiuxtCNrpvNmpXHVABh4P4Vm?= =?us-ascii?Q?mLgvk0FU29LeOQq6h8hNeum2Jpx2AOwRxTlAHUBpQGd0mLKeVzJDcGeY1a3W?= =?us-ascii?Q?y1mFFEi0WnJGVdDku5RXpMAD9zf83ebbFxxKNaL//yeCB9GGW3urYFsybLBU?= =?us-ascii?Q?JNcqS/+ZqqRIeHLRCJ2S1xOEfjKeSqiAVxKiTfaYXUPd085PhAL6L96J/t63?= =?us-ascii?Q?AZOIM+B/A877wwgB0uIzQlo/VkyQccPqFIIZaODArswplgNjcqsqQIStItmi?= =?us-ascii?Q?DzJKbb7N5Y7qROGWgczdc0v5FujdN+ZsxL6xrKHoHT0JlZRbuL/BCTn10ybm?= =?us-ascii?Q?4JOCao8pBM7N92MHQcfyU8ilTeeqiZLpGqJC0X3xsV3KSu1/iSwA2hdDHoz+?= =?us-ascii?Q?/zXP+JIEJ2dCbg1h8z9VGvLyN3DEh0Lr3/ya+1Y/lxq0+XCXc6sYgp3VRq/h?= =?us-ascii?Q?NDY2S79HT6qdS90+dL7ytj9Rkltlb1Ku20snASfZ34lIV8zOXs/V1wBQHvGM?= =?us-ascii?Q?VohATEiQ/ym4Kflm49m+X3KKHWbvAGJtBVjkkE5OZmH8pNtIta5OUfxl/v4h?= =?us-ascii?Q?NoPJbzHVX6UUFxn+hm24owgATSFtFPsFwUKZnUV85Btqy3go2/LJrxT2QRc5?= =?us-ascii?Q?UY1G0M7o8xbNmc8504H3wcRBQQx9S7nI/gdEfvMFnKbi727CZ7WLaZe7dg3p?= =?us-ascii?Q?2ZCPOFQ0ycmc8Oayh6QxgEBbJ+7IJYmzLDyTUYVox6EaeoJLL8vMuTgnMdXV?= =?us-ascii?Q?7n+7r733iL3JtfPXgVTtiy4c3CD1eiP8EY3wuLWu382qEqHflyHCQIRcVnCF?= =?us-ascii?Q?wMFxjM6YKzUxmROu7Y0mneSuBxCsJ1VWdH7CiQFwG/Ppt8V0mdJqsq+/tilN?= =?us-ascii?Q?l6CsD5tWOUjaR3ABjeBM+Hy25ee7sPUwodfxUiBzg6lKqtZbGmxexGRioucV?= =?us-ascii?Q?JQRTK00IuOj07SZQpN+Ize6wCMKFDzZjppLPuIOspJz/QqJd7BNKINNVPha1?= =?us-ascii?Q?XvckiJiYgsD03hpnK7U06wXVQwXMyLLP5gAzE8ONgoG0UGMkYpZXl/uOJYYY?= =?us-ascii?Q?MxISDTzDcp+IExCafHJgpCOMnXI=3D?= X-OriginatorOrg: plvision.eu X-MS-Exchange-CrossTenant-Network-Message-Id: b190159f-b38c-4019-a405-08d9f0e8b936 X-MS-Exchange-CrossTenant-AuthSource: AM9P190MB1122.EURP190.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 16 Feb 2022 01:07:38.1487 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 03707b74-30f3-46b6-a0e0-ff0a7438c9c4 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 1f2jZs7LWC+X1YlhL7TdFTZT4FwVjUvsRQkvOuY89AtTVRi74lUtxGvLcFIReV/ujUmnwptyVZEFovdJMo64+eFfuyBcELZsckzSiyTTsfs= X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM9P190MB1169 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" For now we support only TRAP or DROP, so we can offload only "local" or "blackhole" routes. Nexthop routes is TRAP for now. Will be implemented soon. Co-developed-by: Taras Chornyi Signed-off-by: Taras Chornyi Co-developed-by: Oleksandr Mazur Signed-off-by: Oleksandr Mazur Signed-off-by: Yevhen Orlov --- .../net/ethernet/marvell/prestera/prestera.h | 4 + .../ethernet/marvell/prestera/prestera_main.c | 11 + .../marvell/prestera/prestera_router.c | 412 ++++++++++++++++++ 3 files changed, 427 insertions(+) diff --git a/drivers/net/ethernet/marvell/prestera/prestera.h b/drivers/net= /ethernet/marvell/prestera/prestera.h index dcaddf685d21..6f754ae2a584 100644 --- a/drivers/net/ethernet/marvell/prestera/prestera.h +++ b/drivers/net/ethernet/marvell/prestera/prestera.h @@ -282,8 +282,10 @@ struct prestera_router { struct list_head vr_list; struct list_head rif_entry_list; struct rhashtable fib_ht; + struct rhashtable kern_fib_cache_ht; struct notifier_block inetaddr_nb; struct notifier_block inetaddr_valid_nb; + struct notifier_block fib_nb; }; =20 struct prestera_rxtx_params { @@ -326,6 +328,8 @@ int prestera_port_cfg_mac_write(struct prestera_port *p= ort, =20 struct prestera_port *prestera_port_dev_lower_find(struct net_device *dev); =20 +void prestera_queue_work(struct work_struct *work); + int prestera_port_pvid_set(struct prestera_port *port, u16 vid); =20 bool prestera_netdev_check(const struct net_device *dev); diff --git a/drivers/net/ethernet/marvell/prestera/prestera_main.c b/driver= s/net/ethernet/marvell/prestera/prestera_main.c index cad93f747d0c..a180b6812e54 100644 --- a/drivers/net/ethernet/marvell/prestera/prestera_main.c +++ b/drivers/net/ethernet/marvell/prestera/prestera_main.c @@ -28,6 +28,12 @@ #define PRESTERA_MAC_ADDR_NUM_MAX 255 =20 static struct workqueue_struct *prestera_wq; +static struct workqueue_struct *prestera_owq; + +void prestera_queue_work(struct work_struct *work) +{ + queue_work(prestera_owq, work); +} =20 int prestera_port_pvid_set(struct prestera_port *port, u16 vid) { @@ -1024,12 +1030,17 @@ static int __init prestera_module_init(void) if (!prestera_wq) return -ENOMEM; =20 + prestera_owq =3D alloc_ordered_workqueue("prestera_ordered", 0); + if (!prestera_owq) + return -ENOMEM; + return 0; } =20 static void __exit prestera_module_exit(void) { destroy_workqueue(prestera_wq); + destroy_workqueue(prestera_owq); } =20 module_init(prestera_module_init); diff --git a/drivers/net/ethernet/marvell/prestera/prestera_router.c b/driv= ers/net/ethernet/marvell/prestera/prestera_router.c index 6ef4d32b8fdd..54ebda61bfea 100644 --- a/drivers/net/ethernet/marvell/prestera/prestera_router.c +++ b/drivers/net/ethernet/marvell/prestera/prestera_router.c @@ -5,10 +5,39 @@ #include #include #include +#include =20 #include "prestera.h" #include "prestera_router_hw.h" =20 +struct prestera_kern_fib_cache_key { + struct prestera_ip_addr addr; + u32 prefix_len; + u32 kern_tb_id; /* tb_id from kernel (not fixed) */ +}; + +/* Subscribing on neighbours in kernel */ +struct prestera_kern_fib_cache { + struct prestera_kern_fib_cache_key key; + struct { + struct prestera_fib_key fib_key; + enum prestera_fib_type fib_type; + } lpm_info; /* hold prepared lpm info */ + /* Indicate if route is not overlapped by another table */ + struct rhash_head ht_node; /* node of prestera_router */ + struct fib_info *fi; + u8 kern_tos; + u8 kern_type; + bool reachable; +}; + +static const struct rhashtable_params __prestera_kern_fib_cache_ht_params = =3D { + .key_offset =3D offsetof(struct prestera_kern_fib_cache, key), + .head_offset =3D offsetof(struct prestera_kern_fib_cache, ht_node), + .key_len =3D sizeof(struct prestera_kern_fib_cache_key), + .automatic_shrinking =3D true, +}; + /* This util to be used, to convert kernel rules for default vr in hw_vr */ static u32 prestera_fix_tb_id(u32 tb_id) { @@ -20,6 +49,290 @@ static u32 prestera_fix_tb_id(u32 tb_id) return tb_id; } =20 +static void +prestera_util_fen_info2fib_cache_key(struct fib_entry_notifier_info *fen_i= nfo, + struct prestera_kern_fib_cache_key *key) +{ + memset(key, 0, sizeof(*key)); + key->addr.u.ipv4 =3D cpu_to_be32(fen_info->dst); + key->prefix_len =3D fen_info->dst_len; + key->kern_tb_id =3D fen_info->tb_id; +} + +static struct prestera_kern_fib_cache * +prestera_kern_fib_cache_find(struct prestera_switch *sw, + struct prestera_kern_fib_cache_key *key) +{ + struct prestera_kern_fib_cache *fib_cache; + + fib_cache =3D + rhashtable_lookup_fast(&sw->router->kern_fib_cache_ht, key, + __prestera_kern_fib_cache_ht_params); + return IS_ERR(fib_cache) ? NULL : fib_cache; +} + +static void +prestera_kern_fib_cache_destroy(struct prestera_switch *sw, + struct prestera_kern_fib_cache *fib_cache) +{ + fib_info_put(fib_cache->fi); + rhashtable_remove_fast(&sw->router->kern_fib_cache_ht, + &fib_cache->ht_node, + __prestera_kern_fib_cache_ht_params); + kfree(fib_cache); +} + +/* Operations on fi (offload, etc) must be wrapped in utils. + * This function just create storage. + */ +static struct prestera_kern_fib_cache * +prestera_kern_fib_cache_create(struct prestera_switch *sw, + struct prestera_kern_fib_cache_key *key, + struct fib_info *fi, u8 tos, u8 type) +{ + struct prestera_kern_fib_cache *fib_cache; + int err; + + fib_cache =3D kzalloc(sizeof(*fib_cache), GFP_KERNEL); + if (!fib_cache) + goto err_kzalloc; + + memcpy(&fib_cache->key, key, sizeof(*key)); + fib_info_hold(fi); + fib_cache->fi =3D fi; + fib_cache->kern_tos =3D tos; + fib_cache->kern_type =3D type; + + err =3D rhashtable_insert_fast(&sw->router->kern_fib_cache_ht, + &fib_cache->ht_node, + __prestera_kern_fib_cache_ht_params); + if (err) + goto err_ht_insert; + + return fib_cache; + +err_ht_insert: + fib_info_put(fi); + kfree(fib_cache); +err_kzalloc: + return NULL; +} + +static void +__prestera_k_arb_fib_lpm_offload_set(struct prestera_switch *sw, + struct prestera_kern_fib_cache *fc, + bool fail, bool offload, bool trap) +{ + struct fib_rt_info fri; + + if (fc->key.addr.v !=3D PRESTERA_IPV4) + return; + + fri.fi =3D fc->fi; + fri.tb_id =3D fc->key.kern_tb_id; + fri.dst =3D fc->key.addr.u.ipv4; + fri.dst_len =3D fc->key.prefix_len; + fri.tos =3D fc->kern_tos; + fri.type =3D fc->kern_type; + /* flags begin */ + fri.offload =3D offload; + fri.trap =3D trap; + fri.offload_failed =3D fail; + /* flags end */ + fib_alias_hw_flags_set(&init_net, &fri); +} + +static int +__prestera_pr_k_arb_fc_lpm_info_calc(struct prestera_switch *sw, + struct prestera_kern_fib_cache *fc) +{ + memset(&fc->lpm_info, 0, sizeof(fc->lpm_info)); + + switch (fc->fi->fib_type) { + case RTN_UNICAST: + fc->lpm_info.fib_type =3D PRESTERA_FIB_TYPE_TRAP; + break; + /* Unsupported. Leave it for kernel: */ + case RTN_BROADCAST: + case RTN_MULTICAST: + /* Routes we must trap by design: */ + case RTN_LOCAL: + case RTN_UNREACHABLE: + case RTN_PROHIBIT: + fc->lpm_info.fib_type =3D PRESTERA_FIB_TYPE_TRAP; + break; + case RTN_BLACKHOLE: + fc->lpm_info.fib_type =3D PRESTERA_FIB_TYPE_DROP; + break; + default: + dev_err(sw->dev->dev, "Unsupported fib_type"); + return -EOPNOTSUPP; + } + + fc->lpm_info.fib_key.addr =3D fc->key.addr; + fc->lpm_info.fib_key.prefix_len =3D fc->key.prefix_len; + fc->lpm_info.fib_key.tb_id =3D prestera_fix_tb_id(fc->key.kern_tb_id); + + return 0; +} + +static int __prestera_k_arb_f_lpm_set(struct prestera_switch *sw, + struct prestera_kern_fib_cache *fc, + bool enabled) +{ + struct prestera_fib_node *fib_node; + + fib_node =3D prestera_fib_node_find(sw, &fc->lpm_info.fib_key); + if (fib_node) + prestera_fib_node_destroy(sw, fib_node); + + if (!enabled) + return 0; + + fib_node =3D prestera_fib_node_create(sw, &fc->lpm_info.fib_key, + fc->lpm_info.fib_type); + + if (!fib_node) { + dev_err(sw->dev->dev, "fib_node=3DNULL %pI4n/%d kern_tb_id =3D %d", + &fc->key.addr.u.ipv4, fc->key.prefix_len, + fc->key.kern_tb_id); + return -ENOENT; + } + + return 0; +} + +static int __prestera_k_arb_fc_apply(struct prestera_switch *sw, + struct prestera_kern_fib_cache *fc) +{ + int err; + + err =3D __prestera_pr_k_arb_fc_lpm_info_calc(sw, fc); + if (err) + return err; + + err =3D __prestera_k_arb_f_lpm_set(sw, fc, fc->reachable); + if (err) { + __prestera_k_arb_fib_lpm_offload_set(sw, fc, + true, false, false); + return err; + } + + switch (fc->lpm_info.fib_type) { + case PRESTERA_FIB_TYPE_TRAP: + __prestera_k_arb_fib_lpm_offload_set(sw, fc, false, + false, fc->reachable); + break; + case PRESTERA_FIB_TYPE_DROP: + __prestera_k_arb_fib_lpm_offload_set(sw, fc, false, true, + fc->reachable); + break; + case PRESTERA_FIB_TYPE_INVALID: + break; + } + + return 0; +} + +static struct prestera_kern_fib_cache * +__prestera_k_arb_util_fib_overlaps(struct prestera_switch *sw, + struct prestera_kern_fib_cache *fc) +{ + struct prestera_kern_fib_cache_key fc_key; + struct prestera_kern_fib_cache *rfc; + + /* TODO: parse kernel rules */ + rfc =3D NULL; + if (fc->key.kern_tb_id =3D=3D RT_TABLE_LOCAL) { + memcpy(&fc_key, &fc->key, sizeof(fc_key)); + fc_key.kern_tb_id =3D RT_TABLE_MAIN; + rfc =3D prestera_kern_fib_cache_find(sw, &fc_key); + } + + return rfc; +} + +static struct prestera_kern_fib_cache * +__prestera_k_arb_util_fib_overlapped(struct prestera_switch *sw, + struct prestera_kern_fib_cache *fc) +{ + struct prestera_kern_fib_cache_key fc_key; + struct prestera_kern_fib_cache *rfc; + + /* TODO: parse kernel rules */ + rfc =3D NULL; + if (fc->key.kern_tb_id =3D=3D RT_TABLE_MAIN) { + memcpy(&fc_key, &fc->key, sizeof(fc_key)); + fc_key.kern_tb_id =3D RT_TABLE_LOCAL; + rfc =3D prestera_kern_fib_cache_find(sw, &fc_key); + } + + return rfc; +} + +static int +prestera_k_arb_fib_evt(struct prestera_switch *sw, + bool replace, /* replace or del */ + struct fib_entry_notifier_info *fen_info) +{ + struct prestera_kern_fib_cache *tfib_cache, *bfib_cache; /* top/btm */ + struct prestera_kern_fib_cache_key fc_key; + struct prestera_kern_fib_cache *fib_cache; + int err; + + prestera_util_fen_info2fib_cache_key(fen_info, &fc_key); + fib_cache =3D prestera_kern_fib_cache_find(sw, &fc_key); + if (fib_cache) { + fib_cache->reachable =3D false; + err =3D __prestera_k_arb_fc_apply(sw, fib_cache); + if (err) + dev_err(sw->dev->dev, + "Applying destroyed fib_cache failed"); + + bfib_cache =3D __prestera_k_arb_util_fib_overlaps(sw, fib_cache); + tfib_cache =3D __prestera_k_arb_util_fib_overlapped(sw, fib_cache); + if (!tfib_cache && bfib_cache) { + bfib_cache->reachable =3D true; + err =3D __prestera_k_arb_fc_apply(sw, bfib_cache); + if (err) + dev_err(sw->dev->dev, + "Applying fib_cache btm failed"); + } + + prestera_kern_fib_cache_destroy(sw, fib_cache); + } + + if (replace) { + fib_cache =3D prestera_kern_fib_cache_create(sw, &fc_key, + fen_info->fi, + fen_info->tos, + fen_info->type); + if (!fib_cache) { + dev_err(sw->dev->dev, "fib_cache =3D=3D NULL"); + return -ENOENT; + } + + bfib_cache =3D __prestera_k_arb_util_fib_overlaps(sw, fib_cache); + tfib_cache =3D __prestera_k_arb_util_fib_overlapped(sw, fib_cache); + if (!tfib_cache) + fib_cache->reachable =3D true; + + if (bfib_cache) { + bfib_cache->reachable =3D false; + err =3D __prestera_k_arb_fc_apply(sw, bfib_cache); + if (err) + dev_err(sw->dev->dev, + "Applying fib_cache btm failed"); + } + + err =3D __prestera_k_arb_fc_apply(sw, fib_cache); + if (err) + dev_err(sw->dev->dev, "Applying fib_cache failed"); + } + + return 0; +} + static int __prestera_inetaddr_port_event(struct net_device *port_dev, unsigned long event, struct netlink_ext_ack *extack) @@ -137,6 +450,89 @@ static int __prestera_inetaddr_valid_cb(struct notifie= r_block *nb, return notifier_from_errno(err); } =20 +struct prestera_fib_event_work { + struct work_struct work; + struct prestera_switch *sw; + struct fib_entry_notifier_info fen_info; + unsigned long event; +}; + +static void __prestera_router_fib_event_work(struct work_struct *work) +{ + struct prestera_fib_event_work *fib_work =3D + container_of(work, struct prestera_fib_event_work, work); + struct prestera_switch *sw =3D fib_work->sw; + int err; + + rtnl_lock(); + + switch (fib_work->event) { + case FIB_EVENT_ENTRY_REPLACE: + err =3D prestera_k_arb_fib_evt(sw, true, &fib_work->fen_info); + if (err) + goto err_out; + + break; + case FIB_EVENT_ENTRY_DEL: + err =3D prestera_k_arb_fib_evt(sw, false, &fib_work->fen_info); + if (err) + goto err_out; + + break; + } + + goto out; + +err_out: + dev_err(sw->dev->dev, "Error when processing %pI4h/%d", + &fib_work->fen_info.dst, + fib_work->fen_info.dst_len); +out: + fib_info_put(fib_work->fen_info.fi); + rtnl_unlock(); + kfree(fib_work); +} + +/* Called with rcu_read_lock() */ +static int __prestera_router_fib_event(struct notifier_block *nb, + unsigned long event, void *ptr) +{ + struct prestera_fib_event_work *fib_work; + struct fib_entry_notifier_info *fen_info; + struct fib_notifier_info *info =3D ptr; + struct prestera_router *router; + + if (info->family !=3D AF_INET) + return NOTIFY_DONE; + + router =3D container_of(nb, struct prestera_router, fib_nb); + + switch (event) { + case FIB_EVENT_ENTRY_REPLACE: + case FIB_EVENT_ENTRY_DEL: + fen_info =3D container_of(info, struct fib_entry_notifier_info, + info); + if (!fen_info->fi) + return NOTIFY_DONE; + + fib_work =3D kzalloc(sizeof(*fib_work), GFP_ATOMIC); + if (WARN_ON(!fib_work)) + return NOTIFY_BAD; + + fib_info_hold(fen_info->fi); + fib_work->fen_info =3D *fen_info; + fib_work->event =3D event; + fib_work->sw =3D router->sw; + INIT_WORK(&fib_work->work, __prestera_router_fib_event_work); + prestera_queue_work(&fib_work->work); + break; + default: + return NOTIFY_DONE; + } + + return NOTIFY_DONE; +} + int prestera_router_init(struct prestera_switch *sw) { struct prestera_router *router; @@ -153,6 +549,11 @@ int prestera_router_init(struct prestera_switch *sw) if (err) goto err_router_lib_init; =20 + err =3D rhashtable_init(&router->kern_fib_cache_ht, + &__prestera_kern_fib_cache_ht_params); + if (err) + goto err_kern_fib_cache_ht_init; + router->inetaddr_valid_nb.notifier_call =3D __prestera_inetaddr_valid_cb; err =3D register_inetaddr_validator_notifier(&router->inetaddr_valid_nb); if (err) @@ -163,11 +564,21 @@ int prestera_router_init(struct prestera_switch *sw) if (err) goto err_register_inetaddr_notifier; =20 + router->fib_nb.notifier_call =3D __prestera_router_fib_event; + err =3D register_fib_notifier(&init_net, &router->fib_nb, + /* TODO: flush fib entries */ NULL, NULL); + if (err) + goto err_register_fib_notifier; + return 0; =20 +err_register_fib_notifier: + unregister_inetaddr_notifier(&router->inetaddr_nb); err_register_inetaddr_notifier: unregister_inetaddr_validator_notifier(&router->inetaddr_valid_nb); err_register_inetaddr_validator_notifier: + rhashtable_destroy(&router->kern_fib_cache_ht); +err_kern_fib_cache_ht_init: prestera_router_hw_fini(sw); err_router_lib_init: kfree(sw->router); @@ -178,6 +589,7 @@ void prestera_router_fini(struct prestera_switch *sw) { unregister_inetaddr_notifier(&sw->router->inetaddr_nb); unregister_inetaddr_validator_notifier(&sw->router->inetaddr_valid_nb); + rhashtable_destroy(&sw->router->kern_fib_cache_ht); prestera_router_hw_fini(sw); kfree(sw->router); sw->router =3D NULL; --=20 2.17.1