[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, &timespec) == -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,&regState,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,&regState,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 \