By bumb luck, I noticed that 'ofproto->backer->tnl_count' will affect how ovs_native_tunneling_is_on() gives its answer. The following incremental diff seems to help 'tunnel_push_pop" test to pass. BTW, I am not suggesting this is the right fix, since it looks ugly.
diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c index 431f739..44b5749 100644 --- a/ofproto/ofproto-dpif.c +++ b/ofproto/ofproto-dpif.c @@ -1670,13 +1670,14 @@ port_construct(struct ofport *port_) port->odp_port = dpif_port.port_no; if (netdev_get_tunnel_config(netdev)) { + atomic_count_inc(&ofproto->backer->tnl_count); error = tnl_port_add(port, port->up.netdev, port->odp_port, ovs_native_tunneling_is_on(ofproto), namebuf); if (error) { + atomic_count_dec(&ofproto->backer->tnl_count); return error; } - atomic_count_inc(&ofproto->backer->tnl_count); port->is_tunnel = true; if (ofproto->ipfix) { dpif_ipfix_add_tunnel_port(ofproto->ipfix, port_, port->odp_port); In addition, there may be a memory leak in case we bail out early. proto/ofproto-dpif.c b/ofproto/ofproto-dpif.c index 44b5749..bd45305 100644 --- a/ofproto/ofproto-dpif.c +++ b/ofproto/ofproto-dpif.c @@ -1675,6 +1675,7 @@ port_construct(struct ofport *port_) ovs_native_tunneling_is_on(ofproto), namebuf); if (error) { atomic_count_dec(&ofproto->backer->tnl_count); + dpif_port_destroy(&dpif_port); return error; } The unit tests are still happy with both patches applied. On Wed, May 27, 2015 at 9:36 AM, Ben Pfaff <b...@nicira.com> wrote: > Oh, unfortunately it breaks test 629 "tunnel_push_pop - action". I > haven't had a chance to fully investigate yet. > > On Wed, May 27, 2015 at 09:33:07AM -0700, Ben Pfaff wrote: >> Wow, thanks! >> >> I added a Tested-by for you also, and I'll apply this to master in a >> minute. >> >> On Wed, May 27, 2015 at 09:17:23AM -0700, Alex Wang wrote: >> > Tested, >> > >> > >> > Acked-by: Alex Wang <al...@nicira.com> >> > >> > On Tue, May 26, 2015 at 6:48 PM, Ben Pfaff <b...@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 <hollemani...@gmail.com> >> > > Signed-off-by: Ben Pfaff <b...@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 j...@ev0.net >> > > John Darrington j...@darrington.wattle.id.au >> > > John Galgay j...@galgay.net >> > > John Hurley john.hur...@netronome.com >> > > +Keith Holleman hollemani...@gmail.com >> > > K 華 k940...@hotmail.com >> > > Kevin Mancuso kevin.manc...@rackspace.com >> > > Kiran Shanbhog ki...@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@openvswitch.org >> > > http://openvswitch.org/mailman/listinfo/dev >> > > > _______________________________________________ > dev mailing list > dev@openvswitch.org > http://openvswitch.org/mailman/listinfo/dev _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev