]> git.proxmox.com Git - ovs.git/commitdiff
ofproto-dpif-xlate: Add "always" mode to priority tags
authorEli Britstein <elibr@mellanox.com>
Sun, 12 May 2019 05:51:00 +0000 (05:51 +0000)
committerBen Pfaff <blp@ovn.org>
Fri, 24 May 2019 18:22:10 +0000 (11:22 -0700)
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>
NEWS
ofproto/ofproto-dpif-xlate.c
ofproto/ofproto.h
vswitchd/bridge.c
vswitchd/vswitch.xml

diff --git a/NEWS b/NEWS
index b0012db16d411d10258ba6c227bfe587dd99eed5..19cebf89a78586ec2b539d515177aa01098cdbf4 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -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.
index edcac0870b2353106ef09ae67d6ea69421a3b816..ae8b9991c7cd89e5908ba02b03b29a3a9ed75405 100644 (file)
@@ -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);
index 3081cb01f2950cb6ce886ca3f23e6c7668dee1f0..6e4afffa17e0040a915a996594802e25283022ab 100644 (file)
@@ -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 */
index 02a33293e6c0364c337e8b6d7fea8d0c33b4e333..0702cc6ca96b620841f546106e1e941e34e43295 100644 (file)
@@ -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;
     }
index 1613d356917055efe414306c9e64bd83ab81afd3..89c06a1b7877b04c8af686eb9424635beaae6937 100644 (file)
 
       <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
         </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>