@@ -19,6 +19,10 @@ Post-v2.11.0
* New "ovs-appctl dpctl/ipf-get-status" command for userspace datapath
conntrack fragmentation support.
* New action "check_pkt_len".
+ * Changed options for "other-config:priority-tags" port configuration:
+ "false"/"true" changed to "omit"/"include-non-zero", and added a new
+ option "include" to always retain the 802.1Q header, for frames with
+ both the VLAN ID and priority are zero as well.
- OVSDB:
* OVSDB clients can now resynchronize with clustered servers much more
quickly after a brief disconnection, saving bandwidth and CPU time.
@@ -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_INCLUDE) &&
+ 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);
@@ -420,6 +420,7 @@ enum port_vlan_mode {
enum port_priority_tags_mode {
PORT_PRIORITY_TAGS_OMIT = 0,
PORT_PRIORITY_TAGS_INCLUDE_NON_ZERO,
+ PORT_PRIORITY_TAGS_INCLUDE,
};
/* The behaviour of the port regarding priority tags */
@@ -1026,6 +1026,8 @@ port_configure(struct port *port)
const char *pt = smap_get_def(&cfg->other_config, "priority-tags", "");
if (!strcmp(pt, "include-non-zero") || !strcmp(pt, "true")) {
s.use_priority_tags = PORT_PRIORITY_TAGS_INCLUDE_NON_ZERO;
+ } else if (!strcmp(pt, "include")) {
+ s.use_priority_tags = PORT_PRIORITY_TAGS_INCLUDE;
} else {
s.use_priority_tags = PORT_PRIORITY_TAGS_OMIT;
}
@@ -1860,7 +1860,7 @@
</column>
<column name="other_config" key="priority-tags"
- type='{"type": "string", "enum": ["set", ["omit", "include-non-zero"]]}'>
+ type='{"type": "string", "enum": ["set", ["omit", "include-non-zero", "include"]]}'>
<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
@@ -1877,8 +1877,9 @@
</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>include-non-zero</code> Open vSwitch omits the 802.1Q header on output
+ if both the VLAN ID and priority would be zero. Set to <code>include</code>
+ to retain the 802.1Q header in such frames as well.
</p>
<p>