use error checking mutexs in pltap&tunnel
[sliver-openvswitch.git] / lib / netdev.c
index 0e8ec58..b1dfc08 100644 (file)
@@ -109,6 +109,8 @@ netdev_initialize(void)
         netdev_register_provider(&netdev_tap_class);
         netdev_register_provider(&netdev_bsd_class);
 #endif
+        netdev_register_provider(&netdev_tunnel_class);
+        netdev_register_provider(&netdev_pltap_class);
 
         ovsthread_once_done(&once);
     }
@@ -126,7 +128,9 @@ netdev_run(void)
 
     ovs_rwlock_rdlock(&netdev_class_rwlock);
     HMAP_FOR_EACH (rc, hmap_node, &netdev_classes) {
-        rc->class->run();
+        if (rc->class->run) {
+            rc->class->run();
+        }
     }
     ovs_rwlock_unlock(&netdev_class_rwlock);
 }
@@ -143,7 +147,9 @@ netdev_wait(void)
 
     ovs_rwlock_rdlock(&netdev_class_rwlock);
     HMAP_FOR_EACH (rc, hmap_node, &netdev_classes) {
-        rc->class->wait();
+        if (rc->class->wait) {
+            rc->class->wait();
+        }
     }
     ovs_rwlock_unlock(&netdev_class_rwlock);
 }
@@ -328,6 +334,9 @@ netdev_open(const char *name, const char *type, struct netdev **netdevp)
 
                     atomic_add(&rc->ref_cnt, 1, &old_ref_cnt);
                 } else {
+                    free(netdev->name);
+                    ovs_assert(list_is_empty(&netdev->saved_flags_list));
+                    shash_delete(&netdev_shash, netdev->node);
                     rc->class->dealloc(netdev);
                 }
             } else {