On Fri, Mar 17, 2017 at 08:39:01AM -0700, Ben Pfaff wrote:
> On Wed, Mar 01, 2017 at 05:48:00PM -0500, Eric Garver wrote:
> >  - Example:
> >      ovs-vsctl set Port p1 vlan_mode=dot1q-tunnel tag=100
> >    Pushes another VLAN 100 header on packets (tagged and untagged) on
> >    ingress, and pops it on egress.
> >  - Customer VLAN check:
> >      ovs-vsctl set Port p1 vlan_mode=dot1q-tunnel tag=100 cvlans=10,20
> >    Only customer VLAN of 10 and 20 are allowed.
> > 
> > Co-authored-by: Xiao Liang <[email protected]>
> > Signed-off-by: Xiao Liang <[email protected]>
> > Signed-off-by: Eric Garver <[email protected]>
> 
> Thanks Eric and Xiao.
> 
> I applied this commit to master, folding in the following changes.  The
> important changes were:
> 
> * Clarified log message.
> 
> * Moved qinq_ethtype from a column of its own to other_config, because I
>   did not think that this was an important configuration setting.
> 
> * Rewrote and expanded the documentation, because I had never heard of
>   dot1-tunnel ports and thought that others deserved a detailed
>   explanation of what they do.
> 
> Eric, would you mind rebasing and resubmitting patches 3 through 7?  I
> imagine that I've mostly broken them with my changes, although I hope
> that the fixes are simple.

Not a problem. I'll get to it ASAP.


> --8<--------------------------cut here-------------------------->8--
> 
> diff --git a/NEWS b/NEWS
> index 2994b82b6a76..83a7c97c3cd9 100644
> --- a/NEWS
> +++ b/NEWS
> @@ -3,7 +3,6 @@ Post-v2.7.0
>     - Tunnels:
>       * Added support to set packet mark for tunnel endpoint using
>         `egress_pkt_mark` OVSDB option.
> -     * New dot1q-tunnel (CVLAN) type via 802.1ad support.
>     - EMC insertion probability is reduced to 1% and is configurable via
>       the new 'other_config:emc-insert-inv-prob' option.
>     - DPDK:
> @@ -12,7 +11,8 @@ Post-v2.7.0
>         'ovs-appctl vlog' commands for 'dpdk' module. Lower bound
>         still can be configured via extra arguments for DPDK EAL.
>     - The "learn" action now supports a "limit" option (see ovs-ofctl(8)).
> -   - New support for multiple VLANs (802.1ad or "QinQ").
> +   - New support for multiple VLANs (802.1ad or "QinQ"), including a new
> +     "dot1q-tunnel" port VLAN mode.
>  
>  v2.7.0 - 21 Feb 2017
>  ---------------------
> diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c
> index bc16e92847d7..1a82b8d569be 100644
> --- a/ofproto/ofproto-dpif-xlate.c
> +++ b/ofproto/ofproto-dpif-xlate.c
> @@ -1968,8 +1968,8 @@ input_vid_is_valid(const struct xlate_ctx *ctx,
>      case PORT_VLAN_DOT1Q_TUNNEL:
>          if (!xbundle_allows_cvlan(in_xbundle, vid)) {
>              xlate_report_error(ctx, "dropping VLAN %"PRIu16" packet received 
> "
> -                               "on port %s not configured for dot1q 
> tunneling"
> -                               "VLAN %"PRIu16, vid, in_xbundle->name, vid);
> +                               "on dot1q-tunnel port %s that excludes this "
> +                               "VLAN", vid, in_xbundle->name);
>              return false;
>          }
>          return true;
> diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c
> index 8cc2fee234ff..6611c23a5903 100644
> --- a/ofproto/ofproto-dpif.c
> +++ b/ofproto/ofproto-dpif.c
> @@ -1,5 +1,5 @@
>  /*
> - * Copyright (c) 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016 Nicira, Inc.
> + * Copyright (c) 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 
> Nicira, Inc.
>   *
>   * Licensed under the Apache License, Version 2.0 (the "License");
>   * you may not use this file except in compliance with the License.
> @@ -2968,7 +2968,7 @@ bundle_set(struct ofproto *ofproto_, void *aux,
>      }
>  
>      if (s->qinq_ethtype != bundle->qinq_ethtype) {
> -        bundle->qinq_ethtype= s->qinq_ethtype;
> +        bundle->qinq_ethtype = s->qinq_ethtype;
>          need_flush = true;
>      }
>  
> @@ -3032,7 +3032,7 @@ bundle_set(struct ofproto *ofproto_, void *aux,
>  
>      if (!vlan_bitmap_equal(cvlans, bundle->cvlans)) {
>          free(bundle->cvlans);
> -        if (cvlans== s->cvlans) {
> +        if (cvlans == s->cvlans) {
>              bundle->cvlans = vlan_bitmap_clone(cvlans);
>          } else {
>              bundle->cvlans = cvlans;
> diff --git a/ofproto/ofproto.h b/ofproto/ofproto.h
> index d44845ce3cf6..1e48e1952aa2 100644
> --- a/ofproto/ofproto.h
> +++ b/ofproto/ofproto.h
> @@ -390,7 +390,7 @@ enum port_vlan_mode {
>       * Other VLANs in 'trunks' are trunked. */
>      PORT_VLAN_NATIVE_UNTAGGED,
>  
> -    /* 802.1q tunnel port. Incomming packets are added an outer vlan tag
> +    /* 802.1q tunnel port. Incoming packets are added an outer vlan tag
>       * 'vlan'. If 'cvlans' is set, only allows VLANs in 'cvlans'. */
>      PORT_VLAN_DOT1Q_TUNNEL
>  };
> diff --git a/tests/ofproto-dpif.at b/tests/ofproto-dpif.at
> index 0a0d36800449..e3d79bd0788d 100644
> --- a/tests/ofproto-dpif.at
> +++ b/tests/ofproto-dpif.at
> @@ -3182,10 +3182,10 @@ OVS_VSWITCHD_START(
>     add-port br0 p7 vlan_mode=native-untagged tag=12              -- \
>     add-port br0 p8 vlan_mode=native-untagged tag=12 trunks=10,12 \
>                     other-config:priority-tags=true               -- \
> -   add-port br0 p9 vlan_mode=dot1q-tunnel    tag=10              
> qinq_ethtype=802.1q  -- \
> -   add-port br0 p10 vlan_mode=dot1q-tunnel   tag=10 cvlans=10,12 
> qinq_ethtype=802.1q  -- \
> -   add-port br0 p11 vlan_mode=dot1q-tunnel   tag=12              
> qinq_ethtype=802.1q  -- \
> -   add-port br0 p12 vlan_mode=dot1q-tunnel   tag=12              
> qinq_ethtype=802.1q  \
> +   add-port br0 p9 vlan_mode=dot1q-tunnel    tag=10              
> other-config:qinq-ethtype=802.1q  -- \
> +   add-port br0 p10 vlan_mode=dot1q-tunnel   tag=10 cvlans=10,12 
> other-config:qinq-ethtype=802.1q  -- \
> +   add-port br0 p11 vlan_mode=dot1q-tunnel   tag=12              
> other-config:qinq-ethtype=802.1q  -- \
> +   add-port br0 p12 vlan_mode=dot1q-tunnel   tag=12              
> other-config:qinq-ethtype=802.1q  \
>                     other-config:priority-tags=true               -- \
>     set Interface p1 type=dummy -- \
>     set Interface p2 type=dummy -- \
> diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c
> index 77fe686a51f2..b182e0a5a37c 100644
> --- a/vswitchd/bridge.c
> +++ b/vswitchd/bridge.c
> @@ -1,4 +1,4 @@
> -/* Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016 
> Nicira, Inc.
> +/* Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 
> Nicira, Inc.
>   *
>   * Licensed under the Apache License, Version 2.0 (the "License");
>   * you may not use this file except in compliance with the License.
> @@ -1013,22 +1013,10 @@ port_configure(struct port *port)
>          }
>      }
>  
> -    if (cfg->qinq_ethtype) {
> -        if (!strcmp(cfg->qinq_ethtype, "802.1q") ||
> -            !strcmp(cfg->qinq_ethtype, "0x8100")) {
> -            s.qinq_ethtype = ETH_TYPE_VLAN_8021Q;
> -        } else if (!strcmp(cfg->qinq_ethtype, "802.1ad") ||
> -                   !strcmp(cfg->qinq_ethtype, "0x88a8")) {
> -            s.qinq_ethtype = ETH_TYPE_VLAN_8021AD;
> -        } else {
> -            /* This "can't happen" because ovsdb-server should prevent it. */
> -            VLOG_WARN("port %s: invalid QinQ ethertype %s, falling "
> -                      "back to 802.1ad", port->name, cfg->qinq_ethtype);
> -            s.qinq_ethtype = ETH_TYPE_VLAN_8021AD;
> -        }
> -    } else {
> -        s.qinq_ethtype = ETH_TYPE_VLAN_8021AD;
> -    }
> +    const char *qe = smap_get_def(&cfg->other_config, "qinq-ethtype", "");
> +    s.qinq_ethtype = (!strcmp(qe, "802.1q")
> +                      ? ETH_TYPE_VLAN_8021Q
> +                      : ETH_TYPE_VLAN_8021AD);
>  
>      s.use_priority_tags = smap_get_bool(&cfg->other_config, "priority-tags",
>                                          false);
> diff --git a/vswitchd/vswitch.ovsschema b/vswitchd/vswitch.ovsschema
> index 97fad0621fe3..19b49daf118c 100644
> --- a/vswitchd/vswitch.ovsschema
> +++ b/vswitchd/vswitch.ovsschema
> @@ -1,6 +1,6 @@
>  {"name": "Open_vSwitch",
>   "version": "7.15.0",
> - "cksum": "2427506207 23400",
> + "cksum": "544856471 23228",
>   "tables": {
>     "Open_vSwitch": {
>       "columns": {
> @@ -160,10 +160,6 @@
>             "enum": ["set", ["trunk", "access", "native-tagged",
>                              "native-untagged", "dot1q-tunnel"]]},
>           "min": 0, "max": 1}},
> -       "qinq_ethtype": {
> -         "type": {"key": {"type": "string",
> -           "enum": ["set", ["802.1q", "802.1ad", "0x88a8", "0x8100"]]},
> -         "min": 0, "max": 1}},
>         "qos": {
>           "type": {"key": {"type": "uuid",
>                            "refTable": "QoS"},
> diff --git a/vswitchd/vswitch.xml b/vswitchd/vswitch.xml
> index 45cc6437f412..14297bf9ad98 100644
> --- a/vswitchd/vswitch.xml
> +++ b/vswitchd/vswitch.xml
> @@ -1281,7 +1281,39 @@
>      </column>
>  
>      <group title="VLAN Configuration">
> -      <p>Bridge ports support the following types of VLAN configuration:</p>
> +      <p>
> +        In short, a VLAN (short for ``virtual LAN'') is a way to partition a
> +        single switch into multiple switches.  VLANs can be confusing, so for
> +        an introduction, please refer to the question ``What's a VLAN?'' in 
> the
> +        Open vSwitch FAQ.
> +      </p>
> +
> +      <p>
> +        A VLAN is sometimes encoded into a packet using a 802.1Q or 802.1ad
> +        VLAN header, but every packet is part of some VLAN whether or not it 
> is
> +        encoded in the packet.  (A packet that appears to have no VLAN is 
> part
> +        of VLAN 0, by default.)  As a result, it's useful to think of a VLAN 
> as
> +        a metadata property of a packet, separate from how the VLAN is 
> encoded.
> +        For a given port, this column determines how the encoding of a packet
> +        that ingresses or egresses the port maps to the packet's VLAN.  When 
> a
> +        packet enters the switch, its VLAN is determined based on its setting
> +        in this column and its VLAN headers, if any, and then, conceptually,
> +        the VLAN headers are then stripped off.  Conversely, when a packet
> +        exits the switch, its VLAN and the settings in this column determine
> +        what VLAN headers, if any, are pushed onto the packet before it
> +        egresses the port.
> +      </p>
> +
> +      <p>
> +        The VLAN configuration in this column affects Open vSwitch only when 
> it
> +        is doing ``normal switching.''  It does not affect flows set up by an
> +        OpenFlow controller, outside of the OpenFlow ``normal action.''
> +      </p>
> +
> +      <p>
> +        Bridge ports support the following types of VLAN configuration:
> +      </p>
> +
>        <dl>
>          <dt>trunk</dt>
>          <dd>
> @@ -1333,16 +1365,23 @@
>          <dt>dot1q-tunnel</dt>
>          <dd>
>            <p>
> -            A dot1q-tunnel port tunnels packets with VLAN specified in
> -            <ref column="tag"/> column. That is it adds 802.1Q header, with
> -            ethertype and VLAN ID specified in <ref column="qinq-ethtype"/>
> -            and <ref column="tag"/>, to both tagged and untagged packets on
> -            ingress, and pops dot1q header of this VLAN on egress.
> +            A dot1q-tunnel port is somewhat like an access port.  Like an
> +            access port, it carries packets on the single VLAN specified in 
> the
> +            <ref column="tag"/> column and this VLAN, called the service 
> VLAN,
> +            does not appear in an 802.1Q header for packets that ingress or
> +            egress on the port.  The main difference lies in the behavior 
> when
> +            packets that include a 802.1Q header ingress on the port.  
> Whereas
> +            an access port drops such packets, a dot1q-tunnel port treats 
> these
> +            as double-tagged with the outer service VLAN <ref column="tag"/>
> +            and the inner customer VLAN taken from the 802.1Q header.
> +            Correspondingly, to egress on the port, a packet outer VLAN (or
> +            only VLAN) must be <ref column="tag"/>, which is removed before
> +            egress, which exposes the inner (customer) VLAN if one is 
> present.
>            </p>
> -
> +            
>            <p>
> -            If <ref column="cvlans"/> is set, only allows packets of these
> -            VLANs.
> +            If <ref column="cvlans"/> is set, only allows packets in the
> +            specified customer VLANs.
>            </p>
>          </dd>
>        </dl>
> @@ -1368,13 +1407,6 @@
>          </ul>
>        </column>
>  
> -      <column name="qinq_ethtype">
> -        <p>
> -          Ethertype of dot1q-tunnel port, could be either "802.1q"(0x8100) or
> -          "802.1ad"(0x88a8). Defaults to "802.1ad".
> -        </p>
> -      </column>
> -
>        <column name="tag">
>          <p>
>            For an access port, the port's implicitly tagged VLAN.  For a
> @@ -1398,9 +1430,32 @@
>  
>        <column name="cvlans">
>          <p>
> -          For a trunk-qinq port if specific cvlans are specified only those
> -          cvlans are 1ad tunneled, others are dropped. If no cvlans specified
> -          explicitly then all cvlans are 1ad tunneled.
> +          For a dot1q-tunnel port, the customer VLANs that this port 
> includes.
> +          If this is empty, the port includes all customer VLANs.
> +        </p>
> +        <p>
> +          For other kinds of ports, this setting is ignored.
> +        </p>
> +      </column>
> +
> +      <column name="other_config" key="qinq-ethtype"
> +              type='{"type": "string", "enum": ["set", ["802.1ad", 
> "802.1q"]]}'>
> +        <p>
> +          For a dot1q-tunnel port, this is the TPID for the service tag, that
> +          is, for the 802.1Q header that contains the service VLAN ID.  
> Because
> +          packets that actually ingress and egress a dot1q-tunnel port do not
> +          include an 802.1Q header for the service VLAN, this does not affect
> +          packets on the dot1q-tunnel port itself.  Rather, it determines the
> +          service VLAN for a packet that ingresses on a dot1q-tunnel port and
> +          egresses on a trunk port.
> +        </p>
> +        <p>
> +          The value <code>802.1ad</code> specifies TPID 0x88a8, which is also
> +          the default if the setting is omitted.  The value 
> <code>802.1q</code>
> +          specifies TPID 0x8100.
> +        </p>
> +        <p>
> +          For other kinds of ports, this setting is ignored.
>          </p>
>        </column>
>  

This incremental looks good. Thanks for beefing up the documentation.

Eric.
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to