fix(tls): Enable IPv6 support in ssl_client connect (#9470)
Similar to NetworkClient, check the family of the passed in address and configure the socket and socket address accordingly, for both IPv6 and IPv4 support.
This commit is contained in:
parent
b6ca5a8630
commit
17888679c7
1 changed files with 18 additions and 7 deletions
|
|
@ -62,21 +62,32 @@ int start_ssl_client(sslclient_context *ssl_client, const IPAddress& ip, uint32_
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
log_v("Starting socket");
|
int domain = ip.type() == IPv6 ? AF_INET6 : AF_INET;
|
||||||
|
log_v("Starting socket (domain %d)", domain);
|
||||||
ssl_client->socket = -1;
|
ssl_client->socket = -1;
|
||||||
|
|
||||||
ssl_client->socket = lwip_socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
|
ssl_client->socket = lwip_socket(domain, SOCK_STREAM, IPPROTO_TCP);
|
||||||
if (ssl_client->socket < 0) {
|
if (ssl_client->socket < 0) {
|
||||||
log_e("ERROR opening socket");
|
log_e("ERROR opening socket");
|
||||||
return ssl_client->socket;
|
return ssl_client->socket;
|
||||||
}
|
}
|
||||||
|
|
||||||
fcntl( ssl_client->socket, F_SETFL, fcntl( ssl_client->socket, F_GETFL, 0 ) | O_NONBLOCK );
|
fcntl( ssl_client->socket, F_SETFL, fcntl( ssl_client->socket, F_GETFL, 0 ) | O_NONBLOCK );
|
||||||
struct sockaddr_in serv_addr;
|
struct sockaddr_storage serv_addr = {};
|
||||||
memset(&serv_addr, 0, sizeof(serv_addr));
|
if (domain == AF_INET6) {
|
||||||
serv_addr.sin_family = AF_INET;
|
struct sockaddr_in6 *tmpaddr = (struct sockaddr_in6 *)&serv_addr;
|
||||||
serv_addr.sin_addr.s_addr = ip;
|
tmpaddr->sin6_family = AF_INET6;
|
||||||
serv_addr.sin_port = htons(port);
|
for (int index = 0; index < 16; index++) {
|
||||||
|
tmpaddr->sin6_addr.s6_addr[index] = ip[index];
|
||||||
|
}
|
||||||
|
tmpaddr->sin6_port = htons(port);
|
||||||
|
tmpaddr->sin6_scope_id = ip.zone();
|
||||||
|
} else {
|
||||||
|
struct sockaddr_in *tmpaddr = (struct sockaddr_in *)&serv_addr;
|
||||||
|
tmpaddr->sin_family = AF_INET;
|
||||||
|
tmpaddr->sin_addr.s_addr = ip;
|
||||||
|
tmpaddr->sin_port = htons(port);
|
||||||
|
}
|
||||||
|
|
||||||
if(timeout <= 0){
|
if(timeout <= 0){
|
||||||
timeout = 30000; // Milli seconds.
|
timeout = 30000; // Milli seconds.
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue