blob: d6ce1414e84b0371597045ef6f1e90d20ef694ac [file] [log] [blame]
b.liu87afc4c2024-08-14 17:33:45 +08001#include <stdio.h>
2#include <stdlib.h>
3#include <unistd.h>
4#include <errno.h>
5#include <sys/socket.h>
6#include <string.h>
7
8#include "mbtk_ril.h"
9#include "mbtk_list.h"
10#include "mbtk_utils.h"
11
12static uint16 ril_index = 1;
13
14static int sock_read(int fd, uint8 *msg, int data_len)
15{
16 memset(msg, 0, data_len);
17 int len = 0;
18 int read_len = 0;
19 while(1)
20 {
21 len = read(fd, msg + read_len, data_len - read_len);
22 if(len > 0)
23 {
24 read_len += len;
25 }
26 else if(len == 0)
27 {
28 LOG("read() end.");
29 break;
30 }
31 else
32 {
33 if(EAGAIN == errno)
34 {
35 LOG("Read end, lenght = %d", read_len);
36 }
37 else
38 {
39 LOG("read() error[%d].", errno);
40 }
41 break;
42 }
43 }
44
45 if(read_len > 0)
46 {
47 log_hex("DATA_RECV", msg, read_len);
48 return read_len;
49 }
50 else
51 {
52 return -1;
53 }
54}
55
56static int sock_write(int fd, uint8 *msg, int data_len)
57{
58 int len = 0;
59 int write_len = 0;
60 while(write_len < data_len)
61 {
62 len = write(fd, msg + write_len, data_len - write_len);
63 if(len > 0)
64 {
65 write_len += len;
66 }
67 else if(len == 0)
68 {
69 LOG("write() end.");
70 break;
71 }
72 else
73 {
74 LOG("write() error[%d].", errno);
75 break;
76 }
77 }
78
79 if(write_len > 0)
80 {
81 // log_hex("DATA_SEND", msg, write_len);
82 return write_len;
83 }
84 else
85 {
86 return -1;
87 }
88}
89
90static int pack_num_check(const void* data, int data_len)
91{
92 int count = 0;
93 int pack_len;
94 const uint8* ptr = (const uint8*)data;
95 while(ptr < (const uint8*)data + data_len)
96 {
97 if(RIL_SOCK_PACKET_TAG != byte_2_uint32(ptr, false))
98 {
99 LOG("pack_num_check() - TAG error.");
100 break;
101 }
102 ptr += sizeof(uint32);
103
104 pack_len = byte_2_uint16(ptr, false);
105 if(pack_len < RIL_SOCK_PACK_LEN_MIN - RIL_SOCK_PACK_EXTRA_LEN)
106 {
107 LOG("pack_num_check() - Packet length error.");
108 break;
109 }
110 ptr += sizeof(uint16);
111 ptr += pack_len;
112
113 count++;
114 }
115
116 return count;
117}
118
119char* type2str(ril_msg_type_enum type)
120{
121 switch(type)
122 {
123 case RIL_MSG_TYPE_REQ:
124 return "REQ";
125 case RIL_MSG_TYPE_RSP:
126 return "RSP";
127 case RIL_MSG_TYPE_IND:
128 return "IND";
129 default:
130 {
131 return "UNKNOWN";
132 }
133 }
134}
135
136char* apn2str(mbtk_ip_type_enum type)
137{
138 switch(type)
139 {
140 case MBTK_IP_TYPE_IP:
141 return "IP";
142 case MBTK_IP_TYPE_IPV6:
143 return "IPV6";
144 case MBTK_IP_TYPE_IPV4V6:
145 return "IPV4V6";
146 case MBTK_IP_TYPE_PPP:
147 return "PPP";
148 default:
149 {
150 return "UNKNOWN";
151 }
152 }
153}
154
155/*
156IPv6 : 254.128.0.0.0.0.0.0.0.1.0.2.144.5.212.239 -> uint128
157*/
158int str_2_ipv6(const void *ip_str, void *ipv6)
159{
b.liu62240ee2024-11-07 17:52:45 +0800160 const char *ptr = (const char*)ip_str;
b.liu87afc4c2024-08-14 17:33:45 +0800161 uint8 *ipv6_ptr = (uint8*)ipv6;
162 ipv6_ptr[0] = (uint8)atoi(ptr);
163 int i = 1;
164 while(i < 16) {
b.liu62240ee2024-11-07 17:52:45 +0800165 ptr = (const char*)strstr(ptr, ".");
b.liu87afc4c2024-08-14 17:33:45 +0800166 if(ptr == NULL)
167 return -1;
168 ptr++;
169 ipv6_ptr[i] = (uint8)atoi(ptr);
170 i++;
171 }
172
173 return 0;
174}
175
176/*
177IPv6 : uint128 -> fe80::215:1dff:fe81:484c
178*/
179int ipv6_2_str(const void *ipv6, void *ipv6_str)
180{
181 const uint8 *ptr = (const uint8*)ipv6;
182 uint8 *ipv6_ptr = (uint8*)ipv6_str;
183 int i = 0;
184 int index = 0;
185 while(i < 16) {
b.liu62240ee2024-11-07 17:52:45 +0800186 index += sprintf((char*)ipv6_ptr + index, "%02x%02x", ptr[i], ptr[i + 1]);
187 index += sprintf((char*)ipv6_ptr + index, ":");
b.liu87afc4c2024-08-14 17:33:45 +0800188 i += 2;
189 }
190
191 ipv6_ptr[index - 1] = '\0'; // Delete last ':'
192
193 return 0;
194}
195
196
197
198char* id2str(int id)
199{
200 switch(id)
201 {
202 // <string> IMEI
203 case RIL_MSG_ID_DEV_IMEI:
204 return "IMEI";
205 // <string> SN
206 case RIL_MSG_ID_DEV_SN:
207 return "SN";
208 // <string> MEID
209 case RIL_MSG_ID_DEV_MEID:
210 return "MEID";
211 // <string> VERSION
212 case RIL_MSG_ID_DEV_VERSION:
213 return "VERSION";
214 case RIL_MSG_ID_DEV_MODEL:
215 return "MODEL";
216 // <uint8> 0:Close 1:Open
217 case RIL_MSG_ID_DEV_VOLTE:
218 return "VOLTE";
219 // <string> Temperature
220 case RIL_MSG_ID_DEV_TEMP: // Temperature
221 return "TEMPERATURE";
222 case RIL_MSG_ID_DEV_CELL_TIME:
223 return "CELL_TIME";
224 case RIL_MSG_ID_DEV_MODEM:
225 return "MODEM";
226
227 // Sim Information
228
229 // <uint8> 0:NOT_EXIST 1:READY ...
230 case RIL_MSG_ID_SIM_STATE:
231 return "SIM_STATE";
232 case RIL_MSG_ID_SIM_TYPE:
233 return "SIM_TYPE";
234 // <string> IMSI
235 case RIL_MSG_ID_SIM_IMSI:
236 return "IMSI";
237 // <string> ICCID
238 case RIL_MSG_ID_SIM_ICCID:
239 return "ICCID";
240 // <string> Phone Number
241 case RIL_MSG_ID_SIM_PN:
242 return "PHONE_NUMBER";
243 case RIL_MSG_ID_SIM_LOCK:
244 return "SIM_LOCK";
245 case RIL_MSG_ID_SIM_PINPUK_TIMES:
246 return "SIM_PINPUK_TIMES";
247 case RIL_MSG_ID_SIM_PLMN:
248 return "SIM_PLMN";
249 case RIL_MSG_ID_NET_AVAILABLE:
250 return "NET_AVAILABLE";
251 case RIL_MSG_ID_NET_SEL_MODE:
252 return "NET_SEL_MODE";
253 case RIL_MSG_ID_NET_BAND:
254 return "NET_BNAD";
255 // <uint16>[4] rssi,rscp,rsrp,snr
256 case RIL_MSG_ID_NET_SIGNAL:
257 return "SIGNAL";
258 case RIL_MSG_ID_NET_REG:
259 return "NET_REG";
260 // <string> cmnet/ctnet/3gnet/...
b.liu15f456b2024-10-31 20:16:06 +0800261 case RIL_MSG_ID_DATA_CALL_APN:
b.liu87afc4c2024-08-14 17:33:45 +0800262 return "APN";
263 // Lock net/cell/frequency
264 case RIL_MSG_ID_NET_CELL:
265 return "NET_CELL";
b.liu557c81d2024-11-19 16:52:45 +0800266 case RIL_MSG_ID_NET_OOS:
267 return "NET_OOS";
b.liu15f456b2024-10-31 20:16:06 +0800268 case RIL_MSG_ID_DATA_CALL_OPT:
b.liu87afc4c2024-08-14 17:33:45 +0800269 return "DATA_CALL";
270 // Call Information
271 case RIL_MSG_ID_CALL_STATE:
272 return "CALL_STATE";
b.liufd87baf2024-11-15 15:30:38 +0800273 case RIL_MSG_ID_CALL_START:
274 return "CALL_START";
275 case RIL_MSG_ID_CALL_ANSWER:
276 return "CALL_ANSWER";
277 case RIL_MSG_ID_CALL_HANGUP:
278 return "CALL_HANGUP";
279 case RIL_MSG_ID_CALL_HANGUP_A:
280 return "CALL_HANGUP_A";
281 case RIL_MSG_ID_CALL_HANGUP_B:
282 return "CALL_HANGUP_B";
283 case RIL_MSG_ID_CALL_HANGUP_C:
284 return "CALL_HANGUP_C";
285 case RIL_MSG_ID_CALL_WAITIN:
286 return "CALL_WAITIN";
287 case RIL_MSG_ID_CALL_MUTE:
288 return "CALL_MUTE";
289 case RIL_MSG_ID_CALL_DTMF:
290 return "CALL_DTMF";
b.liu87afc4c2024-08-14 17:33:45 +0800291 // SMS Information
292 case RIL_MSG_ID_SMS_STATE:
293 return "SMS_STATE";
b.liufd87baf2024-11-15 15:30:38 +0800294 case RIL_MSG_ID_SMS_CMGF:
295 return "SMS_CMGF";
296 case RIL_MSG_ID_SMS_CPMS:
297 return "SMS_CPMS";
298 case RIL_MSG_ID_SMS_CMGS:
299 return "SMS_CMGS";
300 case RIL_MSG_ID_SMS_CMSS:
301 return "SMS_CMSS";
302 case RIL_MSG_ID_SMS_CMGR:
303 return "SMS_CMGR";
304 case RIL_MSG_ID_SMS_CMGW:
305 return "SMS_CMGW";
306 case RIL_MSG_ID_SMS_CMGD:
307 return "SMS_CMGD";
308 case RIL_MSG_ID_SMS_CMGL:
309 return "SMS_CMGL";
310 case RIL_MSG_ID_SMS_CSCA:
311 return "SMS_CSCA";
312 case RIL_MSG_ID_SMS_CSMP:
313 return "SMS_CSMP";
314 case RIL_MSG_ID_SMS_CSCB:
315 return "SMS_CSCB";
316 case RIL_MSG_ID_SMS_CNMI:
317 return "SMS_CNMI";
b.liu87afc4c2024-08-14 17:33:45 +0800318 // PhoneBook Information
319 case RIL_MSG_ID_PB_STATE:
320 return "PB_STATE";
b.liufd87baf2024-11-15 15:30:38 +0800321 case RIL_MSG_ID_ECALL_MSDCFG:
322 return "ECALL_MSDCFG";
323 case RIL_MSG_ID_ECALL_MSDGEN:
324 return "ECALL_MSDGEN";
325 case RIL_MSG_ID_ECALL_MSD:
326 return "ECALL_MSD";
327 case RIL_MSG_ID_ECALL_PUSH:
328 return "ECALL_PUSH";
329 case RIL_MSG_ID_ECALL_ONLY:
330 return "ECALL_ONLY";
331 case RIL_MSG_ID_ECALL_REG:
332 return "ECALL_REG";
333 case RIL_MSG_ID_ECALL_DIAL:
334 return "ECALL_DIAL";
335 case RIL_MSG_ID_ECALL_MODE:
336 return "ECALL_MODE";
337 case RIL_MSG_ID_ECALL_CFG:
338 return "ECALL_CFG";
339 case RIL_MSG_ID_ECALL_SMS_NUM:
340 return "ECALL_SMS_NUM";
341 case RIL_MSG_ID_ECALL_MUTESPK:
342 return "ECALL_MUTESPK";
343 case RIL_MSG_ID_ECALL_DSP_GAIN:
344 return "ECALL_DSP_GAIN";
b.liu87afc4c2024-08-14 17:33:45 +0800345 // IND Information
346 // <uint8> State
b.liueea595d2024-11-05 19:52:10 +0800347 case RIL_MSG_ID_IND_SER_STATE_CHANGE:
348 return "IND_SER_STATE";
b.liu87afc4c2024-08-14 17:33:45 +0800349 // <uint8> State
b.liu15f456b2024-10-31 20:16:06 +0800350 case RIL_MSG_ID_IND_NET_REG_STATE_CHANGE:
351 return "IND_NET_REG_STATE";
b.liu87afc4c2024-08-14 17:33:45 +0800352 // <uint8> State
353 case RIL_MSG_ID_IND_CALL_STATE_CHANGE:
354 return "IND_CALL_STATE";
355 // <uint8> State
356 case RIL_MSG_ID_IND_SMS_STATE_CHANGE:
357 return "IND_SMS_STATE";
358 // <uint8> State
359 case RIL_MSG_ID_IND_RADIO_STATE_CHANGE:
360 return "IND_RADIO_STATE";
361 // <uint8> State
362 case RIL_MSG_ID_IND_SIM_STATE_CHANGE:
363 return "IND_SIM_STATE";
364 // <uint8> State
365 case RIL_MSG_ID_IND_PDP_STATE_CHANGE:
366 return "IND_PDP_STATE";
367 // <uint8> State
368 case RIL_MSG_ID_IND_SIGNAL_STATE_CHANGE:
369 return "IND_SIGNAL_STATE";
b.liufd87baf2024-11-15 15:30:38 +0800370 case RIL_MSG_ID_IND_ECALL_STATE_CHANGE:
371 return "IND_ECALL_STATE_CHANGE";
b.liu87afc4c2024-08-14 17:33:45 +0800372 default:
373 {
374 return "UNKNOWN";
375 }
376 }
377}
378
379char* err2str(mbtk_ril_err_enum err)
380{
381 switch(err)
382 {
383 case MBTK_RIL_ERR_SUCCESS:
384 return "SUCCESS";
385 case MBTK_RIL_ERR_FORMAT:
386 return "ERR_FORMAT";
387 case MBTK_RIL_ERR_REQ_UNKNOWN:
388 return "ERR_REQ_UNKNOWN";
389 case MBTK_RIL_ERR_REQ_PARAMETER:
390 return "ERR_REQ_PARAMETER";
391 case MBTK_RIL_ERR_UNSUPPORTED:
392 return "ERR_UNSUPPORTED";
393 case MBTK_RIL_ERR_MEMORY:
394 return "ERR_MEMORY";
395 case MBTK_RIL_ERR_IND_FULL:
396 return "ERR_IND_FULL";
397 case MBTK_RIL_ERR_IND_UNKNOWN:
398 return "ERR_IND_UNKNOWN";
399 default:
400 {
401 if(err >= MBTK_RIL_ERR_CME) {
402 return "CME ERROR";
403 }
404
405 return "UNKNOWN";
406 }
407 }
408}
409
410void *mbtk_memcpy(const void *src, unsigned int n)
411{
412 void *dest = malloc(n);
413 if(dest) {
414 return memcpy(dest, src, n);
415 } else {
416 return NULL;
417 }
418}
419
420/*
4210 GSM
4221 GSM_COMPACT
4232 UTRAN
4243 GSM_EGPRS
4254 UTRAN_HSDPA
4265 UTRAN_HSUPA
4276 UTRAN_HSDPA_HSUPA
4287 EUTRAN
4298 ECGSM
430*/
431mbtk_net_type_enum mbtk_net_type_get(mbtk_radio_technology_enum radio_tech)
432{
433 switch(radio_tech)
434 {
435 case MBTK_RADIO_TECH_GSM:
436 case MBTK_RADIO_TECH_GSM_COMPACT:
437 case MBTK_RADIO_TECH_GSM_EGPRS:
438 case MBTK_RADIO_TECH_UTRAN_HSPA:
439 {
440 return MBTK_NET_TYPE_GSM;
441 }
442 case MBTK_RADIO_TECH_UTRAN:
443 case MBTK_RADIO_TECH_UTRAN_HSDPA:
444 case MBTK_RADIO_TECH_UTRAN_HSUPA:
445 case MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA:
446 {
447 return MBTK_NET_TYPE_UMTS;
448 }
449 case MBTK_RADIO_TECH_E_UTRAN:
450 {
451 return MBTK_NET_TYPE_LTE;
452 }
453 default:
454 {
455 return MBTK_NET_TYPE_UNKNOWN;
456 }
457 }
458}
459
460void ril_msg_pack_free(ril_msg_pack_info_t* pack)
461{
462 if(pack) {
463 LOGV("Free msg pack - %s", id2str(pack->msg_id));
464 if(pack->data) {
465 free(pack->data);
466 }
467 free(pack);
468 }
469}
470
b.liub171c9a2024-11-12 19:23:29 +0800471ril_msg_pack_info_t* ril_msg_pack_creat(ATPortType_enum port, int msg_type, int msg_id, int msg_index, const void *data, int data_len)
b.liu87afc4c2024-08-14 17:33:45 +0800472{
473 ril_msg_pack_info_t *pack = (ril_msg_pack_info_t *)malloc(sizeof(ril_msg_pack_info_t));
474 if(!pack)
475 {
476 LOGE("malloc() error[%d]", errno);
477 return NULL;
478 }
479
480 pack->tag = RIL_SOCK_PACKET_TAG;
b.liub171c9a2024-11-12 19:23:29 +0800481 pack->at_port = (uint8)port;
b.liu87afc4c2024-08-14 17:33:45 +0800482 if(msg_index < 0) {
483 pack->msg_index = ril_index++;
484 } else {
485 pack->msg_index = msg_index;
486 }
487 pack->msg_type = (uint16)msg_type;
488 pack->msg_id = (uint16)msg_id;
489 pack->err = (uint16)0;
490 if(data && data_len > 0) {
491 pack->msg_len = data_len + RIL_SOCK_PACK_LEN_MIN - RIL_SOCK_PACK_EXTRA_LEN;
492 pack->data_len = (uint16)data_len;
493 pack->data = (uint8*)malloc(data_len);
494 if(pack->data == NULL) {
495 LOGE("malloc(%d) fail.", data_len);
496 free(pack);
497 return NULL;
498 }
499 memcpy(pack->data, data, data_len);
500 } else {
501 pack->msg_len = RIL_SOCK_PACK_LEN_MIN - RIL_SOCK_PACK_EXTRA_LEN;
502 pack->data_len = (uint16)0;
503 pack->data = NULL;
504 }
505
506 return pack;
507}
508
509int ril_pack_send(int fd, ril_msg_pack_info_t *pack)
510{
511 if(!pack)
512 {
513 LOG("Packet is NULL.");
514 return -1;
515 }
516
517 uint8 buff[RIL_SOCK_MSG_LEN_MAX] = {0};
518 if(pack->data && pack->data_len > 0) {
519 memcpy(buff, pack, RIL_SOCK_PACK_LEN_MIN);
520 memcpy(buff + RIL_SOCK_PACK_LEN_MIN, pack->data, pack->data_len);
521 return sock_write(fd, buff, RIL_SOCK_PACK_LEN_MIN + pack->data_len);
522 } else {
523 memcpy(buff, pack, RIL_SOCK_PACK_LEN_MIN);
524 return sock_write(fd, buff, RIL_SOCK_PACK_LEN_MIN);
525 }
526}
527
528ril_msg_pack_info_t** ril_pack_recv(int fd, bool is_server, mbtk_ril_err_enum *err)
529{
530 uint8 msg[RIL_SOCK_MSG_LEN_MAX + 1];
531 *err = MBTK_RIL_ERR_SUCCESS;
532 int len = sock_read(fd, msg, RIL_SOCK_MSG_LEN_MAX + 1);
533 if(len < RIL_SOCK_PACK_LEN_MIN)
534 {
535 if(len > 0)
536 {
537 *err = MBTK_RIL_ERR_FORMAT;
538 LOGE("Insufficient packet data.");
539 }
540 return NULL;
541 }
542
543 int pack_count = pack_num_check(msg, len);
544 LOGD("Packet number : %d", pack_count);
545 if(pack_count < 1)
546 {
547 *err = MBTK_RIL_ERR_FORMAT;
548 LOGE("Packet not found.");
549 return NULL;
550 }
551 uint8 *ptr = msg;
552 ril_msg_pack_info_t** packs = (ril_msg_pack_info_t**)malloc(sizeof(ril_msg_pack_info_t*) * (pack_count + 1));
553 int i = 0;
554 while(i < pack_count)
555 {
556 packs[i] = (ril_msg_pack_info_t*)malloc(sizeof(ril_msg_pack_info_t));
557 if(packs[i] == NULL){
558 *err = MBTK_RIL_ERR_MEMORY;
559 goto error;
560 }
561 memcpy(packs[i], ptr, RIL_SOCK_PACK_LEN_MIN);
562
563 // TAG
564 if(RIL_SOCK_PACKET_TAG != packs[i]->tag)
565 {
566 *err = MBTK_RIL_ERR_FORMAT;
567 LOGE("Packet TAG error.");
568 goto error;
569 }
570
571 if(is_server)
572 {
573 // For server,"info_type" must by REQ or IND(Register IND).
574 if(packs[i]->msg_type != RIL_MSG_TYPE_REQ && packs[i]->msg_type != RIL_MSG_TYPE_IND)
575 {
576 *err = MBTK_RIL_ERR_FORMAT;
577 LOGE("Packet Type error : %d", packs[i]->msg_type);
578 goto error;
579 }
580 }
581 else
582 {
583 // For client,"info_type" must by RSP or IND.
584 if(packs[i]->msg_type != RIL_MSG_TYPE_RSP && packs[i]->msg_type != RIL_MSG_TYPE_IND)
585 {
586 *err = MBTK_RIL_ERR_FORMAT;
587 LOG("Packet Type error.");
588 goto error;
589 }
590 }
591
592 ptr += RIL_SOCK_PACK_LEN_MIN;
593 if(packs[i]->data_len > 0) {
594 packs[i]->data = (uint8*)malloc(packs[i]->data_len);
595 if(packs[i]->data == NULL) {
596 *err = MBTK_RIL_ERR_MEMORY;
597 goto error;
598 }
599 memcpy(packs[i]->data, ptr, packs[i]->data_len);
600 ptr += packs[i]->data_len;
601 } else {
602 packs[i]->data = NULL;
603 }
604
605 i++;
606 }
607 packs[i] = NULL;
608
609 return packs;
610
611error:
612 LOGD("mbtk_ril_pack_recv error, will free().");
613 if(packs)
614 {
615 ril_msg_pack_info_t** pack_ptr = packs;
616 while(*pack_ptr)
617 {
618 ril_msg_pack_free(*pack_ptr);
619 pack_ptr++;
620 }
621
622 free(packs);
623 }
624 return NULL;
625}
626