blob: 161492bbddc9b8204e6c4830ce8429edb19fb510 [file] [log] [blame]
wangyouqiang80487e42024-05-24 15:06:20 +08001#if 1
2#include "mbtk_data_call.h"
3
4#define MBTK_RESULT_FAIL -1
5#define MBTK_RESULT_SUCCESS 0
6
7#define MBTK_BUFF_SIZE 10
8#define MBTK_BUFF_STATE_INIT "000000000"
9#define MBTK_BUFF_STATE_INIT_1 "010000000"
10#define MBTK_APN_STATE "persist.qser.apn.state"
11#define MBTK_APN_AUTH_TYPE "persist.qser.apn.auth"
12#define MBTK_APN_TYPE "persist.qser.apn.type"
13
14#if (defined(MBTK_SG_SUPPORT) && defined(MBTK_ALL_CID_SUPPORT))
15//Setting apn parameters starts from channel 1
16#define MBTK_SET_APN_CID_MIN 1
17#else
18//Setting apn parameters starts from channel 2
19#define MBTK_SET_APN_CID_MIN 2
20#endif
21#define MBTK_SET_APN_CID_MAX 7
22
23/*cid 1 - 7*/
24mbtk_qser_apn_info_s apninfo_s[9];
25char apn_set_state[MBTK_BUFF_SIZE] = MBTK_BUFF_STATE_INIT;
26char apn_auth_type[MBTK_BUFF_SIZE] = MBTK_BUFF_STATE_INIT;
27mbtk_apn_auth_proto_enum apn_auth[9];
28int default_apn_cid = -1;
29bool default_pdp_state = false;
30bool apn_init_flag = false;
31
32int mbtk_get_default_apn_cid(void)
33{
34 return default_apn_cid;
35}
36
37void mbtk_set_default_apn_cid(int cid)
38{
39 default_apn_cid = cid;
40}
41
42bool mbtk_get_default_pdp_state(void)
43{
44 return default_pdp_state;
45}
46
47void mbtk_set_default_pdp_state(bool state, int cid)
48{
49 int default_cid = mbtk_get_default_apn_cid();
50#ifndef MBTK_SG_SUPPORT
51 if(default_cid == cid || cid == 1)
52#else
53 if(default_cid == cid)
54#endif
55 {
56 default_pdp_state = state;
57 }
58}
59
60
61int mbtk_check_default_pdp_state(int cid)
62{
63#ifdef MBTK_ALL_CID_SUPPORT
64 int default_cid = mbtk_get_default_apn_cid();
65#ifndef MBTK_SG_SUPPORT
66 if((default_cid == cid || cid == 1) && mbtk_get_default_pdp_state())
67#else
68 if(default_cid == cid && mbtk_get_default_pdp_state())
69#endif
70 {
71 LOGE("default pdp already open.default_cid [%d] cid [%d]", default_cid, cid);
72 return MBTK_RESULT_FAIL;
73 }
74#endif
75 return MBTK_RESULT_SUCCESS;
76}
77
78static int mbtk_get_cid(void)
79{
80 int i = 0;
81 for(i = MBTK_SET_APN_CID_MIN; i <= MBTK_SET_APN_CID_MAX; i++)
82 {
83 if(apn_set_state[i] == '0')
84 {
85 return i;
86 }
87 }
88
89 return MBTK_RESULT_FAIL;
90}
91
92
93int mbtk_check_cid(int cid)
94{
95 if(cid < MBTK_APN_CID_MIN || cid > MBTK_APN_CID_MAX)
96 {
97 LOGE("cid range error.");
98 return MBTK_RESULT_FAIL;
99 }
100
101#ifdef MBTK_ALL_CID_SUPPORT
102 if(apn_set_state[cid] != '1' && apn_set_state[cid] != '2')
103 {
104 LOGE("cid [%d] is not exist.", cid);
105 return MBTK_RESULT_FAIL;
106 }
107#endif
108 return MBTK_RESULT_SUCCESS;
109}
110
111int mbtk_qser_route_config(int cid, mbtk_ipv4_info_t *ipv4, mbtk_ipv6_info_t *ipv6)
112{
113 if(ipv4 == NULL || ipv6 == NULL)
114 {
115 LOGE("ip param is NULL.");
116 return MBTK_RESULT_FAIL;
117 }
118
119#ifdef MBTK_ALL_CID_SUPPORT
120 int default_cid = mbtk_get_default_apn_cid();
121#ifndef MBTK_SG_SUPPORT
wangyouqiang13e98402024-05-24 16:07:43 +0800122 if(default_cid != cid && cid != 1)
wangyouqiang80487e42024-05-24 15:06:20 +0800123#else
124 if(default_cid != cid)
125#endif
126#endif
127 {
wangyouqiang13e98402024-05-24 16:07:43 +0800128 LOGE("cid [%d] no default cid.", cid);
wangyouqiang80487e42024-05-24 15:06:20 +0800129 return MBTK_RESULT_FAIL;
130 }
131
132 char buf[1024] = {0};
133 char dns[128] = {0};
134 int offset = 0;
135 int fd = -1;
136 sprintf(buf, "route add default dev ccinet%d", cid -1);
137 system(buf);
138
139 memset(buf, 0x0, 1024);
140 memset(dns, 0x0, 128);
141 offset = sprintf(buf, "search lan\n");
142 if(ipv4->valid)
143 {
144 if(inet_ntop(AF_INET, &(ipv4->PrimaryDNS), dns, 32) == NULL) {
145 LOGE("[qser_data] PrimaryDNS error.");
146 } else {
147 LOGE("[qser_data] PrimaryDNS : %s", dns);
148 }
149 offset += sprintf(buf + offset, "nameserver %s\n", dns);
150 memset(dns, 0x0, 128);
151 if(inet_ntop(AF_INET, &(ipv4->SecondaryDNS), dns, 32) == NULL) {
152 LOGE("[qser_data] SecondaryDNS error.");
153 } else {
154 LOGE("[qser_data] SecondaryDNS : %s", dns);
155 }
156 offset += sprintf(buf + offset, "nameserver %s\n", dns);
157 }
158 if(ipv6->valid)
159 {
160 memset(dns, 0x0, 128);
161 if(ipv6_2_str(&(ipv6->PrimaryDNS), dns))
162 {
163 LOGE("[qser_data] PrimaryDNS error.");
164 } else {
165 LOGE("[qser_data] PrimaryDNS : %s", dns);
166 }
167 offset += sprintf(buf + offset, "nameserver %s\n", dns);
168 memset(dns, 0x0, 128);
169 if(ipv6_2_str(&(ipv6->SecondaryDNS), dns))
170 {
171 LOGE("[qser_data] SecondaryDNS error.");
172 } else {
173 LOGE("[qser_data] SecondaryDNS : %s", dns);
174 }
175 offset += sprintf(buf + offset, "nameserver %s\n", dns);
176 }
177
178 if(offset > 0)
179 {
180 fd = open("/tmp/resolv.conf", O_WRONLY | O_TRUNC);
181 if(fd < 0)
182 {
183 LOGE("[qser_data] mbtk_route_config : open fail.");
184 return MBTK_RESULT_FAIL;
185 }
186
187 int ret = write(fd, buf, offset);
188 if(ret < 0)
189 {
190 LOGE("[qser_data] mbtk_route_config : write fail.");
191 }
192
193 close(fd);
194 }
195
196 return MBTK_RESULT_SUCCESS;
197}
198
199
200static int mbtk_apn_check_num1(const uint8 *apn_type, const uint8 *apn_name, int cid)
201{
202 if(apn_type == NULL || apn_name == NULL)
203 {
204 LOGE("paran is NULL.");
205 return MBTK_RESULT_FAIL;
206 }
207
208 if(cid == 1)
209 {
210 LOGE("no need check.");
211 return MBTK_RESULT_SUCCESS;
212 }
213
214 int apn_name_length = strlen((char *)apn_name);
215 //LOGD("qser_apn_info[0].apn_name: %s!", qser_apn_info[0].apn_name);
216 char *p = strstr((char *)apninfo_s[1].apn_name, "mnc");
217 if(p == NULL)
218 {
yq.wang5d90f732024-10-16 00:01:43 -0700219 LOGE("mnc not find !");
220 p = strstr((char *)apninfo_s[1].apn_name, "MNC");
221 if(p == NULL)
222 {
223 LOGE("MNC not find !");
224 return MBTK_RESULT_SUCCESS;
225 }
226 }
227
wangyouqiang80487e42024-05-24 15:06:20 +0800228 {
229 int default_apn_name_length = p - ((char *)apninfo_s[1].apn_name) -1;
230 LOGD("[qser_data] qser_check_apn_type default_apn_name_length = [%d]!", default_apn_name_length);
231 if(default_apn_name_length == apn_name_length)
232 {
233 int i = 0;
234 while(i < default_apn_name_length)
235 {
236 if(isalpha(apninfo_s[1].apn_name[i]) && isalpha(apn_name[i]))
237 {
238 if(tolower(apninfo_s[1].apn_name[i]) != tolower(apn_name[i]))
239 {
240 break;
241 }
242 }
243 else
244 {
245 //LOGE("[qser_data] not char!");
246 if(apninfo_s[1].apn_name[i] != apn_name[i])
247 {
248 break;
249 }
250 }
251
252 i++;
253 }
254
255 if(i == default_apn_name_length)
256 {
257 LOGE("apn_name is same!cid = [1].");
258 return MBTK_RESULT_FAIL;
259 }
260 }
261 }
262
263 return MBTK_RESULT_SUCCESS;
264}
265
266static int mbtk_apn_check_num2_7(const uint8 *apn_type, const uint8 *apn_name, mbtk_ip_type_enum ip_type, int cid)
267{
268 if(apn_type == NULL || apn_name == NULL)
269 {
270 LOGE("paran is NULL.");
271 return MBTK_RESULT_FAIL;
272 }
liuyangc3283982024-06-04 17:00:15 +0800273
wangyouqiang80487e42024-05-24 15:06:20 +0800274 //check 2 - 7
275 int pdp_type_tmp = 1;
276 for (;pdp_type_tmp <= MBTK_APN_CID_MAX; pdp_type_tmp++)
277 {
278 if(pdp_type_tmp == cid)
279 {
280 continue;
281 }
282 if( (apn_set_state[pdp_type_tmp] == '1') || (apn_set_state[pdp_type_tmp] == '2') )
283 {
liuyangc3283982024-06-04 17:00:15 +0800284 if(0x0 != apn_type[0])
wangyouqiang80487e42024-05-24 15:06:20 +0800285 {
liuyangc3283982024-06-04 17:00:15 +0800286 if(strcmp((char *)apninfo_s[pdp_type_tmp].apn_type, (char *)apn_type) == 0)
wangyouqiang80487e42024-05-24 15:06:20 +0800287 {
liuyangc3283982024-06-04 17:00:15 +0800288 LOGE("apn_type is same!idx = [%d]", pdp_type_tmp);
wangyouqiang80487e42024-05-24 15:06:20 +0800289 return MBTK_RESULT_FAIL;
290 }
liuyangc3283982024-06-04 17:00:15 +0800291 }
292
293 if(0x0 != apn_name[0])
294 {
295 if (strcmp((char *)apninfo_s[pdp_type_tmp].apn_name, (char *)apn_name) == 0)
wangyouqiang80487e42024-05-24 15:06:20 +0800296 {
liuyangc3283982024-06-04 17:00:15 +0800297 if(apninfo_s[pdp_type_tmp].ip_type == MBTK_IP_TYPE_IPV4V6 || ip_type == MBTK_IP_TYPE_IPV4V6)
298 {
299 LOGE("[qser_data] apn_name is same and pdp_type is IPV4V6!idx = [%d]", pdp_type_tmp);
300 return MBTK_RESULT_FAIL;
301 }
302
303 if(apninfo_s[pdp_type_tmp].ip_type == ip_type)
304 {
305 LOGE("pdp_type is same and pdp_type is same!idx = [%d]", pdp_type_tmp);
306 return MBTK_RESULT_FAIL;
307 }
wangyouqiang80487e42024-05-24 15:06:20 +0800308 }
309 }
310 }
311 }
312
313 return MBTK_RESULT_SUCCESS;
314}
315
316static int get_apn_user_pass_by_cid(mbtk_apn_info_t *apn)
317{
318 char prop_name[20] = {0};
319 char prop_data[300] = {0};
320 char local_ip[2] = {0};
321 char local_apn_name[128] = {0};
322 char local_apn_user[128] = {0};
323 char local_apn_pass[128] = {0};
324 char local_apn_auth[128] = {0};
325 sprintf(prop_name, "%s_%d",MBTK_APN_PROP,apn->cid);
326 if(property_get(prop_name, prop_data, "") > 0 && !str_empty(prop_data))
327 {
328 int i = 0;
329 int data_len = strlen(prop_data);
330 for(; i < data_len; i++)
331 {
332 if(prop_data[i] == ',')
333 {
334 prop_data[i] = ' ';
335 }
336 }
337 //LOGD("prop_data [%s].", prop_data);
338 int ret = sscanf(prop_data, " %s %s %s %s %s ", local_ip, local_apn_name, local_apn_user, local_apn_pass, local_apn_auth);
339 if(ret != 5)
340 {
341 LOGE("get user pass fail!ret [%d].", ret);
342 return MBTK_RESULT_FAIL;
343 }
344
345 mbtk_ip_type_enum local_ip_type = (mbtk_ip_type_enum)atoi(&local_ip[0]);
346
347 if(apn->ip_type != local_ip_type || strcmp((char *)apn->apn, local_apn_name))
348 {
349 LOGE("APN Changed, not get user/pass/auth.");
350 return MBTK_RESULT_FAIL;
351 }
352
353 if(memcmp(local_apn_user, "NULL", 4))
354 { // Not "NULL"
355 memcpy(apn->user, local_apn_user, strlen(local_apn_user)); // user
356 }
357
358 if(memcmp(local_apn_pass, "NULL", 4))
359 { // Not "NULL"
360 memcpy(apn->pass, local_apn_pass, strlen(local_apn_pass)); // pass
361 }
362
363 return MBTK_RESULT_SUCCESS;
364 }
365 return MBTK_RESULT_FAIL;
366}
367
368
369int mbtk_qser_apn_del(int cid)
370{
371 char buff[32] = {0};
372 int ret = mbtk_check_cid(cid);
373 if(ret < 0)
374 {
375 LOGE("cid is exist");
376 return MBTK_RESULT_FAIL;
377 }
378
wangyouqiang75b6cfd2024-05-31 14:25:45 +0800379#ifndef MBTK_SG_SUPPORT
380 if(cid == 1)
381 {
382 LOGE("cid 1 is exist");
383 return MBTK_RESULT_FAIL;
384 }
385#endif
386
wangyouqiang80487e42024-05-24 15:06:20 +0800387 apn_auth_type[cid] = '0';
388 property_set(MBTK_APN_AUTH_TYPE, (char *)apn_auth_type);
389
390 if(apn_set_state[cid] == '2')
391 {
392 mbtk_set_default_apn_cid(-1);
393 }
394 apn_set_state[cid] = '0';
395 property_set(MBTK_APN_STATE, (char *)apn_set_state);
396
397 sprintf(buff, "%s%d", MBTK_APN_TYPE, cid);
398 property_set(buff, "NULL");
399
400 memset(&apninfo_s[cid], 0x0, sizeof(mbtk_qser_apn_info_s));
401 return MBTK_RESULT_SUCCESS;
402}
403/*
404AT+CGDCONT?
405+CGDCONT: 1,"IPV4V6","cmnet.MNC000.MCC460.GPRS","10.131.67.146 254.128.0.0.0.0.0.0.0.1.0.2.200.2.158.0",0,0,,,,
406
407+CGDCONT: 8,"IPV4V6","IMS","254.128.0.0.0.0.0.0.0.1.0.2.200.2.160.160",0,0,0,2,1,1
408
409OK
410*/
411
412int mbtk_qser_req_apn_get(void *data, int *data_len, int *cme_err)
413{
414 ATResponse *response = NULL;
415 int err = at_send_command_multiline("AT+CGDCONT?", "+CGDCONT:", &response);
416
417 if (err < 0 || response->success == 0 || !response->p_intermediates){
418 *cme_err = at_get_cme_error(response);
419 goto exit;
420 }
421
422 ATLine* lines_ptr = response->p_intermediates;
423 char *line = NULL;
424 int tmp_int;
425 char *tmp_str = NULL;
426 char buff[32] = {0};
427 uint8 apn_type[128] = {0};
428 /*
429 <apn_num[1]><cid[1]><ip_type[1]><apn_len[2]><apn><user_len[2]><user><pass_len[2]><pass><auth[1]><apn_type_len[2]><apn_type_len>...
430 <cid[1]><ip_type[1]><apn_len[2]><apn><user_len[2]><user><pass_len[2]><pass><auth[1]><apn_type_len[2]><apn_type_len>
431 */
432 uint8* apn_num = (uint8*)data;
433 uint8* data_ptr = (uint8*)((uint8*)data + sizeof(uint8)); // Jump apn_num[1]
434 mbtk_apn_info_t apn;
435 while(lines_ptr)
436 {
437 line = lines_ptr->line;
438 err = at_tok_start(&line);
439 if (err < 0)
440 {
441 goto exit;
442 }
443
444 err = at_tok_nextint(&line, &tmp_int); // cid
445 if (err < 0)
446 {
447 goto exit;
448 }
449 // Only get CID 1-7
450 if(apn_set_state[tmp_int] != '0')
451 {
452 memset(&apn, 0x0, sizeof(mbtk_apn_info_t));
453 apn.cid = tmp_int;
454 *data_ptr++ = (uint8)tmp_int; // cid
455
456 err = at_tok_nextstr(&line, &tmp_str);// ip type
457 if (err < 0)
458 {
459 goto exit;
460 }
461 if(!strcasecmp(tmp_str, "IP")) {
462 *data_ptr++ = (uint8)MBTK_IP_TYPE_IP;
463 apn.ip_type = MBTK_IP_TYPE_IP;
464 } else if(!strcasecmp(tmp_str, "IPV6")) {
465 *data_ptr++ = (uint8)MBTK_IP_TYPE_IPV6;
466 apn.ip_type = MBTK_IP_TYPE_IPV6;
467 } else if(!strcasecmp(tmp_str, "IPV4V6")) {
468 *data_ptr++ = (uint8)MBTK_IP_TYPE_IPV4V6;
469 apn.ip_type = MBTK_IP_TYPE_IPV4V6;
470 } else {
471 *data_ptr++ = (uint8)MBTK_IP_TYPE_PPP;
472 apn.ip_type = MBTK_IP_TYPE_PPP;
473 }
474
475 err = at_tok_nextstr(&line, &tmp_str); // apn
476 if (err < 0)
477 {
478 goto exit;
479 }
480 if(str_empty(tmp_str)) {
481 uint16_2_byte((uint16)0, data_ptr, false);
482 data_ptr += sizeof(uint16);
483 } else {
484 uint16_2_byte((uint16)strlen(tmp_str), data_ptr, false);
485 data_ptr += sizeof(uint16);
486 memcpy(data_ptr, tmp_str, strlen(tmp_str));
487 data_ptr += strlen(tmp_str);
488 memcpy(apn.apn, tmp_str, strlen(tmp_str));
489 }
490
491 if(get_apn_user_pass_by_cid(&apn)) {
492 // user
493 uint16_2_byte((uint16)0, data_ptr, false);
494 data_ptr += sizeof(uint16);
495
496 // pass
497 uint16_2_byte((uint16)0, data_ptr, false);
498 data_ptr += sizeof(uint16);
499
500 // auth
501 *data_ptr++ = (uint8)MBTK_APN_AUTH_PROTO_DEFAULT;
502 } else {
503 // user
504 if(str_empty(apn.user)) {
505 uint16_2_byte((uint16)0, data_ptr, false);
506 data_ptr += sizeof(uint16);
507 } else {
508 uint16_2_byte((uint16)strlen((char *)apn.user), data_ptr, false);
509 data_ptr += sizeof(uint16);
510 memcpy(data_ptr, apn.user, strlen((char *)apn.user));
511 data_ptr += strlen((char *)apn.user);
512 }
513
514 // pass
515 if(str_empty(apn.pass)) {
516 uint16_2_byte((uint16)0, data_ptr, false);
517 data_ptr += sizeof(uint16);
518 } else {
519 uint16_2_byte((uint16)strlen((char *)apn.pass), data_ptr, false);
520 data_ptr += sizeof(uint16);
521 memcpy(data_ptr, apn.pass, strlen((char *)apn.pass));
522 data_ptr += strlen((char *)apn.pass);
523 }
524
525 // auth
526 switch(apn_auth_type[apn.cid])
527 {
528 case '0':
529 {
530 *data_ptr++ = (uint8)MBTK_APN_AUTH_PROTO_DEFAULT;
531 break;
532 }
533 case '1':
534 {
535 *data_ptr++ = (uint8)MBTK_APN_AUTH_PROTO_NONE;
536 break;
537 }
538 case '2':
539 {
540 *data_ptr++ = (uint8)MBTK_APN_AUTH_PROTO_PAP;
541 break;
542 }
543 case '3':
544 {
545 *data_ptr++ = (uint8)MBTK_APN_AUTH_PROTO_CHAP;
546 break;
547 }
548 default:
549 {
550 *data_ptr++ = (uint8)MBTK_APN_AUTH_PROTO_DEFAULT;
551 break;
552 }
553 }
554 }
555
556 //apn_type
557 memset(buff, 0x0, 32);
558 sprintf(buff, "%s%d", MBTK_APN_TYPE, apn.cid);
559 property_get(buff, (char *)apn_type, "");
560 if(str_empty(apn_type))
561 {
562 uint16_2_byte((uint16)0, data_ptr, false);
563 data_ptr += sizeof(uint16);
564 } else
565 {
566 uint16_2_byte((uint16)strlen((char *)apn_type), data_ptr, false);
567 data_ptr += sizeof(uint16);
568 memcpy(data_ptr, apn_type, strlen((char *)apn_type));
569 data_ptr += strlen((char *)apn_type);
570 }
571
572 if(apn_init_flag)
573 {
wangyouqiang80487e42024-05-24 15:06:20 +0800574 mbtk_qser_apn_save(apn, apn_type, false);
575 }
576 (*apn_num)++;
577 }
578
579 lines_ptr = lines_ptr->p_next;
580 }
581
582 *data_len = data_ptr - (uint8*)data;
yq.wang12b32b42024-07-31 02:46:37 -0700583 if(apn_init_flag)
584 {
585 apn_init_flag = false;
586 }
wangyouqiang80487e42024-05-24 15:06:20 +0800587 goto exit;
588exit:
589 at_response_free(response);
590 return err;
591}
592
593
594int mbtk_qser_apn_save(mbtk_apn_info_t apn, const uint8 *apn_type, bool state_save)
595{
596 if(apn_type == NULL)
597 {
598 LOGE("param is error.");
599 return MBTK_RESULT_FAIL;
600 }
601
602 int ret = -1;
603 char buff[32] = {0};
604 int cid = apn.cid;
605
606 memset(&apninfo_s[cid], 0x0, sizeof(mbtk_qser_apn_info_s));
607 apninfo_s[cid].cid = apn.cid;
608 apninfo_s[cid].ip_type = apn.ip_type;
609 apninfo_s[cid].auth_proto = apn_auth[cid];
610 if(strlen((char *)apn.apn))
611 {
612 memcpy(apninfo_s[cid].apn_name, apn.apn, strlen((char *)apn.apn));
613 }
614 if(strlen((char *)apn.user))
615 {
616 memcpy(apninfo_s[cid].user_name, apn.user, strlen((char *)apn.user));
617 }
618 if(strlen((char *)apn.pass))
619 {
620 memcpy(apninfo_s[cid].user_pass, apn.pass, strlen((char *)apn.pass));
621 }
liuyangff5b1852024-06-18 18:32:39 +0800622
623 memcpy(apninfo_s[cid].apn_type, apn_type, strlen((char *)apn_type));
624 if(state_save)
wangyouqiang80487e42024-05-24 15:06:20 +0800625 {
liuyangff5b1852024-06-18 18:32:39 +0800626 sprintf(buff, "%s%d", MBTK_APN_TYPE, apn.cid);
627 property_set(buff, (char *)apn_type);
wangyouqiang80487e42024-05-24 15:06:20 +0800628 }
liuyangff5b1852024-06-18 18:32:39 +0800629
wangyouqiang80487e42024-05-24 15:06:20 +0800630
631 if(state_save)
632 {
633 if(strcmp((char *)apn_type, "iot_default") == 0)
634 {
635 apn_set_state[cid] = '2';
636 mbtk_set_default_apn_cid(cid);
637 }
638 else
639 {
640 apn_set_state[cid] = '1';
641 }
642 property_set(MBTK_APN_STATE, (char *)apn_set_state);
643
644 apn_auth_type[cid] = (char)apn_auth[cid] + '0';
645 property_set(MBTK_APN_AUTH_TYPE, (char *)apn_auth_type);
646 }
647 return MBTK_RESULT_SUCCESS;
648}
649
650int mbtk_strdata_to_apn(const uint8 *str, mbtk_apn_info_t *apn, uint8 *apn_type, mbtk_apn_req_type_enum *req_type)
651{
652 if(str == NULL || apn == NULL || apn_type == NULL)
653 {
654 LOGE("param is error.");
655 return MBTK_RESULT_FAIL;
656 }
657
658 // <cid[1]><ip_type[1]><req_type[1]><auth[1]><apn_len[2]><apn><user_len[2]><user><pass_len[2]><pass><auth_len[2]><apn_type[2]>
659 int len = 0;
660 int ret = -1;
661 memset(apn, 0x0, sizeof(mbtk_apn_info_t));
662
663 // cid
664 apn->cid = (int)*str++;
665
666 // ip_type
667 apn->ip_type = (mbtk_ip_type_enum)(*str++);
668
669 //req_type
670 *req_type = (mbtk_apn_req_type_enum)(*str++);
671 if((*req_type) == MBTK_APN_REQ_TYPE_ADD)
672 {
673 apn->cid = mbtk_get_cid();
674 if(apn->cid < 0)
675 {
676 LOGE("no enough cid.");
677 return MBTK_RESULT_FAIL;
678 }
679 }
680 else
681 {
yq.wang12b32b42024-07-31 02:46:37 -0700682#ifndef MBTK_SG_SUPPORT
wangyouqiang80487e42024-05-24 15:06:20 +0800683 ret = mbtk_check_cid(apn->cid);
684 if(ret < 0)
685 {
686 LOGE("cid is error.");
687 return MBTK_RESULT_FAIL;
688 }
689
wangyouqiang80487e42024-05-24 15:06:20 +0800690 if(apn->cid == 1)
691 {
692 LOGE("cid 1 no support set.");
693 return MBTK_RESULT_FAIL;
694 }
695#endif
696 }
697
698 // auth
699 apn_auth[apn->cid] = (mbtk_apn_auth_proto_enum)(*str++);
700 if(apn_auth[apn->cid] == MBTK_APN_AUTH_PROTO_NONE || apn_auth[apn->cid] == MBTK_APN_AUTH_PROTO_DEFAULT)
701 {
702 memcpy(apn->auth,"NONE",strlen("NONE")+1);
703 }
704 else if(apn_auth[apn->cid] == MBTK_APN_AUTH_PROTO_PAP)
705 {
706 memcpy(apn->auth,"PAP",strlen("PAP")+1);
707 }
708 else if(apn_auth[apn->cid] == MBTK_APN_AUTH_PROTO_CHAP)
709 {
710 memcpy(apn->auth,"CHAP",strlen("CHAP")+1);
711 }
712 #if 0
713 else if(apn->auth_proto == QSER_APN_AUTH_PROTO_PAP_CHAP)
714 {
715 //NOT SUPPORT
716 }
717 #endif
718 else
719 {
720 LOGE("auth input error!");
721 return MBTK_RESULT_FAIL;
722 }
723
724 // apn
725 len = byte_2_uint16(str, false);
726 str += sizeof(uint16);
727 if(len > 0)
728 {
729 memcpy(apn->apn, str, len);
730 str += len;
731 }
732
733 // user
734 len = byte_2_uint16(str, false);
735 str += sizeof(uint16);
736 if(len > 0)
737 {
738 memcpy(apn->user, str, len);
739 str += len;
740 }
741
742 // pass
743 len = byte_2_uint16(str, false);
744 str += sizeof(uint16);
745 if(len > 0)
746 {
747 memcpy(apn->pass, str, len);
748 str += len;
749 }
750
751 // auth_type
752 len = byte_2_uint16(str, false);
753 str += sizeof(uint16);
754 if(len > 0)
755 {
756 memcpy(apn_type, str, len);
757 str += len;
758 }
759
yq.wang12b32b42024-07-31 02:46:37 -0700760 LOGD("APN : %d, %d, %s, %s, %s, %s, %s.", apn->cid,
761 apn->ip_type,
762 (str_empty(apn->apn) ? "NULL" : apn->apn),
763 (str_empty(apn->user) ? "NULL" : apn->user),
764 (str_empty(apn->pass) ? "NULL" : apn->pass),
765 (str_empty(apn->auth) ? "NULL" : apn->auth),
766 (str_empty(apn_type) ? "NULL" : apn_type));
767
wangyouqiang80487e42024-05-24 15:06:20 +0800768 ret = mbtk_apn_check_num1(apn_type, apn->apn, apn->cid);
769 if(ret < 0)
770 {
771 LOGE("num1 check error!");
772 return MBTK_RESULT_FAIL;
773 }
774
775 ret = mbtk_apn_check_num2_7(apn_type, apn->apn, apn->ip_type, apn->cid);
776 if(ret < 0)
777 {
778 LOGE("num2_7 check error!");
779 return MBTK_RESULT_FAIL;
780 }
wangyouqiang80487e42024-05-24 15:06:20 +0800781 return MBTK_RESULT_SUCCESS;
782}
783
784void mbtk_qser_apn_init(void)
785{
786 LOGD("enter mbtk_qser_apn_init.");
787 apn_init_flag = true;
788#ifdef MBTK_SG_SUPPORT
789 property_get(MBTK_APN_STATE, (char *)apn_set_state, MBTK_BUFF_STATE_INIT);
790#else
791 property_get(MBTK_APN_STATE, (char *)apn_set_state, MBTK_BUFF_STATE_INIT_1);
792#endif
793 LOGD("get apn_set_state[%s].", apn_set_state);
794
795 int i = 0;
796 for(; i < MBTK_BUFF_SIZE; i++)
797 {
798 if(apn_set_state[i] == '2')
799 {
800 mbtk_set_default_apn_cid(i);
801 break;
802 }
803 }
804
805 property_get(MBTK_APN_AUTH_TYPE, (char *)apn_auth_type, MBTK_BUFF_STATE_INIT);
806 LOGD("get apn_auth_type[%s].", apn_auth_type);
807
808 mbtk_get_apn_send_pack();
809}
810#endif