/**
 * Module event handler, called from netgraph subsystem.
 */
static int vboxnetflt_modevent(struct module *pMod, int enmEventType, void *pvArg)
{
    int rc;

    Log(("VBoxNetFltFreeBSDModuleEvent\n"));

    switch (enmEventType)
    {
    case MOD_LOAD:
        rc = RTR0Init(0);
        if (RT_FAILURE(rc))
        {
            printf("RTR0Init failed %d\n", rc);
            return RTErrConvertToErrno(rc);
        }

        memset(&g_VBoxNetFltGlobals, 0, sizeof(VBOXNETFLTGLOBALS));
        rc = vboxNetFltInitGlobalsAndIdc(&g_VBoxNetFltGlobals);
        if (RT_FAILURE(rc))
        {
            printf("vboxNetFltInitGlobalsAndIdc failed %d\n", rc);
            return RTErrConvertToErrno(rc);
        }
        /* No MODULE_VERSION in ng_ether so we can't MODULE_DEPEND it */
        kern_kldload(curthread, "ng_ether", NULL);
        break;

    case MOD_UNLOAD:
        rc = vboxNetFltTryDeleteIdcAndGlobals(&g_VBoxNetFltGlobals);
        memset(&g_VBoxNetFltGlobals, 0, sizeof(VBOXNETFLTGLOBALS));
        RTR0Term();
        break;

    case MOD_SHUTDOWN:
    case MOD_QUIESCE:
    default:
        return EOPNOTSUPP;
    }

    if (RT_SUCCESS(rc))
        return 0;
    return RTErrConvertToErrno(rc);
}
Exemple #2
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;
}