mirror of https://github.com/ARMmbed/mbed-os.git
Cellular: Stack type based on assigned IP addresses versions
parent
0c18a7721e
commit
ea1b2b8045
|
@ -51,9 +51,9 @@ uint16_t char_str_to_hex(const char *str, uint16_t len, char *buf, bool omit_lea
|
||||||
return CellularUtil_stub::uint16_value;
|
return CellularUtil_stub::uint16_value;
|
||||||
}
|
}
|
||||||
|
|
||||||
void convert_ipv6(char *ip)
|
nsapi_version_t convert_ipv6(char *ip)
|
||||||
{
|
{
|
||||||
|
return NSAPI_UNSPEC;
|
||||||
}
|
}
|
||||||
|
|
||||||
char *find_dot_number(char *str, int dot_number)
|
char *find_dot_number(char *str, int dot_number)
|
||||||
|
|
|
@ -59,27 +59,43 @@ const char *AT_CellularStack::get_ip_address()
|
||||||
{
|
{
|
||||||
_at.lock();
|
_at.lock();
|
||||||
|
|
||||||
|
bool ipv4 = false, ipv6 = false;
|
||||||
|
|
||||||
_at.cmd_start_stop("+CGPADDR", "=", "%d", _cid);
|
_at.cmd_start_stop("+CGPADDR", "=", "%d", _cid);
|
||||||
_at.resp_start("+CGPADDR:");
|
_at.resp_start("+CGPADDR:");
|
||||||
|
|
||||||
int len = -1;
|
|
||||||
if (_at.info_resp()) {
|
if (_at.info_resp()) {
|
||||||
_at.skip_param();
|
_at.skip_param();
|
||||||
|
|
||||||
len = _at.read_string(_ip, PDP_IPV6_SIZE);
|
if (_at.read_string(_ip, PDP_IPV6_SIZE) != -1) {
|
||||||
|
convert_ipv6(_ip);
|
||||||
|
SocketAddress address;
|
||||||
|
address.set_ip_address(_ip);
|
||||||
|
|
||||||
if (len != -1 && _stack_type != IPV4_STACK) {
|
ipv4 = (address.get_ip_version() == NSAPI_IPv4);
|
||||||
// in case stack type is not IPV4 only, try to look also for IPV6 address
|
ipv6 = (address.get_ip_version() == NSAPI_IPv6);
|
||||||
(void)_at.read_string(_ip, PDP_IPV6_SIZE);
|
|
||||||
|
// Try to look for second address ONLY if modem has support for dual stack(can handle both IPv4 and IPv6 simultaneously).
|
||||||
|
// Otherwise assumption is that second address is not reliable, even if network provides one.
|
||||||
|
if ((get_property(PROPERTY_IPV4V6_PDP_TYPE) && (_at.read_string(_ip, PDP_IPV6_SIZE) != -1))) {
|
||||||
|
convert_ipv6(_ip);
|
||||||
|
address.set_ip_address(_ip);
|
||||||
|
ipv6 = (address.get_ip_version() == NSAPI_IPv6);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_at.resp_stop();
|
_at.resp_stop();
|
||||||
_at.unlock();
|
_at.unlock();
|
||||||
|
|
||||||
// we have at least IPV4 address
|
if (ipv4 && ipv6) {
|
||||||
convert_ipv6(_ip);
|
_stack_type = IPV4V6_STACK;
|
||||||
|
} else if (ipv4) {
|
||||||
|
_stack_type = IPV4_STACK;
|
||||||
|
} else if (ipv6) {
|
||||||
|
_stack_type = IPV6_STACK;
|
||||||
|
}
|
||||||
|
|
||||||
return len != -1 ? _ip : NULL;
|
return (ipv4 || ipv6) ? _ip : NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
nsapi_error_t AT_CellularStack::socket_stack_init()
|
nsapi_error_t AT_CellularStack::socket_stack_init()
|
||||||
|
|
|
@ -203,7 +203,7 @@ protected:
|
||||||
// PDP context id
|
// PDP context id
|
||||||
int _cid;
|
int _cid;
|
||||||
|
|
||||||
// stack type from PDP context
|
// stack type - initialised as PDP type and set accordingly after CGPADDR checked
|
||||||
nsapi_ip_stack_t _stack_type;
|
nsapi_ip_stack_t _stack_type;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -28,10 +28,10 @@
|
||||||
using namespace mbed;
|
using namespace mbed;
|
||||||
namespace mbed_cellular_util {
|
namespace mbed_cellular_util {
|
||||||
|
|
||||||
void convert_ipv6(char *ip)
|
nsapi_version_t convert_ipv6(char *ip)
|
||||||
{
|
{
|
||||||
if (!ip) {
|
if (!ip) {
|
||||||
return;
|
return NSAPI_UNSPEC;
|
||||||
}
|
}
|
||||||
|
|
||||||
int len = strlen(ip);
|
int len = strlen(ip);
|
||||||
|
@ -49,7 +49,11 @@ void convert_ipv6(char *ip)
|
||||||
|
|
||||||
// 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
|
// 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
|
||||||
// we need to convert it to hexadecimal format separated with colons
|
// we need to convert it to hexadecimal format separated with colons
|
||||||
if (pos > 3) {
|
if (pos == 3) {
|
||||||
|
|
||||||
|
return NSAPI_IPv4;
|
||||||
|
|
||||||
|
} else if (pos > 3) {
|
||||||
pos = 0;
|
pos = 0;
|
||||||
int ip_pos = 0;
|
int ip_pos = 0;
|
||||||
char b;
|
char b;
|
||||||
|
@ -74,7 +78,11 @@ void convert_ipv6(char *ip)
|
||||||
ip[pos] = '\0';
|
ip[pos] = '\0';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return NSAPI_IPv6;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return NSAPI_UNSPEC;
|
||||||
}
|
}
|
||||||
|
|
||||||
// For example "32.1.13.184.0.0.205.48.0.0.0.0.0.0.0.0"
|
// For example "32.1.13.184.0.0.205.48.0.0.0.0.0.0.0.0"
|
||||||
|
|
|
@ -48,8 +48,9 @@ static const char hex_values[] = "0123456789ABCDEF";
|
||||||
* where ax are in decimal format. In this case, function converts decimals to hex with separated with colons.
|
* where ax are in decimal format. In this case, function converts decimals to hex with separated with colons.
|
||||||
*
|
*
|
||||||
* @param ip IP address that can be IPv4 or IPv6 in different formats from AT command +CGPADDR. Converted result uses same buffer.
|
* @param ip IP address that can be IPv4 or IPv6 in different formats from AT command +CGPADDR. Converted result uses same buffer.
|
||||||
|
* @return IP version of the address or NSAPI_UNSPEC if param ip empty or if IPv4 or IPv6 version could not be concluded.
|
||||||
*/
|
*/
|
||||||
void convert_ipv6(char *ip);
|
nsapi_version_t convert_ipv6(char *ip);
|
||||||
|
|
||||||
/** Separates IP addresses from the given 'orig' string. 'orig' may contain zero, one or two IP addresses in various formats.
|
/** Separates IP addresses from the given 'orig' string. 'orig' may contain zero, one or two IP addresses in various formats.
|
||||||
* See AT command +CGPIAF from 3GPP TS 27.007 for details. Does also needed conversions for IPv6 addresses.
|
* See AT command +CGPIAF from 3GPP TS 27.007 for details. Does also needed conversions for IPv6 addresses.
|
||||||
|
|
Loading…
Reference in New Issue