first submission

This commit is contained in:
qiyongshuang
2023-02-01 14:19:13 +08:00
parent d534aad004
commit b79c6ac80d
3711 changed files with 745432 additions and 2 deletions
@@ -0,0 +1,80 @@
/*
* Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
* Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors may be used
* to endorse or promote products derived from this software without specific prior written
* permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef LWIP_TEST_H
#define LWIP_TEST_H
#include "lwip/arch.h"
#include "lwip/sockets.h"
#include <sys/socket.h>
#include <arpa/inet.h>
#include "securec.h"
#ifdef __cplusplus
extern "C" {
#endif
extern int g_testCase;
extern int g_testError;
extern int g_testTemp;
#define LWIP_TEST_RET_OK 0
#define LWIP_TEST_RET_ERR 1
#define LOCALHOST "127.0.0.1"
#define STACK_IP LOCALHOST
#define STACK_PORT 2277
#define PEER_PORT STACK_PORT
#define SERVER_PORT STACK_PORT
#define CLIENT_PORT 2288
#define PEER_IP LOCALHOST
#define BUF_SIZE (128 * 1)
#define IOV_LENGTH 2
#define STACK_TEST_SIZE (0x800UL)
#define ICUNIT_ASSERT_NOT_EQUAL(a, b, c) if ((a) == (b)) { \
g_testError = (c); \
LWIP_ASSERT("lwip test", 0); \
}
#define ICUNIT_ASSERT_EQUAL(a, b, c) if ((a) != (b)) { \
g_testError = (c); \
LWIP_ASSERT("lwip test", 0); \
}
#define LogPrintln(fmt, ...) \
HILOG_INFO(HILOG_MODULE_APP, fmt "%c", \
##__VA_ARGS__, \
('\n' == " "fmt[sizeof(" "fmt)-2]) ? '\0' : '\n') // trailing newline is auto appended
#ifdef __cplusplus
}
#endif
#endif /* LWIP_TEST_H */
@@ -0,0 +1,43 @@
/*
* Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
* Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors may be used
* to endorse or promote products derived from this software without specific prior written
* permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "lwip_test.h"
#define TEST_CASE 110
int SocketTest(void)
{
LogPrintln("net_socket_test_001.c enter");
g_testCase = TEST_CASE;
int fd = socket(0, 0, 0);
LWIP_ASSERT("socket invalid param.", fd == -1);
return LWIP_TEST_RET_OK;
}
@@ -0,0 +1,127 @@
/*
* Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
* Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors may be used
* to endorse or promote products derived from this software without specific prior written
* permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "lwip_test.h"
#include "lwipopts.h"
#include <arch/sys_arch.h>
#include <lwip/sys.h>
#define MSG "Hi, I am UDP"
#define TEST_CASE 120
static char g_buf[BUF_SIZE + 1] = { 0 };
void UdpTestTask(void *p)
{
(void)p;
LogPrintln("net_socket_test_002.c enter");
g_testCase = TEST_CASE;
int sfd;
struct sockaddr_in srvAddr = { 0 };
struct sockaddr_in clnAddr = { 0 };
socklen_t clnAddrLen = sizeof(clnAddr);
int ret;
struct msghdr msg = { 0 };
struct iovec iov[IOV_LENGTH] = { 0 };
int recvCount = 0;
/* socket creation */
sfd = socket(AF_INET, SOCK_DGRAM, 0);
LWIP_ASSERT("socket invalid param.", sfd != -1);
srvAddr.sin_family = AF_INET;
srvAddr.sin_addr.s_addr = inet_addr(STACK_IP);
srvAddr.sin_port = htons(STACK_PORT);
ret = bind(sfd, (struct sockaddr*)&srvAddr, sizeof(srvAddr));
LWIP_ASSERT("socket invalid param.", ret == 0);
/* send */
clnAddr.sin_family = AF_INET;
clnAddr.sin_addr.s_addr = inet_addr(PEER_IP);
clnAddr.sin_port = htons(PEER_PORT);
(void)memset_s(g_buf, sizeof(g_buf), 0, sizeof(g_buf));
(void)strcpy_s(g_buf, sizeof(g_buf), MSG);
ret = sendto(sfd, g_buf, strlen(MSG), 0, (struct sockaddr*)&clnAddr,
(socklen_t)sizeof(clnAddr));
LWIP_ASSERT("socket invalid param.", ret != -1);
ret = ioctlsocket(sfd, FIONREAD, &recvCount);
ICUNIT_ASSERT_EQUAL(ret, 0, 1);
LogPrintln("udp recv count %d", recvCount);
/* recv */
(void)memset_s(g_buf, sizeof(g_buf), 0, sizeof(g_buf));
ret = recvfrom(sfd, g_buf, sizeof(g_buf), 0, (struct sockaddr*)&clnAddr,
&clnAddrLen);
LWIP_ASSERT("socket invalid param.", ret == strlen(MSG));
/* sendmsg */
clnAddr.sin_family = AF_INET;
clnAddr.sin_addr.s_addr = inet_addr(PEER_IP);
clnAddr.sin_port = htons(PEER_PORT);
(void)memset_s(g_buf, sizeof(g_buf), 0, sizeof(g_buf));
(void)strcpy_s(g_buf, sizeof(g_buf), MSG);
msg.msg_name = &clnAddr;
msg.msg_namelen = sizeof(clnAddr);
msg.msg_iov = iov;
msg.msg_iovlen = IOV_LENGTH;
iov[0].iov_base = g_buf;
iov[0].iov_len = strlen(MSG);
iov[1].iov_base = g_buf;
iov[1].iov_len = strlen(MSG);
ret = sendmsg(sfd, &msg, 0);
LWIP_ASSERT("socket invalid param.", ret == IOV_LENGTH * strlen(MSG));
/* recvmsg */
(void)memset_s(g_buf, sizeof(g_buf), 0, sizeof(g_buf));
(void)memset_s(&msg, sizeof(msg), 0, sizeof(msg));
msg.msg_name = &clnAddr;
msg.msg_namelen = sizeof(clnAddr);
msg.msg_iov = iov;
msg.msg_iovlen = 1;
iov[0].iov_base = g_buf;
iov[0].iov_len = sizeof(g_buf);
ret = recvmsg(sfd, &msg, 0);
LWIP_ASSERT("socket invalid param.", ret == IOV_LENGTH * strlen(MSG));
/* close socket */
ret = closesocket(sfd);
LWIP_ASSERT("socket invalid param.", ret != -1);
return;
}
int UdpTest()
{
int ret = sys_thread_new("udp_test", UdpTestTask, NULL,
STACK_TEST_SIZE, TCPIP_THREAD_PRIO);
ICUNIT_ASSERT_NOT_EQUAL(ret, -1, 23);
return ret;
}
@@ -0,0 +1,251 @@
/*
* Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
* Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors may be used
* to endorse or promote products derived from this software without specific prior written
* permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "lwip_test.h"
#include "lwipopts.h"
#include <arch/sys_arch.h>
#include <lwip/sys.h>
#define SRV_MSG "Hi, I am TCP server"
#define CLI_MSG "Hi, I am TCP client"
#define TEST_CASE 130
static char g_buf[BUF_SIZE + 1] = { 0 };
static int SampleTcpServer()
{
g_testCase++;
int sfd, lsfd;
struct sockaddr_in srvAddr = { 0 };
struct sockaddr_in clnAddr = { 0 };
socklen_t clnAddrLen = sizeof(clnAddr);
struct msghdr msg = { 0 };
struct iovec iov[IOV_LENGTH] = { 0 };
int ret;
/* tcp server */
lsfd = socket(AF_INET, SOCK_STREAM, 0);
LogPrintln("create server socket inet stream: %d", lsfd);
ICUNIT_ASSERT_NOT_EQUAL(lsfd, -1, 1);
srvAddr.sin_family = AF_INET;
srvAddr.sin_addr.s_addr = inet_addr(STACK_IP);
srvAddr.sin_port = htons(STACK_PORT);
ret = bind(lsfd, (struct sockaddr*)&srvAddr, sizeof(srvAddr));
LogPrintln("bind socket %d to %s:%d: %d", lsfd, inet_ntoa(srvAddr.sin_addr), ntohs(srvAddr.sin_port), ret);
ICUNIT_ASSERT_EQUAL(ret, 0, 2);
ret = listen(lsfd, 0);
LogPrintln("listen socket %d: %d", lsfd, ret);
ICUNIT_ASSERT_EQUAL(ret, 0, 3);
sfd = accept(lsfd, (struct sockaddr*)&clnAddr, &clnAddrLen);
LogPrintln("accept socket %d: %d <%s:%d>", lsfd, sfd, inet_ntoa(clnAddr.sin_addr), ntohs(clnAddr.sin_port));
ICUNIT_ASSERT_NOT_EQUAL(sfd, -1, 4);
/* send */
(void)memset_s(g_buf, sizeof(g_buf), 0, sizeof(g_buf));
(void)strcpy_s(g_buf, sizeof(g_buf), SRV_MSG);
ret = send(sfd, g_buf, strlen(SRV_MSG), 0);
LogPrintln("server send on socket %d: %d", sfd, ret);
ICUNIT_ASSERT_EQUAL(ret, strlen(SRV_MSG), 5);
/* recv */
(void)memset_s(g_buf, sizeof(g_buf), 0, sizeof(g_buf));
ret = recv(sfd, g_buf, sizeof(g_buf), 0);
LogPrintln("server recv on socket %d: %d", sfd, ret);
LogPrintln("ser:%s", g_buf);
ICUNIT_ASSERT_EQUAL(ret, strlen(CLI_MSG), 6);
/* sendmsg */
clnAddr.sin_family = AF_INET;
clnAddr.sin_addr.s_addr = inet_addr(PEER_IP);
clnAddr.sin_port = htons(PEER_PORT);
(void)memset_s(g_buf, sizeof(g_buf), 0, sizeof(g_buf));
(void)strcpy_s(g_buf, sizeof(g_buf), SRV_MSG);
msg.msg_name = &clnAddr;
msg.msg_namelen = sizeof(clnAddr);
msg.msg_iov = iov;
msg.msg_iovlen = IOV_LENGTH;
iov[0].iov_base = g_buf;
iov[0].iov_len = strlen(SRV_MSG);
iov[1].iov_base = g_buf;
iov[1].iov_len = strlen(SRV_MSG);
ret = sendmsg(sfd, &msg, 0);
LogPrintln("sendmsg on socket %d: %d", sfd, ret);
ICUNIT_ASSERT_EQUAL(ret, IOV_LENGTH * strlen(SRV_MSG), 7);
/* recvmsg */
(void)memset_s(g_buf, sizeof(g_buf), 0, sizeof(g_buf));
(void)memset_s(&msg, sizeof(msg), 0, sizeof(msg));
msg.msg_name = &clnAddr;
msg.msg_namelen = sizeof(clnAddr);
msg.msg_iov = iov;
msg.msg_iovlen = 1;
iov[0].iov_base = g_buf;
iov[0].iov_len = sizeof(g_buf);
ret = recvmsg(sfd, &msg, 0);
LogPrintln("recvmsg on socket %d: %d", sfd, ret);
ICUNIT_ASSERT_EQUAL(ret, IOV_LENGTH * strlen(CLI_MSG), 8);
ret = shutdown(sfd, SHUT_RDWR);
LogPrintln("shutdown socket %d: %d", sfd, ret);
ICUNIT_ASSERT_EQUAL(ret, 0, 9);
ret = closesocket(sfd);
ICUNIT_ASSERT_NOT_EQUAL(ret, -1, 10);
ret = closesocket(lsfd);
ICUNIT_ASSERT_NOT_EQUAL(ret, -1, 11);
return 0;
}
static int SampleTcpClient()
{
g_testCase++;
int sfd;
struct sockaddr_in srvAddr = { 0 };
struct sockaddr_in clnAddr = { 0 };
int ret;
struct msghdr msg = { 0 };
struct iovec iov[IOV_LENGTH] = { 0 };
struct sockaddr addr;
socklen_t addrLen = sizeof(addr);
/* tcp client connection */
sfd = socket(AF_INET, SOCK_STREAM, 0);
LogPrintln("create client socket inet stream: %d", sfd);
ICUNIT_ASSERT_NOT_EQUAL(sfd, -1, 10);
srvAddr.sin_family = AF_INET;
srvAddr.sin_addr.s_addr = inet_addr(PEER_IP);
srvAddr.sin_port = htons(PEER_PORT);
ret = connect(sfd, (struct sockaddr*)&srvAddr, sizeof(srvAddr));
LogPrintln("connect socket %d to %s:%d: %d", sfd, inet_ntoa(srvAddr.sin_addr), ntohs(srvAddr.sin_port), ret);
ICUNIT_ASSERT_EQUAL(ret, 0, 11);
/* test getpeername */
ret = getpeername(sfd, &addr, &addrLen);
LogPrintln("getpeername %d %s:%d: %d", \
sfd, inet_ntoa(((struct sockaddr_in*)&addr)->sin_addr), ntohs(((struct sockaddr_in*)&addr)->sin_port), ret);
ICUNIT_ASSERT_EQUAL(ret, 0, 12);
ICUNIT_ASSERT_EQUAL(addrLen, sizeof(struct sockaddr_in), 13);
ICUNIT_ASSERT_EQUAL(((struct sockaddr_in*)&addr)->sin_addr.s_addr, \
inet_addr(PEER_IP), 14);
/* test getsockname */
ret = getsockname(sfd, &addr, &addrLen);
LogPrintln("getsockname %d %s:%d: %d", \
sfd, inet_ntoa(((struct sockaddr_in*)&addr)->sin_addr), ntohs(((struct sockaddr_in*)&addr)->sin_port), ret);
ICUNIT_ASSERT_EQUAL(ret, 0, 15);
ICUNIT_ASSERT_EQUAL(addrLen, sizeof(struct sockaddr_in), 16);
ICUNIT_ASSERT_EQUAL(((struct sockaddr_in*)&addr)->sin_addr.s_addr, \
inet_addr(STACK_IP), 17);
/* send */
(void)memset_s(g_buf, sizeof(g_buf), 0, sizeof(g_buf));
(void)strcpy_s(g_buf, sizeof(g_buf), CLI_MSG);
ret = send(sfd, g_buf, strlen(CLI_MSG), 0);
LogPrintln("client send on socket %d: %d", sfd, ret);
ICUNIT_ASSERT_EQUAL(ret, strlen(CLI_MSG), 18);
/* recv */
(void)memset_s(g_buf, sizeof(g_buf), 0, sizeof(g_buf));
ret = recv(sfd, g_buf, sizeof(g_buf), 0);
LogPrintln("client recv on socket %d: %d", sfd, ret);
LogPrintln("cli:%s", g_buf);
ICUNIT_ASSERT_EQUAL(ret, strlen(SRV_MSG), 19);
/* sendmsg */
clnAddr.sin_family = AF_INET;
clnAddr.sin_addr.s_addr = inet_addr(PEER_IP);
clnAddr.sin_port = htons(PEER_PORT);
(void)memset_s(g_buf, sizeof(g_buf), 0, sizeof(g_buf));
(void)strcpy_s(g_buf, sizeof(g_buf), CLI_MSG);
msg.msg_name = &clnAddr;
msg.msg_namelen = sizeof(clnAddr);
msg.msg_iov = iov;
msg.msg_iovlen = IOV_LENGTH;
iov[0].iov_base = g_buf;
iov[0].iov_len = strlen(CLI_MSG);
iov[1].iov_base = g_buf;
iov[1].iov_len = strlen(CLI_MSG);
ret = sendmsg(sfd, &msg, 0);
LogPrintln("sendmsg on socket %d: %d", sfd, ret);
ICUNIT_ASSERT_EQUAL(ret, 2 * strlen(CLI_MSG), 20);
/* recvmsg */
(void)memset_s(g_buf, sizeof(g_buf), 0, sizeof(g_buf));
(void)memset_s(&msg, sizeof(msg), 0, sizeof(msg));
msg.msg_name = &clnAddr;
msg.msg_namelen = sizeof(clnAddr);
msg.msg_iov = iov;
msg.msg_iovlen = 1;
iov[0].iov_base = g_buf;
iov[0].iov_len = sizeof(g_buf);
ret = recvmsg(sfd, &msg, 0);
LogPrintln("recvmsg on socket %d: %d", sfd, ret);
ICUNIT_ASSERT_EQUAL(ret, IOV_LENGTH * strlen(SRV_MSG), 21);
ret = shutdown(sfd, SHUT_RDWR);
LogPrintln("shutdown socket %d: %d", sfd, ret);
ICUNIT_ASSERT_EQUAL(ret, 0, 22);
ret = closesocket(sfd);
ICUNIT_ASSERT_NOT_EQUAL(ret, -1, 23);
return 0;
}
static void TcpServerRoutine(void *p)
{
(void)p;
(void)SampleTcpServer();
}
static void TcpClientRoutine(void *p)
{
(void)p;
(void)SampleTcpClient();
}
void TcpTest()
{
LogPrintln("net_socket_test_003.c enter");
g_testCase = TEST_CASE;
int ret;
ret = sys_thread_new("tcp_server", TcpServerRoutine, NULL,
STACK_TEST_SIZE, TCPIP_THREAD_PRIO);
ICUNIT_ASSERT_NOT_EQUAL(ret, -1, 23);
ret = sys_thread_new("tcp_client", TcpClientRoutine, NULL,
STACK_TEST_SIZE, TCPIP_THREAD_PRIO);
ICUNIT_ASSERT_NOT_EQUAL(ret, -1, 24);
}
@@ -0,0 +1,87 @@
/*
* Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
* Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors may be used
* to endorse or promote products derived from this software without specific prior written
* permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "lwip_test.h"
#define TEST_CASE 140
#define OPT_TIMEOUT 1000
int SockOptTest()
{
LogPrintln("net_socket_test_004.c enter");
g_testCase = TEST_CASE;
int ret, error, flag;
struct timeval timeout;
socklen_t len;
int fd = socket(AF_INET, SOCK_STREAM, 0);
ICUNIT_ASSERT_NOT_EQUAL(fd, -1, 1);
error = -1;
len = sizeof(error);
ret = getsockopt(fd, SOL_SOCKET, SO_ERROR, &error, &len);
LogPrintln("getsockopt(%d, SOL_SOCKET, SO_ERROR, &error, &len)=%d, error=%d, len=%d, errno=%d", \
fd, ret, error, len, errno);
ICUNIT_ASSERT_EQUAL(ret, 0, 2);
ICUNIT_ASSERT_EQUAL(error, 0, 3);
len = sizeof(timeout);
ret = getsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &timeout, &len);
ICUNIT_ASSERT_EQUAL(ret, 0, 4);
timeout.tv_sec = OPT_TIMEOUT;
len = sizeof(timeout);
ret = setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &timeout, len);
ICUNIT_ASSERT_EQUAL(ret, 0, 5);
(void)memset_s(&timeout, len, 0, len);
ret = getsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &timeout, &len);
ICUNIT_ASSERT_EQUAL(ret, 0, 6);
ICUNIT_ASSERT_EQUAL(timeout.tv_sec, OPT_TIMEOUT, 7);
error = -1;
len = sizeof(error);
ret = getsockopt(fd, SOL_SOCKET, SO_ERROR, &error, &len);
LogPrintln("getsockopt(%d, SOL_SOCKET, SO_ERROR, &error, &len)=%d, error=%d, len=%d, errno=%d", \
fd, ret, error, len, errno);
ICUNIT_ASSERT_EQUAL(ret, 0, 8);
ICUNIT_ASSERT_EQUAL(error, 0, 9);
flag = 1;
ret = setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &flag, sizeof(flag));
LogPrintln("setsockopt(TCP_NODELAY) ret=%d", ret);
ICUNIT_ASSERT_EQUAL(ret, 0, 10);
ret = closesocket(fd);
ICUNIT_ASSERT_EQUAL(ret, 0, 11);
return LWIP_TEST_RET_OK;
}
@@ -0,0 +1,67 @@
/*
* Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
* Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors may be used
* to endorse or promote products derived from this software without specific prior written
* permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "lwip_test.h"
#define TEST_CASE 150
int ByteOrderTest(void)
{
LogPrintln("net_socket_test_005.c enter");
#if BYTE_ORDER == LITTLE_ENDIAN
g_testCase = TEST_CASE + 1;
uint32_t hl = ntohl(0x12345678);
ICUNIT_ASSERT_EQUAL(hl, 0x78563412, 1);
uint32_t nl = htonl(0x12345678);
ICUNIT_ASSERT_EQUAL(nl, 0x78563412, 2);
uint16_t hs = ntohs(0x1234);
ICUNIT_ASSERT_EQUAL(hs, 0x3412, 3);
uint16_t ns = htons(0x1234);
ICUNIT_ASSERT_EQUAL(ns, 0x3412, 4);
#else
g_testCase = TEST_CASE;
uint32_t hl = ntohl(0x12345678);
ICUNIT_ASSERT_EQUAL(hl, 0x12345678, 5);
uint32_t nl = htonl(0x12345678);
ICUNIT_ASSERT_EQUAL(nl, 0x12345678, 6);
uint16_t hs = ntohs(0x1234);
ICUNIT_ASSERT_EQUAL(hs, 0x1234, 7);
uint16_t ns = htons(0x1234);
ICUNIT_ASSERT_EQUAL(ns, 0x1234, 8);
#endif
return LWIP_TEST_RET_OK;
}
@@ -0,0 +1,62 @@
/*
* Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
* Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors may be used
* to endorse or promote products derived from this software without specific prior written
* permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "lwip_test.h"
#define TEST_CASE 160
#define TEMP_BUF_SIZE 32
int InetTest()
{
LogPrintln("net_socket_test_006.c enter");
g_testCase = TEST_CASE;
struct in_addr in;
int ret = inet_pton(AF_INET, "300.10.10.10", &in);
ICUNIT_ASSERT_EQUAL(ret, 0, 1);
ret = inet_pton(AF_INET, "10.11.12.13", &in);
ICUNIT_ASSERT_EQUAL(ret, 1, 2);
#if BYTE_ORDER == LITTLE_ENDIAN
g_testCase++;
ICUNIT_ASSERT_EQUAL(in.s_addr, 0x0d0c0b0a, 3);
#else
ICUNIT_ASSERT_EQUAL(in.s_addr, 0x0a0b0c0d, 4);
#endif
const char *p = inet_ntoa(in);
ICUNIT_ASSERT_EQUAL(strcmp(p, "10.11.12.13"), 0, 5);
char buf[TEMP_BUF_SIZE];
p = inet_ntop(AF_INET, &in, buf, sizeof(buf));
ICUNIT_ASSERT_EQUAL(p, buf, 6);
ICUNIT_ASSERT_EQUAL(strcmp(p, "10.11.12.13"), 0, 7);
return LWIP_TEST_RET_OK;
}
@@ -0,0 +1,108 @@
/*
* Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
* Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors may be used
* to endorse or promote products derived from this software without specific prior written
* permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "lwip_test.h"
#include "lwipopts.h"
#include <arch/sys_arch.h>
#include <lwip/sys.h>
static char g_buf[BUF_SIZE + 1] = { 0 };
static char g_buf_temp[BUF_SIZE + 1] = { 0 };
#define SEND_UDP_COUNT 10000 // send count
#define TEST_CASE 170
static void UdpTestMoreTask(void *p)
{
(void)p;
LogPrintln("net_socket_test_007.c enter");
if (g_testCase < TEST_CASE) {
g_testCase = TEST_CASE;
} else {
g_testCase++;
}
int sfd;
struct sockaddr_in srvAddr = { 0 };
struct sockaddr_in clnAddr = { 0 };
socklen_t clnAddrLen = sizeof(clnAddr);
int ret;
int i;
/* socket creation */
sfd = socket(AF_INET, SOCK_DGRAM, 0);
LWIP_ASSERT("socket invalid param.", sfd != -1);
srvAddr.sin_family = AF_INET;
srvAddr.sin_addr.s_addr = inet_addr(STACK_IP);
srvAddr.sin_port = htons(STACK_PORT);
ret = bind(sfd, (struct sockaddr*)&srvAddr, sizeof(srvAddr));
LWIP_ASSERT("socket invalid param.", ret == 0);
/* send */
clnAddr.sin_family = AF_INET;
clnAddr.sin_addr.s_addr = inet_addr(PEER_IP);
clnAddr.sin_port = htons(PEER_PORT);
if (g_buf_temp[0] == '\0') {
for (i = 0; i < BUF_SIZE; i++) {
g_buf_temp[i] = 'U';
}
g_buf_temp[BUF_SIZE] = '\0';
}
LogPrintln("udp begin send");
for (i = 0; i < SEND_UDP_COUNT; i++) {
ret = memcpy_s(g_buf, sizeof(g_buf), g_buf_temp, sizeof(g_buf_temp));
ICUNIT_ASSERT_EQUAL(ret, EOK, 1);
ret = sendto(sfd, g_buf, BUF_SIZE, 0, (struct sockaddr*)&clnAddr, (socklen_t)sizeof(clnAddr));
LWIP_ASSERT("socket invalid param.", ret != -1);
/* recv */
(void)memset_s(g_buf, sizeof(g_buf), 0, sizeof(g_buf));
ret = recvfrom(sfd, g_buf, sizeof(g_buf), 0, (struct sockaddr*)&clnAddr,
&clnAddrLen);
LWIP_ASSERT("socket invalid param.", ret == BUF_SIZE);
}
LogPrintln("udp end send");
/* close socket */
ret = closesocket(sfd);
LWIP_ASSERT("socket invalid param.", ret != -1);
}
void UdpTestMore()
{
int ret;
ret = sys_thread_new("udp_more", UdpTestMoreTask, NULL,
STACK_TEST_SIZE * 2, TCPIP_THREAD_PRIO);
ICUNIT_ASSERT_NOT_EQUAL(ret, -1, 10);
}
@@ -0,0 +1,185 @@
/*
* Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
* Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors may be used
* to endorse or promote products derived from this software without specific prior written
* permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "lwip_test.h"
#include "lwipopts.h"
#include <arch/sys_arch.h>
#include <lwip/sys.h>
#define SEND_TCP_COUNT 1000 // send count
#define STACK_PORT_8 2288
#define TEST_CASE 180
static char g_serverSendBuf[BUF_SIZE + 1] = { 0 };
static char g_clientRecvBuf[BUF_SIZE + 1] = { 0 };
static void InitMsgBuf()
{
int i;
if (g_serverSendBuf[0] != '\0') {
return;
}
for (i = 0; i < BUF_SIZE; i++) {
g_serverSendBuf[i] = 'S';
}
g_serverSendBuf[BUF_SIZE] = '\0';
}
static int SampleTcpServer()
{
g_testCase++;
int sfd, lsfd;
struct sockaddr_in srvAddr = { 0 };
struct sockaddr_in clnAddr = { 0 };
socklen_t clnAddrLen = sizeof(clnAddr);
int ret;
int i;
/* tcp server */
lsfd = socket(AF_INET, SOCK_STREAM, 0);
LogPrintln("create server socket inet stream: %d", lsfd);
ICUNIT_ASSERT_NOT_EQUAL(lsfd, -1, 1);
srvAddr.sin_family = AF_INET;
srvAddr.sin_addr.s_addr = inet_addr(STACK_IP);
srvAddr.sin_port = htons(STACK_PORT_8);
ret = bind(lsfd, (struct sockaddr*)&srvAddr, sizeof(srvAddr));
LogPrintln("bind socket %d to %s:%d: %d", lsfd, inet_ntoa(srvAddr.sin_addr), ntohs(srvAddr.sin_port), ret);
ICUNIT_ASSERT_EQUAL(ret, 0, 2);
ret = listen(lsfd, 0);
LogPrintln("listen socket %d: %d", lsfd, ret);
ICUNIT_ASSERT_EQUAL(ret, 0, 3);
sfd = accept(lsfd, (struct sockaddr*)&clnAddr, &clnAddrLen);
LogPrintln("accept socket %d: %d <%s:%d>", lsfd, sfd, inet_ntoa(clnAddr.sin_addr), ntohs(clnAddr.sin_port));
ICUNIT_ASSERT_NOT_EQUAL(sfd, -1, 4);
for (i = 0; i < SEND_TCP_COUNT; i++) {
/* send */
ret = send(sfd, g_serverSendBuf, BUF_SIZE, 0);
ICUNIT_ASSERT_EQUAL(ret, BUF_SIZE, 5);
}
ret = closesocket(sfd);
ICUNIT_ASSERT_NOT_EQUAL(ret, -1, 7);
ret = closesocket(lsfd);
ICUNIT_ASSERT_NOT_EQUAL(ret, -1, 8);
return 0;
}
static int SampleTcpClient()
{
g_testCase++;
int sfd;
struct sockaddr_in srvAddr = { 0 };
int ret;
int i;
struct sockaddr addr;
socklen_t addrLen = sizeof(addr);
int recvCount = 0;
/* tcp client connection */
sfd = socket(AF_INET, SOCK_STREAM, 0);
LogPrintln("create client socket inet stream: %d", sfd);
ICUNIT_ASSERT_NOT_EQUAL(sfd, -1, 7);
srvAddr.sin_family = AF_INET;
srvAddr.sin_addr.s_addr = inet_addr(PEER_IP);
srvAddr.sin_port = htons(STACK_PORT_8);
ret = connect(sfd, (struct sockaddr*)&srvAddr, sizeof(srvAddr));
LogPrintln("connect socket %d to %s:%d: %d", sfd, inet_ntoa(srvAddr.sin_addr), ntohs(srvAddr.sin_port), ret);
ICUNIT_ASSERT_EQUAL(ret, 0, 8);
/* test getpeername */
ret = getpeername(sfd, &addr, &addrLen);
LogPrintln("getpeername %d %s:%d: %d",
sfd, inet_ntoa(((struct sockaddr_in*)&addr)->sin_addr), ntohs(((struct sockaddr_in*)&addr)->sin_port), ret);
ICUNIT_ASSERT_EQUAL(ret, 0, 9);
ICUNIT_ASSERT_EQUAL(addrLen, sizeof(struct sockaddr_in), 10);
ICUNIT_ASSERT_EQUAL(((struct sockaddr_in*)&addr)->sin_addr.s_addr, \
inet_addr(PEER_IP), 11);
/* test getsockname */
ret = getsockname(sfd, &addr, &addrLen);
LogPrintln("getsockname %d %s:%d: %d",
sfd, inet_ntoa(((struct sockaddr_in*)&addr)->sin_addr), ntohs(((struct sockaddr_in*)&addr)->sin_port), ret);
ICUNIT_ASSERT_EQUAL(ret, 0, 12);
ICUNIT_ASSERT_EQUAL(addrLen, sizeof(struct sockaddr_in), 13);
ICUNIT_ASSERT_EQUAL(((struct sockaddr_in*)&addr)->sin_addr.s_addr, \
inet_addr(STACK_IP), 14);
LogPrintln("tcp begin recv");
for (i = 0; i < 2 * SEND_TCP_COUNT; i++) {
/* recv */
(void)memset_s(g_clientRecvBuf, sizeof(g_clientRecvBuf), 0, sizeof(g_clientRecvBuf));
ret = recv(sfd, g_clientRecvBuf, BUF_SIZE, 0);
recvCount += ret;
if (recvCount >= BUF_SIZE * SEND_TCP_COUNT) {
LogPrintln("client recv on socket %d: %d, i = %d", sfd, recvCount, i);
break;
}
}
ICUNIT_ASSERT_EQUAL(recvCount, BUF_SIZE * SEND_TCP_COUNT, recvCount);
LogPrintln("tcp end recv");
ret = closesocket(sfd);
ICUNIT_ASSERT_NOT_EQUAL(ret, -1, 17);
return 0;
}
static void TcpServerRoutine(void *p)
{
(void)p;
(void)SampleTcpServer();
}
static void TcpClientRoutine(void *p)
{
(void)p;
(void)SampleTcpClient();
}
void TcpTestMore()
{
LogPrintln("net_socket_test_008.c enter");
if (g_testCase < TEST_CASE) {
g_testCase = TEST_CASE;
}
int ret;
InitMsgBuf();
ret = sys_thread_new("tcp_server_more", TcpServerRoutine, NULL,
STACK_TEST_SIZE, TCPIP_THREAD_PRIO);
ICUNIT_ASSERT_NOT_EQUAL(ret, -1, 17);
ret = sys_thread_new("tcp_client_more", TcpClientRoutine, NULL,
STACK_TEST_SIZE, TCPIP_THREAD_PRIO);
ICUNIT_ASSERT_NOT_EQUAL(ret, -1, 18);
}
@@ -0,0 +1,165 @@
/*
* Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
* Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors may be used
* to endorse or promote products derived from this software without specific prior written
* permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "lwip_test.h"
#include "lwipopts.h"
#include <arch/sys_arch.h>
#include <lwip/sys.h>
#define SRV_MSG "Hi, I am TCP server"
#define CLI_MSG "Hi, I am TCP client"
#define TEST_CASE 190
#define STACK_PORT_9 2299
#define TIME_OUT 10 // timeout 10s
static char g_buf[BUF_SIZE + 1] = { 0 };
static int SampleTcpServer()
{
#if LWIP_SOCKET_SELECT
g_testCase++;
int sfd, lsfd;
struct sockaddr_in srvAddr = { 0 };
struct sockaddr_in clnAddr = { 0 };
socklen_t clnAddrLen = sizeof(clnAddr);
fd_set fdsr;
struct timeval tv;
int ret;
/* tcp server */
lsfd = socket(AF_INET, SOCK_STREAM, 0);
LogPrintln("create server socket inet stream: %d", lsfd);
ICUNIT_ASSERT_NOT_EQUAL(lsfd, -1, 1);
srvAddr.sin_family = AF_INET;
srvAddr.sin_addr.s_addr = inet_addr(STACK_IP);
srvAddr.sin_port = htons(STACK_PORT_9);
ret = bind(lsfd, (struct sockaddr*)&srvAddr, sizeof(srvAddr));
LogPrintln("bind socket %d to %s:%d: %d", lsfd, inet_ntoa(srvAddr.sin_addr), ntohs(srvAddr.sin_port), ret);
ICUNIT_ASSERT_EQUAL(ret, 0, 2);
ret = listen(lsfd, 0);
LogPrintln("listen socket %d: %d", lsfd, ret);
ICUNIT_ASSERT_EQUAL(ret, 0, 3);
FD_ZERO(&fdsr);
FD_SET(lsfd, &fdsr);
// timeout setting
tv.tv_sec = TIME_OUT;
tv.tv_usec = 0;
ret = select(lsfd + 1, &fdsr, NULL, NULL, &tv);
if (ret < 0) {
LogPrintln("select error");
ICUNIT_ASSERT_EQUAL(-1, 0, 4);
} else if (ret == 0) {
LogPrintln("select timeout");
ICUNIT_ASSERT_EQUAL(-1, 0, 5);
}
sfd = accept(lsfd, (struct sockaddr*)&clnAddr, &clnAddrLen);
LogPrintln("accept socket %d: %d <%s:%d>", lsfd, sfd, inet_ntoa(clnAddr.sin_addr), ntohs(clnAddr.sin_port));
ICUNIT_ASSERT_NOT_EQUAL(sfd, -1, 6);
/* send */
(void)memset_s(g_buf, sizeof(g_buf), 0, sizeof(g_buf));
(void)strcpy_s(g_buf, sizeof(g_buf), SRV_MSG);
ret = send(sfd, g_buf, strlen(SRV_MSG), 0);
LogPrintln("server send on socket %d: %d", sfd, ret);
ICUNIT_ASSERT_EQUAL(ret, strlen(SRV_MSG), 7);
ret = closesocket(sfd);
ICUNIT_ASSERT_NOT_EQUAL(ret, -1, 8);
ret = closesocket(lsfd);
ICUNIT_ASSERT_NOT_EQUAL(ret, -1, 9);
#endif
return 0;
}
static int SampleTcpClient()
{
#if LWIP_SOCKET_SELECT
g_testCase++;
int sfd;
struct sockaddr_in srvAddr = { 0 };
int ret;
/* tcp client connection */
sfd = socket(AF_INET, SOCK_STREAM, 0);
LogPrintln("create client socket inet stream: %d", sfd);
ICUNIT_ASSERT_NOT_EQUAL(sfd, -1, 10);
srvAddr.sin_family = AF_INET;
srvAddr.sin_addr.s_addr = inet_addr(PEER_IP);
srvAddr.sin_port = htons(STACK_PORT_9);
ret = connect(sfd, (struct sockaddr*)&srvAddr, sizeof(srvAddr));
LogPrintln("connect socket %d to %s:%d: %d", sfd, inet_ntoa(srvAddr.sin_addr), ntohs(srvAddr.sin_port), ret);
ICUNIT_ASSERT_EQUAL(ret, 0, 11);
/* recv */
(void)memset_s(g_buf, sizeof(g_buf), 0, sizeof(g_buf));
ret = recv(sfd, g_buf, sizeof(g_buf), 0);
LogPrintln("client recv on socket %d: %d", sfd, ret);
LogPrintln("cli:%s", g_buf);
ICUNIT_ASSERT_EQUAL(ret, strlen(SRV_MSG), 12);
ret = closesocket(sfd);
ICUNIT_ASSERT_NOT_EQUAL(ret, -1, 13);
#endif
return 0;
}
static void TcpServerRoutine(void *p)
{
(void)p;
(void)SampleTcpServer();
}
static void TcpClientRoutine(void *p)
{
(void)p;
(void)SampleTcpClient();
}
void TcpTestSelect()
{
LogPrintln("net_socket_test_009.c enter");
g_testCase = TEST_CASE;
int ret;
ret = sys_thread_new("tcp_server_select", TcpServerRoutine, NULL,
STACK_TEST_SIZE, TCPIP_THREAD_PRIO);
ICUNIT_ASSERT_NOT_EQUAL(ret, -1, 23);
ret = sys_thread_new("tcp_client_select", TcpClientRoutine, NULL,
STACK_TEST_SIZE, TCPIP_THREAD_PRIO);
ICUNIT_ASSERT_NOT_EQUAL(ret, -1, 24);
}
@@ -0,0 +1,160 @@
/*
* Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
* Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors may be used
* to endorse or promote products derived from this software without specific prior written
* permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "lwip_test.h"
#include "lwipopts.h"
#include <arch/sys_arch.h>
#include <lwip/sys.h>
#define SRV_MSG "Hi, I am TCP server"
#define CLI_MSG "Hi, I am TCP client"
#define TEST_CASE 200
#define STACK_PORT_10 2230
#define POLL_OPEN_MAX 10
#define TIME_OUT (1000 * 10) // timeout 10s
static char g_buf[BUF_SIZE + 1] = { 0 };
static int SampleTcpServer()
{
#if LWIP_SOCKET_POLL
g_testCase++;
int sfd, lsfd;
struct sockaddr_in srvAddr = { 0 };
struct sockaddr_in clnAddr = { 0 };
socklen_t clnAddrLen = sizeof(clnAddr);
struct pollfd client[POLL_OPEN_MAX] = {0};
int ret;
/* tcp server */
lsfd = socket(AF_INET, SOCK_STREAM, 0);
LogPrintln("create server socket inet stream: %d", lsfd);
ICUNIT_ASSERT_NOT_EQUAL(lsfd, -1, 1);
srvAddr.sin_family = AF_INET;
srvAddr.sin_addr.s_addr = inet_addr(STACK_IP);
srvAddr.sin_port = htons(STACK_PORT_10);
ret = bind(lsfd, (struct sockaddr*)&srvAddr, sizeof(srvAddr));
LogPrintln("bind socket %d to %s:%d: %d", lsfd, inet_ntoa(srvAddr.sin_addr), ntohs(srvAddr.sin_port), ret);
ICUNIT_ASSERT_EQUAL(ret, 0, 2);
ret = listen(lsfd, 0);
LogPrintln("listen socket %d: %d", lsfd, ret);
ICUNIT_ASSERT_EQUAL(ret, 0, 3);
client[0].fd = lsfd;
client[0].events = POLLIN;
ret = poll(client, 1, TIME_OUT);
if (ret < 0) {
LogPrintln("poll error");
ICUNIT_ASSERT_EQUAL(-1, 0, 4);
} else if (ret == 0) {
LogPrintln("poll timeout");
ICUNIT_ASSERT_EQUAL(-1, 0, 5);
}
sfd = accept(lsfd, (struct sockaddr*)&clnAddr, &clnAddrLen);
LogPrintln("accept socket %d: %d <%s:%d>", lsfd, sfd, inet_ntoa(clnAddr.sin_addr), ntohs(clnAddr.sin_port));
ICUNIT_ASSERT_NOT_EQUAL(sfd, -1, 6);
/* recv */
(void)memset_s(g_buf, sizeof(g_buf), 0, sizeof(g_buf));
ret = recv(sfd, g_buf, sizeof(g_buf), 0);
LogPrintln("server recv on socket %d: %d", sfd, ret);
LogPrintln("ser:%s", g_buf);
ICUNIT_ASSERT_EQUAL(ret, strlen(CLI_MSG), 7);
ret = closesocket(sfd);
ICUNIT_ASSERT_NOT_EQUAL(ret, -1, 8);
ret = closesocket(lsfd);
ICUNIT_ASSERT_NOT_EQUAL(ret, -1, 9);
#endif
return 0;
}
static int SampleTcpClient()
{
#if LWIP_SOCKET_POLL
g_testCase++;
int sfd;
struct sockaddr_in srvAddr = { 0 };
int ret;
/* tcp client connection */
sfd = socket(AF_INET, SOCK_STREAM, 0);
LogPrintln("create client socket inet stream: %d", sfd);
ICUNIT_ASSERT_NOT_EQUAL(sfd, -1, 10);
srvAddr.sin_family = AF_INET;
srvAddr.sin_addr.s_addr = inet_addr(PEER_IP);
srvAddr.sin_port = htons(STACK_PORT_10);
ret = connect(sfd, (struct sockaddr*)&srvAddr, sizeof(srvAddr));
LogPrintln("connect socket %d to %s:%d: %d", sfd, inet_ntoa(srvAddr.sin_addr), ntohs(srvAddr.sin_port), ret);
ICUNIT_ASSERT_EQUAL(ret, 0, 11);
/* send */
(void)memset_s(g_buf, sizeof(g_buf), 0, sizeof(g_buf));
(void)strcpy_s(g_buf, sizeof(g_buf), CLI_MSG);
ret = send(sfd, g_buf, strlen(CLI_MSG), 0);
LogPrintln("client send on socket %d: %d", sfd, ret);
ICUNIT_ASSERT_EQUAL(ret, strlen(CLI_MSG), 12);
ret = closesocket(sfd);
ICUNIT_ASSERT_NOT_EQUAL(ret, -1, 13);
#endif
return 0;
}
static void TcpServerRoutine(void *p)
{
(void)p;
(void)SampleTcpServer();
}
static void TcpClientRoutine(void *p)
{
(void)p;
(void)SampleTcpClient();
}
void TcpTestPoll()
{
LogPrintln("net_socket_test_010.c enter");
g_testCase = TEST_CASE;
int ret;
ret = sys_thread_new("tcp_server_poll", TcpServerRoutine, NULL,
STACK_TEST_SIZE, TCPIP_THREAD_PRIO);
ICUNIT_ASSERT_NOT_EQUAL(ret, -1, 23);
ret = sys_thread_new("tcp_client_poll", TcpClientRoutine, NULL,
STACK_TEST_SIZE, TCPIP_THREAD_PRIO);
ICUNIT_ASSERT_NOT_EQUAL(ret, -1, 24);
}
@@ -0,0 +1,449 @@
/*
* Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
* Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors may be used
* to endorse or promote products derived from this software without specific prior written
* permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "lwip_test.h"
#include <lwip/netif.h>
#include <lwip/netifapi.h>
#include <lwip/pbuf.h>
#include <lwip/ip4_addr.h>
#include <lwip/ip4.h>
#include <lwip/ip.h>
#include <lwip/def.h>
#include <lwip/udp.h>
#include <lwip/inet_chksum.h>
#include "lwip/prot/iana.h"
#define MSG "Hi, I am testing BT netif."
#define STACK_IP_BT "192.168.167.1"
#define PEER_IP_BT "100.100.100.100"
#define GATEWAY_IP_BT "192.168.167.239"
#define NETIF_MAC "121212"
#define PEER_MAC "454545"
#define NETIF_NAME_BT "bt1000"
#define TEST_CASE 210
static char g_buf[BUF_SIZE + 1] = { 0 };
struct netif *btProxyNf = NULL;
static void ReplayArpTask();
static void ArpPackageProc(struct netif *netif, struct pbuf *p);
extern void driverif_input(struct netif *netif, struct pbuf *p);
static void ReplayArpEncodeEthernet(struct netif *netif, struct pbuf *p);
static void ReplayUdpEncodeEthernet(struct netif *netif, struct pbuf *p)
{
int ret;
ret = pbuf_add_header(p, SIZEOF_ETH_HDR);
ICUNIT_ASSERT_EQUAL(ret, 0, 1);
struct eth_hdr *ethhdr;
ethhdr = (struct eth_hdr *)p->payload;
ethhdr->type = lwip_htons(ETHTYPE_IP);
SMEMCPY(&ethhdr->dest, NETIF_MAC, ETH_HWADDR_LEN);
SMEMCPY(&ethhdr->src, PEER_MAC, ETH_HWADDR_LEN);
driverif_input(netif, p);
}
static void ReplayUdpEncodeIp(struct pbuf *p, ip4_addr_t *src, ip4_addr_t *dest)
{
struct ip_hdr *iphdr;
int ret;
#if CHECKSUM_GEN_IP_INLINE
u32_t chk_sum = 0;
#endif /* CHECKSUM_GEN_IP_INLINE */
// ip header
ret = pbuf_add_header(p, IP_HLEN);
ICUNIT_ASSERT_EQUAL(ret, 0, 2);
iphdr = (struct ip_hdr *)p->payload;
IPH_TTL_SET(iphdr, UDP_TTL);
IPH_PROTO_SET(iphdr, IP_PROTO_UDP);
#if CHECKSUM_GEN_IP_INLINE
chk_sum += PP_NTOHS(IP_PROTO_UDP | (ttl << 8));
#endif /* CHECKSUM_GEN_IP_INLINE */
/* dest cannot be NULL here */
ip4_addr_copy(iphdr->dest, *dest);
#if CHECKSUM_GEN_IP_INLINE
chk_sum += ip4_addr_get_u32(&iphdr->dest) & 0xFFFF;
chk_sum += ip4_addr_get_u32(&iphdr->dest) >> 16;
#endif /* CHECKSUM_GEN_IP_INLINE */
u16_t ip_hlen = IP_HLEN;
IPH_VHL_SET(iphdr, 4, ip_hlen / 4);
IPH_TOS_SET(iphdr, 0);
#if CHECKSUM_GEN_IP_INLINE
chk_sum += PP_NTOHS(tos | (iphdr->_v_hl << 8));
#endif /* CHECKSUM_GEN_IP_INLINE */
IPH_LEN_SET(iphdr, lwip_htons(p->tot_len));
#if CHECKSUM_GEN_IP_INLINE
chk_sum += iphdr->_len;
#endif /* CHECKSUM_GEN_IP_INLINE */
IPH_OFFSET_SET(iphdr, 0);
IPH_ID_SET(iphdr, lwip_htons(0));
#if CHECKSUM_GEN_IP_INLINE
chk_sum += iphdr->_id;
#endif /* CHECKSUM_GEN_IP_INLINE */
ip4_addr_copy(iphdr->src, *src);
#if CHECKSUM_GEN_IP_INLINE
chk_sum += ip4_addr_get_u32(&iphdr->src) & 0xFFFF;
chk_sum += ip4_addr_get_u32(&iphdr->src) >> 16;
chk_sum = (chk_sum >> 16) + (chk_sum & 0xFFFF);
chk_sum = (chk_sum >> 16) + chk_sum;
chk_sum = ~chk_sum;
IF__NETIF_CHECKSUM_ENABLED(netif, NETIF_CHECKSUM_GEN_IP) {
iphdr->_chksum = (u16_t)chk_sum; /* network order */
}
#if LWIP_CHECKSUM_CTRL_PER_NETIF
else {
IPH_CHKSUM_SET(iphdr, 0);
}
#endif /* LWIP_CHECKSUM_CTRL_PER_NETIF */
#else /* CHECKSUM_GEN_IP_INLINE */
IPH_CHKSUM_SET(iphdr, 0);
#if CHECKSUM_GEN_IP
IF__NETIF_CHECKSUM_ENABLED(netif, NETIF_CHECKSUM_GEN_IP) {
IPH_CHKSUM_SET(iphdr, inet_chksum(iphdr, ip_hlen));
}
#endif /* CHECKSUM_GEN_IP */
#endif /* CHECKSUM_GEN_IP_INLINE */
ReplayUdpEncodeEthernet(btProxyNf, p);
}
static void ReplayUdp(void *ptemp)
{
struct udp_hdr *udphdr;
ip4_addr_t sipaddr, dipaddr;
int size = strlen(MSG);
int ret;
(void)ptemp;
LogPrintln("encode udp replay packet");
inet_pton(AF_INET, PEER_IP_BT, &sipaddr);
inet_pton(AF_INET, STACK_IP_BT, &dipaddr);
struct pbuf *p = pbuf_alloc(PBUF_TRANSPORT, size, PBUF_RAM);
u16_t chksum = LWIP_CHKSUM_COPY(p->payload, MSG, size);
// udp header
ret = pbuf_add_header(p, UDP_HLEN);
ICUNIT_ASSERT_EQUAL(ret, 0, 1);
udphdr = (struct udp_hdr *)p->payload;
udphdr->src = lwip_htons(STACK_PORT);
udphdr->dest = lwip_htons(STACK_PORT);
udphdr->len = lwip_htons(p->tot_len);
/* in UDP, 0 checksum means 'no checksum' */
u16_t udpchksum = ip_chksum_pseudo_partial(p, IP_PROTO_UDP, p->tot_len, UDP_HLEN, &sipaddr, &dipaddr);
u32_t acc = udpchksum + (u16_t)~(chksum);
udpchksum = FOLD_U32T(acc);
if (udpchksum == 0x0000) {
udpchksum = 0xffff;
}
udphdr->chksum = udpchksum;
udphdr->chksum = 0;
ReplayUdpEncodeIp(p, &sipaddr, &dipaddr);
}
static void ReplayUdpTask()
{
int ret;
ret = sys_thread_new("replay_udp", ReplayUdp, NULL,
STACK_TEST_SIZE, TCPIP_THREAD_PRIO);
ICUNIT_ASSERT_NOT_EQUAL(ret, -1, 3);
}
static void ParsePackageIpUdp(struct netif *netif, struct pbuf *btBuf)
{
// get scr_addr and dest_addr from ip head
const struct ip_hdr *iphdr;
iphdr = (const struct ip_hdr *)btBuf->payload;
ip4_addr_p_t ip4_addr_scr = iphdr->src;
ip4_addr_p_t ip4_addr_dest = iphdr->dest;
char buf[32];
int dataLen;
// get scr_port and dest port from tcp head
u16_t scr_port, dest_port;
void *data;
struct udp_hdr *udphdr;
udphdr = (struct udp_hdr *)((u8_t *)iphdr + IPH_HL_BYTES(iphdr));
scr_port = udphdr->src;
dest_port = udphdr->dest;
data = (void *)((u8_t *)udphdr + UDP_HLEN);
LogPrintln("======Bt netif send package======");
LogPrintln("netif full name %s", netif->full_name);
(void)inet_ntop(AF_INET, &ip4_addr_scr.addr, buf, sizeof(buf));
LogPrintln("package src ip %s", buf);
(void)inet_ntop(AF_INET, &ip4_addr_dest.addr, buf, sizeof(buf));
LogPrintln("package dest ip %s", buf);
LogPrintln("package src port %d", lwip_ntohs(scr_port));
LogPrintln("package dest port %d", lwip_ntohs(dest_port));
LogPrintln("send data %s", (char *)data);
dataLen = lwip_ntohs(udphdr->len) - UDP_HLEN;
LogPrintln("send data length %d", dataLen);
ICUNIT_ASSERT_EQUAL(dataLen, strlen(MSG), 4);
LogPrintln("=================================");
// 回应udp报文
ReplayUdpTask();
}
static void ParsePackageEthernet(struct netif *netif, struct pbuf *p)
{
u16_t next_hdr_offset = SIZEOF_ETH_HDR;
// get src mac and dest mac
struct eth_hdr *ethhdr;
ethhdr = (struct eth_hdr *)p->payload;
u16_t type = ethhdr->type;
LogPrintln("ParsePackageEthernet type is %d", type);
switch (type) {
#if LWIP_IPV4 && LWIP_ARP
/* IP packet? */
case PP_HTONS(ETHTYPE_IP): // 0x0008
if (!(netif->flags & NETIF_FLAG_ETHARP)) {
return;
}
/* skip Ethernet header (min. size checked above) */
if (pbuf_remove_header(p, next_hdr_offset)) {
return;
} else {
/* pass to IP layer */
ParsePackageIpUdp(netif, p);
}
break;
case PP_HTONS(ETHTYPE_ARP): // 0x0608
if (!(netif->flags & NETIF_FLAG_ETHARP)) {
return;
}
/* skip Ethernet header (min. size checked above) */
if (pbuf_remove_header(p, next_hdr_offset)) {
return;
} else {
/* pass p to ARP module */
LogPrintln("recv arp packet");
ArpPackageProc(netif, p);
}
break;
#endif /* LWIP_IPV4 && LWIP_ARP */
default:
LogPrintln("type is other %d", type);
break;
}
}
static void BtProxySend(struct netif *netif, struct pbuf *p)
{
if (netif == NULL || p == NULL) {
LogPrintln("%s : netif = NUll or p = NULL!", __func__);
return;
}
#if ETH_PAD_SIZE
(void)pbuf_header(p, ETH_PAD_SIZE); /* reclaim the padding word */
#endif
ParsePackageEthernet(netif, p);
}
static struct netif *CreateBtNetIf()
{
struct netif *btNetif = NULL;
btNetif = (struct netif *)malloc(sizeof(struct netif));
if (btNetif == NULL) {
LogPrintln("%s fail : netif malloc fail!", __func__);
LWIP_ASSERT("btNetif malloc fail.", 0);
return NULL;
}
(void)memset_s(btNetif, sizeof(struct netif), 0, sizeof(struct netif));
btNetif->drv_send = BtProxySend;
btNetif->link_layer_type = BT_PROXY_IF;
btNetif->hwaddr_len = ETH_HWADDR_LEN;
(void)memcpy_s(&btNetif->hwaddr, sizeof(btNetif->hwaddr), NETIF_MAC, ETH_HWADDR_LEN);
(void)memcpy_s(&btNetif->full_name, sizeof(btNetif->full_name), NETIF_NAME_BT, sizeof(NETIF_NAME_BT));
ip4_addr_t gw, ipaddr, netmask;
IP4_ADDR(&gw, 192, 168, 167, 239);
IP4_ADDR(&ipaddr, 192, 168, 167, 1);
IP4_ADDR(&netmask, 255, 255, 255, 255);
int ret = 0;
if ((ret = netifapi_netif_add(btNetif, &ipaddr, &netmask, &gw, btNetif, driverif_init, tcpip_input)) != ERR_OK) {
LogPrintln("%s : netifapi_netif_add fail!,ret=%d", __func__, ret);
LWIP_ASSERT("btNetif add fail.", 0);
return NULL;
}
LogPrintln("netifapi_netif_add success!");
netif_set_link_up(btNetif);
netifapi_netif_set_up(btNetif);
return btNetif;
}
static void UdpTestNetifTask(void *p)
{
(void)p;
LogPrintln("net_socket_test_011.c enter");
g_testCase = TEST_CASE;
int sfd;
struct sockaddr_in srvAddr = { 0 };
struct sockaddr_in clnAddr = { 0 };
socklen_t clnAddrLen = sizeof(clnAddr);
struct ifreq nif;
int ret;
// 注册网卡
btProxyNf = CreateBtNetIf();
/* socket creation */
sfd = socket(AF_INET, SOCK_DGRAM, 0);
LWIP_ASSERT("socket invalid param.", sfd != -1);
srvAddr.sin_family = AF_INET;
srvAddr.sin_addr.s_addr = inet_addr(STACK_IP_BT);
srvAddr.sin_port = htons(STACK_PORT);
ret = bind(sfd, (struct sockaddr*)&srvAddr, sizeof(srvAddr));
LWIP_ASSERT("socket invalid param.", ret == 0);
/* 指定网卡接口 */
char *inface = NETIF_NAME_BT;
(void)strcpy_s(nif.ifr_name, sizeof(nif.ifr_name), inface);
if (setsockopt(sfd, SOL_SOCKET, SO_BINDTODEVICE, (char *)&nif, sizeof(nif)) < 0) {
LogPrintln("set intaface fail");
LWIP_ASSERT("set intaface fail.", 0);
}
/* send */
clnAddr.sin_family = AF_INET;
clnAddr.sin_addr.s_addr = inet_addr(PEER_IP_BT);
clnAddr.sin_port = htons(PEER_PORT);
(void)memset_s(g_buf, sizeof(g_buf), 0, sizeof(g_buf));
(void)strcpy_s(g_buf, sizeof(g_buf), MSG);
ret = sendto(sfd, g_buf, strlen(MSG), 0, (struct sockaddr*)&clnAddr,
(socklen_t)sizeof(clnAddr));
LogPrintln("client send success: %d", sfd);
LWIP_ASSERT("socket invalid param.", ret != -1);
/* recv */
(void)memset_s(g_buf, sizeof(g_buf), 0, sizeof(g_buf));
ret = recvfrom(sfd, g_buf, sizeof(g_buf), 0, (struct sockaddr*)&clnAddr,
&clnAddrLen);
LWIP_ASSERT("socket invalid param.", ret == strlen(MSG));
LogPrintln("cli recv: %s", g_buf);
/* close socket */
ret = closesocket(sfd);
LWIP_ASSERT("socket invalid param.", ret != -1);
return;
}
int UdpTestNetif()
{
int ret = sys_thread_new("udp_test_netif", UdpTestNetifTask, NULL,
STACK_TEST_SIZE, TCPIP_THREAD_PRIO);
ICUNIT_ASSERT_NOT_EQUAL(ret, -1, 23);
return ret;
}
static void ArpPackageProc(struct netif *netif, struct pbuf *p)
{
struct etharp_hdr *hdr;
ip4_addr_t sipaddr, dipaddr;
hdr = (struct etharp_hdr *)p->payload;
if (hdr->opcode != PP_HTONS(ARP_REQUEST)) {
LogPrintln("opcode %d is not arp request", hdr->opcode);
return;
}
inet_pton(AF_INET, GATEWAY_IP_BT, &sipaddr);
inet_pton(AF_INET, STACK_IP_BT, &dipaddr);
if (memcmp(&hdr->dipaddr, &sipaddr, sizeof(ip4_addr_t)) != EOK) {
LogPrintln("hdr->dipaddr %u is invalid", hdr->dipaddr);
return;
}
// 回应arp报文
ReplayArpTask();
}
static void ReplayArpEncodeEthernet(struct netif *netif, struct pbuf *p)
{
int ret;
ret = pbuf_add_header(p, SIZEOF_ETH_HDR);
ICUNIT_ASSERT_EQUAL(ret, 0, 1);
struct eth_hdr *ethhdr;
ethhdr = (struct eth_hdr *)p->payload;
ethhdr->type = lwip_htons(ETHTYPE_ARP);
SMEMCPY(&ethhdr->dest, NETIF_MAC, ETH_HWADDR_LEN);
SMEMCPY(&ethhdr->src, PEER_MAC, ETH_HWADDR_LEN);
driverif_input(netif, p);
}
static void ReplayArp(void *ptemp)
{
struct etharp_hdr *hdr;
ip4_addr_t sipaddr, dipaddr;
(void)ptemp;
LogPrintln("encode arp replay packet");
inet_pton(AF_INET, GATEWAY_IP_BT, &sipaddr);
inet_pton(AF_INET, STACK_IP_BT, &dipaddr);
struct pbuf *p = pbuf_alloc(PBUF_LINK, SIZEOF_ETHARP_HDR, PBUF_RAM);
hdr = (struct etharp_hdr *)p->payload;
hdr->opcode = PP_HTONS(ARP_REPLY);
/* Write the ARP MAC-Addresses */
SMEMCPY(&hdr->shwaddr, PEER_MAC, ETH_HWADDR_LEN);
SMEMCPY(&hdr->dhwaddr, NETIF_MAC, ETH_HWADDR_LEN);
/* Copy struct ip4_addr_wordaligned to aligned ip4_addr, to support compilers without
* structure packing. */
IPADDR_WORDALIGNED_COPY_FROM_IP4_ADDR_T(&hdr->sipaddr, &sipaddr);
IPADDR_WORDALIGNED_COPY_FROM_IP4_ADDR_T(&hdr->dipaddr, &dipaddr);
hdr->hwtype = PP_HTONS(LWIP_IANA_HWTYPE_ETHERNET);
hdr->proto = PP_HTONS(ETHTYPE_IP);
/* set hwlen and protolen */
hdr->hwlen = ETH_HWADDR_LEN;
hdr->protolen = sizeof(ip4_addr_t);
ReplayArpEncodeEthernet(btProxyNf, p);
}
static void ReplayArpTask()
{
int ret;
ret = sys_thread_new("replay_arp", ReplayArp, NULL,
STACK_TEST_SIZE, TCPIP_THREAD_PRIO);
ICUNIT_ASSERT_NOT_EQUAL(ret, -1, 23);
}
@@ -0,0 +1,151 @@
/*
* Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
* Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors may be used
* to endorse or promote products derived from this software without specific prior written
* permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "lwip_test.h"
#include "lwipopts.h"
#include <arch/sys_arch.h>
#include <lwip/sys.h>
#define SRV_MSG "Hi, I am TCP server"
#define CLI_MSG "Hi, I am TCP client"
#define TEST_CASE 220
#define TEST_COUNT 100
#define STACK_PORT_TCP_DUP_START 3000
static int g_portServer = STACK_PORT_TCP_DUP_START;
static int g_portClient = STACK_PORT_TCP_DUP_START;
static char g_bufServer[BUF_SIZE + 1] = { 0 };
static char g_bufClient[BUF_SIZE + 1] = { 0 };
static int SampleTcpServer()
{
int sfd, lsfd;
struct sockaddr_in srvAddr = { 0 };
struct sockaddr_in clnAddr = { 0 };
socklen_t clnAddrLen = sizeof(clnAddr);
int ret;
/* tcp server */
lsfd = socket(AF_INET, SOCK_STREAM, 0);
ICUNIT_ASSERT_NOT_EQUAL(lsfd, -1, 1);
srvAddr.sin_family = AF_INET;
srvAddr.sin_addr.s_addr = inet_addr(STACK_IP);
srvAddr.sin_port = htons(g_portServer);
g_portServer++;
ret = bind(lsfd, (struct sockaddr*)&srvAddr, sizeof(srvAddr));
ICUNIT_ASSERT_EQUAL(ret, 0, 2);
ret = listen(lsfd, 0);
ICUNIT_ASSERT_EQUAL(ret, 0, 3);
sfd = accept(lsfd, (struct sockaddr*)&clnAddr, &clnAddrLen);
ICUNIT_ASSERT_NOT_EQUAL(sfd, -1, 4);
/* send */
(void)memset_s(g_bufServer, sizeof(g_bufServer), 0, sizeof(g_bufServer));
(void)strcpy_s(g_bufServer, sizeof(g_bufServer), SRV_MSG);
ret = send(sfd, g_bufServer, strlen(SRV_MSG), 0);
ICUNIT_ASSERT_EQUAL(ret, strlen(SRV_MSG), 5);
ret = closesocket(sfd);
ICUNIT_ASSERT_NOT_EQUAL(ret, -1, 10);
ret = closesocket(lsfd);
ICUNIT_ASSERT_NOT_EQUAL(ret, -1, 11);
return 0;
}
static int SampleTcpClient()
{
int sfd;
struct sockaddr_in srvAddr = { 0 };
int ret;
/* tcp client connection */
sfd = socket(AF_INET, SOCK_STREAM, 0);
ICUNIT_ASSERT_NOT_EQUAL(sfd, -1, 10);
srvAddr.sin_family = AF_INET;
srvAddr.sin_addr.s_addr = inet_addr(PEER_IP);
srvAddr.sin_port = htons(g_portClient);
g_portClient++;
ret = connect(sfd, (struct sockaddr*)&srvAddr, sizeof(srvAddr));
ICUNIT_ASSERT_EQUAL(ret, 0, 11);
/* recv */
(void)memset_s(g_bufClient, sizeof(g_bufClient), 0, sizeof(g_bufClient));
ret = recv(sfd, g_bufClient, sizeof(g_bufClient), 0);
ICUNIT_ASSERT_EQUAL(ret, strlen(SRV_MSG), 19);
ret = closesocket(sfd);
ICUNIT_ASSERT_NOT_EQUAL(ret, -1, 23);
return 0;
}
static void TcpServerRoutine(void *p)
{
(void)p;
g_testCase++;
int i;
for (i = 0; i < TEST_COUNT; i++) {
(void)SampleTcpServer();
}
LogPrintln("tcp server g_portServer = %d", g_portServer);
}
static void TcpClientRoutine(void *p)
{
(void)p;
g_testCase++;
int i;
for (i = 0; i < TEST_COUNT; i++) {
(void)SampleTcpClient();
}
LogPrintln("tcp server g_portClient = %d", g_portClient);
}
void TcpTestDup()
{
LogPrintln("net_socket_test_012.c enter");
g_testCase = TEST_CASE;
int ret;
ret = sys_thread_new("tcp_server_dup", TcpServerRoutine, NULL,
STACK_TEST_SIZE, TCPIP_THREAD_PRIO);
ICUNIT_ASSERT_NOT_EQUAL(ret, -1, 23);
ret = sys_thread_new("tcp_client_dup", TcpClientRoutine, NULL,
STACK_TEST_SIZE, TCPIP_THREAD_PRIO);
ICUNIT_ASSERT_NOT_EQUAL(ret, -1, 24);
}
@@ -0,0 +1,137 @@
/*
* Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
* Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors may be used
* to endorse or promote products derived from this software without specific prior written
* permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "lwip_test.h"
#include "lwipopts.h"
#include <arch/sys_arch.h>
#include <lwip/sys.h>
#define TEST_CASE 230
#define STACK_PORT_TCP_LONG 2231
#define TCP_LONG_BUF_SIZE (2 * 1024)
static int SampleTcpServer()
{
int sfd, lsfd;
struct sockaddr_in srvAddr = { 0 };
struct sockaddr_in clnAddr = { 0 };
socklen_t clnAddrLen = sizeof(clnAddr);
int ret;
static char serverBuf[TCP_LONG_BUF_SIZE] = {0};
/* tcp server */
lsfd = socket(AF_INET, SOCK_STREAM, 0);
ICUNIT_ASSERT_NOT_EQUAL(lsfd, -1, 1);
srvAddr.sin_family = AF_INET;
srvAddr.sin_addr.s_addr = inet_addr(STACK_IP);
srvAddr.sin_port = htons(STACK_PORT_TCP_LONG);
ret = bind(lsfd, (struct sockaddr*)&srvAddr, sizeof(srvAddr));
ICUNIT_ASSERT_EQUAL(ret, 0, 2);
ret = listen(lsfd, 0);
ICUNIT_ASSERT_EQUAL(ret, 0, 3);
sfd = accept(lsfd, (struct sockaddr*)&clnAddr, &clnAddrLen);
ICUNIT_ASSERT_NOT_EQUAL(sfd, -1, 4);
/* send */
ret = send(sfd, serverBuf, TCP_LONG_BUF_SIZE, 0);
ICUNIT_ASSERT_EQUAL(ret, TCP_LONG_BUF_SIZE, 6);
ret = closesocket(sfd);
ICUNIT_ASSERT_NOT_EQUAL(ret, -1, 7);
ret = closesocket(lsfd);
ICUNIT_ASSERT_NOT_EQUAL(ret, -1, 8);
return 0;
}
static int SampleTcpClient()
{
int sfd;
struct sockaddr_in srvAddr = { 0 };
int ret, i;
int recvCount = 0;
static char clientBuf[TCP_LONG_BUF_SIZE] = {0};
/* tcp client connection */
sfd = socket(AF_INET, SOCK_STREAM, 0);
ICUNIT_ASSERT_NOT_EQUAL(sfd, -1, 9);
srvAddr.sin_family = AF_INET;
srvAddr.sin_addr.s_addr = inet_addr(PEER_IP);
srvAddr.sin_port = htons(STACK_PORT_TCP_LONG);
ret = connect(sfd, (struct sockaddr*)&srvAddr, sizeof(srvAddr));
ICUNIT_ASSERT_EQUAL(ret, 0, 10);
/* recv */
for (i = 0; i < TCP_LONG_BUF_SIZE; i++) {
ret = recv(sfd, clientBuf, TCP_LONG_BUF_SIZE, 0);
recvCount += ret;
if (recvCount >= TCP_LONG_BUF_SIZE) {
LogPrintln("client recv on socket %d: %d, i = %d", sfd, recvCount, i);
break;
}
}
ICUNIT_ASSERT_NOT_EQUAL(i, TCP_LONG_BUF_SIZE, 12);
ret = closesocket(sfd);
ICUNIT_ASSERT_NOT_EQUAL(ret, -1, 13);
return 0;
}
static void TcpServerRoutine(void *p)
{
(void)p;
g_testCase++;
(void)SampleTcpServer();
}
static void TcpClientRoutine(void *p)
{
(void)p;
g_testCase++;
(void)SampleTcpClient();
}
void TcpTestLong()
{
LogPrintln("net_socket_test_013.c enter");
g_testCase = TEST_CASE;
int ret;
ret = sys_thread_new("tcp_server_long", TcpServerRoutine, NULL,
STACK_TEST_SIZE, TCPIP_THREAD_PRIO);
ICUNIT_ASSERT_NOT_EQUAL(ret, -1, 23);
ret = sys_thread_new("tcp_client_long", TcpClientRoutine, NULL,
STACK_TEST_SIZE, TCPIP_THREAD_PRIO);
ICUNIT_ASSERT_NOT_EQUAL(ret, -1, 24);
}
@@ -0,0 +1,145 @@
/*
* Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
* Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors may be used
* to endorse or promote products derived from this software without specific prior written
* permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "sys/socket.h"
#include "hos_cmsis_adp.h"
#define LWIP_TEST_TIMEOUT 1000 // timeout 1s
#define LWIP_TEST_COUNT_FLAG 100
#define SOCKET_TEST 310
#define UDP_TEST 320
#define TCP_TEST 330
#define OPT_TEST 340
#define ORDER_TEST 350
#define INET_TEST 360
#define UDP_MORE_TEST 370
#define TCP_MORE_TEST 380
#define TCP_SELECT_TEST 390
#define TCP_POLL_TEST 400
#define NETIF_TEST 410
#define TCP_DUP_TEST 420
#define TCP_LONG_TEST 430
int g_lwipTimerCount = 0;
int g_testCase = LWIP_TEST_COUNT_FLAG;
int g_testError = 0;
int g_testTemp = LWIP_TEST_COUNT_FLAG;
extern void abort(void);
extern int SocketTest(void);
extern int UdpTest(void);
extern void TcpTest();
extern int SockOptTest();
extern int ByteOrderTest(void);
extern int InetTest();
extern int UdpTestMore(void);
extern void TcpTestMore();
extern void TcpTestSelect();
extern void TcpTestPoll();
extern int UdpTestNetif(void);
extern void TcpTestDup();
extern void TcpTestLong();
// time out 1s
static void LwipTestTimeoutCallback(void const *argument)
{
g_lwipTimerCount++;
switch (g_lwipTimerCount) {
case SOCKET_TEST:
SocketTest();
break;
case UDP_TEST:
UdpTest();
break;
case TCP_TEST:
TcpTest();
break;
case OPT_TEST:
SockOptTest();
break;
case ORDER_TEST:
ByteOrderTest();
break;
case INET_TEST:
InetTest();
break;
case UDP_MORE_TEST:
UdpTestMore();
break;
case TCP_MORE_TEST:
TcpTestMore();
break;
case TCP_SELECT_TEST:
TcpTestSelect();
break;
case TCP_POLL_TEST:
TcpTestPoll();
break;
case NETIF_TEST:
UdpTestNetif();
break;
case TCP_DUP_TEST:
TcpTestDup();
break;
case TCP_LONG_TEST:
TcpTestLong();
break;
default:
break;
}
}
osTimerId_t g_lwipTestTimerId = NULL;
void LwipTestStartTimer(uint32_t timeout)
{
osStatus_t status;
if (g_lwipTestTimerId != NULL) {
status = osTimerStart(g_lwipTestTimerId, timeout);
if (status != osOK) {
return;
}
} else {
g_lwipTestTimerId = osTimerNew((osTimerFunc_t)LwipTestTimeoutCallback, osTimerPeriodic, NULL, NULL);
if (g_lwipTestTimerId == NULL) {
return;
}
status = osTimerStart(g_lwipTestTimerId, timeout);
if (status != osOK) {
return;
}
}
}
void LwipTestEnter()
{
LwipTestStartTimer(LWIP_TEST_TIMEOUT);
}