From patchwork Tue May 16 05:33:36 2023
Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Patchwork-Submitter: Nobuhiro MIKI
X-Patchwork-Id: 1781783
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::136; helo=smtp3.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=selector1 header.b=EJvOe1Hh;
dkim-atps=neutral
Received: from smtp3.osuosl.org (smtp3.osuosl.org [IPv6:2605:bc80:3010::136])
(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 4QL4fr5Mtkz20dX
for ; Tue, 16 May 2023 15:34:12 +1000 (AEST)
Received: from localhost (localhost [127.0.0.1])
by smtp3.osuosl.org (Postfix) with ESMTP id 5A0506122E;
Tue, 16 May 2023 05:34:10 +0000 (UTC)
DKIM-Filter: OpenDKIM Filter v2.11.0 smtp3.osuosl.org 5A0506122E
Authentication-Results: smtp3.osuosl.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=selector1 header.b=EJvOe1Hh
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 0Ob9vP9uXJSI; Tue, 16 May 2023 05:34:08 +0000 (UTC)
Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56])
by smtp3.osuosl.org (Postfix) with ESMTPS id 2552360BAB;
Tue, 16 May 2023 05:34:07 +0000 (UTC)
DKIM-Filter: OpenDKIM Filter v2.11.0 smtp3.osuosl.org 2552360BAB
Received: from lf-lists.osuosl.org (localhost [127.0.0.1])
by lists.linuxfoundation.org (Postfix) with ESMTP id 60948C008B;
Tue, 16 May 2023 05:34:06 +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 8C9F6C0037
for ; Tue, 16 May 2023 05:34:04 +0000 (UTC)
Received: from localhost (localhost [127.0.0.1])
by smtp3.osuosl.org (Postfix) with ESMTP id 8995C60F16
for ; Tue, 16 May 2023 05:34:03 +0000 (UTC)
DKIM-Filter: OpenDKIM Filter v2.11.0 smtp3.osuosl.org 8995C60F16
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 2p-p6aMNXNTg for ;
Tue, 16 May 2023 05:34:00 +0000 (UTC)
X-Greylist: from auto-whitelisted by SQLgrey-1.8.0
DKIM-Filter: OpenDKIM Filter v2.11.0 smtp3.osuosl.org 743FD60BAB
Received: from corp-ob09.yahoo-corp.jp (corp-ob09.yahoo-corp.jp
[182.22.125.216])
by smtp3.osuosl.org (Postfix) with ESMTPS id 743FD60BAB
for ; Tue, 16 May 2023 05:33:59 +0000 (UTC)
Received: from JPN01-TYC-obe.outbound.protection.outlook.com
(mail-tycjpn01lp2169.outbound.protection.outlook.com [104.47.23.169])
by corp-ob09.yahoo-corp.jp (Postfix) with ESMTPS id 3608419FB187
for ; Tue, 16 May 2023 14:33:57 +0900 (JST)
ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none;
b=MeQPRzEIHTkVTNvaDQUFdIdQgXT9z4s4FN/AsZCl7q3deK8je6FqiDX4x0GIeT+G2lu7wAJoMeyZFlkZT+nBE5twE1KE4zy6xKJ/dU6hDtI5mFiL+eJUZURYaLmJFmJWikPWFtxi9oNsppe/KOMGsKv4I4ggPIrA/ZRQ648hhRScKRwYuqhH81Wpo/wJdlXvYjP+VgXoyuuzopRdffGKqEByJZurFCj30CPkA2Pd0HZKsYsUElcDYYawdFGWeJtsZoIMy3/dqoTw+kmrgytIOfsG0FKsyEnuVRQC3j+rWLHUzcERk1Sy2QoHY7tBt3jCysQuABssjWvY6Zzimahl3Q==
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=+zDfTfhwV54SGUD3xT0lB3DJZxZ+exNcaKADGTLUi0c=;
b=Dsj/gVqq9mneLrFjZFEdLxJ2mO08+wOBZKMMztpNEZFLzS4ulvhM9Xct2I3KQecROAqFEb17QFhQhM1rELJ9qzfkFea62obl0ypYh2NojFWdGbeh4f28F/RmcfvNFyf16BAgGA6sA+p/g3LTC4M9FsBZfxmP8PLo1fn07EhycHcyKYE774HEAZKoeH7BX4hZi69kAw2XGI6aKe2p/G/eskunj01LeowjvYv8RqyzAlbYlFAk+96bEkJ6Z/jFw4/vel02dt88hufJYbuCuZYdKFsQ1owmKZZUAioitEYv4A186ZDdBaOEVbbkoeQR9t6vy7fjJReGvHAC//cIWzVyRw==
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=yahoo-corp.jp;
s=selector1;
h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;
bh=+zDfTfhwV54SGUD3xT0lB3DJZxZ+exNcaKADGTLUi0c=;
b=EJvOe1Hh9WNRglfnVeRd3ttiQcePdVYd3C8cP5bt8wRq5+vbNbOY9gOGR2CHRf7fjObkNuHoWBxNiKruBoU6OJ3gVB7EImgCGbWRCK+EKThNdV54HH1m4jJIcNADRnExopTaad+Qhe9vRj0MWMjQtCKCf8YAdp2Ceaw7Pd8II7U=
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 TYWPR01MB11940.jpnprd01.prod.outlook.com (2603:1096:400:3fd::8)
with Microsoft SMTP Server (version=TLS1_2,
cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6387.32; Tue, 16 May
2023 05:33:55 +0000
Received: from TY2PR01MB4107.jpnprd01.prod.outlook.com
([fe80::6e16:2bc5:f889:3826]) by TY2PR01MB4107.jpnprd01.prod.outlook.com
([fe80::6e16:2bc5:f889:3826%4]) with mapi id 15.20.6387.030; Tue, 16 May 2023
05:33:55 +0000
From: Nobuhiro MIKI
To: dev@openvswitch.org
Date: Tue, 16 May 2023 14:33:36 +0900
Message-Id: <20230516053336.27303-3-nmiki@yahoo-corp.jp>
X-Mailer: git-send-email 2.38.1
In-Reply-To: <20230516053336.27303-1-nmiki@yahoo-corp.jp>
References: <20230516053336.27303-1-nmiki@yahoo-corp.jp>
X-ClientProxiedBy: TYCP286CA0120.JPNP286.PROD.OUTLOOK.COM
(2603:1096:400:29c::20) To TY2PR01MB4107.jpnprd01.prod.outlook.com
(2603:1096:404:d8::23)
MIME-Version: 1.0
X-MS-PublicTrafficType: Email
X-MS-TrafficTypeDiagnostic: TY2PR01MB4107:EE_|TYWPR01MB11940:EE_
X-MS-Office365-Filtering-Correlation-Id: 2bc57130-1ca3-450d-c3dc-08db55cf2439
X-MS-Exchange-SenderADCheck: 1
X-MS-Exchange-AntiSpam-Relay: 0
X-Microsoft-Antispam: BCL:0;
X-Microsoft-Antispam-Message-Info:
wg+yyyqf3zGkL/jDbKV+AZ8U6dBgkSESxsjrIyq+HR0bO9nAni/BN78JloGMp2oBAAesR+VEEYNM2m0WQMcKY1cP7nbOcJmA+dBZmkxRfPK34woklooBSeMSCRVKw2ZHG1/hNjzE1q5BOsHIdJSWPm0drwcF8xRttLaLb5QYqCBMfChulw1aQygZNYtzRYvQjdRvOMWRlpqom8N4xQw9Lq4qzwYF2osMe+jVHjB9EV76dIT355uN5xU48IExOedcyRke3pFgu1sVPF8avXWqA3chWxe7Dpi7c4yN4eMZ4VEnQ5Q/y1KaYIVmemhT0bJy1W0b2OU/lOLnc6azlEzRNa67Q06qo7oQUOdeEsI2/90g0WgDgQpI5+KJcTVnlBdO9+k38C8/mVTG4wrJi8+ZE7MJCEFLBDcldI8uUtossRM10ZaxlEPpGZbowOQzEkRIEctAISiga8+GvHJoAJx/7G407Ibz3BPg+V1GEjboJGIqRtXAJZFfpl5Q3s+RdNAnxNMIcWEbhJRnOLbgHYtVkozblIIfmk1TN+cGzhROfW7Me2aCjh2mPvZiyYAmQoeU8HuGXjjksiX7wKvTjQ3V+cy+2YnsDCAmCVjiamOIlFw=
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:(13230028)(4636009)(39860400002)(136003)(376002)(396003)(346002)(366004)(451199021)(6666004)(52116002)(966005)(6486002)(83380400001)(107886003)(26005)(1076003)(186003)(6512007)(36756003)(2616005)(6506007)(86362001)(38100700002)(82960400001)(38350700002)(8676002)(8936002)(5660300002)(66946007)(66556008)(66476007)(41300700001)(30864003)(6916009)(4326008)(2906002)(316002)(478600001);
DIR:OUT; SFP:1102;
X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1
X-MS-Exchange-AntiSpam-MessageData-0:
NDLSw8oq8C+Nm9DPTEhnjSYUttbAUOk9o1PkLgg/qykPfkvsuL0b0rLrPF5QyEIAzbmvOi6DSY5wB+YjXcSmuwqSeIQ6eNSaXcKtkGmUj2/AorLJ3GVQMZxzLpra+7QNxLpXPYllvxkuzqg/8Lhv0V6ljmjxRMX0v0kh7P8u0bOTpGgMMtVKX9P4GVeATIRMIiNnlElFAVCjo3YByOkvqdocImiPdoVQno0l9nErcBwqbsmzQ59qwPIl2G8ik8qaw2/bh3qgT7XsurTbIfosopUqj35UCLJ31QQuLT/emHb2kZgw8OH0YmQbIfGTiQJgUnXXZRgCNccMTMCPVCkTVyIV7VaBMhfyttdirbcu5guegmARa4IetdP8QQJcgF/v7XESE2IwGO9TtaUDxByd0qGqaPRS7Dum1/lyiU+xiahyRMxGVZCuddirY8xhiP+qRnYQ9OdrMM65fHDmRh2LXv/dKrN7Yf6pJ8MKeqNtkYuZ3qF628Fo2e2AStyKGRNCdOxOs1O8N3km/3bYMEKk+j0Q9gXduQj2CKgKbNO+hlTjWKrIaf+MzTAhRlQnJki0VGQQkGcFgnVxgtYalQAa23ghMWpNy9Q6P6I9NG7GmWAQQLm6+trviB3OJV4f+10NtJn+Ke75z2AuG8C9l21BH44jpFfO7meqMq2utyZ+Tk7p5hC1Phgg1FCDI9bmAE1S9rHHd9C55vDcPjNmhJJOmHPVwKEtKc2pq6409iQf8VNn6qYxOQbBbHCHH3YLy8WsXEe3T/aC7PIgiPXlfKV/cFRTV/cM5bIiPLmEhHy5prxoyaiI5AJyr8Rt6dUgJ9jbIwIlFKWebwnEYHn3gck4iQAqVUD+FojOMPMvQ5JCGhv7ps9meFnYU+0IUR7Bd/ArzRQ9bisHtAZ2W4gW3/DddnjFhu4r1ep7ITgbjD/3zlcEKXJlkFtQ3h1/g9uD/4XaMQShhsNRlqCmG3vzurxneaL0n7j0p/JmdQ7C9EPsSbU9TNC00XJDS9LG1MpJgs21Tt8tKwqKnE7EF2lLerVDTJReOrFCSP74QE95sfTCOEQPAQxZka4KuP7fx0IqxM5dg9SbsbkyTcfI/nv6rFtAbYI1QwWlo8y+xzNQoV/3LdgcQ08GVkFa3gF+HIWDsWldGY3P+Ne0PzW12n2rwZluo0KH+wp8ZPlB/HXkQrrFlenn9vWJLw0MnkNvL6nIAvWOybq+h1c4yqDeuoowaFWUl7CDgqLX6+uE47gmpqvqNMKZlS8rkD31KpRqK10yiOY+nuwwXHXdKoJ8lfs0nPthWfZPCEm7fhtNlJ4gBCFeVKYd65xUQ7PfhVRyax1TOTjGdqcYkdtKs68PrW0JqZqdFlS/y6+Wk1AE0EYpPtEBPH8OmYVC1KnV7Fj0mK8L4H3wEVJnaQgZ+LQf1tP5zcvXOI9rVneqpXfAYRGSpeIoQTPuZ1f6cLcLim07AgH0Oqx7Np1lD6C0f1H0YuHFXfmYrU/X8ya72TT5OSKA+JoX1qZcDPzcM+/TQO/RszMxuN/sFAvqrLwjRwwXD/0gidVH37H3/5noOXPIUJuQ4Mx0PfyDvK9F/ce2e/cz9mJIpkzh
X-OriginatorOrg: yahoo-corp.jp
X-MS-Exchange-CrossTenant-Network-Message-Id:
2bc57130-1ca3-450d-c3dc-08db55cf2439
X-MS-Exchange-CrossTenant-AuthSource: TY2PR01MB4107.jpnprd01.prod.outlook.com
X-MS-Exchange-CrossTenant-AuthAs: Internal
X-MS-Exchange-CrossTenant-OriginalArrivalTime: 16 May 2023 05:33:55.8924 (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:
CsuY91BivVfpmvNVOklFQFp+vMM12IE+RsBe8P8CtUiEgE5E/COkyHcGtVRBDbDv4ujmrYb85u5kPzNsEWajhA==
X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYWPR01MB11940
Subject: [ovs-dev] [PATCH v4 2/2] userspace: Add new option srv6_flowlabel
in SRv6 tunnel.
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"
It supports flowlabel based load balancing by controlling the flowlabel
of outer IPv6 header, which is already implemented in Linux kernel as
seg6_flowlabel sysctl [1].
[1]: https://docs.kernel.org/networking/seg6-sysctl.html
Signed-off-by: Nobuhiro MIKI
---
include/linux/openvswitch.h | 3 +-
lib/netdev-native-tnl.c | 23 ++++++++++-
lib/netdev-vport.c | 8 ++++
lib/netdev.h | 12 ++++++
tests/tunnel-push-pop-ipv6.at | 72 +++++++++++++++++++++++++++++++++++
vswitchd/vswitch.xml | 26 +++++++++++++
6 files changed, 141 insertions(+), 3 deletions(-)
diff --git a/include/linux/openvswitch.h b/include/linux/openvswitch.h
index e305c331516b..278829cfa826 100644
--- a/include/linux/openvswitch.h
+++ b/include/linux/openvswitch.h
@@ -855,7 +855,8 @@ struct ovs_action_push_tnl {
odp_port_t tnl_port;
odp_port_t out_port;
uint32_t header_len;
- uint32_t tnl_type; /* For logging. */
+ uint32_t tnl_type; /* For logging. */
+ uint32_t srv6_flowlabel; /* Only for SRv6. */
uint32_t header[TNL_PUSH_HEADER_SIZE / 4];
};
#endif
diff --git a/lib/netdev-native-tnl.c b/lib/netdev-native-tnl.c
index db1c4c6d9bfc..796169fe43ac 100644
--- a/lib/netdev-native-tnl.c
+++ b/lib/netdev-native-tnl.c
@@ -910,6 +910,7 @@ netdev_srv6_build_header(const struct netdev *netdev,
}
data->header_len += sizeof *srh + 8 * srh->rt_hdr.hdrlen;
+ data->srv6_flowlabel = tnl_cfg->srv6_flowlabel;
data->tnl_type = OVS_VPORT_TYPE_SRV6;
out:
ovs_mutex_unlock(&dev->mutex);
@@ -922,10 +923,28 @@ netdev_srv6_push_header(const struct netdev *netdev OVS_UNUSED,
struct dp_packet *packet,
const struct ovs_action_push_tnl *data)
{
+ struct ovs_16aligned_ip6_hdr *ip6 = dp_packet_l3(packet);
+ ovs_be32 ipv6_label = 0;
int ip_tot_size;
+ uint32_t flow;
- netdev_tnl_push_ip_header(packet, data->header, data->header_len,
- &ip_tot_size, 0);
+ switch (data->srv6_flowlabel) {
+ case SRV6_FLOWLABEL_COPY:
+ flow = ntohl(get_16aligned_be32(&ip6->ip6_flow));
+ ipv6_label = (flow >> 28) == 6 ? htonl(flow & IPV6_LABEL_MASK) : 0;
+ break;
+
+ case SRV6_FLOWLABEL_ZERO:
+ ipv6_label = 0;
+ break;
+
+ case SRV6_FLOWLABEL_COMPUTE:
+ ipv6_label = htonl(dp_packet_get_rss_hash(packet) & IPV6_LABEL_MASK);
+ break;
+ }
+
+ netdev_tnl_push_ip_header(packet, data->header,
+ data->header_len, &ip_tot_size, ipv6_label);
}
struct dp_packet *
diff --git a/lib/netdev-vport.c b/lib/netdev-vport.c
index 663ee8606c3b..2141621cf23e 100644
--- a/lib/netdev-vport.c
+++ b/lib/netdev-vport.c
@@ -792,6 +792,14 @@ set_tunnel_config(struct netdev *dev_, const struct smap *args, char **errp)
name, node->value);
break;
}
+ } else if (!strcmp(node->key, "srv6_flowlabel")) {
+ if (!strcmp(node->value, "zero")) {
+ tnl_cfg.srv6_flowlabel = SRV6_FLOWLABEL_ZERO;
+ } else if (!strcmp(node->value, "compute")) {
+ tnl_cfg.srv6_flowlabel = SRV6_FLOWLABEL_COMPUTE;
+ } else {
+ tnl_cfg.srv6_flowlabel = SRV6_FLOWLABEL_COPY;
+ }
} else if (!strcmp(node->key, "payload_type")) {
if (!strcmp(node->value, "mpls")) {
tnl_cfg.payload_ethertype = htons(ETH_TYPE_MPLS);
diff --git a/lib/netdev.h b/lib/netdev.h
index ff207f56c28c..58a438c8347c 100644
--- a/lib/netdev.h
+++ b/lib/netdev.h
@@ -97,6 +97,17 @@ enum netdev_pt_mode {
NETDEV_PT_LEGACY_L3,
};
+enum netdev_srv6_flowlabel {
+ /* Copy the flowlabel from inner packet. */
+ SRV6_FLOWLABEL_COPY,
+
+ /* Simply set flowlabel to 0. */
+ SRV6_FLOWLABEL_ZERO,
+
+ /* Set RSS hash of inner pakcet to flowlabel. */
+ SRV6_FLOWLABEL_COMPUTE,
+};
+
/* Configuration specific to tunnels. */
struct netdev_tunnel_config {
ovs_be64 in_key;
@@ -144,6 +155,7 @@ struct netdev_tunnel_config {
uint8_t srv6_num_segs;
#define SRV6_MAX_SEGS 6
struct in6_addr srv6_segs[SRV6_MAX_SEGS];
+ enum netdev_srv6_flowlabel srv6_flowlabel;
};
void netdev_run(void);
diff --git a/tests/tunnel-push-pop-ipv6.at b/tests/tunnel-push-pop-ipv6.at
index e300fe3a0d26..35d56593d37d 100644
--- a/tests/tunnel-push-pop-ipv6.at
+++ b/tests/tunnel-push-pop-ipv6.at
@@ -1,5 +1,77 @@
AT_BANNER([tunnel_push_pop_ipv6])
+AT_SETUP([tunnel_push_pop_ipv6 - srv6])
+
+OVS_VSWITCHD_START([add-port br0 p0 -- set Interface p0 type=dummy ofport_request=1 other-config:hwaddr=aa:55:aa:55:00:00 options:pcap=p0.pcap])
+AT_CHECK([ovs-vsctl add-br int-br1 -- set bridge int-br1 datapath_type=dummy], [0])
+AT_CHECK([ovs-vsctl add-br int-br2 -- set bridge int-br2 datapath_type=dummy], [0])
+AT_CHECK([ovs-vsctl add-br int-br3 -- set bridge int-br3 datapath_type=dummy], [0])
+AT_CHECK([ovs-vsctl add-port int-br1 t1 -- set Interface t1 type=srv6 \
+ options:remote_ip=2001:cafe::91 ofport_request=2 \
+ options:srv6_flowlabel=copy \
+ ], [0])
+AT_CHECK([ovs-vsctl add-port int-br2 t2 -- set Interface t2 type=srv6 \
+ options:remote_ip=2001:cafe::92 ofport_request=3 \
+ options:srv6_flowlabel=zero \
+ ], [0])
+AT_CHECK([ovs-vsctl add-port int-br3 t3 -- set Interface t3 type=srv6 \
+ options:remote_ip=2001:cafe::93 ofport_request=4 \
+ options:srv6_flowlabel=compute \
+ ], [0])
+
+dnl First setup dummy interface IP address, then add the route
+dnl so that tnl-port table can get valid IP address for the device.
+AT_CHECK([ovs-appctl netdev-dummy/ip6addr br0 2001:cafe::88/24], [0], [OK
+])
+AT_CHECK([ovs-appctl ovs/route/add 2001:cafe::0/24 br0], [0], [OK
+])
+AT_CHECK([ovs-appctl tnl/neigh/set br0 2001:cafe::91 aa:55:aa:55:00:01], [0], [OK
+])
+AT_CHECK([ovs-appctl tnl/neigh/set br0 2001:cafe::92 aa:55:aa:55:00:02], [0], [OK
+])
+AT_CHECK([ovs-appctl tnl/neigh/set br0 2001:cafe::93 aa:55:aa:55:00:03], [0], [OK
+])
+AT_CHECK([ovs-ofctl add-flow br0 action=1])
+AT_CHECK([ovs-ofctl add-flow int-br1 action=2])
+AT_CHECK([ovs-ofctl add-flow int-br2 action=3])
+AT_CHECK([ovs-ofctl add-flow int-br3 action=4])
+
+dnl Check "srv6_flowlabel=copy".
+AT_CHECK([ovs-appctl netdev-dummy/receive int-br1 'in_port(2),eth(src=f8:bc:12:44:34:b6,dst=aa:55:aa:55:00:00),eth_type(0x0800),ipv4(src=10.0.0.1,dst=10.0.0.2,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
+AT_CHECK([ovs-appctl netdev-dummy/receive int-br1 'in_port(2),eth(src=f8:bc:12:44:34:b6,dst=aa:55:aa:55:00:00),eth_type(0x0800),ipv4(src=10.0.0.1,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
+AT_CHECK([ovs-appctl netdev-dummy/receive int-br1 'in_port(2),eth(src=f8:bc:12:44:34:b6,dst=aa:55:aa:55:00:00),eth_type(0x86dd),ipv6(src=2001:beef::1,dst=2001:beef::2,label=2,proto=47,tclass=0x0,hlimit=64)'])
+AT_CHECK([ovs-appctl netdev-dummy/receive int-br1 'in_port(2),eth(src=f8:bc:12:44:34:b6,dst=aa:55:aa:55:00:00),eth_type(0x86dd),ipv6(src=2001:beef::1,dst=2001:beef::3,label=3,proto=47,tclass=0x0,hlimit=64)'])
+AT_CHECK([ovs-ofctl parse-pcap p0.pcap | tail -n 4 | grep -o 'ipv6_label=0x[[0-9a-f]]*'], [0], [dnl
+ipv6_label=0x00000
+ipv6_label=0x00000
+ipv6_label=0x00002
+ipv6_label=0x00003
+])
+
+dnl Check "srv6_flowlabel=zero".
+AT_CHECK([ovs-appctl netdev-dummy/receive int-br2 'in_port(3),eth(src=f8:bc:12:44:34:b6,dst=aa:55:aa:55:00:00),eth_type(0x0800),ipv4(src=10.0.0.1,dst=10.0.0.2,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
+AT_CHECK([ovs-appctl netdev-dummy/receive int-br2 'in_port(3),eth(src=f8:bc:12:44:34:b6,dst=aa:55:aa:55:00:00),eth_type(0x0800),ipv4(src=10.0.0.1,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
+AT_CHECK([ovs-appctl netdev-dummy/receive int-br2 'in_port(3),eth(src=f8:bc:12:44:34:b6,dst=aa:55:aa:55:00:00),eth_type(0x86dd),ipv6(src=2001:beef::1,dst=2001:beef::2,label=2,proto=47,tclass=0x0,hlimit=64)'])
+AT_CHECK([ovs-appctl netdev-dummy/receive int-br2 'in_port(3),eth(src=f8:bc:12:44:34:b6,dst=aa:55:aa:55:00:00),eth_type(0x86dd),ipv6(src=2001:beef::1,dst=2001:beef::3,label=3,proto=47,tclass=0x0,hlimit=64)'])
+AT_CHECK([ovs-ofctl parse-pcap p0.pcap | tail -n 4 | grep -o 'ipv6_label=0x[[0-9a-f]]*'], [0], [dnl
+ipv6_label=0x00000
+ipv6_label=0x00000
+ipv6_label=0x00000
+ipv6_label=0x00000
+])
+
+dnl dnl Check "srv6_flowlabel=compute".
+AT_CHECK([ovs-appctl netdev-dummy/receive int-br3 'in_port(4),eth(src=f8:bc:12:44:34:b6,dst=aa:55:aa:55:00:00),eth_type(0x0800),ipv4(src=10.0.0.1,dst=10.0.0.2,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
+AT_CHECK([ovs-appctl netdev-dummy/receive int-br3 'in_port(4),eth(src=f8:bc:12:44:34:b6,dst=aa:55:aa:55:00:00),eth_type(0x0800),ipv4(src=10.0.0.1,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)'])
+AT_CHECK([ovs-appctl netdev-dummy/receive int-br3 'in_port(4),eth(src=f8:bc:12:44:34:b6,dst=aa:55:aa:55:00:00),eth_type(0x86dd),ipv6(src=2001:beef::1,dst=2001:beef::2,label=2,proto=47,tclass=0x0,hlimit=64)'])
+AT_CHECK([ovs-appctl netdev-dummy/receive int-br3 'in_port(4),eth(src=f8:bc:12:44:34:b6,dst=aa:55:aa:55:00:00),eth_type(0x86dd),ipv6(src=2001:beef::1,dst=2001:beef::3,label=3,proto=47,tclass=0x0,hlimit=64)'])
+AT_CHECK([ovs-ofctl parse-pcap p0.pcap | tail -n 4 | grep -o 'ipv6_label=0x[[0-9a-f]]*'| sort | uniq -c | wc -l], [0], [dnl
+4
+])
+
+OVS_VSWITCHD_STOP
+AT_CLEANUP
+
AT_SETUP([tunnel_push_pop_ipv6 - ip6gre])
OVS_VSWITCHD_START([add-port br0 p0 -- set Interface p0 type=dummy ofport_request=1 other-config:hwaddr=aa:55:aa:55:00:00])
diff --git a/vswitchd/vswitch.xml b/vswitchd/vswitch.xml
index edb5eafa04c3..8bcc361e8c62 100644
--- a/vswitchd/vswitch.xml
+++ b/vswitchd/vswitch.xml
@@ -3287,6 +3287,32 @@
.
+
+
+ Optional.
+ This option controls how flowlabel in outer IPv6 header is
+ configured. It gives the benefit of IPv6 flow label based
+ load balancing, which is supported by some popular vendor
+ appliances. Like net.ipv6.seg6_flowlabel sysconfig, it is
+ one of the three values below:
+
+
+ -
+ By default, or if this option is
copy
, copy the
+ flowlabel of inner IPv6 header to the flowlabel of outer IPv6
+ header. If inner header is not IPv6, it is set to 0.
+
+ -
+ If this option is
zero
, simply set flowlabel to 0.
+
+ -
+ If this option is
compute
, set RSS hash of inner
+ packet to flowlabel.
+
+
+