Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
kern_return_t
remove_kern_control(void)
{
    errno_t error = 0;
    // remove kernel control
    error = ctl_deregister(g_ctl_ref);
    switch (error)
    {
        case 0:
            return KERN_SUCCESS;
        case EINVAL:
        {
#if DEBUG
            printf("[ERROR] The kernel control reference is invalid.\n");
#endif
            return KERN_FAILURE;
        }
        case EBUSY:
        {
#if DEBUG
            printf("[ERROR] The kernel control has clients still attached.\n");
#endif
            return KERN_FAILURE;
        }
        default:
            return KERN_FAILURE;
    }
}
Exemplo n.º 3
0
kern_return_t
remove_kern_control(void)
{
    errno_t error = 0;
    // remove kernel control
    error = ctl_deregister(g_ctl_ref);
    switch (error)
    {
        case 0:
        {
            return KERN_SUCCESS;
        }
        case EINVAL:
        {
            LOG_ERROR("The kernel control reference is invalid.");
            return KERN_FAILURE;
        }
        case EBUSY:
        {
            LOG_ERROR("The kernel control still has clients attached. Please disconnect them first!");
            return KERN_FAILURE;
        }
        default:
            return KERN_FAILURE;
    }
}