[Bugfix][API-616][network] lynq_set_state_buffer_valid_period_of_network set exception value, no error return
Change-Id: Id05a3493e98ecfd375b4dcf0e96e2e2c3936f97c
diff --git a/lib/liblynq-network/lynq_network.cpp b/lib/liblynq-network/lynq_network.cpp
index cca772f..7d33b31 100755
--- a/lib/liblynq-network/lynq_network.cpp
+++ b/lib/liblynq-network/lynq_network.cpp
@@ -51,7 +51,303 @@
LYLOGSET(LOG_INFO);
LYLOGEINIT(USER_LOG_TAG);
- int ret;
+ client.uToken = network_Global_uToken;
+ network_Global_uToken=(network_Global_uToken+1)%10000;/*0-10000*/
+ client.request = request_id;
+ client.paramLen = argc;
+ bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
+ if(argc!=0)
+ {
+ va_list args;
+ va_start(args, format);
+ vsnprintf(client.param, LYNQ_REQUEST_PARAM_BUF, format, args);
+ va_end(args);
+ }
+ LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
+ pthread_mutex_lock(&g_lynq_network_sendto_mutex);
+ if(g_inner_test==0)
+ {
+ send_num = sendto(network_sock_fd,&client,sizeof(client),0,(struct sockaddr *)&network_addr_serv,network_len_addr_serv);
+ }
+ else
+ {
+ send_num = 1;
+ g_inner_test = 0;
+ }
+ pthread_mutex_unlock(&g_lynq_network_sendto_mutex);
+
+ if(send_num <= 0)
+ {
+ LYERRLOG("send request fail, send num is %d", send_num);
+ return -1;
+ }
+ ret = waitResponse(p, client.uToken,time_out);
+
+ return ret;
+}
+
+
+int wait_signal_changes()
+{
+ int ret = 0;
+ pthread_mutex_lock(&signal_state_change_mutex);
+ ret = pthread_cond_wait(&signal_state_change_cond,&signal_state_change_mutex);
+ pthread_mutex_unlock(&signal_state_change_mutex);
+ return 0;
+}
+
+void send_signal_changes()
+{
+ pthread_mutex_lock(&signal_state_change_mutex);
+ pthread_cond_signal(&signal_state_change_cond);
+ pthread_mutex_unlock(&signal_state_change_mutex);
+ return;
+}
+
+/**@ a thread just for recv\buffer solicited msg's response and notice waiting thread
+* @param p [IN]: no meaning
+* @return
+* always null
+*/
+void *thread_rc_recv(void *p)
+{
+ Parcel* rc_p;
+ std::list<Parcel*>::iterator iter;
+ int resp_type = -1;
+ char rc_data[LYNQ_REC_BUF];
+ int rc_len;
+ int null_cnt=0;
+ int wakeup_token;
+
+ LYINFLOG("rc thread is running");
+ while(network_rc_status)
+ {
+ bzero(rc_data,LYNQ_REC_BUF);
+ while(true)
+ {
+ rc_len = recvfrom(network_sock_fd,rc_data,sizeof(rc_data),0,(struct sockaddr *)&network_addr_serv,(socklen_t *)&network_len_addr_serv);
+ if(rc_len<sizeof(int32_t)*2)
+ {
+ LYERRLOG("%s recv len %d less %d",__func__, rc_len,sizeof(int)*2);
+ continue;
+ }
+ rc_p= new Parcel;
+ if(rc_p==NULL)
+ {
+ null_cnt++;
+ LYERRLOG("%s rc_p is NULL, cnt is %d",__func__, null_cnt);
+ if(null_cnt>20)
+ {
+ goto rc_recv_end;
+ }
+ continue;
+ }
+ else
+ {
+ null_cnt=0;
+ }
+
+ rc_p->setData((uint8_t *)rc_data,rc_len); // p.setData((uint8_t *) buffer, buflen);
+ rc_p->setDataPosition(0);
+ if(rc_p->dataAvail()>0)
+ {
+ rc_p->readInt32(&resp_type);
+ rc_p->readInt32(&wakeup_token);
+ BLOCK_RC_MSG_LOCK();
+ g_recv_parcel_list.push_back(rc_p);
+ LYINFLOG("%s wakeup token is %d, list size is %d!",__func__,wakeup_token,g_recv_parcel_list.size());
+ if(g_recv_parcel_list.size()>20) //max 20
+ {
+ iter=g_recv_parcel_list.begin();
+ (*iter)->setDataPosition(0);
+ (*iter)->readInt32(&resp_type);
+ (*iter)->readInt32(&wakeup_token);
+ delete (*(g_recv_parcel_list.begin()));
+ LYERRLOG("%s wakeup token %d is deleted!",__func__,wakeup_token);
+ g_recv_parcel_list.erase(iter);
+ }
+ BLOCK_WAKEUP_RECV_MSG();
+ BLOCK_RC_MSG_UNLOCK();
+ break;
+ }
+ else
+ {
+ LYERRLOG("%s rc_p data Avail %d not greater than 0",__func__, rc_p->dataAvail());
+ delete rc_p;
+ }
+ }
+ }
+
+rc_recv_end:
+ return NULL;
+}
+
+void *thread_urc_recv(void *p)
+{
+ Parcel *urc_p =NULL;
+ char urc_data[LYNQ_REC_BUF];
+ int resp_type = -1;
+ int urc_id = -1;
+ int res = 0;
+ int none = 0;
+ int NR_sum = 0;
+ int urc_LTE_signalstrength = 0;
+ int urc_WCDMA_signalstrength = 0;
+ LYINFLOG("urc thread is running");
+ while(network_urc_status)
+ {
+ bzero(urc_data,LYNQ_REC_BUF);
+ res = recvfrom(network_urc_sock_fd,urc_data,sizeof(urc_data),0,(struct sockaddr *)&network_urc_addr_serv,(socklen_t*)&network_len_urc_addr_serv);
+ if(res<=0)
+ {
+ LYERRLOG("thread_urc_recv step2 fail:");
+ break;
+ }
+ urc_p = new Parcel();
+ if(urc_p == NULL)
+ {
+ LYERRLOG("new parcel failure!!!");
+ break;
+ }
+ urc_p->setData((uint8_t *)urc_data,res); // p.setData((uint8_t *) buffer, buflen);
+ urc_p->setDataPosition(0);
+ if(urc_p->dataAvail()>0)
+ {
+ urc_p->readInt32(&resp_type);
+ urc_p->readInt32(&urc_id);
+ urc_p->readInt32(&network_urc_slot_id);
+ switch(urc_id)
+ {
+ case RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED:
+ {
+ set_state_buffer_valid(NETWORK_STATE_BUFFER_TYPE_VOICE_REG,false);
+ network_wait_urc_id = urc_id;
+ LYINFLOG("slot_id = %d",network_urc_slot_id);
+ send_signal_changes();
+ break;
+ }
+ case RIL_UNSOL_RESPONSE_PS_NETWORK_STATE_CHANGED:
+ {
+ set_state_buffer_valid(NETWORK_STATE_BUFFER_TYPE_DATA_REG,false);
+ network_wait_urc_id = urc_id;
+ LYINFLOG("slot_id = %d",network_urc_slot_id);
+ send_signal_changes();
+ break;
+ }
+ case RIL_UNSOL_RESPONSE_IMS_NETWORK_STATE_CHANGED:
+ {
+ set_state_buffer_valid(NETWORK_STATE_BUFFER_TYPE_IMS_REG,false);
+ network_wait_urc_id = urc_id;
+ LYINFLOG("slot_id = %d",network_urc_slot_id);
+ send_signal_changes();
+ break;
+ }
+ case RIL_UNSOL_SIGNAL_STRENGTH:
+ {
+ urc_p->readInt32(&network_urc_solSigStren.rssi);
+ if((network_urc_solSigStren.rssi!=99)&&(network_urc_solSigStren.rssi!=0))
+ {
+ network_urc_solSigStren.gw_sig_valid = 1;
+ }else{
+ network_urc_solSigStren.gw_sig_valid = 0;
+ }
+ if(network_urc_solSigStren.gw_sig_valid == 1)
+ {
+ LYINFLOG("urc_GSM_signalstrength:%d",network_urc_solSigStren.rssi);
+ }
+ urc_p->readInt32(&none);
+ urc_p->readInt32(&none);
+ urc_p->readInt32(&none);
+ urc_p->readInt32(&none);
+ urc_p->readInt32(&none);
+ urc_p->readInt32(&none);
+ urc_p->readInt32(&none);
+ urc_p->readInt32(&urc_LTE_signalstrength);
+ // p.readInt32(&solSigStren->signalStrength.LTE_SignalStrength.signalStrength);
+ urc_p->readInt32(&network_urc_solSigStren.rsrp);
+ urc_p->readInt32(&network_urc_solSigStren.rsrq);
+ urc_p->readInt32(&network_urc_solSigStren.rssnr);
+ if((urc_LTE_signalstrength!=99)&&(urc_LTE_signalstrength!=0))
+ {
+ network_urc_solSigStren.lte_sig_valid = 1;
+ }else{
+ network_urc_solSigStren.lte_sig_valid = 0;
+ }
+ if(network_urc_solSigStren.lte_sig_valid == 1)
+ {
+ LYINFLOG("urc_LTE_signalstrength:%d",urc_LTE_signalstrength);
+ }
+ urc_p->readInt32(&none);
+ urc_p->readInt32(&none);
+ urc_p->readInt32(&none);
+ urc_p->readInt32(&none);
+ urc_p->readInt32(&none);
+ urc_p->readInt32(&urc_WCDMA_signalstrength);
+ urc_p->readInt32(&none);
+ urc_p->readInt32(&network_urc_solSigStren.rscp);
+ urc_p->readInt32(&network_urc_solSigStren.ecno);
+ if((urc_WCDMA_signalstrength!=99)&&(urc_WCDMA_signalstrength!=0))
+ {
+ network_urc_solSigStren.wcdma_sig_valid = 1;
+ }else{
+ network_urc_solSigStren.wcdma_sig_valid = 0;
+ }
+ if(network_urc_solSigStren.wcdma_sig_valid == 1)
+ {
+ LYINFLOG("urc_WCDMA_signalstrength:%d",urc_WCDMA_signalstrength);
+ }
+ urc_p->readInt32(&network_urc_solSigStren.ssRsrp);
+ urc_p->readInt32(&network_urc_solSigStren.ssRsrq);
+ urc_p->readInt32(&network_urc_solSigStren.ssSinr);
+ urc_p->readInt32(&network_urc_solSigStren.csiRsrp);
+ urc_p->readInt32(&network_urc_solSigStren.csiRsrq);
+ urc_p->readInt32(&network_urc_solSigStren.csiSinr);
+ NR_sum = (network_urc_solSigStren.ssRsrp) + (network_urc_solSigStren.ssRsrq) + (network_urc_solSigStren.ssSinr) + (network_urc_solSigStren.csiRsrp)+\
+ (network_urc_solSigStren.csiRsrq) + (network_urc_solSigStren.csiSinr);
+ if(NR_sum != 0)
+ {
+ network_urc_solSigStren.nr_sig_valid = 1;
+ }else{
+ network_urc_solSigStren.nr_sig_valid = 0;
+ }
+ if(network_urc_solSigStren.nr_sig_valid == 1)
+ {
+ LYINFLOG("[NR signal]ssRsrp is %d , ssRsrq is %d , ssSinr is %d , csiRsrp is %d , csiRsrq is %d , csiSinr is %d",\
+ network_urc_solSigStren.ssRsrp,network_urc_solSigStren.ssRsrq,network_urc_solSigStren.ssSinr, \
+ network_urc_solSigStren.csiRsrp,network_urc_solSigStren.csiRsrq,network_urc_solSigStren.csiSinr);
+ }
+ network_wait_urc_id = urc_id;
+ send_signal_changes();
+ break;
+ }
+ }
+ }
+ delete urc_p;
+ urc_p = NULL;
+ }
+ return NULL;
+}
+
+int lynq_server_socket_start()
+{
+// struct timeval timeOut;
+ network_sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
+ if(-1 == network_sock_fd)
+ {
+ LYERRLOG("socket open error");
+ return -1;
+ }
+# if 0
+ timeOut.tv_sec = 5;
+ timeOut.tv_usec = 0;
+ if (setsockopt(network_sock_fd, SOL_SOCKET, SO_RCVTIMEO, &timeOut, sizeof(timeOut)) < 0)
+ {
+ LYERRLOG("time out setting failed\n");
+ return -1;
+ }
+#endif
+
+ LYINFLOG("network_sock_fd = %d",network_sock_fd);
init_network_timer_all();
@@ -507,14 +803,46 @@
p->readInt32(&num);
if(num == 15)
{
- for(i=0;i<15;i++)
+ p->readInt32(&num);
+ if(num == 15)
+ {
+ *regState = atoi(lynqStrdupReadString(p));
+ lynqStrdupReadString(p);
+ lynqStrdupReadString(p);
+ *netType = atoi(lynqStrdupReadString(p));
+ lynqStrdupReadString(p);
+ lynqStrdupReadString(p);
+ lynqStrdupReadString(p);
+ lynqStrdupReadString(p);
+ lynqStrdupReadString(p);
+ lynqStrdupReadString(p);
+ lynqStrdupReadString(p);
+ lynqStrdupReadString(p);
+ lynqStrdupReadString(p);
+ lynqStrdupReadString(p);
+ *netRejected = atoi(lynqStrdupReadString(p));
+ set_state_to_buf(NETWORK_STATE_BUFFER_TYPE_VOICE_REG,3,*regState,*netType,*netRejected,0);
+ }
+ else
{
resp[i]=lynqStrdupReadString(p);
}
- *regState = atoi(resp[0]);
- *netType = atoi(resp[3]);
- *netRejected = atoi(resp[14]);
- for(i=0;i<15;i++)
+ }
+ else if(!strcmp(str,"DATA")){
+ p->readInt32(&num);
+ if(num == 11)
+ {
+ char *resp[LYNQ_RESP_BUF];
+ *regState = atoi(lynqStrdupReadString(p));
+ resp[0] = lynqStrdupReadString(p);
+ strcpy(LAC,resp[0]);
+
+ resp[1] = lynqStrdupReadString(p);
+ strcpy(CID,resp[1]);
+ *netType = atoi(lynqStrdupReadString(p));
+ set_state_to_buf(NETWORK_STATE_BUFFER_TYPE_DATA_REG,2,*regState,*netType,2,LAC,CID);
+ }
+ else
{
if(resp[i]!=NULL)
{
@@ -536,13 +864,11 @@
{
for(i=0;i<4;i++)
{
- resp[i]=lynqStrdupReadString(p);
- }
- *regState = atoi(resp[0]);
- strcpy(LAC,resp[1]);
- strcpy(CID,resp[2]);
- *netType = atoi(resp[3]);
- for(i=0;i<4;i++)
+ p->readInt32(imsRegState);
+ p->readInt32(radioTechFam);
+ set_state_to_buf(NETWORK_STATE_BUFFER_TYPE_IMS_REG,2,*imsRegState,*radioTechFam,0);
+ }
+ else
{
if(resp[i]!=NULL)
{