Does anybody ever seen a problem where recv API hangs after working for some time :
In our send API is working fine and the application running on PC(Connected to access point) is receiving a data properly but when I start doing transmission from PC application to CC3000, initiially it starts working fine and receives the data but after receiving few bytes (Range from 1- 100 bytes)it hangs in SimpleLinkWaitData function.
I tried to configure CC3000 to server as well as client but in both the case end result is same.
I have seen one more thing that till the time CC3000 device is receiving data properly and in this duration if I send a ping command from PC to CC3000 then it works smoothly but once CC3000 stop receiving a data then ping operation failed to complete.
I also use the setsockopt api to make recv function call non blocking when I configure CC3000 as a client but that does not help me to avoid frozen state of recv API call.
I am also attaching a source code, see if some one can trace anything wrong in it.
int initDriver(unsigned short patch) { ulCC3000DHCP = 0; ulCC3000Connected = 0; //ulSocket = 0; ulSmartConfigFinished=0; bEnableUnSolEvent = 0; wlan_init( CC3000_UsynchCallback,sendWLFWPatch, sendDriverPatch, sendBootLoaderPatch, ReadWlanInterruptPin, WlanInterruptEnable, WlanInterruptDisable, WriteWlanPin); wlan_start(patch); wlan_smart_config_set_prefix(aucCC3000_prefix); wlan_ioctl_set_connection_policy(0, 0, 0); wlan_set_event_mask(HCI_EVNT_WLAN_KEEPALIVE|HCI_EVNT_WLAN_UNSOL_INIT|HCI_EVNT_WLAN_ASYNC_PING_REPORT); ucStopSmartConfig = 0; bEnableUnSolEvent = 1;//Ebable timer to call hci_unsolicited_event_handler is every 500ms } void ServerSendRecv() { long sd = 0; sockaddr saddrClient,saddrServer; long socketStatus = 0; socklen_t tSoclength ; int clientDescriptor = -1; char dataSend[] = "INLINE6 WiFi Adapter TM"; char dataRecv[CC3000_MINIMAL_RX_SIZE]; unsigned long optval = 1000; int nNumOfBytesRecvd = 0; saddrClient.sa_family = AF_INET; saddrClient.sa_data[0] = 0x20;saddrClient.sa_data[1] = 0x1D; saddrClient.sa_data[2] = 0xC0; saddrClient.sa_data[3] = 0xA8;saddrClient.sa_data[4] = 0x00; saddrClient.sa_data[5] = 0x6C; saddrServer.sa_family = AF_INET; saddrServer.sa_data[0] = 0x20;saddrServer.sa_data[1] = 0x1D; saddrServer.sa_data[2] = 0x00; saddrServer.sa_data[3] = 0x00;saddrServer.sa_data[4] = 0x00; saddrServer.sa_data[5] = 0x00; if((sd = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)) < 0) return; if((socketStatus = bind(sd,&saddrServer,sizeof(saddrServer))) != 0) return; if((socketStatus = listen(sd,1)) != 0) return; tSoclength = sizeof(saddrClient); while(clientDescriptor < 0) { clientDescriptor = accept(sd,&saddrClient,&tSoclength); } MCF_GPIO_GPIO1_OUT |= MCF_GPIO_GPIO1_OUT_GPIO_OUT32; //LG2 -CAN1 LED while(1) { //socketStatus = send(clientDescriptor, dataSend , sizeof(dataSend), 0); //tx_thread_sleep(10); nNumOfBytesRecvd = recv(clientDescriptor,dataRecv ,CC3000_MINIMAL_RX_SIZE ,0); if(nNumOfBytesRecvd) { MCF_GPIO_GPIO1_OUT ^= MCF_GPIO_GPIO1_OUT_GPIO_OUT36; } tx_thread_sleep(10); } } void ClientSendRecv() { long sd = 0; sockaddr saddrClient; long socketStatus = 0; socklen_t tSoclength ; int clientDescriptor = -1; char dataSend[] = "INLINE6 WiFi Adapter TM"; char dataRecv[CC3000_MINIMAL_RX_SIZE]; unsigned long optval = 1000; saddrClient.sa_family = AF_INET; saddrClient.sa_data[0] = 0x20;saddrClient.sa_data[1] = 0x1D; saddrClient.sa_data[2] = 0xC0; saddrClient.sa_data[3] = 0xA8;saddrClient.sa_data[4] = 0x00; saddrClient.sa_data[5] = 0x6C; if((sd = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)) < 0) return; if((socketStatus = connect(sd,&saddrClient,sizeof(saddrClient)))!=0) return; if((socketStatus = setsockopt(sd,SOL_SOCKET,SOCKOPT_RECV_TIMEOUT,&optval, sizeof( optval ))) != 0 ) return; MCF_GPIO_GPIO_OUT |= MCF_GPIO_GPIO_OUT_GPIO_OUT29; //LG1 -CAN2 LED //MCF_GPIO_GPIO1_OUT |= MCF_GPIO_GPIO1_OUT_GPIO_OUT32; //LG2 -CAN1 LED while(1) { //send(sd, dataSend , sizeof(dataSend), 0); //tx_thread_sleep(10); socketStatus = recv(sd,dataRecv ,CC3000_MINIMAL_RX_SIZE ,0); if(socketStatus) { MCF_GPIO_GPIO1_OUT ^= MCF_GPIO_GPIO1_OUT_GPIO_OUT36; } tx_thread_sleep(10); //send(sd, dataSend , sizeof(dataSend), 0); } } int main() { init_spi(); initDriver(0); if( (lStatus1 = wlan_ioctl_del_profile(255)) != 0) break; lStatus1 = -1; if( (lStatus1 = nvmem_read_sp_version(patchversion)) != 0) break; wlan_connect(WLAN_SEC_UNSEC,(char*)"default",7,NULL,NULL,NULL); while ((ulCC3000Connected == 0) && (ulCC3000DHCP == 0)) { MCF_GPIO_GPIO_OUT |= MCF_GPIO_GPIO_OUT_GPIO_OUT16; //LG6 -WIFI LED } lStatus1 = 0; while(lStatus1 != 3) { lStatus1 = wlan_ioctl_statusget(); } ipconfig.aucIP[0] = 0x00; while(ipconfig.aucIP[0] == 0) { netapp_ipconfig(&ipconfig); } MCF_GPIO_GPIO1_OUT |= MCF_GPIO_GPIO1_OUT_GPIO_OUT37; //LG3 -J1708 LED //ServerSendRecv(); ClientSendRecv(); return 0; }
I am using a latest release of driver firmware (1.10)
int initDriver(unsigned short patch)
{
ulCC3000DHCP = 0;
ulCC3000Connected = 0;
//ulSocket = 0;
ulSmartConfigFinished=0;
bEnableUnSolEvent = 0;
wlan_init( CC3000_UsynchCallback,sendWLFWPatch, sendDriverPatch, sendBootLoaderPatch, ReadWlanInterruptPin, WlanInterruptEnable, WlanInterruptDisable, WriteWlanPin);
wlan_start(patch);
wlan_smart_config_set_prefix(aucCC3000_prefix);
wlan_ioctl_set_connection_policy(0, 0, 0);
wlan_set_event_mask(HCI_EVNT_WLAN_KEEPALIVE|HCI_EVNT_WLAN_UNSOL_INIT|HCI_EVNT_WLAN_ASYNC_PING_REPORT);
ucStopSmartConfig = 0;
bEnableUnSolEvent = 1;//Ebable timer to call hci_unsolicited_event_handler is every 500ms
}
void ServerSendRecv()
{
long sd = 0;
sockaddr saddrClient,saddrServer;
long socketStatus = 0;
socklen_t tSoclength ;
int clientDescriptor = -1;
char dataSend[] = "INLINE6 WiFi Adapter TM";
char dataRecv[CC3000_MINIMAL_RX_SIZE];
unsigned long optval = 1000;
int nNumOfBytesRecvd = 0;
saddrClient.sa_family = AF_INET;
saddrClient.sa_data[0] = 0x20;saddrClient.sa_data[1] = 0x1D; saddrClient.sa_data[2] = 0xC0;
saddrClient.sa_data[3] = 0xA8;saddrClient.sa_data[4] = 0x00; saddrClient.sa_data[5] = 0x6C;
saddrServer.sa_family = AF_INET;
saddrServer.sa_data[0] = 0x20;saddrServer.sa_data[1] = 0x1D; saddrServer.sa_data[2] = 0x00;
saddrServer.sa_data[3] = 0x00;saddrServer.sa_data[4] = 0x00; saddrServer.sa_data[5] = 0x00;
if((sd = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)) < 0)
return;
if((socketStatus = bind(sd,&saddrServer,sizeof(saddrServer))) != 0)
return;
if((socketStatus = listen(sd,1)) != 0)
return;
tSoclength = sizeof(saddrClient);
while(clientDescriptor < 0)
{
clientDescriptor = accept(sd,&saddrClient,&tSoclength);
}
MCF_GPIO_GPIO1_OUT |= MCF_GPIO_GPIO1_OUT_GPIO_OUT32; //LG2 -CAN1 LED
while(1)
{
//socketStatus = send(clientDescriptor, dataSend , sizeof(dataSend), 0);
//tx_thread_sleep(10);
nNumOfBytesRecvd = recv(clientDescriptor,dataRecv ,CC3000_MINIMAL_RX_SIZE ,0);
if(nNumOfBytesRecvd)
{
MCF_GPIO_GPIO1_OUT ^= MCF_GPIO_GPIO1_OUT_GPIO_OUT36;
}
tx_thread_sleep(10);
}
}
void ClientSendRecv()
{
long sd = 0;
sockaddr saddrClient;
long socketStatus = 0;
socklen_t tSoclength ;
int clientDescriptor = -1;
char dataSend[] = "INLINE6 WiFi Adapter TM";
char dataRecv[CC3000_MINIMAL_RX_SIZE];
unsigned long optval = 1000;
saddrClient.sa_family = AF_INET;
saddrClient.sa_data[0] = 0x20;saddrClient.sa_data[1] = 0x1D; saddrClient.sa_data[2] = 0xC0;
saddrClient.sa_data[3] = 0xA8;saddrClient.sa_data[4] = 0x00; saddrClient.sa_data[5] = 0x6C;
if((sd = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)) < 0)
return;
if((socketStatus = connect(sd,&saddrClient,sizeof(saddrClient)))!=0)
return;
if((socketStatus = setsockopt(sd,SOL_SOCKET,SOCKOPT_RECV_TIMEOUT,&optval, sizeof( optval ))) != 0 )
return;
MCF_GPIO_GPIO_OUT |= MCF_GPIO_GPIO_OUT_GPIO_OUT29; //LG1 -CAN2 LED
//MCF_GPIO_GPIO1_OUT |= MCF_GPIO_GPIO1_OUT_GPIO_OUT32; //LG2 -CAN1 LED
while(1)
{
//send(sd, dataSend , sizeof(dataSend), 0);
//tx_thread_sleep(10);
socketStatus = recv(sd,dataRecv ,CC3000_MINIMAL_RX_SIZE ,0);
if(socketStatus)
{
MCF_GPIO_GPIO1_OUT ^= MCF_GPIO_GPIO1_OUT_GPIO_OUT36;
}
tx_thread_sleep(10);
//send(sd, dataSend , sizeof(dataSend), 0);
}
}
int main()
{
init_spi();
initDriver(0);
if( (lStatus1 = wlan_ioctl_del_profile(255)) != 0)
break;
lStatus1 = -1;
if( (lStatus1 = nvmem_read_sp_version(patchversion)) != 0)
break;
wlan_connect(WLAN_SEC_UNSEC,(char*)"default",7,NULL,NULL,NULL);
while ((ulCC3000Connected == 0) && (ulCC3000DHCP == 0))
{
MCF_GPIO_GPIO_OUT |= MCF_GPIO_GPIO_OUT_GPIO_OUT16; //LG6 -WIFI LED
}
lStatus1 = 0;
while(lStatus1 != 3)
{
lStatus1 = wlan_ioctl_statusget();
}
ipconfig.aucIP[0] = 0x00;
while(ipconfig.aucIP[0] == 0)
{
netapp_ipconfig(&ipconfig);
}
MCF_GPIO_GPIO1_OUT |= MCF_GPIO_GPIO1_OUT_GPIO_OUT37; //LG3 -J1708 LED
//ServerSendRecv();
ClientSendRecv();
return 0;
}