first submission
This commit is contained in:
@@ -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(ðhdr->dest, NETIF_MAC, ETH_HWADDR_LEN);
|
||||
SMEMCPY(ðhdr->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(ðhdr->dest, NETIF_MAC, ETH_HWADDR_LEN);
|
||||
SMEMCPY(ðhdr->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);
|
||||
}
|
||||
Reference in New Issue
Block a user