void CWCreateConnectionWithHostapdAC() { CWThread thread_ipc_with_ac_hostapd; if (!CWErr(CWCreateThread(&thread_ipc_with_ac_hostapd, CWACipc_with_ac_hostapd, NULL))) { CWLog("Error starting Thread that receive command and 802.11 frame from hostapd (WTP side)"); exit(1); } }
void CWACEnterMainLoop() { struct sigaction act; CWLog("AC enters in the MAIN_LOOP"); /* set signals * all the thread we spawn will inherit these settings */ /* * BUG UMR03 * * 20/10/2009 - Donato Capitella */ sigemptyset(&act.sa_mask); act.sa_flags = 0; /* called when a timer requested by the thread has expired */ act.sa_handler = CWCriticalTimerExpiredHandler; sigaction(CW_CRITICAL_TIMER_EXPIRED_SIGNAL, &act, NULL); act.sa_flags = 0; /* called when a timer requested by the thread has expired */ act.sa_handler = CWSoftTimerExpiredHandler; sigaction(CW_SOFT_TIMER_EXPIRED_SIGNAL, &act, NULL); /* signals will be unblocked by the threads that needs timers */ CWThreadSetSignals(SIG_BLOCK, 2, CW_CRITICAL_TIMER_EXPIRED_SIGNAL, CW_SOFT_TIMER_EXPIRED_SIGNAL); if(!(CWThreadCreateSpecific(&gIndexSpecific, NULL))) { CWLog("Critical Error With Thread Data"); exit(1); } CWThread thread_interface; if(!CWErr(CWCreateThread(&thread_interface, CWInterface, NULL))) { CWLog("Error starting Interface Thread"); exit(1); } CW_REPEAT_FOREVER { /* CWACManageIncomingPacket will be called * when a new packet is ready to be read */ if(!CWErr(CWNetworkUnsafeMultiHomed(&gACSocket, CWACManageIncomingPacket, CW_FALSE))) exit(1); } }
int main (int argc, const char * argv[]) { /* Daemon Mode */ pid_t pid; if (argc <= 1) printf("Usage: WTP working_path\n"); if ((pid = fork()) < 0) exit(1); else if (pid != 0) exit(0); else { setsid(); if (chdir(argv[1]) != 0){ printf("chdir Faile\n"); exit(1); } fclose(stdout); } CWStateTransition nextState = CW_ENTER_DISCOVERY; CWLogInitFile(WTP_LOG_FILE_NAME); #ifndef CW_SINGLE_THREAD CWDebugLog("Use Threads"); #else CWDebugLog("Don't Use Threads"); #endif CWErrorHandlingInitLib(); if(!CWParseSettingsFile()){ CWLog("Can't start WTP"); exit(1); } /* Capwap receive packets list */ if (!CWErr(CWCreateSafeList(&gPacketReceiveList))) { CWLog("Can't start WTP"); exit(1); } /* Capwap receive frame list */ if (!CWErr(CWCreateSafeList(&gFrameList))) { CWLog("Can't start WTP"); exit(1); } CWCreateThreadMutex(&gInterfaceMutex); CWSetMutexSafeList(gPacketReceiveList, &gInterfaceMutex); CWSetMutexSafeList(gFrameList, &gInterfaceMutex); CWCreateThreadCondition(&gInterfaceWait); CWSetConditionSafeList(gPacketReceiveList, &gInterfaceWait); CWSetConditionSafeList(gFrameList, &gInterfaceWait); CWLog("Starting WTP..."); CWRandomInitLib(); CWThreadSetSignals(SIG_BLOCK, 1, SIGALRM); if (timer_init() == 0) { CWLog("Can't init timer module"); exit(1); } #ifdef CW_NO_DTLS if( !CWErr(CWWTPLoadConfiguration()) ) { #else if( !CWErr(CWSecurityInitLib()) || !CWErr(CWWTPLoadConfiguration()) ) { #endif CWLog("Can't start WTP"); exit(1); } CWDebugLog("Init WTP Radio Info"); if(!CWWTPInitConfiguration()) { CWLog("Error Init Configuration"); exit(1); } #ifdef SOFTMAC CWThread thread_ipc_with_wtp_hostapd; if(!CWErr(CWCreateThread(&thread_ipc_with_wtp_hostapd, CWWTPThread_read_data_from_hostapd, NULL))) { CWLog("Error starting Thread that receive command and 802.11 frame from hostapd (WTP side)"); exit(1); } #endif CWThread thread_receiveFrame; if(!CWErr(CWCreateThread(&thread_receiveFrame, CWWTPReceiveFrame, NULL))) { CWLog("Error starting Thread that receive binding frame"); exit(1); } CWThread thread_receiveStats; if(!CWErr(CWCreateThread(&thread_receiveStats, CWWTPReceiveStats, NULL))) { CWLog("Error starting Thread that receive stats on monitoring interface"); exit(1); } /**************************************** * 2009 Update: * * Spawn Frequency Stats * * Receiver Thread * ****************************************/ CWThread thread_receiveFreqStats; if(!CWErr(CWCreateThread(&thread_receiveFreqStats, CWWTPReceiveFreqStats, NULL))) { CWLog("Error starting Thread that receive frequency stats on monitoring interface"); exit(1); } /* if AC address is given jump Discovery and use this address for Joining */ if(gWTPForceACAddress != NULL) nextState = CW_ENTER_JOIN; /* start CAPWAP state machine */ CW_REPEAT_FOREVER { switch(nextState) { case CW_ENTER_DISCOVERY: nextState = CWWTPEnterDiscovery(); break; case CW_ENTER_SULKING: nextState = CWWTPEnterSulking(); break; case CW_ENTER_JOIN: nextState = CWWTPEnterJoin(); break; case CW_ENTER_CONFIGURE: nextState = CWWTPEnterConfigure(); break; case CW_ENTER_DATA_CHECK: nextState = CWWTPEnterDataCheck(); break; case CW_ENTER_RUN: nextState = CWWTPEnterRun(); break; case CW_ENTER_RESET: /* * CWStopHeartbeatTimer(); * CWStopNeighborDeadTimer(); * CWNetworkCloseSocket(gWTPSocket); * CWSecurityDestroySession(gWTPSession); * CWSecurityDestroyContext(gWTPSecurityContext); * gWTPSecurityContext = NULL; * gWTPSession = NULL; */ nextState = CW_ENTER_DISCOVERY; break; case CW_QUIT: CWWTPDestroy(); return 0; } } } __inline__ unsigned int CWGetSeqNum() { static unsigned int seqNum = 0; if (seqNum==CW_MAX_SEQ_NUM) seqNum=0; else seqNum++; return seqNum; } __inline__ int CWGetFragmentID() { static int fragID = 0; return fragID++; } /* * Parses config file and inits WTP configuration. */ CWBool CWWTPLoadConfiguration() { int i; CWLog("WTP Loads Configuration"); /* get saved preferences */ if(!CWErr(CWParseConfigFile())) { CWLog("Can't Read Config File"); exit(1); } if(gCWACCount == 0) return CWErrorRaise(CW_ERROR_NEED_RESOURCE, "No AC Configured"); CW_CREATE_ARRAY_ERR(gCWACList, gCWACCount, CWACDescriptor, return CWErrorRaise(CW_ERROR_OUT_OF_MEMORY, NULL);); for(i = 0; i < gCWACCount; i++) { CWDebugLog("Init Configuration for AC at %s", gCWACAddresses[i]); CW_CREATE_STRING_FROM_STRING_ERR(gCWACList[i].address, gCWACAddresses[i], return CWErrorRaise(CW_ERROR_OUT_OF_MEMORY, NULL);); }