From patchwork Mon May 13 22:11:12 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: William Tu X-Patchwork-Id: 1934830 X-Patchwork-Delegate: i.maximets@samsung.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=Nvidia.com header.i=@Nvidia.com header.a=rsa-sha256 header.s=selector2 header.b=fNS9Csb3; dkim-atps=neutral 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=patchwork.ozlabs.org) 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 (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4VdYcS6dLYz20d6 for ; Tue, 14 May 2024 08:11:52 +1000 (AEST) Received: from localhost (localhost [127.0.0.1]) by smtp2.osuosl.org (Postfix) with ESMTP id 52BF2415D6; Mon, 13 May 2024 22:11:51 +0000 (UTC) X-Virus-Scanned: amavis at osuosl.org Received: from smtp2.osuosl.org ([127.0.0.1]) by localhost (smtp2.osuosl.org [127.0.0.1]) (amavis, port 10024) with ESMTP id k1PKYfwrWeew; Mon, 13 May 2024 22:11:48 +0000 (UTC) X-Comment: SPF check N/A for local connections - client-ip=140.211.9.56; helo=lists.linuxfoundation.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver= DKIM-Filter: OpenDKIM Filter v2.11.0 smtp2.osuosl.org 85F7440B19 Authentication-Results: smtp2.osuosl.org; dkim=fail reason="signature verification failed" (2048-bit key, unprotected) header.d=Nvidia.com header.i=@Nvidia.com header.a=rsa-sha256 header.s=selector2 header.b=fNS9Csb3 Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by smtp2.osuosl.org (Postfix) with ESMTPS id 85F7440B19; Mon, 13 May 2024 22:11:48 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 57845C0072; Mon, 13 May 2024 22:11:48 +0000 (UTC) X-Original-To: ovs-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 6E8F2C0037 for ; Mon, 13 May 2024 22:11:47 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp3.osuosl.org (Postfix) with ESMTP id 4913D60816 for ; Mon, 13 May 2024 22:11:47 +0000 (UTC) X-Virus-Scanned: amavis at osuosl.org Received: from smtp3.osuosl.org ([127.0.0.1]) by localhost (smtp3.osuosl.org [127.0.0.1]) (amavis, port 10024) with ESMTP id KC4JA5kx0SLD for ; Mon, 13 May 2024 22:11:46 +0000 (UTC) Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=2a01:111:f403:2405::601; helo=nam02-dm3-obe.outbound.protection.outlook.com; envelope-from=witu@nvidia.com; receiver= DMARC-Filter: OpenDMARC Filter v1.4.2 smtp3.osuosl.org CF7E1607A2 Authentication-Results: smtp3.osuosl.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com DKIM-Filter: OpenDKIM Filter v2.11.0 smtp3.osuosl.org CF7E1607A2 Authentication-Results: smtp3.osuosl.org; dkim=pass (2048-bit key, unprotected) header.d=Nvidia.com header.i=@Nvidia.com header.a=rsa-sha256 header.s=selector2 header.b=fNS9Csb3 Received: from NAM02-DM3-obe.outbound.protection.outlook.com (mail-dm3nam02on20601.outbound.protection.outlook.com [IPv6:2a01:111:f403:2405::601]) by smtp3.osuosl.org (Postfix) with ESMTPS id CF7E1607A2 for ; Mon, 13 May 2024 22:11:45 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=RAWHXiJDIxnXBPQ2JxLHlGL7tILTSORvMV5AJqxHjANOXV9/v8jHneg/vk9j/rIqWH91NmG+ZJK8l/unP5m9DXrWX9FF7Oh1X+jL++VU09MzyBnQigpaUnjhjADPMlbCGuijtqX6ov6dPGkQ/gy7rjTPhExqYCmJ/e14rudtfamVP9LODOxv2BiIfZGcU1tCz3SkYcN/ncok2ujQ74NRTpZX8dLkn+L/KVrO4km0rySirYyqPXGgqe1B2luIAANXf7ZXjNWRYGW8b/zL4Uhj9B+rJMp3+sLydROKxmmdKMXMYWpBqzMKEKCVjGhtdA/xTizCzYYjoEk3wqerptmqcg== 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=ES6uHXSXgC6D0bh65fnVoyqBEfvnLRdY3N6YOi4/7eo=; b=DfNxH7aFkVbpqEqsj63cFExLu31tcxTQvcVhc2qHG9hc/C1KYTvjK6zGYe5/BhNS1uvREnVUIS5fmaJjWe9SMNIQd+9SLzQF68eYQp0QXz8g8ZJ/CmV6C8BMjEuXlT41DxUh3QOp1ASHOxEQykkzOl0xak7StWHSJtJjwX0c7V4TzuaXxfHcyNwgRxwgLwukVn3xuWtWFvIWmgW50nk3J/5hagk+00STI8SMdKX4/8xO2w+qj0bdsc4hbv4Bs6THCFpjh3oM9RgMRS7JrWP1uq2BlsZOxpEO9HJ9yZeNSZNlH/zJGeWFEycumUmYx8WLmzAbGvF4FUa04rlJ/TESAg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.118.233) smtp.rcpttodomain=openvswitch.org smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=ES6uHXSXgC6D0bh65fnVoyqBEfvnLRdY3N6YOi4/7eo=; b=fNS9Csb3EXqM4ozrcWo2iRde5wCeiFHkH55GmTDyuOvoLVfUTRtEG7vPB8MU8qLUexDRl/rCx4JreXbVp4vOShzPHzsMeVLEvAAtjCj7RYnJhc36G2NnlOzIGACZwYduyxnTltXXM22HVsKrsbhaysxmPbGhCauTPBdFtYlJQtJdL2uCcKPtIGG2G5EXYv9YammOFsmix2gs3vuQwDwRTgR8JGgBMFla8kPpfUofxeKG9HkTsOSY8iQ2e352sQU4XXH7WrO7tew3WUJiVOu+Ol3wWdD0CE7gE1OCyWeAdvja5zUhBUVNY257c6vAOd/rMTo1fKjWpI2/znwMLqRV/g== Received: from CH0PR03CA0450.namprd03.prod.outlook.com (2603:10b6:610:10e::28) by PH0PR12MB7009.namprd12.prod.outlook.com (2603:10b6:510:21c::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7544.55; Mon, 13 May 2024 22:11:41 +0000 Received: from DS3PEPF000099D9.namprd04.prod.outlook.com (2603:10b6:610:10e:cafe::a5) by CH0PR03CA0450.outlook.office365.com (2603:10b6:610:10e::28) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7544.55 via Frontend Transport; Mon, 13 May 2024 22:11:40 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.118.233) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.118.233 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.118.233; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.118.233) by DS3PEPF000099D9.mail.protection.outlook.com (10.167.17.10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7587.21 via Frontend Transport; Mon, 13 May 2024 22:11:40 +0000 Received: from drhqmail202.nvidia.com (10.126.190.181) by mail.nvidia.com (10.127.129.6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.4; Mon, 13 May 2024 15:11:22 -0700 Received: from drhqmail203.nvidia.com (10.126.190.182) by drhqmail202.nvidia.com (10.126.190.181) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.4; Mon, 13 May 2024 15:11:22 -0700 Received: from vdi.nvidia.com (10.127.8.10) by mail.nvidia.com (10.126.190.182) with Microsoft SMTP Server id 15.2.1544.4 via Frontend Transport; Mon, 13 May 2024 15:11:20 -0700 To: Date: Tue, 14 May 2024 01:11:12 +0300 Message-ID: <20240513221112.25753-1-witu@nvidia.com> X-Mailer: git-send-email 2.38.1 MIME-Version: 1.0 X-NV-OnPremToCloud: ExternallySecured X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS3PEPF000099D9:EE_|PH0PR12MB7009:EE_ X-MS-Office365-Filtering-Correlation-Id: 06cae17b-3c8e-4ea1-6cdb-08dc7399aa79 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230031|36860700004|376005|82310400017|1800799015; X-Microsoft-Antispam-Message-Info: 2kr7BnB84h6YHQ1AogHXwzAmf/fO+yHDB2Go9756GDNGZpppg5hJJLYhyRIY7PgdkFyVeX1QNUB0pd+yOw4gY3jsXt13KHgDyj0vw6dvf08Mte+0sa1jcbuLCUJ2vgJALwslDvLoslsYzZg3g5A2GDblg80PsKTSFBUo7HqnnnKTGlKnL2WGfYzmb2KdC0O476Q2EWIk1fpkozucmvYmZK+4/4040B3HdBVUgUUnu8JwAj518qLoHVBAhV6xicBGx9pUe8t5jSnOJTRoh30Z0dQMByy/mSbrmoe/41CpMuphMSzek0K9EbCtP1yDcmlxWZe8dpPOIodXoAMRn4t5VcJ+gcZfOzj1L+TmNP2vcFgv6dP/ahlXmIoC890btoU5/eQ1mL4lczPx/Zc76wPudHYM136ujIEZT6xNA7X0JfjovvbWILfmeS0x6xmBAZzOsw+EZJxtTqehIYHBJfAZNJqt80pkqFjk/NexHOvvuiDK3fV1LNXMRs8rvqDMgTmy9FXPp530G7zvab/b4vxHMOrqsfKf6wVH0KTY27AH2yRhYMIIUMknBkC5Kv230qcn8I0qWv2N4iCnJ1of3kyPRMLAmjckVQpu0xqJbaHtDJGfEgrejoMlvBozum9N0SwhqVEgCTrJm/upugswPOOxHc/EIO+/iM9sX4eYntzeB9TgFUj940em9ggmDFCqPzBUSR0obD8knATg/b3emU2J4Q5gN8Quue9UDXcy4eeVddNmTyUcqFGDgXKcgVuxk6nARNmHGAj8V7hio6A7XmhoD417N90F1hyk+UDXXCIxxcfI17oNXR+RxfZ3DPMETIrCDolmUkKZqRnPANP9GbWJ3Jjt/CqglFSXmK2EUiBKCMCoO45QaJnSerkYqhZGJUZbMxc+K97oq1TcDpgsGgYdYAoC64N4t1okAuN1Hh2EEnLpwDY4Use+Z+W5zCAVYce6qsXC2oFZcpZyXIbnbAaEiykDVsoLbvlzWh+jWZCJKnXfJ/J0fFvYtwBt4pevfWDLR/so8E8IlkciXsu1c+2ukBeAXG/GBdGgOLIQO+FTxmvRRY5Biu+twmXydPwvQDrYQ/PDk6+rUtrkC874U3Z6y8d0y1YL1wJnBnSoOBj7knEOeut4unU4Ma8QT0NzhrzWKpErhNB5ajc8J3CXWdVIurIR8ssollH+JKNSTM0FislWmlsjyepwu4PBlrlYRHthomi7SVU9Jag4ifjRFsNQ1tTNPTLZpuFwdHsI3e+MjFb//hR3m+p1fcrJQ53Kfh2QB7VIgCEt0XBHb8YJlwUfy+oCrnBXFZbeFdlETJ/zONG/LZmfzFdH+17Esro/khU+PBy8EkKiDvCtS9qEsfEbQZ12vs0X2HYwYQzaBMysuyz6/O3FFOn9PUtMkCLijzMC X-Forefront-Antispam-Report: CIP:216.228.118.233; CTRY:US; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:mail.nvidia.com; PTR:dc7edge2.nvidia.com; CAT:NONE; SFS:(13230031)(36860700004)(376005)(82310400017)(1800799015); DIR:OUT; SFP:1101; X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 13 May 2024 22:11:40.5636 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 06cae17b-3c8e-4ea1-6cdb-08dc7399aa79 X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a; Ip=[216.228.118.233]; Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: DS3PEPF000099D9.namprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH0PR12MB7009 Cc: i.maximets@ovn.org, derrick.lim@rakuten.com, bodong@nvidia.com, maord@nvidia.com Subject: [ovs-dev] [PATCH v3] route-table: Add support for v4 via v6 route. 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: , X-Patchwork-Original-From: William Tu via dev From: William Tu Reply-To: William Tu Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" Add route-table support for ipv4 dst via ipv6. One use case is BGP unnumbered, a mechanism that establishes peering sessions without the need to explicitly configure IPv4 addresses on the interfaces involved in the peering. Without using IPv4 address assignments, it uses link-local IPv6 addresses of the directly connected neighbors for peering purposes. For example, BGP might install the following route: $ ip route get 100.87.18.3 100.87.18.3 via inet6 fe80::920a:84ff:fe9e:9570 \ dev br-phy src 100.87.18.6 Note that the v6 addr fe80::920a:84ff:fe9e:9570 is not being used in the packet header, but only used for lookup the out dev br-phy. Currently OVS can only support either all-ipv4 or all-ipv6, the patch adds support for such use case. Reported-at: https://mail.openvswitch.org/pipermail/ovs-discuss/2024-January/052908.html Acked-by: Simon Horman Signed-off-by: William Tu --- v3: add vxlan test, remove rfc v2: fix CI error --- lib/ovs-router.c | 34 ++++++++++++++-------------- lib/route-table.c | 21 ++++++++++++++++++ tests/ovs-router.at | 33 +++++++++++++++++++++++++++ tests/system-route.at | 24 ++++++++++++++++++++ tests/tunnel-push-pop.at | 48 ++++++++++++++++++++++++++++++++++++++++ 5 files changed, 142 insertions(+), 18 deletions(-) diff --git a/lib/ovs-router.c b/lib/ovs-router.c index 3d84c9a30a8f..3ee927e6f7de 100644 --- a/lib/ovs-router.c +++ b/lib/ovs-router.c @@ -415,7 +415,6 @@ ovs_router_add(struct unixctl_conn *conn, int argc, unsigned int plen; ovs_be32 src = 0; ovs_be32 gw = 0; - bool is_ipv6; ovs_be32 ip; int err; int i; @@ -423,9 +422,8 @@ ovs_router_add(struct unixctl_conn *conn, int argc, if (scan_ipv4_route(argv[1], &ip, &plen)) { in6_addr_set_mapped_ipv4(&ip6, ip); plen += 96; - is_ipv6 = false; } else if (scan_ipv6_route(argv[1], &ip6, &plen)) { - is_ipv6 = true; + ; } else { unixctl_command_reply_error(conn, "Invalid 'ip/plen' parameter"); @@ -438,21 +436,21 @@ ovs_router_add(struct unixctl_conn *conn, int argc, 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; - } + if (ovs_scan(argv[i], "src="IPV6_SCAN_FMT, src6_s) && + ipv6_parse(src6_s, &src6)) { + continue; + } + + if (ipv6_parse(argv[i], &gw6)) { + continue; + } + + 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, diff --git a/lib/route-table.c b/lib/route-table.c index f1fe32714e8d..58412711888f 100644 --- a/lib/route-table.c +++ b/lib/route-table.c @@ -232,6 +232,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_VIA] = { .type = NL_A_UNSPEC, .optional = true }, [RTA_PREFSRC] = { .type = NL_A_U32, .optional = true }, [RTA_TABLE] = { .type = NL_A_U32, .optional = true }, }; @@ -241,6 +242,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_VIA] = { .type = NL_A_UNSPEC, .optional = true }, [RTA_PREFSRC] = { .type = NL_A_IPV6, .optional = true }, [RTA_TABLE] = { .type = NL_A_U32, .optional = true }, }; @@ -333,6 +335,25 @@ route_table_parse(struct ofpbuf *buf, struct route_table_msg *change) nl_attr_get_in6_addr(attrs[RTA_PREFSRC]); } } + if (attrs[RTA_VIA]) { + const struct rtvia *via; + ovs_be32 gw; + + via = nl_attr_get(attrs[RTA_VIA]); + switch (via->rtvia_family) { + case AF_INET: + gw = *(ALIGNED_CAST(ovs_be32 *, via->rtvia_addr)); + in6_addr_set_mapped_ipv4(&change->rd.rta_gw, gw); + break; + case AF_INET6: + change->rd.rta_gw = *(ALIGNED_CAST(struct in6_addr *, + via->rtvia_addr)); + break; + default: + VLOG_WARN("Unknown address family %d\n", via->rtvia_family); + return 0; + } + } if (attrs[RTA_GATEWAY]) { if (ipv4) { ovs_be32 gw; diff --git a/tests/ovs-router.at b/tests/ovs-router.at index b3314b3dff0d..f34dd3c99f5d 100644 --- a/tests/ovs-router.at +++ b/tests/ovs-router.at @@ -109,6 +109,39 @@ User: 2001:db8:beef::14/128 MARK 14 dev br0 GW 2001:db8:cafe::1 SRC 2001:db8:caf OVS_VSWITCHD_STOP AT_CLEANUP +AT_SETUP([appctl - route/add with ipv4 via ipv6]) +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 +]) + +# defualt pick the first IP, 192.168.9.2, as src +AT_CHECK([ovs-appctl ovs/route/add 192.168.9.10/32 br0 fe80::920a:84ff:beef:9510], [0], [OK +]) +AT_CHECK([ovs-appctl ovs/route/add 192.168.9.11/32 br0 fe80::920a:84ff:beef:9511 src=192.168.9.2], [0], [OK +]) +AT_CHECK([ovs-appctl ovs/route/add 192.168.9.12/32 br0 fe80::920a:84ff:beef:9512 src=192.168.9.3], [0], [OK +]) +AT_CHECK([ovs-appctl ovs/route/add 192.168.9.13/32 br0 fe80::920a:84ff:beef:9513 pkt_mark=13 src=192.168.9.3], [0], [OK +]) + +AT_CHECK([ovs-appctl ovs/route/show | grep User | grep beef | sort], [0], [dnl +User: 192.168.9.10/32 dev br0 GW fe80::920a:84ff:beef:9510 SRC 192.168.9.2 +User: 192.168.9.11/32 dev br0 GW fe80::920a:84ff:beef:9511 SRC 192.168.9.2 +User: 192.168.9.12/32 dev br0 GW fe80::920a:84ff:beef:9512 SRC 192.168.9.3 +User: 192.168.9.13/32 MARK 13 dev br0 GW fe80::920a:84ff:beef:9513 SRC 192.168.9.3 +]) + +# DST and SRC must be in the same subnet domain +AT_CHECK([ovs-appctl ovs/route/add 192.168.10.12/32 br0 fe80::920a:84ff:beef:9512 src=192.168.9.3], [2], [], [dnl +Error while inserting route. +ovs-appctl: ovs-vswitchd: server returned an error +]) +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]) diff --git a/tests/system-route.at b/tests/system-route.at index c0ecad6cfb49..fd698321b401 100644 --- a/tests/system-route.at +++ b/tests/system-route.at @@ -65,6 +65,30 @@ Cached: fc00:db8:beef::13/128 dev br0 GW fc00:db8:cafe::1 SRC fc00:db8:cafe::2]) OVS_TRAFFIC_VSWITCHD_STOP AT_CLEANUP +AT_SETUP([ovs-route - add system route ipv4 via ipv6]) +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 -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]) + +AT_CHECK([ip route add 192.168.9.12/32 dev br0 via inet6 fe80::920a:84ff:fe9e:9512 src 192.168.9.2], [0], [stdout]) +AT_CHECK([ip route add 192.168.9.13/32 dev br0 via inet6 fe80::920a:84ff:fe9e:9513 src 192.168.9.3], [0], [stdout]) + +OVS_WAIT_UNTIL_EQUAL([ovs-appctl ovs/route/show | grep -E '192.168.9.1[[23]]/32' | sort], [dnl +Cached: 192.168.9.12/32 dev br0 GW fe80::920a:84ff:fe9e:9512 SRC 192.168.9.2 +Cached: 192.168.9.13/32 dev br0 GW fe80::920a:84ff:fe9e:9513 SRC 192.168.9.3]) + +AT_CHECK([ovs-appctl ovs/route/add 192.168.9.14/32 br0 fe80::920a:84ff:fe9e:9514], [0], [OK +]) + +OVS_TRAFFIC_VSWITCHD_STOP +AT_CLEANUP + dnl Checks that OVS doesn't use routes from non-standard tables. AT_SETUP([ovs-route - route tables]) AT_KEYWORDS([route]) diff --git a/tests/tunnel-push-pop.at b/tests/tunnel-push-pop.at index 508737c53ec6..0c8f3862cce9 100644 --- a/tests/tunnel-push-pop.at +++ b/tests/tunnel-push-pop.at @@ -196,6 +196,54 @@ OVS_WAIT_UNTIL([test `ovs-pcap p0.pcap | grep 100022eb0000000120000237 | wc -l` OVS_VSWITCHD_STOP AT_CLEANUP +AT_SETUP([tunnel_push_pop - v4 via v6 route]) + +OVS_VSWITCHD_START([add-port br0 p0 -- set Interface p0 type=dummy ofport_request=1 other-config:hwaddr=aa:55:aa:55:00:00]) +AT_CHECK([ovs-vsctl add-br int-br -- set bridge int-br datapath_type=dummy], [0]) +AT_CHECK([ovs-vsctl add-port int-br t1 -- set Interface t1 type=vxlan \ + options:remote_ip=1.1.2.92 options:key=123 ofport_request=1\ + ], [0]) + +AT_CHECK([ovs-appctl dpif/show], [0], [dnl +dummy@ovs-dummy: hit:0 missed:0 + br0: + br0 65534/100: (dummy-internal) + p0 1/1: (dummy) + int-br: + int-br 65534/2: (dummy-internal) + t1 1/4789: (vxlan: key=123, remote_ip=1.1.2.92) +]) + +AT_CHECK([ovs-ofctl add-flow br0 action=normal]) + +dnl Setup dummy interface IP addresses. +AT_CHECK([ovs-appctl netdev-dummy/ip4addr br0 1.1.2.88/24], [0], [OK +]) +AT_CHECK([ovs-appctl netdev-dummy/ip6addr br0 2001:cafe::88/64], [0], [OK +]) +dnl Add a static v4 via v6 route +AT_CHECK([ovs-appctl ovs/route/add 1.1.2.92/32 br0 2001:cafe::10], [0], [OK +]) + +AT_CHECK([ovs-appctl ovs/route/show | grep br0 | sort], [0], [dnl +Cached: 1.1.2.0/24 dev br0 SRC 1.1.2.88 local +Cached: 2001:cafe::/64 dev br0 SRC 2001:cafe::88 local +User: 1.1.2.92/32 dev br0 GW 2001:cafe::10 SRC 1.1.2.88 +]) + +AT_CHECK([ovs-appctl tnl/neigh/set br0 1.1.2.92 f8:bc:12:44:34:c8], [0], [OK +]) + +dnl Check VXLAN tunnel push +AT_CHECK([ovs-ofctl add-flow int-br action=1]) +AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'in_port(2),eth(src=f8:bc:12:44:34:b6,dst=aa:55:aa:55:00:00),eth_type(0x0800),ipv4(src=1.1.3.88,dst=1.1.3.112,proto=47,tos=0,ttl=64,frag=no)'], [0], [stdout]) +AT_CHECK([tail -1 stdout], [0], + [Datapath actions: tnl_push(tnl_port(4789),header(size=50,type=4,eth(dst=f8:bc:12:44:34:c8,src=aa:55:aa:55:00:00,dl_type=0x0800),ipv4(src=1.1.2.88,dst=1.1.2.92,proto=17,tos=0,ttl=64,frag=0x4000),udp(src=0,dst=4789,csum=0x0),vxlan(flags=0x8000000,vni=0x7b)),out_port(100)),1 +]) + +OVS_VSWITCHD_STOP +AT_CLEANUP + AT_SETUP([tunnel_push_pop - action]) OVS_VSWITCHD_START([add-port br0 p0 -- set Interface p0 type=dummy ofport_request=1 other-config:hwaddr=aa:55:aa:55:00:00])