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; }
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(); }
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;);
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)); } } }