| wangyouqiang | 80487e4 | 2024-05-24 15:06:20 +0800 | [diff] [blame] | 1 | #if 1 | 
| b.liu | 9e8584b | 2024-11-06 19:21:28 +0800 | [diff] [blame] | 2 | #include <ctype.h> | 
 | 3 |  | 
| wangyouqiang | 80487e4 | 2024-05-24 15:06:20 +0800 | [diff] [blame] | 4 | #include "mbtk_data_call.h" | 
| b.liu | 9e8584b | 2024-11-06 19:21:28 +0800 | [diff] [blame] | 5 | #include "mbtk_info.h" | 
 | 6 | #include "mbtk_utils.h" | 
| wangyouqiang | 80487e4 | 2024-05-24 15:06:20 +0800 | [diff] [blame] | 7 |  | 
 | 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*/ | 
 | 28 | mbtk_qser_apn_info_s apninfo_s[9]; | 
 | 29 | char apn_set_state[MBTK_BUFF_SIZE] = MBTK_BUFF_STATE_INIT; | 
 | 30 | char apn_auth_type[MBTK_BUFF_SIZE] = MBTK_BUFF_STATE_INIT; | 
 | 31 | mbtk_apn_auth_proto_enum apn_auth[9]; | 
 | 32 | int default_apn_cid = -1; | 
 | 33 | bool default_pdp_state = false; | 
 | 34 | bool apn_init_flag = false; | 
 | 35 |  | 
 | 36 | int mbtk_get_default_apn_cid(void) | 
 | 37 | { | 
 | 38 |     return default_apn_cid; | 
 | 39 | } | 
 | 40 |  | 
 | 41 | void mbtk_set_default_apn_cid(int cid) | 
 | 42 | { | 
 | 43 |     default_apn_cid = cid; | 
 | 44 | } | 
 | 45 |  | 
 | 46 | bool mbtk_get_default_pdp_state(void) | 
 | 47 | { | 
 | 48 |     return default_pdp_state; | 
 | 49 | } | 
 | 50 |  | 
 | 51 | void 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 |  | 
 | 65 | int 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 |  | 
 | 82 | static 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 |  | 
 | 97 | int 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.liu | c41882f | 2024-10-23 17:54:44 +0800 | [diff] [blame] | 105 | #if 0 | 
| wangyouqiang | 80487e4 | 2024-05-24 15:06:20 +0800 | [diff] [blame] | 106 |     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 |  | 
 | 115 | int 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 | 
| wangyouqiang | 13e9840 | 2024-05-24 16:07:43 +0800 | [diff] [blame] | 126 |     if(default_cid != cid && cid != 1) | 
| wangyouqiang | 80487e4 | 2024-05-24 15:06:20 +0800 | [diff] [blame] | 127 | #else | 
 | 128 |     if(default_cid != cid) | 
 | 129 | #endif | 
 | 130 | #endif | 
 | 131 |     { | 
| wangyouqiang | 13e9840 | 2024-05-24 16:07:43 +0800 | [diff] [blame] | 132 |         LOGE("cid [%d] no default cid.", cid); | 
| wangyouqiang | 80487e4 | 2024-05-24 15:06:20 +0800 | [diff] [blame] | 133 |         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.liu | 9e8584b | 2024-11-06 19:21:28 +0800 | [diff] [blame] | 141 |     mbtk_system(buf); | 
| wangyouqiang | 80487e4 | 2024-05-24 15:06:20 +0800 | [diff] [blame] | 142 |  | 
 | 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 |  | 
 | 204 | static 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.wang | 5d90f73 | 2024-10-16 00:01:43 -0700 | [diff] [blame] | 223 |         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.liu | 9e8584b | 2024-11-06 19:21:28 +0800 | [diff] [blame] | 230 |     } | 
 | 231 |  | 
| wangyouqiang | 80487e4 | 2024-05-24 15:06:20 +0800 | [diff] [blame] | 232 |     { | 
 | 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.liu | 9e8584b | 2024-11-06 19:21:28 +0800 | [diff] [blame] | 255 |  | 
| wangyouqiang | 80487e4 | 2024-05-24 15:06:20 +0800 | [diff] [blame] | 256 |                 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 |  | 
 | 270 | static 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.liu | 9e8584b | 2024-11-06 19:21:28 +0800 | [diff] [blame] | 277 |  | 
| wangyouqiang | 80487e4 | 2024-05-24 15:06:20 +0800 | [diff] [blame] | 278 |     //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 |         { | 
| liuyang | c328398 | 2024-06-04 17:00:15 +0800 | [diff] [blame] | 288 |             if(0x0 != apn_type[0]) | 
| wangyouqiang | 80487e4 | 2024-05-24 15:06:20 +0800 | [diff] [blame] | 289 |             { | 
| liuyang | c328398 | 2024-06-04 17:00:15 +0800 | [diff] [blame] | 290 |                 if(strcmp((char *)apninfo_s[pdp_type_tmp].apn_type, (char *)apn_type) == 0) | 
| wangyouqiang | 80487e4 | 2024-05-24 15:06:20 +0800 | [diff] [blame] | 291 |                 { | 
| liuyang | c328398 | 2024-06-04 17:00:15 +0800 | [diff] [blame] | 292 |                     LOGE("apn_type is same!idx = [%d]", pdp_type_tmp); | 
| wangyouqiang | 80487e4 | 2024-05-24 15:06:20 +0800 | [diff] [blame] | 293 |                     return MBTK_RESULT_FAIL; | 
 | 294 |                 } | 
| liuyang | c328398 | 2024-06-04 17:00:15 +0800 | [diff] [blame] | 295 |             } | 
| b.liu | 9e8584b | 2024-11-06 19:21:28 +0800 | [diff] [blame] | 296 |  | 
| liuyang | c328398 | 2024-06-04 17:00:15 +0800 | [diff] [blame] | 297 |             if(0x0 != apn_name[0]) | 
 | 298 |             { | 
 | 299 |                 if (strcmp((char *)apninfo_s[pdp_type_tmp].apn_name, (char *)apn_name) == 0) | 
| wangyouqiang | 80487e4 | 2024-05-24 15:06:20 +0800 | [diff] [blame] | 300 |                 { | 
| liuyang | c328398 | 2024-06-04 17:00:15 +0800 | [diff] [blame] | 301 |                     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 |                     } | 
| wangyouqiang | 80487e4 | 2024-05-24 15:06:20 +0800 | [diff] [blame] | 312 |                 } | 
 | 313 |             } | 
 | 314 |         } | 
 | 315 |     } | 
 | 316 |  | 
 | 317 |     return MBTK_RESULT_SUCCESS; | 
 | 318 | } | 
 | 319 |  | 
 | 320 | static 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.liu | 9e8584b | 2024-11-06 19:21:28 +0800 | [diff] [blame] | 348 |  | 
| wangyouqiang | 80487e4 | 2024-05-24 15:06:20 +0800 | [diff] [blame] | 349 |         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 |  | 
 | 373 | int 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 |  | 
| wangyouqiang | 75b6cfd | 2024-05-31 14:25:45 +0800 | [diff] [blame] | 383 | #ifndef MBTK_SG_SUPPORT | 
 | 384 |     if(cid == 1) | 
 | 385 |     { | 
 | 386 |         LOGE("cid 1 is exist"); | 
 | 387 |         return MBTK_RESULT_FAIL; | 
 | 388 |     } | 
 | 389 | #endif | 
 | 390 |  | 
| wangyouqiang | 80487e4 | 2024-05-24 15:06:20 +0800 | [diff] [blame] | 391 |     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.wang | 9823ddf | 2024-11-14 02:38:14 -0800 | [diff] [blame] | 402 |     property_set(buff, ""); | 
| b.liu | 9e8584b | 2024-11-06 19:21:28 +0800 | [diff] [blame] | 403 |  | 
| wangyouqiang | 80487e4 | 2024-05-24 15:06:20 +0800 | [diff] [blame] | 404 |     memset(&apninfo_s[cid], 0x0, sizeof(mbtk_qser_apn_info_s)); | 
 | 405 |     return MBTK_RESULT_SUCCESS; | 
 | 406 | } | 
 | 407 | /* | 
 | 408 | AT+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 |  | 
 | 413 | OK | 
 | 414 | */ | 
 | 415 |  | 
 | 416 | int 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 |             { | 
| wangyouqiang | 80487e4 | 2024-05-24 15:06:20 +0800 | [diff] [blame] | 578 |                 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.wang | 12b32b4 | 2024-07-31 02:46:37 -0700 | [diff] [blame] | 587 |     if(apn_init_flag) | 
 | 588 |     { | 
 | 589 |         apn_init_flag = false; | 
 | 590 |     } | 
| wangyouqiang | 80487e4 | 2024-05-24 15:06:20 +0800 | [diff] [blame] | 591 |     goto exit; | 
 | 592 | exit: | 
 | 593 |     at_response_free(response); | 
 | 594 |     return err; | 
 | 595 | } | 
 | 596 |  | 
 | 597 |  | 
 | 598 | int 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.liu | 9e8584b | 2024-11-06 19:21:28 +0800 | [diff] [blame] | 606 | //    int ret = -1; | 
| wangyouqiang | 80487e4 | 2024-05-24 15:06:20 +0800 | [diff] [blame] | 607 |     char buff[32] = {0}; | 
 | 608 |     int cid = apn.cid; | 
| b.liu | 9e8584b | 2024-11-06 19:21:28 +0800 | [diff] [blame] | 609 |  | 
| wangyouqiang | 80487e4 | 2024-05-24 15:06:20 +0800 | [diff] [blame] | 610 |     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.liu | 9e8584b | 2024-11-06 19:21:28 +0800 | [diff] [blame] | 626 |  | 
| liuyang | ff5b185 | 2024-06-18 18:32:39 +0800 | [diff] [blame] | 627 |     memcpy(apninfo_s[cid].apn_type, apn_type, strlen((char *)apn_type)); | 
 | 628 |     if(state_save) | 
| wangyouqiang | 80487e4 | 2024-05-24 15:06:20 +0800 | [diff] [blame] | 629 |     { | 
| liuyang | ff5b185 | 2024-06-18 18:32:39 +0800 | [diff] [blame] | 630 |         sprintf(buff, "%s%d", MBTK_APN_TYPE, apn.cid); | 
 | 631 |         property_set(buff, (char *)apn_type); | 
| wangyouqiang | 80487e4 | 2024-05-24 15:06:20 +0800 | [diff] [blame] | 632 |     } | 
| b.liu | 9e8584b | 2024-11-06 19:21:28 +0800 | [diff] [blame] | 633 |  | 
| wangyouqiang | 80487e4 | 2024-05-24 15:06:20 +0800 | [diff] [blame] | 634 |  | 
 | 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 |  | 
 | 654 | int 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.liu | 9e8584b | 2024-11-06 19:21:28 +0800 | [diff] [blame] | 666 |  | 
| wangyouqiang | 80487e4 | 2024-05-24 15:06:20 +0800 | [diff] [blame] | 667 |     // 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.wang | 12b32b4 | 2024-07-31 02:46:37 -0700 | [diff] [blame] | 686 | #ifndef MBTK_SG_SUPPORT | 
| wangyouqiang | 80487e4 | 2024-05-24 15:06:20 +0800 | [diff] [blame] | 687 |         ret = mbtk_check_cid(apn->cid); | 
 | 688 |         if(ret < 0) | 
 | 689 |         { | 
 | 690 |             LOGE("cid is error."); | 
 | 691 |             return MBTK_RESULT_FAIL; | 
 | 692 |         } | 
| b.liu | 9e8584b | 2024-11-06 19:21:28 +0800 | [diff] [blame] | 693 |  | 
| wangyouqiang | 80487e4 | 2024-05-24 15:06:20 +0800 | [diff] [blame] | 694 |         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.liu | 9e8584b | 2024-11-06 19:21:28 +0800 | [diff] [blame] | 727 |  | 
| wangyouqiang | 80487e4 | 2024-05-24 15:06:20 +0800 | [diff] [blame] | 728 |     // 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.wang | 12b32b4 | 2024-07-31 02:46:37 -0700 | [diff] [blame] | 764 |     LOGD("APN : %d, %d, %s, %s, %s, %s, %s.", apn->cid, | 
 | 765 |                                         apn->ip_type, | 
| b.liu | 9e8584b | 2024-11-06 19:21:28 +0800 | [diff] [blame] | 766 |                                         (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 |  | 
| wangyouqiang | 80487e4 | 2024-05-24 15:06:20 +0800 | [diff] [blame] | 772 |     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 |     } | 
| wangyouqiang | 80487e4 | 2024-05-24 15:06:20 +0800 | [diff] [blame] | 785 |     return MBTK_RESULT_SUCCESS; | 
 | 786 | } | 
 | 787 |  | 
 | 788 | void 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 |