Thanks for tracking this down so quickly.  Looks good to me.  Does the problem 
exist in later branches?

Did you want to add Dominic to AUTHORS?  I suspect you, like me, assumed he was 
already there.

--Justin


On Jan 3, 2012, at 1:23 PM, Ben Pfaff wrote:

> If a bridge is in standalone mode and no controllers are configured, and
> then reconfiguration (e.g. ovs-vsctl) adds an SLB or TCP-balanced bond,
> and at the moment of reconfiguration active kernel flows exist that output
> to the newly added bond, then ovs-vswitchd would segfault because the
> bond's 'bond_hash' member is not yet initialized when flows are
> retranslated as part of adding the flow that ensures normal standalone
> switch behavior.
> 
> This commit fixes the problem by adding the flow later, after bonds have
> been fully initialized.
> 
> NIC-443.
> Reported-by: Dominic Curran <dominic.cur...@citrix.com>
> Signed-off-by: Ben Pfaff <b...@nicira.com>
> ---
> Not yet tested.
> 
> diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c
> index f1adf4e..fb2ad83 100644
> --- a/vswitchd/bridge.c
> +++ b/vswitchd/bridge.c
> @@ -1,4 +1,4 @@
> -/* Copyright (c) 2008, 2009, 2010, 2011 Nicira Networks
> +/* Copyright (c) 2008, 2009, 2010, 2011, 2012 Nicira Networks
>  *
>  * Licensed under the Apache License, Version 2.0 (the "License");
>  * you may not use this file except in compliance with the License.
> @@ -268,6 +268,7 @@ static void bridge_reconfigure_one(struct bridge *);
> static void bridge_reconfigure_remotes(struct bridge *,
>                                        const struct sockaddr_in *managers,
>                                        size_t n_managers);
> +static void bridge_reconfigure_remotes_late(struct bridge *);
> static void bridge_get_all_ifaces(const struct bridge *, struct shash 
> *ifaces);
> static void bridge_fetch_dp_ifaces(struct bridge *);
> static void bridge_flush(struct bridge *);
> @@ -930,6 +931,7 @@ bridge_reconfigure(const struct ovsrec_open_vswitch 
> *ovs_cfg)
>         HMAP_FOR_EACH (iface, dp_ifidx_node, &br->ifaces) {
>             iface_update_cfm(iface);
>         }
> +        bridge_reconfigure_remotes_late(br);
>     }
> 
>     free(managers);
> @@ -2109,13 +2111,23 @@ bridge_reconfigure_remotes(struct bridge *br,
>     if (had_primary != ofproto_has_primary_controller(br->ofproto)) {
>         ofproto_flush_flows(br->ofproto);
>     }
> +}
> 
> +/* Does configuration of remotes that must happen after all of the ports and
> + * interfaces are fully configured, that is, when flow translation can be
> + * expected to succeed.  (This is because ofproto_add_flow() immediately
> + * re-translates any existing facets for the rule that it replaces, if any.)
> + * In particular, it must be called after port_update_bonding(), to ensure 
> that
> + * 'bond_hash' is non-NULL for bonded ports. */
> +static void
> +bridge_reconfigure_remotes_late(struct bridge *br)
> +{
>     /* If there are no controllers and the bridge is in standalone
>      * mode, set up a flow that matches every packet and directs
>      * them to OFPP_NORMAL (which goes to us).  Otherwise, the
>      * switch is in secure mode and we won't pass any traffic until
>      * a controller has been defined and it tells us to do so. */
> -    if (!n_controllers
> +    if (!bridge_get_controllers(br, NULL)
>         && ofproto_get_fail_mode(br->ofproto) == OFPROTO_FAIL_STANDALONE) {
>         union ofp_action action;
>         struct cls_rule rule;
> -- 
> 1.7.2.5
> 
> _______________________________________________
> dev mailing list
> dev@openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev

_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to