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);); }
void CWACInit() { int i; CWNetworkLev4Address *addresses = NULL; struct sockaddr_in *IPv4Addresses = NULL; CWLogInitFile(AC_LOG_FILE_NAME); #ifndef CW_SINGLE_THREAD CWDebugLog("Use Threads"); #else CWDebugLog("Don't Use Threads"); #endif CWErrorHandlingInitLib(); if(!CWParseSettingsFile()) { CWLog("Can't start AC"); exit(1); } CWLog("Starting AC"); CWThreadSetSignals(SIG_BLOCK, 1, SIGALRM); if (timer_init() == 0) { CWLog("Can't init timer module"); exit(1); } if(!CWErr(CWParseConfigFile()) || #ifndef CW_NO_DTLS !CWErr(CWSecurityInitLib()) || #endif !CWErr(CWNetworkInitSocketServerMultiHomed(&gACSocket, CW_CONTROL_PORT, gMulticastGroups, gMulticastGroupsCount)) || !CWErr(CWNetworkGetInterfaceAddresses(&gACSocket, &addresses, &IPv4Addresses)) || !CWErr(CWCreateThreadMutex(&gWTPsMutex)) || !CWErr(CWCreateThreadMutex(&gActiveWTPsMutex))) { /* error starting */ CWLog("Can't start AC"); exit(1); } #ifndef CW_NO_DTLS if(gACDescriptorSecurity == CW_X509_CERTIFICATE) { if(!CWErr(CWSecurityInitContext(&gACSecurityContext, "root.pem", "server.pem", "prova", CW_FALSE, CWACSemPostForOpenSSLHack))) { CWLog("Can't start AC"); exit(1); } } else { /* preshared */ if(!CWErr(CWSecurityInitContext(&gACSecurityContext, NULL, NULL, NULL, CW_FALSE, CWACSemPostForOpenSSLHack))) { CWLog("Can't start AC"); exit(1); } } #endif CW_FREE_OBJECTS_ARRAY(gMulticastGroups, gMulticastGroupsCount); for(i = 0; i < CW_MAX_WTP; i++) { gWTPs[i].isNotFree = CW_FALSE; } /* store network interface's addresses */ gInterfacesCount = CWNetworkCountInterfaceAddresses(&gACSocket); CWLog("Found %d Network Interface(s)", gInterfacesCount); if (gInterfacesCount<=0){ CWLog("Can't start AC"); exit(1); } CW_CREATE_ARRAY_ERR(gInterfaces, gInterfacesCount, CWProtocolNetworkInterface, CWLog("Out of Memory"); return;);