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; }
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; } } }
void IOWebFilterClass::stop (IOService *provider) { IOLog("IOKitTest::stop\n"); if(_queue) { _queue->release(); } sflt_unregister(IPV4_SFLT_HANDLE); super::stop(provider); }
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; }
//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; }