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 1f0a32b..9f32bed 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
@@ -66,6 +66,7 @@
 int lynq_set_band_mode(const int bandmode);
 int lynq_query_available_bandmode(int availBanMode[]);
 int lynq_radio_on(const int data);
+int lynq_query_radio_state(int *radio_state);
 int lynq_query_radio_tech(int* radioTech);
 int lynq_solicited_signal_strength(signalStrength_t *solSigStren);
 int lynq_set_ims(const int ims_mode);
diff --git a/src/lynq/lib/liblynq-network/lynq_network.cpp b/src/lynq/lib/liblynq-network/lynq_network.cpp
index 6b0bdbf..fa3090b 100755
--- a/src/lynq/lib/liblynq-network/lynq_network.cpp
+++ b/src/lynq/lib/liblynq-network/lynq_network.cpp
@@ -155,6 +155,42 @@
     }
 }
 
+int lynq_get_common_request(int request_id, int time_out, Parcel &p, int argc, const char* format,...)
+{
+    lynq_client_t client;
+    int resp_type = -1;
+    int request = -1;
+    int slot_id = -1;
+    int ret;
+    int send_num;
+    
+    client.uToken = network_Global_uToken;
+    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);
+    send_num = sendto(network_sock_fd,&client,sizeof(client),0,(struct sockaddr *)&network_addr_serv,network_len_addr_serv); 
+
+    if(send_num <= 0)
+       
+    {
+        LYERRLOG("send request fail, send num is %d", send_num);
+        return -1;
+    }
+    ret = get_response(p, time_out);
+    pthread_mutex_unlock(&g_lynq_network_sendto_mutex);
+    return ret;    
+}
+
+
 int wait_signal_changes()
 {
     int ret = 0;
@@ -1292,6 +1328,121 @@
     return response.error;
 }
 
+const char * lynq_get_raw_data(Parcel &p, int* data_len) 
+{
+    int32_t len;
+    int status;
+    char *data;
+
+    *data_len=0;
+
+    status = p.readInt32(&len);
+
+    if (status != 0) {
+        LYERRLOG("%s status is %d",__func__,status);
+        return NULL;
+    }
+
+    // The java code writes -1 for null arrays
+    if (((int)len) == -1 || ((int)len) == 0) 
+    {
+        LYERRLOG("%s len is %d",__func__,len);
+        return NULL;
+    }
+    LYINFLOG("%s len is %d",__func__,len);
+
+    data = (char*) p.readInplace(len); 
+    *data_len=len;
+
+    return data;
+}
+
+int lynq_query_radio_state(int *radio_state)
+{
+    int ret;
+    Parcel p;
+    int resp_type = -1;
+    int request = -1;
+    int slot_id = -1;
+    int error = -1;
+    int bfind=false;
+    const char* data;
+    int data_len;
+    char* data_str;
+    char* start;
+    int length;
+    int i;
+    int num_start;
+    
+    if(NULL == radio_state)
+    {
+        LYERRLOG("%s radio state is NULL",__func__);  
+        return -1;
+    }
+
+    ret=lynq_get_common_request(RIL_REQUEST_OEM_HOOK_RAW,5,p,1,"%s","AT+CFUN");
+    if(ret==0)
+    {
+        JumpHeader(p,&resp_type,&request,&slot_id,&error);
+        if(error==0)
+        {
+            data = lynq_get_raw_data(p,&data_len);
+            if(data==NULL || data_len == 0)
+            {
+                LYERRLOG("%s lynq_get_raw_data NULL or data_len is 0",__func__);               
+                return -1; 
+            }
+            data_str = (char*) calloc(1,data_len+1);
+            if (NULL == data_str) 
+            {
+                 LYERRLOG("%s alloc mem error, data_len is %d",__func__,data_len+1);         
+                 return -1;
+            }
+            memmove(data_str, data, data_len);     
+            data_str[data_len]='\0';           
+            LYINFLOG("%s return string is %s",__func__,data_str);  
+            start = strstr(data_str,"CFUN");
+            if(start!=NULL)
+            {
+                 start=start+4;
+                 length=strlen(start);
+                 for(i=0; i<length;i++)
+                 {
+                     if((!bfind) && (start[i] >= '0') && (start[i] <= '9'))
+                     {
+                         bfind=true;  
+                         num_start=i;
+                     }
+                     else if(bfind && ((start[i] < '0') || (start[i] > '9')))
+                     {
+                        start[i]='\0';
+                        break;
+                     }
+                 }
+                 if(bfind)
+                 {                    
+                     (*radio_state) = atoi(start+num_start);
+                     LYINFLOG("%s, radio state is %s %d",__func__,start+num_start,*radio_state);  
+                     free(data_str);
+                     return 0;                        
+                 }
+            }             
+            LYERRLOG("%s return string %s no cfun or no digit",__func__,data_str);  
+            free(data_str);
+            return -1;
+        }     
+        else 
+        {
+            LYERRLOG("%s get error %d from modem",__func__,error);  
+            return error;
+        }
+    }
+
+    LYERRLOG("%s send request error %d",__func__,ret);  
+
+    return ret;
+}
+
 int lynq_query_radio_tech(int* radioTech)
 {
     int ret = -1;
