[ovs-dev] [PATCH] bridge: Clear out all Interface fields when an interface cannot be created.
Ethan Jackson
ethan at nicira.com
Wed Sep 28 18:39:57 UTC 2011
Looks good.
Ethan
On Wed, Sep 28, 2011 at 09:37, Ben Pfaff <blp at nicira.com> wrote:
> When an Interface record is invalid (for example, when the interface that
> it specifies does not exist and cannot be created), ovs-vswitchd would
> leave any pre-existing data in its columns, except that it would set the
> ofport column to -1 to indicate the error. This was sometimes confusing
> because, for example, the lacp_current field could still be set to "true"
> if LACP has previously been active and up-to-date.
>
> This commit changes ovs-vswitchd to reset all such data to its default
> values when an interface is invalid.
>
> Bug #7450.
> Reported-by: Duffie Cooley <dcooley at nicira.com>
> Bug #7491.
> Reported-by: Ethan Jackson <ethan at nicira.com>
> Release Notes #7500.
> Reported-by: Keith Amidon <keith at nicira.com>
> ---
> So far this is compile-tested only, but I'll test it before pushing.
>
> diff --git a/AUTHORS b/AUTHORS
> index da82f10..20a53d3 100644
> --- a/AUTHORS
> +++ b/AUTHORS
> @@ -61,6 +61,7 @@ Bryan Osoro bosoro at nicira.com
> Cedric Hobbs cedric at nicira.com
> Dave Walker DaveWalker at ubuntu.com
> Derek Cormier derek.cormier at lab.ntt.co.jp
> +Duffie Cooley dcooley at nicira.com
> DK Moon dkmoon at nicira.com
> Gaetano Catalli gaetano.catalli at gmail.com
> George Shuklin amarao at desunote.ru
> diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c
> index a576844..46d0618 100644
> --- a/vswitchd/bridge.c
> +++ b/vswitchd/bridge.c
> @@ -195,6 +195,7 @@ static struct iface *iface_from_ofp_port(const struct bridge *,
> uint16_t ofp_port);
> static void iface_set_mac(struct iface *);
> static void iface_set_ofport(const struct ovsrec_interface *, int64_t ofport);
> +static void iface_clear_db_record(const struct ovsrec_interface *if_cfg);
> static void iface_configure_qos(struct iface *, const struct ovsrec_qos *);
> static void iface_configure_cfm(struct iface *);
> static void iface_refresh_cfm_stats(struct iface *);
> @@ -939,7 +940,7 @@ bridge_add_ofproto_ports(struct bridge *br)
> /* We already reported a related error, don't bother
> * duplicating it. */
> }
> - iface_set_ofport(iface->cfg, -1);
> + iface_clear_db_record(iface->cfg);
> iface_destroy(iface);
> }
> }
> @@ -2162,7 +2163,7 @@ port_add_ifaces(struct port *port)
> && !shash_add_once(&new_ifaces, cfg->name, cfg)) {
> VLOG_WARN("port %s: %s specified twice as port interface",
> port->name, cfg->name);
> - iface_set_ofport(cfg, -1);
> + iface_clear_db_record(cfg);
> }
> }
>
> @@ -2515,6 +2516,29 @@ iface_set_ofport(const struct ovsrec_interface *if_cfg, int64_t ofport)
> }
> }
>
> +/* Clears all of the fields in 'if_cfg' that indicate interface status, and
> + * sets the "ofport" field to -1.
> + *
> + * This is appropriate when 'if_cfg''s interface cannot be created or is
> + * otherwise invalid. */
> +static void
> +iface_clear_db_record(const struct ovsrec_interface *if_cfg)
> +{
> + if (!ovsdb_idl_row_is_synthetic(&if_cfg->header_)) {
> + iface_set_ofport(if_cfg, -1);
> + ovsrec_interface_set_status(if_cfg, NULL, NULL, 0);
> + ovsrec_interface_set_admin_state(if_cfg, NULL);
> + ovsrec_interface_set_duplex(if_cfg, NULL);
> + ovsrec_interface_set_link_speed(if_cfg, NULL, 0);
> + ovsrec_interface_set_link_state(if_cfg, NULL);
> + ovsrec_interface_set_mtu(if_cfg, NULL, 0);
> + ovsrec_interface_set_cfm_fault(if_cfg, NULL, 0);
> + ovsrec_interface_set_cfm_remote_mpids(if_cfg, NULL, 0);
> + ovsrec_interface_set_lacp_current(if_cfg, NULL, 0);
> + ovsrec_interface_set_statistics(if_cfg, NULL, NULL, 0);
> + }
> +}
> +
> /* Adds the 'n' key-value pairs in 'keys' in 'values' to 'shash'.
> *
> * The value strings in '*shash' are taken directly from values[], not copied,
> --
> 1.7.2.5
>
>
More information about the dev
mailing list