Merge pull request #703 from anhu/ipv6_part2

improvements for ipv6
pull/709/head
David Garske 2024-06-03 16:22:16 -07:00 committed by GitHub
commit b6ccb07de4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 34 additions and 24 deletions

View File

@ -991,7 +991,8 @@ static THREAD_RETURN WOLFSSH_THREAD wolfSSH_Client(void* args)
err_sys("Couldn't set the username."); err_sys("Couldn't set the username.");
build_addr(&clientAddr, config.hostname, config.port); build_addr(&clientAddr, config.hostname, config.port);
tcp_socket(&sockFd); tcp_socket(&sockFd, ((struct sockaddr_in *)&clientAddr)->sin_family);
ret = connect(sockFd, (const struct sockaddr *)&clientAddr, clientAddrSz); ret = connect(sockFd, (const struct sockaddr *)&clientAddr, clientAddrSz);
if (ret != 0) if (ret != 0)
err_sys("Couldn't connect to server."); err_sys("Couldn't connect to server.");

View File

@ -2374,7 +2374,7 @@ static int StartSSHD(int argc, char** argv)
#ifdef WOLFSSL_NUCLEUS #ifdef WOLFSSL_NUCLEUS
struct addr_struct clientAddr; struct addr_struct clientAddr;
#else #else
SOCKADDR_IN_T clientAddr; struct sockaddr_in6 clientAddr;
socklen_t clientAddrSz = sizeof(clientAddr); socklen_t clientAddrSz = sizeof(clientAddr);
#endif #endif
conn = (WOLFSSHD_CONNECTION*)WMALLOC(sizeof(WOLFSSHD_CONNECTION), NULL, DYNTYPE_SSHD); conn = (WOLFSSHD_CONNECTION*)WMALLOC(sizeof(WOLFSSHD_CONNECTION), NULL, DYNTYPE_SSHD);
@ -2396,13 +2396,16 @@ static int StartSSHD(int argc, char** argv)
conn->fd = (int)accept(listenFd, (struct sockaddr*)&clientAddr, conn->fd = (int)accept(listenFd, (struct sockaddr*)&clientAddr,
&clientAddrSz); &clientAddrSz);
if (conn->fd >= 0) { if (conn->fd >= 0) {
inet_ntop(AF_INET, if (clientAddr.sin6_family == AF_INET) {
#ifdef TEST_IPV6 struct sockaddr_in* addr4 =
&clientAddr.sin6_addr, (struct sockaddr_in*)&clientAddr;
#else inet_ntop(AF_INET, &addr4->sin_addr, conn->ip,
&clientAddr.sin_addr, INET_ADDRSTRLEN);
#endif /* TEST_IPV6 */ }
conn->ip, INET_ADDRSTRLEN); else if (clientAddr.sin6_family == AF_INET6) {
inet_ntop(AF_INET6, &clientAddr.sin6_addr, conn->ip,
INET6_ADDRSTRLEN);
}
} }
#endif #endif

View File

@ -904,7 +904,8 @@ THREAD_RETURN WOLFSSH_THREAD client_test(void* args)
} }
build_addr(&clientAddr, host, port); build_addr(&clientAddr, host, port);
tcp_socket(&sockFd); tcp_socket(&sockFd, ((struct sockaddr_in *)&clientAddr)->sin_family);
ret = connect(sockFd, (const struct sockaddr *)&clientAddr, clientAddrSz); ret = connect(sockFd, (const struct sockaddr *)&clientAddr, clientAddrSz);
if (ret != 0) if (ret != 0)
err_sys("Couldn't connect to server."); err_sys("Couldn't connect to server.");

View File

@ -380,12 +380,14 @@ THREAD_RETURN WOLFSSH_THREAD portfwd_worker(void* args)
if (ret != WS_SUCCESS) if (ret != WS_SUCCESS)
err_sys("Couldn't set the username."); err_sys("Couldn't set the username.");
/* Socket to SSH peer. */
build_addr(&hostAddr, host, port); build_addr(&hostAddr, host, port);
build_addr(&fwdFromHostAddr, fwdFromHost, fwdFromPort); tcp_socket(&sshFd, ((struct sockaddr_in *)&hostAddr)->sin_family);
/* Receive from client application or connect to server application. */
build_addr(&fwdFromHostAddr, fwdFromHost, fwdFromPort);
tcp_socket(&listenFd, ((struct sockaddr_in *)&fwdFromHostAddr)->sin_family);
tcp_socket(&sshFd); /* Socket to SSH peer. */
tcp_socket(&listenFd); /* Either receive from client application or connect
to server application. */
tcp_listen(&listenFd, &fwdFromPort, 1); tcp_listen(&listenFd, &fwdFromPort, 1);
printf("Connecting to the SSH server...\n"); printf("Connecting to the SSH server...\n");

View File

@ -280,8 +280,9 @@ THREAD_RETURN WOLFSSH_THREAD scp_client(void* args)
{ {
printf("IPV4 address\n"); printf("IPV4 address\n");
build_addr(&clientAddr, host, port); build_addr(&clientAddr, host, port);
tcp_socket(&sockFd); tcp_socket(&sockFd, ((struct sockaddr_in *)&clientAddr)->sin_family);
ret = connect(sockFd, (const struct sockaddr *)&clientAddr, clientAddrSz); ret = connect(sockFd, (const struct sockaddr *)&clientAddr,
clientAddrSz);
} }
if (ret != 0) if (ret != 0)

View File

@ -1366,7 +1366,8 @@ THREAD_RETURN WOLFSSH_THREAD sftpclient_test(void* args)
err_sys("Couldn't set the username."); err_sys("Couldn't set the username.");
build_addr(&clientAddr, host, port); build_addr(&clientAddr, host, port);
tcp_socket(&sockFd); tcp_socket(&sockFd, ((struct sockaddr_in *)&clientAddr)->sin_family);
ret = connect(sockFd, (const struct sockaddr *)&clientAddr, clientAddrSz); ret = connect(sockFd, (const struct sockaddr *)&clientAddr, clientAddrSz);
if (ret != 0) if (ret != 0)
err_sys("Couldn't connect to server."); err_sys("Couldn't connect to server.");

View File

@ -921,7 +921,7 @@ static void sftp_client_connect(WOLFSSH_CTX** ctx, WOLFSSH** ssh, int port)
} }
build_addr(&clientAddr, host, port); build_addr(&clientAddr, host, port);
tcp_socket(&sockFd); tcp_socket(&sockFd, ((struct sockaddr_in *)&clientAddr)->sin_family);
ret = connect(sockFd, (const struct sockaddr *)&clientAddr, clientAddrSz); ret = connect(sockFd, (const struct sockaddr *)&clientAddr, clientAddrSz);
if (ret != 0){ if (ret != 0){
wolfSSH_free(*ssh); wolfSSH_free(*ssh);

View File

@ -519,7 +519,7 @@ static INLINE void build_addr(SOCKADDR_IN_T* addr, const char* peer,
memset(&hints, 0, sizeof(hints)); memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_INET_V; hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM; hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP; hints.ai_protocol = IPPROTO_TCP;
@ -546,8 +546,10 @@ static INLINE void build_addr(SOCKADDR_IN_T* addr, const char* peer,
#endif #endif
static INLINE void tcp_socket(WS_SOCKET_T* sockFd) static INLINE void tcp_socket(WS_SOCKET_T* sockFd, int targetProtocol)
{ {
/* targetProtocol is only used if none of these platforms are defined. */
WOLFSSH_UNUSED(targetProtocol);
#ifdef MICROCHIP_MPLAB_HARMONY #ifdef MICROCHIP_MPLAB_HARMONY
/* creates socket in listen or connect */ /* creates socket in listen or connect */
*sockFd = 0; *sockFd = 0;
@ -558,7 +560,7 @@ static INLINE void tcp_socket(WS_SOCKET_T* sockFd)
#elif defined(WOLFSSL_NUCLEUS) #elif defined(WOLFSSL_NUCLEUS)
*sockFd = NU_Socket(NU_FAMILY_IP, NU_TYPE_STREAM, 0); *sockFd = NU_Socket(NU_FAMILY_IP, NU_TYPE_STREAM, 0);
#else #else
*sockFd = socket(AF_INET_V, SOCK_STREAM, 0); *sockFd = socket(targetProtocol, SOCK_STREAM, 0);
#endif #endif
#ifdef USE_WINDOWS_API #ifdef USE_WINDOWS_API
@ -637,8 +639,7 @@ static INLINE void tcp_listen(WS_SOCKET_T* sockfd, word16* port, int useAnyAddr)
/* don't use INADDR_ANY by default, firewall may block, make user switch /* don't use INADDR_ANY by default, firewall may block, make user switch
on */ on */
build_addr(&addr, (useAnyAddr ? INADDR_ANY : wolfSshIp), *port); build_addr(&addr, (useAnyAddr ? INADDR_ANY : wolfSshIp), *port);
tcp_socket(sockfd); tcp_socket(sockfd, ((struct sockaddr_in *)&addr)->sin_family);
#if !defined(USE_WINDOWS_API) && !defined(WOLFSSL_MDK_ARM) \ #if !defined(USE_WINDOWS_API) && !defined(WOLFSSL_MDK_ARM) \
&& !defined(WOLFSSL_KEIL_TCP_NET) \ && !defined(WOLFSSL_KEIL_TCP_NET) \
&& !defined(WOLFSSL_NUCLEUS) \ && !defined(WOLFSSL_NUCLEUS) \