blob: d7c91116075ac08964b8b357f63bbcdfa5f0061a [file] [log] [blame]
q.huang47d4dfe2022-08-17 17:52:29 +08001#include <stdio.h>
q.huangaf58bc82022-08-19 17:11:21 +08002#include <stdint.h> /*just for uint64_t in lynq_query_cell_info 20220819 hq*/
q.huang47d4dfe2022-08-17 17:52:29 +08003#include <sys/types.h>
4#include <string.h>
5#include <unistd.h>
6#include <pthread.h>
7#include <signal.h>
8#include <errno.h>
9#include <fcntl.h>
q.huangd3804bd2022-10-20 14:36:14 +080010#include <stdarg.h>
11#include <climits>
q.huang47d4dfe2022-08-17 17:52:29 +080012#include "liblog/lynq_deflog.h"
13#include "lynq_network.h"
q.huang52921662022-10-20 15:25:45 +080014#include "lynq_module_common.h"
15#include "lynq_module_state_buffer.h"
q.huang47d4dfe2022-08-17 17:52:29 +080016
17#define USER_LOG_TAG "LYNQ_NETWORK"
18
q.huangd3804bd2022-10-20 14:36:14 +080019static timer_t s_state_buffer_timer[NETWORK_STATE_BUFFER_TYPE_MAX];
20
21static int s_state_buffer_sig_value[NETWORK_STATE_BUFFER_TYPE_MAX]={2,3,4};
22
23static int s_state_buffer_valid[NETWORK_STATE_BUFFER_TYPE_MAX]={false,false,false};
24
25static char* s_state_buffer_file[NETWORK_STATE_BUFFER_TYPE_MAX]={
26 "/data/ril/network/.network_register_voice_buffer",
27 "/data/ril/network/.network_register_data_buffer",
28 "/data/ril/network/.network_register_ims_buffer"
29};
30
31#define STATE_BUFFER_CONFIG_FILE "/data/ril/network/.state_buffer_cfg"
q.huang47d4dfe2022-08-17 17:52:29 +080032typedef struct{
q.huangd3804bd2022-10-20 14:36:14 +080033 int valid_period[NETWORK_STATE_BUFFER_TYPE_MAX];
34}network_state_buffer_cfg;
35static network_state_buffer_cfg s_state_buffer_cfg;
q.huang47d4dfe2022-08-17 17:52:29 +080036static pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;
q.huang47d4dfe2022-08-17 17:52:29 +080037
q.huangd3804bd2022-10-20 14:36:14 +080038void get_state_buffer_timer_length_from_file()
q.huang47d4dfe2022-08-17 17:52:29 +080039{
40 int fd_backup;
41 int ret;
q.huangd3804bd2022-10-20 14:36:14 +080042 memset(&s_state_buffer_cfg,0,sizeof (s_state_buffer_cfg));
43 fd_backup = open(STATE_BUFFER_CONFIG_FILE,O_RDONLY | O_CREAT,0777);
q.huang47d4dfe2022-08-17 17:52:29 +080044 if (fd_backup < 0) {
q.huangd3804bd2022-10-20 14:36:14 +080045 LYERRLOG("%s open file faile, error is %s\n",__func__,strerror(errno));
q.huang47d4dfe2022-08-17 17:52:29 +080046 return;
47 }
48
q.huangd3804bd2022-10-20 14:36:14 +080049 ret = read(fd_backup,&s_state_buffer_cfg,sizeof (s_state_buffer_cfg));
q.huang47d4dfe2022-08-17 17:52:29 +080050 if(ret<=0)
51 {
q.huangd3804bd2022-10-20 14:36:14 +080052 LYERRLOG("%s read fail, ret is %d",__func__,ret);
53 memset(&s_state_buffer_cfg,0,sizeof (s_state_buffer_cfg));
q.huang47d4dfe2022-08-17 17:52:29 +080054 }
55 else
56 {
q.huangd3804bd2022-10-20 14:36:14 +080057 LYINFLOG("%s suc",__func__);
q.huang47d4dfe2022-08-17 17:52:29 +080058 }
59 close(fd_backup);
60
61 return;
62}
63
q.huangd3804bd2022-10-20 14:36:14 +080064int set_state_buffer_timer_length_to_file()
q.huang47d4dfe2022-08-17 17:52:29 +080065{
66 int fd_backup;
67 int ret;
q.huangd3804bd2022-10-20 14:36:14 +080068 fd_backup = open(STATE_BUFFER_CONFIG_FILE,O_WRONLY | O_CREAT,0777);
q.huang47d4dfe2022-08-17 17:52:29 +080069 if (fd_backup < 0) {
q.huangd3804bd2022-10-20 14:36:14 +080070 LYERRLOG("%s open file fail, error is %s\n",__func__,strerror(errno));
71 return -1;
q.huang47d4dfe2022-08-17 17:52:29 +080072 }
73
q.huangd3804bd2022-10-20 14:36:14 +080074 ret = write(fd_backup,&s_state_buffer_cfg,sizeof (s_state_buffer_cfg));
q.huang47d4dfe2022-08-17 17:52:29 +080075 if(ret<=0)
76 {
q.huangd3804bd2022-10-20 14:36:14 +080077 LYERRLOG("%s write fail, ret is %d",__func__,ret);
q.huang47d4dfe2022-08-17 17:52:29 +080078 }
79 else
80 {
q.huangd3804bd2022-10-20 14:36:14 +080081 LYINFLOG("%s suc",__func__);
q.huang47d4dfe2022-08-17 17:52:29 +080082 }
83 close(fd_backup);
84
q.huangd3804bd2022-10-20 14:36:14 +080085 return ret>0? 0:-2;
q.huang47d4dfe2022-08-17 17:52:29 +080086}
87
88void start_network_timer(timer_t timer, int signal_value, int milliseconds) {
89 LYINFLOG("start_network_timer(), timer_id=%ld, signal_value=%d, time=%d",(long)timer, signal_value, milliseconds);
q.huang52921662022-10-20 15:25:45 +080090
91 struct itimerspec expire;
92 expire.it_interval.tv_sec = 0;
93 expire.it_interval.tv_nsec = 0;
94 expire.it_value.tv_sec = milliseconds/1000;
95 expire.it_value.tv_nsec = (milliseconds%1000)*1000000;
96 if (timer_settime(timer, 0, &expire, NULL) == -1) {
q.huang47d4dfe2022-08-17 17:52:29 +080097 LYERRLOG("timer_settime failed reason=[%s]", strerror(errno));
q.huang52921662022-10-20 15:25:45 +080098 }
99}
100
q.huang47d4dfe2022-08-17 17:52:29 +0800101void stop_network_timer(timer_t timer, int signal_value) {
102 LYINFLOG("stop_network_timer(), timer_id=%ld, signal_value=%d", (long)timer, signal_value);
q.huang52921662022-10-20 15:25:45 +0800103 struct itimerspec timespec;
104 if(timer_gettime(timer, &timespec) == -1) {
q.huang47d4dfe2022-08-17 17:52:29 +0800105 LYERRLOG("stop_network_timer(), get time fail(%s)", strerror(errno));
q.huang52921662022-10-20 15:25:45 +0800106 return;
107 }
q.huang47d4dfe2022-08-17 17:52:29 +0800108 LYINFLOG("stop_network_timer(), tv_sec=%ld, tv_nsec=%ld",timespec.it_value.tv_sec, timespec.it_value.tv_nsec);
q.huang52921662022-10-20 15:25:45 +0800109 if((timespec.it_value.tv_sec == 0) && (timespec.it_value.tv_nsec == 0) ) {
q.huang47d4dfe2022-08-17 17:52:29 +0800110 LYINFLOG("stop_network_timer(), timer_id(%ld) had stopped, just return", (long)timer);
q.huang52921662022-10-20 15:25:45 +0800111 return;
112 } else {
q.huang47d4dfe2022-08-17 17:52:29 +0800113 start_network_timer(timer, signal_value, 0);
q.huang52921662022-10-20 15:25:45 +0800114 }
q.huang47d4dfe2022-08-17 17:52:29 +0800115}
116
117void network_timer_handler(sigval_t sig) {
118 LYINFLOG("network_timer_handler, sig_value: %d", sig.sival_int);
119 int s;
q.huang52921662022-10-20 15:25:45 +0800120 s = pthread_mutex_lock(&mtx);
121 if(s != 0) {
q.huang47d4dfe2022-08-17 17:52:29 +0800122 LYERRLOG("network_timer_handler, pthead_mutex_lock fail");
123 }
q.huangd3804bd2022-10-20 14:36:14 +0800124 for(int i=0;i<NETWORK_STATE_BUFFER_TYPE_MAX;i++)
q.huang47d4dfe2022-08-17 17:52:29 +0800125 {
q.huangd3804bd2022-10-20 14:36:14 +0800126 if(sig.sival_int == s_state_buffer_sig_value[i])
127 {
128 s_state_buffer_valid[i]=false;
129 break;
130 }
131 }
q.huang52921662022-10-20 15:25:45 +0800132 s = pthread_mutex_unlock(&mtx);
133 if(s != 0) {
q.huang47d4dfe2022-08-17 17:52:29 +0800134 LYERRLOG("network_timer_handler, pthread_mutex_unlock fail");
135 }
136}
137
138void init_network_timer(timer_t* timer, int signal_value)
139{
140 struct sigevent sevp;
q.huang52921662022-10-20 15:25:45 +0800141 memset(&sevp, 0, sizeof(sevp));
142 sevp.sigev_value.sival_int = signal_value;
143 sevp.sigev_notify = SIGEV_THREAD;
q.huang47d4dfe2022-08-17 17:52:29 +0800144 sevp.sigev_notify_function = network_timer_handler;
q.huang52921662022-10-20 15:25:45 +0800145
146 if(timer_create(CLOCK_MONOTONIC, &sevp, timer) == -1) {
q.huangd3804bd2022-10-20 14:36:14 +0800147 LYERRLOG("init_network_timer() failed reason=[%s]", strerror(errno));
q.huang52921662022-10-20 15:25:45 +0800148 }
q.huangd3804bd2022-10-20 14:36:14 +0800149 LYINFLOG("init_network_timer(), timer_Id = %ld, signal_value=%d", (long)(*timer), signal_value);
q.huang52921662022-10-20 15:25:45 +0800150}
151
q.huangd3804bd2022-10-20 14:36:14 +0800152void init_network_timer_all() {
153
154 for(int i=0;i<NETWORK_STATE_BUFFER_TYPE_MAX;i++){
155 init_network_timer(&s_state_buffer_timer[i],s_state_buffer_sig_value[i]);
156 s_state_buffer_valid[i] = false;
157 }
158 get_state_buffer_timer_length_from_file();
q.huang47d4dfe2022-08-17 17:52:29 +0800159}
160
161void deinit_network_timer_all()
162{
q.huangd3804bd2022-10-20 14:36:14 +0800163 for(int i=0;i<NETWORK_STATE_BUFFER_TYPE_MAX;i++){
164 stop_network_timer(&s_state_buffer_timer[i],s_state_buffer_sig_value[i]);
165 s_state_buffer_valid[i] = false;
166 }
q.huang47d4dfe2022-08-17 17:52:29 +0800167}
168
q.huangd3804bd2022-10-20 14:36:14 +0800169int is_period_equal_not_valid(int period)
170{
171 return period<=0 || (period > INT_MAX/1000);
172}
173
174void set_state_buffer_valid(lynq_network_state_buffer_type type,int valid)
175{
176 if(is_period_equal_not_valid(s_state_buffer_cfg.valid_period[type]))
177 {
178 valid=false;
179 }
180 s_state_buffer_valid[type] = valid;
181 if(s_state_buffer_valid[type]==false)
182 {
183 stop_network_timer(s_state_buffer_timer[type], s_state_buffer_sig_value[type]);
184 }
185 else
186 {
187 start_network_timer(s_state_buffer_timer[type], s_state_buffer_sig_value[type],s_state_buffer_cfg.valid_period[type]*1000);
188 }
189 LYINFLOG("%s type %d valid is %d",__func__,type,valid);
190}
191
192int get_state_buffer_valid(lynq_network_state_buffer_type type)
193{
194 return s_state_buffer_valid[type];
195}
196
197void set_state_to_buf(lynq_network_state_buffer_type type,...)
q.huang47d4dfe2022-08-17 17:52:29 +0800198{
199 int ret;
200 int fd_backup;
q.huangd3804bd2022-10-20 14:36:14 +0800201
202 if(is_period_equal_not_valid(s_state_buffer_cfg.valid_period[type]))
q.huang47d4dfe2022-08-17 17:52:29 +0800203 {
q.huangd3804bd2022-10-20 14:36:14 +0800204 LYINFLOG("%s type %d timer length %d is equal not valid",__func__,type,s_state_buffer_cfg.valid_period[type]);
q.huang47d4dfe2022-08-17 17:52:29 +0800205 return;
206 }
207
q.huangd3804bd2022-10-20 14:36:14 +0800208 fd_backup = open(s_state_buffer_file[type],O_WRONLY | O_CREAT,0777);
q.huang47d4dfe2022-08-17 17:52:29 +0800209
210 if (fd_backup < 0) {
q.huangd3804bd2022-10-20 14:36:14 +0800211 LYERRLOG("%s Error opening registrate buffer file: %s\n",__func__,strerror(errno));
q.huang47d4dfe2022-08-17 17:52:29 +0800212 return ;
213 }
q.huangd3804bd2022-10-20 14:36:14 +0800214
215 va_list pArgs;
216 va_start(pArgs, type);
217
218 int int_num;
219 int i,int_value;
220
221 int_num = va_arg(pArgs, int);
222 LYINFLOG("%s int_num is %d",__func__,int_num);
223 for(i=0;i<int_num;i++)
q.huang47d4dfe2022-08-17 17:52:29 +0800224 {
q.huangd3804bd2022-10-20 14:36:14 +0800225 int_value=va_arg(pArgs, int);
226 LYINFLOG("%s int_value is %d",__func__,int_value);
227 ret = write(fd_backup,&int_value,sizeof (int));
228 if(ret<=0)
229 {
230 LYERRLOG("%s write int %d value %d fail, ret is %d",__func__,i,int_value,ret);
231 goto set_state_error_done;
232 }
q.huang47d4dfe2022-08-17 17:52:29 +0800233
q.huang47d4dfe2022-08-17 17:52:29 +0800234 }
235
q.huangd3804bd2022-10-20 14:36:14 +0800236 int stringNum;
237 char * p_value;
238 int stringLen;
q.huang47d4dfe2022-08-17 17:52:29 +0800239
q.huangd3804bd2022-10-20 14:36:14 +0800240 stringNum = va_arg(pArgs, int);
241 LYINFLOG("%s stringNum is %d",__func__,stringNum);
242 for(i=0;i<stringNum;i++)
q.huang47d4dfe2022-08-17 17:52:29 +0800243 {
q.huangd3804bd2022-10-20 14:36:14 +0800244 p_value=va_arg(pArgs, char*);
245 stringLen=strlen(p_value)+1;
246 LYINFLOG("%s p_value is %s,stringlen is %d",__func__,p_value,stringLen);
247 ret = write(fd_backup,&stringLen,sizeof(int));
248 if(ret<=0)
249 {
250 LYERRLOG("%s write %i stringlen %d fail, ret is %d",__func__,i,stringLen,ret);
251 goto set_state_error_done;
252 }
253 ret = write(fd_backup,p_value,stringLen);
254 if(ret<=0)
255 {
256 LYERRLOG("%s write string %d stringlen %d fail, ret is %d",__func__,i, stringLen,ret);
257 goto set_state_error_done;
258 }
q.huang47d4dfe2022-08-17 17:52:29 +0800259 }
260
q.huangd3804bd2022-10-20 14:36:14 +0800261 va_end(pArgs);
q.huang47d4dfe2022-08-17 17:52:29 +0800262
263 sync();
264 close(fd_backup);
q.huangd3804bd2022-10-20 14:36:14 +0800265 set_state_buffer_valid(type,true);
266 LYINFLOG("%s type %d suc",__func__,type);
q.huang47d4dfe2022-08-17 17:52:29 +0800267 return;
268
q.huangd3804bd2022-10-20 14:36:14 +0800269set_state_error_done:
270 set_state_buffer_valid(type,false);
q.huang47d4dfe2022-08-17 17:52:29 +0800271 close(fd_backup);
q.huangd3804bd2022-10-20 14:36:14 +0800272 return;
q.huang47d4dfe2022-08-17 17:52:29 +0800273}
274
q.huangd3804bd2022-10-20 14:36:14 +0800275int get_state_from_buf(lynq_network_state_buffer_type type,...)
q.huang47d4dfe2022-08-17 17:52:29 +0800276{
277 int ret;
278 int fd_backup;
q.huangd3804bd2022-10-20 14:36:14 +0800279
280 if(!get_state_buffer_valid(type))
q.huang47d4dfe2022-08-17 17:52:29 +0800281 {
q.huangd3804bd2022-10-20 14:36:14 +0800282 LYINFLOG("%s type %d buffer not valid",__func__,type);
q.huang47d4dfe2022-08-17 17:52:29 +0800283 return 1;
284 }
285
q.huangd3804bd2022-10-20 14:36:14 +0800286 fd_backup = open(s_state_buffer_file[type], O_RDONLY);
q.huang47d4dfe2022-08-17 17:52:29 +0800287
288 if (fd_backup < 0) {
q.huangd3804bd2022-10-20 14:36:14 +0800289 LYERRLOG("%s Error opening type %d buffer file: %s\n",__func__,type,strerror(errno));
290 set_state_buffer_valid(type,false);
q.huang47d4dfe2022-08-17 17:52:29 +0800291 return -1;
292 }
q.huangd3804bd2022-10-20 14:36:14 +0800293
294 va_list pArgs;
295 va_start(pArgs, type);
296 int int_p_num;
297 int i;
298 int* int_p_value;
299
300 int_p_num= va_arg(pArgs, int);
301 LYINFLOG("%s int_num is %d",__func__,int_p_num);
302 for(i=0;i<int_p_num;i++)
q.huang47d4dfe2022-08-17 17:52:29 +0800303 {
q.huangd3804bd2022-10-20 14:36:14 +0800304 int_p_value=va_arg(pArgs, int*);
305 ret = read(fd_backup,int_p_value,sizeof (int));
306 LYINFLOG("%s int_p_value is %d",__func__,(*int_p_value));
307 if(ret<=0)
308 {
309 LYERRLOG("%s read int %d fail, ret is %d",__func__,i,ret);
310 goto get_state_error_done;
311 }
312
q.huang47d4dfe2022-08-17 17:52:29 +0800313 }
314
q.huangd3804bd2022-10-20 14:36:14 +0800315 int stringNum;
316 char * p_value;
317 int stringLen;
q.huang47d4dfe2022-08-17 17:52:29 +0800318
q.huangd3804bd2022-10-20 14:36:14 +0800319 stringNum = va_arg(pArgs, int);
320 LYINFLOG("%s stringNum is %d",__func__,stringNum);
321 for(i=0;i<stringNum;i++)
q.huang47d4dfe2022-08-17 17:52:29 +0800322 {
q.huangd3804bd2022-10-20 14:36:14 +0800323 ret = read(fd_backup,&stringLen,sizeof (int));
324 if(ret<=0)
325 {
326 LYERRLOG("%s get %d string len fail, ret is %d",__func__,i,ret);
327 goto get_state_error_done;
328 }
329 LYINFLOG("%s stringlen is %d",__func__,stringLen);
330 p_value=va_arg(pArgs, char*);
331 ret = read(fd_backup,p_value,stringLen);
332 if(ret<=0)
333 {
334 LYERRLOG("%s get %d string fail, stringlen is %d, ret is %d",__func__, stringLen,ret);
335 goto get_state_error_done;
336 }
337 LYINFLOG("%s p_value is %s",__func__,p_value);
338 }
339 va_end(pArgs);
q.huang47d4dfe2022-08-17 17:52:29 +0800340
q.huang47d4dfe2022-08-17 17:52:29 +0800341 close(fd_backup);
q.huangd3804bd2022-10-20 14:36:14 +0800342 LYINFLOG("%s type %d suc",__func__,type);
343 return 0;
344
345get_state_error_done:
346 set_state_buffer_valid(type,false);
q.huang47d4dfe2022-08-17 17:52:29 +0800347 close(fd_backup);
348 return -1;
q.huang47d4dfe2022-08-17 17:52:29 +0800349}
q.huangd3804bd2022-10-20 14:36:14 +0800350
351int lynq_set_state_buffer_valid_period_of_network(lynq_network_state_buffer_type type,int valid_period)
q.huang47d4dfe2022-08-17 17:52:29 +0800352{
q.huangd3804bd2022-10-20 14:36:14 +0800353 if(type>NETWORK_STATE_BUFFER_TYPE_MAX || type <0)
q.huang47d4dfe2022-08-17 17:52:29 +0800354 {
q.huangd3804bd2022-10-20 14:36:14 +0800355 LYERRLOG("%s type %d error",__func__,type);
q.huang47d4dfe2022-08-17 17:52:29 +0800356 return -1;
357 }
q.huangd3804bd2022-10-20 14:36:14 +0800358 if(valid_period>INT_MAX/1000 || valid_period <0)
q.huang47d4dfe2022-08-17 17:52:29 +0800359 {
q.huangd3804bd2022-10-20 14:36:14 +0800360 LYERRLOG("%s type %d error",__func__,valid_period);
361 return -2;
q.huang47d4dfe2022-08-17 17:52:29 +0800362 }
q.huang47d4dfe2022-08-17 17:52:29 +0800363
q.huangd3804bd2022-10-20 14:36:14 +0800364 network_state_buffer_cfg cfg_back=s_state_buffer_cfg;
365 s_state_buffer_cfg.valid_period[type]=valid_period;
366 int ret=set_state_buffer_timer_length_to_file();
367 if(ret!=0)
368 {
369 s_state_buffer_cfg=cfg_back;
370 }
371 else
372 {
373 set_state_buffer_valid(type,false);
374 }
375 LYINFLOG("%s type %d period %d ret is %d",__func__,type,valid_period,ret);
376 return ret;
q.huang47d4dfe2022-08-17 17:52:29 +0800377}
378
q.huangd3804bd2022-10-20 14:36:14 +0800379int lynq_get_state_buffer_valid_period_of_network(lynq_network_state_buffer_type type)
q.huang47d4dfe2022-08-17 17:52:29 +0800380{
q.huangd3804bd2022-10-20 14:36:14 +0800381 if(type>NETWORK_STATE_BUFFER_TYPE_MAX || type <0)
382 {
383 LYERRLOG("%s type %d error",__func__,type);
384 return 0;
385 }
386 return s_state_buffer_cfg.valid_period[type];
q.huang47d4dfe2022-08-17 17:52:29 +0800387}