[feature][T8TSK-4] Optimize the network module, provide state buffer variables
Change-Id: Ied5f06519095cdfc88789f2a6e8b728e29b73c48
diff --git a/meta/meta-mediatek-mt2735/recipes-lynq/liblynq-network/liblynq-network.bb b/meta/meta-mediatek-mt2735/recipes-lynq/liblynq-network/liblynq-network.bb
index 67011b4..33f9346 100755
--- a/meta/meta-mediatek-mt2735/recipes-lynq/liblynq-network/liblynq-network.bb
+++ b/meta/meta-mediatek-mt2735/recipes-lynq/liblynq-network/liblynq-network.bb
@@ -16,6 +16,7 @@
'TARGET_PLATFORM = ${TARGET_PLATFORM}'"
FILES_${PN} = "${base_libdir}/*.so "
+FILES_${PN} += "/data/ril/network"
FILES_${PN}-dev = "/test \
${includedir}"
@@ -48,7 +49,8 @@
if [ -d "${WORKONSRC}" ] ; then
install -d ${D}${includedir}/lynq_network
- cp -arf ${S}/include/lynq_network ${D}${includedir}/lynq_network
+ cp -arf ${S}/include/lynq_network ${D}${includedir}/lynq_network
+ install -d ${D}/data/ril/network
fi
}
diff --git a/src/lynq/lib/liblynq-network/include/lynq_network/lynq_network.h b/src/lynq/lib/liblynq-network/include/lynq_network/lynq_network.h
index 505fdc9..1f0a32b 100755
--- a/src/lynq/lib/liblynq-network/include/lynq_network/lynq_network.h
+++ b/src/lynq/lib/liblynq-network/include/lynq_network/lynq_network.h
@@ -71,6 +71,12 @@
int lynq_set_ims(const int ims_mode);
int lynq_wait_signalchanges(int *handle);
int lynq_get_urc_info(const int handle,signalStrength_t *solSigStren,int *slot_id);
+void lynq_set_voice_registration_valid_period(int valid_period);
+void lynq_set_data_registration_valid_period(int valid_period);
+void lynq_set_ims_registration_valid_period(int valid_period);
+int lynq_get_voice_registration_valid_period();
+int lynq_get_data_registration_valid_period();
+int lynq_get_ims_registration_valid_period();
#ifdef MODEM_GEN97
/**@brief set or get OOS recover timer interval
* @param mode [IN] <mode>:
diff --git a/src/lynq/lib/liblynq-network/lynq_network.cpp b/src/lynq/lib/liblynq-network/lynq_network.cpp
index 3752455..7c86433 100755
--- a/src/lynq/lib/liblynq-network/lynq_network.cpp
+++ b/src/lynq/lib/liblynq-network/lynq_network.cpp
@@ -13,6 +13,7 @@
#include "lynq_network.h"
#include "liblog/lynq_deflog.h"
+#include "lynq_network_state_buffer.h"
#define LYNQ_SERVICE_PORT 8088
#define LYNQ_URC_SERVICE_PORT 8086
#define LYNQ_URC_ADDRESS "0.0.0.0"
@@ -202,14 +203,31 @@
urc_p->readInt32(&network_urc_slot_id);
switch(urc_id)
{
- case 1002: //RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED
+ case RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED:
{
+ set_register_voice_buffer_valid(FALSE);
network_wait_urc_id = urc_id;
LYINFLOG("slot_id = %d",network_urc_slot_id);
send_signal_changes();
break;
}
- case 1009: //RIL_UNSOL_SIGNAL_STRENGTH
+ case RIL_UNSOL_RESPONSE_PS_NETWORK_STATE_CHANGED:
+ {
+ set_register_data_buffer_valid(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_register_ims_buffer_valid(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))
@@ -290,6 +308,7 @@
}
}
}
+ return NULL;
}
@@ -380,6 +399,8 @@
LYLOGEINIT(USER_LOG_TAG);
int ret = 0;
+ init_network_timer_all();
+
ret = lynq_server_socket_start();
if(ret !=0)
{
@@ -539,6 +560,9 @@
}
g_lynq_network_init_flag = 0;
network_urc_status = 0;
+
+ deinit_network_timer_all();
+
return 0;
}
@@ -823,10 +847,22 @@
strUpper(str);
if(!strcmp(str,"VOICE"))
{
+ if(lynq_get_registration_state_to_buf_voice(regState,netType,netRejected)==0)
+ {
+ return 0;
+ }
client_t.request = RIL_REQUEST_VOICE_REGISTRATION_STATE;
}else if(!strcmp(str,"DATA")){
+ if(lynq_get_registration_state_to_buf_data(regState,LAC,CID,netType)==0)
+ {
+ return 0;
+ }
client_t.request = RIL_REQUEST_DATA_REGISTRATION_STATE;
}else if(!strcmp(str,"IMS")){
+ if(lynq_get_registration_state_to_buf_ims(imsRegState,radioTechFam)==0)
+ {
+ return 0;
+ }
client_t.request = RIL_REQUEST_IMS_REGISTRATION_STATE;
}else{
LYERRLOG("request error");
@@ -882,7 +918,8 @@
lynqStrdupReadString(p);
lynqStrdupReadString(p);
lynqStrdupReadString(p);
- *netRejected = atoi(lynqStrdupReadString(p));
+ *netRejected = atoi(lynqStrdupReadString(p));
+ lynq_set_registration_state_to_buf_voice(*regState,*netType,*netRejected);
}
}else if(!strcmp(str,"DATA")){
p.readInt32(&num);
@@ -895,6 +932,7 @@
resp[1] = lynqStrdupReadString(p);
strcpy(CID,resp[1]);
*netType = atoi(lynqStrdupReadString(p));
+ lynq_set_registration_state_to_buf_data(*regState,LAC,CID,*netType);
}
}else if(!strcmp(str,"IMS")){
@@ -903,6 +941,7 @@
{
p.readInt32(imsRegState);
p.readInt32(radioTechFam);
+ lynq_set_registration_state_to_buf_ims(*imsRegState,*radioTechFam);
}
}else{
LYERRLOG("request error");
diff --git a/src/lynq/lib/liblynq-network/lynq_network_state_buffer.cpp b/src/lynq/lib/liblynq-network/lynq_network_state_buffer.cpp
new file mode 100755
index 0000000..c682870
--- /dev/null
+++ b/src/lynq/lib/liblynq-network/lynq_network_state_buffer.cpp
@@ -0,0 +1,580 @@
+#include <stdio.h>
+#include <sys/types.h>
+#include <string.h>
+#include <unistd.h>
+#include <pthread.h>
+#include <signal.h>
+#include <errno.h>
+#include <fcntl.h>
+#include "liblog/lynq_deflog.h"
+#include "lynq_network.h"
+#include "lynq_network_state_buffer.h"
+
+#define USER_LOG_TAG "LYNQ_NETWORK"
+
+typedef struct{
+ int voice_valid_period;
+ int data_valid_period;
+ int ims_valid_period;
+}lynq_network_register_buf_cfg;
+
+lynq_network_register_buf_cfg s_register_cfg;
+static timer_t s_register_timer_voice;
+static timer_t s_register_timer_data;
+static timer_t s_register_timer_ims;
+static int register_sig_value_voice = 2;
+static int register_sig_value_data = 3;
+static int register_sig_value_ims = 4;
+static int s_register_voice_valid=false;
+static int s_register_data_valid=false;
+static int s_register_ims_valid=false;
+static pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;
+#define VOICE_REG_BUFFER_FILE "/data/ril/network/.network_register_voice_buffer"
+#define DATA_REG_BUFFER_FILE "/data/ril/network/.network_register_data_buffer"
+#define IMS_REG_BUFFER_FILE "/data/ril/network/.network_register_ims_buffer"
+#define REG_CONFIG_FILE "/data/ril/network/.network_cfg"
+
+void get_network_register_timer_length_from_file()
+{
+ int fd_backup;
+ int ret;
+ memset(&s_register_cfg,0,sizeof (s_register_cfg));
+ fd_backup = open(REG_CONFIG_FILE,O_RDONLY | O_CREAT,0777);
+ if (fd_backup < 0) {
+ LYERRLOG("when get, Error opening register cfg file: %s\n",strerror(errno));
+ return;
+ }
+
+ ret = read(fd_backup,&s_register_cfg,sizeof (s_register_cfg));
+ if(ret<=0)
+ {
+ LYERRLOG("%s get register cfg fail, ret is %d",__func__,ret);
+ }
+ else
+ {
+ LYINFLOG("%s get register cfg suc %d",__func__);
+ }
+ close(fd_backup);
+
+ return;
+}
+
+void set_network_register_timer_length_to_file()
+{
+ int fd_backup;
+ int ret;
+ fd_backup = open(REG_CONFIG_FILE,O_WRONLY | O_CREAT,0777);
+ if (fd_backup < 0) {
+ LYERRLOG("when set, Error opening register cfg file: %s\n",strerror(errno));
+ return;
+ }
+
+ ret = write(fd_backup,&s_register_cfg,sizeof (s_register_cfg));
+ if(ret<=0)
+ {
+ LYERRLOG("%s set register cfg fail, ret is %d",__func__,ret);
+ }
+ else
+ {
+ LYINFLOG("%s set register cfg suc %d",__func__);
+ }
+ close(fd_backup);
+
+ return;
+}
+
+void set_register_voice_buffer_valid(int valid)
+{
+ s_register_voice_valid = valid;
+ if(valid==false)
+ {
+ stop_network_timer(s_register_timer_voice, register_sig_value_voice);
+ }
+}
+
+void set_register_data_buffer_valid(int valid)
+{
+ s_register_data_valid = valid;
+ if(valid==false)
+ {
+ stop_network_timer(s_register_timer_data, register_sig_value_data);
+ }
+}
+
+void set_register_ims_buffer_valid(int valid)
+{
+ s_register_ims_valid = valid;
+ if(valid==false)
+ {
+ stop_network_timer(s_register_timer_ims, register_sig_value_ims);
+ }
+}
+
+void start_network_timer(timer_t timer, int signal_value, int milliseconds) {
+ LYINFLOG("start_network_timer(), timer_id=%ld, signal_value=%d, time=%d",(long)timer, signal_value, milliseconds);
+
+ struct itimerspec expire;
+ expire.it_interval.tv_sec = 0;
+ expire.it_interval.tv_nsec = 0;
+ expire.it_value.tv_sec = milliseconds/1000;
+ expire.it_value.tv_nsec = (milliseconds%1000)*1000000;
+ if (timer_settime(timer, 0, &expire, NULL) == -1) {
+ LYERRLOG("timer_settime failed reason=[%s]", strerror(errno));
+ }
+}
+
+void stop_network_timer(timer_t timer, int signal_value) {
+ LYINFLOG("stop_network_timer(), timer_id=%ld, signal_value=%d", (long)timer, signal_value);
+ struct itimerspec timespec;
+ if(timer_gettime(timer, ×pec) == -1) {
+ LYERRLOG("stop_network_timer(), get time fail(%s)", strerror(errno));
+ return;
+ }
+ LYINFLOG("stop_network_timer(), tv_sec=%ld, tv_nsec=%ld",timespec.it_value.tv_sec, timespec.it_value.tv_nsec);
+ if((timespec.it_value.tv_sec == 0) && (timespec.it_value.tv_nsec == 0) ) {
+ LYINFLOG("stop_network_timer(), timer_id(%ld) had stopped, just return", (long)timer);
+ return;
+ } else {
+ start_network_timer(timer, signal_value, 0);
+ }
+}
+
+void network_timer_handler(sigval_t sig) {
+ LYINFLOG("network_timer_handler, sig_value: %d", sig.sival_int);
+ int s;
+ s = pthread_mutex_lock(&mtx);
+ if(s != 0) {
+ LYERRLOG("network_timer_handler, pthead_mutex_lock fail");
+ }
+ if(sig.sival_int == register_sig_value_voice)
+ {
+ s_register_voice_valid=false;
+ }
+ else if(sig.sival_int == register_sig_value_data)
+ {
+ s_register_data_valid=false;
+ }
+ else if(sig.sival_int == register_sig_value_ims)
+ {
+ s_register_ims_valid=false;
+ }
+ s = pthread_mutex_unlock(&mtx);
+ if(s != 0) {
+ LYERRLOG("network_timer_handler, pthread_mutex_unlock fail");
+ }
+}
+
+void init_network_timer(timer_t* timer, int signal_value)
+{
+ struct sigevent sevp;
+ memset(&sevp, 0, sizeof(sevp));
+ sevp.sigev_value.sival_int = signal_value;
+ sevp.sigev_notify = SIGEV_THREAD;
+ sevp.sigev_notify_function = network_timer_handler;
+
+ if(timer_create(CLOCK_MONOTONIC, &sevp, timer) == -1) {
+ LYERRLOG("init_network_timer() failed reason=[%s]", strerror(errno));
+ }
+ LYINFLOG("init_network_timer(), timer_Id = %ld, signal_value=%d", (long)(*timer), signal_value);
+}
+
+void init_network_timer_all() {
+ init_network_timer(&s_register_timer_voice,register_sig_value_voice);
+ init_network_timer(&s_register_timer_data,register_sig_value_data);
+ init_network_timer(&s_register_timer_ims,register_sig_value_ims);
+ s_register_voice_valid = false;
+ s_register_data_valid = false;
+ s_register_ims_valid = false;
+
+ get_network_register_timer_length_from_file();
+}
+
+void deinit_network_timer_all()
+{
+ stop_network_timer(s_register_timer_voice, register_sig_value_voice);
+ stop_network_timer(s_register_timer_data, register_sig_value_data);
+ stop_network_timer(s_register_timer_ims, register_sig_value_ims);
+ s_register_voice_valid = false;
+ s_register_data_valid = false;
+ s_register_ims_valid = false;
+}
+
+void lynq_set_registration_state_to_buf_voice(int regState,int netType,int netRejected)
+{
+ int ret;
+ int fd_backup;
+
+ if(s_register_cfg.voice_valid_period<=0)
+ {
+ LYINFLOG("%s timer length is not greater than 0",__func__);
+ return;
+ }
+
+ fd_backup = open(VOICE_REG_BUFFER_FILE,O_WRONLY | O_CREAT,0777);
+
+ if (fd_backup < 0) {
+ LYERRLOG("Error opening registrate voice buffer file: %s\n",strerror(errno));
+ return ;
+ }
+
+ ret = write(fd_backup,®State,sizeof (regState));
+ if(ret<=0)
+ {
+ LYERRLOG("%s set regState fail, ret is %d",__func__, ret);
+ goto error_done;
+ }
+
+ ret = write(fd_backup,&netType,sizeof (netType));
+ if(ret<=0)
+ {
+ LYERRLOG("%s set netType fail, ret is %d",__func__, ret);
+ goto error_done;
+ }
+
+ ret = write(fd_backup,&netRejected,sizeof (netRejected));
+ if(ret<=0)
+ {
+ LYERRLOG("%s set netRejected fail, ret is %d",__func__, ret);
+ goto error_done;
+ }
+
+ sync();
+ close(fd_backup);
+ start_network_timer(s_register_timer_voice,register_sig_value_voice,s_register_cfg.voice_valid_period*1000);
+ s_register_voice_valid=true;
+
+ LYINFLOG("set_registration_state voice suc, regState is %d, netType is %d, netRejected is %d",regState,netType,netRejected);
+ return;
+
+error_done:
+
+ close(fd_backup);
+ return;
+}
+void lynq_set_registration_state_to_buf_data(int regState,char * LAC,char * CID,int netType)
+{
+ int ret;
+ int stringLen;
+ int fd_backup;
+
+ if(s_register_cfg.data_valid_period <=0)
+ {
+ LYINFLOG("%s timer length is not greater than 0",__func__);
+ return;
+ }
+
+ fd_backup = open(DATA_REG_BUFFER_FILE,O_WRONLY | O_CREAT,0777);
+
+ if (fd_backup < 0) {
+ LYERRLOG("Error opening registrate data buffer file: %s\n",strerror(errno));
+ return ;
+ }
+
+ ret = write(fd_backup,®State,sizeof (regState));
+ if(ret<=0)
+ {
+ LYERRLOG("%s set regState fail, ret is %d",__func__, ret);
+ goto error_done;
+ }
+
+ ret = write(fd_backup,&netType,sizeof (netType));
+ if(ret<=0)
+ {
+ LYERRLOG("%s set netType fail, ret is %d",__func__, ret);
+ goto error_done;
+ }
+
+ stringLen=strlen(LAC)+1;
+ ret = write(fd_backup,&stringLen,sizeof (stringLen));
+ if(ret<=0)
+ {
+ LYERRLOG("%s set lac stringLen %d fail, ret is %d",__func__, stringLen, ret);
+ goto error_done;
+ }
+
+ ret = write(fd_backup,LAC,stringLen);
+ if(ret<=0)
+ {
+ LYERRLOG("%s set lac fail, ret is %d",__func__, ret);
+ goto error_done;
+ }
+
+ stringLen=strlen(CID)+1;
+ ret = write(fd_backup,&stringLen,sizeof (stringLen));
+ if(ret<=0)
+ {
+ LYERRLOG("%s set cid stringLen %d fail, ret is %d",__func__, stringLen, ret);
+ goto error_done;
+ }
+
+ ret = write(fd_backup,CID,stringLen);
+ if(ret<=0)
+ {
+ LYERRLOG("%s set cid fail, ret is %d",__func__, ret);
+ goto error_done;
+ }
+
+ sync();
+ close(fd_backup);
+ start_network_timer(s_register_timer_data,register_sig_value_data,s_register_cfg.data_valid_period*1000);
+ s_register_data_valid=true;
+
+ LYINFLOG("set_registration_state data suc, regState is %d, netType is %d, LAC is %s, CID is %s",regState,netType,LAC,CID);
+ return;
+
+error_done:
+
+ close(fd_backup);
+ return;
+}
+void lynq_set_registration_state_to_buf_ims(int imsRegState,int radioTechFam)
+{
+ int ret;
+ int fd_backup;
+
+ if(s_register_cfg.ims_valid_period<=0)
+ {
+ LYINFLOG("%s timer length is not greater than 0",__func__);
+ return;
+ }
+
+ fd_backup = open(IMS_REG_BUFFER_FILE,O_WRONLY | O_CREAT,0777);
+
+ if (fd_backup < 0) {
+ LYERRLOG("Error opening registrate ims buffer file: %s\n",strerror(errno));
+ return ;
+ }
+
+ ret = write(fd_backup,&imsRegState,sizeof (imsRegState));
+ if(ret<=0)
+ {
+ LYERRLOG("%s set imsRegState fail, ret is %d",__func__, ret);
+ goto error_done;
+ }
+
+ ret = write(fd_backup,&radioTechFam,sizeof (radioTechFam));
+ if(ret<=0)
+ {
+ LYERRLOG("%s set radioTechFam fail, ret is %d",__func__, ret);
+ goto error_done;
+ }
+
+ sync();
+ close(fd_backup);
+ start_network_timer(s_register_timer_ims,register_sig_value_ims,s_register_cfg.ims_valid_period*1000);
+ s_register_ims_valid=true;
+
+ LYINFLOG("set_registration_state ims suc, imsRegState is %d, radioTechFam is %d",imsRegState,radioTechFam);
+ return;
+
+error_done:
+
+ close(fd_backup);
+ return;
+}
+
+int lynq_get_registration_state_to_buf_voice(int* regState,int *netType,int *netRejected)
+{
+ int ret;
+ int fd_backup;
+
+ if(!s_register_voice_valid)
+ {
+ LYINFLOG("registration voice buffer is false");
+ return 1;
+ }
+
+ fd_backup = open(VOICE_REG_BUFFER_FILE, O_RDONLY);
+
+ if (fd_backup < 0) {
+ LYERRLOG("Error opening registrate voice buffer file: %s\n",strerror(errno));
+ s_register_voice_valid=false;
+ return -1;
+ }
+
+ ret = read(fd_backup,regState,sizeof (int));
+ if(ret<=0)
+ {
+ LYERRLOG("%s get regState fail, ret is %d",__func__,ret);
+ goto error_done;
+ }
+
+ ret = read(fd_backup,netType,sizeof (int));
+ if(ret<=0)
+ {
+ LYERRLOG("%s get netType fail, ret is %d",__func__,ret);
+ goto error_done;
+ }
+
+ ret = read(fd_backup,netRejected,sizeof (int));
+ if(ret<=0)
+ {
+ LYERRLOG("%s get netRejected fail, ret is %d",__func__,ret);
+ goto error_done;
+ }
+
+
+ close(fd_backup);
+ LYINFLOG("get_registration_state voice suc, regState is %d, netType is %d, netRejected is %d",*regState,*netType,*netRejected);
+ return 0;
+
+error_done:
+ s_register_voice_valid=false;
+ close(fd_backup);
+ return -1;
+}
+int lynq_get_registration_state_to_buf_data(int* regState,char * LAC,char * CID,int *netType)
+{
+ int ret;
+ int stringLen;
+ int fd_backup;
+
+ if(!s_register_data_valid)
+ {
+ LYINFLOG("registration data buffer is false");
+ return 1;
+ }
+
+ fd_backup = open(DATA_REG_BUFFER_FILE,O_RDONLY);
+
+ if (fd_backup < 0) {
+ LYERRLOG("Error opening registrate data buffer file: %s\n",strerror(errno));
+ return -1;
+ }
+
+ ret = read(fd_backup,regState,sizeof (int));
+ if(ret<=0)
+ {
+ LYERRLOG("%s get regState fail, ret is %d",__func__, ret);
+ goto error_done;
+ }
+
+ ret = read(fd_backup,netType,sizeof (int));
+ if(ret<=0)
+ {
+ LYERRLOG("%s get netType fail, ret is %d",__func__, ret);
+ goto error_done;
+ }
+
+ ret = read(fd_backup,&stringLen,sizeof (int));
+ if(ret<=0)
+ {
+ LYERRLOG("%s get lac stringLen fail, ret is %d",__func__, ret);
+ goto error_done;
+ }
+
+ ret = read(fd_backup,LAC,stringLen);
+ if(ret<=0)
+ {
+ LYERRLOG("%s get lac fail, ret is %d, stringLen is %d",__func__, ret,stringLen);
+ goto error_done;
+ }
+
+
+ ret = read(fd_backup,&stringLen,sizeof (int));
+ if(ret<=0)
+ {
+ LYERRLOG("%s get cid stringLen fail, ret is %d",__func__, ret);
+ goto error_done;
+ }
+
+ ret = read(fd_backup,CID,stringLen);
+ if(ret<=0)
+ {
+ LYERRLOG("%s get cid fail, ret is %d, stringLen is %d",__func__, ret,stringLen);
+ goto error_done;
+ }
+
+ close(fd_backup);
+
+ LYINFLOG("get_registration_state data suc, regState is %d, netType is %d, LAC is %s, CID is %s",*regState,*netType,LAC,CID);
+ return 0;
+
+error_done:
+ s_register_data_valid =false;
+ close(fd_backup);
+ return -1;
+
+}
+int lynq_get_registration_state_to_buf_ims(int* imsRegState,int *radioTechFam)
+{
+ int ret;
+ int fd_backup;
+
+ if(!s_register_ims_valid)
+ {
+ LYINFLOG("registration ims buffer is false");
+ return 1;
+ }
+
+ fd_backup = open(IMS_REG_BUFFER_FILE,O_RDONLY);
+
+ if (fd_backup < 0) {
+ LYERRLOG("Error opening registrate ims buffer file: %s\n",strerror(errno));
+ return -1;
+ }
+
+ ret = read(fd_backup,imsRegState,sizeof (int));
+ if(ret<=0)
+ {
+ LYERRLOG("%s get imsRegState fail, ret is %d",__func__, ret);
+ goto error_done;
+ }
+
+ ret = read(fd_backup,radioTechFam,sizeof (int));
+ if(ret<=0)
+ {
+ LYERRLOG("%s get radioTechFam fail, ret is %d",__func__, ret);
+ goto error_done;
+ }
+
+ close(fd_backup);
+
+ LYINFLOG("get_registration_state ims suc, imsRegState is %d, radioTechFam is %d",*imsRegState,*radioTechFam);
+ return 0;
+
+error_done:
+ s_register_ims_valid =false;
+ close(fd_backup);
+ return -1;
+}
+
+void lynq_set_voice_registration_valid_period(int valid_period)
+{
+ s_register_cfg.voice_valid_period=valid_period;
+ stop_network_timer(s_register_timer_voice, register_sig_value_voice);
+ s_register_voice_valid=false;
+ set_network_register_timer_length_to_file();
+}
+
+void lynq_set_data_registration_valid_period(int valid_period)
+{
+ s_register_cfg.data_valid_period = valid_period;
+ stop_network_timer(s_register_timer_data, register_sig_value_data);
+ s_register_data_valid=false;
+ set_network_register_timer_length_to_file();
+}
+
+void lynq_set_ims_registration_valid_period(int valid_period)
+{
+ s_register_cfg.ims_valid_period=valid_period;
+ stop_network_timer(s_register_timer_ims, register_sig_value_ims);
+ s_register_ims_valid=false;
+ set_network_register_timer_length_to_file();
+}
+
+int lynq_get_voice_registration_valid_period()
+{
+ return s_register_cfg.voice_valid_period;
+}
+
+int lynq_get_data_registration_valid_period()
+{
+ return s_register_cfg.data_valid_period;
+}
+
+int lynq_get_ims_registration_valid_period()
+{
+ return s_register_cfg.ims_valid_period;
+}
+
diff --git a/src/lynq/lib/liblynq-network/lynq_network_state_buffer.h b/src/lynq/lib/liblynq-network/lynq_network_state_buffer.h
new file mode 100755
index 0000000..c0e20be
--- /dev/null
+++ b/src/lynq/lib/liblynq-network/lynq_network_state_buffer.h
@@ -0,0 +1,24 @@
+#ifndef LYNQ_NETWORK_STATE_BUFFER_H
+#define LYNQ_NETWORK_STATE_BUFFER_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+void set_register_voice_buffer_valid(int valid);
+void set_register_data_buffer_valid(int valid);
+void set_register_ims_buffer_valid(int valid);
+void stop_network_timer(timer_t timer, int signal_value);
+void start_network_timer(timer_t timer, int signal_value, int milliseconds);
+void init_network_timer_all();
+void deinit_network_timer_all();
+void lynq_set_registration_state_to_buf_voice(int regState,int netType,int netRejected);
+void lynq_set_registration_state_to_buf_data(int regState,char * LAC,char * CID,int netType);
+void lynq_set_registration_state_to_buf_ims(int imsRegState,int radioTechFam);
+int lynq_get_registration_state_to_buf_voice(int* regState,int *netType,int *netRejected);
+int lynq_get_registration_state_to_buf_data(int* regState,char * LAC,char * CID,int *netType);
+int lynq_get_registration_state_to_buf_ims(int* imsRegState,int *radioTechFam);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/src/lynq/lib/liblynq-network/makefile b/src/lynq/lib/liblynq-network/makefile
index 7174f89..491d547 100755
--- a/src/lynq/lib/liblynq-network/makefile
+++ b/src/lynq/lib/liblynq-network/makefile
@@ -28,6 +28,7 @@
LOCAL_LIBS := \
-L. \
-ldl \
+ -lrt \
-llog \
-lbinder \
-lpthread \