Esempio n. 1
0
kern_return_t SocketForward_start(kmod_info_t* ki, void* d)
{
    kern_return_t ret = KERN_SUCCESS;

    pp("启动");

    if (alloc_locks() != 0) {
        ret = KERN_FAILURE;
        goto finally;
    }
    
    ret = sf_init();
    if (ret != 0) {
        goto finally;
    }

    ret = sflt_register(&sf_sflt_filter, PF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (ret == 0) {
        pp("sflt_register 注册, 返回 %d.", ret);
    } else {
        pp("sflt_register 注册失败, 返回 %d.", ret);
        goto finally;
    }
    return ret;
    
    g_filter_registered = TRUE;

finally:
    
    sflt_unregister(SF_HANDLE);

    free_locks();

    return ret;
}
Esempio n. 2
0
static
void pp_filter_deregister_handle(sflt_handle h, int *event)
{
    struct timespec ts = {2, 0};

    if (0 == sflt_unregister(h)) {
        // Wait for unregister to complete
        while (0 == *event) {
            if (ETIMEDOUT != msleep(event, NULL, PWAIT, __FUNCTION__, &ts))
                break;
        }
    }
}
Esempio n. 3
0
void IOWebFilterClass::stop (IOService *provider)
{
    IOLog("IOKitTest::stop\n");

    if(_queue)
    {
        _queue->release();
    }

    sflt_unregister(IPV4_SFLT_HANDLE);

    super::stop(provider);
}
Esempio n. 4
0
kern_return_t SocketForward_stop(kmod_info_t* ki, void* d)
{
    kern_return_t ret = KERN_SUCCESS;

    if (g_filter_registered == TRUE && !g_filter_unregister_started) {
        sflt_unregister(SF_HANDLE);
        g_filter_unregister_started = TRUE;
    }
    if (g_filter_registered == TRUE) {
        pp("正在忙,无法卸载");
        return EBUSY;
    }

    free_locks();

    return ret;
}
Esempio n. 5
0
//unregister socket filters
kern_return_t unregisterSocketFilters()
{
    //status
    kern_return_t status = kIOReturnError;
    
    //dbg msg
    IOLog("LULU: in %s\n", __FUNCTION__);
    
    //sanity check
    if( (false == gRegisteredTCPIPV4) ||
        (false == gRegisteredUDPIPV4) ||
        (false == gRegisteredTCPIPV6) ||
        (false == gRegisteredUDPIPV6) )
    {
        //err msg
        IOLog("LULU ERROR: socket filters already unregistered (%d/%d/%d/%d)\n", gRegisteredTCPIPV4, gRegisteredUDPIPV4, gRegisteredTCPIPV6, gRegisteredUDPIPV6);
        
        //bail
        goto bail;
    }
    
    //TCP IPV4
    // when filter's been registered & not currently unregistering
    // ->invoke sflt_unregister to unregister, and set global flag
    if( (true == gRegisteredTCPIPV4) &&
        (true != gUnregisteringTCPIPV4))
    {
        //unregister
        sflt_unregister(FLT_TCPIPV4_HANDLE);
        
        //set global flag
        gUnregisteringTCPIPV4 = true;
    }
    
    //UDP IPV4
    // when filter's been registered & not currently unregistering
    // ->invoke sflt_unregister to unregister, and set global flag
    if( (true == gRegisteredUDPIPV4) &&
        (true != gUnregisteringUDPIPV4))
    {
        //unregister
        sflt_unregister(FLT_UDPIPV4_HANDLE);
        
        //set global flag
        gUnregisteringUDPIPV4 = true;
    }
    
    //TCP IPV6
    // when filter's been registered & not currently unregistering
    // ->invoke sflt_unregister to unregister, and set global flag
    if( (true == gRegisteredTCPIPV6) &&
        (true != gUnregisteringTCPIPV6))
    {
        //unregister
        sflt_unregister(FLT_TCPIPV6_HANDLE);
        
        //set global flag
        gUnregisteringTCPIPV6 = true;
    }
    
    //UDP IPV6
    // when filter's been registered & not currently unregistering
    // ->invoke sflt_unregister to unregister, and set global flag
    if( (true == gRegisteredUDPIPV6) &&
        (true != gUnregisteringUDPIPV6))
    {
        //unregister
        sflt_unregister(FLT_UDPIPV6_HANDLE);
        
        //set global flag
        gUnregisteringUDPIPV6 = true;
    }

    //filter still registered?
    if( (true == gRegisteredTCPIPV4) ||
        (true == gRegisteredUDPIPV4) ||
        (true == gRegisteredTCPIPV6) ||
        (true == gRegisteredUDPIPV6) )
    {
        //err msg
        IOLog("LULU ERROR: socket filter(s) still registered %d/%d/%d/%d\n", gRegisteredTCPIPV4, gRegisteredUDPIPV4, gRegisteredTCPIPV6, gRegisteredUDPIPV6);
        
        //set error
        status = EBUSY;
        
        //bail
        goto bail;
    }
    
    //happy
    status = kIOReturnSuccess;
    
bail:
    
    return status;
}