summaryrefslogtreecommitdiff
path: root/ofproto
diff options
context:
space:
mode:
authorWilliam Tu <u9012063@gmail.com>2018-05-15 16:10:48 -0400
committerBen Pfaff <blp@ovn.org>2018-05-21 20:33:30 -0700
commit7dc18ae96d33813a68367e72da5edbdd95d1a35a (patch)
tree95e43e27a4162c816fb483057367414db6a55885 /ofproto
parent0ffff4975308369d9beeeb8fb24e05a19aa155bd (diff)
downloadopenvswitch-7dc18ae96d33813a68367e72da5edbdd95d1a35a.tar.gz
userspace: add erspan tunnel support.
ERSPAN is a tunneling protocol based on GRE tunnel. The patch add erspan tunnel support for ovs-vswitchd with userspace datapath. Configuring erspan tunnel is similar to gre tunnel, but with additional erspan's parameters. Matching a flow on erspan's metadata is also supported, see ovs-fields for more details. Signed-off-by: William Tu <u9012063@gmail.com> Signed-off-by: Greg Rose <gvrose8192@gmail.com> Signed-off-by: Ben Pfaff <blp@ovn.org>
Diffstat (limited to 'ofproto')
-rw-r--r--ofproto/ofproto-dpif-rid.h2
-rw-r--r--ofproto/ofproto-dpif-xlate.c2
-rw-r--r--ofproto/tunnel.c13
3 files changed, 15 insertions, 2 deletions
diff --git a/ofproto/ofproto-dpif-rid.h b/ofproto/ofproto-dpif-rid.h
index 441584af8..ab5b87a05 100644
--- a/ofproto/ofproto-dpif-rid.h
+++ b/ofproto/ofproto-dpif-rid.h
@@ -99,7 +99,7 @@ struct rule;
/* Metadata for restoring pipeline context after recirculation. Helpers
* are inlined below to keep them together with the definition for easier
* updates. */
-BUILD_ASSERT_DECL(FLOW_WC_SEQ == 40);
+BUILD_ASSERT_DECL(FLOW_WC_SEQ == 41);
struct frozen_metadata {
/* Metadata in struct flow. */
diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c
index ddb834926..c7c9df501 100644
--- a/ofproto/ofproto-dpif-xlate.c
+++ b/ofproto/ofproto-dpif-xlate.c
@@ -3917,7 +3917,7 @@ compose_output_action__(struct xlate_ctx *ctx, ofp_port_t ofp_port,
/* If 'struct flow' gets additional metadata, we'll need to zero it out
* before traversing a patch port. */
- BUILD_ASSERT_DECL(FLOW_WC_SEQ == 40);
+ BUILD_ASSERT_DECL(FLOW_WC_SEQ == 41);
memset(&flow_tnl, 0, sizeof flow_tnl);
if (!check_output_prerequisites(ctx, xport, flow, check_stp)) {
diff --git a/ofproto/tunnel.c b/ofproto/tunnel.c
index a040b547e..2fd6ffbd7 100644
--- a/ofproto/tunnel.c
+++ b/ofproto/tunnel.c
@@ -474,6 +474,19 @@ tnl_port_send(const struct ofport_dpif *ofport, struct flow *flow,
wc->masks.pkt_mark = UINT32_MAX;
}
+ if (cfg->erspan_ver) {
+ flow->tunnel.erspan_ver = cfg->erspan_ver;
+ }
+ if (cfg->erspan_idx) {
+ flow->tunnel.erspan_idx = cfg->erspan_idx;
+ }
+ if (cfg->erspan_dir) {
+ flow->tunnel.erspan_dir = cfg->erspan_dir;
+ }
+ if (cfg->erspan_hwid) {
+ flow->tunnel.erspan_hwid = cfg->erspan_hwid;
+ }
+
if (pre_flow_str) {
char *post_flow_str = flow_to_string(flow, NULL);
char *tnl_str = tnl_port_to_string(tnl_port);