blob: 8b36c6dfa2bf031c49ac5a8f39caa3c9a7ac7c21 [file] [log] [blame]
b.liu68a94c92025-05-24 12:53:41 +08001#include "gsw_nw_interface.h"
2#include <dlfcn.h>
3#include <time.h>
4#include <pthread.h>
5
6//mbtk include
7#define LYNQ_AIR_PLANE_MODE_OFF 1 //at+cfun = 1
8#define LYNQ_AIR_PLANE_MODE_ON 4 // at+cfun = 4
9#define LYNQ_AIR_CFUN_MODE_OFF 0 // at+cfun = 0
10
11#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
12
13#define FPLMN_STRING_LENGTH 120
14#define ENTRY_LENGTH 6
15#define FPLMN_ARRAY_SIZE (FPLMN_STRING_LENGTH / 6) + 1
16
17#ifndef FALSE
18#define FALSE (0)
19#endif
20
21
22#ifndef TRUE
23#define TRUE (!FALSE)
24#endif
25
26typedef unsigned int uint32;
27typedef unsigned char uint8;
28typedef unsigned short uint16;
29typedef void (*mbtk_info_callback_func)(const void* data, int data_len);
30
31typedef enum
32{
33 MBTK_DEV_MODEM_MIN_FUN, //Modem 最小功能
34 MBTK_DEV_MODEM_FULL_FUN, //Modem 全功能
35 MBTK_DEV_MODEM_DISABLE_RECEIVE_RF_CIRCUITS = 3, //Modem 禁用射频接收电路
36 MBTK_DEV_MODEM_DISABLE_TRANSMIT_AND_RECEIVE_RF_CIRCUITS, //Modem禁用射频发射和接收电路
37 MBTK_DEV_MODEM_DISABLE_SIM, //Modem 禁用(U)SIM 卡
38 MBTK_DEV_MODEM_TURN_OFF_FULL_SECONDARY_RECEIVE, //Modem 完全禁用辅助接收
39}MBTK_DEV_MODEM_FUNCTION;
40
41typedef enum
42{
43 MBTK_CELL_TYPE_GSM = 0,
44 MBTK_CELL_TYPE_UMTS,
45 MBTK_CELL_TYPE_LTE
46} mbtk_cell_type_enum;
47
48typedef struct
49{
50 MBTK_DEV_MODEM_FUNCTION fun;
51 int rst;
52} mbtk_modem_info_t;
53
54typedef struct
55{
56 int client_fd;
57 pthread_t read_thread_id;
58 int exit_fd[2];
59 bool is_waitting;
60 pthread_cond_t cond;
61 pthread_mutex_t mutex;
62
63 pthread_mutex_t send_mutex;
64
65 // Temp response data.
66 uint16 info_err;
67 uint16 data_len;
68 void *data;
69
70 //mbtk wyq for server_ready_status add start
71 char server_ready_status;
72 //mbtk wyq for server_ready_status add end
73
74 mbtk_info_callback_func net_state_cb;
75 mbtk_info_callback_func call_state_cb;
76 mbtk_info_callback_func sms_state_cb;
77 mbtk_info_callback_func radio_state_cb;
78 mbtk_info_callback_func sim_state_cb;
79 mbtk_info_callback_func pdp_state_cb;
80 //add signal by xr
81 mbtk_info_callback_func signal_state_cb;
82} mbtk_info_handle_t;
83
84
85
86typedef struct
87{
88 // LTE server cell: tac, PCI, dlEuarfcn, ulEuarfcn, band
89 // LTE cell: phyCellId,euArfcn,rsrp,rsrq
90 // WCDMA server cell: lac, ci, arfcn
91 // WCDMA cell: lac, ci, arfcn
92 // GSM server cell: lac, ci, arfcn, bsic
93 // GSM cell:
94 uint32 value1;
95 uint32 value2;
96 uint32 value3;
97 uint32 value4;
98 uint32 value5;
99 uint32 value6;
100 uint32 value7;
101 uint32 value8;
102 uint32 value9;
103 uint32 value10;
104} __attribute__((packed)) mbtk_cell_info_t;
105
106
107
108
109
110typedef struct
111{
112 uint8 net_pref; // mbtk_net_pref_enum
113 uint16 gsm_band; // mbtk_gsm_band_enum
114 uint16 umts_band; // mbtk_umts_band_enum
115 uint32 tdlte_band; // mbtk_tdlte_band_enum
116 uint32 fddlte_band; // mbtk_fddlte_band_enum
117 uint32 lte_ext_band; // mbtk_lte_ext_band_enum
118} __attribute__((packed)) mbtk_band_info_t;
119
120typedef struct list_arraynode
121{
122 void *data;
123 struct list_arraynode *next;
124} list_arraynode_t;
125
126typedef struct list_treenode
127{
128 list_arraynode_t *data;
129 int count;
130 struct list_treenode *left;
131 struct list_treenode *right;
132} list_treenode_t;
133
134typedef int (*list_sort_func)(void *data1, void *data2);
135typedef void (*list_free_func)(void *data);
136
137typedef struct list_node
138{
139 uint32 size;
140 list_sort_func sort_func;
141 list_free_func free_func;
142
143 uint32 cur_index;
144 list_arraynode_t *cur_array_data;
145
146 list_arraynode_t array_data;
147 list_treenode_t tree_data;
148} list_node_t;
149
150/*
1510: GSM
1521: GSM Compact
1532: UTRAN
1543: GSM w/EGPRS
1554: UTRAN w/HSDPA
1565: UTRAN w/HSUPA
1576: UTRAN w/HSDPA and HSUPA
1587: E-UTRAN
1598: UTRAN HSPA+
160*/
161typedef enum {
162 MBTK_RADIO_TECH_GSM = 0,
163 MBTK_RADIO_TECH_GSM_COMPACT,
164 MBTK_RADIO_TECH_UTRAN,
165 MBTK_RADIO_TECH_GSM_EGPRS,
166 MBTK_RADIO_TECH_UTRAN_HSDPA,
167 MBTK_RADIO_TECH_UTRAN_HSUPA,
168 MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA,
169 MBTK_RADIO_TECH_E_UTRAN, // LTE
170 MBTK_RADIO_TECH_UTRAN_HSPA
171} mbtk_radio_technology_enum;
172
173typedef struct
174{
175 /*
176 0: automatic
177 1: manual
178 */
179 uint8 net_sel_mode;
180 /*
181 0: GSM
182 1: GSM Compact
183 2: UTRAN
184 3: GSM w/EGPRS
185 4: UTRAN w/HSDPA
186 5: UTRAN w/HSUPA
187 6: UTRAN w/HSDPA and HSUPA
188 7: E-UTRAN
189 8: UTRAN HSPA+
190 0xFF: Unused
191 */
192 uint8 net_type;
193 //uint8 plmn[10]; // 46000
194 /*
195 0: unknown
196 1: available
197 2: current
198 3: forbidden
199 */
200 uint8 net_state;
201 uint32 plmn;
202} __attribute__((packed)) mbtk_net_info_t;
203
204
205typedef enum
206{
207 MBTK_NET_REG_STATE_NON = 0,
208 MBTK_NET_REG_STATE_HOME,
209 MBTK_NET_REG_STATE_SEARCHING,
210 MBTK_NET_REG_STATE_DENIED,
211 MBTK_NET_REG_STATE_UNKNOWN,
212 MBTK_NET_REG_STATE_ROAMING,
213 MBTK_NET_REG_STATE_SMS_ONLY,
214 MBTK_NET_REG_STATE_ROAMING_SMS,
215 MBTK_NET_REG_STATE_ATTACHED_EMERGENCY,
216 MBTK_NET_REG_STATE_CSFB_HOME,
217 MBTK_NET_REG_STATE_CSFB_ROAMING,
218 MBTK_NET_REG_STATE_EMERGENCY_ONLY
219} mbtk_net_reg_state_enum;
220
221typedef struct
222{
223 uint8 call_state;// mbtk_net_reg_state_enum
224 uint8 data_state;// mbtk_net_reg_state_enum
225 uint8 ims_state;// mbtk_net_reg_state_enum
226 uint8 type; // mbtk_radio_technology_enum
227 uint16 lac;
228 uint32 ci;
229} __attribute__((packed)) mbtk_net_reg_info_t;
230
231typedef struct
232{
233 uint8 type; // mbtk_radio_technology_enum
234 uint8 rssi; // 0: 113 dBm or less
235 // 1: 111 dBm
236 // 2��30: 109��53 dBm
237 // 31: 51 dBm or greater
238 // 99: not known or not detectable
239 uint8 rxlev;// 0:rssi < -110 dBm
240 // 1: -110 dBm �� rssi < -109 dBm
241 // 2: -109 dBm �� rssi < -108 dBm
242 // ......
243 // 61: -50 dBm �� rssi < -49 dBm
244 // 62: -49 dBm �� rssi < -48 dBm
245 // 63: -48 dBm �� rssi
246 // 99: not known or not detectable
247 uint8 ber; // 0...7 as RXQUAL values in the table in 3GPP TS 45.008 [20] subclause 8.2.4
248 // 99 not known or not detectable
249 uint8 rscp; // 0: rscp < -120 dBm
250 // 1: -120 dBm �� rscp < -119 dBm
251 // 2: -119 dBm �� rscp < -118 dBm
252 // ......
253 // 94: -27 dBm �� rscp < -26 dBm
254 // 95: -26 dBm �� rscp < -25 dBm
255 // 96: - 25 dBm �� rscp
256 // 255: not known or not detectable
257 uint8 ecno; // 0: Ec/Io < -24 dB
258 // 1: -24 dB �� Ec/Io < -23.5 dB
259 // 2: -23.5 dB �� Ec/Io < -23 dB
260 // ......
261 // 47: -1 dB �� Ec/Io < -0.5 dB
262 // 48: -0.5 dB �� Ec/Io < 0 dB
263 // 49: 0 dB �� Ec/Io
264 // 255: not known or not detectable
265 uint8 rsrq; // 0: rsrq < -19.5 dB
266 // 1: -19.5 dB �� rsrq < -19 dB
267 // 2: -19 dB �� rsrq < -18.5 dB
268 // ......
269 // 32: -4 dB �� rsrq < -3.5 dB
270 // 33: -3.5 dB �� rsrq < -3 dB
271 // 34: -3 dB �� rsrq
272 // 255: not known or not detectable
273 uint8 rsrp; // 0: rsrp < -140 dBm
274 // 1: -140 dBm �� rsrp < -139 dBm
275 // 2: -139 dBm �� rsrp < -138 dBm
276 // ......
277 // 95: -46 dBm �� rsrp < -45 dBm
278 // 96: -45 dBm �� rsrp < -44 dBm
279 // 97: -44 dBm �� rsrp
280 // 255: not known or not detectable
281} __attribute__((packed)) mbtk_signal_info_t;
282
283typedef struct{
284 uint8_t mode;
285 uint32_t oosPhase[3]; //单位为秒
286} mbtk_oos_info;
287
288typedef struct
289{
290 /* Configuration parameters for MCM network full band network scan when OOS (out of service)*/
291 int t_min;
292 int t_step;
293 int t_max;
294}GSW_NW_OOS_CONFIG_INFO_T;
295
b.liu68a94c92025-05-24 12:53:41 +0800296#define lib_mbtk_path "/lib/libmbtk_lib.so"
297mbtk_info_handle_t* nw_info_handle = NULL;
298
299static GSW_NW_ServingInfoHandlePtr serving_cb;
300static GSW_NW_SigInfoHandlePtr sig_cb;
301static GSW_NW_RejectCauseHandlePtr reject_cb;
302static GSW_NW_ModemStateHandlePtr modem_cb;
303
304static void *dlHandle_mbtk;
305int nw_init_flag = 0;
306int mode = -1;
307int fplmn_max_length = 0;
308
309gsw_nw_plmn_list_t gsw_nw_plmn_list;
310char fplmn_array[FPLMN_ARRAY_SIZE][7];
311int fplmn_index = 0;
312
313static mbtk_info_handle_t* (*mbtk_info_handle_get)(void);
314static int (*mbtk_info_handle_free)(mbtk_info_handle_t** handle);
315int (*mbtk_net_sel_mode_get)(mbtk_info_handle_t* handle, mbtk_net_info_t *net);
316int (*mbtk_net_reg_get)(mbtk_info_handle_t* handle, mbtk_net_reg_info_t *reg);
317int (*mbtk_cell_get)(mbtk_info_handle_t* handle, mbtk_cell_type_enum *type, list_node_t **cell_list);
318int (*mbtk_get_modem_fun)(mbtk_info_handle_t* handle, int* fun);
319static int (*mbtk_set_modem_fun)(mbtk_info_handle_t* handle, mbtk_modem_info_t *info);
320int (*mbtk_current_band_get)(mbtk_info_handle_t* handle, mbtk_band_info_t *band);
321int (*mbtk_current_band_set)(mbtk_info_handle_t* handle, const mbtk_band_info_t *band);
322int (*mbtk_net_signal_get)(mbtk_info_handle_t* handle, mbtk_signal_info_t *signal);
323int (*mbtk_wakeup_state_set)(mbtk_info_handle_t* handle, uint32 wakeup_state);
324int (*mbtk_signal_state_change_cb_reg)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb);
325int (*mbtk_net_state_change_cb_reg)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb);
326int (*mbtk_fplmn_get)(mbtk_info_handle_t *handle, void *fplmn);
327int (*mbtk_fplmn_set)(mbtk_info_handle_t *handle, void *fplmn);
328int (*mbtk_radio_state_change_cb_reg)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb);
329int (*mbtk_oos_get)(mbtk_info_handle_t* handle, mbtk_oos_info *oos_info);
330int (*mbtk_oos_set)(mbtk_info_handle_t* handle, mbtk_oos_info *oos_info);
331
332static void (*mbtk_log)(int level, const char *format, ...);
333static void (*mbtk_log_init)(char *path, char *tag);
334
335#ifndef LOG_ERR_LEVEL
336#define LOG_ERR_LEVEL 3 /* error conditions */
337#endif
338#ifndef LOG_WARN_LEVEL
339#define LOG_WARN_LEVEL 4 /* warning conditions */
340#endif
341#ifndef LOG_INFO_LEVEL
342#define LOG_INFO_LEVEL 6 /* informational */
343#endif
344#ifndef LOG_DEBUG_LEVEL
345#define LOG_DEBUG_LEVEL 7 /* debug-level messages */
346#endif
347#ifndef LOG_VERBOSE_LEVEL
348#define LOG_VERBOSE_LEVEL 8
349#endif
350
l.yang6a42e4d2025-05-28 01:04:20 -0700351#define GSW_NW "[HAL][GSW_NW]"
352
b.liu68a94c92025-05-24 12:53:41 +0800353#define LOGV(fmt, args ...) \
354 do{ \
355 char *file_ptr_1001 = __FILE__; \
356 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
357 char line_1001[10] = {0}; \
358 sprintf(line_1001, "%d", __LINE__); \
359 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
360 if(*ptr_1001 == '/') \
361 break; \
362 ptr_1001--; \
363 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700364 mbtk_log(LOG_VERBOSE_LEVEL, "%s#%s: "GSW_NW"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800365 } while(0)
366
367#define LOGI(fmt, args...) \
368 do{ \
369 char *file_ptr_1001 = __FILE__; \
370 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
371 char line_1001[10] = {0}; \
372 sprintf(line_1001, "%d", __LINE__); \
373 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
374 if(*ptr_1001 == '/') \
375 break; \
376 ptr_1001--; \
377 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700378 mbtk_log(LOG_INFO_LEVEL, "%s#%s: "GSW_NW"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800379 } while(0)
380
381#define LOGD(fmt, args...) \
382 do{ \
383 char *file_ptr_1001 = __FILE__; \
384 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
385 char line_1001[10] = {0}; \
386 sprintf(line_1001, "%d", __LINE__); \
387 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
388 if(*ptr_1001 == '/') \
389 break; \
390 ptr_1001--; \
391 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700392 mbtk_log(LOG_DEBUG_LEVEL, "%s#%s: "GSW_NW"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800393 } while(0)
394
395#define LOGW(fmt, args...) \
396 do{ \
397 char *file_ptr_1001 = __FILE__; \
398 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
399 char line_1001[10] = {0}; \
400 sprintf(line_1001, "%d", __LINE__); \
401 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
402 if(*ptr_1001 == '/') \
403 break; \
404 ptr_1001--; \
405 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700406 mbtk_log(LOG_WARN_LEVEL, "%s#%s: "GSW_NW"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800407 } while(0)
408
409#define LOGE(fmt, args...) \
410 do{ \
411 char *file_ptr_1001 = __FILE__; \
412 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
413 char line_1001[10] = {0}; \
414 sprintf(line_1001, "%d", __LINE__); \
415 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
416 if(*ptr_1001 == '/') \
417 break; \
418 ptr_1001--; \
419 } \
l.yang6a42e4d2025-05-28 01:04:20 -0700420 mbtk_log(LOG_ERR_LEVEL, "%s#%s: "GSW_NW"" fmt, ptr_1001 + 1, line_1001, ##args); \
b.liu68a94c92025-05-24 12:53:41 +0800421 } while(0)
422
423
424
425typedef struct
426{
427 char *lynq_operator_l;
428 char *lynq_operator_s;
429 uint32 lynq_mcc_mnc;
430} lynq_operator_mcc_mnc_t;
431
432static lynq_operator_mcc_mnc_t lynq_operator_mcc_mnc[] =
433{
434 {"China Mobile","CMCC",46000},
435 {"China Unicom","CU",46001},
436 {"China Mobile","CMCC",46002},
437 {"China Telecom","CT",46003},
438 {"China Mobile","CMCC",46004},
439 {"China Telecom","CT",46005},
440 {"China Unicom","CU",46006},
441 {"China Mobile","CMCC",46007},
442 {"China Mobile","CMCC",46008},
443 {"China Unicom","CU",46009},
444 {"China Telecom","CT",46011}
445};
446
447
448//GSW include
449typedef enum prefer_mode
450{
451 GSW_PREFER_MODE_GSW = 1, /**<2G only*/
452 GSW_PREFER_MODE_WCDMA = 2, /**< 3G only*/
453 GSW_PREFER_MODE_WCDMA_GSM = 3, /**< 3G/2G*/
454 GSW_PREFER_MODE_LTE = 4, /**< 4G only*/
455 GSW_PREFER_MODE_NR5G = 5, /**< 5G only*/
456 GSW_PREFER_MODE_NR5G_LTE = 8, /**< 5G/4G*/
457 GSW_PREFER_MODE_LTE_WCDMA_GSM = 9, /**< 4G/3G/2G*/
458 GSW_PREFER_MODE_NR5G_LTE_WCDMA_GSM = 32, /**< 5G/4G/3G/2G*/
459} PREFER_MODE_E;
460
461static int mbtk_nw_api_import()
462{
463 dlHandle_mbtk = dlopen(lib_mbtk_path, RTLD_NOW);
464 if (dlHandle_mbtk == NULL)
465 {
xy.heb41615b2025-05-28 16:33:20 +0800466 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800467 }
468
469 mbtk_log_init = (void (*)(char *path, char *tag))dlsym(dlHandle_mbtk, "mbtk_log_init");
470 if (mbtk_log_init == NULL)
471 {
xy.heb41615b2025-05-28 16:33:20 +0800472 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800473 }
474
475 mbtk_log = (void (*)(int level, const char *format, ...))dlsym(dlHandle_mbtk, "mbtk_log");
476 if (mbtk_log == NULL)
477 {
xy.heb41615b2025-05-28 16:33:20 +0800478 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800479 }
480
481 mbtk_info_handle_get = (mbtk_info_handle_t* (*)(void))dlsym(dlHandle_mbtk, "mbtk_info_handle_get");
482 if (mbtk_info_handle_get == NULL)
483 {
484 LOGE("mbtk_info_handle_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800485 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800486 }
487
488 mbtk_info_handle_free = (int (*)(mbtk_info_handle_t** handle))dlsym(dlHandle_mbtk, "mbtk_info_handle_free");
489 if (mbtk_info_handle_free == NULL)
490 {
491 LOGE("mbtk_info_handle_free dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800492 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800493 }
494
495 mbtk_net_sel_mode_get = (int (*)(mbtk_info_handle_t* handle, mbtk_net_info_t *net))dlsym(dlHandle_mbtk, "mbtk_net_sel_mode_get");
496 if (mbtk_net_sel_mode_get == NULL)
497 {
498 LOGE("mbtk_net_sel_mode_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800499 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800500 }
501
502 mbtk_net_reg_get = (int (*)(mbtk_info_handle_t* handle, mbtk_net_reg_info_t *reg))dlsym(dlHandle_mbtk, "mbtk_net_reg_get");
503 if (mbtk_net_reg_get == NULL)
504 {
505 LOGE("mbtk_net_reg_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800506 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800507 }
508
509 mbtk_get_modem_fun = (int (*)(mbtk_info_handle_t* handle, int* fun))dlsym(dlHandle_mbtk, "mbtk_get_modem_fun");
510 if (mbtk_get_modem_fun == NULL)
511 {
512 LOGE("mbtk_get_modem_fun dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800513 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800514 }
515
516 mbtk_set_modem_fun = (int (*)(mbtk_info_handle_t* handle, mbtk_modem_info_t *info))dlsym(dlHandle_mbtk, "mbtk_set_modem_fun");
517 if (mbtk_set_modem_fun == NULL)
518 {
519 LOGE("mbtk_set_modem_fun dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800520 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800521 }
522
523 mbtk_current_band_get = (int (*)(mbtk_info_handle_t* handle, mbtk_band_info_t *band))dlsym(dlHandle_mbtk, "mbtk_current_band_get");
524 if (mbtk_current_band_get == NULL)
525 {
526 LOGE("mbtk_current_band_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800527 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800528 }
529
530 mbtk_current_band_set = (int (*)(mbtk_info_handle_t* handle, const mbtk_band_info_t *band))dlsym(dlHandle_mbtk, "mbtk_current_band_set");
531 if (mbtk_current_band_set == NULL)
532 {
533 LOGE("mbtk_current_band_set dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800534 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800535 }
536
537 mbtk_net_signal_get = (int (*)(mbtk_info_handle_t* handle, mbtk_signal_info_t *signal))dlsym(dlHandle_mbtk, "mbtk_net_signal_get");
538 if (mbtk_net_signal_get == NULL)
539 {
540 LOGE("mbtk_net_signal_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800541 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800542 }
543
544 mbtk_wakeup_state_set = (int (*)(mbtk_info_handle_t* handle, uint32 wakeup_state))dlsym(dlHandle_mbtk, "mbtk_wakeup_state_set");
545 if (mbtk_wakeup_state_set == NULL)
546 {
547 LOGE("mbtk_wakeup_state_set dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800548 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800549 }
550
551 mbtk_cell_get = (int (*)(mbtk_info_handle_t* handle, mbtk_cell_type_enum *type, list_node_t **cell_list))dlsym(dlHandle_mbtk, "mbtk_cell_get");
552 if (mbtk_cell_get == NULL)
553 {
554 LOGE("mbtk_cell_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800555 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800556 }
557
558 mbtk_signal_state_change_cb_reg = (int (*)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb))dlsym(dlHandle_mbtk, "mbtk_signal_state_change_cb_reg");
559 if (mbtk_signal_state_change_cb_reg == NULL)
560 {
561 LOGE("mbtk_signal_state_change_cb_reg dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800562 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800563 }
564
565 mbtk_net_state_change_cb_reg = (int (*)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb))dlsym(dlHandle_mbtk, "mbtk_net_state_change_cb_reg");
566 if (mbtk_net_state_change_cb_reg == NULL)
567 {
568 LOGE("mbtk_net_state_change_cb_reg dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800569 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800570 }
571
572 mbtk_fplmn_get = (int(*)(mbtk_info_handle_t *handle, void *fplmn))dlsym(dlHandle_mbtk, "mbtk_fplmn_get");
573 if (mbtk_fplmn_get == NULL)
574 {
575 LOGE("mbtk_fplmn_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800576 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800577 }
578
579 mbtk_fplmn_set = (int(*)(mbtk_info_handle_t *handle, void *fplmn))dlsym(dlHandle_mbtk, "mbtk_fplmn_set");
580 if (mbtk_fplmn_set == NULL)
581 {
582 LOGE("mbtk_fplmn_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800583 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800584 }
585
586 mbtk_radio_state_change_cb_reg = (int (*)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb))dlsym(dlHandle_mbtk, "mbtk_radio_state_change_cb_reg");
587 if (mbtk_radio_state_change_cb_reg == NULL)
588 {
589 LOGE("mbtk_radio_state_change_cb_reg dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800590 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800591 }
592
593 mbtk_oos_get = (int (*)(mbtk_info_handle_t* handle, mbtk_oos_info *oos))dlsym(dlHandle_mbtk, "mbtk_oos_get");
594 if (mbtk_oos_get == NULL)
595 {
596 LOGE("mbtk_oos_get dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800597 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800598 }
599
600 mbtk_oos_set = (int (*)(mbtk_info_handle_t* handle, mbtk_oos_info *oos))dlsym(dlHandle_mbtk, "mbtk_oos_set");
601 if (mbtk_oos_set == NULL)
602 {
603 LOGE("mbtk_oos_set dlsym fail\n");
xy.heb41615b2025-05-28 16:33:20 +0800604 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +0800605 }
606
607 return GSW_HAL_SUCCESS;
608}
609
610void list_first(list_node_t *list)
611{
612 if (list) {
613 list->cur_index = 0;
614 list->cur_array_data = list->array_data.next;
615 }
616}
617
618void* list_next(list_node_t *list)
619{
620 if (list) {
621 list_arraynode_t *node = list->cur_array_data;
622 if (node) {
623 LOGE("node is not null\n");
624 list->cur_array_data = list->cur_array_data->next;
625 list->cur_index++;
626 return node->data;
627 } else {
628 LOGE("node is null\n");
629 return NULL;
630 }
631 } else {
632 LOGE("list is null\n");
633 return NULL;
634 }
635}
636
637void list_free(list_node_t *list)
638{
639 if (list) {
640 list_arraynode_t *node = &(list->array_data); // Head node
641 list_arraynode_t *node_temp = NULL;
642 while (node->next) {
643 node_temp = node->next;
644 node->next = node->next->next;
645
646 if (list->free_func) {
647 list->free_func(node_temp->data);
648 } else {
649 free(node_temp->data);
650 }
651 free(node_temp);
652 }
653 free(list);
654 }
655}
656
657static int gsw_rssi_to_csq(int rssi)
658{
659 LOGD("rssi = %d\n",rssi);
660 if(rssi >= -113 && rssi <= -51)
661 {
662 return (rssi + 113) / 2;
663 }
664
665 else
666 {
667 return 99;
668 }
669}
670
671static int gsw_rscp_to_csq(int rscp)
672{
673 LOGD("rscp = %d\n",rscp);
674 if(rscp <= -25 && rscp > -120)
675 {
676 return rscp + 120;
677 }
678 else
679 {
680 return 255;
681 }
682
683}
684
685static int gsw_rsrp_to_csq(int rsrp)
686{
687 LOGD("rsrp = %d\n",rsrp);
688
689 if(rsrp <= -44 && rsrp > -140)
690 {
691 return rsrp + 140;
692 }
693
694 else
695 {
696 return 255;
697 }
698}
699
700static int rscp_convert_to_dBm(int rscp)
701{
702 if(rscp <= 96 && rscp >= 0)
703 {
704 return rscp - 120;
705 }
706 else
707 {
708 return -25;
709 }
710}
711
712
713static int8_t rssi_convert_to_dBm(uint8 rssi)
714{
715 if(rssi <= 31)
716 {
717 return rssi * 2 - 113;
718 }
719 else
720 {
721 return -125;
722 }
723}
724
725static int16_t rsrp_convert_to_dBm(uint8 rsrp)
726{
727 if(rsrp <= 96)
728 {
729 return rsrp - 140;
730 }
731 else
732 {
733 return -44;
734 }
735}
736
737static int16_t rsrq_convert_to_dB(uint8 rsrq)
738{
739 if(rsrq >= 1 && rsrq <= 34)
740 {
741 return (rsrq + 1) / 2 - 20;
742 }
743 else
744 {
745 return -20;
746 }
747}
748
749static int16_t ecno_convert_to_dB(uint8 ecno)
750{
751 if(ecno >= 48)
752 {
753 return 0;
754 }
755 else if(ecno == 255)
756 {
757 return 255;
758 }
759 else
760 {
761 return 48 - ecno;
762 }
763}
764
765
766static int convert_reg_state(int reg_state_t)
767{
768 LOGD("reg_state_t = %d\n",reg_state_t);
769 int reg_state = 0;
770
771 switch (reg_state_t)
772 {
773 case MBTK_NET_REG_STATE_NON:
774 {
775 reg_state = GSW_NETWORK_REG_NOT_REGISTERED;
776 break;
777 }
778 case MBTK_NET_REG_STATE_HOME:
779 {
780 reg_state = GSW_NETWORK_REG_REGISTERED;
781 break;
782 }
783 case MBTK_NET_REG_STATE_SEARCHING:
784 {
785 reg_state = GSW_NETWORK_REG_NOT_REGISTERED_SEARCHING;
786 break;
787 }
788 case MBTK_NET_REG_STATE_DENIED:
789 {
790 reg_state = GSW_NETWORK_REG_REGISTRATION_DENIED;
791 break;
792 }
793 case MBTK_NET_REG_STATE_UNKNOWN:
794 {
795 reg_state = GSW_NETWORK_REG_REGISTRATION_UNKNOWN;
796 break;
797 }
798 case MBTK_NET_REG_STATE_ROAMING:
799 {
800 reg_state = GSW_NETWORK_REG_REGISTRATION_ROAMING;
801 break;
802 }
803 case MBTK_NET_REG_STATE_SMS_ONLY:
804 case MBTK_NET_REG_STATE_ROAMING_SMS:
805 case MBTK_NET_REG_STATE_ATTACHED_EMERGENCY:
806 case MBTK_NET_REG_STATE_CSFB_HOME:
807 case MBTK_NET_REG_STATE_CSFB_ROAMING:
808 case MBTK_NET_REG_STATE_EMERGENCY_ONLY:
809 {
810 reg_state = GSW_NETWORK_REG_LIMITED_SERVICE;
811 break;
812 }
813 }
814
815 return reg_state;
816}
817
818
819static int convert_net_mode(int net_mode)
820{
821 LOGD("net_mode = %d\n",net_mode);
822 switch(net_mode)
823 {
824 case MBTK_RADIO_TECH_GSM:
825 case MBTK_RADIO_TECH_GSM_COMPACT:
826 case MBTK_RADIO_TECH_GSM_EGPRS:
827 {
828 return GSW_NETWORK_RADIO_GSM;
829 }
830 case MBTK_RADIO_TECH_UTRAN:
831 case MBTK_RADIO_TECH_UTRAN_HSDPA:
832 case MBTK_RADIO_TECH_UTRAN_HSUPA:
833 case MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA:
834 case MBTK_RADIO_TECH_UTRAN_HSPA:
835 {
836 return GSW_NETWORK_RADIO_UMTS;
837 }
838 case MBTK_RADIO_TECH_E_UTRAN:
839 {
840 return GSW_NETWORK_RADIO_LTE;
841 }
842
843 default:
844 {
845 return GSW_NETWORK_RADIO_NO_SVC;
846 }
847 }
848
849 return GSW_NETWORK_RADIO_NO_SVC;
850}
851
852static int convert_mbtk_net_config(int config)
853{
854 int net_pref = -1;
855
856 switch(config)
857 {
858 case GSW_PREFER_MODE_GSW:
859 {
860 net_pref = 0;
861 break;
862 }
863
864 case GSW_PREFER_MODE_WCDMA:
865 {
866 net_pref = 1;
867 break;
868 }
869
870 case GSW_PREFER_MODE_WCDMA_GSM:
871 {
872 net_pref = 2;
873 break;
874 }
875
876 case GSW_PREFER_MODE_LTE:
877 case GSW_PREFER_MODE_NR5G:
878 case GSW_PREFER_MODE_NR5G_LTE:
879 {
880 net_pref = 5;
881 break;
882 }
883
884 case GSW_PREFER_MODE_LTE_WCDMA_GSM:
885 case GSW_PREFER_MODE_NR5G_LTE_WCDMA_GSM:
886 {
887 net_pref = 15;
888 break;
889 }
890 }
891
892 return net_pref;
893}
894
895
896static int convert_gsw_net_config(int config)
897{
898 int net_config = -1;
899 LOGD("config = %d\n");
900
901 switch (config)
902 {
903 case 0:
904 {
905 net_config = GSW_PREFER_MODE_GSW;
906 break;
907 }
908
909 case 1:
910 {
911 net_config = GSW_PREFER_MODE_WCDMA;
912 break;
913 }
914
915 case 2:
916 {
917 net_config = GSW_PREFER_MODE_WCDMA_GSM;
918 break;
919 }
920
921 case 5:
922 {
923 net_config = GSW_PREFER_MODE_LTE;
924 break;
925 }
926
927 case 15:
928 {
929 net_config = GSW_PREFER_MODE_LTE_WCDMA_GSM;
930 break;
931 }
932 }
933
934 return net_config;
935}
936
937//64F010 -> 46001 (64->46,F0->0,10->01)
938static void transform_fplmn_str_to_plmn(char *entry)
939{
940 if (strncmp(entry, "FFFFFF", ENTRY_LENGTH) == 0) {
941 return; //if FFFFFF,means invalid fplmn, do nothing
942 }
943
944 char temp = entry[0];
945 entry[0] = entry[1];
946 entry[1] = temp;
947
948 temp = entry[ENTRY_LENGTH - 2];
949 entry[ENTRY_LENGTH - 2] = entry[ENTRY_LENGTH - 1];
950 entry[ENTRY_LENGTH - 1] = temp;
951
952 memmove(entry + 2, entry + 3, ENTRY_LENGTH - 2);
953
954 LOGE("after transform_fplmn_str_to_plmn: %s\n", entry);
955
956 //valid fplmn
957 fplmn_index++;
958}
959
960static void extract_mcc_mnc(char *entry, char *mcc, char *mnc)
961{
962 strncpy(mcc,entry,3);
963 mcc[3] = '\0';
964 strncpy(mnc,entry + 3,2);
965 mnc[2] = '\0';
966
967 LOGE("entry = %s, mcc = %s, mnc = %s\n", entry, mcc, mnc);
968}
969
970
971static void update_fplmn_list(char *fplmn_str)
972{
973 LOGE("fplmn_str = %s\n",fplmn_str);
974 char temp_fplmn_array[FPLMN_ARRAY_SIZE][7];
975 memset(fplmn_array, 0, sizeof(fplmn_array));
976 memset(temp_fplmn_array, 0, sizeof(temp_fplmn_array));
977 fplmn_index = 0;
978 int array_length = 0;
979
980 for (int i = 0; i < strlen(fplmn_str); i += 6) {
981
982 int length = (i + 6 < strlen(fplmn_str)) ? 6 : strlen(fplmn_str) - i;
983 strncpy(temp_fplmn_array[array_length], fplmn_str + i, length);
984 temp_fplmn_array[array_length][length] = '\0';
985 array_length++;
986 if (i + 6 >= strlen(fplmn_str)) {
987 break;
988 }
989 }
990
991 for (int i = 0; i < array_length; i++) {
992 LOGE("array[%d] = %s\n", i, temp_fplmn_array[i]);
993 transform_fplmn_str_to_plmn(temp_fplmn_array[i]);
994 strncpy(fplmn_array[i], temp_fplmn_array[i], ENTRY_LENGTH);
995 LOGE("fplmn_array[%d] = %s\n", i, fplmn_array[i]);
996 }
997
998}
999
1000static void format_plmn(char *result, char *plmn_entry)
1001{
1002 strncpy(result, plmn_entry, strlen(plmn_entry));
1003 LOGE("result = %s, numStr = %s\n",result, plmn_entry);
1004
1005 if (strlen(result) >= 2) {
1006 char temp = result[0];
1007 result[0] = result[1];
1008 result[1] = temp;
1009 }
1010
1011 LOGE("1.result = %s\n",result);
1012
1013 if (strlen(result) >= 3) {
1014 memmove(&result[3], &result[2], strlen(result) - 2 + 1);
1015 result[2] = 'F';
1016 }
1017
1018 LOGE("2.result = %s\n",result);
1019
1020 if (strlen(result) >= 2) {
1021 char temp = result[strlen(result) - 1];
1022 result[strlen(result) - 1] = result[strlen(result) - 2];
1023 result[strlen(result) - 2] = temp;
1024 }
1025
1026 LOGE("3.result = %s\n",result);
1027}
1028
1029
1030static void convert_plmn_to_fplmn_str(char *fplmn_str)
1031{
1032 char temp_fplmn_str[128] = {0};
1033 char temp[20]; // 临时存储单个格式化后的数字
1034 int index = 0;
1035
1036 for (int i = 0; i < fplmn_index; i++) {
1037 memset(temp, 0x0, sizeof(temp));
1038 format_plmn(temp, fplmn_array[i]);
1039 strcat(temp_fplmn_str, temp);
1040 index += strlen(temp);
1041 }
1042
1043 while(index < (6 * fplmn_max_length))
1044 {
1045 temp_fplmn_str[index++] = 'F';
1046 }
1047
1048 // 修剪或截断formattedNumbers,确保它不超过6 * fplmn_max_length个字符
1049 if (index > (6 * fplmn_max_length)) {
1050 temp_fplmn_str[(6 * fplmn_max_length)] = '\0';
1051 }
1052
1053 LOGE("%s\n", temp_fplmn_str);
1054 strncpy(fplmn_str, temp_fplmn_str, strlen(temp_fplmn_str));
1055 LOGE("fplmn_str = %s\n", fplmn_str);
1056}
1057
1058static int check_index(char *mcc, char *mnc)
1059{
1060 int i = 0;
1061
1062 for(i = 0; i < fplmn_index; i++)
1063 {
1064 if(strncmp(fplmn_array[i], mcc, 3) == 0 && strncmp(fplmn_array[i] + 3, mnc, 2) == 0)
1065 {
1066 LOGE("index = %d\n", i);
1067 return i;
1068 }
1069 }
1070
1071 LOGE("not find\n");
1072 return -1;
1073}
1074
1075static void remove_fplmn(int index)
1076{
1077 int write_index = 0;
1078 for (int i = 0; i < fplmn_index; i++) {
1079 if (i != index) {
1080 strncpy(fplmn_array[write_index++], fplmn_array[i], ENTRY_LENGTH);
1081 }
1082 }
1083 fplmn_index--;
1084}
1085
1086static void gsw_serving_info_callback_thread()
1087{
1088 GSW_NW_SERVING_INFO *serving_info = (GSW_NW_SERVING_INFO*)malloc(sizeof(GSW_NW_SERVING_INFO));
1089 memset(serving_info, 0x0, sizeof(GSW_NW_SERVING_INFO));
1090 int ret = -1;
1091 ret = gsw_get_nwinfo(serving_info);
1092 if(ret != 0)
1093 {
1094 LOGE("gsw_get_nwinfo failed\n");
1095 free(serving_info);
1096 return;
1097 }
1098
1099 if(serving_cb)
1100 {
1101 serving_cb(*serving_info);
1102 free(serving_info);
1103 }
1104}
1105
1106static void gsw_serving_info_callback(const void* data, int data_len)
1107{
1108 LOGE("gsw_serving_info_callback start\n");
1109
1110 if(data && data_len > 0)
1111 {
1112 pthread_t thread;
1113 pthread_create(&thread, NULL, (void*)gsw_serving_info_callback_thread, NULL);
1114 }
1115
1116 else
1117 {
1118 LOGE("data is NULL\n");
1119 return;
1120 }
1121
1122}
1123
1124static void gsw_sig_info_callback(const void* data, int data_len)
1125{
1126 LOGE("gsw_sig_info_callback start\n");
1127
1128 if(data && data_len == 8)
1129 {
1130 uint8 *net_data = (uint8*)data;
1131 mbtk_radio_technology_enum type = (mbtk_radio_technology_enum)net_data[0];
1132
1133 signalStrength_t sig_strength;
1134 memset(&sig_strength, 0x0, sizeof(signalStrength_t));
1135
1136 sig_strength.gw_sig_valid = 0;
1137 sig_strength.wcdma_sig_valid = 0;
1138 sig_strength.lte_sig_valid = 0;
1139 sig_strength.nr_sig_valid = 0;
1140
1141 if(type == MBTK_RADIO_TECH_GSM || type == MBTK_RADIO_TECH_GSM_COMPACT || \
1142 type == MBTK_RADIO_TECH_GSM_EGPRS) //GSM
1143 {
1144 sig_strength.gw_sig_valid = 1;
1145 sig_strength.rssi = rssi_convert_to_dBm(net_data[1]);
1146 }
1147
1148 else if(type == MBTK_RADIO_TECH_E_UTRAN)
1149 {
1150 sig_strength.lte_sig_valid = 1;
1151 sig_strength.rsrp = rsrp_convert_to_dBm(net_data[7]);
1152 sig_strength.rsrq = rsrq_convert_to_dB(net_data[6]);
1153 sig_strength.rssnr = -99;
1154 }
1155
1156 else if (type == MBTK_RADIO_TECH_UTRAN || type == MBTK_RADIO_TECH_UTRAN_HSDPA || \
1157 type == MBTK_RADIO_TECH_UTRAN_HSUPA || type == MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA || \
1158 type == MBTK_RADIO_TECH_UTRAN_HSPA )//WCDMA
1159 {
1160 sig_strength.wcdma_sig_valid = 1;
1161 sig_strength.rscp = rssi_convert_to_dBm(net_data[1]);
1162 sig_strength.ecno = ecno_convert_to_dB(net_data[5]);
1163 }
1164
1165 if(sig_cb != NULL)
1166 {
1167 sig_cb(sig_strength);
1168 }
1169 }
1170
1171 else
1172 {
1173 LOGE("data is NULL\n");
1174 }
1175}
1176
1177static void gsw_modem_status_event_callback(const void* data, int data_len)
1178{
1179 LOGE("gsw_modem_status_event_callback start\n");
1180
1181 gsw_mode_state_e state = GSW_MODEM_STATE_UNKNOWN;
1182
1183 if(data && data_len > 0)
1184 {
1185 uint8 *net_data = (uint8*)data;
1186 LOGE("gsw_modem_status_event_callback,data = %d\n", *net_data);
1187 if(*net_data == 1)
1188 {
1189 state = GSW_MODEM_STATE_ONLINE;
1190 }
1191 else if(*net_data == 0)
1192 {
1193 state = GSW_MODEM_STATE_OFFLINE;
1194 }
1195
1196 if(modem_cb != NULL)
1197 {
1198 modem_cb(state);
1199 }
1200 }
1201
1202}
1203
1204static void gsw_reject_callback(GSW_NW_RADIO_ACCESS_TECH_E rat, GSW_SERVICE_DOMAIN_E domain, int cause)
1205{
1206 LOGE("gsw_reject_callback start,rat = %d,domain = %d,cause = %d\n",rat,domain,cause);
1207
1208 GSW_NW_REJ_CAUSE_E *rej_cause = (GSW_NW_REJ_CAUSE_E*)malloc(sizeof(GSW_NW_REJ_CAUSE_E));
1209 memset(rej_cause, 0x0, sizeof(GSW_NW_REJ_CAUSE_E));
1210
1211 rej_cause->rej_cause = cause;
1212 rej_cause->rej_rat = rat;
1213 rej_cause->rej_domain = domain;
1214
1215 if(reject_cb != NULL)
1216 {
1217 LOGE("reject_cb is not NULL\n");
1218 reject_cb(rej_cause);
1219 }
1220 else
1221 {
1222 LOGE("reject_cb is NULL\n");
1223 }
1224
1225 free(rej_cause);
1226 LOGE("gsw_reject_callback end\n");
1227}
1228
1229
xy.hec89938f2025-05-29 14:08:47 +08001230void gsw_sig_info_timer()
1231{
1232 int ret = -1;
1233 if(nw_init_flag == 0 || nw_info_handle == NULL)
1234 {
1235 return;
1236 }
1237
1238 mbtk_signal_info_t signal;
1239 signalStrength_t sig_strength;
1240
1241 while(nw_init_flag)
1242 {
1243 memset(&signal, 0x0, sizeof(mbtk_signal_info_t));
1244 memset(&sig_strength, 0x0, sizeof(signalStrength_t));
1245 ret = mbtk_net_signal_get(nw_info_handle, &signal);
1246 if(ret != 0)
1247 {
1248 LOGE("mbtk_net_signal_get fail\n");
1249 }
1250
1251 else
1252 {
1253 LOGD("signal.type=%d\n", signal.type);
1254 switch(signal.type)
1255 {
1256 case MBTK_RADIO_TECH_GSM:
1257 case MBTK_RADIO_TECH_GSM_COMPACT:
1258 case MBTK_RADIO_TECH_GSM_EGPRS:
1259 {
1260 LOGD("rssi = %d\n",signal.rssi);
1261 sig_strength.gw_sig_valid = 1;
1262 sig_strength.rssi = rssi_convert_to_dBm(signal.rssi);
1263 break;
1264 }
1265 case MBTK_RADIO_TECH_E_UTRAN:
1266 {
1267 LOGD("rsrp = %d\n",signal.rsrp);
1268 sig_strength.lte_sig_valid = 1;
1269 sig_strength.rsrp = rsrp_convert_to_dBm(signal.rsrp);
1270 sig_strength.rsrq = rsrq_convert_to_dB(signal.rsrq);
1271 break;
1272 }
1273 case MBTK_RADIO_TECH_UTRAN:
1274 case MBTK_RADIO_TECH_UTRAN_HSDPA:
1275 case MBTK_RADIO_TECH_UTRAN_HSUPA:
1276 case MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA:
1277 case MBTK_RADIO_TECH_UTRAN_HSPA:
1278 {
1279 LOGD("rscp = %d\n",signal.rscp);
1280 sig_strength.wcdma_sig_valid = 1;
1281 sig_strength.rscp = rssi_convert_to_dBm(signal.rscp);
1282 sig_strength.ecno = ecno_convert_to_dB(signal.ecno);
1283 break;
1284 }
1285 default:
1286 {
1287 LOGD("[%s] unknown reg type.[%d]\n", __func__, signal.type);
1288 }
1289 }
1290 }
1291
1292 if(sig_cb != NULL)
1293 {
1294 sig_cb(sig_strength);
1295 }
1296
1297 sleep(SIG_TIMER);
1298 }
1299}
1300
b.liu68a94c92025-05-24 12:53:41 +08001301
1302/**
1303 * @brief SDK interface to call back serving info
1304 * @param [in] handle_ptr
1305 * @retval 0: success
1306 * @retval other: fail
1307 */
1308int gsw_reg_serving_info_callback(GSW_NW_ServingInfoHandlePtr handle_ptr)
1309{
1310 if (nw_init_flag == 0 || nw_info_handle == NULL)
1311 {
xy.heb41615b2025-05-28 16:33:20 +08001312 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001313 }
1314
1315 if(handle_ptr == NULL)
1316 {
1317 LOGE("handle_ptr is NULL\n");
xy.heb41615b2025-05-28 16:33:20 +08001318 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001319 }
1320
1321 serving_cb = handle_ptr;
1322
1323 return GSW_HAL_SUCCESS;
1324
1325}
1326
1327
1328/**
1329 * @brief SDK interface to call back sig info
1330 * @param [in] handle_ptr
1331 * @retval 0: success
1332 * @retval other: fail
1333 */
1334int gsw_reg_sig_info_callback(GSW_NW_SigInfoHandlePtr handle_ptr)
1335{
1336 if (nw_init_flag == 0 || nw_info_handle == NULL)
1337 {
xy.heb41615b2025-05-28 16:33:20 +08001338 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001339 }
1340
1341 if(handle_ptr == NULL)
1342 {
1343 LOGE("handle_ptr is NULL\n");
xy.heb41615b2025-05-28 16:33:20 +08001344 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001345 }
1346
1347 sig_cb = handle_ptr;
1348
1349 return GSW_HAL_SUCCESS;
1350
1351}
1352
1353
1354/**
1355 * @brief SDK interface to call back rej cause
1356 * @param [in] handle_ptr
1357 * @retval 0: success
1358 * @retval other: fail
1359 */
1360int gsw_reg_rej_cause_callback(GSW_NW_RejectCauseHandlePtr handle_ptr)
1361{
1362 if (nw_init_flag == 0 || nw_info_handle == NULL)
1363 {
xy.heb41615b2025-05-28 16:33:20 +08001364 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001365 }
1366
1367 if(handle_ptr == NULL)
1368 {
1369 LOGE("handle_ptr is NULL\n");
xy.heb41615b2025-05-28 16:33:20 +08001370 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001371 }
1372
1373 reject_cb = handle_ptr;
1374
1375 return GSW_HAL_SUCCESS;
1376}
1377
1378
1379/**
1380 * @brief network sdk init
1381 * @param [in] token usr id define by who use
1382 * @retval 0: success
1383 * @retval other: fail
1384 */
1385int gsw_nw_sdk_init(int token)
1386{
1387 int ret = -1;
xy.hec89938f2025-05-29 14:08:47 +08001388 pthread_t nw_info_thread;
b.liu68a94c92025-05-24 12:53:41 +08001389
1390 if (nw_init_flag == 1 && nw_info_handle != NULL)
1391 {
1392 return GSW_HAL_SUCCESS;
1393 }
1394
1395 ret = mbtk_nw_api_import();
1396 if (ret != 0)
1397 {
1398 LOGE("mbtk_nw_api_import fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001399 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001400 }
1401
1402 nw_info_handle = mbtk_info_handle_get();
1403
1404 if (nw_info_handle == NULL)
1405 {
1406 LOGE("mbtk_info_handle_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001407 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001408 }
1409
1410 char fplmn[256] = {0};
1411 ret = mbtk_fplmn_get(nw_info_handle, fplmn);
1412 if(ret != 0)
1413 {
1414 LOGE("mbtk_fplmn_get failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08001415 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001416 }
1417 fplmn_max_length = (strlen(fplmn)/6);
1418 LOGE("fplmn = %s, fplmn_max_length = %d\n",fplmn,fplmn_max_length);
1419 ret = mbtk_signal_state_change_cb_reg(nw_info_handle, gsw_sig_info_callback);
1420
1421 if (ret != 0)
1422 {
1423 LOGE("mbtk_signal_state_change_cb_reg fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001424 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001425 }
1426
1427 ret = mbtk_net_state_change_cb_reg(nw_info_handle, gsw_serving_info_callback);
1428 if (ret != 0)
1429 {
1430 LOGE("mbtk_net_state_change_cb_reg fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001431 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001432 }
1433
xy.hec89938f2025-05-29 14:08:47 +08001434 ret = pthread_create(&nw_info_thread, NULL, (void*)gsw_sig_info_timer, NULL);
1435 if (ret != 0)
1436 {
1437 LOGE("pthread_create fail\n");
1438 return GSW_HAL_NORMAL_FAIL;
1439 }
1440
b.liu68a94c92025-05-24 12:53:41 +08001441 nw_init_flag = 1;
1442
1443 return GSW_HAL_SUCCESS;
1444}
1445
1446
1447/**
1448 * @brief network sdk deinit
1449 * @param
1450 * @retval 0: success
1451 * @retval other: fail
1452 */
1453int gsw_nw_sdk_deinit(void)
1454{
1455 int ret = -1;
1456
1457 if (nw_init_flag == 0 || nw_info_handle == NULL)
1458 {
xy.heb41615b2025-05-28 16:33:20 +08001459 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001460 }
1461
1462 ret = mbtk_info_handle_free(&nw_info_handle);
1463 if(ret != GSW_HAL_SUCCESS)
1464 {
1465 LOGE("mbtk_info_handle_free fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001466 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001467 }
1468
1469 dlclose(dlHandle_mbtk);
1470 nw_info_handle = NULL;
1471 nw_init_flag = 0;
1472
1473 return GSW_HAL_SUCCESS;
1474
1475}
1476
1477
1478/**
1479 * @brief get current network reg info
1480 * @param [out] serving_info struct for network info
1481 * include regstate ps_state opreator name mcc mcn etc
1482 * @retval 0: success
1483 * @retval other: fail
1484 */
1485int gsw_get_nwinfo(GSW_NW_SERVING_INFO *serving_info)
1486{
1487
1488 int ret = -1;
1489 LOGE("gsw_get_nwinfo start\n");
1490 if (nw_init_flag == 0 || nw_info_handle == NULL)
1491 {
1492 LOGE("nw_sdk_deinit not init\n");
xy.heb41615b2025-05-28 16:33:20 +08001493 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001494 }
1495
1496 LOGE("mbtk_net_reg_get start \n");
1497 //regstate
1498 mbtk_net_reg_info_t reg;
1499 memset(&reg, 0x0, sizeof(mbtk_net_reg_info_t));
1500 ret = mbtk_net_reg_get(nw_info_handle, &reg);
1501 if(ret)
1502 {
1503 LOGE("mbtk_net_reg_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001504 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001505 }
1506
1507 LOGE("convert_cs_reg_state\n");
1508 //cs_state
1509 serving_info->reg_state = convert_reg_state(reg.call_state);
1510 LOGE("convert_ps_reg_state\n");
1511 //ps_state
1512 serving_info->ps_state = convert_reg_state(reg.data_state);
1513 LOGE("convert_rat_mode\n");
1514 //reg_rat
1515 serving_info->reg_rat = convert_net_mode(reg.type);
1516 //srv_domain
1517 if(serving_info->reg_state == GSW_NETWORK_REG_REGISTERED || serving_info->reg_state == GSW_NETWORK_REG_REGISTRATION_ROAMING)
1518 {
1519 if(serving_info->ps_state == GSW_NETWORK_REG_REGISTERED || serving_info->ps_state == GSW_NETWORK_REG_REGISTRATION_ROAMING)
1520 {
1521 serving_info->srv_domain = GSW_SRV_DOMAIN_CS_PS;
1522 }
1523
1524 else
1525 {
1526 serving_info->srv_domain = GSW_SRV_DOMAIN_CS_ONLY;
1527 }
1528 }
1529
1530 else if (serving_info->ps_state == GSW_NETWORK_REG_REGISTERED || serving_info->ps_state == GSW_NETWORK_REG_REGISTRATION_ROAMING)
1531 {
1532 serving_info->srv_domain = GSW_SRV_DOMAIN_PS_ONLY;
1533 }
1534
1535 else
1536 {
1537 serving_info->srv_domain = GSW_SRV_DOMAIN_NO_SVC;
1538 //if ps and cs is both not registed, reg_rat seted to GSW_NETWORK_RADIO_NO_SVC
1539 serving_info->reg_rat = GSW_NETWORK_RADIO_NO_SVC;
1540 }
1541
1542 LOGD("roaming_ind\n");
1543 //roaming_ind
1544 if(serving_info->ps_state == GSW_NETWORK_REG_REGISTRATION_ROAMING)
1545 {
1546 serving_info->roaming_ind = GSW_NETWORK_ROAMING_ON;
1547 }
1548 else
1549 {
1550 serving_info->roaming_ind = GSW_NETWORK_ROAMING_OFF;
1551 }
1552
1553 LOGD("reject\n");
1554 //reject
1555 if(serving_info->ps_state == GSW_NETWORK_REG_REGISTRATION_DENIED || serving_info->reg_state == GSW_NETWORK_REG_REGISTRATION_DENIED)
1556 {
1557 LOGD("reject_callback\n");
1558 gsw_reject_callback(serving_info->reg_rat,serving_info->srv_domain,99);
1559 }
1560
1561 LOGD("reg_plmn / operator name\n");
1562 //reg_plmn / operator name
1563 mbtk_net_info_t net;
1564 memset(&net, 0x0, sizeof(mbtk_net_info_t));
1565 LOGD("mbtk_net_sel_mode_get start \n");
1566 ret = mbtk_net_sel_mode_get(nw_info_handle, &net);
1567 LOGD("mbtk_net_sel_mode_get end \n");
1568 if(ret == 0 && net.plmn > 0)
1569 {
1570 int i = 0;
1571
1572 LOGD("start to find mcc");
1573 while(i < ARRAY_SIZE(lynq_operator_mcc_mnc))
1574 {
1575 if(lynq_operator_mcc_mnc[i].lynq_mcc_mnc == net.plmn)
1576 {
1577 LOGD("find mcc\n");
1578 break;
1579 }
1580 i++;
1581 }
1582
1583
1584 if(i == ARRAY_SIZE(lynq_operator_mcc_mnc))
1585 {
1586 LOGD("not find mcc");
1587 strcpy(serving_info->operator_name, "unknown");
1588 sprintf(serving_info->reg_plmn, "%d", net.plmn);
1589 }
1590
1591 else
1592 {
1593 LOGD("find mcc\n");
1594 strcpy(serving_info->operator_name, lynq_operator_mcc_mnc[i].lynq_operator_l);
1595 sprintf(serving_info->reg_plmn, "%d", net.plmn);
1596 }
1597
1598 LOGE("operator_name = %s\n", serving_info->operator_name);
1599 LOGE("reg_plmn = %s\n", serving_info->reg_plmn);
1600 }
1601
1602
1603 LOGD("get cell id/tac/lac/sid/nid\n");
1604 //cell id/tac/lac/sid/nid
1605 mbtk_cell_type_enum cell_type;
1606 if(serving_info->reg_rat == GSW_NETWORK_RADIO_GSM)
1607 {
1608 cell_type = MBTK_CELL_TYPE_GSM;
1609 }
1610 else if(serving_info->reg_rat == GSW_NETWORK_RADIO_UMTS)
1611 {
1612 cell_type = MBTK_CELL_TYPE_UMTS;
1613 }
1614 else
1615 {
1616 cell_type = MBTK_CELL_TYPE_LTE;
1617 }
1618
1619 list_node_t* cell_list = NULL;
1620
1621 LOGD("mbtk_cell_get start\n");
1622 ret = mbtk_cell_get(nw_info_handle, &cell_type, &cell_list);
1623 if(ret != 0 || cell_list == NULL)
1624 {
1625 LOGE("mbtk_cell_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001626 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001627 }
1628 else
1629 {
1630 LOGE("mbtk_cell_get end,start to get node\n");
1631 list_first(cell_list);
1632 LOGE("list_first end\n");
1633 mbtk_cell_info_t* cell = (mbtk_cell_info_t*) list_next(cell_list);
1634 if(cell)
1635 {
1636 LOGE("cell is not null,value2 = %u\n",cell->value2);
1637 switch(cell_type)
1638 {
1639 case MBTK_CELL_TYPE_LTE:
1640 {
1641 LOGE("is lte\n");
1642 //LOGE("LTE : tac=%x, PCI=%x, dlEuarfcn=%x, ulEuarfcn=%x, band=%x\n", cell->value1, cell->value2, cell->value3, cell->value4, cell->value5);
1643 LOGE("LTE : tac=%d, PCI=%d, dlEuarfcn=%d, ulEuarfcn=%d, band=%d\n", cell->value1, cell->value2, cell->value3, cell->value4, cell->value5);
1644 snprintf(serving_info->tac,sizeof(serving_info->tac),"%d",cell->value1);
1645 strcpy(serving_info->lac,"");
1646 snprintf(serving_info->cell_id,sizeof(serving_info->cell_id),"%d",cell->value8);
1647 break;
1648 }
1649
1650 case MBTK_CELL_TYPE_GSM:
1651 {
1652 LOGE("is gsm\n");
1653 LOGE("GSM : lac=%d, ci=%d, arfcn=%d, bsic=%d\n", cell->value1, cell->value2, cell->value3, cell->value4);
1654 sprintf(serving_info->lac,"%d",cell->value1);
1655 memset(serving_info->tac,0,sizeof(serving_info->tac));
1656 sprintf(serving_info->cell_id,"%d",cell->value2);
1657 break;
1658 }
1659 case MBTK_CELL_TYPE_UMTS:
1660 {
1661 LOGE("is wcdma\n");
1662 LOGE("UMTS : lac=%d, ci=%d, arfcn=%d\n", cell->value1, cell->value2, cell->value3);
1663 sprintf(serving_info->lac,"%d",cell->value1);
1664 memset(serving_info->tac,0,sizeof(serving_info->tac));
1665 sprintf(serving_info->cell_id,"%d",cell->value2);
1666 break;
1667 }
1668
1669 default:
1670 break;
1671 }
1672 }
1673 else
1674 {
1675 LOGE("cell is null\n");
1676 }
1677 }
1678
1679 //not support now
1680 serving_info->sid = 0;
1681 serving_info->nid = 0;
1682
1683 return GSW_HAL_SUCCESS;
1684}
1685
1686
1687/**
1688 * @brief get current network type
1689 * @param [out] netype as GSW_NW_RADIO_ACCESS_TECH_E type
1690 * @retval 0: success
1691 * @retval other: fail
1692 */
1693int gsw_get_netype(int *netype)
1694{
1695 int ret = -1;
1696
1697 if (nw_init_flag == 0 || nw_info_handle == NULL)
1698 {
xy.heb41615b2025-05-28 16:33:20 +08001699 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001700 }
1701
1702 //regstate
1703 mbtk_net_reg_info_t reg;
1704 ret = mbtk_net_reg_get(nw_info_handle, &reg);
1705 if(ret)
1706 {
1707 LOGE("mbtk_net_reg_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001708 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001709 }
1710
1711 if(reg.data_state == MBTK_NET_REG_STATE_HOME || reg.data_state == MBTK_NET_REG_STATE_ROAMING)
1712 {
1713 *netype = convert_net_mode(reg.type);
1714 }
1715 else
1716 {
1717 *netype = GSW_NETWORK_RADIO_NO_SVC;
1718 }
1719
1720 return GSW_HAL_SUCCESS;
1721}
1722
1723
1724/**
1725 * @brief get radio opmode, as open and close airplane mode
1726 * @param [out] op_mode 1 is radio on, 0 is radio off
1727 * @retval 0: success
1728 * @retval other: fail
1729 */
1730int gsw_get_opmode(int *op_mode)
1731{
1732 int tmp_rf = -1;
1733 int ret = -1;
1734 if (nw_init_flag == 0 || nw_info_handle == NULL)
1735 {
xy.heb41615b2025-05-28 16:33:20 +08001736 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001737 }
1738
1739 ret = mbtk_get_modem_fun(nw_info_handle, &tmp_rf);
1740 if (ret != 0)
1741 {
1742 LOGE("mbtk_get_modem_fun fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001743 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001744 }
1745 if(tmp_rf == LYNQ_AIR_CFUN_MODE_OFF)
1746 {
1747 *op_mode = GSW_OP_MODE_LPM;
1748 }
1749
1750 if(tmp_rf == LYNQ_AIR_PLANE_MODE_ON)
1751 {
1752 *op_mode = GSW_OP_MODE_OFFLINE;
1753 }
1754
1755 if(tmp_rf == LYNQ_AIR_PLANE_MODE_OFF)
1756 {
1757 *op_mode = GSW_OP_MODE_ONLINE;
1758 }
1759
1760 return GSW_HAL_SUCCESS;
1761}
1762
1763
1764
1765/**
1766 * @brief set radio opmode, as open and close airplane mode
1767 * @param [in] op_mode 1 is radio on, 0 is radio off
1768 * @retval 0: success
1769 * @retval other: fail
1770 */
1771int gsw_set_opmode(int op_mode)
1772{
1773 mbtk_modem_info_t info;
1774 int rf_mode = -1;
1775 int ret = -1;
1776
1777 if (nw_init_flag == 0 || nw_info_handle == NULL)
1778 {
xy.heb41615b2025-05-28 16:33:20 +08001779 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001780 }
1781
1782 if(op_mode == GSW_OP_MODE_LPM)
1783 {
1784 rf_mode = LYNQ_AIR_CFUN_MODE_OFF;
1785 }
1786
1787 if(op_mode == GSW_OP_MODE_ONLINE)
1788 {
1789 rf_mode = LYNQ_AIR_PLANE_MODE_OFF;
1790 }
1791
1792 if(op_mode == GSW_OP_MODE_OFFLINE)
1793 {
1794 rf_mode = LYNQ_AIR_PLANE_MODE_ON;
1795 }
1796
1797 if (rf_mode != LYNQ_AIR_PLANE_MODE_ON && rf_mode != LYNQ_AIR_PLANE_MODE_OFF && rf_mode != LYNQ_AIR_CFUN_MODE_OFF)
1798 {
1799 LOGE("Input mode is error!\n");
xy.heb41615b2025-05-28 16:33:20 +08001800 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001801 }
1802
1803 info.fun = rf_mode;
1804 info.rst = 0;
1805 ret = mbtk_set_modem_fun(nw_info_handle, &info);
1806 if (ret != 0)
1807 {
1808 LOGE("gsw_set_opmode fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001809 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001810 }
1811
1812 return GSW_HAL_SUCCESS;
1813
1814}
1815
1816
1817/**
1818 * @brief get network mode preference of mdm search network scale
1819 * @param [out] mode_pref net_work pref mode:
1820 * enum prefer_mode
1821 * @retval 0: success
1822 * @retval other: fail
1823 */
1824int gsw_get_mode_preference(int *mode_pref)
1825{
1826 if (nw_init_flag == 0 || nw_info_handle == NULL)
1827 {
xy.heb41615b2025-05-28 16:33:20 +08001828 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001829 }
1830
1831 int ret = -1;
1832 mbtk_band_info_t band;
1833 memset(&band, 0, sizeof(mbtk_band_info_t));
1834
1835 ret = mbtk_current_band_get(nw_info_handle, &band);
1836 if(ret != 0)
1837 {
1838 LOGE("mbtk_current_band_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001839 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001840 }
1841
1842 *mode_pref = convert_gsw_net_config(band.net_pref);
1843 LOGE("band.net_pref = %d\n", *mode_pref);
1844 if(*mode_pref <= 0)
1845 {
1846 LOGE("no support mode\n");
xy.heb41615b2025-05-28 16:33:20 +08001847 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001848 }
1849 return GSW_HAL_SUCCESS;
1850
1851
1852}
1853
1854/**
1855 * @brief set network mode preference of mdm search network scale
1856 * @param [in] mode_pref net_work pref mode:
1857 * enum prefer_mode
1858 * @retval 0: success
1859 * @retval other: fail
1860 */
1861int gsw_set_mode_preference(int mode_pref)
1862{
1863 if (nw_init_flag == 0 || nw_info_handle == NULL)
1864 {
xy.heb41615b2025-05-28 16:33:20 +08001865 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001866 }
1867
1868 int ret = -1;
1869
1870 mbtk_band_info_t band;
1871 memset(&band, 0, sizeof(mbtk_band_info_t));
1872
1873 band.net_pref = convert_mbtk_net_config(mode_pref);
1874 LOGE("band.net_pref = %d\n", band.net_pref);
1875
1876 if(band.net_pref < 0)
1877 {
1878 LOGE("no support mode\n");
xy.heb41615b2025-05-28 16:33:20 +08001879 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001880 }
1881
1882 ret = mbtk_current_band_set(nw_info_handle, &band);
1883 if(ret != 0)
1884 {
1885 LOGE("mbtk_current_band_set fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001886 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001887 }
1888
1889 return GSW_HAL_SUCCESS;
1890}
1891
1892/**
1893 * @brief get signal csq value
1894 * @param [out] csq_value csq of signalstrengh 0 - 31, 99 invalid
1895 * @retval 0: success
1896 * @retval other: fail
1897 */
1898int gsw_get_sig_info(int *csq_value)
1899{
1900 int ret = -1;
1901
1902 if (nw_init_flag == 0 || nw_info_handle == NULL)
1903 {
xy.heb41615b2025-05-28 16:33:20 +08001904 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001905 }
1906
1907 mbtk_signal_info_t signal;
1908 memset(&signal, 0x0, sizeof(mbtk_signal_info_t));
1909 ret = mbtk_net_signal_get(nw_info_handle, &signal);
1910 if(ret != 0)
1911 {
1912 LOGE("mbtk_net_signal_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001913 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001914 }
1915
1916 LOGD("signal.type=%d\n", signal.type);
1917 switch(signal.type)
1918 {
1919 case MBTK_RADIO_TECH_GSM:
1920 case MBTK_RADIO_TECH_GSM_COMPACT:
1921 case MBTK_RADIO_TECH_GSM_EGPRS:
1922 {
1923 LOGD("rssi = %d\n",signal.rssi);
1924 *csq_value = rssi_convert_to_dBm(signal.rssi);
1925 break;
1926 }
1927 case MBTK_RADIO_TECH_E_UTRAN:
1928 {
1929 LOGD("rsrp = %d\n",signal.rsrp);
1930 *csq_value = rsrp_convert_to_dBm(signal.rsrp);
1931 break;
1932 }
1933 case MBTK_RADIO_TECH_UTRAN:
1934 case MBTK_RADIO_TECH_UTRAN_HSDPA:
1935 case MBTK_RADIO_TECH_UTRAN_HSUPA:
1936 case MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA:
1937 case MBTK_RADIO_TECH_UTRAN_HSPA:
1938 {
1939 LOGD("rscp = %d\n",signal.rscp);
1940 *csq_value = rscp_convert_to_dBm(signal.rscp);
1941 break;
1942 }
1943 default:
1944 {
1945 LOGD("[%s] unknown reg type.[%d]\n", __func__, signal.type);
xy.heb41615b2025-05-28 16:33:20 +08001946 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001947 }
1948 }
1949 return GSW_HAL_SUCCESS;
1950}
1951
1952/**
1953 * @brief set nework power mode, for tcam enter standby or exit standby
1954 * @param [in] mode TRUE(1) when enter standby, FALSE(0) after wake up
1955 * @retval 0: success
1956 * @retval other: fail
1957 */
1958int gsw_network_set_power_mode(char mode)
1959{
1960 int ret = -1;
1961
1962 if (nw_init_flag == 0 || nw_info_handle == NULL)
1963 {
xy.heb41615b2025-05-28 16:33:20 +08001964 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001965 }
1966
1967 if(mode != 0 && mode != 1)
1968 {
1969 LOGE("Input mode is error!\n");
xy.heb41615b2025-05-28 16:33:20 +08001970 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001971 }
1972
1973 if(mode == 1)
1974 {
1975 mode = 6;
1976 }
1977
1978 ret = mbtk_wakeup_state_set(nw_info_handle, mode);
1979 if(ret != 0)
1980 {
1981 LOGE("mbtk_wakeup_state_set fail\n");
xy.heb41615b2025-05-28 16:33:20 +08001982 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08001983 }
1984
1985 return GSW_HAL_SUCCESS;
1986
1987
1988
1989}
1990
1991/**
1992 * @brief convert rsrp rscp rssi to csq value.
1993 * @param [in] netType signal radio tech 2 means 2G 3 mens 3G,4 is 4G,5 is 5G
1994 * @param [in] sigvalue input signal_strength for different nettype
1995 * rsrp for 4G/5G, rscp for 3G, rssi for 2G
1996
1997 * @retval csq
1998 * @retval other: fail
1999 */
2000int gsw_sigInfo_to_csq(int netType, int sigValue)
2001{
2002 switch(netType)
2003 {
2004 case 1:
2005 case 2:
2006 case 3:
2007 case 4: //GSM
2008 {
2009 return gsw_rssi_to_csq(sigValue);
2010 }
2011
2012 case 5: //WCDMA
2013 {
2014 return gsw_rscp_to_csq(sigValue);
2015 }
2016
2017 case 6: //LTE
2018 {
2019 return gsw_rsrp_to_csq(sigValue);
2020 }
2021
2022 default:
2023 {
2024 LOGE("parameter error\n");
xy.heb41615b2025-05-28 16:33:20 +08002025 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002026 }
2027 }
2028}
2029
2030/*
2031 * @brief get mobile operator name
2032 @param [out] nw_operator_name_infos get the long and short operator name info
2033 @retval 0: success
2034 @retval 0: other: fail
2035 */
2036int gsw_get_mobile_operator_name(gsw_mobile_operator_name *nw_operator_name_infos)
2037{
2038 char OperatorFN[128];
2039 char OperatorSH[128];
2040 char temp[12] = {0};
2041 mbtk_net_info_t net;
2042
2043 if (nw_init_flag == 0 || nw_info_handle == NULL)
2044 {
xy.heb41615b2025-05-28 16:33:20 +08002045 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002046 }
2047
2048 if(!mbtk_net_sel_mode_get(nw_info_handle, &net) && net.plmn > 0)
2049 {
2050 LOGE("Net : %d, %d, %d\n", net.net_sel_mode, net.net_type, net.plmn);
2051 int i = 0;
2052 while(i < ARRAY_SIZE(lynq_operator_mcc_mnc))
2053 {
2054 if(lynq_operator_mcc_mnc[i].lynq_mcc_mnc == net.plmn)
2055 break;
2056 i++;
2057 }
2058
2059 if(i == ARRAY_SIZE(lynq_operator_mcc_mnc)) // No found mcc&mnc
2060 {
2061 strcpy(OperatorFN, "UNKNOWN");
2062 strcpy(OperatorSH, "UNKNOWN");
2063 }
2064 else
2065 {
2066 strcpy(OperatorFN, lynq_operator_mcc_mnc[i].lynq_operator_l);
2067 strcpy(OperatorSH, lynq_operator_mcc_mnc[i].lynq_operator_s);
2068
2069 memset(temp,0,12);
2070 memset(nw_operator_name_infos->mcc,0,4);
2071 sprintf(temp, "%d", (lynq_operator_mcc_mnc[i].lynq_mcc_mnc)/100);
2072 strncpy(nw_operator_name_infos->mcc, temp, strlen(temp));
2073
2074 memset(temp,0,12);
2075 memset(nw_operator_name_infos->mnc,0,4);
2076 sprintf(temp, "%d", (lynq_operator_mcc_mnc[i].lynq_mcc_mnc)%100);
2077 strncpy(nw_operator_name_infos->mnc, temp, strlen(temp));
2078 }
2079
2080 memset(nw_operator_name_infos->long_eons,0,128);
2081 memcpy(nw_operator_name_infos->long_eons,OperatorFN,strlen(OperatorFN));
2082 memset(nw_operator_name_infos->short_eons,0,128);
2083 memcpy(nw_operator_name_infos->short_eons,OperatorSH,strlen(OperatorSH));
2084
2085 return GSW_HAL_SUCCESS;
2086 }
2087
2088 else
2089 {
2090 LOGE("mbtk_net_sel_mode_get fail\n");
xy.heb41615b2025-05-28 16:33:20 +08002091 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002092 }
2093
2094 return GSW_HAL_SUCCESS;
2095}
2096
2097
2098/*
2099 * @brief get current serving cell info
2100 * @param cell_info: [out] struct for current cell info
2101 * include earfcn mcc mnc pci psc tac lac etc.
2102 * @return int: 0 is success, other failed
2103 */
2104int gsw_get_cell_info(GSW_NW_CELL_INFO *cell_info)
2105{
2106 int ret = -1;
2107
2108 if (nw_init_flag == 0 || nw_info_handle == NULL)
2109 {
2110 LOGE("nw_sdk_deinit not init\n");
xy.heb41615b2025-05-28 16:33:20 +08002111 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002112 }
2113
2114 list_node_t* cell_list = NULL;
2115 int neibor_count = 0;
2116 mbtk_cell_type_enum type;
2117 ret = mbtk_cell_get(nw_info_handle, &type, &cell_list);
2118 if(ret || cell_list == NULL) {
2119 LOGE("mbtk_cell_get failed : %d\n", ret);
2120 } else {
2121 list_first(cell_list);
2122 mbtk_cell_info_t* cell = (mbtk_cell_info_t*) list_next(cell_list);
2123 if(cell) { // Current server cell.
2124 switch(type)
2125 {
2126 case 0:
2127 {
2128 LOGD("GSM : lac=%d, ci=%d, arfcn=%d, bsic=%d\n", cell->value1, cell->value2, cell->value3, cell->value4);
2129 char gsm_temp[12] = {0};
2130
2131 cell_info->rat = GSW_NETWORK_RADIO_GSM;
2132
2133 cell_info->mcc_valid = 1;
2134 snprintf(gsm_temp, sizeof(gsm_temp) ,"%d", cell->value5);
2135 strncpy(cell_info->mcc, gsm_temp, sizeof(cell_info->mcc));
2136
2137 memset(gsm_temp, 0, sizeof(gsm_temp));
2138
2139 cell_info->mnc_valid = 1;
2140 snprintf(gsm_temp, sizeof(gsm_temp) ,"%d", cell->value6);
2141 strncpy(cell_info->mnc, gsm_temp, sizeof(cell_info->mnc));
2142
2143 cell_info->cell_id_valid = 1;
2144 cell_info->cell_id = cell->value2;
2145
2146 cell_info->lac_valid = 1;
2147 cell_info->lac = cell->value1;
2148
2149 cell_info->arfcn_valid = 1;
2150 cell_info->arfcn = cell->value3;
2151
2152 break;
2153 }
2154
2155 case 1:
2156 {
2157 LOGD("UMTS : lac=%d, ci=%d, arfcn=%d\n", cell->value1, cell->value2, cell->value3);
2158 char wcdma_temp[12] = {0};
2159
2160 cell_info->rat = GSW_NETWORK_RADIO_UMTS;
2161
2162 cell_info->mcc_valid = 1;
2163 snprintf(wcdma_temp, sizeof(wcdma_temp) ,"%d", cell->value4);
2164 strncpy(cell_info->mcc, wcdma_temp, sizeof(cell_info->mcc));
2165
2166 memset(wcdma_temp, 0, sizeof(wcdma_temp));
2167
2168 cell_info->mnc_valid = 1;
2169 snprintf(wcdma_temp, sizeof(wcdma_temp) ,"%d", cell->value5);
2170 strncpy(cell_info->mnc, wcdma_temp, sizeof(cell_info->mnc));
2171
2172 cell_info->lac_valid = 1;
2173 cell_info->lac = cell->value1;
2174
2175 cell_info->cell_id_valid = 1;
2176 cell_info->cell_id = cell->value2;
2177
2178 cell_info->uarfcn_valid = 1;
2179 cell_info->uarfcn = cell->value3;
2180
2181 cell_info->psc_valid = 1;
2182 cell_info->psc = cell->value6;
2183 break;
2184 }
2185
2186 case 2:
2187 {
2188 LOGE("LTE : tac=%d, PCI=%d, dlEuarfcn=%d, ulEuarfcn=%d, band=%d\n", cell->value1, cell->value2, cell->value3, cell->value4, cell->value5);
2189
2190 char lte_temp[12] = {0};
2191
2192 cell_info->rat = GSW_NETWORK_RADIO_LTE;
2193
2194 cell_info->mcc_valid = 1;
2195 snprintf(lte_temp, sizeof(lte_temp) ,"%X", cell->value6);
2196 strncpy(cell_info->mcc, lte_temp, sizeof(cell_info->mcc));
2197
2198 memset(lte_temp, 0, sizeof(lte_temp));
2199
2200 cell_info->mnc_valid = 1;
2201 snprintf(lte_temp, sizeof(lte_temp) ,"%X", cell->value7);
2202 strncpy(cell_info->mnc, lte_temp, sizeof(cell_info->mnc));
2203
2204 cell_info->tac_valid = 1;
2205 cell_info->tac = cell->value1;
2206
2207 cell_info->pci_valid = 1;
2208 cell_info->pci = cell->value2;
2209
2210 cell_info->earfcn_valid = 1;
2211 cell_info->earfcn = cell->value3;
2212
2213 cell_info->bler_valid = 1;
2214 cell_info->bler = cell->value4;
2215
2216 cell_info->band_valid = 1;
2217 cell_info->band = cell->value5;
2218
2219 cell_info->rsrp_valid = 1;
2220 cell_info->rsrp = cell->value8;
2221
2222 cell_info->rsrq_valid = 1;
2223 cell_info->rsrq = cell->value9;
2224
2225 cell_info->cell_id_valid = 1;
2226 cell_info->cell_id = cell->value10;
2227
2228 break;
2229 }
2230
2231 default:
2232 break;
2233 }
2234 }
2235
2236 while ((cell = (mbtk_cell_info_t*) list_next(cell_list)) && neibor_count < 5)
2237 {
2238 switch(type)
2239 {
2240 //GSM
2241 case 0:
2242 {
2243
2244 }
2245 //WCDMA
2246 case 1:
2247 {
2248 LOGE("CELL : lac=%d, ci=%d, arfcn=%d\n", cell->value1, cell->value2, cell->value3);
2249
2250 //cell_info->ext_info[neibor_count]->lac = cell->value1;
2251
2252 cell_info->ext_info[neibor_count].cell_id_valid = 1;
2253 cell_info->ext_info[neibor_count].cell_id = cell->value2;
2254
2255 cell_info->ext_info[neibor_count].arfcn_valid = 1;
2256 cell_info->ext_info[neibor_count].arfcn = cell->value3;
2257
2258 cell_info->ext_info[neibor_count].rat = cell_info->rat = GSW_NETWORK_RADIO_UMTS;
2259
2260 neibor_count++;
2261
2262 }
2263 //LTE
2264 case 2:
2265 {
2266 LOGE("CELL : phyCellId=%d, euArfcn=%d, rsrp=%d, rsrq=%d\n", cell->value1, cell->value2, cell->value3, cell->value4);
2267 char lte_temp[12] = {0};
2268 cell_info->ext_info[neibor_count].rat = GSW_NETWORK_RADIO_LTE;
2269
2270 snprintf(lte_temp, sizeof(lte_temp) ,"%X", cell->value6);
2271 strncpy(cell_info->ext_info[neibor_count].mcc, lte_temp, sizeof(cell_info->mcc));
2272
2273 memset(lte_temp, 0, sizeof(lte_temp));
2274
2275 snprintf(lte_temp, sizeof(lte_temp) ,"%X", cell->value7);
2276 strncpy(cell_info->ext_info[neibor_count].mnc, lte_temp, sizeof(cell_info->mnc));
2277
2278 cell_info->ext_info[neibor_count].pci = cell->value1;
2279 cell_info->ext_info[neibor_count].pci_valid = 1;
2280
2281 cell_info->ext_info[neibor_count].arfcn = cell->value2;
2282 cell_info->ext_info[neibor_count].arfcn_valid = 1;
2283
2284 cell_info->ext_info[neibor_count].rsrp = cell->value3;
2285 cell_info->ext_info[neibor_count].rsrp_valid = 1;
2286
2287 cell_info->ext_info[neibor_count].rsrq = cell->value4;
2288 cell_info->ext_info[neibor_count].rsrq_valid = 1;
2289
2290 cell_info->ext_info[neibor_count].cell_id = cell->value5;
2291 cell_info->ext_info[neibor_count].cell_id_valid = 1;
2292
2293 cell_info->ext_info[neibor_count].band = cell->value9;
2294 cell_info->ext_info[neibor_count].band_valid = 1;
2295
2296 cell_info->ext_info[neibor_count].rssi = cell->value10;
2297 cell_info->ext_info[neibor_count].rssi_valid = 1;
2298
2299 neibor_count++;
2300 }
2301
2302 default:
2303 break;
2304 }
2305 }
2306 }
2307 list_free(cell_list);
2308
2309 return GSW_HAL_SUCCESS;
2310}
2311
2312/*
2313 * @brief set modem status event callback
2314 @param [in] handle_ptr callback function address
2315 @retval 0: success
2316 @retval 0: other: fail
2317 */
2318int gsw_reg_set_modem_status_event_callback(GSW_NW_ModemStateHandlePtr handle_ptr)
2319{
2320
2321 if (nw_init_flag == 0 || nw_info_handle == NULL)
2322 {
xy.heb41615b2025-05-28 16:33:20 +08002323 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002324 }
2325
2326 int ret = -1;
2327
2328 if(handle_ptr == NULL)
2329 {
2330 LOGE("handle_ptr is NULL\n");
xy.heb41615b2025-05-28 16:33:20 +08002331 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002332 }
2333
2334 modem_cb = handle_ptr;
2335
2336 ret = mbtk_radio_state_change_cb_reg(nw_info_handle,gsw_modem_status_event_callback);
2337 if(ret != 0)
2338 {
2339 LOGE("mbtk_radio_state_change_cb_reg failed : %d\n", ret);
xy.heb41615b2025-05-28 16:33:20 +08002340 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002341 }
2342
2343 return GSW_HAL_SUCCESS;
2344
2345}
2346
2347
2348/*
2349 * @brief get PLMNs from the FPLMN list
2350 * @param [inout] plmn_list:
2351 * @retval 0: success
2352 * @retval other: fail
2353 */
2354int gsw_get_forbidden_networks(gsw_nw_plmn_list_t *plmn_list)
2355{
2356 if (nw_init_flag == 0 || nw_info_handle == NULL)
2357 {
xy.heb41615b2025-05-28 16:33:20 +08002358 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002359 }
2360
2361 int ret = -1;
2362 char fplmn[256] = {0};
2363 LOGE("mbtk_fplmn_get enter\n");
2364 ret = mbtk_fplmn_get(nw_info_handle, fplmn);
2365 LOGE("mbtk_fplmn_get exit\n");
2366 if(ret != 0)
2367 {
2368 LOGE("mbtk_fplmn_get failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002369 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002370 }
2371
2372 update_fplmn_list(fplmn);
2373 for(int i = 0; i < fplmn_index; i++)
2374 {
2375 if(strcmp(fplmn_array[i],"FFFFFF") == 0)
2376 {
2377 continue;
2378 }
2379 extract_mcc_mnc(fplmn_array[i], plmn_list->plmn_list[plmn_list->plmn_list_len].mcc, plmn_list->plmn_list[plmn_list->plmn_list_len].mnc);
2380 LOGE("mcc = %s, mnc = %s\n", plmn_list->plmn_list[plmn_list->plmn_list_len].mcc, plmn_list->plmn_list[plmn_list->plmn_list_len].mnc);
2381 plmn_list->plmn_list_len++;
2382 }
2383
2384 LOGE("fplmn = %s\n", fplmn);
2385 return GSW_HAL_SUCCESS;
2386}
2387
2388/*
2389 * @brief add PLMNs from the plmn_list to the FPLMN list
2390 * @param [in] plmn_list:
2391 * @retval 0: success
2392 * @retval other: fail
2393 */
2394int gsw_add_forbidden_networks(gsw_nw_plmn_list_t *plmn_list)
2395{
2396
2397 if (nw_init_flag == 0 || nw_info_handle == NULL)
2398 {
xy.heb41615b2025-05-28 16:33:20 +08002399 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002400 }
2401
2402 if(plmn_list->plmn_list_len >= fplmn_max_length)
2403 {
2404 LOGE("can't save all the plmn\n");
xy.heb41615b2025-05-28 16:33:20 +08002405 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002406 }
2407
2408 int i = 0;
2409 int index = -1;
2410
2411 for(i = 0; i < plmn_list->plmn_list_len; i++)
2412 {
2413 index = check_index(plmn_list->plmn_list[i].mcc, plmn_list->plmn_list[i].mnc);
2414
2415 if(index == -1)
2416 {
2417 LOGE("no this PLMN, add it\n");
2418 if((fplmn_index + plmn_list->plmn_list_len) > fplmn_max_length)
2419 {
2420 LOGE("can't save all the plmn\n");
xy.heb41615b2025-05-28 16:33:20 +08002421 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002422 }
2423
2424 else
2425 {
2426 memcpy(fplmn_array[fplmn_index], plmn_list->plmn_list[i].mcc, 3);
2427 memcpy(fplmn_array[fplmn_index] + 3, plmn_list->plmn_list[i].mnc, 2);
2428 fplmn_array[fplmn_index][5] = '\0';
2429 LOGE("fplmn_array[%d] = %s\n", fplmn_index, fplmn_array[fplmn_index]);
2430 fplmn_index++;
2431 }
2432 }
2433
2434 else
2435 {
2436 LOGE("already have this PLMN, don't add it\n");
2437 }
2438 }
2439
2440 char fplmn_str[256] = {0};
2441 convert_plmn_to_fplmn_str(fplmn_str);
2442
2443 LOGE("fplmn_str = %s\n", fplmn_str);
2444
2445 int ret = mbtk_fplmn_set(nw_info_handle, fplmn_str);
2446 if(ret != 0)
2447 {
2448 LOGE("mbtk_fplmn_set failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002449 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002450 }
2451
2452 LOGE("gsw_add_forbidden_networks exit\n");
2453 return GSW_HAL_SUCCESS;
2454}
2455
2456/*
2457 * @brief Remove PLMNs from the plmn_list from the FPLMN list
2458 * @param [in] plmn_list:
2459 * @retval 0: success
2460 * @retval other: fail
2461 */
2462int gsw_remove_forbidden_networks(gsw_nw_plmn_list_t *plmn_list)
2463{
2464 LOGE("gsw_remove_forbidden_networks enter\n");
2465 if (nw_init_flag == 0 || nw_info_handle == NULL)
2466 {
xy.heb41615b2025-05-28 16:33:20 +08002467 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002468 }
2469
2470 int i = 0;
2471 int index = -1;
2472
2473 for(i = 0; i < plmn_list->plmn_list_len; i++)
2474 {
2475 index = check_index(plmn_list->plmn_list[i].mcc, plmn_list->plmn_list[i].mnc);
2476 if(index != -1)
2477 {
2478 remove_fplmn(index);
2479 }
2480 else
2481 {
2482 LOGE("no this PLMN, can't remove it\n");
2483 }
2484 }
2485
2486 for(i = 0; i < fplmn_index; i++)
2487 {
2488 LOGE("fplmn_array[%d] = %s\n", i, fplmn_array[i]);
2489 }
2490
2491 char fplmn_str[256] = {0};
2492 convert_plmn_to_fplmn_str(fplmn_str);
2493 LOGE("fplmn_str = %s\n", fplmn_str);
2494
2495 int ret = mbtk_fplmn_set(nw_info_handle, fplmn_str);
2496 if(ret != 0)
2497 {
2498 LOGE("mbtk_fplmn_set failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002499 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002500 }
2501
2502 LOGE("gsw_remove_forbidden_networks exit\n");
2503 return GSW_HAL_SUCCESS;
2504}
2505
2506/*
2507 * @brief clear FPLMN list
2508 * @param
2509 * @retval 0: success
2510 * @retval other: fail
2511 */
2512int gsw_clear_forbidden_networks(void)
2513{
2514 if (nw_init_flag == 0 || nw_info_handle == NULL)
2515 {
xy.heb41615b2025-05-28 16:33:20 +08002516 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002517 }
2518
2519 char fplmn_str[FPLMN_STRING_LENGTH+1];
2520 memset(fplmn_str, 'F', (6 * fplmn_max_length));
2521 fplmn_str[(6 * fplmn_max_length)] = '\0';
2522
2523 LOGE("%s\n", fplmn_str);
2524 int ret = mbtk_fplmn_set(nw_info_handle, fplmn_str);
2525 if(ret != 0)
2526 {
2527 LOGE("mbtk_fplmn_set failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002528 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002529 }
2530
2531 return GSW_HAL_SUCCESS;
2532}
2533
2534/*
2535 * @brief get oos config
2536 * @param [in] oos_config
2537 * @retval 0: success
2538 * @retval other: fail
2539 */
2540int gsw_oos_config_get(GSW_NW_OOS_CONFIG_INFO_T *pt_info)
2541{
2542 if (nw_init_flag == 0 || nw_info_handle == NULL)
2543 {
xy.heb41615b2025-05-28 16:33:20 +08002544 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002545 }
2546
2547 if(pt_info == NULL)
2548 {
2549 LOGE("pt_info is null\n");
xy.heb41615b2025-05-28 16:33:20 +08002550 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002551 }
2552
2553 int ret = -1;
2554
2555 mbtk_oos_info oos_info;
2556 memset(&oos_info, 0x00, sizeof(mbtk_oos_info));
2557
2558 ret = mbtk_oos_get(nw_info_handle, &oos_info);
2559 if(ret != 0)
2560 {
2561 LOGE("mbtk_oos_get failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002562 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002563 }
2564
2565 if(oos_info.mode == 0)
2566 {
2567 pt_info->t_min = 0;
2568 pt_info->t_step = 0;
2569 pt_info->t_max = 0;
2570 }
2571
2572 else
2573 {
2574 pt_info->t_min = (int)oos_info.oosPhase[0];
2575 pt_info->t_step = (int)oos_info.oosPhase[1];
2576 pt_info->t_max = (int)oos_info.oosPhase[2];
2577 }
2578
2579 return GSW_HAL_SUCCESS;
2580}
2581
2582
2583/*
2584 * @brief set oos config
2585 * @param [in] oos_config
2586 * @retval 0: success
2587 * @retval other: fail
2588 */
2589int gsw_oos_config_set(GSW_NW_OOS_CONFIG_INFO_T *pt_info)
2590{
2591 if (nw_init_flag == 0 || nw_info_handle == NULL)
2592 {
xy.heb41615b2025-05-28 16:33:20 +08002593 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002594 }
2595
2596 if(pt_info == NULL)
2597 {
2598 LOGE("pt_info is null\n");
xy.heb41615b2025-05-28 16:33:20 +08002599 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002600 }
2601
2602 int ret = -1;
2603 mbtk_oos_info oos_info;
2604 memset(&oos_info, 0x00, sizeof(mbtk_oos_info));
2605
2606 if (pt_info->t_min < 0 || pt_info->t_step < 0 || pt_info->t_max < 0)
2607 {
2608 LOGE("gsw_oos_config_set set time < 0 ");
xy.heb41615b2025-05-28 16:33:20 +08002609 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002610 }
2611 else if ((pt_info->t_min > 0 && pt_info->t_min <= 255) && pt_info->t_step == 0 && pt_info->t_max == 0)
2612 {
2613 oos_info.mode = 1;
2614 oos_info.oosPhase[0] = pt_info->t_min;
2615 }
2616 else if ((pt_info->t_min > 0 && pt_info->t_min <= 255) && (pt_info->t_step > 0 && pt_info->t_step <= 255) && pt_info->t_max == 0)
2617 {
2618 oos_info.mode = 1;
2619 oos_info.oosPhase[0] = pt_info->t_min;
2620 oos_info.oosPhase[1] = pt_info->t_step;
2621 }
2622 else if ((pt_info->t_min > 0 && pt_info->t_min <= 255) && (pt_info->t_step > 0 && pt_info->t_step <= 255) && (pt_info->t_max > 0 && pt_info->t_max <= 255))
2623 {
2624 oos_info.mode = 1;
2625 oos_info.oosPhase[0] = pt_info->t_min;
2626 oos_info.oosPhase[1] = pt_info->t_step;
2627 oos_info.oosPhase[2] = pt_info->t_max;
2628 }
2629 else if (pt_info->t_min == 0 && pt_info->t_step == 0 && pt_info->t_max == 0)
2630 {
2631 oos_info.mode = 0;
2632 }
2633 else
2634 {
2635 LOGE("gsw_oos_config_set set Format err");
xy.heb41615b2025-05-28 16:33:20 +08002636 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002637 }
2638
2639 ret = mbtk_oos_set(nw_info_handle, &oos_info);
2640 if(ret != 0)
2641 {
2642 LOGE("mbtk_oos_set failed : %d\n",ret);
xy.heb41615b2025-05-28 16:33:20 +08002643 return GSW_HAL_NORMAL_FAIL;
b.liu68a94c92025-05-24 12:53:41 +08002644 }
2645
2646 return GSW_HAL_SUCCESS;
2647}
2648
2649
2650