From patchwork Tue Feb 14 03:39:04 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nobuhiro MIKI X-Patchwork-Id: 1742021 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org (client-ip=2605:bc80:3010::133; helo=smtp2.osuosl.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Authentication-Results: legolas.ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=yahoo-corp.jp header.i=@yahoo-corp.jp header.a=rsa-sha256 header.s=default header.b=SI1wCMtQ; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=yjcorp.onmicrosoft.com header.i=@yjcorp.onmicrosoft.com header.a=rsa-sha256 header.s=selector1-yjcorp-onmicrosoft-com header.b=e53lhSrC; dkim-atps=neutral Received: from smtp2.osuosl.org (smtp2.osuosl.org [IPv6:2605:bc80:3010::133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-384) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4PG6R51K14z23h0 for ; Tue, 14 Feb 2023 14:40:01 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by smtp2.osuosl.org (Postfix) with ESMTP id 9C41D40AEB; Tue, 14 Feb 2023 03:39:55 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp2.osuosl.org 9C41D40AEB Authentication-Results: smtp2.osuosl.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=yahoo-corp.jp header.i=@yahoo-corp.jp header.a=rsa-sha256 header.s=default header.b=SI1wCMtQ; dkim=fail reason="signature verification failed" (1024-bit key) header.d=yjcorp.onmicrosoft.com header.i=@yjcorp.onmicrosoft.com header.a=rsa-sha256 header.s=selector1-yjcorp-onmicrosoft-com header.b=e53lhSrC X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp2.osuosl.org ([127.0.0.1]) by localhost (smtp2.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id ZdEiI8co9h1f; Tue, 14 Feb 2023 03:39:53 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by smtp2.osuosl.org (Postfix) with ESMTPS id 75A2D40A9F; Tue, 14 Feb 2023 03:39:52 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp2.osuosl.org 75A2D40A9F Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 5489EC007D; Tue, 14 Feb 2023 03:39:50 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@lists.linuxfoundation.org Received: from smtp4.osuosl.org (smtp4.osuosl.org [IPv6:2605:bc80:3010::137]) by lists.linuxfoundation.org (Postfix) with ESMTP id C292DC002B for ; Tue, 14 Feb 2023 03:39:47 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp4.osuosl.org (Postfix) with ESMTP id 8F641415FB for ; Tue, 14 Feb 2023 03:39:47 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp4.osuosl.org 8F641415FB Authentication-Results: smtp4.osuosl.org; dkim=pass (1024-bit key) header.d=yahoo-corp.jp header.i=@yahoo-corp.jp header.a=rsa-sha256 header.s=default header.b=SI1wCMtQ; dkim=pass (1024-bit key) header.d=yjcorp.onmicrosoft.com header.i=@yjcorp.onmicrosoft.com header.a=rsa-sha256 header.s=selector1-yjcorp-onmicrosoft-com header.b=e53lhSrC X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp4.osuosl.org ([127.0.0.1]) by localhost (smtp4.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id QoSw-UNfDZeO for ; Tue, 14 Feb 2023 03:39:45 +0000 (UTC) X-Greylist: from auto-whitelisted by SQLgrey-1.8.0 DKIM-Filter: OpenDKIM Filter v2.11.0 smtp4.osuosl.org 0B5BF415E7 Received: from corp-ob08.yahoo-corp.jp (corp-ob08.yahoo-corp.jp [183.79.94.93]) by smtp4.osuosl.org (Postfix) with ESMTPS id 0B5BF415E7 for ; Tue, 14 Feb 2023 03:39:44 +0000 (UTC) Received: from APC01-SG2-obe.outbound.protection.outlook.com (mail-sgaapc01lp2105.outbound.protection.outlook.com [104.47.26.105]) by corp-ob08.yahoo-corp.jp (Postfix) with ESMTPS id 7E62519FB181 for ; Tue, 14 Feb 2023 12:39:42 +0900 (JST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo-corp.jp; s=default; t=1676345982; bh=v2TYVYtNBdiEAlAKQmg/dSAqroy8NWmeYtJIOVpr/2Y=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=SI1wCMtQXDC4yJajBeNlp87cq/D6NEs6j5h8XQ58/ySqv4TwV/QQAzW8Zq2d5Mn3u f+LzHajW0Bw/yjtwuRkCf6g1/QXeaSN3HW5/iCxJIFiPB2mwvzxbV3mJbDq5sPH2Y7 HZo78jrPi+FRkA4BjPEIt0YJNS4nSE10XZSTZe6Y= ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=X4qWIdQAatcv2zdP3if1QT5m4RM2LYIX4/mGBwo/Uji+tbQNYvF4tInK0VvSeJAINNZgtvf8Y1eOJkMTTxNUtEf6+UI6uTm2asIqQkAjr3AABAeDgh7mwT9bxb6dVNruudmeNQe2TJm6JMaSg9Px0nS9cr1ldvSNZ23/t54tB+aufJDdKgJKhTw0odOvsjhozegnK+QEMEq/dQfGd3UJsTAlzJThkluklsAMi1YU4L4kf+R4LS8LbvvNvf4Np9OLsl1MO/MMSG+6RFKwVWty4XOSeGRGoJvSMn33/T4Lea0QpTMm2P2HOV/fnbp5VAM2J7sTCFoVGbsRp9dk+FtSqw== 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=v2TYVYtNBdiEAlAKQmg/dSAqroy8NWmeYtJIOVpr/2Y=; b=PJhbHGMWYSS8oDskyFbf0W7kTOfhDn6WKXH3TLA/q1RAu+nOSL/W0TwrIV5VZb11pXMEE2gifgZDI7fmJLPWa+i2S2L2k7iC4XtDKnDqRDfde7BW9DIcYPQdyRIz9KAQ3T8AFi/Wfx0GmmqiceCueZxRUwhFaLDEeA+F9RZoAyS2MG+iPk6WRsOT7OjipgtQ9QKLnvQxHieG+EMSnCBf7j2VR2vm+6uDbvngQDqHB47ehgqHbM21zo1rx/UqSn3+XFlxpdt5mg4imhNRBXVmj76sHGvSJDYga3g97TG+YwwmbKL8dIV2/GvmVbEfNr45mKp5t2KNEwx2DyQqi/aiDg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=yahoo-corp.jp; dmarc=pass action=none header.from=yahoo-corp.jp; dkim=pass header.d=yahoo-corp.jp; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yjcorp.onmicrosoft.com; s=selector1-yjcorp-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=v2TYVYtNBdiEAlAKQmg/dSAqroy8NWmeYtJIOVpr/2Y=; b=e53lhSrCk88pGc/yOBREdZ1hKEKadsBljJLaYG6Z3ZdbIjvIaEL1VRQSUy9P0HAUUtnsT0N5EwiefNAPpecyYhVc/WRUuhjjKjpqSUOLhxe8wR2KgtP+3Af1vlt/9mw0m7fwAWA5hvWO5PxsrGZuKuXWqffqpdFvwKCYAZ0/h4Q= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=yahoo-corp.jp; Received: from TY2PR01MB4107.jpnprd01.prod.outlook.com (2603:1096:404:d8::23) by TYAPR01MB5755.jpnprd01.prod.outlook.com (2603:1096:404:8054::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6086.24; Tue, 14 Feb 2023 03:39:41 +0000 Received: from TY2PR01MB4107.jpnprd01.prod.outlook.com ([fe80::2fdc:d70a:ef7:a01f]) by TY2PR01MB4107.jpnprd01.prod.outlook.com ([fe80::2fdc:d70a:ef7:a01f%5]) with mapi id 15.20.6086.024; Tue, 14 Feb 2023 03:39:41 +0000 From: Nobuhiro MIKI To: dev@openvswitch.org Date: Tue, 14 Feb 2023 12:39:04 +0900 Message-Id: <20230214033906.23576-2-nmiki@yahoo-corp.jp> X-Mailer: git-send-email 2.38.1 In-Reply-To: <20230214033906.23576-1-nmiki@yahoo-corp.jp> References: <20230214033906.23576-1-nmiki@yahoo-corp.jp> X-ClientProxiedBy: TYCP286CA0003.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:26c::10) To TY2PR01MB4107.jpnprd01.prod.outlook.com (2603:1096:404:d8::23) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: TY2PR01MB4107:EE_|TYAPR01MB5755:EE_ X-MS-Office365-Filtering-Correlation-Id: b64775ed-b203-4743-0d1b-08db0e3d1ad8 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: j0ETLpl+A1VB8SojScTdxUuAyHaWd5S+XkciTVTAwEsYM8Ut3rHSUkV8ZpQKcpYylru+YSh2RNvw1FJ8eFoKfggpwcItD9dc5vrUPtumucWA2r+SlDAbWJjoCBrHiUWCKu6Qhb5xJGaAo5ddRy5pqazfTWuE+7Em8ZgmC3/BrbxlkLtB2TUpkjcF8pAiOU2WPAYWhKmk+cxY3ZRcGns+nYwkBNcdMq3UA/LSpahR1dBaQtYQGOFGfIRhdYCMrj6ssTrNZ1AWcYTppToIFN7a/jDOQS0vWhxj0CygB46FkbJC0bEqIiskVhOMUfnbOTWI+5vtyBqt5/G8q4gqVi2MqSTf6EBULhMnuDWI0FzZTYB4hYEJe7dMs4nApAPK2OFGh82AZ7m4FNBNWSjCrz5E/zagUsqxrnhb9Ws6PWuMCKw+VRDFfUEx8i49NbB7eVtKNGOchwloC0v1/MxVelytBoGH+KnJgYBtj3+EnSuS7BGluNS56kRuNJ/ijJQQGTTe8IU9muxqGVhuPeNheCmUr1BDozlt19vioNRdFNFsrhZEuXtc1kqPWujZUTi2kflHj3GiJpVgv+9nGPpgpVuPRGGzWueWs7Jylm/9plFk9yoe5O2ytMRjs1Qf0iq5rD98x69I1ZgTk0g1gZQAWT1k3B0y2OQsJyHNn78k/65TVTSGpQHvROxON1/xQq+J4X1ef/KuIEvM/0h+uwCzLFFhYA== X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:TY2PR01MB4107.jpnprd01.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230025)(4636009)(366004)(346002)(376002)(396003)(136003)(39860400002)(451199018)(41300700001)(5660300002)(8936002)(66476007)(8676002)(6916009)(66946007)(66556008)(4326008)(38350700002)(2906002)(83380400001)(38100700002)(36756003)(86362001)(82960400001)(2616005)(6666004)(107886003)(52116002)(478600001)(6486002)(6512007)(26005)(186003)(6506007)(316002)(1076003); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: z+N46uAvCM4nJ/mvFKodwhZTO6i0wRE+jCGiO/PGliTM55KHQ7lNmYbzFpDb3W2sRWpUtTPngMIVbuTz0uPlZ5rhja8OKSPmQiQDHIeXj/ppA4/PD9XMAgXsoyyfoPJEPxyXegh0b/g7mLyKAy2TFGBV/3pKTAk+qws4z/eWJwzSHhZrZ2CWgWlaD4C/xnT3Tk2c+dFrWvBCFy3CvJbycHvmC1S7R7BxkZV+SgWARnmG2wwV7WIS9hcQ+dOf6Oj+xuZ/DbpKwKUBj2SGV6RKQo7qIR42XSNpnH39wWHIx0Q1rotorwZBL/GBhR/RIsDjVi0Ewgp9l+MdJbVS7zEWDOvHfBDuW94RtjXu8D4pisa4YJ0Nu8hZTBvr5FmdGpoEuparT0RL5ltr3BaIVD/waRHybbQ6azlqu9CmlXiPiYMN6Xj8Ajs+ETGM9v378WK6oD03CQyHP2gFpuHEPZSCFzmz/V0+h486vLaKyohXWJXehpp35Qkela0+81yTTJbFHLR24vtZAr6i70UiDhnkbJlXl27qqImmPnbF1k01T3sEUXs7XgJKy+Ssn7/z7y4GPXIZkd0nn5Hx7bKgTP6/lcjokg+1+QBGghGpZgxvhTFQb8okUCq9cBGjBgaLpMKJINyTWkU5niL3dMhtZxx+y39AyJ5wutCP7zDx6oF3ZAU3qkr+mtifFLlpINLgSBbPf9sMbKK7ds5Mg1mio3vVi9fZFAYuGSA+lAKDGL/w1kCeuIr3fpYhBgvEft5vG0fkCqdMppRSOsdRZAxSSaNM4J0pgKkPaUxNn69QqhgdsocydFuvlF/3SNloY/rumMSugpYob3WHUFmSwBh9HPc7GjeXbevppLRqk5ttzkKPGo1HYTDtphB4GSfa4nSiKlkZZakdbtPu2zR7zdQmFLUyYmswIB72fedRx1geHzf8Gc8eBRJmALDGpMRr65xu9Rj+XWIdBG9vmyzkVIzbs8cOdYsHUyMUe6eQHF/iSMCttT8nC++dOvlq4+C8u4tXMBIhH35SXUy7rkU7GQ1GHaLj44S0Xg3vMhw3+L08+PavnX0GvtYSkOUH2Hdw2iKImRQkanxA3de4iIJNxJb+VCfjpbqgV+ISoR4VDQqPoPW2lG1LaZiNPGfFmlKoRHY9muT+rz8h75emDx3yMMrCKYS0Ow+KaInh1UojAMRkTpXVY3HMXxiAPTzZoQKesyMsH9FtoVjnMf3gMBIVo60KDHvl45k9EIiMJq1D2qOMLL9OfyPJ2yH0Isyobr22/50weIrYv2yEzzqWQGnSxej4DHUIpia//ZnadQirlTocT4Zsc3yS8E//vkeQp1koUmosyVEY7OnVLVFSG9mNgOIuPY6asWH0FQeXTqmmrpmuZNkmQWczN10b4cHX30ArjG1mSYlzbWMZ0vEaIwA/ArHgGZY+rCCaO9+7E6Zg3en8Gjucb2l83MVfljU7BVgw0yxixcMfg7lYvUgfr1ONSDfELNWELwdRwJoD282MVGqn077lLgnk+E6C3tHEyJVA0fEFhileaG8bWHG7/HrwyY8BIbm78Af9TearWLQ0n8sAeLcXk6R/ncfMb4HDQWZQvxRrre1+ X-OriginatorOrg: yahoo-corp.jp X-MS-Exchange-CrossTenant-Network-Message-Id: b64775ed-b203-4743-0d1b-08db0e3d1ad8 X-MS-Exchange-CrossTenant-AuthSource: TY2PR01MB4107.jpnprd01.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Feb 2023 03:39:41.1717 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: a208d369-cd4e-4f87-b119-98eaf31df2c3 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: FUTLMbTgiSyHIPy0TsNBtFjjGDus7Yf5VmQfTsUSxNx9hiGuGkzjyTYA4YT+m2cr9Q3JfkGEu8NPTzMurCFQyA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYAPR01MB5755 Subject: [ovs-dev] [PATCH v3 1/3] netdev-dummy: Support multiple IP addresses X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" This is useful in test cases where multiple IPv4/IPv6 addresses are assigned together. Signed-off-by: Nobuhiro MIKI Reviewed-by: Simon Horman --- lib/netdev-dummy.c | 66 +++++++++++++++++++++++++++++----------------- 1 file changed, 42 insertions(+), 24 deletions(-) diff --git a/lib/netdev-dummy.c b/lib/netdev-dummy.c index 5d59c9c0312b..abeb99f3e3d6 100644 --- a/lib/netdev-dummy.c +++ b/lib/netdev-dummy.c @@ -136,8 +136,7 @@ struct netdev_dummy { struct pcap_file *tx_pcap, *rxq_pcap OVS_GUARDED; - struct in_addr address, netmask; - struct in6_addr ipv6, ipv6_mask; + struct ovs_list addrs; struct ovs_list rxes OVS_GUARDED; /* List of child "netdev_rxq_dummy"s. */ struct hmap offloaded_flows OVS_GUARDED; @@ -161,6 +160,12 @@ struct netdev_rxq_dummy { struct seq *seq; /* Reports newly queued packets. */ }; +struct netdev_addr_dummy { + struct in6_addr address; + struct in6_addr netmask; + struct ovs_list node; /* In netdev_dummy's "addrs" list. */ +}; + static unixctl_cb_func netdev_dummy_set_admin_state; static int netdev_dummy_construct(struct netdev *); static void netdev_dummy_queue_packet(struct netdev_dummy *, @@ -169,6 +174,7 @@ static void netdev_dummy_queue_packet(struct netdev_dummy *, static void dummy_packet_stream_close(struct dummy_packet_stream *); static void pkt_list_delete(struct ovs_list *); +static void addr_list_delete(struct ovs_list *); static bool is_dummy_class(const struct netdev_class *class) @@ -720,6 +726,7 @@ netdev_dummy_construct(struct netdev *netdev_) dummy_packet_conn_init(&netdev->conn); ovs_list_init(&netdev->rxes); + ovs_list_init(&netdev->addrs); hmap_init(&netdev->offloaded_flows); ovs_mutex_unlock(&netdev->mutex); @@ -756,6 +763,7 @@ netdev_dummy_destruct(struct netdev *netdev_) free(off_flow); } hmap_destroy(&netdev->offloaded_flows); + addr_list_delete(&netdev->addrs); ovs_mutex_unlock(&netdev->mutex); ovs_mutex_destroy(&netdev->mutex); @@ -803,32 +811,26 @@ netdev_dummy_get_addr_list(const struct netdev *netdev_, struct in6_addr **paddr struct netdev_dummy *netdev = netdev_dummy_cast(netdev_); int cnt = 0, i = 0, err = 0; struct in6_addr *addr, *mask; + struct netdev_addr_dummy *addr_dummy; ovs_mutex_lock(&netdev->mutex); - if (netdev->address.s_addr != INADDR_ANY) { + LIST_FOR_EACH (addr_dummy, node, &netdev->addrs) { cnt++; } - if (ipv6_addr_is_set(&netdev->ipv6)) { - cnt++; - } if (!cnt) { err = EADDRNOTAVAIL; goto out; } addr = xmalloc(sizeof *addr * cnt); mask = xmalloc(sizeof *mask * cnt); - if (netdev->address.s_addr != INADDR_ANY) { - in6_addr_set_mapped_ipv4(&addr[i], netdev->address.s_addr); - in6_addr_set_mapped_ipv4(&mask[i], netdev->netmask.s_addr); + + LIST_FOR_EACH (addr_dummy, node, &netdev->addrs) { + memcpy(&addr[i], &addr_dummy->address, sizeof *addr); + memcpy(&mask[i], &addr_dummy->netmask, sizeof *mask); i++; } - if (ipv6_addr_is_set(&netdev->ipv6)) { - memcpy(&addr[i], &netdev->ipv6, sizeof *addr); - memcpy(&mask[i], &netdev->ipv6_mask, sizeof *mask); - i++; - } if (paddr) { *paddr = addr; *pmask = mask; @@ -844,14 +846,16 @@ out: } static int -netdev_dummy_set_in4(struct netdev *netdev_, struct in_addr address, +netdev_dummy_add_in4(struct netdev *netdev_, struct in_addr address, struct in_addr netmask) { struct netdev_dummy *netdev = netdev_dummy_cast(netdev_); + struct netdev_addr_dummy *addr_dummy = xmalloc(sizeof *addr_dummy); ovs_mutex_lock(&netdev->mutex); - netdev->address = address; - netdev->netmask = netmask; + in6_addr_set_mapped_ipv4(&addr_dummy->address, address.s_addr); + in6_addr_set_mapped_ipv4(&addr_dummy->netmask, netmask.s_addr); + ovs_list_push_back(&netdev->addrs, &addr_dummy->node); netdev_change_seq_changed(netdev_); ovs_mutex_unlock(&netdev->mutex); @@ -859,14 +863,16 @@ netdev_dummy_set_in4(struct netdev *netdev_, struct in_addr address, } static int -netdev_dummy_set_in6(struct netdev *netdev_, struct in6_addr *in6, +netdev_dummy_add_in6(struct netdev *netdev_, struct in6_addr *in6, struct in6_addr *mask) { struct netdev_dummy *netdev = netdev_dummy_cast(netdev_); + struct netdev_addr_dummy *addr_dummy = xmalloc(sizeof *addr_dummy); ovs_mutex_lock(&netdev->mutex); - netdev->ipv6 = *in6; - netdev->ipv6_mask = *mask; + addr_dummy->address = *in6; + addr_dummy->netmask = *mask; + ovs_list_push_back(&netdev->addrs, &addr_dummy->node); netdev_change_seq_changed(netdev_); ovs_mutex_unlock(&netdev->mutex); @@ -1178,7 +1184,10 @@ netdev_dummy_send(struct netdev *netdev, int qid, dummy_packet_conn_send(&dev->conn, buffer, size); /* Reply to ARP requests for 'dev''s assigned IP address. */ - if (dev->address.s_addr) { + struct netdev_addr_dummy *addr_dummy; + LIST_FOR_EACH (addr_dummy, node, &dev->addrs) { + ovs_be32 address = in6_addr_get_mapped_ipv4(&addr_dummy->address); + struct dp_packet dp; struct flow flow; @@ -1186,7 +1195,7 @@ netdev_dummy_send(struct netdev *netdev, int qid, flow_extract(&dp, &flow); if (flow.dl_type == htons(ETH_TYPE_ARP) && flow.nw_proto == ARP_OP_REQUEST - && flow.nw_dst == dev->address.s_addr) { + && flow.nw_dst == address) { struct dp_packet *reply = dp_packet_new(0); compose_arp(reply, ARP_OP_REPLY, dev->hwaddr, flow.dl_src, false, flow.nw_dst, flow.nw_src); @@ -1677,6 +1686,15 @@ pkt_list_delete(struct ovs_list *l) } } +static void +addr_list_delete(struct ovs_list *l) { + struct netdev_addr_dummy *addr_dummy; + + LIST_FOR_EACH_POP (addr_dummy, node, l) { + free(addr_dummy); + } +} + static struct dp_packet * eth_from_packet(const char *s) { @@ -2009,7 +2027,7 @@ netdev_dummy_ip4addr(struct unixctl_conn *conn, int argc OVS_UNUSED, error = ip_parse_masked(argv[2], &ip.s_addr, &mask.s_addr); if (!error) { - netdev_dummy_set_in4(netdev, ip, mask); + netdev_dummy_add_in4(netdev, ip, mask); unixctl_command_reply(conn, "OK"); } else { unixctl_command_reply_error(conn, error); @@ -2038,7 +2056,7 @@ netdev_dummy_ip6addr(struct unixctl_conn *conn, int argc OVS_UNUSED, struct in6_addr mask; mask = ipv6_create_mask(plen); - netdev_dummy_set_in6(netdev, &ip6, &mask); + netdev_dummy_add_in6(netdev, &ip6, &mask); unixctl_command_reply(conn, "OK"); } else { unixctl_command_reply_error(conn, error); From patchwork Tue Feb 14 03:39:05 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Nobuhiro MIKI X-Patchwork-Id: 1742023 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org (client-ip=2605:bc80:3010::133; helo=smtp2.osuosl.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Authentication-Results: legolas.ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=yahoo-corp.jp header.i=@yahoo-corp.jp header.a=rsa-sha256 header.s=default header.b=Bn7rPYNv; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=yjcorp.onmicrosoft.com header.i=@yjcorp.onmicrosoft.com header.a=rsa-sha256 header.s=selector1-yjcorp-onmicrosoft-com header.b=O0Qp+w4B; dkim-atps=neutral Received: from smtp2.osuosl.org (smtp2.osuosl.org [IPv6:2605:bc80:3010::133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-384) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4PG6RB4rQqz23qt for ; Tue, 14 Feb 2023 14:40:06 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by smtp2.osuosl.org (Postfix) with ESMTP id 5FBB040AA9; Tue, 14 Feb 2023 03:40:00 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp2.osuosl.org 5FBB040AA9 Authentication-Results: smtp2.osuosl.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=yahoo-corp.jp header.i=@yahoo-corp.jp header.a=rsa-sha256 header.s=default header.b=Bn7rPYNv; dkim=fail reason="signature verification failed" (1024-bit key) header.d=yjcorp.onmicrosoft.com header.i=@yjcorp.onmicrosoft.com header.a=rsa-sha256 header.s=selector1-yjcorp-onmicrosoft-com header.b=O0Qp+w4B X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp2.osuosl.org ([127.0.0.1]) by localhost (smtp2.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id PI9P-CsDJ1PI; Tue, 14 Feb 2023 03:39:57 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by smtp2.osuosl.org (Postfix) with ESMTPS id BD2F840AF5; Tue, 14 Feb 2023 03:39:55 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp2.osuosl.org BD2F840AF5 Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 0481FC008E; Tue, 14 Feb 2023 03:39:52 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@lists.linuxfoundation.org Received: from smtp4.osuosl.org (smtp4.osuosl.org [IPv6:2605:bc80:3010::137]) by lists.linuxfoundation.org (Postfix) with ESMTP id 0491EC002B for ; Tue, 14 Feb 2023 03:39:49 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp4.osuosl.org (Postfix) with ESMTP id BC655415E7 for ; Tue, 14 Feb 2023 03:39:47 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp4.osuosl.org BC655415E7 Authentication-Results: smtp4.osuosl.org; dkim=pass (1024-bit key) header.d=yahoo-corp.jp header.i=@yahoo-corp.jp header.a=rsa-sha256 header.s=default header.b=Bn7rPYNv; dkim=pass (1024-bit key) header.d=yjcorp.onmicrosoft.com header.i=@yjcorp.onmicrosoft.com header.a=rsa-sha256 header.s=selector1-yjcorp-onmicrosoft-com header.b=O0Qp+w4B X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp4.osuosl.org ([127.0.0.1]) by localhost (smtp4.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id EkQzpW3blnTt for ; Tue, 14 Feb 2023 03:39:46 +0000 (UTC) X-Greylist: from auto-whitelisted by SQLgrey-1.8.0 DKIM-Filter: OpenDKIM Filter v2.11.0 smtp4.osuosl.org 0BB84415EF Received: from corp-ob08.yahoo-corp.jp (corp-ob08.yahoo-corp.jp [183.79.94.93]) by smtp4.osuosl.org (Postfix) with ESMTPS id 0BB84415EF for ; Tue, 14 Feb 2023 03:39:45 +0000 (UTC) Received: from APC01-SG2-obe.outbound.protection.outlook.com (mail-sgaapc01lp2104.outbound.protection.outlook.com [104.47.26.104]) by corp-ob08.yahoo-corp.jp (Postfix) with ESMTPS id 9D1FF19FB183 for ; Tue, 14 Feb 2023 12:39:43 +0900 (JST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo-corp.jp; s=default; t=1676345983; bh=K1+k7oBj7h7h8HRrTBdHn4RdGsWJ1tz8SACfUzVYWkc=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=Bn7rPYNvCWLBTgfH003RZ8yyjktD1zMFiH4osMS9vNtMY1wzBXZjzoajV5FCVL9XN 2uASwIvrgOu4zG+FuEumPttmfEZfw0a3C/j06QmxPPKmEdbHfy5D6anQi6BlEmW19I WM7hgzt4gBVP1CQsg+ra3FfDkdbhgjpEpAlZU7A4= ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=ChmtdZK94ig7f1iWdYVTmPCK0ozuJN7lX8cHhLjMyaciS6WFlXPZOhcCrNoTiJaplcxcILgimcM3uvI78AqGO7kQzP7rnkfttC7iD/4E8xALb4RUu/GkZJApz13kZGkwORccAkqI+zGaCD47drym5582Xu5f646DwWDlH9eG23IdkM4fm2s322Pg95ikWiuYrAo7UI1q0h2XKxmaW5f8CWSGEOIK1EHxMQ54tlV7In2o93nVpHAdHHyTOUR8gOUjMVCRs39lnl1glirPwgotzAtPGqXpLrybgmaNhXfbGNfEp1I7siNQ5N0tqXEi2gyPCM6hJA7aOu9FL+FfmLatRQ== 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=K1+k7oBj7h7h8HRrTBdHn4RdGsWJ1tz8SACfUzVYWkc=; b=WsHBbntKeV1YXUiCNhKA+yRzzk+g2t5fZ1ysDvhzOQhk0zmhu80iT4gp2dVZ1f5k6tvPsVjGPvHUrBlu3rn6pbxgvzhgcG2SLC+Hbw/qfsYH9eI3qk3J1M3h30kbsrorbGBE1pDpkY6kNZmmbJfOcmvkrqxUyEJQC3rT4UJqcZBuwT534TTwE0b3pAFlqj8DU1ZJZnKlNwNBJtQNI8lHWK5IL87k/cQsup9+5/I6OuaLRVFq0WoGuiD9pOFYbeZ6CY0+7LwrUDcM/seEU3JfBFJqF0CyuclTYuIk4H6NrvQmfNB6SHdcAM3GjOcIat8HEuMfwrCLA510OWent/dyhg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=yahoo-corp.jp; dmarc=pass action=none header.from=yahoo-corp.jp; dkim=pass header.d=yahoo-corp.jp; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yjcorp.onmicrosoft.com; s=selector1-yjcorp-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=K1+k7oBj7h7h8HRrTBdHn4RdGsWJ1tz8SACfUzVYWkc=; b=O0Qp+w4BF73miLT6s1wurwH3EQ0flCY/G2TiW3eXQIEnhFqiZ6tUNGw29HW+WKo+J1lmyf/vWLnbqUrNlhNB8CF5DuUTNEipqcnEzYjVYopsLoQ9drwVNSforp+GrnpFgnZ9MJIiu/IqsgQ+sP9InZGxmFpxNtN/E0mkDfqt0jY= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=yahoo-corp.jp; Received: from TY2PR01MB4107.jpnprd01.prod.outlook.com (2603:1096:404:d8::23) by TYAPR01MB5755.jpnprd01.prod.outlook.com (2603:1096:404:8054::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6086.24; Tue, 14 Feb 2023 03:39:41 +0000 Received: from TY2PR01MB4107.jpnprd01.prod.outlook.com ([fe80::2fdc:d70a:ef7:a01f]) by TY2PR01MB4107.jpnprd01.prod.outlook.com ([fe80::2fdc:d70a:ef7:a01f%5]) with mapi id 15.20.6086.024; Tue, 14 Feb 2023 03:39:41 +0000 From: Nobuhiro MIKI To: dev@openvswitch.org Date: Tue, 14 Feb 2023 12:39:05 +0900 Message-Id: <20230214033906.23576-3-nmiki@yahoo-corp.jp> X-Mailer: git-send-email 2.38.1 In-Reply-To: <20230214033906.23576-1-nmiki@yahoo-corp.jp> References: <20230214033906.23576-1-nmiki@yahoo-corp.jp> X-ClientProxiedBy: TYCP286CA0003.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:26c::10) To TY2PR01MB4107.jpnprd01.prod.outlook.com (2603:1096:404:d8::23) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: TY2PR01MB4107:EE_|TYAPR01MB5755:EE_ X-MS-Office365-Filtering-Correlation-Id: 17c6e376-78f5-471b-7e06-08db0e3d1b2b X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: upFXM+CrufV361zOry+K9MlH864j9phaHezLm7LGUvYT5jXtksp/9gnnwONX8GRgLlvuJC4xyCnvFQ70fNSLo5OegddkMX9HpxCrY2wKkcbp2126Zvr2gBFc/bWQDt7e3sodosXcrQ46W3l8EFJDUSaX0iOOvPe17JKjC1zoIMSD2wK04zwsAmLOC6QSS9F95v9w/H1AO4zWDnjNq+x2YL7XvYHEKd5IbLs2IJVc8CKXHHioo/45jFWY/e6nM3iTPqQCTY/E2uDgzShWrR9nTbDqe80aBpT9Yw3tp+hdTGiQRaB7pCGjnthvSu2ibMd5Kux14a+hsHUrPQwJtRG98IQ1RoSWHiaIQRUu0/W1nA2PYMx6ZsPuQ8HiqCiiZs+igdIqLiy0/Ej/Zbcv+m/OZHeiFY5Z4RVnD0Wkoj89sravONhkvC68SdNAQnK48VnXkgUCpm9ieyza5O7SYYGvYYab83xaHbjBdqvWVBtmcf51w6YpWXFBelMyLzUv3ljIK5HQrYHOdY/44MWDxybwkFwlFQaJsL7MR30KYk0XMmU3VCM0mgxYO+N+bUJsdrX8hFC85N4s57r6d128IpYwzcqs2cgaqh106IEqgxqi8/AeC+wziwN7HZxFLECkYfCtzBWAE0E59HeUQQy9SMiN2j+hSaBHvPjOQvSGIE/vOHnyMBPXtx/5CrNSY3MJOVeOhhcqIkvb5RmPON6CHgF3gCZVhoZIX//TNVINgGke5xQ= X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:TY2PR01MB4107.jpnprd01.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230025)(4636009)(366004)(346002)(376002)(396003)(136003)(39860400002)(451199018)(41300700001)(5660300002)(8936002)(66574015)(66476007)(8676002)(6916009)(66946007)(66556008)(4326008)(38350700002)(2906002)(83380400001)(38100700002)(36756003)(30864003)(86362001)(82960400001)(2616005)(6666004)(107886003)(52116002)(478600001)(6486002)(6512007)(26005)(186003)(6506007)(66899018)(316002)(1076003)(21314003); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?q?x8nZdhcS2tUuJMBY/GeKe51Gae4b?= =?utf-8?q?zI/S3I2tF5cmb5BhIkDUNUoeItO7hpt9hIWVO9qMNMnvV7IJAgKSr7iXn1mEmV0xs?= =?utf-8?q?0fIjxrUBxKBv3fuVxv+8JLHRK28lchQmQ0RVvSfAywiIdIYBaIdWyMqo6PTf0dSCX?= =?utf-8?q?dsca+AhneCszWNIjqX7s7AIDaQ1/rDa+yCTb1IDLs611GERtwJyoUZ2EfAZgWE8BT?= =?utf-8?q?TSzdMGUYgnEec36Okeaf/mhpONVcwPOwHaViT34DZ5AKtw0d57HH3fQpJx0mNwY9A?= =?utf-8?q?HiRZxk8YaIlzbzfd6A3YvTblPu/teGA+ev0YzCBeRddpwwN/h9lLdD+5WCZ5DJVzu?= =?utf-8?q?W5HJ2LR7xU+y1T1RygXqDORSUS4txJMEXdZsv0Gacb8eGCF2jL3A3xwEQW3fDO18u?= =?utf-8?q?rWUz8gV4QQW9ClXPnYi455YgFCaVBdKsvqBIbZCUp3iVFrb/v4JQ/sTWNKDeg+qbx?= =?utf-8?q?vlR0yIOVXLLec20RpnQzH+OkI9cQV3xSKjP8N3b69Df1mcjcbaarGFruYo8BC8IOK?= =?utf-8?q?Pc2Siu1I9LVBkZtRwnCZW05/Yfi8rB/G3RJyt12gV+xHeqvTDNMJZs7Oh7NZHuyjH?= =?utf-8?q?h5D9dHESx67lhOERwcDZsrDtH4iyBgS8TvzaWFOhRYyduyrL7eLJX1IrJyBgQk6IE?= =?utf-8?q?QKrccGVBqAz+SGwT7FvPBMyeosdO/2/xutZQA6MChMKbA3VUA59uJxnx0qKjRBn2y?= =?utf-8?q?5TBOOe/HPpRRxAjwK3pEdk66DejI5leeiFK4dzCe3K85wflw9Ixb/jXMIVKFlyIRw?= =?utf-8?q?IBWr7CxpAyJo1jWdODPIRD4fuRYmoixPY05mGwirzTZbH2H2m0Hp9QAoKr/3dB8uh?= =?utf-8?q?n0jKS1rwwJa8iu6CW89qF8y/FvpnPh2PuK5+2QnCj02lw/ll5gdLewSPLmF+Fl74d?= =?utf-8?q?khIrHjw0MxBZec5Kjovd5tBBvb5s2d02SVLRej2BldpJ2sDJDop0aweidKCNkGEBA?= =?utf-8?q?9sV/Y+zjnQ6bSEqqXiHvW6X121G6Uzttl3iVqPqFmSfmbTuUv1Hx2NTLAJSE0+w62?= =?utf-8?q?PyrhVLR9awd2ObktlAmyXy/pYJ7bcwU3JhmvCFWqzISb3rpCiUEX603gdJqmTSrJ1?= =?utf-8?q?g1OxjpgKV2F+cIpwOAkv6MGxPUBRu+uV663J9tSU4JIMaRizpqXCXAbXg4aHQNNMg?= =?utf-8?q?8Yj1IK209dqKV03yYXvsGfnqFKOTMkVNFQSWWFn9VK2c9TtjQrP7FNSa5Ax0Jz3lC?= =?utf-8?q?4AOyRU/I65GbVY693BZ5AESXVv2AXyudrciJsxeodWaeSi7B7peKwaOzaQp/pvv8m?= =?utf-8?q?+7iEShcmppfkLPGRSkY/lU2gQ9NCnb3Po9HoVumyYj2KmGgL+yTD1x97gs0lru+j3?= =?utf-8?q?AFvgrXTLJgI8qgiCgxadT7bR77qqvIRqsy1W9dUaaMQofpIqSBPkQx40QAZ8cn+eX?= =?utf-8?q?ZYmKV5SJ2V7lz/YtsmCgbl43eLLUUPHMwc6MdyOFbMsoxo40MA3vNVVaeJvOP3otR?= =?utf-8?q?mPWN9w+4aNkDOAN+x8TBSywTvC/qGEejWqMx6JpqS4IhkCQetsTyhQ+kcdMAyzhAt?= =?utf-8?q?brJAUSWMrMsv?= X-OriginatorOrg: yahoo-corp.jp X-MS-Exchange-CrossTenant-Network-Message-Id: 17c6e376-78f5-471b-7e06-08db0e3d1b2b X-MS-Exchange-CrossTenant-AuthSource: TY2PR01MB4107.jpnprd01.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Feb 2023 03:39:41.6873 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: a208d369-cd4e-4f87-b119-98eaf31df2c3 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: kDlG13ZKcotvL/HGylfS31PSwadFVXaGQskRu9Ybt2WCxQQnzkeWVgj15KKkzwNfUi708KqXgPU96fXkJcqNqQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYAPR01MB5755 Subject: [ovs-dev] [PATCH v3 2/3] ovs-router: Introduce src option in ovs/route/add command. X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" When adding a route with ovs/route/add command, the source address in "ovs_router_entry" structure is always the FIRST address that the interface has. See "ovs_router_get_netdev_source_address" function for more information. If an interface has multiple ipv4 and/or ipv6 addresses, there are use cases where the user wants to control the source address. This patch therefore addresses this issue by adding a src parameter. Note that same constraints also exist when caching routes from Kernel FIB with Netlink, but are not dealt with in this patch. Signed-off-by: Nobuhiro MIKI --- NEWS | 3 + lib/ovs-router.c | 134 ++++++++++++++++++++++++-------- ofproto/ofproto-tnl-unixctl.man | 9 ++- tests/ovs-router.at | 78 +++++++++++++++++++ 4 files changed, 188 insertions(+), 36 deletions(-) diff --git a/NEWS b/NEWS index fe6055a2700b..9d98e1573e3b 100644 --- a/NEWS +++ b/NEWS @@ -4,6 +4,9 @@ Post-v3.1.0 * OVS now collects per-interface upcall statistics that can be obtained via 'ovs-appctl dpctl/show -s' or the interface's statistics column in OVSDB. Available with upstream kernel 6.2+. + - ovs-appctl: + * Add support for selecting the source address with the + “ovs-appctl ovs/route/add" command. v3.1.0 - xx xxx xxxx diff --git a/lib/ovs-router.c b/lib/ovs-router.c index 5d0fbd503e9e..8f2587444034 100644 --- a/lib/ovs-router.c +++ b/lib/ovs-router.c @@ -164,6 +164,47 @@ static void rt_init_match(struct match *match, uint32_t mark, match->flow.pkt_mark = mark; } +static int +verify_prefsrc(const struct in6_addr *ip6_dst, + const char output_bridge[], + struct in6_addr *prefsrc) +{ + struct in6_addr *mask, *addr6; + int err, n_in6, i; + struct netdev *dev; + + err = netdev_open(output_bridge, NULL, &dev); + if (err) { + return err; + } + + err = netdev_get_addr_list(dev, &addr6, &mask, &n_in6); + if (err) { + goto out; + } + + err = ENOENT; + for (i = 0; i < n_in6; i++) { + struct in6_addr a1, a2; + a1 = ipv6_addr_bitand(ip6_dst, &mask[i]); + a2 = ipv6_addr_bitand(prefsrc, &mask[i]); + + /* Check that the intarface has "prefsrc" and + * it is same broadcast domain with "ip6_dst". */ + if (IN6_ARE_ADDR_EQUAL(prefsrc, &addr6[i]) && + IN6_ARE_ADDR_EQUAL(&a1, &a2)) { + err = 0; + goto out; + } + } + +out: + free(addr6); + free(mask); + netdev_close(dev); + return err; +} + int ovs_router_get_netdev_source_address(const struct in6_addr *ip6_dst, const char output_bridge[], @@ -217,7 +258,8 @@ static int ovs_router_insert__(uint32_t mark, uint8_t priority, bool local, const struct in6_addr *ip6_dst, uint8_t plen, const char output_bridge[], - const struct in6_addr *gw) + const struct in6_addr *gw, + const struct in6_addr *ip6_src) { const struct cls_rule *cr; struct ovs_router_entry *p; @@ -236,11 +278,21 @@ ovs_router_insert__(uint32_t mark, uint8_t priority, bool local, p->plen = plen; p->local = local; p->priority = priority; - err = ovs_router_get_netdev_source_address(ip6_dst, output_bridge, - &p->src_addr); - if (err && ipv6_addr_is_set(gw)) { - err = ovs_router_get_netdev_source_address(gw, output_bridge, + + if (ipv6_addr_is_set(ip6_src)) { + p->src_addr = *ip6_src; + + err = verify_prefsrc(ip6_dst, output_bridge, &p->src_addr); + if (err && ipv6_addr_is_set(gw)) { + err = verify_prefsrc(gw, output_bridge, &p->src_addr); + } + } else { + err = ovs_router_get_netdev_source_address(ip6_dst, output_bridge, &p->src_addr); + if (err && ipv6_addr_is_set(gw)) { + err = ovs_router_get_netdev_source_address(gw, output_bridge, + &p->src_addr); + } } if (err) { struct ds ds = DS_EMPTY_INITIALIZER; @@ -274,7 +326,8 @@ ovs_router_insert(uint32_t mark, const struct in6_addr *ip_dst, uint8_t plen, { if (use_system_routing_table) { uint8_t priority = local ? plen + 64 : plen; - ovs_router_insert__(mark, priority, local, ip_dst, plen, output_bridge, gw); + ovs_router_insert__(mark, priority, local, ip_dst, plen, + output_bridge, gw, &in6addr_any); } } @@ -342,47 +395,64 @@ ovs_router_add(struct unixctl_conn *conn, int argc, const char *argv[], void *aux OVS_UNUSED) { struct in6_addr gw6 = in6addr_any; + struct in6_addr src6 = in6addr_any; struct in6_addr ip6; uint32_t mark = 0; unsigned int plen; + ovs_be32 gw = 0; + ovs_be32 src = 0; ovs_be32 ip; int err; + bool is_ipv6 = false; + char src6_s[IPV6_SCAN_LEN + 1]; + int i; if (scan_ipv4_route(argv[1], &ip, &plen)) { - ovs_be32 gw = 0; - - if (argc > 3) { - if (!ovs_scan(argv[3], "pkt_mark=%"SCNi32, &mark) && - !ip_parse(argv[3], &gw)) { - unixctl_command_reply_error(conn, "Invalid pkt_mark or gateway"); - return; - } - } in6_addr_set_mapped_ipv4(&ip6, ip); - if (gw) { - in6_addr_set_mapped_ipv4(&gw6, gw); - } plen += 96; } else if (scan_ipv6_route(argv[1], &ip6, &plen)) { - if (argc > 3) { - if (!ovs_scan(argv[3], "pkt_mark=%"SCNi32, &mark) && - !ipv6_parse(argv[3], &gw6)) { - unixctl_command_reply_error(conn, "Invalid pkt_mark or IPv6 gateway"); - return; - } - } + is_ipv6 = true; } else { unixctl_command_reply_error(conn, "Invalid parameters"); return; } - if (argc > 4) { - if (!ovs_scan(argv[4], "pkt_mark=%"SCNi32, &mark)) { - unixctl_command_reply_error(conn, "Invalid pkt_mark"); - return; + + /* Parse optional parameters. */ + for (i = 3; i < argc; i++) { + if (ovs_scan(argv[i], "pkt_mark=%"SCNi32, &mark)) { + continue; } + + if (is_ipv6) { + if (ovs_scan(argv[i], "src="IPV6_SCAN_FMT, src6_s) && + ipv6_parse(src6_s, &src6)) { + continue; + } + if (ipv6_parse(argv[i], &gw6)) { + continue; + } + } else { + if (ovs_scan(argv[i], "src="IP_SCAN_FMT, IP_SCAN_ARGS(&src))) { + continue; + } + if (ip_parse(argv[i], &gw)) { + continue; + } + } + + unixctl_command_reply_error(conn, "Invalid parameters"); + return; } - err = ovs_router_insert__(mark, plen + 32, false, &ip6, plen, argv[2], &gw6); + if (gw) { + in6_addr_set_mapped_ipv4(&gw6, gw); + } + if (src) { + in6_addr_set_mapped_ipv4(&src6, src); + } + + err = ovs_router_insert__(mark, plen + 32, false, &ip6, plen, argv[2], + &gw6, &src6); if (err) { unixctl_command_reply_error(conn, "Error while inserting route."); } else { @@ -533,8 +603,8 @@ ovs_router_init(void) classifier_init(&cls, NULL); unixctl_command_register("ovs/route/add", "ip_addr/prefix_len out_br_name [gw] " - "[pkt_mark=mark]", - 2, 4, ovs_router_add, NULL); + "[pkt_mark=mark] [src=src_ip_addr]", + 2, 5, ovs_router_add, NULL); unixctl_command_register("ovs/route/show", "", 0, 0, ovs_router_show, NULL); unixctl_command_register("ovs/route/del", "ip_addr/prefix_len " diff --git a/ofproto/ofproto-tnl-unixctl.man b/ofproto/ofproto-tnl-unixctl.man index 13a465119a90..3d8f8261f3c4 100644 --- a/ofproto/ofproto-tnl-unixctl.man +++ b/ofproto/ofproto-tnl-unixctl.man @@ -1,8 +1,9 @@ .SS "OPENVSWITCH TUNNELING COMMANDS" These commands query and modify OVS tunnel components. . -.IP "\fBovs/route/add ipv4_address/plen output_bridge [GW]\fR" -Adds ipv4_address/plen route to vswitchd routing table. output_bridge +.IP "\fBovs/route/add \fIip\fB/\fIplen\fB \fIoutput_bridge\fB \ +[\fIgateway\fB] [pkt_mark=\fImark\fB] [src=\fIsrc_ip\fB]\fR" +Adds \fIip\fR/\fIplen\fR route to vswitchd routing table. \fIoutput_bridge\fR needs to be OVS bridge name. This command is useful if OVS cached routes does not look right. . @@ -10,8 +11,8 @@ routes does not look right. Print all routes in OVS routing table, This includes routes cached from system routing table and user configured routes. . -.IP "\fBovs/route/del ipv4_address/plen\fR" -Delete ipv4_address/plen route from OVS routing table. +.IP "\fBovs/route/del \fIip\fB/\fIplen\fR" +Delete \fIip\fR/\fIplen\fR route from OVS routing table. . .IP "\fBtnl/neigh/show\fR" .IP "\fBtnl/arp/show\fR" diff --git a/tests/ovs-router.at b/tests/ovs-router.at index 6dacc2954bc6..42f01b6281e9 100644 --- a/tests/ovs-router.at +++ b/tests/ovs-router.at @@ -12,6 +12,84 @@ AT_CHECK([ovs-appctl ovs/route/add 1.1.1.0/24 br0 2.2.2.10], [0], [OK OVS_VSWITCHD_STOP AT_CLEANUP +AT_SETUP([appctl - route/add with src - ipv4]) +AT_KEYWORDS([ovs_router]) +OVS_VSWITCHD_START([add-port br0 p1 -- set Interface p1 type=dummy]) +AT_CHECK([ovs-appctl netdev-dummy/ip4addr br0 192.168.9.2/24], [0], [OK +]) +AT_CHECK([ovs-appctl netdev-dummy/ip4addr br0 192.168.9.3/24], [0], [OK +]) +AT_CHECK([ovs-appctl ovs/route/add 192.168.9.11/32 br0 src=192.168.9.3], [0], [OK +]) +AT_CHECK([ovs-appctl ovs/route/add 192.168.10.12/32 br0 192.168.9.1 src=192.168.9.3], [0], [OK +]) +AT_CHECK([ovs-appctl ovs/route/add 192.168.10.13/32 br0 192.168.9.1 pkt_mark=13 src=192.168.9.3], [0], [OK +]) +AT_CHECK([ovs-appctl ovs/route/add 192.168.10.14/32 br0 192.168.9.1 pkt_mark=14 src=192.168.9.2], [0], [OK +]) +AT_CHECK([ovs-appctl ovs/route/add 192.168.10.15/32 br0 192.168.9.1 src=foo.bar.9.200], [2], [], [dnl +Invalid parameters +ovs-appctl: ovs-vswitchd: server returned an error +]) +AT_CHECK([ovs-appctl ovs/route/add 192.168.10.16/32 br0 192.168.9.1 src=192.168.9.200], [2], [], [dnl +Error while inserting route. +ovs-appctl: ovs-vswitchd: server returned an error +]) +AT_CHECK([ovs-appctl ovs/route/add 192.168.10.17/32 br0 192.168.11.1 src=192.168.9.3], [2], [], [dnl +Error while inserting route. +ovs-appctl: ovs-vswitchd: server returned an error +]) +AT_CHECK([ovs-appctl ovs/route/add 192.168.10.18/32 br0 src=192.168.9.3], [2], [], [dnl +Error while inserting route. +ovs-appctl: ovs-vswitchd: server returned an error +]) +AT_CHECK([ovs-appctl ovs/route/show | grep User | grep 192.168.10 | sort], [0], [dnl +User: 192.168.10.12/32 dev br0 GW 192.168.9.1 SRC 192.168.9.3 +User: 192.168.10.13/32 MARK 13 dev br0 GW 192.168.9.1 SRC 192.168.9.3 +User: 192.168.10.14/32 MARK 14 dev br0 GW 192.168.9.1 SRC 192.168.9.2 +]) +OVS_VSWITCHD_STOP +AT_CLEANUP + +AT_SETUP([appctl - route/add with src - ipv6]) +AT_KEYWORDS([ovs_router]) +OVS_VSWITCHD_START([add-port br0 p1 -- set Interface p1 type=dummy]) +AT_CHECK([ovs-appctl netdev-dummy/ip6addr br0 2001:db8:cafe::2/64], [0], [OK +]) +AT_CHECK([ovs-appctl netdev-dummy/ip6addr br0 2001:db8:cafe::3/64], [0], [OK +]) +AT_CHECK([ovs-appctl ovs/route/add 2001:db8:cafe::11/128 br0 src=2001:db8:cafe::3], [0], [OK +]) +AT_CHECK([ovs-appctl ovs/route/add 2001:db8:beef::12/128 br0 2001:db8:cafe::1 src=2001:db8:cafe::3], [0], [OK +]) +AT_CHECK([ovs-appctl ovs/route/add 2001:db8:beef::13/128 br0 2001:db8:cafe::1 pkt_mark=13 src=2001:db8:cafe::3], [0], [OK +]) +AT_CHECK([ovs-appctl ovs/route/add 2001:db8:beef::14/128 br0 2001:db8:cafe::1 pkt_mark=14 src=2001:db8:cafe::2], [0], [OK +]) +AT_CHECK([ovs-appctl ovs/route/add 2001:db8:beef::15/128 br0 2001:db8:cafe::1 src=foo:bar:2001:db8:cafe], [2], [], [dnl +Invalid parameters +ovs-appctl: ovs-vswitchd: server returned an error +]) +AT_CHECK([ovs-appctl ovs/route/add 2001:db8:beef::16/128 br0 2001:db8:cafe::1 src=2001:db8:cafe::200], [2], [], [dnl +Error while inserting route. +ovs-appctl: ovs-vswitchd: server returned an error +]) +AT_CHECK([ovs-appctl ovs/route/add 2001:db8:beef::17/128 br0 2001:db8:face::1 src=2001:db8:cafe::3], [2], [], [dnl +Error while inserting route. +ovs-appctl: ovs-vswitchd: server returned an error +]) +AT_CHECK([ovs-appctl ovs/route/add 2001:db8:beef::18/128 br0 src=2001:db8:cafe::3], [2], [], [dnl +Error while inserting route. +ovs-appctl: ovs-vswitchd: server returned an error +]) +AT_CHECK([ovs-appctl ovs/route/show | grep User | grep 2001:db8:beef | sort], [0], [dnl +User: 2001:db8:beef::12/128 dev br0 GW 2001:db8:cafe::1 SRC 2001:db8:cafe::3 +User: 2001:db8:beef::13/128 MARK 13 dev br0 GW 2001:db8:cafe::1 SRC 2001:db8:cafe::3 +User: 2001:db8:beef::14/128 MARK 14 dev br0 GW 2001:db8:cafe::1 SRC 2001:db8:cafe::2 +]) +OVS_VSWITCHD_STOP +AT_CLEANUP + AT_SETUP([appctl - route/lookup]) AT_KEYWORDS([ovs_router]) OVS_VSWITCHD_START([add-port br0 p1 -- set Interface p1 type=dummy]) From patchwork Tue Feb 14 03:39:06 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nobuhiro MIKI X-Patchwork-Id: 1742022 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org (client-ip=140.211.166.133; helo=smtp2.osuosl.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Authentication-Results: legolas.ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=yahoo-corp.jp header.i=@yahoo-corp.jp header.a=rsa-sha256 header.s=default header.b=GvQvVxBA; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=yjcorp.onmicrosoft.com header.i=@yjcorp.onmicrosoft.com header.a=rsa-sha256 header.s=selector1-yjcorp-onmicrosoft-com header.b=WhGZdjXz; dkim-atps=neutral Received: from smtp2.osuosl.org (smtp2.osuosl.org [140.211.166.133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-384) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4PG6R75dCcz23h0 for ; Tue, 14 Feb 2023 14:40:03 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by smtp2.osuosl.org (Postfix) with ESMTP id E0C8140A95; Tue, 14 Feb 2023 03:39:56 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp2.osuosl.org E0C8140A95 Authentication-Results: smtp2.osuosl.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=yahoo-corp.jp header.i=@yahoo-corp.jp header.a=rsa-sha256 header.s=default header.b=GvQvVxBA; dkim=fail reason="signature verification failed" (1024-bit key) header.d=yjcorp.onmicrosoft.com header.i=@yjcorp.onmicrosoft.com header.a=rsa-sha256 header.s=selector1-yjcorp-onmicrosoft-com header.b=WhGZdjXz X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp2.osuosl.org ([127.0.0.1]) by localhost (smtp2.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id gOJwwdSvOTXO; Tue, 14 Feb 2023 03:39:55 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by smtp2.osuosl.org (Postfix) with ESMTPS id D4C8540A98; Tue, 14 Feb 2023 03:39:53 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp2.osuosl.org D4C8540A98 Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 15573C0083; Tue, 14 Feb 2023 03:39:51 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@lists.linuxfoundation.org Received: from smtp3.osuosl.org (smtp3.osuosl.org [140.211.166.136]) by lists.linuxfoundation.org (Postfix) with ESMTP id B3C66C002B for ; Tue, 14 Feb 2023 03:39:48 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp3.osuosl.org (Postfix) with ESMTP id 7F1C460FD3 for ; Tue, 14 Feb 2023 03:39:47 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp3.osuosl.org 7F1C460FD3 Authentication-Results: smtp3.osuosl.org; dkim=pass (1024-bit key) header.d=yahoo-corp.jp header.i=@yahoo-corp.jp header.a=rsa-sha256 header.s=default header.b=GvQvVxBA; dkim=pass (1024-bit key) header.d=yjcorp.onmicrosoft.com header.i=@yjcorp.onmicrosoft.com header.a=rsa-sha256 header.s=selector1-yjcorp-onmicrosoft-com header.b=WhGZdjXz X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp3.osuosl.org ([127.0.0.1]) by localhost (smtp3.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 2ocQYAx0bssR for ; Tue, 14 Feb 2023 03:39:46 +0000 (UTC) X-Greylist: from auto-whitelisted by SQLgrey-1.8.0 DKIM-Filter: OpenDKIM Filter v2.11.0 smtp3.osuosl.org EE5C0610A5 Received: from corp-ob08.yahoo-corp.jp (corp-ob08.yahoo-corp.jp [183.79.94.93]) by smtp3.osuosl.org (Postfix) with ESMTPS id EE5C0610A5 for ; Tue, 14 Feb 2023 03:39:45 +0000 (UTC) Received: from APC01-SG2-obe.outbound.protection.outlook.com (mail-sgaapc01lp2104.outbound.protection.outlook.com [104.47.26.104]) by corp-ob08.yahoo-corp.jp (Postfix) with ESMTPS id 17CF819FB185 for ; Tue, 14 Feb 2023 12:39:44 +0900 (JST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo-corp.jp; s=default; t=1676345984; bh=XVa5Hgag/sHPy6Hr2ioaU22JaFo/ZgO5dyd9HHvCzUM=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=GvQvVxBAk8tpL9AHiDqr7pTfeZ6jOicC39UAvpYp55Jfl/gsAFQp31cXjJ9fpwoqG iW6FVqK+zIw/wqFfewykDvFv1/KLf50wYf2VKbHEXPhJ1v1ij//jj+EVIn1jHhnjt8 LJj2j4mQlbQM1zBLWjV3X5gYN+xhank0a2TEHO1w= ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=g1MxGi2M6T8wfiFdLhpP4Jjyhmvff4l5iI1r/w9gg6x1dmN4/TZYKXPub5QRzdL72FW1rjQ5wlOQgFgy317mwlDTIpOLAtDawxVPDK+9aKAK4h5BCXj13B7Q374K5fyshjJBjoNnKJ0z1DWPEVeuU/38vlHt9vDoKFrcoS9R7XA2pnbDNCpDTsvMf9RcCanuGnczmhPnVnxL7rO/Z1zVpI5kZHSal2TGr5AjFd9xzc6JMZW9bNpwakxj+apq0oDDaq9n8K8wZiD5F04DlxBovS8kgdTMx5MD2OpdYft8Dpd60aBFN2ESDFZXtnx+dBOzPAwaBzw7d66TnZmOYIQi+A== 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=XVa5Hgag/sHPy6Hr2ioaU22JaFo/ZgO5dyd9HHvCzUM=; b=nB5tcp225v1P4X9jHBr8OBClwuuFe0tTdb49INAnh6+uSHI4kMTLYG9zmjJ39fsEOaf0T1RMlJjHPbsu1U2Rf03j+YwuFGHCmSphm/+RZDtq2r0Pf0BFIbFVcIJpX49Agixb8ahq8AtjZi1PtjLrJBY6zC7IQWNrinqolPGbTXkUcs4wg34VzP6Ce5QZWXJvXHgLegWapWZktHFHCIQxIlwoyUnSF6Vp2qI1xBQhCffvS9oOHT6LJlYfEkQruGUTT40LJitGl9uWWZRuzw5mJUe88cVjY4bkGRhYY1Ut7AIxMCSS0g/liT6cnU6bXcWCP+w1XZl/TDihe3MS7a+FlA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=yahoo-corp.jp; dmarc=pass action=none header.from=yahoo-corp.jp; dkim=pass header.d=yahoo-corp.jp; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yjcorp.onmicrosoft.com; s=selector1-yjcorp-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=XVa5Hgag/sHPy6Hr2ioaU22JaFo/ZgO5dyd9HHvCzUM=; b=WhGZdjXzzTUx9Q8XjV5y/wSlKeiildvP9HAs3euC57IM4JoC5mwXWtRyGTaBKmnBd86TDQzbX6/jdsi5U+MvdaNldSRHKweJ7aZw3d+t4SG/P3nMTIRxIUYw+1Nj17VDTVZi4g06jqHaY/EjobjD9XKlbwJiKdJ0HBs6dQLYggM= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=yahoo-corp.jp; Received: from TY2PR01MB4107.jpnprd01.prod.outlook.com (2603:1096:404:d8::23) by TYAPR01MB5755.jpnprd01.prod.outlook.com (2603:1096:404:8054::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6086.24; Tue, 14 Feb 2023 03:39:42 +0000 Received: from TY2PR01MB4107.jpnprd01.prod.outlook.com ([fe80::2fdc:d70a:ef7:a01f]) by TY2PR01MB4107.jpnprd01.prod.outlook.com ([fe80::2fdc:d70a:ef7:a01f%5]) with mapi id 15.20.6086.024; Tue, 14 Feb 2023 03:39:42 +0000 From: Nobuhiro MIKI To: dev@openvswitch.org Date: Tue, 14 Feb 2023 12:39:06 +0900 Message-Id: <20230214033906.23576-4-nmiki@yahoo-corp.jp> X-Mailer: git-send-email 2.38.1 In-Reply-To: <20230214033906.23576-1-nmiki@yahoo-corp.jp> References: <20230214033906.23576-1-nmiki@yahoo-corp.jp> X-ClientProxiedBy: TYCP286CA0003.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:26c::10) To TY2PR01MB4107.jpnprd01.prod.outlook.com (2603:1096:404:d8::23) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: TY2PR01MB4107:EE_|TYAPR01MB5755:EE_ X-MS-Office365-Filtering-Correlation-Id: ce62baad-71db-4ff1-65a1-08db0e3d1b75 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: LOl33nq8GnTxW8MKYA95a8GLdxRvXRJNNzWV/DuFWAt52xcXG5EH3YN63S1jD1Wv2ROu7ShkPP5vn5Z8TzwiZ0IrV8xm2SHdmocdn1xu3LYR38BJBYJJhW42FfbnPNnulcPxNDQPQo3iBAYJ1s7AbqAXKFqQWEcqp5mfmx54v3Ep1Ut74q3uvDyTwVAGU1rQvuZBiYZtUYpmRXnHgI9Ooj8gbu3rW0CoyXHGsXvkgVDciRT6i7CQdVH+epc55JhGC+57OEzmv9+0F5pU63oJ5mm0oy17JcnTFldbg17AyhcR+i1OAYfuy2u5c5/IoLx9ivstOJ2zLZLSSbLZyibCppPIRJMZOq5Tn1RM6QRYJmW3GvDfd5VmKxPHt2hSxiEJ76ZQT4mri0lE1pKCqHeqjRHO73QNarN/dExSbx0o98xdxR6TNx7mfyeTiFEagEPl260C3+6cKmr0HiM2DJC2YCrcIQo3j+dta/DETLJ754OEkFUVzM8ODy4rVHC/AZreq25FzWuUbD0b/p90zLSeHNDvPZmF7REPafcqaztdaMVm/PO/AkQF+vIk9FQbDrJYmmaF88liZ31wrRydhJyYNHJqBJyHY5zKhC1FPwK2zekEtrprd2oiB3IFj0hW03nEq5b1O0kcE11qec90mP/hEuihuqpqdsl0RFcYmzF2DRwEe26UUUS4UsxxUm306PPBIoqPnuB0orQ8caWmbU6AvQ== X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:TY2PR01MB4107.jpnprd01.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230025)(4636009)(366004)(346002)(376002)(396003)(136003)(39860400002)(451199018)(41300700001)(5660300002)(8936002)(66574015)(66476007)(8676002)(6916009)(66946007)(66556008)(4326008)(38350700002)(2906002)(83380400001)(38100700002)(36756003)(86362001)(82960400001)(2616005)(6666004)(107886003)(52116002)(478600001)(6486002)(6512007)(26005)(186003)(6506007)(316002)(1076003); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: zNo58u/0fnPlg6jyFvGYbtuEoG3JjS8kEPHlTIzM4HifSvQjoKilNaxMRsEVNfPbtphu+2WGVSCeJBRPsc0rnWvFD/EAxpzRu5BdQrPJgt2TkoXI+QXNhvoXWHxTLNF2tlaopIa2YuKBZzgqrvsnybMxNYXiqVyRbgdPc9KtKXy3txV/k0SkAbNI7ixy3AoMZnibHyKAOnEWJqdo1H18gAmJ5Zs0RJsyYTipuOv1ikUbWtW+yPsoXhGibAuB87GeyneCsukwUz0BdM+RJhVJ5R1sNAKu2S6MBplrsKmpu8t4Js6vXJ/hMiIU9CghKgOmJ4umkngTyCRbA7U7TptZZGsicj2hPZVwpPe66rHNX1nYm8SFYQ3wW65hGMLhzgC5OrVVEpP5mJT4ZcV0CTmtR1JuAs556HiewcMPcp1ol9BxJ94z5hQYRX17orqs3mXXB1IqWYj4WIN2HZdK41krsshLH6tPLiQpuhEHKcQSZLiwBEAS6hpK6PuHbDlm7lHMAcXBO+LNfEfygkvFCIbjV05NYqliZutz2Jvo+F2LuRCQjTZUVi1c+lEpbBuOkkhfHUmvDespWVkiaJupzMbYx1sImJ6kaz6ypcSiV0vQw2EdesOlDgHTrSrMUFX46YwB+HLQ7mxDLEOQgJlJ7dUBJdRu4AOqI0yBF5sWDkKICyIRydd2XRT12HtpuFc6bISmmUFqUAjH6kBN/6dnjV30HMPbBCyHILKSvqCrv9EEBoDox5KhIx8JrHPPplT4hz+B2lOjb+N40P1PpKert9ge9oHwVERWWcXXMFQMOPSlOo9px/7i0ZrzodWgZKzZQGNNKpvU94sf4JGozVolIIMXGX9DLeD0CpC3QrXbysViVuB8jNB5Yd23WwUxPEAEvAutbcGzrcYYk3iTQdi0igYRubCgBBx6hAh1HwYHsdh15ecq0b3Q6u57NigKypvS18fXeWQ9bpUwkPH6QUv6NGDzQPXAXY4HxybLtt2IMeDn99zHhJ+MsNekuA8hjLg+kcaEELf7yULdnl9UdqTlyduJ4Rwd02h5m23l8wngh86YC8mBr+6DKg03ON4CLrG0dXeSB65ypB3EA21lSjpPWHFk4fAGwVAom+vKDfTqGoC5iQGVdOZaD4yBnQibzDK+zxW8TuVVUmuyd4uetz/MzvERLWeeL++i8W6IFf0cLIW/LUK67+L8CTvZ6mn+XJg7yV5viG3PS0Tu5PB2cegXUcnao1xcI1jXEjxx0Blj0989jjWvPLBhAV9HsEHKaRJkOK5Eq12qvpI8AWFf7kwgJgrb6rxrWkDIoOXMjnCCDfTGAYQKiFJRnz6w3U8zdo1qrawGXGrFiiE/pNzSc63H+JzZYtNZNoBgdbanZBDYEVsSM0fW6CRSQgaFb5UClI2ZOeTBh/yQ6Zv+IKY7JKnrZscT/sDdTwTfymhsFagrt+xaa7Fqme1FDZy6BKNpcSfcIDTGEUSwcjCaqxmiF0tKa/7OCTt8Om99r42qfpzxVsvTK3moCjRwBvKsSGZ/PUjHt9pWgpqEPR+BQksLxhwiXD8VeY93SBcriFU304qBR5h4FRuMj9D3K0qFZWuooNBghAQZ X-OriginatorOrg: yahoo-corp.jp X-MS-Exchange-CrossTenant-Network-Message-Id: ce62baad-71db-4ff1-65a1-08db0e3d1b75 X-MS-Exchange-CrossTenant-AuthSource: TY2PR01MB4107.jpnprd01.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Feb 2023 03:39:42.2341 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: a208d369-cd4e-4f87-b119-98eaf31df2c3 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: il5Azn492wBUpN5RmqQwWc1/Esdc8CAIxVVvGvvrHHZM/RHLZkLCJI6RWF4aD1C/RQUte5iQ0mmAbxbNfSNfyg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYAPR01MB5755 Subject: [ovs-dev] [PATCH v3 3/3] route-table: Retrieving the preferred source address from Netlink. X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" We can use the "ip route add ... src ..." command to set the preferred source address for each entry in the kernel FIB. OVS has a mechanism to cache the FIB, but the preferred source address is ignored and calculated with its own logic. This patch resolves the difference between kernel FIB and OVS route table cache by retrieving the RTA_PREFSRC attribute of Netlink messages. Signed-off-by: Nobuhiro MIKI Reviewed-by: Simon Horman --- lib/ovs-router.c | 6 +++--- lib/ovs-router.h | 3 ++- lib/route-table.c | 16 +++++++++++++++- tests/system-route.at | 39 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 59 insertions(+), 5 deletions(-) diff --git a/lib/ovs-router.c b/lib/ovs-router.c index 8f2587444034..34a949a8b6e7 100644 --- a/lib/ovs-router.c +++ b/lib/ovs-router.c @@ -321,13 +321,13 @@ ovs_router_insert__(uint32_t mark, uint8_t priority, bool local, void ovs_router_insert(uint32_t mark, const struct in6_addr *ip_dst, uint8_t plen, - bool local, const char output_bridge[], - const struct in6_addr *gw) + bool local, const char output_bridge[], + const struct in6_addr *gw, const struct in6_addr *prefsrc) { if (use_system_routing_table) { uint8_t priority = local ? plen + 64 : plen; ovs_router_insert__(mark, priority, local, ip_dst, plen, - output_bridge, gw, &in6addr_any); + output_bridge, gw, prefsrc); } } diff --git a/lib/ovs-router.h b/lib/ovs-router.h index d8ce3c00ded5..eb4ff85d9e63 100644 --- a/lib/ovs-router.h +++ b/lib/ovs-router.h @@ -32,7 +32,8 @@ bool ovs_router_lookup(uint32_t mark, const struct in6_addr *ip_dst, void ovs_router_init(void); void ovs_router_insert(uint32_t mark, const struct in6_addr *ip_dst, uint8_t plen, bool local, - const char output_bridge[], const struct in6_addr *gw); + const char output_bridge[], const struct in6_addr *gw, + const struct in6_addr *prefsrc); void ovs_router_flush(void); void ovs_router_disable_system_routing_table(void); diff --git a/lib/route-table.c b/lib/route-table.c index ac82cf262f86..9927dcc1854b 100644 --- a/lib/route-table.c +++ b/lib/route-table.c @@ -51,6 +51,7 @@ struct route_data { /* Extracted from Netlink attributes. */ struct in6_addr rta_dst; /* 0 if missing. */ + struct in6_addr rta_prefsrc; /* 0 if missing. */ struct in6_addr rta_gw; char ifname[IFNAMSIZ]; /* Interface name. */ uint32_t mark; @@ -201,6 +202,7 @@ route_table_parse(struct ofpbuf *buf, struct route_table_msg *change) [RTA_OIF] = { .type = NL_A_U32, .optional = true }, [RTA_GATEWAY] = { .type = NL_A_U32, .optional = true }, [RTA_MARK] = { .type = NL_A_U32, .optional = true }, + [RTA_PREFSRC] = { .type = NL_A_U32, .optional = true }, }; static const struct nl_policy policy6[] = { @@ -208,6 +210,7 @@ route_table_parse(struct ofpbuf *buf, struct route_table_msg *change) [RTA_OIF] = { .type = NL_A_U32, .optional = true }, [RTA_MARK] = { .type = NL_A_U32, .optional = true }, [RTA_GATEWAY] = { .type = NL_A_IPV6, .optional = true }, + [RTA_PREFSRC] = { .type = NL_A_IPV6, .optional = true }, }; struct nlattr *attrs[ARRAY_SIZE(policy)]; @@ -274,6 +277,16 @@ route_table_parse(struct ofpbuf *buf, struct route_table_msg *change) } else if (ipv4) { in6_addr_set_mapped_ipv4(&change->rd.rta_dst, 0); } + if (attrs[RTA_PREFSRC]) { + if (ipv4) { + ovs_be32 prefsrc; + prefsrc = nl_attr_get_be32(attrs[RTA_PREFSRC]); + in6_addr_set_mapped_ipv4(&change->rd.rta_prefsrc, prefsrc); + } else { + change->rd.rta_prefsrc = + nl_attr_get_in6_addr(attrs[RTA_PREFSRC]); + } + } if (attrs[RTA_GATEWAY]) { if (ipv4) { ovs_be32 gw; @@ -309,7 +322,8 @@ route_table_handle_msg(const struct route_table_msg *change) const struct route_data *rd = &change->rd; ovs_router_insert(rd->mark, &rd->rta_dst, rd->rtm_dst_len, - rd->local, rd->ifname, &rd->rta_gw); + rd->local, rd->ifname, &rd->rta_gw, + &rd->rta_prefsrc); } } diff --git a/tests/system-route.at b/tests/system-route.at index 270956d13f6f..114aaebc77f3 100644 --- a/tests/system-route.at +++ b/tests/system-route.at @@ -25,3 +25,42 @@ OVS_WAIT_UNTIL([test `ovs-appctl ovs/route/show | grep -c 'p1-route'` -eq 0 ]) OVS_TRAFFIC_VSWITCHD_STOP AT_CLEANUP + +AT_SETUP([ovs-route - add system route with src - ipv4]) +AT_KEYWORDS([route]) +OVS_TRAFFIC_VSWITCHD_START() +AT_CHECK([ip link set br0 up]) + +AT_CHECK([ip addr add 192.168.9.2/24 dev br0], [0], [stdout]) +AT_CHECK([ip addr add 192.168.9.3/24 dev br0], [0], [stdout]) + +AT_CHECK([ip route add 192.168.10.12/32 dev br0 via 192.168.9.1 src 192.168.9.2], [0], [stdout]) +AT_CHECK([ip route add 192.168.10.13/32 dev br0 via 192.168.9.1 src 192.168.9.3], [0], [stdout]) + +OVS_WAIT_UNTIL_EQUAL([ovs-appctl ovs/route/show | grep -E '192.168.10.1[[23]]/32' | sort], [dnl +Cached: 192.168.10.12/32 dev br0 GW 192.168.9.1 SRC 192.168.9.2 +Cached: 192.168.10.13/32 dev br0 GW 192.168.9.1 SRC 192.168.9.3]) + +OVS_TRAFFIC_VSWITCHD_STOP +AT_CLEANUP + +AT_SETUP([ovs-route - add system route with src - ipv6]) +AT_KEYWORDS([route]) +OVS_TRAFFIC_VSWITCHD_START() +AT_CHECK([ip link set br0 up]) + +AT_CHECK([ip -6 addr add fc00:db8:cafe::2/64 dev br0], [0], [stdout]) +AT_CHECK([ip -6 addr add fc00:db8:cafe::3/64 dev br0], [0], [stdout]) + +dnl If we try to add a route immediately after assigning ipv6 addresses, +dnl iproute2 would give us "Invalid source address" error, +dnl so wait a while to succeed. +OVS_WAIT_UNTIL([ip -6 route add fc00:db8:beef::12/128 via fc00:db8:cafe::1 dev br0 src fc00:db8:cafe::3]) +OVS_WAIT_UNTIL([ip -6 route add fc00:db8:beef::13/128 via fc00:db8:cafe::1 dev br0 src fc00:db8:cafe::2]) + +OVS_WAIT_UNTIL_EQUAL([ovs-appctl ovs/route/show | grep -E 'fc00:db8:beef::1[[23]]/128' | sort], [dnl +Cached: fc00:db8:beef::12/128 dev br0 GW fc00:db8:cafe::1 SRC fc00:db8:cafe::3 +Cached: fc00:db8:beef::13/128 dev br0 GW fc00:db8:cafe::1 SRC fc00:db8:cafe::2]) + +OVS_TRAFFIC_VSWITCHD_STOP +AT_CLEANUP