return netdev_open(&options, netdevp);
}
+/* Increments the reference count on 'netdev'. Returns 'netdev'. */
+struct netdev *
+netdev_reopen(struct netdev *netdev)
+{
+ netdev->ref_cnt++;
+ return netdev;
+}
+
/* Reconfigures the device 'netdev' with 'args'. 'args' may be empty
* or NULL if none are needed. */
int
return 0;
}
-/* Closes and destroys 'netdev'. */
+/* Decrements the reference count on 'netdev'. If the reference count reaches
+ * zero, closes and destroys 'netdev'. */
void
netdev_close(struct netdev *netdev)
{
- if (netdev) {
+ assert(!netdev || netdev->ref_cnt > 0);
+ if (netdev && !--netdev->ref_cnt) {
struct netdev_dev *netdev_dev = netdev_get_dev(netdev);
assert(netdev_dev->ref_cnt);
{
memset(netdev, 0, sizeof *netdev);
netdev->netdev_dev = netdev_dev;
+ netdev->ref_cnt = 1;
list_push_back(&netdev_list, &netdev->node);
}
*
* Normally this function only needs to be called from netdev_close().
* However, it may be called by providers due to an error on opening
- * that occurs after initialization. It this case netdev_close() would
+ * that occurs after initialization. In this case netdev_close() would
* never be called. */
void
netdev_uninit(struct netdev *netdev, bool close)
close_all_netdevs(void *aux OVS_UNUSED)
{
struct netdev *netdev, *next;
- LIST_FOR_EACH_SAFE(netdev, next, struct netdev, node, &netdev_list) {
+ LIST_FOR_EACH_SAFE(netdev, next, node, &netdev_list) {
netdev_close(netdev);
}
}