Pushed to master, branch-1.8 following out-of-band review (thanks
Ben).

On Wed, Jul 25, 2012 at 09:46:25PM -0700, Ben Pfaff wrote:
> Commit c93f9a78c349 (packets: Update the reserved protocols list.) added
> a number of first-hop router redundancy protocol MAC addresses to the
> list of BPDU MAC addresses.  This means that packets destined to those MAC
> addresses are dropped when other-config:forward-bpdu is set to false on a
> bridge (the default setting).
> 
> However, this behavior is incorrect, because these MAC addresses are not
> special in the way that, say, STP frames are special.  STP is a
> switch-to-switch protocol that end hosts have no use for, but end hosts do
> speak directly to routers on the MAC addresses assigned by VRRP and the
> other protocols in this category.  Therefore, dropping packets in this
> category means that end hosts can no longer talk to their first-hop router,
> if that router is running one of these protocols.
> 
> This commit also refines the match used for EDP and EAPS, and adds Cisco
> CFM to the protocols that are dropped.
> 
> After this commit, the following destination MACs are dropped:
> 
>     - 01:08:c2:00:00:00
>     - 01:08:c2:00:00:01
>     - 01:08:c2:00:00:02
>     - 01:08:c2:00:00:03
>     - 01:08:c2:00:00:04
>     - 01:08:c2:00:00:05
>     - 01:08:c2:00:00:06
>     - 01:08:c2:00:00:07
>     - 01:08:c2:00:00:08
>     - 01:08:c2:00:00:09
>     - 01:08:c2:00:00:0a
>     - 01:08:c2:00:00:0b
>     - 01:08:c2:00:00:0c
>     - 01:08:c2:00:00:0d
>     - 01:08:c2:00:00:0e
>     - 01:08:c2:00:00:0f
> 
>     - 00:e0:2b:00:00:00
>     - 00:e0:2b:00:00:04
>     - 00:e0:2b:00:00:06
> 
>     - 01:00:0c:00:00:00
>     - 01:00:0c:cc:cc:cc
>     - 01:00:0c:cc:cc:cd
>     - 01:00:0c:cd:cd:cd
> 
>     - 01:00:0c:cc:cc:c0
>     - 01:00:0c:cc:cc:c1
>     - 01:00:0c:cc:cc:c2
>     - 01:00:0c:cc:cc:c3
>     - 01:00:0c:cc:cc:c4
>     - 01:00:0c:cc:cc:c5
>     - 01:00:0c:cc:cc:c6
>     - 01:00:0c:cc:cc:c7
> 
> Bug #12618.
> CC: Ben Basler <bbas...@nicira.com>
> Signed-off-by: Ben Pfaff <b...@nicira.com>
> ---
> v2: Revised list of MACs on Ben Basler's advice.
> 
>  lib/packets.c        |  109 
> ++++++++++++++++++++++++++++----------------------
>  vswitchd/vswitch.xml |   23 ++++------
>  2 files changed, 70 insertions(+), 62 deletions(-)
> 
> diff --git a/lib/packets.c b/lib/packets.c
> index 5729167..687a84c 100644
> --- a/lib/packets.c
> +++ b/lib/packets.c
> @@ -24,6 +24,7 @@
>  #include "byte-order.h"
>  #include "csum.h"
>  #include "flow.h"
> +#include "hmap.h"
>  #include "dynamic-string.h"
>  #include "ofpbuf.h"
>  
> @@ -43,65 +44,77 @@ dpid_from_string(const char *s, uint64_t *dpidp)
>      return *dpidp != 0;
>  }
>  
> -/* Returns true if 'ea' is a reserved multicast address, that a bridge must
> - * never forward, false otherwise.  Includes some proprietary vendor 
> protocols
> - * that shouldn't be forwarded as well.
> +/* Returns true if 'ea' is a reserved address, that a bridge must never
> + * forward, false otherwise.
>   *
>   * If you change this function's behavior, please update corresponding
>   * documentation in vswitch.xml at the same time. */
>  bool
>  eth_addr_is_reserved(const uint8_t ea[ETH_ADDR_LEN])
>  {
> -    struct masked_eth_addr {
> -        uint8_t ea[ETH_ADDR_LEN];
> -        uint8_t mask[ETH_ADDR_LEN];
> +    struct eth_addr_node {
> +        struct hmap_node hmap_node;
> +        uint64_t ea64;
>      };
>  
> -    static struct masked_eth_addr mea[] = {
> -        { /* STP, IEEE pause frames, and other reserved protocols. */
> -            {0x01, 0x08, 0xc2, 0x00, 0x00, 0x00},
> -            {0xff, 0xff, 0xff, 0xff, 0xff, 0xf0}},
> -
> -        { /* VRRP IPv4. */
> -            {0x00, 0x00, 0x5e, 0x00, 0x01, 0x00},
> -            {0xff, 0xff, 0xff, 0xff, 0xff, 0x00}},
> -
> -        { /* VRRP IPv6. */
> -            {0x00, 0x00, 0x5e, 0x00, 0x02, 0x00},
> -            {0xff, 0xff, 0xff, 0xff, 0xff, 0x00}},
> -
> -        { /* HSRPv1. */
> -            {0x00, 0x00, 0x0c, 0x07, 0xac, 0x00},
> -            {0xff, 0xff, 0xff, 0xff, 0xff, 0x00}},
> -
> -        { /* HSRPv2. */
> -            {0x00, 0x00, 0x0c, 0x9f, 0xf0, 0x00},
> -            {0xff, 0xff, 0xff, 0xff, 0xf0, 0x00}},
> -
> -        { /* GLBP. */
> -            {0x00, 0x07, 0xb4, 0x00, 0x00, 0x00},
> -            {0xff, 0xff, 0xff, 0x00, 0x00, 0x00}},
> -
> -        { /* Extreme Discovery Protocol. */
> -            {0x00, 0xE0, 0x2B, 0x00, 0x00, 0x00},
> -            {0xff, 0xff, 0xff, 0xff, 0xf0, 0x00}},
> -
> -        { /* Cisco Inter Switch Link. */
> -            {0x01, 0x00, 0x0c, 0x00, 0x00, 0x00},
> -            {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}},
> +    static struct eth_addr_node nodes[] = {
> +        /* STP, IEEE pause frames, and other reserved protocols. */
> +        { HMAP_NODE_NULL_INITIALIZER, 0x0108c2000000ULL },
> +        { HMAP_NODE_NULL_INITIALIZER, 0x0108c2000001ULL },
> +        { HMAP_NODE_NULL_INITIALIZER, 0x0108c2000002ULL },
> +        { HMAP_NODE_NULL_INITIALIZER, 0x0108c2000003ULL },
> +        { HMAP_NODE_NULL_INITIALIZER, 0x0108c2000004ULL },
> +        { HMAP_NODE_NULL_INITIALIZER, 0x0108c2000005ULL },
> +        { HMAP_NODE_NULL_INITIALIZER, 0x0108c2000006ULL },
> +        { HMAP_NODE_NULL_INITIALIZER, 0x0108c2000007ULL },
> +        { HMAP_NODE_NULL_INITIALIZER, 0x0108c2000008ULL },
> +        { HMAP_NODE_NULL_INITIALIZER, 0x0108c2000009ULL },
> +        { HMAP_NODE_NULL_INITIALIZER, 0x0108c200000aULL },
> +        { HMAP_NODE_NULL_INITIALIZER, 0x0108c200000bULL },
> +        { HMAP_NODE_NULL_INITIALIZER, 0x0108c200000cULL },
> +        { HMAP_NODE_NULL_INITIALIZER, 0x0108c200000dULL },
> +        { HMAP_NODE_NULL_INITIALIZER, 0x0108c200000eULL },
> +        { HMAP_NODE_NULL_INITIALIZER, 0x0108c200000fULL },
> +
> +        /* Extreme protocols. */
> +        { HMAP_NODE_NULL_INITIALIZER, 0x00e02b000000ULL }, /* EDP. */
> +        { HMAP_NODE_NULL_INITIALIZER, 0x00e02b000004ULL }, /* EAPS. */
> +        { HMAP_NODE_NULL_INITIALIZER, 0x00e02b000006ULL }, /* EAPS. */
> +
> +        /* Cisco protocols. */
> +        { HMAP_NODE_NULL_INITIALIZER, 0x01000c000000ULL }, /* ISL. */
> +        { HMAP_NODE_NULL_INITIALIZER, 0x01000cccccccULL }, /* PAgP, UDLD, 
> CDP,
> +                                                            * DTP, VTP. */
> +        { HMAP_NODE_NULL_INITIALIZER, 0x01000ccccccdULL }, /* PVST+. */
> +        { HMAP_NODE_NULL_INITIALIZER, 0x01000ccdcdcdULL }, /* STP Uplink 
> Fast,
> +                                                            * FlexLink. */
> +
> +        /* Cisco CFM. */
> +        { HMAP_NODE_NULL_INITIALIZER, 0x01000cccccc0ULL },
> +        { HMAP_NODE_NULL_INITIALIZER, 0x01000cccccc1ULL },
> +        { HMAP_NODE_NULL_INITIALIZER, 0x01000cccccc2ULL },
> +        { HMAP_NODE_NULL_INITIALIZER, 0x01000cccccc3ULL },
> +        { HMAP_NODE_NULL_INITIALIZER, 0x01000cccccc4ULL },
> +        { HMAP_NODE_NULL_INITIALIZER, 0x01000cccccc5ULL },
> +        { HMAP_NODE_NULL_INITIALIZER, 0x01000cccccc6ULL },
> +        { HMAP_NODE_NULL_INITIALIZER, 0x01000cccccc7ULL },
> +    };
>  
> -        { /* Cisco protocols plus others following the same pattern:
> -           *
> -           * CDP, VTP, DTP, PAgP  (01-00-0c-cc-cc-cc)
> -           * Spanning Tree PVSTP+ (01-00-0c-cc-cc-cd)
> -           * STP Uplink Fast      (01-00-0c-cd-cd-cd) */
> -            {0x01, 0x00, 0x0c, 0xcc, 0xcc, 0xcc},
> -            {0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe}}};
> +    static struct hmap addrs = HMAP_INITIALIZER(&addrs);
> +    struct eth_addr_node *node;
> +    uint64_t ea64;
>  
> -    size_t i;
> +    if (hmap_is_empty(&addrs)) {
> +        for (node = nodes; node < &nodes[ARRAY_SIZE(nodes)]; node++) {
> +            hmap_insert(&addrs, &node->hmap_node,
> +                        hash_2words(node->ea64, node->ea64 >> 32));
> +        }
> +    }
>  
> -    for (i = 0; i < ARRAY_SIZE(mea); i++) {
> -        if (eth_addr_equal_except(ea, mea[i].ea, mea[i].mask)) {
> +    ea64 = eth_addr_to_uint64(ea);
> +    HMAP_FOR_EACH_IN_BUCKET (node, hmap_node, hash_2words(ea64, ea64 >> 32),
> +                             &addrs) {
> +        if (node->ea64 == ea64) {
>              return true;
>          }
>      }
> diff --git a/vswitchd/vswitch.xml b/vswitchd/vswitch.xml
> index e6ea844..13d24b6 100644
> --- a/vswitchd/vswitch.xml
> +++ b/vswitchd/vswitch.xml
> @@ -569,21 +569,13 @@
>            <dt><code>01:80:c2:00:00:0<var>x</var></code></dt>
>            <dd>Other reserved protocols.</dd>
>  
> -          <dt><code>00:00:5e:00:01:<var>x</var><var>x</var></code></dt>
> -          <dd> VRRP IPv4 virtual router MAC address. </dd>
> +          <dt><code>00:e0:2b:00:00:00</code></dt>
> +          <dd>Extreme Discovery Protocol (EDP).</dd>
>  
> -          <dt><code>00:00:5e:00:02:<var>x</var><var>x</var></code></dt>
> -          <dd> VRRP IPv6 virtual router MAC address. </dd>
> -
> -          <dt><code>00:00:0c:07:ac:<var>x</var><var>x</var></code></dt>
> -          <dd> HSRP Version 1. </dd>
> -
> -          <dt><code>00:00:0c:9f:f<var>x</var>:<var>x</var><var>x</var></code>
> -          </dt>
> -          <dd> HSRP Version 2. </dd>
> -
> -          
> <dt><code>00:07:b4:<var>x</var><var>x</var>:<var>x</var><var>x</var>:<var>x</var><var>x</var></code></dt>
> -          <dd> GLBP. </dd>
> +          <dt>
> +         <code>00:e0:2b:00:00:04</code> and <code>00:e0:2b:00:00:06</code>
> +       </dt>
> +          <dd>Ethernet Automatic Protection Switching (EAPS).</dd>
>  
>            <dt><code>01:00:0c:cc:cc:cc</code></dt>
>            <dd>
> @@ -600,6 +592,9 @@
>  
>            <dt><code>01:00:0c:00:00:00</code></dt>
>            <dd>Cisco Inter Switch Link.</dd>
> +
> +          <dt><code>01:00:0c:cc:cc:c<var>x</var></code></dt>
> +          <dd>Cisco CFM.</dd>
>          </dl>
>        </column>
>  
> -- 
> 1.7.2.5
> 
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to