tunnel: Recreate tunnel port only when the netdev status change.
[cascardo/ovs.git] / ofproto / tunnel.c
index d2e9584..dcbbfb5 100644 (file)
@@ -52,7 +52,7 @@ struct tnl_port {
     struct hmap_node match_node;
 
     const struct ofport_dpif *ofport;
-    unsigned int change_seq;
+    uint64_t change_seq;
     struct netdev *netdev;
 
     struct tnl_match match;
@@ -138,7 +138,7 @@ tnl_port_add__(const struct ofport_dpif *ofport, const struct netdev *netdev,
     tnl_port = xzalloc(sizeof *tnl_port);
     tnl_port->ofport = ofport;
     tnl_port->netdev = netdev_ref(netdev);
-    tnl_port->change_seq = seq_read(connectivity_seq_get());
+    tnl_port->change_seq = netdev_get_change_seq(tnl_port->netdev);
 
     tnl_port->match.in_key = cfg->in_key;
     tnl_port->match.ip_src = cfg->ip_src;
@@ -159,8 +159,9 @@ tnl_port_add__(const struct ofport_dpif *ofport, const struct netdev *netdev,
                       "port '%s' (%s)", tnl_port_get_name(tnl_port),
                       tnl_port_get_name(existing_port), ds_cstr(&ds));
             ds_destroy(&ds);
-            free(tnl_port);
         }
+        netdev_close(tnl_port->netdev);
+        free(tnl_port);
         return false;
     }
 
@@ -205,7 +206,7 @@ tnl_port_reconfigure(const struct ofport_dpif *ofport,
         changed = tnl_port_add__(ofport, netdev, odp_port, false);
     } else if (tnl_port->netdev != netdev
                || tnl_port->match.odp_port != odp_port
-               || tnl_port->change_seq != seq_read(connectivity_seq_get())) {
+               || tnl_port->change_seq != netdev_get_change_seq(tnl_port->netdev)) {
         VLOG_DBG("reconfiguring %s", tnl_port_get_name(tnl_port));
         tnl_port_del__(ofport);
         tnl_port_add__(ofport, netdev, odp_port, true);