Kenji Arai / mbed-os_TYBLE16

Dependents:   TYBLE16_simple_data_logger TYBLE16_MP3_Air

Committer:
kenjiArai
Date:
Tue Dec 31 06:02:27 2019 +0000
Revision:
1:9db0e321a9f4
Parent:
0:5b88d5760320
updated based on mbed-os5.15.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 0:5b88d5760320 1 /*
kenjiArai 0:5b88d5760320 2 * Copyright (c) , Arm Limited and affiliates.
kenjiArai 0:5b88d5760320 3 * SPDX-License-Identifier: Apache-2.0
kenjiArai 0:5b88d5760320 4 *
kenjiArai 0:5b88d5760320 5 * Licensed under the Apache License, Version 2.0 (the "License");
kenjiArai 0:5b88d5760320 6 * you may not use this file except in compliance with the License.
kenjiArai 0:5b88d5760320 7 * You may obtain a copy of the License at
kenjiArai 0:5b88d5760320 8 *
kenjiArai 0:5b88d5760320 9 * http://www.apache.org/licenses/LICENSE-2.0
kenjiArai 0:5b88d5760320 10 *
kenjiArai 0:5b88d5760320 11 * Unless required by applicable law or agreed to in writing, software
kenjiArai 0:5b88d5760320 12 * distributed under the License is distributed on an "AS IS" BASIS,
kenjiArai 0:5b88d5760320 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
kenjiArai 0:5b88d5760320 14 * See the License for the specific language governing permissions and
kenjiArai 0:5b88d5760320 15 * limitations under the License.
kenjiArai 0:5b88d5760320 16 */
kenjiArai 0:5b88d5760320 17 #include "CellularUtil.h"
kenjiArai 0:5b88d5760320 18 #include <string.h>
kenjiArai 0:5b88d5760320 19 #include <stdlib.h>
kenjiArai 0:5b88d5760320 20
kenjiArai 0:5b88d5760320 21
kenjiArai 0:5b88d5760320 22 #include "randLIB.h"
kenjiArai 0:5b88d5760320 23 #define RANDOM_PORT_NUMBER_START 49152
kenjiArai 0:5b88d5760320 24 #define RANDOM_PORT_NUMBER_END 65535
kenjiArai 0:5b88d5760320 25 #define RANDOM_PORT_NUMBER_COUNT (RANDOM_PORT_NUMBER_END - RANDOM_PORT_NUMBER_START + 1)
kenjiArai 0:5b88d5760320 26 #define RANDOM_PORT_NUMBER_MAX_STEP 100
kenjiArai 0:5b88d5760320 27
kenjiArai 1:9db0e321a9f4 28 using namespace mbed;
kenjiArai 0:5b88d5760320 29 namespace mbed_cellular_util {
kenjiArai 0:5b88d5760320 30
kenjiArai 1:9db0e321a9f4 31 nsapi_version_t convert_ipv6(char *ip)
kenjiArai 0:5b88d5760320 32 {
kenjiArai 0:5b88d5760320 33 if (!ip) {
kenjiArai 1:9db0e321a9f4 34 return NSAPI_UNSPEC;
kenjiArai 0:5b88d5760320 35 }
kenjiArai 0:5b88d5760320 36
kenjiArai 0:5b88d5760320 37 int len = strlen(ip);
kenjiArai 0:5b88d5760320 38 int pos = 0;
kenjiArai 0:5b88d5760320 39 int i;
kenjiArai 0:5b88d5760320 40
kenjiArai 0:5b88d5760320 41 for (i = 0; i < len; i++) {
kenjiArai 0:5b88d5760320 42 if (ip[i] == '.') {
kenjiArai 0:5b88d5760320 43 pos++;
kenjiArai 0:5b88d5760320 44 }
kenjiArai 0:5b88d5760320 45 if (pos > 3) {
kenjiArai 0:5b88d5760320 46 break;
kenjiArai 0:5b88d5760320 47 }
kenjiArai 0:5b88d5760320 48 }
kenjiArai 0:5b88d5760320 49
kenjiArai 0:5b88d5760320 50 // more that 3 periods mean that it was ipv6 but in format of a1.a2.a3.a4.a5.a6.a7.a8.a9.a10.a11.a12.a13.a14.a15.a16
kenjiArai 0:5b88d5760320 51 // we need to convert it to hexadecimal format separated with colons
kenjiArai 1:9db0e321a9f4 52 if (pos == 3) {
kenjiArai 1:9db0e321a9f4 53
kenjiArai 1:9db0e321a9f4 54 return NSAPI_IPv4;
kenjiArai 1:9db0e321a9f4 55
kenjiArai 1:9db0e321a9f4 56 } else if (pos > 3) {
kenjiArai 0:5b88d5760320 57 pos = 0;
kenjiArai 0:5b88d5760320 58 int ip_pos = 0;
kenjiArai 0:5b88d5760320 59 char b;
kenjiArai 0:5b88d5760320 60 bool set_colon = false;
kenjiArai 0:5b88d5760320 61 for (i = 0; i < len; i++) {
kenjiArai 0:5b88d5760320 62 if (ip[i] == '.') {
kenjiArai 0:5b88d5760320 63 b = (char)strtol(ip + ip_pos, NULL, 10); // convert to char to int so we can change it to hex string
kenjiArai 0:5b88d5760320 64 pos += char_str_to_hex_str(&b, 1, ip + pos, !set_colon); // omit leading zeroes with using set_colon flag
kenjiArai 0:5b88d5760320 65 if (set_colon) {
kenjiArai 0:5b88d5760320 66 ip[pos++] = ':';
kenjiArai 0:5b88d5760320 67 set_colon = false;
kenjiArai 0:5b88d5760320 68 } else {
kenjiArai 0:5b88d5760320 69 set_colon = true;
kenjiArai 0:5b88d5760320 70 }
kenjiArai 0:5b88d5760320 71 ip_pos = i + 1; // skip the '.'
kenjiArai 0:5b88d5760320 72 }
kenjiArai 0:5b88d5760320 73
kenjiArai 0:5b88d5760320 74 // handle the last part which does not end with '.' but '\0'
kenjiArai 0:5b88d5760320 75 if (i == len - 1) {
kenjiArai 0:5b88d5760320 76 b = (char)strtol(ip + ip_pos, NULL, 10);
kenjiArai 0:5b88d5760320 77 pos += char_str_to_hex_str(&b, 1, ip + pos, !set_colon);
kenjiArai 0:5b88d5760320 78 ip[pos] = '\0';
kenjiArai 0:5b88d5760320 79 }
kenjiArai 0:5b88d5760320 80 }
kenjiArai 1:9db0e321a9f4 81
kenjiArai 1:9db0e321a9f4 82 return NSAPI_IPv6;
kenjiArai 0:5b88d5760320 83 }
kenjiArai 1:9db0e321a9f4 84
kenjiArai 1:9db0e321a9f4 85 return NSAPI_UNSPEC;
kenjiArai 0:5b88d5760320 86 }
kenjiArai 0:5b88d5760320 87
kenjiArai 0:5b88d5760320 88 // For example "32.1.13.184.0.0.205.48.0.0.0.0.0.0.0.0"
kenjiArai 0:5b88d5760320 89 void separate_ip4like_addresses(char *orig, char *ip, size_t ip_size, char *ip2, size_t ip2_size)
kenjiArai 0:5b88d5760320 90 {
kenjiArai 0:5b88d5760320 91 // ipv4-like notation
kenjiArai 0:5b88d5760320 92 int len = strlen(orig);
kenjiArai 0:5b88d5760320 93 int count = 0, i = 0, pos = 0;
kenjiArai 0:5b88d5760320 94 char *temp;
kenjiArai 0:5b88d5760320 95
kenjiArai 0:5b88d5760320 96 for (; i < len; i++) {
kenjiArai 0:5b88d5760320 97 if (orig[i] == '.') {
kenjiArai 0:5b88d5760320 98 count++;
kenjiArai 0:5b88d5760320 99 if (count == 4) {
kenjiArai 0:5b88d5760320 100 pos = i;
kenjiArai 0:5b88d5760320 101 } else if (count == 16) {
kenjiArai 0:5b88d5760320 102 pos = i;
kenjiArai 0:5b88d5760320 103 }
kenjiArai 0:5b88d5760320 104 }
kenjiArai 0:5b88d5760320 105 }
kenjiArai 0:5b88d5760320 106
kenjiArai 0:5b88d5760320 107 if (count == 3) { // normal ipv4, copy to ip
kenjiArai 0:5b88d5760320 108 if (ip_size > strlen(orig)) {
kenjiArai 0:5b88d5760320 109 memcpy(ip, orig, strlen(orig));
kenjiArai 0:5b88d5760320 110 ip[strlen(orig)] = '\0';
kenjiArai 0:5b88d5760320 111 } else {
kenjiArai 0:5b88d5760320 112 ip[0] = '\0';
kenjiArai 0:5b88d5760320 113 }
kenjiArai 0:5b88d5760320 114 if (ip2) {
kenjiArai 0:5b88d5760320 115 ip2[0] = '\0';
kenjiArai 0:5b88d5760320 116 }
kenjiArai 0:5b88d5760320 117 } else if (count == 7) { // ipv4 and subnet mask. Need to separate those.
kenjiArai 0:5b88d5760320 118 temp = &orig[pos];
kenjiArai 0:5b88d5760320 119 if ((uint8_t)ip_size > temp - orig) {
kenjiArai 0:5b88d5760320 120 memcpy(ip, orig, temp - orig);
kenjiArai 0:5b88d5760320 121 ip[temp - orig] = '\0';
kenjiArai 0:5b88d5760320 122 }
kenjiArai 0:5b88d5760320 123 temp++; // skip the '.'
kenjiArai 0:5b88d5760320 124 if (ip2 && (ip2_size > strlen(temp))) {
kenjiArai 0:5b88d5760320 125 memcpy(ip2, temp, strlen(temp));
kenjiArai 0:5b88d5760320 126 ip2[strlen(temp)] = '\0';
kenjiArai 0:5b88d5760320 127 }
kenjiArai 0:5b88d5760320 128 } else if (count == 15) { // only one ipv6 address in ipv4-like notation
kenjiArai 0:5b88d5760320 129 if (ip_size > strlen(orig)) {
kenjiArai 0:5b88d5760320 130 memcpy(ip, orig, strlen(orig));
kenjiArai 0:5b88d5760320 131 ip[strlen(orig)] = '\0';
kenjiArai 0:5b88d5760320 132 convert_ipv6(ip);
kenjiArai 0:5b88d5760320 133 } else {
kenjiArai 0:5b88d5760320 134 ip[0] = '\0';
kenjiArai 0:5b88d5760320 135 }
kenjiArai 0:5b88d5760320 136 if (ip2) {
kenjiArai 0:5b88d5760320 137 ip2[0] = '\0';
kenjiArai 0:5b88d5760320 138 }
kenjiArai 0:5b88d5760320 139 } else if (count == 31) { // ipv6 + ipv6subnet mask in ipv4-like notation separated by dot '.'
kenjiArai 0:5b88d5760320 140 temp = &orig[pos];
kenjiArai 0:5b88d5760320 141 if ((uint8_t)ip_size > temp - orig) {
kenjiArai 0:5b88d5760320 142 memcpy(ip, orig, temp - orig);
kenjiArai 0:5b88d5760320 143 ip[temp - orig] = '\0';
kenjiArai 0:5b88d5760320 144 convert_ipv6(ip);
kenjiArai 0:5b88d5760320 145 }
kenjiArai 0:5b88d5760320 146 temp++; // skip the '.'
kenjiArai 0:5b88d5760320 147 if (ip2 && (ip2_size > strlen(temp))) {
kenjiArai 0:5b88d5760320 148 memcpy(ip2, temp, strlen(temp));
kenjiArai 0:5b88d5760320 149 ip2[strlen(temp)] = '\0';
kenjiArai 0:5b88d5760320 150 convert_ipv6(ip2);
kenjiArai 0:5b88d5760320 151 }
kenjiArai 0:5b88d5760320 152 }
kenjiArai 0:5b88d5760320 153 }
kenjiArai 0:5b88d5760320 154
kenjiArai 0:5b88d5760320 155 void separate_ip_addresses(char *orig, char *ip, size_t ip_size, char *ip2, size_t ip2_size)
kenjiArai 0:5b88d5760320 156 {
kenjiArai 0:5b88d5760320 157 // orig can include ipv4, ipv6, both or two ip4/ipv6 addresses.
kenjiArai 0:5b88d5760320 158 // also format depends on possible AT+CGPIAF
kenjiArai 0:5b88d5760320 159 if (!orig || !ip) {
kenjiArai 0:5b88d5760320 160 if (ip) {
kenjiArai 0:5b88d5760320 161 ip[0] = '\0';
kenjiArai 0:5b88d5760320 162 }
kenjiArai 0:5b88d5760320 163 if (ip2) {
kenjiArai 0:5b88d5760320 164 ip2[0] = '\0';
kenjiArai 0:5b88d5760320 165 }
kenjiArai 0:5b88d5760320 166 return;
kenjiArai 0:5b88d5760320 167 }
kenjiArai 0:5b88d5760320 168 // 1. try to found ':'. If it's found then we know that possible addresses are separated with space
kenjiArai 0:5b88d5760320 169 char *temp;
kenjiArai 0:5b88d5760320 170 temp = strchr(orig, ':');
kenjiArai 0:5b88d5760320 171
kenjiArai 0:5b88d5760320 172 if (temp != NULL) {
kenjiArai 0:5b88d5760320 173 // found ':'
kenjiArai 0:5b88d5760320 174 temp = strstr(orig, " ");
kenjiArai 0:5b88d5760320 175 // found space as separator and it wasn't in beginning --> contains 2 ip addresses
kenjiArai 0:5b88d5760320 176 if (temp && temp != orig) {
kenjiArai 0:5b88d5760320 177 if ((uint8_t)ip_size > temp - orig) {
kenjiArai 0:5b88d5760320 178 memcpy(ip, orig, temp - orig);
kenjiArai 0:5b88d5760320 179 ip[temp - orig] = '\0';
kenjiArai 0:5b88d5760320 180 } else {
kenjiArai 0:5b88d5760320 181 ip[0] = '\0';
kenjiArai 0:5b88d5760320 182 }
kenjiArai 0:5b88d5760320 183 temp++; // skip the space
kenjiArai 0:5b88d5760320 184 if (ip2 && (ip2_size > strlen(temp))) {
kenjiArai 0:5b88d5760320 185 memcpy(ip2, temp, strlen(temp));
kenjiArai 0:5b88d5760320 186 ip2[strlen(temp)] = '\0';
kenjiArai 0:5b88d5760320 187 } else if (ip2) {
kenjiArai 0:5b88d5760320 188 ip2[0] = '\0';
kenjiArai 0:5b88d5760320 189 }
kenjiArai 0:5b88d5760320 190 } else {
kenjiArai 0:5b88d5760320 191 // Space was the first char or no space found ---> only one ip, copy to ip
kenjiArai 0:5b88d5760320 192 size_t size = strlen(orig);
kenjiArai 0:5b88d5760320 193 if (temp) {
kenjiArai 0:5b88d5760320 194 size = strlen(temp);
kenjiArai 0:5b88d5760320 195 }
kenjiArai 0:5b88d5760320 196
kenjiArai 0:5b88d5760320 197 if (ip_size > size) {
kenjiArai 0:5b88d5760320 198 memcpy(ip, orig, size);
kenjiArai 0:5b88d5760320 199 ip[size] = '\0';
kenjiArai 0:5b88d5760320 200 } else {
kenjiArai 0:5b88d5760320 201 ip[0] = '\0';
kenjiArai 0:5b88d5760320 202 }
kenjiArai 0:5b88d5760320 203 if (ip2) {
kenjiArai 0:5b88d5760320 204 ip2[0] = '\0';
kenjiArai 0:5b88d5760320 205 }
kenjiArai 0:5b88d5760320 206 }
kenjiArai 0:5b88d5760320 207 } else {
kenjiArai 1:9db0e321a9f4 208 separate_ip4like_addresses(orig, ip, ip_size, ip2, ip2_size);
kenjiArai 0:5b88d5760320 209 }
kenjiArai 0:5b88d5760320 210 }
kenjiArai 0:5b88d5760320 211
kenjiArai 0:5b88d5760320 212 void prefer_ipv6(char *ip, size_t ip_size, char *ip2, size_t ip2_size)
kenjiArai 0:5b88d5760320 213 {
kenjiArai 0:5b88d5760320 214 if (!ip || !ip2) {
kenjiArai 0:5b88d5760320 215 return;
kenjiArai 0:5b88d5760320 216 }
kenjiArai 0:5b88d5760320 217 // assume that that ipv6 is already in formatted to use ':'
kenjiArai 0:5b88d5760320 218 // 1. try to found ':'. If it's found then we know that this is ipv6
kenjiArai 0:5b88d5760320 219 char *temp;
kenjiArai 0:5b88d5760320 220 temp = strchr(ip, ':');
kenjiArai 0:5b88d5760320 221 if (temp) {
kenjiArai 0:5b88d5760320 222 // ip has ipv6 address, we can leave
kenjiArai 0:5b88d5760320 223 return;
kenjiArai 0:5b88d5760320 224 } else {
kenjiArai 0:5b88d5760320 225 // ip was not ipv6, check if ip2 is
kenjiArai 0:5b88d5760320 226 temp = strchr(ip2, ':');
kenjiArai 0:5b88d5760320 227 if (temp) {
kenjiArai 0:5b88d5760320 228 // ipv6 was found in ip2 but not in ip ---> we must swap them. Sadly ip and ip2 might not be pointers
kenjiArai 0:5b88d5760320 229 // so we can't just swap them, must use copy.
kenjiArai 1:9db0e321a9f4 230 if (strlen(ip) < ip2_size && strlen(ip2) < ip_size && strlen(ip) < 64 && strlen(ip2) < 64) {
kenjiArai 0:5b88d5760320 231 char tmp[64];
kenjiArai 0:5b88d5760320 232 strncpy(tmp, ip, strlen(ip));
kenjiArai 0:5b88d5760320 233 tmp[strlen(ip)] = '\0';
kenjiArai 0:5b88d5760320 234 strncpy(ip, ip2, strlen(ip2));
kenjiArai 0:5b88d5760320 235 ip[strlen(ip2)] = '\0';
kenjiArai 0:5b88d5760320 236 strncpy(ip2, tmp, strlen(tmp));
kenjiArai 0:5b88d5760320 237 ip2[strlen(tmp)] = '\0';
kenjiArai 0:5b88d5760320 238 }
kenjiArai 0:5b88d5760320 239 }
kenjiArai 0:5b88d5760320 240 }
kenjiArai 0:5b88d5760320 241 }
kenjiArai 0:5b88d5760320 242
kenjiArai 0:5b88d5760320 243 void int_to_hex_str(uint8_t num, char *buf)
kenjiArai 0:5b88d5760320 244 {
kenjiArai 0:5b88d5760320 245 char charNum = num;
kenjiArai 0:5b88d5760320 246 char_str_to_hex_str(&charNum, 1, buf);
kenjiArai 0:5b88d5760320 247 }
kenjiArai 0:5b88d5760320 248
kenjiArai 0:5b88d5760320 249 int hex_str_to_int(const char *hex_string, int hex_string_length)
kenjiArai 0:5b88d5760320 250 {
kenjiArai 0:5b88d5760320 251 const int base = 16;
kenjiArai 0:5b88d5760320 252 int character_as_integer, integer_output = 0;
kenjiArai 0:5b88d5760320 253
kenjiArai 0:5b88d5760320 254 for (int i = 0; i < hex_string_length && hex_string[i] != '\0'; i++) {
kenjiArai 0:5b88d5760320 255 if (hex_string[i] >= '0' && hex_string[i] <= '9') {
kenjiArai 0:5b88d5760320 256 character_as_integer = hex_string[i] - '0';
kenjiArai 0:5b88d5760320 257 } else if (hex_string[i] >= 'A' && hex_string[i] <= 'F') {
kenjiArai 0:5b88d5760320 258 character_as_integer = hex_string[i] - 'A' + 10;
kenjiArai 0:5b88d5760320 259 } else {
kenjiArai 0:5b88d5760320 260 character_as_integer = hex_string[i] - 'a' + 10;
kenjiArai 0:5b88d5760320 261 }
kenjiArai 0:5b88d5760320 262 integer_output *= base;
kenjiArai 0:5b88d5760320 263 integer_output += character_as_integer;
kenjiArai 0:5b88d5760320 264 }
kenjiArai 0:5b88d5760320 265
kenjiArai 0:5b88d5760320 266 return integer_output;
kenjiArai 0:5b88d5760320 267 }
kenjiArai 0:5b88d5760320 268
kenjiArai 0:5b88d5760320 269 int hex_str_to_char_str(const char *str, uint16_t len, char *buf)
kenjiArai 0:5b88d5760320 270 {
kenjiArai 0:5b88d5760320 271 int strcount = 0;
kenjiArai 1:9db0e321a9f4 272 if (str && buf) {
kenjiArai 1:9db0e321a9f4 273 for (int i = 0; i + 1 < len; i += 2) {
kenjiArai 1:9db0e321a9f4 274 char tmp;
kenjiArai 1:9db0e321a9f4 275 hex_to_char(str + i, tmp);
kenjiArai 1:9db0e321a9f4 276 buf[strcount] = tmp;
kenjiArai 1:9db0e321a9f4 277 strcount++;
kenjiArai 1:9db0e321a9f4 278 }
kenjiArai 0:5b88d5760320 279 }
kenjiArai 0:5b88d5760320 280
kenjiArai 0:5b88d5760320 281 return strcount;
kenjiArai 0:5b88d5760320 282 }
kenjiArai 0:5b88d5760320 283
kenjiArai 1:9db0e321a9f4 284 void hex_to_char(const char *hex, char &buf)
kenjiArai 1:9db0e321a9f4 285 {
kenjiArai 1:9db0e321a9f4 286 if (hex) {
kenjiArai 1:9db0e321a9f4 287 int upper = hex_str_to_int(hex, 1);
kenjiArai 1:9db0e321a9f4 288 int lower = hex_str_to_int(hex + 1, 1);
kenjiArai 1:9db0e321a9f4 289 buf = ((upper << 4) & 0xF0) | (lower & 0x0F);
kenjiArai 1:9db0e321a9f4 290 }
kenjiArai 1:9db0e321a9f4 291 }
kenjiArai 1:9db0e321a9f4 292
kenjiArai 0:5b88d5760320 293 void uint_to_binary_str(uint32_t num, char *str, int str_size, int bit_cnt)
kenjiArai 0:5b88d5760320 294 {
kenjiArai 0:5b88d5760320 295 if (!str || str_size < bit_cnt) {
kenjiArai 0:5b88d5760320 296 return;
kenjiArai 0:5b88d5760320 297 }
kenjiArai 0:5b88d5760320 298 int tmp, pos = 0;
kenjiArai 0:5b88d5760320 299
kenjiArai 0:5b88d5760320 300 for (int i = 31; i >= 0; i--) {
kenjiArai 0:5b88d5760320 301 tmp = num >> i;
kenjiArai 0:5b88d5760320 302 if (i < bit_cnt) {
kenjiArai 0:5b88d5760320 303 if (tmp & 1) {
kenjiArai 0:5b88d5760320 304 str[pos] = 1 + '0';
kenjiArai 0:5b88d5760320 305 } else {
kenjiArai 0:5b88d5760320 306 str[pos] = 0 + '0';
kenjiArai 0:5b88d5760320 307 }
kenjiArai 0:5b88d5760320 308 pos++;
kenjiArai 0:5b88d5760320 309 }
kenjiArai 0:5b88d5760320 310 }
kenjiArai 0:5b88d5760320 311 }
kenjiArai 0:5b88d5760320 312
kenjiArai 0:5b88d5760320 313 uint32_t binary_str_to_uint(const char *binary_string, int binary_string_length)
kenjiArai 0:5b88d5760320 314 {
kenjiArai 0:5b88d5760320 315 if (!binary_string || !binary_string_length) {
kenjiArai 0:5b88d5760320 316 return 0;
kenjiArai 0:5b88d5760320 317 }
kenjiArai 0:5b88d5760320 318
kenjiArai 0:5b88d5760320 319 int integer_output = 0, base_exp = 1;
kenjiArai 0:5b88d5760320 320
kenjiArai 0:5b88d5760320 321 for (int i = binary_string_length - 1; i >= 0; i--) {
kenjiArai 0:5b88d5760320 322 if (binary_string[i] == '1') {
kenjiArai 0:5b88d5760320 323 integer_output += base_exp;
kenjiArai 0:5b88d5760320 324 }
kenjiArai 0:5b88d5760320 325 if (binary_string[i] != '\0') {
kenjiArai 0:5b88d5760320 326 base_exp <<= 1;
kenjiArai 0:5b88d5760320 327 }
kenjiArai 0:5b88d5760320 328 }
kenjiArai 0:5b88d5760320 329
kenjiArai 0:5b88d5760320 330 return integer_output;
kenjiArai 0:5b88d5760320 331 }
kenjiArai 0:5b88d5760320 332
kenjiArai 0:5b88d5760320 333 int char_str_to_hex_str(const char *str, uint16_t len, char *buf, bool omit_leading_zero)
kenjiArai 0:5b88d5760320 334 {
kenjiArai 0:5b88d5760320 335 if (!str || !buf) {
kenjiArai 0:5b88d5760320 336 return 0;
kenjiArai 0:5b88d5760320 337 }
kenjiArai 0:5b88d5760320 338
kenjiArai 0:5b88d5760320 339 char *ptr = buf;
kenjiArai 0:5b88d5760320 340 int i = 0;
kenjiArai 0:5b88d5760320 341 while (i < len) {
kenjiArai 0:5b88d5760320 342 if (omit_leading_zero == true && i == 0 && !(str[i] >> 4 & 0x0F)) {
kenjiArai 0:5b88d5760320 343 *ptr++ = hex_values[(str[i]) & 0x0F];
kenjiArai 0:5b88d5760320 344 } else {
kenjiArai 0:5b88d5760320 345 *ptr++ = hex_values[((str[i]) >> 4) & 0x0F];
kenjiArai 0:5b88d5760320 346 *ptr++ = hex_values[(str[i]) & 0x0F];
kenjiArai 0:5b88d5760320 347 }
kenjiArai 0:5b88d5760320 348 i++;
kenjiArai 0:5b88d5760320 349 }
kenjiArai 0:5b88d5760320 350 return ptr - buf;
kenjiArai 0:5b88d5760320 351 }
kenjiArai 0:5b88d5760320 352
kenjiArai 0:5b88d5760320 353 uint16_t get_dynamic_ip_port()
kenjiArai 0:5b88d5760320 354 {
kenjiArai 0:5b88d5760320 355 static uint16_t port_counter = RANDOM_PORT_NUMBER_COUNT;
kenjiArai 0:5b88d5760320 356
kenjiArai 0:5b88d5760320 357 if (port_counter == RANDOM_PORT_NUMBER_COUNT) {
kenjiArai 0:5b88d5760320 358 randLIB_seed_random();
kenjiArai 0:5b88d5760320 359 port_counter = randLIB_get_random_in_range(0, RANDOM_PORT_NUMBER_COUNT - 1);
kenjiArai 0:5b88d5760320 360 }
kenjiArai 0:5b88d5760320 361
kenjiArai 0:5b88d5760320 362 port_counter += randLIB_get_random_in_range(1, RANDOM_PORT_NUMBER_MAX_STEP);
kenjiArai 0:5b88d5760320 363 port_counter %= RANDOM_PORT_NUMBER_COUNT;
kenjiArai 0:5b88d5760320 364
kenjiArai 0:5b88d5760320 365 return (RANDOM_PORT_NUMBER_START + port_counter);
kenjiArai 0:5b88d5760320 366 }
kenjiArai 0:5b88d5760320 367
kenjiArai 1:9db0e321a9f4 368 pdp_type_t string_to_pdp_type(const char *pdp_type_str)
kenjiArai 1:9db0e321a9f4 369 {
kenjiArai 1:9db0e321a9f4 370 pdp_type_t pdp_type = DEFAULT_PDP_TYPE;
kenjiArai 1:9db0e321a9f4 371 int len = strlen(pdp_type_str);
kenjiArai 1:9db0e321a9f4 372
kenjiArai 1:9db0e321a9f4 373 if (len == 6 && memcmp(pdp_type_str, "IPV4V6", len) == 0) {
kenjiArai 1:9db0e321a9f4 374 pdp_type = IPV4V6_PDP_TYPE;
kenjiArai 1:9db0e321a9f4 375 } else if (len == 4 && memcmp(pdp_type_str, "IPV6", len) == 0) {
kenjiArai 1:9db0e321a9f4 376 pdp_type = IPV6_PDP_TYPE;
kenjiArai 1:9db0e321a9f4 377 } else if (len == 2 && memcmp(pdp_type_str, "IP", len) == 0) {
kenjiArai 1:9db0e321a9f4 378 pdp_type = IPV4_PDP_TYPE;
kenjiArai 1:9db0e321a9f4 379 } else if (len == 6 && memcmp(pdp_type_str, "Non-IP", len) == 0) {
kenjiArai 1:9db0e321a9f4 380 pdp_type = NON_IP_PDP_TYPE;
kenjiArai 1:9db0e321a9f4 381 }
kenjiArai 1:9db0e321a9f4 382 return pdp_type;
kenjiArai 1:9db0e321a9f4 383 }
kenjiArai 1:9db0e321a9f4 384
kenjiArai 0:5b88d5760320 385 } // namespace mbed_cellular_util