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