63#if LWIP_SOCKET && LWIP_IPV4
65#ifndef TEST_SOCKETS_STRESS
66#define TEST_SOCKETS_STRESS LWIP_DBG_OFF
69#define TEST_TIME_SECONDS 10
70#define TEST_TXRX_BUFSIZE (TCP_MSS * 2)
71#define TEST_MAX_RXWAIT_MS 50
72#define TEST_MAX_CONNECTIONS 50
74#define TEST_SOCK_READABLE 0x01
75#define TEST_SOCK_WRITABLE 0x02
76#define TEST_SOCK_ERR 0x04
78#define TEST_MODE_SELECT 0x01
79#define TEST_MODE_POLL 0x02
80#define TEST_MODE_NONBLOCKING 0x04
81#define TEST_MODE_WAIT 0x08
82#define TEST_MODE_RECVTIMEO 0x10
83#define TEST_MODE_SLEEP 0x20
85static int sockets_stresstest_numthreads;
93struct sockets_stresstest_fullduplex {
99fill_test_data(
void *
buf,
size_t buf_len_bytes)
104 LWIP_ASSERT(
"buffer too short", buf_len_bytes >= 4);
105 LWIP_ASSERT(
"buffer too big", buf_len_bytes <= 0xFFFF);
107 p[0] = (
u8_t)(buf_len_bytes >> 8);
108 p[1] = (
u8_t)buf_len_bytes;
112 for (
i = 4;
i < buf_len_bytes;
i++) {
118 p[2] = (
u8_t)(chk >> 8);
123check_test_data(
const void *
buf,
size_t buf_len_bytes)
126 u16_t i, chk, chk_rx, len_rx;
128 LWIP_ASSERT(
"buffer too short", buf_len_bytes >= 4);
129 len_rx = (((
u16_t)
p[0]) << 8) |
p[1];
131 if (len_rx > buf_len_bytes) {
134 return buf_len_bytes;
136 chk_rx = (((
u16_t)
p[2]) << 8) |
p[3];
139 for (
i = 4;
i < len_rx;
i++) {
143 if (len_rx < buf_len_bytes) {
144 size_t data_left = buf_len_bytes - len_rx;
154recv_and_check_data_return_offset(
int s,
char *rxbuf,
size_t rxbufsize,
size_t rxoff,
int *closed,
const char *dbg)
158 ret = lwip_read(
s, &rxbuf[rxoff], rxbufsize - rxoff);
175 return check_test_data(rxbuf, rxoff +
ret);
178#if LWIP_SOCKET_SELECT
180sockets_stresstest_wait_readable_select(
int s,
int timeout_ms)
195 tv.tv_sec = timeout_ms / 1000;
196 tv.tv_usec = (timeout_ms - (tv.tv_sec * 1000)) * 1000;
197 ret = lwip_select(
s + 1, &fs_r, &fs_w, &fs_e, &tv);
203 ret |= TEST_SOCK_READABLE;
206 ret |= TEST_SOCK_WRITABLE;
209 ret |= TEST_SOCK_ERR;
219sockets_stresstest_wait_readable_poll(
int s,
int timeout_ms)
228 ret = lwip_poll(&
pfd, 1, timeout_ms);
233 ret |= TEST_SOCK_READABLE;
236 ret |= TEST_SOCK_WRITABLE;
239 ret |= TEST_SOCK_ERR;
249sockets_stresstest_wait_readable_recvtimeo(
int s,
int timeout_ms)
253#if LWIP_SO_SNDRCVTIMEO_NONSTANDARD
254 int opt_on = timeout_ms;
257 struct timeval opt_on, opt_off;
258 opt_on.
tv_sec = timeout_ms / 1000;
259 opt_on.tv_usec = (timeout_ms - (opt_on.tv_sec * 1000)) * 1000;
276 return TEST_SOCK_READABLE;
282 return TEST_SOCK_ERR;
285 return TEST_SOCK_ERR;
290sockets_stresstest_wait_readable_wait_peek(
int s,
int timeout_ms)
301 return TEST_SOCK_READABLE;
307 return TEST_SOCK_ERR;
310 return TEST_SOCK_ERR;
314sockets_stresstest_wait_readable_nonblock(
int s,
int timeout_ms)
320 while(
sys_now() < wait_until) {
325 return TEST_SOCK_READABLE;
331 return TEST_SOCK_ERR;
339static int sockets_stresstest_rand_mode(
int allow_wait,
int allow_rx)
341 u32_t random_value = LWIP_RAND();
342#if LWIP_SOCKET_SELECT
343 if (random_value & TEST_MODE_SELECT) {
344 return TEST_MODE_SELECT;
348 if (random_value & TEST_MODE_POLL) {
349 return TEST_MODE_POLL;
353 return TEST_MODE_SLEEP;
356 if (random_value & TEST_MODE_RECVTIMEO) {
357 return TEST_MODE_RECVTIMEO;
361 if (random_value & TEST_MODE_RECVTIMEO) {
362 return TEST_MODE_RECVTIMEO;
365 return TEST_MODE_NONBLOCKING;
369sockets_stresstest_wait_readable(
int mode,
int s,
int timeout_ms)
373#if LWIP_SOCKET_SELECT
374 case TEST_MODE_SELECT:
375 return sockets_stresstest_wait_readable_select(
s, timeout_ms);
379 return sockets_stresstest_wait_readable_poll(
s, timeout_ms);
382 case TEST_MODE_RECVTIMEO:
383 return sockets_stresstest_wait_readable_recvtimeo(
s, timeout_ms);
386 return sockets_stresstest_wait_readable_wait_peek(
s, timeout_ms);
387 case TEST_MODE_NONBLOCKING:
388 return sockets_stresstest_wait_readable_nonblock(
s, timeout_ms);
389 case TEST_MODE_SLEEP:
401#if LWIP_NETCONN_FULLDUPLEX
403sockets_stresstest_conn_client_r(
void *
arg)
405 struct sockets_stresstest_fullduplex *
fd = (
struct sockets_stresstest_fullduplex *)
arg;
408 char rxbuf[TEST_TXRX_BUFSIZE];
415 rxoff = recv_and_check_data_return_offset(
s, rxbuf,
sizeof(rxbuf), rxoff, &closed,
"cli");
426 LWIP_ASSERT(
"", sockets_stresstest_numthreads >= 0);
431sockets_stresstest_conn_client(
void *
arg)
436 char txbuf[TEST_TXRX_BUFSIZE];
437 char rxbuf[TEST_TXRX_BUFSIZE];
439 u32_t max_time =
sys_now() + (TEST_TIME_SECONDS * 1000);
441 struct sockets_stresstest_fullduplex *
data =
NULL;
455#if LWIP_NETCONN_FULLDUPLEX
456 if (LWIP_RAND() & 1) {
458 data = (
struct sockets_stresstest_fullduplex*)
mem_malloc(
sizeof(
struct sockets_stresstest_fullduplex));
463 t =
sys_thread_new(
"sockets_stresstest_conn_client_r", sockets_stresstest_conn_client_r,
data, 0, 0);
475 int mode = sockets_stresstest_rand_mode(0, do_rx);
476 int timeout_ms = LWIP_RAND() % TEST_MAX_RXWAIT_MS;
477 ret = sockets_stresstest_wait_readable(
mode,
s, timeout_ms);
482 rxoff = recv_and_check_data_return_offset(
s, rxbuf,
sizeof(rxbuf), rxoff, &closed,
"cli");
487 size_t send_len = (LWIP_RAND() % (
sizeof(txbuf) - 4)) + 4;
488 fill_test_data(txbuf, send_len);
490 ret = lwip_write(
s, txbuf, send_len);
506 LWIP_ASSERT(
"", sockets_stresstest_numthreads >= 0);
510sockets_stresstest_conn_server(
void *
arg)
513 char txbuf[TEST_TXRX_BUFSIZE];
514 char rxbuf[TEST_TXRX_BUFSIZE];
521 int mode = sockets_stresstest_rand_mode(1, 1);
522 int timeout_ms = LWIP_RAND() % TEST_MAX_RXWAIT_MS;
523 ret = sockets_stresstest_wait_readable(
mode,
s, timeout_ms);
525 if (
ret & TEST_SOCK_ERR) {
531 rxoff = recv_and_check_data_return_offset(
s, rxbuf,
sizeof(rxbuf), rxoff, &closed,
"srv");
537 size_t send_len = (LWIP_RAND() % (
sizeof(txbuf) - 4)) + 4;
538 fill_test_data(txbuf, send_len);
540 ret = lwip_write(
s, txbuf, send_len);
559 LWIP_ASSERT(
"", sockets_stresstest_numthreads >= 0);
569 for (
i = 0;
i < max_connections;
i++) {
572 t =
sys_thread_new(
"sockets_stresstest_conn_client", sockets_stresstest_conn_client, (
void*)remote_addr, 0, 0);
575 return max_connections;
579sockets_stresstest_listener(
void *
arg)
585 struct test_settings *
settings = (
struct test_settings *)
arg;
586 int num_clients, num_servers = 0;
595 ret = lwip_listen(slisten, 0);
598 addr_len =
sizeof(
addr);
602 num_clients = sockets_stresstest_start_clients(&
addr);
604 while (num_servers < num_clients) {
607 int sclient = lwip_accept(slisten, (
struct sockaddr *)&aclient, &aclient_len);
614 t =
sys_thread_new(
"sockets_stresstest_conn_server", sockets_stresstest_conn_server, (
void*)sclient, 0, 0);
621 LWIP_DEBUGF(TEST_SOCKETS_STRESS |
LWIP_DBG_STATE, (
"sockets_stresstest_listener: all %d connections established\n", num_clients));
624 while (sockets_stresstest_numthreads > 0) {
628 ret = lwip_close(slisten);
635sockets_stresstest_listener_loop(
void *
arg)
638 struct test_settings *
settings = (
struct test_settings *)
arg;
643 sockets_stresstest_listener(
arg);
650 sockets_stresstest_listener(
arg);
660 struct test_settings *
settings = (
struct test_settings *)
mem_malloc(
sizeof(
struct test_settings));
664#if LWIP_IPV4 && LWIP_IPV6
667 settings->addr.ss_family = (sa_family_t)addr_family;
679 struct test_settings *
settings = (
struct test_settings *)
mem_malloc(
sizeof(
struct test_settings));
683#if LWIP_IPV4 && LWIP_IPV6
685 settings->addr.ss_family = (sa_family_t)addr_family;
706 memset(
addr, 0,
sizeof(
struct test_settings));
708 if (ip4addr_aton(remote_ip, &ip4)) {
710 ((
struct sockaddr_in *)
addr)->sin_addr.s_addr = ip4_addr_get_u32(&ip4);
713#if LWIP_IPV4 && LWIP_IPV6
717 if (ip6addr_aton(remote_ip, &ip6)) {
723 sockets_stresstest_start_clients(
addr);
struct mke2fs_defaults settings[]
ULONG WSAAPI inet_addr(IN CONST CHAR FAR *cp)
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
void * mem_malloc(mem_size_t size_in)
#define LWIP_DEBUGF(debug, message)
#define LWIP_ASSERT(message, assertion)
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
GLenum GLuint GLenum GLsizei const GLchar * buf
GLenum const GLvoid * addr
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
#define LWIP_UNUSED_ARG(x)
sys_thread_t sys_thread_new(const char *name, lwip_thread_fn thread, void *arg, int stacksize, int prio)
void sys_msleep(u32_t ms)
#define memcpy(s1, s2, n)
#define memmove(s1, s2, n)
void sockets_stresstest_init_client(const char *remote_ip, u16_t remote_port)
void sockets_stresstest_init_loopback(int addr_family)
void sockets_stresstest_init_server(int addr_family, u16_t server_port)
static PIXELFORMATDESCRIPTOR pfd
#define SYS_ARCH_DEC(var, val)
#define SYS_ARCH_INC(var, val)
#define FD_ISSET(fd, set)