| liubin | 281ac46 | 2023-07-19 14:22:54 +0800 | [diff] [blame] | 1 | #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_info.h" | 
 | 9 | #include "mbtk_list.h" | 
 | 10 | #include "mbtk_utils.h" | 
 | 11 |  | 
| b.liu | 9e8584b | 2024-11-06 19:21:28 +0800 | [diff] [blame] | 12 | static int sock_read(int fd, void *msg, int data_len) | 
| liubin | 281ac46 | 2023-07-19 14:22:54 +0800 | [diff] [blame] | 13 | { | 
 | 14 |     memset(msg, 0, data_len); | 
 | 15 |     int len = 0; | 
 | 16 |     int read_len = 0; | 
 | 17 |     while(1) | 
 | 18 |     { | 
 | 19 |         len = read(fd, msg + read_len, data_len - read_len); | 
 | 20 |         if(len > 0) | 
 | 21 |         { | 
 | 22 |             read_len += len; | 
 | 23 |         } | 
 | 24 |         else if(len == 0) | 
 | 25 |         { | 
 | 26 |             LOG("read() end."); | 
 | 27 |             break; | 
 | 28 |         } | 
 | 29 |         else | 
 | 30 |         { | 
 | 31 |             if(EAGAIN == errno) | 
 | 32 |             { | 
 | 33 |                 LOG("Read end, lenght = %d", read_len); | 
 | 34 |             } | 
 | 35 |             else | 
 | 36 |             { | 
 | 37 |                 LOG("read() error[%d].", errno); | 
 | 38 |             } | 
 | 39 |             break; | 
 | 40 |         } | 
 | 41 |     } | 
 | 42 |  | 
 | 43 |     if(read_len > 0) | 
 | 44 |     { | 
 | 45 |         log_hex("DATA_RECV", msg, read_len); | 
 | 46 |         return read_len; | 
 | 47 |     } | 
 | 48 |     else | 
 | 49 |     { | 
 | 50 |         return -1; | 
 | 51 |     } | 
 | 52 | } | 
 | 53 |  | 
| b.liu | 9e8584b | 2024-11-06 19:21:28 +0800 | [diff] [blame] | 54 | static int sock_write(int fd, void *msg, int data_len) | 
| liubin | 281ac46 | 2023-07-19 14:22:54 +0800 | [diff] [blame] | 55 | { | 
 | 56 |     int len = 0; | 
 | 57 |     int write_len = 0; | 
 | 58 |     while(write_len < data_len) | 
 | 59 |     { | 
 | 60 |         len = write(fd, msg + write_len, data_len - write_len); | 
 | 61 |         if(len > 0) | 
 | 62 |         { | 
 | 63 |             write_len += len; | 
 | 64 |         } | 
 | 65 |         else if(len == 0) | 
 | 66 |         { | 
 | 67 |             LOG("write() end."); | 
 | 68 |             break; | 
 | 69 |         } | 
 | 70 |         else | 
 | 71 |         { | 
 | 72 |             LOG("write() error[%d].", errno); | 
 | 73 |             break; | 
 | 74 |         } | 
 | 75 |     } | 
 | 76 |  | 
 | 77 |     if(write_len > 0) | 
 | 78 |     { | 
 | 79 |         log_hex("DATA_SEND", msg, write_len); | 
 | 80 |         return write_len; | 
 | 81 |     } | 
 | 82 |     else | 
 | 83 |     { | 
 | 84 |         return -1; | 
 | 85 |     } | 
 | 86 | } | 
 | 87 |  | 
 | 88 | static int pack_num_check(const void* data, int data_len) | 
 | 89 | { | 
 | 90 |     int count = 0; | 
 | 91 |     int pack_len; | 
 | 92 |     const uint8* ptr = (const uint8*)data; | 
 | 93 |     while(ptr < (const uint8*)data + data_len) | 
 | 94 |     { | 
 | 95 |         if(MBTK_INFO_PACKET_FLAG != byte_2_uint32(ptr, true)) | 
 | 96 |         { | 
 | 97 |             LOG("pack_num_check() - TAG error."); | 
 | 98 |             break; | 
 | 99 |         } | 
 | 100 |         ptr += sizeof(uint32); | 
 | 101 |  | 
 | 102 |         pack_len = byte_2_uint16(ptr, false); | 
 | 103 |         if(pack_len < SOCK_PACK_LEN_MIN - SOCK_PACK_EXTRA_LEN) | 
 | 104 |         { | 
 | 105 |             LOG("pack_num_check() - Packet length error."); | 
 | 106 |             break; | 
 | 107 |         } | 
 | 108 |         ptr += sizeof(uint16); | 
 | 109 |         ptr += pack_len; | 
 | 110 |  | 
 | 111 |         count++; | 
 | 112 |     } | 
 | 113 |  | 
 | 114 |     return count; | 
 | 115 | } | 
 | 116 |  | 
 | 117 | char* type2str(mbtk_info_type_enum type) | 
 | 118 | { | 
 | 119 |     switch(type) | 
 | 120 |     { | 
 | 121 |         case MBTK_INFO_TYPE_REQ: | 
 | 122 |             return "REQ"; | 
 | 123 |         case MBTK_INFO_TYPE_RSP: | 
 | 124 |             return "RSP"; | 
 | 125 |         case MBTK_INFO_TYPE_IND: | 
 | 126 |             return "IND"; | 
 | 127 |         default: | 
 | 128 |         { | 
 | 129 |             return "UNKNOWN"; | 
 | 130 |         } | 
 | 131 |     } | 
 | 132 | } | 
 | 133 |  | 
 | 134 | char* apn2str(mbtk_ip_type_enum type) | 
 | 135 | { | 
 | 136 |     switch(type) | 
 | 137 |     { | 
 | 138 |         case MBTK_IP_TYPE_IP: | 
 | 139 |             return "IP"; | 
 | 140 |         case MBTK_IP_TYPE_IPV6: | 
 | 141 |             return "IPV6"; | 
 | 142 |         case MBTK_IP_TYPE_IPV4V6: | 
 | 143 |             return "IPV4V6"; | 
 | 144 |         case MBTK_IP_TYPE_PPP: | 
 | 145 |             return "PPP"; | 
 | 146 |         default: | 
 | 147 |         { | 
 | 148 |             return "UNKNOWN"; | 
 | 149 |         } | 
 | 150 |     } | 
 | 151 | } | 
 | 152 |  | 
 | 153 | /* | 
 | 154 | IPv6 : 254.128.0.0.0.0.0.0.0.1.0.2.144.5.212.239 -> uint128 | 
 | 155 | */ | 
 | 156 | int str_2_ipv6(const void *ip_str, void *ipv6) | 
 | 157 | { | 
| b.liu | 9e8584b | 2024-11-06 19:21:28 +0800 | [diff] [blame] | 158 |     const char *ptr = (const char*)ip_str; | 
| liubin | 281ac46 | 2023-07-19 14:22:54 +0800 | [diff] [blame] | 159 |     uint8 *ipv6_ptr = (uint8*)ipv6; | 
 | 160 |     ipv6_ptr[0] = (uint8)atoi(ptr); | 
 | 161 |     int i = 1; | 
 | 162 |     while(i < 16) { | 
| b.liu | 9e8584b | 2024-11-06 19:21:28 +0800 | [diff] [blame] | 163 |         ptr = strstr(ptr, "."); | 
| liubin | 281ac46 | 2023-07-19 14:22:54 +0800 | [diff] [blame] | 164 |         if(ptr == NULL) | 
 | 165 |             return -1; | 
 | 166 |         ptr++; | 
 | 167 |         ipv6_ptr[i] = (uint8)atoi(ptr); | 
 | 168 |         i++; | 
 | 169 |     } | 
 | 170 |  | 
 | 171 |     return 0; | 
 | 172 | } | 
 | 173 |  | 
 | 174 | /* | 
 | 175 | IPv6 : uint128 -> fe80::215:1dff:fe81:484c | 
 | 176 | */ | 
 | 177 | int ipv6_2_str(const void *ipv6, void *ipv6_str) | 
 | 178 | { | 
 | 179 |     const uint8 *ptr = (const uint8*)ipv6; | 
 | 180 |     uint8 *ipv6_ptr = (uint8*)ipv6_str; | 
 | 181 |     int i = 0; | 
 | 182 |     int index = 0; | 
 | 183 |     while(i < 16) { | 
| b.liu | 9e8584b | 2024-11-06 19:21:28 +0800 | [diff] [blame] | 184 |         index += sprintf((char*)ipv6_ptr + index, "%02x%02x", ptr[i], ptr[i + 1]); | 
 | 185 |         index += sprintf((char*)ipv6_ptr + index, ":"); | 
| liubin | 281ac46 | 2023-07-19 14:22:54 +0800 | [diff] [blame] | 186 |         i += 2; | 
 | 187 |     } | 
 | 188 |  | 
 | 189 |     ipv6_ptr[index - 1] = '\0'; // Delete last ':' | 
 | 190 |  | 
 | 191 |     return 0; | 
 | 192 | } | 
 | 193 |  | 
 | 194 |  | 
 | 195 |  | 
 | 196 | char* id2str(int id) | 
 | 197 | { | 
 | 198 |     switch(id) | 
 | 199 |     { | 
 | 200 |         // <string> IMEI | 
 | 201 |         case MBTK_INFO_ID_DEV_IMEI_REQ: | 
 | 202 |         case MBTK_INFO_ID_DEV_IMEI_RSP: | 
 | 203 |             return "IMEI"; | 
 | 204 |         // <string> SN | 
 | 205 |         case MBTK_INFO_ID_DEV_SN_REQ: | 
 | 206 |         case MBTK_INFO_ID_DEV_SN_RSP: | 
 | 207 |             return "SN"; | 
 | 208 |         // <string> MEID | 
 | 209 |         case MBTK_INFO_ID_DEV_MEID_REQ: | 
 | 210 |         case MBTK_INFO_ID_DEV_MEID_RSP: | 
 | 211 |             return "MEID"; | 
 | 212 |         // <string> VERSION | 
 | 213 |         case MBTK_INFO_ID_DEV_VERSION_REQ: | 
 | 214 |         case MBTK_INFO_ID_DEV_VERSION_RSP: | 
 | 215 |             return "VERSION"; | 
| l.yang | 5b0ff42 | 2024-10-29 19:33:35 -0700 | [diff] [blame] | 216 |         case MBTK_INFO_ID_DEV_MD_VERSION_REQ: | 
 | 217 |         case MBTK_INFO_ID_DEV_MD_VERSION_RSP: | 
 | 218 |             return "MD_VERSION"; | 
| b.liu | baa41e1 | 2024-07-19 15:07:24 +0800 | [diff] [blame] | 219 |         case MBTK_INFO_ID_DEV_MODEL_REQ: | 
 | 220 |         case MBTK_INFO_ID_DEV_MODEL_RSP: | 
 | 221 |             return "MODEL"; | 
| liubin | 281ac46 | 2023-07-19 14:22:54 +0800 | [diff] [blame] | 222 |         // <uint8> 0:Close 1:Open | 
 | 223 |         case MBTK_INFO_ID_DEV_VOLTE_REQ: | 
 | 224 |         case MBTK_INFO_ID_DEV_VOLTE_RSP: | 
 | 225 |             return "VOLTE"; | 
 | 226 |         // <string> Temperature | 
 | 227 |         case MBTK_INFO_ID_DEV_TEMP_REQ:  // Temperature | 
 | 228 |         case MBTK_INFO_ID_DEV_TEMP_RSP: | 
 | 229 |             return "TEMPERATURE"; | 
| b.liu | baa41e1 | 2024-07-19 15:07:24 +0800 | [diff] [blame] | 230 |         case MBTK_INFO_ID_DEV_CELL_TIME_REQ: | 
 | 231 |         case MBTK_INFO_ID_DEV_CELL_TIME_RSP: | 
 | 232 |             return "CELL_TIME"; | 
| liubin | 281ac46 | 2023-07-19 14:22:54 +0800 | [diff] [blame] | 233 |         case MBTK_INFO_ID_DEV_TIME_REQ:  // Time | 
 | 234 |         case MBTK_INFO_ID_DEV_TIME_RSP: | 
 | 235 |             return "Time"; | 
| b.liu | baa41e1 | 2024-07-19 15:07:24 +0800 | [diff] [blame] | 236 |         case MBTK_INFO_ID_DEV_MODEM_REQ: | 
 | 237 |         case MBTK_INFO_ID_DEV_MODEM_RSP: | 
 | 238 |             return "MODEM"; | 
 | 239 |  | 
| liubin | 281ac46 | 2023-07-19 14:22:54 +0800 | [diff] [blame] | 240 |         // Sim Information | 
| b.liu | baa41e1 | 2024-07-19 15:07:24 +0800 | [diff] [blame] | 241 |  | 
| liubin | 281ac46 | 2023-07-19 14:22:54 +0800 | [diff] [blame] | 242 |         // <uint8> 0:NOT_EXIST 1:READY ... | 
 | 243 |         case MBTK_INFO_ID_SIM_STATE_REQ: | 
 | 244 |         case MBTK_INFO_ID_SIM_STATE_RSP: | 
 | 245 |             return "SIM_STATE"; | 
 | 246 |         // <string> PIN | 
 | 247 |         case MBTK_INFO_ID_SIM_PIN_REQ: | 
 | 248 |         case MBTK_INFO_ID_SIM_PIN_RSP: | 
 | 249 |             return "SIM_PIN"; | 
 | 250 |         // <string> PUK | 
 | 251 |         case MBTK_INFO_ID_SIM_PUK_REQ: | 
 | 252 |         case MBTK_INFO_ID_SIM_PUK_RSP: | 
 | 253 |             return "SIM_PUK"; | 
 | 254 |         // <string> IMSI | 
 | 255 |         case MBTK_INFO_ID_SIM_IMSI_REQ: | 
 | 256 |         case MBTK_INFO_ID_SIM_IMSI_RSP: | 
 | 257 |             return "IMSI"; | 
 | 258 |         // <string> ICCID | 
 | 259 |         case MBTK_INFO_ID_SIM_ICCID_REQ: | 
 | 260 |         case MBTK_INFO_ID_SIM_ICCID_RSP: | 
 | 261 |             return "ICCID"; | 
 | 262 |         // <string> Phone Number | 
 | 263 |         case MBTK_INFO_ID_SIM_PN_REQ: | 
 | 264 |         case MBTK_INFO_ID_SIM_PN_RSP: | 
 | 265 |             return "PHONE_NUMBER"; | 
 | 266 |         // Network Information | 
 | 267 |         // <uint8> 0:OFF 1:ON | 
 | 268 |         case MBTK_INFO_ID_NET_RADIO_REQ: | 
 | 269 |         case MBTK_INFO_ID_NET_RADIO_RSP: | 
 | 270 |             return "RADIO_STATE"; | 
 | 271 |         case MBTK_INFO_ID_NET_AVAILABLE_REQ: | 
 | 272 |         case MBTK_INFO_ID_NET_AVAILABLE_RSP: | 
 | 273 |             return "NET_AVAILABLE"; | 
 | 274 |         case MBTK_INFO_ID_NET_SEL_MODE_REQ: | 
 | 275 |         case MBTK_INFO_ID_NET_SEL_MODE_RSP: | 
 | 276 |             return "NET_SEL_MODE"; | 
 | 277 |         case MBTK_INFO_ID_NET_BAND_REQ: | 
 | 278 |         case MBTK_INFO_ID_NET_BAND_RSP: | 
 | 279 |             return "NET_BNAD"; | 
 | 280 |         // <uint16>[4]  rssi,rscp,rsrp,snr | 
 | 281 |         case MBTK_INFO_ID_NET_SIGNAL_REQ: | 
 | 282 |         case MBTK_INFO_ID_NET_SIGNAL_RSP: | 
 | 283 |             return "SIGNAL"; | 
 | 284 |         case MBTK_INFO_ID_NET_REG_REQ: | 
 | 285 |         case MBTK_INFO_ID_NET_REG_RSP: | 
 | 286 |             return "NET_REG"; | 
 | 287 |         // <string> cmnet/ctnet/3gnet/... | 
 | 288 |         case MBTK_INFO_ID_NET_APN_REQ: | 
 | 289 |         case MBTK_INFO_ID_NET_APN_RSP: | 
 | 290 |             return "APN"; | 
| wangyouqiang | 80487e4 | 2024-05-24 15:06:20 +0800 | [diff] [blame] | 291 |         case MBTK_INFO_ID_NET_QSER_APN_REQ: | 
 | 292 |         case MBTK_INFO_ID_NET_QSER_APN_RSP: | 
 | 293 |             return "QSER_APN"; | 
| liubin | 281ac46 | 2023-07-19 14:22:54 +0800 | [diff] [blame] | 294 |         // Lock net/cell/frequency | 
 | 295 |         case MBTK_INFO_ID_NET_CELL_REQ: | 
 | 296 |         case MBTK_INFO_ID_NET_CELL_RSP: | 
 | 297 |             return "NET_CELL"; | 
 | 298 |         case MBTK_INFO_ID_NET_DATA_CALL_REQ: | 
 | 299 |         case MBTK_INFO_ID_NET_DATA_CALL_RSP: | 
 | 300 |             return "DATA_CALL"; | 
| r.xiao | 06db9a1 | 2024-04-14 18:51:15 -0700 | [diff] [blame] | 301 |         //ims | 
 | 302 |         case MBTK_INFO_ID_NET_IMS_REQ: | 
 | 303 |         case MBTK_INFO_ID_NET_IMS_RSP: | 
 | 304 |             return "IMS"; | 
| xy.he | 22063af | 2024-12-06 01:28:08 -0800 | [diff] [blame] | 305 |         //fplmn | 
 | 306 |         case MBTK_INFO_ID_NET_FPLMN_REQ: | 
 | 307 |         case MBTK_INFO_ID_NET_FPLMN_RSP: | 
 | 308 |             return "FPLMN"; | 
| liubin | 281ac46 | 2023-07-19 14:22:54 +0800 | [diff] [blame] | 309 |         // Call Information | 
 | 310 |         case MBTK_INFO_ID_CALL_STATE_REQ: | 
 | 311 |         case MBTK_INFO_ID_CALL_STATE_RSP: | 
 | 312 |             return "CALL_STATE"; | 
 | 313 |         // SMS Information | 
 | 314 |         case MBTK_INFO_ID_SMS_STATE_REQ: | 
 | 315 |         case MBTK_INFO_ID_SMS_STATE_RSP: | 
 | 316 |             return "SMS_STATE"; | 
 | 317 |         // PhoneBook Information | 
 | 318 |         case MBTK_INFO_ID_PB_STATE_REQ: | 
 | 319 |         case MBTK_INFO_ID_PB_STATE_RSP: | 
 | 320 |             return "PB_STATE"; | 
| wangyouqiang | 38e5336 | 2024-01-23 10:53:48 +0800 | [diff] [blame] | 321 |         //led | 
 | 322 |         case MBTK_INFO_ID_LED_REQ: | 
 | 323 |         case MBTK_INFO_ID_LED_RSP: | 
 | 324 |             return "LED"; | 
| liubin | 281ac46 | 2023-07-19 14:22:54 +0800 | [diff] [blame] | 325 |         // IND Information | 
 | 326 |         // <uint8>  State | 
 | 327 |         case MBTK_INFO_ID_IND_NET_STATE_CHANGE: | 
 | 328 |             return "IND_NET_STATE"; | 
 | 329 |         // <uint8>  State | 
 | 330 |         case MBTK_INFO_ID_IND_CALL_STATE_CHANGE: | 
 | 331 |             return "IND_CALL_STATE"; | 
 | 332 |         // <uint8>  State | 
 | 333 |         case MBTK_INFO_ID_IND_SMS_STATE_CHANGE: | 
 | 334 |             return "IND_SMS_STATE"; | 
 | 335 |         // <uint8>  State | 
 | 336 |         case MBTK_INFO_ID_IND_RADIO_STATE_CHANGE: | 
 | 337 |             return "IND_RADIO_STATE"; | 
 | 338 |         // <uint8>  State | 
 | 339 |         case MBTK_INFO_ID_IND_SIM_STATE_CHANGE: | 
 | 340 |             return "IND_SIM_STATE"; | 
 | 341 |         // <uint8>  State | 
 | 342 |         case MBTK_INFO_ID_IND_PDP_STATE_CHANGE: | 
 | 343 |             return "IND_PDP_STATE"; | 
 | 344 |         // <uint8>  State | 
 | 345 |         case MBTK_INFO_ID_IND_SERVER_STATE_CHANGE: | 
 | 346 |             return "IND_SERVER_STATE"; | 
| r.xiao | fca7c47 | 2024-04-24 01:00:23 -0700 | [diff] [blame] | 347 |         // <uint8>  State | 
 | 348 |         case MBTK_INFO_ID_IND_SIGNAL_STATE_CHANGE: | 
 | 349 |             return "IND_SIGNAL_STATE"; | 
| liubin | 281ac46 | 2023-07-19 14:22:54 +0800 | [diff] [blame] | 350 |         default: | 
 | 351 |         { | 
 | 352 |             return "UNKNOWN"; | 
 | 353 |         } | 
 | 354 |     } | 
 | 355 | } | 
 | 356 |  | 
 | 357 | char* err2str(mbtk_info_err_enum err) | 
 | 358 | { | 
 | 359 |     switch(err) | 
 | 360 |     { | 
 | 361 |         case MBTK_INFO_ERR_SUCCESS: | 
 | 362 |             return "SUCCESS"; | 
 | 363 |         case MBTK_INFO_ERR_FORMAT: | 
 | 364 |             return "ERR_FORMAT"; | 
 | 365 |         case MBTK_INFO_ERR_REQ_UNKNOWN: | 
 | 366 |             return "ERR_REQ_UNKNOWN"; | 
 | 367 |         case MBTK_INFO_ERR_REQ_PARAMETER: | 
 | 368 |             return "ERR_REQ_PARAMETER"; | 
 | 369 |         case MBTK_INFO_ERR_UNSUPPORTED: | 
 | 370 |             return "ERR_UNSUPPORTED"; | 
 | 371 |         case MBTK_INFO_ERR_MEMORY: | 
 | 372 |             return "ERR_MEMORY"; | 
 | 373 |         case MBTK_INFO_ERR_IND_FULL: | 
 | 374 |             return "ERR_IND_FULL"; | 
 | 375 |         case MBTK_INFO_ERR_IND_UNKNOWN: | 
 | 376 |             return "ERR_IND_UNKNOWN"; | 
 | 377 |         case MBTK_INFO_ERR_CID_EXIST: | 
 | 378 |             return "ERR_CID_EXIS"; | 
 | 379 |         case MBTK_INFO_ERR_CID_NO_EXIST: | 
 | 380 |             return "ERR_CID_NO_EXIST"; | 
 | 381 |         case MBTK_INFO_ERR_NET_NO_INIT: | 
| wangyouqiang | 8ebeafe | 2024-04-15 10:07:44 +0800 | [diff] [blame] | 382 |             return "ERR_CID_NO_NET"; | 
| liubin | 281ac46 | 2023-07-19 14:22:54 +0800 | [diff] [blame] | 383 |         default: | 
 | 384 |         { | 
 | 385 |             if(err >= MBTK_INFO_ERR_CME) { | 
 | 386 |                 return "CME ERROR"; | 
 | 387 |             } | 
 | 388 |  | 
 | 389 |             return "UNKNOWN"; | 
 | 390 |         } | 
 | 391 |     } | 
 | 392 | } | 
 | 393 |  | 
 | 394 | /* | 
 | 395 | 0   GSM | 
 | 396 | 1   GSM_COMPACT | 
 | 397 | 2   UTRAN | 
 | 398 | 3   GSM_EGPRS | 
 | 399 | 4   UTRAN_HSDPA | 
 | 400 | 5   UTRAN_HSUPA | 
 | 401 | 6   UTRAN_HSDPA_HSUPA | 
 | 402 | 7   EUTRAN | 
 | 403 | 8   ECGSM | 
 | 404 | */ | 
 | 405 | mbtk_net_type_enum mbtk_net_type_get(mbtk_radio_technology_enum radio_tech) | 
 | 406 | { | 
 | 407 |     switch(radio_tech) | 
 | 408 |     { | 
 | 409 |         case MBTK_RADIO_TECH_GSM: | 
 | 410 |         case MBTK_RADIO_TECH_GSM_COMPACT: | 
 | 411 |         case MBTK_RADIO_TECH_GSM_EGPRS: | 
 | 412 |         case MBTK_RADIO_TECH_UTRAN_HSPA: | 
 | 413 |         { | 
 | 414 |             return MBTK_NET_TYPE_GSM; | 
 | 415 |         } | 
 | 416 |         case MBTK_RADIO_TECH_UTRAN: | 
 | 417 |         case MBTK_RADIO_TECH_UTRAN_HSDPA: | 
 | 418 |         case MBTK_RADIO_TECH_UTRAN_HSUPA: | 
 | 419 |         case MBTK_RADIO_TECH_UTRAN_HSDPA_HSUPA: | 
 | 420 |         { | 
 | 421 |             return MBTK_NET_TYPE_UMTS; | 
 | 422 |         } | 
 | 423 |         case MBTK_RADIO_TECH_E_UTRAN: | 
 | 424 |         { | 
 | 425 |             return MBTK_NET_TYPE_LTE; | 
 | 426 |         } | 
 | 427 |         default: | 
 | 428 |         { | 
 | 429 |             return MBTK_NET_TYPE_UNKNOWN; | 
 | 430 |         } | 
 | 431 |     } | 
 | 432 | } | 
 | 433 |  | 
 | 434 |  | 
 | 435 | #if 0 | 
 | 436 | void net_list_free(void *data) | 
 | 437 | { | 
 | 438 |     if (data) | 
 | 439 |     { | 
 | 440 |         mbtk_net_info_t *info = (mbtk_net_info_t*) data; | 
 | 441 |         LOG("Free net [%s].", info->plmn); | 
 | 442 |         free(info); | 
 | 443 |     } | 
 | 444 | } | 
 | 445 | #endif | 
 | 446 |  | 
 | 447 | mbtk_info_type_enum mbtk_info_type_get(int info_id) | 
 | 448 | { | 
 | 449 |     if(info_id > MBTK_INFO_ID_IND_BEGIN && info_id < MBTK_INFO_ID_IND_END) | 
 | 450 |     { | 
 | 451 |         return MBTK_INFO_TYPE_IND; | 
 | 452 |     } | 
 | 453 |     else if(info_id == MBTK_INFO_ID_DEV_BEGIN || | 
 | 454 |             info_id == MBTK_INFO_ID_DEV_END || | 
 | 455 |             info_id == MBTK_INFO_ID_SIM_BEGIN || | 
 | 456 |             info_id == MBTK_INFO_ID_SIM_END || | 
 | 457 |             info_id == MBTK_INFO_ID_NET_BEGIN || | 
 | 458 |             info_id == MBTK_INFO_ID_NET_END || | 
 | 459 |             info_id == MBTK_INFO_ID_CALL_BEGIN || | 
 | 460 |             info_id == MBTK_INFO_ID_CALL_END || | 
 | 461 |             info_id == MBTK_INFO_ID_SMS_BEGIN || | 
 | 462 |             info_id == MBTK_INFO_ID_SMS_END || | 
 | 463 |             info_id == MBTK_INFO_ID_PB_BEGIN || | 
 | 464 |             info_id == MBTK_INFO_ID_PB_END || | 
| wangyouqiang | 38e5336 | 2024-01-23 10:53:48 +0800 | [diff] [blame] | 465 |             info_id == MBTK_INFO_ID_LED_BEGIN || | 
 | 466 |             info_id == MBTK_INFO_ID_LED_END || | 
| r.xiao | cfd7c68 | 2024-01-22 03:59:46 -0800 | [diff] [blame] | 467 |             info_id == MBTK_INFO_ID_WAKEUP_STA_BEGIN || | 
 | 468 |             info_id == MBTK_INFO_ID_WAKEUP_STA_END || | 
 | 469 |             info_id == MBTK_INFO_ID_OOS_STA_BEGIN || | 
 | 470 |             info_id == MBTK_INFO_ID_OOS_STA_END || | 
| liubin | 281ac46 | 2023-07-19 14:22:54 +0800 | [diff] [blame] | 471 |             info_id == MBTK_INFO_ID_REQ_UNKNOWN) | 
 | 472 |     { | 
 | 473 |         return MBTK_INFO_TYPE_UNKNOWN; | 
 | 474 |     } | 
 | 475 |     else if(info_id % 2 == 1) | 
 | 476 |     { | 
 | 477 |         return MBTK_INFO_TYPE_REQ; | 
 | 478 |     } | 
 | 479 |     else | 
 | 480 |     { | 
 | 481 |         return MBTK_INFO_TYPE_RSP; | 
 | 482 |     } | 
 | 483 | } | 
 | 484 |  | 
 | 485 | mbtk_info_pack_t* mbtk_info_pack_creat(int info_id) | 
 | 486 | { | 
 | 487 |     mbtk_info_pack_t *pack = (mbtk_info_pack_t *)malloc(sizeof(mbtk_info_pack_t)); | 
 | 488 |     if(!pack) | 
 | 489 |     { | 
 | 490 |         LOG("malloc() error[%d]", errno); | 
 | 491 |         return NULL; | 
 | 492 |     } | 
 | 493 |  | 
 | 494 |     pack->info_id = (uint16)info_id; | 
 | 495 |     pack->info_err = (uint16)0; | 
 | 496 |     pack->data_len = (uint16)0; | 
 | 497 |     pack->data = NULL; | 
 | 498 |  | 
 | 499 |     return pack; | 
 | 500 | } | 
 | 501 |  | 
 | 502 | #if 0 | 
 | 503 | int mbtk_info_pack_data_set(mbtk_info_pack_t *pack, const void *data, int data_len) | 
 | 504 | { | 
 | 505 |     if(!pack) | 
 | 506 |     { | 
 | 507 |         LOG("Packet is NULL."); | 
 | 508 |         return -1; | 
 | 509 |     } | 
 | 510 |  | 
 | 511 |     mbtk_info_type_enum info_type = mbtk_info_type_get(pack->info_id); | 
 | 512 |     // IND | 
 | 513 |     if(info_type == MBTK_INFO_TYPE_IND) | 
 | 514 |     { | 
 | 515 |         switch(pack->info_id) | 
 | 516 |         { | 
 | 517 |             // <uint8>  State | 
 | 518 |             case MBTK_INFO_ID_IND_NET_STATE_CHANGE: | 
 | 519 |             case MBTK_INFO_ID_IND_CALL_STATE_CHANGE: | 
 | 520 |             case MBTK_INFO_ID_IND_SMS_STATE_CHANGE: | 
 | 521 |             case MBTK_INFO_ID_IND_RADIO_STATE_CHANGE: | 
 | 522 |             case MBTK_INFO_ID_IND_SIM_STATE_CHANGE: | 
 | 523 |             { | 
 | 524 |                 pack->data_len = (uint16)data_len; | 
 | 525 |                 pack->data = (uint8*)memdup(data, pack->data_len); | 
 | 526 |                 break; | 
 | 527 |             } | 
 | 528 |             default: | 
 | 529 |             { | 
 | 530 |                 LOG("Unknown IND : %s", id2str(pack->info_id)); | 
 | 531 |                 break; | 
 | 532 |             } | 
 | 533 |         } | 
 | 534 |     } | 
 | 535 |     //else if(pack->info_id % 2 == 1)     // REQ (Set Data) | 
 | 536 |     else if(info_type == MBTK_INFO_TYPE_REQ || info_type == MBTK_INFO_TYPE_RSP) // REQ or RSP | 
 | 537 |     { | 
 | 538 |         switch(pack->info_id) | 
 | 539 |         { | 
 | 540 |             case MBTK_INFO_ID_DEV_VOLTE_REQ:    // <uint8> 0:Close 1:Open | 
 | 541 |             case MBTK_INFO_ID_DEV_VOLTE_RSP: | 
 | 542 |             case MBTK_INFO_ID_SIM_STATE_REQ:    // <uint8> 0:NOT_EXIST 1:READY ... | 
 | 543 |             case MBTK_INFO_ID_SIM_STATE_RSP: | 
 | 544 |             case MBTK_INFO_ID_NET_RADIO_REQ:    // <uint8> 0:OFF 1:ON | 
 | 545 |             case MBTK_INFO_ID_NET_RADIO_RSP: | 
 | 546 |             case MBTK_INFO_ID_NET_BAND_REQ:     // mbtk_band_info_t | 
 | 547 |             case MBTK_INFO_ID_NET_BAND_RSP: | 
 | 548 |             case MBTK_INFO_ID_NET_CELL_REQ:     // Lock net/cell/frequency | 
 | 549 |             case MBTK_INFO_ID_NET_CELL_RSP: | 
 | 550 |             case MBTK_INFO_ID_DEV_IMEI_REQ:     // <string> SN | 
 | 551 |             case MBTK_INFO_ID_DEV_IMEI_RSP: | 
 | 552 |             case MBTK_INFO_ID_DEV_SN_REQ:       // <string> SN | 
 | 553 |             case MBTK_INFO_ID_DEV_SN_RSP: | 
 | 554 |             case MBTK_INFO_ID_DEV_MEID_REQ:     // <string> MEID | 
 | 555 |             case MBTK_INFO_ID_DEV_MEID_RSP: | 
 | 556 |             case MBTK_INFO_ID_DEV_VERSION_REQ:  // <string> VERSION | 
 | 557 |             case MBTK_INFO_ID_DEV_VERSION_RSP: | 
 | 558 |             case MBTK_INFO_ID_DEV_TEMP_REQ:     // <string> Temperature | 
 | 559 |             case MBTK_INFO_ID_DEV_TEMP_RSP: | 
 | 560 |             case MBTK_INFO_ID_SIM_PIN_REQ:      // <string> PIN | 
 | 561 |             case MBTK_INFO_ID_SIM_PIN_RSP: | 
 | 562 |             case MBTK_INFO_ID_SIM_PUK_REQ:      // <string> PUK | 
 | 563 |             case MBTK_INFO_ID_SIM_PUK_RSP: | 
 | 564 |             case MBTK_INFO_ID_SIM_IMSI_REQ:     // <string> IMSI | 
 | 565 |             case MBTK_INFO_ID_SIM_IMSI_RSP: | 
 | 566 |             case MBTK_INFO_ID_SIM_ICCID_REQ:    // <string> ICCID | 
 | 567 |             case MBTK_INFO_ID_SIM_ICCID_RSP: | 
 | 568 |             case MBTK_INFO_ID_NET_APN_REQ:      // <string> cmnet/ctnet/3gnet/... | 
 | 569 |             case MBTK_INFO_ID_NET_APN_RSP: | 
 | 570 |             case MBTK_INFO_ID_NET_SEL_MODE_REQ: // mbtk_net_info_t | 
 | 571 |             case MBTK_INFO_ID_NET_SEL_MODE_RSP: | 
 | 572 |             case MBTK_INFO_ID_NET_AVAILABLE_REQ: // mbtk_net_info_t[] | 
 | 573 |             case MBTK_INFO_ID_NET_AVAILABLE_RSP: | 
 | 574 |             { | 
 | 575 |                 pack->data_len = (uint16)data_len; | 
 | 576 | #if 1 | 
 | 577 |                 pack->data = (uint8*)memdup(data, pack->data_len); | 
 | 578 | #else | 
 | 579 |                 LOG("%d -> %d", data_len, pack->data_len); | 
 | 580 |                 log_hex("pack1", pack, sizeof(mbtk_info_pack_t)); | 
 | 581 |                 #if 0 | 
 | 582 |                 pack->data = (uint8*)memdup(data, pack->data_len); | 
 | 583 |                 #else | 
 | 584 |  | 
 | 585 |                 LOG("1 pack->%p,data->%p", pack, pack->data); | 
 | 586 |                 pack->data = (uint8*)calloc(pack->data_len, sizeof(uint8)); | 
 | 587 |                 LOG("2 pack->%p,data->%p", pack, pack->data); | 
 | 588 |  | 
 | 589 |                 memcpy(pack->data, data, data_len); | 
 | 590 |                 #endif | 
 | 591 |  | 
 | 592 |                 LOG("data_len - %d", pack->data_len); | 
 | 593 |                 log_hex("pack2", pack, sizeof(mbtk_info_pack_t)); | 
 | 594 | #endif | 
 | 595 |                 break; | 
 | 596 |             } | 
 | 597 |             case MBTK_INFO_ID_NET_SIGNAL_REQ:   // <sint16>[4]  rssi,rscp,rsrp,snr | 
 | 598 |             case MBTK_INFO_ID_NET_SIGNAL_RSP: | 
 | 599 |             { | 
 | 600 |                 // const mbtk_net_signal_t* signal = (const mbtk_net_signal_t*)data; | 
 | 601 |                 pack->data_len = (uint16)sizeof(mbtk_net_signal_t); | 
 | 602 |                 pack->data = (uint8*)memdup(data, pack->data_len); | 
 | 603 |                 break; | 
 | 604 |             } | 
 | 605 |             case MBTK_INFO_ID_NET_IPV4_DNS_REQ: // <uint32>[2]  Preferred DNS,Alternate DNS | 
 | 606 |             case MBTK_INFO_ID_NET_IPV4_DNS_RSP: | 
 | 607 |             { | 
 | 608 |                 // const mbtk_net_dns_ipv4_t* dns_ipv4 = (const mbtk_net_dns_ipv4_t*)data; | 
 | 609 |                 pack->data_len = (uint16)sizeof(mbtk_net_dns_ipv4_t); | 
 | 610 |                 pack->data = (uint8*)memdup(data, pack->data_len); | 
 | 611 |                 break; | 
 | 612 |             } | 
 | 613 |             case MBTK_INFO_ID_NET_IPV6_DNS_REQ: // <uint32>[8]  Preferred DNS,Alternate DNS | 
 | 614 |             case MBTK_INFO_ID_NET_IPV6_DNS_RSP: | 
 | 615 |             { | 
 | 616 |                 // const mbtk_net_dns_ipv6_t* dns_ipv6 = (const mbtk_net_dns_ipv6_t*)data; | 
 | 617 |                 pack->data_len = (uint16)sizeof(mbtk_net_dns_ipv6_t); | 
 | 618 |                 pack->data = (uint8*)memdup(data, pack->data_len); | 
 | 619 |                 break; | 
 | 620 |             } | 
 | 621 |             case MBTK_INFO_ID_NET_IPV4_REQ:     // <uint32> IPv4 | 
 | 622 |             case MBTK_INFO_ID_NET_IPV4_RSP: | 
 | 623 |             { | 
 | 624 |                 pack->data_len = (uint16)sizeof(uint32); | 
 | 625 |                 pack->data = (uint8*)memdup(data, pack->data_len); | 
 | 626 |                 break; | 
 | 627 |             } | 
 | 628 |             case MBTK_INFO_ID_NET_IPV6_REQ:     // <uint32>[4] IPv6 | 
 | 629 |             case MBTK_INFO_ID_NET_IPV6_RSP: | 
 | 630 |             { | 
 | 631 |                 pack->data_len = (uint16)(sizeof(uint32) * 4); | 
 | 632 |                 pack->data = (uint8*)memdup(data, pack->data_len); | 
 | 633 |                 break; | 
 | 634 |             } | 
 | 635 |             case MBTK_INFO_ID_NET_LOCAL_REQ:    // <uint16>[2] tag,earfcn | 
 | 636 |             case MBTK_INFO_ID_NET_LOCAL_RSP: | 
 | 637 |             { | 
 | 638 |                 pack->data_len = (uint16)sizeof(mbtk_local_info_t); | 
 | 639 |                 pack->data = (uint8*)memdup(data, pack->data_len); | 
 | 640 |                 break; | 
 | 641 |             } | 
 | 642 | #if 0 | 
 | 643 |             case MBTK_INFO_ID_NET_SEL_MODE_REQ: | 
 | 644 |             case MBTK_INFO_ID_NET_SEL_MODE_RSP: // sel_mode(uint8)type(uint8)plmn(uint32) | 
 | 645 |             { | 
 | 646 |                 const mbtk_net_info_t* net = (const mbtk_net_info_t*)data; | 
 | 647 |                 pack->data_len = sizeof(uint8) + sizeof(uint8) + sizeof(uint32); | 
 | 648 |                 pack->data = (uint8*)malloc(pack->data_len); | 
 | 649 |                 if(pack->data == NULL) { | 
 | 650 |                     LOG("malloc() fail."); | 
 | 651 |                     return -1; | 
 | 652 |                 } | 
 | 653 |  | 
 | 654 |                 pack->data[0] = net->net_sel_mode; | 
 | 655 |                 pack->data[1] = net->net_type; | 
 | 656 |                 uint32_2_byte((uint32)atoi((char*)net->plmn), pack->data + 2,false); | 
 | 657 |                 break; | 
 | 658 |             } | 
 | 659 | #endif | 
 | 660 | #if 0 | 
 | 661 |             case MBTK_INFO_ID_NET_AVAILABLE_REQ: | 
 | 662 |             case MBTK_INFO_ID_NET_AVAILABLE_RSP: // sel_mode(uint8)type(uint8)plmn(uint32)...sel_mode(uint8)type(uint8)plmn(uint32) | 
 | 663 |             { | 
 | 664 |                 const mbtk_net_array_info_t* nets = (const mbtk_net_array_info_t*)data; | 
 | 665 |                 mbtk_net_info_t *net = NULL; | 
 | 666 |                 //LOG("MBTK_INFO_ID_NET_AVAILABLE_RSP set"); | 
 | 667 |                 //sleep(1); | 
 | 668 |                 list_first(nets->net_list); | 
 | 669 |                 pack->data_len = nets->count * sizeof(mbtk_net_info_t); | 
 | 670 |                 if(pack->data_len > 0) { | 
 | 671 |                     int i = 0; | 
 | 672 |                     pack->data = (uint8*)malloc(pack->data_len); | 
 | 673 |                     if(pack->data == NULL) { | 
 | 674 |                         LOG("malloc() fail."); | 
 | 675 |                         return -1; | 
 | 676 |                     } | 
 | 677 |                     memset(pack->data, 0, pack->data_len); | 
 | 678 |  | 
 | 679 |                     while ((net = (mbtk_net_info_t*) list_next(nets->net_list))) | 
 | 680 |                     { | 
 | 681 |                         #if 0 | 
 | 682 |                         memcpy(pack->data + i, net, sizeof(mbtk_net_info_t)); | 
 | 683 |                         i += sizeof(mbtk_net_info_t); | 
 | 684 |                         #else | 
 | 685 |                         pack->data[i++] = net->net_sel_mode; | 
 | 686 |                         pack->data[i++] = net->net_type; | 
 | 687 |                         //uint32_2_byte((uint32)atoi((char*)net->plmn), pack->data + i,false); | 
 | 688 |                         uint32_2_byte(net->plmn, pack->data + i,false); | 
 | 689 |                         i += sizeof(uint32); | 
 | 690 |                         #endif | 
 | 691 |                     } | 
 | 692 |                 } | 
 | 693 |                 break; | 
 | 694 |             } | 
 | 695 | #endif | 
 | 696 |             default: | 
 | 697 |             { | 
 | 698 |                 LOG("Unknown REQ/RSP : %s", id2str(pack->info_id)); | 
 | 699 |                 break; | 
 | 700 |             } | 
 | 701 |         } | 
 | 702 |     } | 
 | 703 |     else | 
 | 704 |     { | 
 | 705 |         LOG("Unknown info : %s", id2str(pack->info_id)); | 
 | 706 |         return -1; | 
 | 707 |     } | 
 | 708 |     return 0; | 
 | 709 | } | 
 | 710 |  | 
 | 711 | void* mbtk_info_pack_data_get(mbtk_info_pack_t *pack, int *data_len) | 
 | 712 | { | 
 | 713 |     if(pack == NULL || pack->data_len == 0 || pack->data == NULL) | 
 | 714 |     { | 
 | 715 |         LOG("Packet is NULL."); | 
 | 716 |         return NULL; | 
 | 717 |     } | 
 | 718 |  | 
 | 719 |     mbtk_info_type_enum info_type = mbtk_info_type_get(pack->info_id); | 
 | 720 |     // IND | 
 | 721 |     if(info_type == MBTK_INFO_TYPE_IND) | 
 | 722 |     { | 
 | 723 |         switch(pack->info_id) | 
 | 724 |         { | 
 | 725 |             // <uint8>  State | 
 | 726 |             case MBTK_INFO_ID_IND_NET_STATE_CHANGE: | 
 | 727 |             case MBTK_INFO_ID_IND_CALL_STATE_CHANGE: | 
 | 728 |             case MBTK_INFO_ID_IND_SMS_STATE_CHANGE: | 
 | 729 |             case MBTK_INFO_ID_IND_RADIO_STATE_CHANGE: | 
 | 730 |             case MBTK_INFO_ID_IND_SIM_STATE_CHANGE: | 
 | 731 |             { | 
 | 732 |                 return pack->data; | 
 | 733 |             } | 
 | 734 |             default: | 
 | 735 |             { | 
 | 736 |                 LOG("Unknown IND : %s", id2str(pack->info_id)); | 
 | 737 |                 break; | 
 | 738 |             } | 
 | 739 |         } | 
 | 740 |     } | 
 | 741 |     //else if(pack->info_id % 2 == 1)     // REQ (Set Data) | 
 | 742 |     else if(info_type == MBTK_INFO_TYPE_REQ || info_type == MBTK_INFO_TYPE_RSP) // REQ or RSP | 
 | 743 |     { | 
 | 744 |         switch(pack->info_id) | 
 | 745 |         { | 
 | 746 |             case MBTK_INFO_ID_DEV_VOLTE_REQ:    // <uint8> 0:Close 1:Open | 
 | 747 |             case MBTK_INFO_ID_DEV_VOLTE_RSP: | 
 | 748 |             case MBTK_INFO_ID_SIM_STATE_REQ:    // <uint8> 0:NOT_EXIST 1:READY ... | 
 | 749 |             case MBTK_INFO_ID_SIM_STATE_RSP: | 
 | 750 |             case MBTK_INFO_ID_NET_RADIO_REQ:    // <uint8> 0:OFF 1:ON | 
 | 751 |             case MBTK_INFO_ID_NET_RADIO_RSP: | 
 | 752 |             case MBTK_INFO_ID_DEV_IMEI_REQ:     // <string> SN | 
 | 753 |             case MBTK_INFO_ID_DEV_IMEI_RSP: | 
 | 754 |             case MBTK_INFO_ID_DEV_SN_REQ:       // <string> SN | 
 | 755 |             case MBTK_INFO_ID_DEV_SN_RSP: | 
 | 756 |             case MBTK_INFO_ID_DEV_MEID_REQ:     // <string> MEID | 
 | 757 |             case MBTK_INFO_ID_DEV_MEID_RSP: | 
 | 758 |             case MBTK_INFO_ID_DEV_VERSION_REQ:  // <string> VERSION | 
 | 759 |             case MBTK_INFO_ID_DEV_VERSION_RSP: | 
 | 760 |             case MBTK_INFO_ID_DEV_TEMP_REQ:     // <string> Temperature | 
 | 761 |             case MBTK_INFO_ID_DEV_TEMP_RSP: | 
 | 762 |             case MBTK_INFO_ID_SIM_PIN_REQ:      // <string> PIN | 
 | 763 |             case MBTK_INFO_ID_SIM_PIN_RSP: | 
 | 764 |             case MBTK_INFO_ID_SIM_PUK_REQ:      // <string> PUK | 
 | 765 |             case MBTK_INFO_ID_SIM_PUK_RSP: | 
 | 766 |             case MBTK_INFO_ID_SIM_IMSI_REQ:     // <string> IMSI | 
 | 767 |             case MBTK_INFO_ID_SIM_IMSI_RSP: | 
 | 768 |             case MBTK_INFO_ID_SIM_ICCID_REQ:    // <string> ICCID | 
 | 769 |             case MBTK_INFO_ID_SIM_ICCID_RSP: | 
 | 770 |             case MBTK_INFO_ID_NET_APN_REQ:      // <string> cmnet/ctnet/3gnet/... | 
 | 771 |             case MBTK_INFO_ID_NET_APN_RSP: | 
 | 772 |             case MBTK_INFO_ID_NET_BAND_REQ:     // mbtk_band_info_t | 
 | 773 |             case MBTK_INFO_ID_NET_BAND_RSP: | 
 | 774 |             case MBTK_INFO_ID_NET_CELL_REQ:     // Lock net/cell/frequency | 
 | 775 |             case MBTK_INFO_ID_NET_CELL_RSP: | 
 | 776 |             case MBTK_INFO_ID_NET_SEL_MODE_REQ:  // mbtk_net_info_t | 
 | 777 |             case MBTK_INFO_ID_NET_SEL_MODE_RSP: | 
 | 778 |             case MBTK_INFO_ID_NET_AVAILABLE_REQ: // mbtk_net_info_t[] | 
 | 779 |             case MBTK_INFO_ID_NET_AVAILABLE_RSP: | 
 | 780 |             { | 
 | 781 |                 return pack->data; | 
 | 782 |             } | 
 | 783 |             case MBTK_INFO_ID_NET_SIGNAL_REQ:   // <sint16>[4]  rssi,rscp,rsrp,snr | 
 | 784 |             case MBTK_INFO_ID_NET_SIGNAL_RSP: | 
 | 785 |             { | 
 | 786 |                 mbtk_net_signal_t* signal = (mbtk_net_signal_t*)malloc(sizeof(mbtk_net_signal_t)); | 
 | 787 |                 if(!signal) | 
 | 788 |                 { | 
 | 789 |                     LOG("malloc() error[%d]", errno); | 
 | 790 |                     return NULL; | 
 | 791 |                 } | 
 | 792 |  | 
 | 793 |                 signal->rssi = (sint16)byte_2_uint16(pack->data, false); | 
 | 794 |                 signal->rscp = (sint16)byte_2_uint16(pack->data + sizeof(uint16), false); | 
 | 795 |                 signal->rsrp = (sint16)byte_2_uint16(pack->data + sizeof(uint16) * 2, false); | 
 | 796 |                 signal->snr = (sint16)byte_2_uint16(pack->data + sizeof(uint16) * 3, false); | 
 | 797 |                 return signal; | 
 | 798 |             } | 
 | 799 |             case MBTK_INFO_ID_NET_IPV4_DNS_REQ: // <uint32>[2]  Preferred DNS,Alternate DNS | 
 | 800 |             case MBTK_INFO_ID_NET_IPV4_DNS_RSP: | 
 | 801 |             { | 
 | 802 |                 mbtk_net_dns_ipv4_t* dns_ipv4 = (mbtk_net_dns_ipv4_t*)malloc(sizeof(mbtk_net_dns_ipv4_t)); | 
 | 803 |                 if(!dns_ipv4) | 
 | 804 |                 { | 
 | 805 |                     LOG("malloc() error[%d]", errno); | 
 | 806 |                     return NULL; | 
 | 807 |                 } | 
 | 808 |  | 
 | 809 |                 dns_ipv4->preferred_dns = byte_2_uint32(pack->data, false); | 
 | 810 |                 dns_ipv4->alternate_dns = byte_2_uint32(pack->data + sizeof(uint32), false); | 
 | 811 |                 return dns_ipv4; | 
 | 812 |             } | 
 | 813 |             case MBTK_INFO_ID_NET_IPV6_DNS_REQ: // <uint32>[8]  Preferred DNS,Alternate DNS | 
 | 814 |             case MBTK_INFO_ID_NET_IPV6_DNS_RSP: | 
 | 815 |             { | 
 | 816 |                 return memdup(pack->data, sizeof(mbtk_net_dns_ipv6_t)); | 
 | 817 |             } | 
 | 818 |             case MBTK_INFO_ID_NET_IPV4_REQ:     // <uint32> IPv4 | 
 | 819 |             case MBTK_INFO_ID_NET_IPV4_RSP: | 
 | 820 |             { | 
 | 821 |                 return memdup(pack->data, sizeof(uint32)); | 
 | 822 |                 break; | 
 | 823 |             } | 
 | 824 |             case MBTK_INFO_ID_NET_IPV6_REQ:     // <uint32>[4] IPv6 | 
 | 825 |             case MBTK_INFO_ID_NET_IPV6_RSP: | 
 | 826 |             { | 
 | 827 |                 return memdup(pack->data, sizeof(uint32) * 4); | 
 | 828 |                 break; | 
 | 829 |             } | 
 | 830 |             case MBTK_INFO_ID_NET_LOCAL_REQ:    // <uint16>[2] tag,earfcn | 
 | 831 |             case MBTK_INFO_ID_NET_LOCAL_RSP: | 
 | 832 |             { | 
 | 833 |                 mbtk_local_info_t* local = (mbtk_local_info_t*)malloc(sizeof(mbtk_local_info_t)); | 
 | 834 |                 if(!local) | 
 | 835 |                 { | 
 | 836 |                     LOG("malloc() error[%d]", errno); | 
 | 837 |                     return NULL; | 
 | 838 |                 } | 
 | 839 |  | 
 | 840 |                 local->tag = (sint16)byte_2_uint16(pack->data, false); | 
 | 841 |                 local->earfcn = (sint16)byte_2_uint16(pack->data + sizeof(uint16), false); | 
 | 842 |                 return local; | 
 | 843 |             } | 
 | 844 | #if 0 | 
 | 845 |             case MBTK_INFO_ID_NET_SEL_MODE_REQ: | 
 | 846 |             case MBTK_INFO_ID_NET_SEL_MODE_RSP: // sel_mode(uint8)type(uint8)plmn(uint32) | 
 | 847 |             { | 
 | 848 |                 mbtk_net_info_t* net = (mbtk_net_info_t*)malloc(sizeof(mbtk_net_info_t)); | 
 | 849 |                 if(!net) | 
 | 850 |                 { | 
 | 851 |                     LOG("malloc() error[%d]", errno); | 
 | 852 |                     return NULL; | 
 | 853 |                 } | 
 | 854 |                 memset(net, 0, sizeof(mbtk_net_info_t)); | 
 | 855 |                 net->net_sel_mode = pack->data[0]; | 
 | 856 |                 net->net_type = pack->data[1]; | 
 | 857 |                 //itoa(byte_2_uint32(pack->data + 2, false), net->plmn, 10); | 
 | 858 |                 sprintf(net->plmn, "%d", byte_2_uint32(pack->data + 2, false)); | 
 | 859 |  | 
 | 860 |                 return net; | 
 | 861 |             } | 
 | 862 | #endif | 
 | 863 | #if 0 | 
 | 864 |             case MBTK_INFO_ID_NET_AVAILABLE_REQ: | 
 | 865 |             case MBTK_INFO_ID_NET_AVAILABLE_RSP: // sel_mode(uint8)type(uint8)plmn(uint32)...sel_mode(uint8)type(uint8)plmn(uint32) | 
 | 866 |             { | 
 | 867 |                 mbtk_net_array_info_t* nets = (mbtk_net_array_info_t*)malloc(sizeof(mbtk_net_array_info_t)); | 
 | 868 |                 if(!nets) | 
 | 869 |                 { | 
 | 870 |                     LOG("malloc() error[%d]", errno); | 
 | 871 |                     return NULL; | 
 | 872 |                 } | 
 | 873 |                 nets->count = 0; | 
 | 874 |                 nets->net_list = list_create(NULL); | 
 | 875 |                 if(nets->net_list == NULL) | 
 | 876 |                 { | 
 | 877 |                     LOG("list_create() fail."); | 
 | 878 |                     free(nets); | 
 | 879 |                     return NULL; | 
 | 880 |                 } | 
 | 881 |  | 
 | 882 |                 int i = 0; | 
 | 883 |                 while(i < pack->data_len) { | 
 | 884 |                     LOG("MBTK_INFO_ID_NET_AVAILABLE_RSP get 1"); | 
 | 885 |                     sleep(1); | 
 | 886 |                     mbtk_net_info_t* net = (mbtk_net_info_t*)malloc(sizeof(mbtk_net_info_t)); | 
 | 887 |                     LOG("MBTK_INFO_ID_NET_AVAILABLE_RSP get 2"); | 
 | 888 |                     sleep(1); | 
 | 889 |                     if(!net) | 
 | 890 |                     { | 
 | 891 |                         LOG("malloc() error[%d]", errno); | 
 | 892 |                         sleep(3); | 
 | 893 |                         //list_free(nets->net_list); | 
 | 894 |                         //free(nets); | 
 | 895 |                         return NULL; | 
 | 896 |                     } | 
 | 897 |                     memset(net, 0, sizeof(mbtk_net_info_t)); | 
 | 898 |  | 
 | 899 |                     LOG("MBTK_INFO_ID_NET_AVAILABLE_RSP get 3"); | 
 | 900 |                     sleep(1); | 
 | 901 | #if 1 | 
 | 902 |                     #if 1 | 
 | 903 |                     #if 0 | 
 | 904 |                     memcpy(net, pack->data + i, sizeof(mbtk_net_info_t)); | 
 | 905 |                     i += sizeof(mbtk_net_info_t); | 
 | 906 |                     #else | 
 | 907 |                     net->net_sel_mode = pack->data[i++]; | 
 | 908 |                     net->net_type = pack->data[i++]; | 
 | 909 |                     //sprintf(net->plmn, "%d", byte_2_uint32(pack->data + i, false)); | 
 | 910 |                     net->plmn = byte_2_uint32(pack->data + i, false); | 
 | 911 |                     i += sizeof(uint32); | 
 | 912 |                     #endif | 
 | 913 |                     #endif | 
 | 914 |  | 
 | 915 |                     LOG("MBTK_INFO_ID_NET_AVAILABLE_RSP get 5"); | 
 | 916 |                     log_hex("NET 2", net, sizeof(mbtk_net_info_t)); | 
 | 917 |                     sleep(1); | 
 | 918 |  | 
 | 919 |                     list_add(nets->net_list, net); | 
 | 920 |  | 
 | 921 | #endif | 
 | 922 |                     LOG("list_add"); | 
 | 923 |                     sleep(1); | 
 | 924 |                 } | 
 | 925 |  | 
 | 926 |                 sleep(10); | 
 | 927 |  | 
 | 928 |                 // Data lenght changed. | 
 | 929 |                 *data_len = sizeof(mbtk_net_array_info_t); | 
 | 930 |                 return nets; | 
 | 931 |             } | 
 | 932 | #endif | 
 | 933 |             default: | 
 | 934 |             { | 
 | 935 |                 LOG("Unknown REQ/RSP : %s", id2str(pack->info_id)); | 
 | 936 |                 break; | 
 | 937 |             } | 
 | 938 |         } | 
 | 939 |     } | 
 | 940 |     else | 
 | 941 |     { | 
 | 942 |         LOG("Unknown info : %s", id2str(pack->info_id)); | 
 | 943 |     } | 
 | 944 |  | 
 | 945 |     return NULL; | 
 | 946 | } | 
 | 947 | #endif | 
 | 948 |  | 
 | 949 | int mbtk_info_pack_send(int fd, mbtk_info_pack_t *pack) | 
 | 950 | { | 
 | 951 |     if(!pack) | 
 | 952 |     { | 
 | 953 |         LOG("Packet is NULL."); | 
 | 954 |         return -1; | 
 | 955 |     } | 
 | 956 |     uint8 data[SOCK_MSG_LEN_MAX] = {0}; | 
 | 957 |     uint8* data_ptr = data + SOCK_PACK_EXTRA_LEN; | 
 | 958 |  | 
 | 959 |     data_ptr += uint16_2_byte(pack->info_id, data_ptr, false); | 
 | 960 |     data_ptr += uint16_2_byte(pack->info_err, data_ptr, false); | 
 | 961 |     data_ptr += uint16_2_byte(pack->data_len, data_ptr, false); | 
 | 962 |     //log_hex("DATA1", data, 40); | 
 | 963 |     if(pack->data_len > 0) | 
 | 964 |     { | 
 | 965 |         memcpy(data_ptr, pack->data, pack->data_len); | 
 | 966 |         data_ptr += pack->data_len; | 
 | 967 |         //log_hex("DATA2", data, 40); | 
 | 968 |     } | 
 | 969 |  | 
 | 970 |     // Set flag and packet length. | 
 | 971 |     uint32_2_byte(MBTK_INFO_PACKET_FLAG, data, true); | 
 | 972 |     uint16_2_byte(data_ptr - data - SOCK_PACK_EXTRA_LEN, data + sizeof(uint32), false); | 
 | 973 |  | 
 | 974 |     //log_hex("DATA3", data, 40); | 
 | 975 |     return sock_write(fd, data, data_ptr - data); | 
 | 976 | } | 
 | 977 |  | 
 | 978 | mbtk_info_pack_t** mbtk_info_pack_recv(int fd, bool is_server, mbtk_info_err_enum *err) | 
 | 979 | { | 
 | 980 |     uint8 msg[SOCK_MSG_LEN_MAX + 1]; | 
 | 981 |     *err = MBTK_INFO_ERR_SUCCESS; | 
 | 982 |     int len = sock_read(fd, msg, SOCK_MSG_LEN_MAX + 1); | 
 | 983 |     if(len < SOCK_PACK_LEN_MIN) | 
 | 984 |     { | 
 | 985 |         if(len > 0) | 
 | 986 |         { | 
 | 987 |             *err = MBTK_INFO_ERR_FORMAT; | 
 | 988 |             LOG("Insufficient packet data."); | 
 | 989 |         } | 
 | 990 |         return NULL; | 
 | 991 |     } | 
 | 992 |  | 
 | 993 |     int pack_count = pack_num_check(msg, len); | 
 | 994 |     LOG("Packet number : %d", pack_count); | 
 | 995 |     if(pack_count < 1) | 
 | 996 |     { | 
 | 997 |         *err = MBTK_INFO_ERR_FORMAT; | 
 | 998 |         LOG("Packet not found."); | 
 | 999 |         return NULL; | 
 | 1000 |     } | 
 | 1001 |     uint8 *ptr = msg; | 
 | 1002 |     mbtk_info_pack_t** packs = (mbtk_info_pack_t**)malloc(sizeof(mbtk_info_pack_t*) * (pack_count + 1)); | 
 | 1003 |     int i = 0; | 
 | 1004 |     while(i < pack_count) | 
 | 1005 |     { | 
 | 1006 |         // TAG | 
 | 1007 |         if(MBTK_INFO_PACKET_FLAG != byte_2_uint32(ptr, true)) | 
 | 1008 |         { | 
 | 1009 |             *err = MBTK_INFO_ERR_FORMAT; | 
 | 1010 |             LOG("Packet TAG error."); | 
 | 1011 |             goto error; | 
 | 1012 |         } | 
 | 1013 |         ptr += sizeof(uint32); | 
 | 1014 |  | 
 | 1015 |         // Jump packet length. | 
 | 1016 |         ptr += sizeof(uint16); | 
 | 1017 |  | 
 | 1018 |         mbtk_info_id_enum info_id = (mbtk_info_id_enum)byte_2_uint16(ptr, false); | 
 | 1019 |         mbtk_info_type_enum info_type = mbtk_info_type_get(info_id); | 
 | 1020 |         if(is_server) | 
 | 1021 |         { | 
 | 1022 |             // For server,"info_type" must by REQ or IND(Register IND). | 
 | 1023 |             if(info_type != MBTK_INFO_TYPE_REQ && info_type != MBTK_INFO_TYPE_IND) | 
 | 1024 |             { | 
 | 1025 |                 *err = MBTK_INFO_ERR_FORMAT; | 
| b.liu | d8043a3 | 2024-06-07 16:08:22 +0800 | [diff] [blame] | 1026 |                 LOG("Packet Type error : %d", info_type); | 
| liubin | 281ac46 | 2023-07-19 14:22:54 +0800 | [diff] [blame] | 1027 |                 goto error; | 
 | 1028 |             } | 
 | 1029 |         } | 
 | 1030 |         else | 
 | 1031 |         { | 
 | 1032 |             // For client,"info_type" must by RSP or IND. | 
 | 1033 |             if(info_type != MBTK_INFO_TYPE_RSP && info_type != MBTK_INFO_TYPE_IND) | 
 | 1034 |             { | 
 | 1035 |                 *err = MBTK_INFO_ERR_FORMAT; | 
 | 1036 |                 LOG("Packet Type error."); | 
 | 1037 |                 goto error; | 
 | 1038 |             } | 
 | 1039 |         } | 
 | 1040 |         ptr += sizeof(uint16); | 
 | 1041 |  | 
 | 1042 |         mbtk_info_pack_t* pack = mbtk_info_pack_creat(info_id); | 
 | 1043 |         if(pack == NULL) | 
 | 1044 |         { | 
 | 1045 |             *err = MBTK_INFO_ERR_MEMORY; | 
 | 1046 |             LOG("Packet malloc() fail."); | 
 | 1047 |             goto error; | 
 | 1048 |         } | 
 | 1049 |  | 
 | 1050 |         // "info_err" | 
 | 1051 |         pack->info_err = byte_2_uint16(ptr, false); | 
 | 1052 |         ptr += sizeof(uint16); | 
 | 1053 |  | 
 | 1054 |         // "data_len" | 
 | 1055 |         pack->data_len = byte_2_uint16(ptr, false); | 
 | 1056 |         ptr += sizeof(uint16); | 
 | 1057 |  | 
 | 1058 |         if(pack->data_len > 0) | 
 | 1059 |         { | 
 | 1060 |             pack->data = (uint8*)memdup(ptr, pack->data_len); | 
 | 1061 |             ptr += pack->data_len; | 
 | 1062 |         } | 
 | 1063 |  | 
 | 1064 |         packs[i++] = pack; | 
 | 1065 |     } | 
 | 1066 |     packs[i] = NULL; | 
 | 1067 |  | 
 | 1068 |     return packs; | 
 | 1069 |  | 
 | 1070 | error: | 
 | 1071 |     LOG("mbtk_info_pack_recv error, will free()."); | 
 | 1072 |     if(packs) | 
 | 1073 |     { | 
 | 1074 |         mbtk_info_pack_t** pack_ptr = packs; | 
 | 1075 |         while(*pack_ptr) | 
 | 1076 |         { | 
 | 1077 |             mbtk_info_pack_free(pack_ptr); | 
 | 1078 |             pack_ptr++; | 
 | 1079 |         } | 
 | 1080 |  | 
 | 1081 |         free(packs); | 
 | 1082 |     } | 
 | 1083 |     return NULL; | 
 | 1084 | } | 
 | 1085 |  | 
 | 1086 | int mbtk_info_pack_free(mbtk_info_pack_t **pack) | 
 | 1087 | { | 
 | 1088 |     if(pack == NULL || *pack == NULL) | 
 | 1089 |     { | 
 | 1090 |         LOG("Packet is NULL."); | 
 | 1091 |         return -1; | 
 | 1092 |     } | 
 | 1093 |  | 
 | 1094 |     // LOG("Free packet : %s", id2str((*pack)->info_id)); | 
 | 1095 | #if 0 | 
 | 1096 |     if((*pack)->data) | 
 | 1097 |     { | 
 | 1098 |         free((*pack)->data); | 
 | 1099 |     } | 
 | 1100 | #endif | 
 | 1101 |     free(*pack); | 
 | 1102 |     *pack = NULL; | 
 | 1103 |     return 0; | 
 | 1104 | } | 
 | 1105 |  | 
 | 1106 |  |