Пример #1
0
int CWWTPSendFrame(unsigned char *buf, int len){
    int FRAME_80211_LEN=24;
    int gRawSockLocal;
    struct sockaddr_ll addr;
    
    if ((gRawSockLocal=socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL)))<0) 	{
		CWDebugLog("THR FRAME: Error creating socket");
		CWExitThread();
	}

    memset(&addr, 0, sizeof(addr));
	addr.sll_family = AF_PACKET;
//	addr.sll_protocol = htons(ETH_P_ALL);
//	addr.sll_pkttype = PACKET_HOST;
	addr.sll_ifindex = if_nametoindex("monitor0"); //if_nametoindex(gRadioInterfaceName_0);
 
	 
	if ((bind(gRawSockLocal, (struct sockaddr*)&addr, sizeof(addr)))<0) {
 		CWDebugLog("THR FRAME: Error binding socket");
 		CWExitThread();
 	}
 	
    if( send(gRawSockLocal, buf + FRAME_80211_LEN, len - FRAME_80211_LEN,0) < 1 ){
        CWDebugLog("Error to send frame on raw socket");
        return -1;
    }
    CWDebugLog("Send (%d) bytes on raw socket",len - FRAME_80211_LEN);

    return 1;
    
}
Пример #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();
}
Пример #3
0
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;);
Пример #4
0
void CW80211ManagementFrameEvent(struct nl_handle **handleMgmt, cw_sock_handler handler, void * cb, struct WTPBSSInfo * BSSInfo)
{
	//Set file descriptor of socket to non-blocking state
	nl_socket_set_nonblocking(*handleMgmt);
	int nlSocketFDmgmt = nl_socket_get_fd(*handleMgmt);
	CWBool exitThread=CW_FALSE;
	
	while(1)
	{
		//On delete BSS
		CWThreadMutexLock(&(BSSInfo->bssMutex));
		exitThread = BSSInfo->destroyBSS;
		CWThreadMutexUnlock(&(BSSInfo->bssMutex));
		if(exitThread == CW_TRUE)
			CWExitThread();
			
		int result;
		fd_set readset;
		do {
		   FD_ZERO(&readset);
		   FD_SET(nlSocketFDmgmt, &readset);
		   result = select(nlSocketFDmgmt + 1, &readset, NULL, NULL, NULL);
		} while (result == -1 && errno == EINTR);
		
		if (result > 0) {
		   if (FD_ISSET(nlSocketFDmgmt, &readset)) {
			 handler(cb, (*handleMgmt));
		   }   
		}
		else if (result < 0) {
		   CWLog("Error on select(): %s", strerror(errno));
		}
	}			     
}