[ovs-dev] [PATCH] ofproto-dpif: Avoid creating OpenFlow ports for duplicate tunnels.

Alex Wang alexw at nicira.com
Wed May 27 16:17:23 UTC 2015


Tested,


Acked-by: Alex Wang <alexw at nicira.com>

On Tue, May 26, 2015 at 6:48 PM, Ben Pfaff <blp at nicira.com> wrote:

> Until now, when two tunnels had an identical configuration, both of them
> were assigned OpenFlow ports, but only one of those OpenFlow ports was
> functional.  With this commit, only one of the two (or more) identically
> configured tunnels will be assigned an OpenFlow port number.
>
> Reported-by: Keith Holleman <hollemanietf at gmail.com>
> Signed-off-by: Ben Pfaff <blp at nicira.com>
> ---
>  AUTHORS                |  1 +
>  ofproto/ofproto-dpif.c |  8 ++++++--
>  ofproto/tunnel.c       | 14 ++++++++++----
>  ofproto/tunnel.h       |  6 +++---
>  4 files changed, 20 insertions(+), 9 deletions(-)
>
> diff --git a/AUTHORS b/AUTHORS
> index 5178b43..60b8cfa 100644
> --- a/AUTHORS
> +++ b/AUTHORS
> @@ -276,6 +276,7 @@ Joan Cirer              joan at ev0.net
>  John Darrington         john at darrington.wattle.id.au
>  John Galgay             john at galgay.net
>  John Hurley             john.hurley at netronome.com
> +Keith Holleman          hollemanietf at gmail.com
>  K 華                    k940545 at hotmail.com
>  Kevin Mancuso           kevin.mancuso at rackspace.com
>  Kiran Shanbhog          kiran at vmware.com
> diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c
> index d151bb7..532fc4a 100644
> --- a/ofproto/ofproto-dpif.c
> +++ b/ofproto/ofproto-dpif.c
> @@ -1686,9 +1686,13 @@ port_construct(struct ofport *port_)
>      port->odp_port = dpif_port.port_no;
>
>      if (netdev_get_tunnel_config(netdev)) {
> +        error = tnl_port_add(port, port->up.netdev, port->odp_port,
> +                             ovs_native_tunneling_is_on(ofproto),
> namebuf);
> +        if (error) {
> +            return error;
> +        }
> +
>          atomic_count_inc(&ofproto->backer->tnl_count);
> -        tnl_port_add(port, port->up.netdev, port->odp_port,
> -                     ovs_native_tunneling_is_on(ofproto), namebuf);
>          port->is_tunnel = true;
>          if (ofproto->ipfix) {
>             dpif_ipfix_add_tunnel_port(ofproto->ipfix, port_,
> port->odp_port);
> diff --git a/ofproto/tunnel.c b/ofproto/tunnel.c
> index 3ea0eb4..d2ac7c6 100644
> --- a/ofproto/tunnel.c
> +++ b/ofproto/tunnel.c
> @@ -1,4 +1,4 @@
> -/* Copyright (c) 2013, 2014 Nicira, Inc.
> +/* Copyright (c) 2013, 2014, 2015 Nicira, Inc.
>   *
>   * Licensed under the Apache License, Version 2.0 (the "License");
>   * you may not use this file except in compliance with the License.
> @@ -203,14 +203,20 @@ tnl_port_add__(const struct ofport_dpif *ofport,
> const struct netdev *netdev,
>
>  /* Adds 'ofport' to the module with datapath port number 'odp_port'.
> 'ofport's
>   * must be added before they can be used by the module. 'ofport' must be a
> - * tunnel. */
> -void
> + * tunnel.
> + *
> + * Returns 0 if successful, otherwise a positive errno value. */
> +int
>  tnl_port_add(const struct ofport_dpif *ofport, const struct netdev
> *netdev,
>               odp_port_t odp_port, bool native_tnl, const char name[])
> OVS_EXCLUDED(rwlock)
>  {
> +    bool ok;
> +
>      fat_rwlock_wrlock(&rwlock);
> -    tnl_port_add__(ofport, netdev, odp_port, true, native_tnl, name);
> +    ok = tnl_port_add__(ofport, netdev, odp_port, true, native_tnl, name);
>      fat_rwlock_unlock(&rwlock);
> +
> +    return ok ? 0 : EEXIST;
>  }
>
>  /* Checks if the tunnel represented by 'ofport' reconfiguration due to
> changes
> diff --git a/ofproto/tunnel.h b/ofproto/tunnel.h
> index 6181762..b8415ab 100644
> --- a/ofproto/tunnel.h
> +++ b/ofproto/tunnel.h
> @@ -1,4 +1,4 @@
> -/* Copyright (c) 2013 Nicira, Inc.
> +/* Copyright (c) 2013, 2015 Nicira, Inc.
>   *
>   * Licensed under the Apache License, Version 2.0 (the "License");
>   * you may not use this file except in compliance with the License.
> @@ -33,8 +33,8 @@ void ofproto_tunnel_init(void);
>  bool tnl_port_reconfigure(const struct ofport_dpif *, const struct netdev
> *,
>                            odp_port_t, bool native_tnl, const char name[]);
>
> -void tnl_port_add(const struct ofport_dpif *, const struct netdev *,
> -                  odp_port_t odp_port, bool native_tnl, const char
> name[]);
> +int tnl_port_add(const struct ofport_dpif *, const struct netdev *,
> +                 odp_port_t odp_port, bool native_tnl, const char name[]);
>  void tnl_port_del(const struct ofport_dpif *);
>
>  const struct ofport_dpif *tnl_port_receive(const struct flow *);
> --
> 2.1.3
>
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev
>



More information about the dev mailing list