| 745 | } |
| 746 | |
| 747 | static int |
| 748 | tuntapmodevent(module_t mod, int type, void *data) |
| 749 | { |
| 750 | struct tuntap_driver *drv; |
| 751 | int i; |
| 752 | |
| 753 | switch (type) { |
| 754 | case MOD_LOAD: |
| 755 | mtx_init(&tunmtx, "tunmtx", NULL, MTX_DEF); |
| 756 | for (i = 0; i < nitems(tuntap_drivers); ++i) { |
| 757 | drv = &tuntap_drivers[i]; |
| 758 | clone_setup(&drv->clones); |
| 759 | drv->unrhdr = new_unrhdr(0, IF_MAXUNIT, &tunmtx); |
| 760 | } |
| 761 | arrival_tag = EVENTHANDLER_REGISTER(ifnet_arrival_event, |
| 762 | tunrename, 0, 1000); |
| 763 | if (arrival_tag == NULL) |
| 764 | return (ENOMEM); |
| 765 | clone_tag = EVENTHANDLER_REGISTER(dev_clone, tunclone, 0, 1000); |
| 766 | if (clone_tag == NULL) |
| 767 | return (ENOMEM); |
| 768 | break; |
| 769 | case MOD_UNLOAD: |
| 770 | /* See tun_uninit, so it's done after the vnet_sysuninit() */ |
| 771 | break; |
| 772 | default: |
| 773 | return EOPNOTSUPP; |
| 774 | } |
| 775 | return 0; |
| 776 | } |
| 777 | |
| 778 | static moduledata_t tuntap_mod = { |
| 779 | "if_tuntap", |
nothing calls this directly
no test coverage detected