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