diff options
author | Eli Britstein <elibr@mellanox.com> | 2019-05-12 05:51:00 +0000 |
---|---|---|
committer | Ben Pfaff <blp@ovn.org> | 2019-05-24 11:22:10 -0700 |
commit | ffbe41dbcb4882aafdf80d86afa1906b2a00199e (patch) | |
tree | 36afd692f9017406ca83f1cfd702e0adab1af9f0 | |
parent | 88f52d7fabb0d22296223b97d51747f696c87d45 (diff) | |
download | openvswitch-ffbe41dbcb4882aafdf80d86afa1906b2a00199e.tar.gz |
ofproto-dpif-xlate: Add "always" mode to priority tags
Configure "if-nonzero" priority tags to retain the 802.1Q header
when the VLAN ID is zero, except both the VLAN ID and priority are zero.
Add a "always" configuration option to retain the 802.1Q header in such
frames as well.
Signed-off-by: Eli Britstein <elibr@mellanox.com>
Reviewed-by: Roi Dayan <roid@mellanox.com>
Signed-off-by: Ben Pfaff <blp@ovn.org>
-rw-r--r-- | NEWS | 2 | ||||
-rw-r--r-- | ofproto/ofproto-dpif-xlate.c | 11 | ||||
-rw-r--r-- | ofproto/ofproto.h | 1 | ||||
-rw-r--r-- | vswitchd/bridge.c | 2 | ||||
-rw-r--r-- | vswitchd/vswitch.xml | 8 |
5 files changed, 17 insertions, 7 deletions
@@ -21,6 +21,8 @@ Post-v2.11.0 * New "ovs-appctl dpctl/ipf-get-status" command for userspace datapath conntrack fragmentation support. * New action "check_pkt_len". + * Port configuration with "other-config:priority-tags" now has a mode + that retains the 802.1Q header even if VLAN and priority are both zero. - OVSDB: * OVSDB clients can now resynchronize with clustered servers much more quickly after a brief disconnection, saving bandwidth and CPU time. diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c index edcac0870..ae8b9991c 100644 --- a/ofproto/ofproto-dpif-xlate.c +++ b/ofproto/ofproto-dpif-xlate.c @@ -549,7 +549,8 @@ static void xvlan_copy(struct xvlan *dst, const struct xvlan *src); static void xvlan_pop(struct xvlan *src); static void xvlan_push_uninit(struct xvlan *src); static void xvlan_extract(const struct flow *, struct xvlan *); -static void xvlan_put(struct flow *, const struct xvlan *); +static void xvlan_put(struct flow *, const struct xvlan *, + enum port_priority_tags_mode); static void xvlan_input_translate(const struct xbundle *, const struct xvlan *in, struct xvlan *xvlan); @@ -2270,13 +2271,15 @@ xvlan_extract(const struct flow *flow, struct xvlan *xvlan) /* Put VLAN information (headers) to flow */ static void -xvlan_put(struct flow *flow, const struct xvlan *xvlan) +xvlan_put(struct flow *flow, const struct xvlan *xvlan, + enum port_priority_tags_mode use_priority_tags) { ovs_be16 tci; int i; for (i = 0; i < FLOW_MAX_VLAN_HEADERS; i++) { tci = htons(xvlan->v[i].vid | (xvlan->v[i].pcp & VLAN_PCP_MASK)); - if (tci) { + if (tci || ((use_priority_tags == PORT_PRIORITY_TAGS_ALWAYS) && + xvlan->v[i].tpid)) { tci |= htons(VLAN_CFI); flow->vlans[i].tpid = xvlan->v[i].tpid ? htons(xvlan->v[i].tpid) : @@ -2450,7 +2453,7 @@ output_normal(struct xlate_ctx *ctx, const struct xbundle *out_xbundle, } memcpy(&old_vlans, &ctx->xin->flow.vlans, sizeof(old_vlans)); - xvlan_put(&ctx->xin->flow, &out_xvlan); + xvlan_put(&ctx->xin->flow, &out_xvlan, out_xbundle->use_priority_tags); compose_output_action(ctx, xport->ofp_port, use_recirc ? &xr : NULL, false, false); diff --git a/ofproto/ofproto.h b/ofproto/ofproto.h index 3081cb01f..6e4afffa1 100644 --- a/ofproto/ofproto.h +++ b/ofproto/ofproto.h @@ -420,6 +420,7 @@ enum port_vlan_mode { enum port_priority_tags_mode { PORT_PRIORITY_TAGS_NEVER = 0, PORT_PRIORITY_TAGS_IF_NONZERO, + PORT_PRIORITY_TAGS_ALWAYS, }; /* The behaviour of the port regarding priority tags */ diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c index 02a33293e..0702cc6ca 100644 --- a/vswitchd/bridge.c +++ b/vswitchd/bridge.c @@ -1026,6 +1026,8 @@ port_configure(struct port *port) const char *pt = smap_get_def(&cfg->other_config, "priority-tags", ""); if (!strcmp(pt, "if-nonzero") || !strcmp(pt, "true")) { s.use_priority_tags = PORT_PRIORITY_TAGS_IF_NONZERO; + } else if (!strcmp(pt, "always")) { + s.use_priority_tags = PORT_PRIORITY_TAGS_ALWAYS; } else { s.use_priority_tags = PORT_PRIORITY_TAGS_NEVER; } diff --git a/vswitchd/vswitch.xml b/vswitchd/vswitch.xml index 1613d3569..89c06a1b7 100644 --- a/vswitchd/vswitch.xml +++ b/vswitchd/vswitch.xml @@ -1877,7 +1877,7 @@ <column name="other_config" key="priority-tags" type='{"type": "string", - "enum": ["set", ["never", "if-nonzero"]]}'> + "enum": ["set", ["never", "if-nonzero", "always"]]}'> <p> An 802.1Q header contains two important pieces of information: a VLAN ID and a priority. A frame with a zero VLAN ID, called a @@ -1894,8 +1894,10 @@ </p> <p> - Regardless of this setting, Open vSwitch omits the 802.1Q header on - output if both the VLAN ID and priority would be zero. + For <code>if-nonzero</code> Open vSwitch omits the 802.1Q header on + output if both the VLAN ID and priority would be zero. Set to + <code>always</code> to retain the 802.1Q header in such frames as + well. </p> <p> |