| 699 | vnet_tun_uninit, NULL); |
| 700 | |
| 701 | static void |
| 702 | tun_uninit(const void *unused __unused) |
| 703 | { |
| 704 | struct tuntap_driver *drv; |
| 705 | struct tuntap_softc *tp; |
| 706 | int i; |
| 707 | |
| 708 | EVENTHANDLER_DEREGISTER(ifnet_arrival_event, arrival_tag); |
| 709 | EVENTHANDLER_DEREGISTER(dev_clone, clone_tag); |
| 710 | drain_dev_clone_events(); |
| 711 | |
| 712 | mtx_lock(&tunmtx); |
| 713 | while ((tp = TAILQ_FIRST(&tunhead)) != NULL) { |
| 714 | TAILQ_REMOVE(&tunhead, tp, tun_list); |
| 715 | mtx_unlock(&tunmtx); |
| 716 | tun_destroy(tp); |
| 717 | mtx_lock(&tunmtx); |
| 718 | } |
| 719 | mtx_unlock(&tunmtx); |
| 720 | for (i = 0; i < nitems(tuntap_drivers); ++i) { |
| 721 | drv = &tuntap_drivers[i]; |
| 722 | delete_unrhdr(drv->unrhdr); |
| 723 | clone_cleanup(&drv->clones); |
| 724 | } |
| 725 | mtx_destroy(&tunmtx); |
| 726 | } |
| 727 | SYSUNINIT(tun_uninit, SI_SUB_PROTO_IF, SI_ORDER_ANY, tun_uninit, NULL); |
| 728 | |
| 729 | static struct tuntap_driver * |
nothing calls this directly
no test coverage detected