CWBool CWACSendFragments(int WTPIndex)
{
	int i;

	if (gWTPs[WTPIndex].messages == NULL)
		return CWErrorRaise(CW_ERROR_WRONG_ARG, NULL);

	for (i = 0; i < gWTPs[WTPIndex].messagesCount; i++) {
#ifdef CW_NO_DTLS
		if (!CWNetworkSendUnsafeUnconnected(gWTPs[WTPIndex].socket,
						    &gWTPs[WTPIndex].address,
						    gWTPs[WTPIndex].messages[i].msg,
						    gWTPs[WTPIndex].messages[i].offset)) {
#else
		if (!
		    (CWSecuritySend
		     (gWTPs[WTPIndex].session, gWTPs[WTPIndex].messages[i].msg, gWTPs[WTPIndex].messages[i].offset))) {
#endif
			return CW_FALSE;
		}
	}

	/*
	 * BUG - ML12
	 *
	 * 20/10/2009 - Donato Capitella
	 */
	CW_FREE_WTP_MSG_ARRAY(WTPIndex);

	CWLog("Message Sent\n");

	return CW_TRUE;
}

CWBool CWACResendAcknowledgedPacket(int WTPIndex)
{
	if (!CWACSendFragments(WTPIndex))
		return CW_FALSE;

	CWThreadSetSignals(SIG_BLOCK, 1, CW_SOFT_TIMER_EXPIRED_SIGNAL);
	if (!
	    (CWTimerRequest
	     (gCWRetransmitTimer, &(gWTPs[WTPIndex].thread), &(gWTPs[WTPIndex].currentPacketTimer),
	      CW_SOFT_TIMER_EXPIRED_SIGNAL))) {
		return CW_FALSE;
	}
	CWThreadSetSignals(SIG_UNBLOCK, 1, CW_SOFT_TIMER_EXPIRED_SIGNAL);

	return CW_TRUE;
}

__inline__ CWBool CWACSendAcknowledgedPacket(int WTPIndex, int msgType, int seqNum)
{
	gWTPs[WTPIndex].retransmissionCount = 0;
	gWTPs[WTPIndex].isRetransmitting = CW_TRUE;
	gWTPs[WTPIndex].responseType = msgType;
	gWTPs[WTPIndex].responseSeqNum = seqNum;
//  CWDebugLog("~~~~~~seq num in Send: %d~~~~~~", gWTPs[WTPIndex].responseSeqNum);
	return CWACResendAcknowledgedPacket(WTPIndex);
}
Example #2
0
CW_THREAD_RETURN_TYPE CWWTPFreqManager(void *arg) {
    int recSock, rlen;

    struct sockaddr_in servaddr, client_addr;
    socklen_t slen = sizeof(client_addr);

    char buffer[PACKET_SIZE];
    OFDMControlValues* freqValue;
    int current_chan=0;

    CWProtocolMessage *completeMsgPtr = NULL;

    CWThreadSetSignals(SIG_BLOCK, 1, SIGALRM);

    /* Create an Inet UDP socket for this thread (Receive freq/ack packets) */

    if ((recSock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {
        CWDebugLog("Thread Frequency Management: Error creating socket");
        CWExitThread();
    }

    /*  Set up address structure for server socket */

    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
    servaddr.sin_port = htons(SERVER_PORT);

    /* Binding Socket */

    if (bind(recSock, (struct sockaddr *) &servaddr, sizeof(struct sockaddr_in)) < 0) {
        CWDebugLog("Thread Frequency Management: Binding Socket Error");
        close(recSock);
        CWExitThread();
    }

    CW_REPEAT_FOREVER /* Receive data Loop */
    {
        memset(buffer, 0, PACKET_SIZE);
        rlen = 0;

        if ( ( rlen = recvfrom(recSock, buffer, PACKET_SIZE, 0, (struct sockaddr *) &client_addr, &slen) ) > 0 )
        {
            freqValue = (OFDMControlValues*) buffer;
            current_chan = freqValue->currentChan;
            if(!CWSetCurrentChannel(current_chan)) {
                CWLog("Thread Frequency Management: Failed to set current channel value.");
                continue;
            }

        }
    }

    CWDebugLog("Thread Frequency Management: Thread ended unexpectedly!!");
    close(recSock);
    CWExitThread();
}
Example #3
0
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);
	}
}
void CWACStopRetransmission(int WTPIndex)
{
	if (gWTPs[WTPIndex].isRetransmitting) {
		int i;
		CWDebugLog("Stop Retransmission");
		gWTPs[WTPIndex].isRetransmitting = CW_FALSE;
		CWThreadSetSignals(SIG_BLOCK, 1, CW_SOFT_TIMER_EXPIRED_SIGNAL);
		if (!CWTimerCancel(&(gWTPs[WTPIndex].currentPacketTimer))) {
			CWDebugLog("Error Cancelling a Timer... possible error!");
		}
		CWThreadSetSignals(SIG_UNBLOCK, 1, CW_SOFT_TIMER_EXPIRED_SIGNAL);
		gWTPs[WTPIndex].responseType = UNUSED_MSG_TYPE;
		gWTPs[WTPIndex].responseSeqNum = 0;

		for (i = 0; i < gWTPs[WTPIndex].messagesCount; i++) {
			CW_FREE_PROTOCOL_MESSAGE(gWTPs[WTPIndex].messages[i]);
		}

		CW_FREE_OBJECT(gWTPs[WTPIndex].messages);
//      CWDebugLog("~~~~~~ End of Stop Retransmission");
	}
}
CW_THREAD_RETURN_TYPE CWWTPReceiveFreqStats(void *arg)
{
	int recSock, rlen, k, fragmentsNum = 0;

	struct sockaddr_in servaddr, client_addr;
	socklen_t slen = sizeof(client_addr);

	char buffer[PACKET_SIZE];

	CWProtocolMessage *completeMsgPtr = NULL;
	CWProtocolMessage *data = NULL;
	CWBindingTransportHeaderValues *bindingValuesPtr = NULL;

	CWThreadSetSignals(SIG_BLOCK, 1, SIGALRM);

	/* Create an Inet UDP socket for this thread (Receive freq/ack packets) */

	if ( ( recSock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP) ) < 0 ) {
		CWDebugLog("Thread Frequency Receive Stats: Error creating socket");
		CWExitThread();
	}

	/*  Set up address structure for server socket */

	servaddr.sin_family = AF_INET;
	servaddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
	servaddr.sin_port = htons(SERVER_PORT);

	/* Binding Socket */

	if ( bind(recSock, (struct sockaddr *) &servaddr, sizeof(struct sockaddr_in)) < 0 ) {
		CWDebugLog("Thread Frequency Receive Stats: Binding Socket Error");
		close(recSock);
		CWExitThread();
	}

	CW_REPEAT_FOREVER /* Receive data Loop */
	{
		memset(buffer, 0, PACKET_SIZE);
		fragmentsNum = 0;
		k = 0;
		rlen = 0;

		if ( ( rlen = recvfrom(recSock, buffer, PACKET_SIZE, 0, (struct sockaddr *) &client_addr, &slen) ) > 0 )
		{
			/* Creation of stats/ack message for AC */

			CW_CREATE_OBJECT_ERR(data, CWProtocolMessage, return 0;);
			CW_CREATE_PROTOCOL_MESSAGE(*data, rlen, return 0;);
CW_THREAD_RETURN_TYPE CWWTPThread_read_data_from_hostapd(void *arg)
{
	/*
	   CWThreadMutexLock(&gRADIO_MAC_mutex);
	   gRADIO_MAC[0]=0xAA;
	   gRADIO_MAC[1]=0xBB;
	   gRADIO_MAC[2]=0xCC;
	   gRADIO_MAC[3]=0xDD;
	   gRADIO_MAC[4]=0xEE;
	   gRADIO_MAC[5]=0xFF;
	   CWThreadMutexUnlock(&gRADIO_MAC_mutex);
	*/
	int len;


#if defined(LOCALUDP)
	struct sockaddr_un server;
#else
#if defined(USEIPV6)
	struct sockaddr_in6 server;
#else
	struct sockaddr_in server;
#endif
#endif

	unsigned char buffer[CW_BUFFER_SIZE];
	int connect_ret;
	unsigned char cmd[10];

	CWProtocolMessage *frame = NULL;
	CWBindingDataListElement *listElement = NULL;

	CWThreadSetSignals(SIG_BLOCK, 1, SIGALRM);

#if defined(LOCALUDP)
	sock = socket(AF_UNIX, SOCK_DGRAM, 0);

#elif defined(NETUDP)
#if defined(USEIPV6)
	bzero(&server, sizeof(server));
	sock = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP);
#else
	memset(&server, 0, sizeof(server));
	sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
#endif

#else
#if defined(USEIPV6)
	bzero(&server, sizeof(server));
	sock = socket(AF_INET6, SOCK_SEQPACKET, IPPROTO_SCTP);
#else
	memset(&server, 0, sizeof(server));
	sock = socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);
#endif

#endif

	if (sock < 0) {
		CWDebugLog("WTP ipc HOSTAPD: Error creating socket");
		EXIT_FRAME_THREAD(sock);
	}

	CWDebugLog("WTP ipc HOSTAPD: Trying to connect to hostapd (wtp)...");

#if defined(LOCALUDP)
	server.sun_family = AF_UNIX;
	strcpy(server.sun_path, gHostapd_unix_path);
	unlink(server.sun_path);

	connect_ret = bind(sock, (struct sockaddr *)&server, strlen(server.sun_path) + sizeof(server.sun_family));

	client.sun_family = AF_UNIX;

#else
#if defined(USEIPV6)
	server.sin6_family = AF_INET6;
	server.sin6_port = gHostapd_port;
	server.sin6_addr = in6addr_any;
#else
	server.sin_family = AF_INET;
	server.sin_port = gHostapd_port;
	server.sin_addr.s_addr = INADDR_ANY;
#endif
	connect_ret = bind(sock, (struct sockaddr *)&server, sizeof(server));

#endif

	if (connect_ret == -1) {
		CWDebugLog("WTP ipc HOSTAPD: Error connect/bind to socket");
		EXIT_FRAME_THREAD(sock);
	}
#if defined(LOCALUDP)

#elif defined(NETUDP)

#else
	/* 1: Only one daemon Hostapd_WTP at time */
	if (listen(sock, 1) < 0) {
		CWDebugLog("WTP ipc HOSTAPD: Error listen ");
		EXIT_FRAME_THREAD(sock);
	}
#endif

#if defined(LOCALUDP)
	CWDebugLog("Waiting packet from Hostapd_WTP at Pipe:%s", gHostapd_unix_path);
#else
	CWDebugLog("Waiting packet from Hostapd_WTP at Port:%d", gHostapd_port);
#endif

        client.sin_family = AF_INET;
        client.sin_addr.s_addr = inet_addr("127.0.0.1");
        client.sin_port = htons(6444);

	address_size = sizeof(client);

	int sig_byte = 1;

#if defined(LOCALUDP)
	sig_byte += 5;
#endif

        CWDebugLog("Checking if hostapd is started already");
        cmd[0] = CONNECT_R;
        sendto(sock, cmd, 1, 0, (struct sockaddr *)&client, address_size);
        cmd[0] = WTPRINFO;      //Next info to get
        sendto(sock, cmd, 1, 0, (struct sockaddr *)&client, address_size);

	CW_REPEAT_FOREVER {

		len = recvfrom(sock, buffer, sizeof(buffer), 0, (struct sockaddr *)&client, &address_size);

#if defined(LOCALUDP)
		sprintf(client.sun_path, "%s%c%c%c%c%c", server.sun_path, buffer[1], buffer[2], buffer[3], buffer[4],
			buffer[5]);
#endif

		if (len <= 0) {
			EXIT_FRAME_THREAD(sock)
		}

		if (connected == 0 && buffer[0] != CONNECT && buffer[0] != WTPRINFO_R) {
			CWDebugLog("IPC packet - WTP is not in RUN state");
			CWWTPsend_command_to_hostapd_CLOSE(cmd, 10);
			continue;
		}

		if (buffer[0] == DATE_TO_AC) {

			if (!wtpInRunState)
				continue;

			if (!extract802_11_Frame(&frame, buffer + sig_byte, len - sig_byte)) {
				CWLog("THR FRAME: Error extracting a frame");
				EXIT_FRAME_THREAD(sock);
			}

			CWDebugLog("Send 802.11 management(len:%d) to AC", len - 1);

			CW_CREATE_OBJECT_ERR(listElement, CWBindingDataListElement, EXIT_FRAME_THREAD(sock);
			    );
			listElement->frame = frame;
			listElement->bindingValues = NULL;

			listElement->frame->data_msgType = CW_IEEE_802_11_FRAME_TYPE;

			CWLockSafeList(gFrameList);
			CWAddElementToSafeListTail(gFrameList, listElement, sizeof(CWBindingDataListElement));
			CWUnlockSafeList(gFrameList);

		} else if (buffer[0] == CONNECT) {
Example #7
0
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););
	}
Example #8
0
CW_THREAD_RETURN_TYPE CWACipc_with_ac_hostapd(void *arg){
	
	int tmp_WTPIndex = -1;
	
	int len;
	int k;
	
	#if defined(LOCALUDP)
		struct sockaddr_un server;
	#else
		#if defined(USEIPV6)
			struct sockaddr_in6 server;
		#else
			struct sockaddr_in server;
		#endif
	#endif

	unsigned char buffer[2048];
	int connect_ret;
	char cmd[10];
	
	CWProtocolMessage* frame=NULL;
	CWNetworkLev4Address address;
	CWThreadSetSignals(SIG_BLOCK, 1, SIGALRM);

    #if defined(LOCALUDP)
		sock = socket(AF_UNIX, SOCK_DGRAM, 0);
	
	#elif defined(NETUDP)
		#if defined(USEIPV6)
			bzero(&server, sizeof(server));
			sock = socket(AF_INET6,SOCK_DGRAM,IPPROTO_UDP);
		#else
			memset(&server, 0, sizeof(server));
			sock = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
		#endif
		
	#else
		#if defined(USEIPV6)
			bzero(&server, sizeof(server));
			sock = socket(AF_INET6,SOCK_SEQPACKET,IPPROTO_SCTP);
		#else
			memset(&server, 0, sizeof(server));
			sock = socket(AF_INET,SOCK_SEQPACKET,IPPROTO_SCTP);
		#endif

	#endif

    if (sock < 0) {
		CWDebugLog("AC ipc HOSTAPD: Error creating socket");
		EXIT_FRAME_THREAD(sock);
    }

  
    CWDebugLog("AC ipc HOSTAPD: Trying to connect to hostapd (AC)...");

	#if defined(LOCALUDP)
		server.sun_family = AF_UNIX;
		strcpy(server.sun_path, gHostapd_unix_path);
		unlink(server.sun_path);
		connect_ret = bind(sock, (struct sockaddr *)&server,  strlen(server.sun_path) + sizeof(server.sun_family));
	
	
    #else
		#if defined(USEIPV6)
			server.sin6_family = AF_INET6;
			server.sin6_port = gHostapd_port;
			server.sin6_addr = in6addr_any;
		#else
			server.sin_family = AF_INET;
			server.sin_port = gHostapd_port;
			server.sin_addr.s_addr = INADDR_ANY;
		#endif
		connect_ret = bind(sock,(struct sockaddr *)&server,sizeof(server));
		
	#endif
    
    if ( connect_ret == -1) {
		CWDebugLog("AC ipc HOSTAPD: Error connect to socket");
		EXIT_FRAME_THREAD(sock);
    }
    
   	#if defined(LOCALUDP)
   		
   	#elif defined(NETUDP)
   	
	#else
		if (listen(sock, CW_MAX_WTP) < 0){
			CWDebugLog("AC ipc HOSTAPD: Error listen ");
			EXIT_FRAME_THREAD(sock);
		}
	#endif


	int i=0;
	CWProtocolMessage *completeMsgPtr = NULL;
	int fragmentsNum = 0;
	CWMultiHomedSocket *sockPtr = &gACSocket;
	int dataSocket=0;

	#if defined(LOCALUDP)
		struct sockaddr_un client_tmp;
		client_tmp.sun_family = AF_UNIX;
	#else
		#if defined(USEIPV6)
			struct sockaddr_in6 client_tmp;
		#else
			struct sockaddr_in client_tmp;
		#endif
	#endif
	
	int address_size_tmp = sizeof(client_tmp);
	

	for(i=0; i<CW_MAX_WTP; i++){
		ch[i].associated = 0;
		#if defined(LOCALUDP)
			ch[i].client.sun_family = AF_UNIX;
			ch[i].address_size = sizeof(struct sockaddr_un);
		#else
			#if defined(USEIPV6)
				ch[i].client.sin6_port = 0;
			#else
				ch[i].client.sin_port = 0;
			#endif
		#endif

	}
	
	#if defined(LOCALUDP)
		CWLog("Accept Packet at pipe: %s",gHostapd_unix_path);
		
	#elif defined(NETUDP) 
		#if defined(USEIPV6)
			CWLog("Accept UDP v6 Packet at Port: %d",server.sin6_port);
		#else
			CWLog("Accept UDP v4 Packet at Port: %d",server.sin_port);
		#endif
		
	#else
		#if defined(USEIPV6)
			CWLog("Accept SCTP v6 Packet at Port: %d",server.sin6_port);
		#else
			CWLog("Accept SCTP v4 Packet at Port: %d",server.sin_port);
		#endif
		
	#endif
	
 	CW_REPEAT_FOREVER {

		tmp_WTPIndex = -1;
		len = recvfrom(sock, buffer, 3000, 0, (struct sockaddr *)&client_tmp, &address_size_tmp); 
		
		#if defined(LOCALUDP)
			sprintf(client_tmp.sun_path, "%s%c%c%c%c%c",server.sun_path, buffer[1],buffer[2],buffer[3],buffer[4],buffer[5]);
		#endif
		
		if(Exist_WTPs()==0){ 
			send_close_cmd(client_tmp,sizeof(client_tmp)); 	
			continue;	
		}

		if(len <= 0 ) { continue;	/* EXIT_FRAME_THREAD(sock) */	}
		
		for( i=0; i<CW_MAX_WTP; i++){
			
			#if defined(LOCALUDP)
					if( strcmp(client_tmp.sun_path,ch[i].client.sun_path)==0 ){
						tmp_WTPIndex = i;
						break;
					}
			#else
				#if defined(USEIPV6)
					if( (client_tmp.sin6_port == ch[i].client.sin6_port) && 
						(strncmp(client_tmp.sin6_addr.s6_addr,ch[i].client.sin6_addr.s6_addr,16)==0 )){
						tmp_WTPIndex = i;
					}
				#else
					if( (client_tmp.sin_port == ch[i].client.sin_port) && 
						(strcmp(inet_ntoa(client_tmp.sin_addr),inet_ntoa(ch[i].client.sin_addr))==0 )){
						tmp_WTPIndex = i;
					}
				#endif			
			#endif

		}
		
		if( tmp_WTPIndex<0 ){// Client not recognized
			
			int wtp_non_associated =  GetWTP_not_associated_to_Hostapd ();
			
			if( wtp_non_associated >= 0){
				
				if( buffer[0]==CONNECT ){
					ch[wtp_non_associated].live = 0;
					ch[wtp_non_associated].start_set_fase = 0;
					ch[wtp_non_associated].associated = 1;
					ch[wtp_non_associated].client = client_tmp;
					ch[wtp_non_associated].address_size = address_size_tmp;
					cmd[0] = CONNECT_R;
					sendto(sock, cmd, 1, 0, (struct sockaddr *)&ch[wtp_non_associated].client, ch[wtp_non_associated].address_size);
					CWLog("wtp_non_associated:%d",wtp_non_associated);
					
					#if defined(LOCALUDP)
						CWLog("Hostapd_AC Connect: %s", ch[wtp_non_associated].client.sun_path);
					#else
						#if defined(USEIPV6)
							CWLog("Hostapd_AC (v6) Connect: %d", ch[wtp_non_associated].client.sin6_port);
						#else
							CWLog("Hostapd_AC (v4) Connect: %s:%d",inet_ntoa(ch[wtp_non_associated].client.sin_addr), ch[wtp_non_associated].client.sin_port);
						#endif					
					#endif

					continue;
					
				}else{
					
					send_close_cmd(client_tmp,sizeof(client_tmp)); 
					continue;
					
				}
				
			}else{
				
				send_close_cmd(client_tmp,sizeof(client_tmp)); 
				continue;
				
			}
			
		}else{ // Client recognized
			int sig_byte = 1;

			#if defined(LOCALUDP)
				sig_byte = 6; //Code
			#endif
			
			if( buffer[0]==DATE_TO_WTP ){
				
				if (gWTPs[tmp_WTPIndex].currentState != CW_ENTER_RUN){
					CWDebugLog("AC %d is not in RUN State. The packet was dropped.",i);
					continue;
				}else if (len > (gWTPs[tmp_WTPIndex].pathMTU-20)){
					CWDebugLog("802.11 data length(%d) > MTU(%d)",len, gWTPs[tmp_WTPIndex].pathMTU);
					continue;
				}else{

					len = len - sig_byte; 

					CW_CREATE_OBJECT_ERR(frame, CWProtocolMessage, return 0;);
					CW_CREATE_PROTOCOL_MESSAGE(*frame, len, return 0;);
					
					memcpy(frame->msg, buffer + sig_byte , len);

					
					frame->offset=len;
					frame->data_msgType = CW_IEEE_802_11_FRAME_TYPE;
						
					if (!CWAssembleDataMessage(&completeMsgPtr, &fragmentsNum, gWTPs[tmp_WTPIndex].pathMTU, frame, NULL, CW_PACKET_PLAIN, 0)){
							for(k = 0; k < fragmentsNum; k++){
								CW_FREE_PROTOCOL_MESSAGE(completeMsgPtr[k]);
							}
							CW_FREE_OBJECT(completeMsgPtr);
							CW_FREE_PROTOCOL_MESSAGE(*frame);
							CW_FREE_OBJECT(frame);
							continue;
					}
						
					for(k = 0; k < sockPtr->count; k++) {
						  if (sockPtr->interfaces[k].sock == gWTPs[tmp_WTPIndex].socket){
						  dataSocket = sockPtr->interfaces[k].dataSock;
						  CW_COPY_NET_ADDR_PTR(&address,&(gWTPs[tmp_WTPIndex].dataaddress));
						  break;
						  }
					}

					if (dataSocket == 0){
						  CWDebugLog("data socket of WTP %d isn't ready.");
						  continue;
					}

					for (k = 0; k < fragmentsNum; k++){
						if(!CWNetworkSendUnsafeUnconnected(	dataSocket, &(address),completeMsgPtr[k].msg,completeMsgPtr[k].offset)){
							CWDebugLog("Failure sending Request");
							break;
						}
					}
					for (k = 0; k < fragmentsNum; k++){
						CW_FREE_PROTOCOL_MESSAGE(completeMsgPtr[k]);
					}
						
					CW_FREE_OBJECT(completeMsgPtr);				
					CW_FREE_PROTOCOL_MESSAGE(*(frame));
					CW_FREE_OBJECT(frame);
				}
				
			}else if( buffer[0]==SET_ADDR ){
Example #9
0
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;);