Looks good to me,

Thanks for writing this up.  I'll drop the equivalent patch from my series.

Ethan

On Wed, Nov 30, 2011 at 12:09, Ben Pfaff <b...@nicira.com> wrote:
> The design intent is for LACP ports to use the datapath ID as the default
> system ID when none is specifically configured.  However, the datapath ID
> is not available that early.  This commit makes it available earlier.
>
> This commit does not fix another bug that prevents the LACP system ID from
> being set properly (nothing sets it at all, in fact, so it always uses 0).
>
> Build and unit tested only.
> ---
>  vswitchd/bridge.c |   24 ++++++++++++++++++++++--
>  1 files changed, 22 insertions(+), 2 deletions(-)
>
> diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c
> index d2dcd02..ec40927 100644
> --- a/vswitchd/bridge.c
> +++ b/vswitchd/bridge.c
> @@ -28,6 +28,7 @@
>  #include "dynamic-string.h"
>  #include "hash.h"
>  #include "hmap.h"
> +#include "hmapx.h"
>  #include "jsonrpc.h"
>  #include "lacp.h"
>  #include "list.h"
> @@ -444,6 +445,10 @@ bridge_reconfigure(const struct ovsrec_open_vswitch 
> *ovs_cfg)
>     HMAP_FOR_EACH (br, node, &all_bridges) {
>         struct port *port;
>
> +        /* We need the datapath ID early to allow LACP ports to use it as the
> +         * default system ID. */
> +        bridge_configure_datapath_id(br);
> +
>         HMAP_FOR_EACH (port, hmap_node, &br->ports) {
>             struct iface *iface;
>
> @@ -456,7 +461,6 @@ bridge_reconfigure(const struct ovsrec_open_vswitch 
> *ovs_cfg)
>             }
>         }
>         bridge_configure_mirrors(br);
> -        bridge_configure_datapath_id(br);
>         bridge_configure_flow_eviction_threshold(br);
>         bridge_configure_forward_bpdu(br);
>         bridge_configure_remotes(br, managers, n_managers);
> @@ -1278,10 +1282,12 @@ static void
>  bridge_pick_local_hw_addr(struct bridge *br, uint8_t ea[ETH_ADDR_LEN],
>                           struct iface **hw_addr_iface)
>  {
> +    struct hmapx mirror_output_ports;
>     const char *hwaddr;
>     struct port *port;
>     bool found_addr = false;
>     int error;
> +    int i;
>
>     *hw_addr_iface = NULL;
>
> @@ -1298,6 +1304,18 @@ bridge_pick_local_hw_addr(struct bridge *br, uint8_t 
> ea[ETH_ADDR_LEN],
>         }
>     }
>
> +    /* Mirror output ports don't participate in picking the local hardware
> +     * address.  ofproto can't help us find out whether a given port is a
> +     * mirror output because we haven't configured mirrors yet, so we need to
> +     * accumulate them ourselves. */
> +    hmapx_init(&mirror_output_ports);
> +    for (i = 0; i < br->cfg->n_mirrors; i++) {
> +        struct ovsrec_mirror *m = br->cfg->mirrors[i];
> +        if (m->output_port) {
> +            hmapx_add(&mirror_output_ports, m->output_port);
> +        }
> +    }
> +
>     /* Otherwise choose the minimum non-local MAC address among all of the
>      * interfaces. */
>     HMAP_FOR_EACH (port, hmap_node, &br->ports) {
> @@ -1306,7 +1324,7 @@ bridge_pick_local_hw_addr(struct bridge *br, uint8_t 
> ea[ETH_ADDR_LEN],
>         struct iface *iface;
>
>         /* Mirror output ports don't participate. */
> -        if (ofproto_is_mirror_output_bundle(br->ofproto, port)) {
> +        if (hmapx_contains(&mirror_output_ports, port->cfg)) {
>             continue;
>         }
>
> @@ -1369,6 +1387,8 @@ bridge_pick_local_hw_addr(struct bridge *br, uint8_t 
> ea[ETH_ADDR_LEN],
>         VLOG_WARN("bridge %s: using default bridge Ethernet "
>                   "address "ETH_ADDR_FMT, br->name, ETH_ADDR_ARGS(ea));
>     }
> +
> +    hmapx_destroy(&mirror_output_ports);
>  }
>
>  /* Choose and returns the datapath ID for bridge 'br' given that the bridge
> --
> 1.7.2.5
>
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to