errno_t utun_register_control(void) { struct kern_ctl_reg kern_ctl; errno_t result = 0; /* Create a tag to allocate memory */ utun_malloc_tag = OSMalloc_Tagalloc(UTUN_CONTROL_NAME, OSMT_DEFAULT); /* Find a unique value for our interface family */ result = mbuf_tag_id_find(UTUN_CONTROL_NAME, &utun_family); if (result != 0) { printf("utun_register_control - mbuf_tag_id_find_internal failed: %d\n", result); return result; } bzero(&kern_ctl, sizeof(kern_ctl)); strlcpy(kern_ctl.ctl_name, UTUN_CONTROL_NAME, sizeof(kern_ctl.ctl_name)); kern_ctl.ctl_name[sizeof(kern_ctl.ctl_name) - 1] = 0; kern_ctl.ctl_flags = CTL_FLAG_PRIVILEGED | CTL_FLAG_REG_EXTENDED; /* Require root */ kern_ctl.ctl_sendsize = 512 * 1024; kern_ctl.ctl_recvsize = 512 * 1024; kern_ctl.ctl_connect = utun_ctl_connect; kern_ctl.ctl_disconnect = utun_ctl_disconnect; kern_ctl.ctl_send = utun_ctl_send; kern_ctl.ctl_setopt = utun_ctl_setopt; kern_ctl.ctl_getopt = utun_ctl_getopt; kern_ctl.ctl_rcvd = utun_ctl_rcvd; utun_ctl_init_crypto(); result = ctl_register(&kern_ctl, &utun_kctlref); if (result != 0) { printf("utun_register_control - ctl_register failed: %d\n", result); return result; } /* Register the protocol plumbers */ if ((result = proto_register_plumber(PF_INET, utun_family, utun_attach_proto, NULL)) != 0) { printf("utun_register_control - proto_register_plumber(PF_INET, %d) failed: %d\n", utun_family, result); ctl_deregister(utun_kctlref); return result; } /* Register the protocol plumbers */ if ((result = proto_register_plumber(PF_INET6, utun_family, utun_attach_proto, NULL)) != 0) { proto_unregister_plumber(PF_INET, utun_family); ctl_deregister(utun_kctlref); printf("utun_register_control - proto_register_plumber(PF_INET6, %d) failed: %d\n", utun_family, result); return result; } return 0; }
/** * Start the kernel module. */ static kern_return_t VBoxNetFltDarwinStart(struct kmod_info *pKModInfo, void *pvData) { int rc; /* * Initialize IPRT and find our module tag id. * (IPRT is shared with VBoxDrv, it creates the loggers.) */ rc = RTR0Init(0); if (RT_SUCCESS(rc)) { Log(("VBoxNetFltDarwinStart\n")); errno_t err = mbuf_tag_id_find("org.VirtualBox.kext.VBoxFltDrv", &g_idTag); if (!err) { /* * Initialize the globals and connect to the support driver. * * This will call back vboxNetFltOsOpenSupDrv (and maybe vboxNetFltOsCloseSupDrv) * for establishing the connect to the support driver. */ memset(&g_VBoxNetFltGlobals, 0, sizeof(g_VBoxNetFltGlobals)); rc = vboxNetFltInitGlobalsAndIdc(&g_VBoxNetFltGlobals); if (RT_SUCCESS(rc)) { LogRel(("VBoxFltDrv: version " VBOX_VERSION_STRING " r%d\n", VBOX_SVN_REV)); return KMOD_RETURN_SUCCESS; } LogRel(("VBoxFltDrv: failed to initialize device extension (rc=%d)\n", rc)); } else LogRel(("VBoxFltDrv: mbuf_tag_id_find failed, err=%d\n", err)); RTR0Term(); } else printf("VBoxFltDrv: failed to initialize IPRT (rc=%d)\n", rc); memset(&g_VBoxNetFltGlobals, 0, sizeof(g_VBoxNetFltGlobals)); return KMOD_RETURN_FAILURE; }