mirror of
https://github.com/warmcat/libwebsockets.git
synced 2025-03-30 00:00:16 +01:00
test-apps: mirror echo mode
This commit is contained in:
parent
b119f2c471
commit
8c35e14965
2 changed files with 119 additions and 11 deletions
|
@ -31,7 +31,7 @@
|
||||||
/* queue free space below this, rx flow is disabled */
|
/* queue free space below this, rx flow is disabled */
|
||||||
#define RXFLOW_MIN (4)
|
#define RXFLOW_MIN (4)
|
||||||
/* queue free space above this, rx flow is enabled */
|
/* queue free space above this, rx flow is enabled */
|
||||||
#define RXFLOW_MAX (QUEUELEN / 3)
|
#define RXFLOW_MAX ((2 * QUEUELEN) / 3)
|
||||||
|
|
||||||
#define MAX_MIRROR_INSTANCES 3
|
#define MAX_MIRROR_INSTANCES 3
|
||||||
|
|
||||||
|
@ -122,13 +122,12 @@ mirror_update_worst_tail(struct mirror_instance *mi)
|
||||||
lws_ring_update_oldest_tail(mi->ring, worst_tail);
|
lws_ring_update_oldest_tail(mi->ring, worst_tail);
|
||||||
if (oldest == lws_ring_get_oldest_tail(mi->ring))
|
if (oldest == lws_ring_get_oldest_tail(mi->ring))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The oldest tail did move on. Check if we should re-enable rx flow
|
* The oldest tail did move on. Check if we should re-enable rx flow
|
||||||
* for the mirror instance since we made some space now.
|
* for the mirror instance since we made some space now.
|
||||||
*/
|
*/
|
||||||
if (!mi->rx_enabled && /* rx is disabled */
|
if (!mi->rx_enabled && /* rx is disabled */
|
||||||
lws_ring_get_count_free_elements(mi->ring) > RXFLOW_MAX)
|
lws_ring_get_count_free_elements(mi->ring) >= RXFLOW_MAX)
|
||||||
/* there is enough space, let's re-enable rx for our instance */
|
/* there is enough space, let's re-enable rx for our instance */
|
||||||
mirror_rxflow_instance(mi, 1);
|
mirror_rxflow_instance(mi, 1);
|
||||||
|
|
||||||
|
@ -414,7 +413,7 @@ req_writable:
|
||||||
"lws-mirror-protocol", \
|
"lws-mirror-protocol", \
|
||||||
callback_lws_mirror, \
|
callback_lws_mirror, \
|
||||||
sizeof(struct per_session_data__lws_mirror), \
|
sizeof(struct per_session_data__lws_mirror), \
|
||||||
128, /* rx buf size must be >= permessage-deflate rx size */ \
|
4096, /* rx buf size must be >= permessage-deflate rx size */ \
|
||||||
0, NULL, 0 \
|
0, NULL, 0 \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -37,12 +37,22 @@
|
||||||
|
|
||||||
#include "../lib/libwebsockets.h"
|
#include "../lib/libwebsockets.h"
|
||||||
|
|
||||||
|
struct lws_poly_gen {
|
||||||
|
uint32_t cyc[2];
|
||||||
|
};
|
||||||
|
|
||||||
|
#define block_size (3 * 4096)
|
||||||
|
|
||||||
static int deny_deflate, longlived, mirror_lifetime, test_post;
|
static int deny_deflate, longlived, mirror_lifetime, test_post;
|
||||||
static struct lws *wsi_dumb, *wsi_mirror;
|
static struct lws *wsi_dumb, *wsi_mirror;
|
||||||
static struct lws *wsi_multi[3];
|
static struct lws *wsi_multi[3];
|
||||||
static volatile int force_exit;
|
static volatile int force_exit;
|
||||||
static unsigned int opts, rl_multi[3];
|
static unsigned int opts, rl_multi[3];
|
||||||
static int flag_no_mirror_traffic, justmirror;
|
static int flag_no_mirror_traffic, justmirror, flag_echo;
|
||||||
|
static uint32_t count_blocks = 1024, txb, rxb, rx_count, errs;
|
||||||
|
static struct lws_poly_gen tx = { { 0xabcde, 0x23456789 } },
|
||||||
|
rx = { { 0xabcde, 0x23456789 } }
|
||||||
|
;
|
||||||
|
|
||||||
#if defined(LWS_OPENSSL_SUPPORT) && defined(LWS_HAVE_SSL_CTX_set1_param)
|
#if defined(LWS_OPENSSL_SUPPORT) && defined(LWS_HAVE_SSL_CTX_set1_param)
|
||||||
char crl_path[1024] = "";
|
char crl_path[1024] = "";
|
||||||
|
@ -70,6 +80,16 @@ enum demo_protocols {
|
||||||
DEMO_PROTOCOL_COUNT
|
DEMO_PROTOCOL_COUNT
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static uint8_t
|
||||||
|
lws_poly_rand(struct lws_poly_gen *p)
|
||||||
|
{
|
||||||
|
p->cyc[0] = (p->cyc[0] & 1) ? (p->cyc[0] >> 1) ^ 0xb4bcd35c : p->cyc[0] >> 1;
|
||||||
|
p->cyc[0] = (p->cyc[0] & 1) ? (p->cyc[0] >> 1) ^ 0xb4bcd35c : p->cyc[0] >> 1;
|
||||||
|
p->cyc[1] = (p->cyc[1] & 1) ? (p->cyc[1] >> 1) ^ 0x7a5bc2e3 : p->cyc[1] >> 1;
|
||||||
|
|
||||||
|
return p->cyc[0] ^ p->cyc[1];
|
||||||
|
}
|
||||||
|
|
||||||
static void show_http_content(const char *p, size_t l)
|
static void show_http_content(const char *p, size_t l)
|
||||||
{
|
{
|
||||||
if (lwsl_visible(LLL_INFO)) {
|
if (lwsl_visible(LLL_INFO)) {
|
||||||
|
@ -93,6 +113,9 @@ static int
|
||||||
callback_dumb_increment(struct lws *wsi, enum lws_callback_reasons reason,
|
callback_dumb_increment(struct lws *wsi, enum lws_callback_reasons reason,
|
||||||
void *user, void *in, size_t len)
|
void *user, void *in, size_t len)
|
||||||
{
|
{
|
||||||
|
#if defined(LWS_OPENSSL_SUPPORT)
|
||||||
|
union lws_tls_cert_info_results ci;
|
||||||
|
#endif
|
||||||
const char *which = "http";
|
const char *which = "http";
|
||||||
char which_wsi[10], buf[50 + LWS_PRE];
|
char which_wsi[10], buf[50 + LWS_PRE];
|
||||||
int n;
|
int n;
|
||||||
|
@ -150,6 +173,26 @@ callback_dumb_increment(struct lws *wsi, enum lws_callback_reasons reason,
|
||||||
case LWS_CALLBACK_ESTABLISHED_CLIENT_HTTP:
|
case LWS_CALLBACK_ESTABLISHED_CLIENT_HTTP:
|
||||||
lwsl_notice("lws_http_client_http_response %d\n",
|
lwsl_notice("lws_http_client_http_response %d\n",
|
||||||
lws_http_client_http_response(wsi));
|
lws_http_client_http_response(wsi));
|
||||||
|
#if defined(LWS_OPENSSL_SUPPORT)
|
||||||
|
if (!lws_tls_peer_cert_info(wsi, LWS_TLS_CERT_INFO_COMMON_NAME,
|
||||||
|
&ci, sizeof(ci.ns.name)))
|
||||||
|
lwsl_notice(" Peer Cert CN : %s\n", ci.ns.name);
|
||||||
|
|
||||||
|
if (!lws_tls_peer_cert_info(wsi, LWS_TLS_CERT_INFO_ISSUER_NAME,
|
||||||
|
&ci, sizeof(ci.ns.name)))
|
||||||
|
lwsl_notice(" Peer Cert issuer : %s\n", ci.ns.name);
|
||||||
|
|
||||||
|
if (!lws_tls_peer_cert_info(wsi, LWS_TLS_CERT_INFO_VALIDITY_FROM,
|
||||||
|
&ci, 0))
|
||||||
|
lwsl_notice(" Peer Cert Valid from: %s", ctime(&ci.time));
|
||||||
|
|
||||||
|
if (!lws_tls_peer_cert_info(wsi, LWS_TLS_CERT_INFO_VALIDITY_TO,
|
||||||
|
&ci, 0))
|
||||||
|
lwsl_notice(" Peer Cert Valid to : %s", ctime(&ci.time));
|
||||||
|
if (!lws_tls_peer_cert_info(wsi, LWS_TLS_CERT_INFO_USAGE,
|
||||||
|
&ci, 0))
|
||||||
|
lwsl_notice(" Peer Cert usage bits: 0x%x\n", ci.usage);
|
||||||
|
#endif
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* chunked content */
|
/* chunked content */
|
||||||
|
@ -259,7 +302,7 @@ static int
|
||||||
callback_lws_mirror(struct lws *wsi, enum lws_callback_reasons reason,
|
callback_lws_mirror(struct lws *wsi, enum lws_callback_reasons reason,
|
||||||
void *user, void *in, size_t len)
|
void *user, void *in, size_t len)
|
||||||
{
|
{
|
||||||
unsigned char buf[LWS_PRE + 4096];
|
unsigned char buf[LWS_PRE + block_size], *p;
|
||||||
unsigned int rands[4];
|
unsigned int rands[4];
|
||||||
int l = 0;
|
int l = 0;
|
||||||
int n;
|
int n;
|
||||||
|
@ -269,6 +312,16 @@ callback_lws_mirror(struct lws *wsi, enum lws_callback_reasons reason,
|
||||||
|
|
||||||
lwsl_notice("mirror: LWS_CALLBACK_CLIENT_ESTABLISHED\n");
|
lwsl_notice("mirror: LWS_CALLBACK_CLIENT_ESTABLISHED\n");
|
||||||
|
|
||||||
|
if (flag_echo) {
|
||||||
|
rxb = txb = 0;
|
||||||
|
rx.cyc[0] = tx.cyc[0] = 0xabcde;
|
||||||
|
rx.cyc[1] = tx.cyc[1] = 0x23456789;
|
||||||
|
|
||||||
|
lws_callback_on_writable(wsi);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
lws_get_random(lws_get_context(wsi), rands, sizeof(rands[0]));
|
lws_get_random(lws_get_context(wsi), rands, sizeof(rands[0]));
|
||||||
mirror_lifetime = 16384 + (rands[0] & 65535);
|
mirror_lifetime = 16384 + (rands[0] & 65535);
|
||||||
/* useful to test single connection stability */
|
/* useful to test single connection stability */
|
||||||
|
@ -292,13 +345,37 @@ callback_lws_mirror(struct lws *wsi, enum lws_callback_reasons reason,
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case LWS_CALLBACK_CLOSED:
|
case LWS_CALLBACK_CLOSED:
|
||||||
lwsl_notice("mirror: LWS_CALLBACK_CLOSED mirror_lifetime=%d\n", mirror_lifetime);
|
lwsl_notice("mirror: LWS_CALLBACK_CLOSED mirror_lifetime=%d, rxb %d, rx_count %d\n", mirror_lifetime, rxb, rx_count);
|
||||||
wsi_mirror = NULL;
|
wsi_mirror = NULL;
|
||||||
|
if (flag_echo)
|
||||||
|
force_exit = 1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case LWS_CALLBACK_CLIENT_WRITEABLE:
|
case LWS_CALLBACK_CLIENT_WRITEABLE:
|
||||||
if (flag_no_mirror_traffic)
|
if (flag_no_mirror_traffic)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
if (flag_echo) {
|
||||||
|
for (n = 0; n < (int)block_size; n++)
|
||||||
|
buf[LWS_PRE + n] = lws_poly_rand(&tx);
|
||||||
|
|
||||||
|
n = lws_write(wsi, &buf[LWS_PRE], block_size,
|
||||||
|
opts | LWS_WRITE_TEXT);
|
||||||
|
if (n < 0) {
|
||||||
|
lwsl_err("Error sending\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
txb++;
|
||||||
|
if (txb != count_blocks)
|
||||||
|
lws_callback_on_writable(wsi);
|
||||||
|
else {
|
||||||
|
lwsl_notice("send completed: %d x %d\n",
|
||||||
|
count_blocks, block_size);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
for (n = 0; n < 1; n++) {
|
for (n = 0; n < 1; n++) {
|
||||||
lws_get_random(lws_get_context(wsi), rands, sizeof(rands));
|
lws_get_random(lws_get_context(wsi), rands, sizeof(rands));
|
||||||
l += sprintf((char *)&buf[LWS_PRE + l],
|
l += sprintf((char *)&buf[LWS_PRE + l],
|
||||||
|
@ -328,6 +405,28 @@ callback_lws_mirror(struct lws *wsi, enum lws_callback_reasons reason,
|
||||||
lws_callback_on_writable(wsi);
|
lws_callback_on_writable(wsi);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case LWS_CALLBACK_CLIENT_RECEIVE:
|
||||||
|
if (flag_echo) {
|
||||||
|
p = (unsigned char *)in;
|
||||||
|
for (n = 0; n < (int)len; n++)
|
||||||
|
if (*p++ != lws_poly_rand(&rx)) {
|
||||||
|
lwsl_err("mismatch at rxb %d offset %d\n", rxb + (n / block_size), n % block_size);
|
||||||
|
errs++;
|
||||||
|
force_exit = 1;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
rx_count += (unsigned int)(unsigned long long)len;
|
||||||
|
while (rx_count >= block_size) {
|
||||||
|
rx_count -= block_size;
|
||||||
|
rxb++;
|
||||||
|
}
|
||||||
|
if (rx_count == 0 && rxb == count_blocks) {
|
||||||
|
lwsl_notice("Everything received: errs %d\n", errs);
|
||||||
|
force_exit = 1;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -377,7 +476,7 @@ static const struct lws_protocols protocols[] = {
|
||||||
"lws-mirror-protocol",
|
"lws-mirror-protocol",
|
||||||
callback_lws_mirror,
|
callback_lws_mirror,
|
||||||
0,
|
0,
|
||||||
128,
|
4096,
|
||||||
}, {
|
}, {
|
||||||
"lws-test-raw-client",
|
"lws-test-raw-client",
|
||||||
callback_test_raw_client,
|
callback_test_raw_client,
|
||||||
|
@ -416,6 +515,7 @@ static struct option options[] = {
|
||||||
{ "strict-ssl", no_argument, NULL, 'S' },
|
{ "strict-ssl", no_argument, NULL, 'S' },
|
||||||
{ "version", required_argument, NULL, 'v' },
|
{ "version", required_argument, NULL, 'v' },
|
||||||
{ "undeflated", no_argument, NULL, 'u' },
|
{ "undeflated", no_argument, NULL, 'u' },
|
||||||
|
{ "echo", no_argument, NULL, 'e' },
|
||||||
{ "multi-test", no_argument, NULL, 'm' },
|
{ "multi-test", no_argument, NULL, 'm' },
|
||||||
{ "nomirror", no_argument, NULL, 'n' },
|
{ "nomirror", no_argument, NULL, 'n' },
|
||||||
{ "justmirror", no_argument, NULL, 'j' },
|
{ "justmirror", no_argument, NULL, 'j' },
|
||||||
|
@ -457,17 +557,18 @@ int main(int argc, char **argv)
|
||||||
char cert_path[1024] = "";
|
char cert_path[1024] = "";
|
||||||
char key_path[1024] = "";
|
char key_path[1024] = "";
|
||||||
char ca_path[1024] = "";
|
char ca_path[1024] = "";
|
||||||
|
unsigned long last = lws_now_secs();
|
||||||
|
|
||||||
memset(&info, 0, sizeof info);
|
memset(&info, 0, sizeof info);
|
||||||
|
|
||||||
lwsl_notice("libwebsockets test client - license LGPL2.1+SLE\n");
|
lwsl_notice("libwebsockets test client - license LGPL2.1+SLE\n");
|
||||||
lwsl_notice("(C) Copyright 2010-2016 Andy Green <andy@warmcat.com>\n");
|
lwsl_notice("(C) Copyright 2010-2017 Andy Green <andy@warmcat.com>\n");
|
||||||
|
|
||||||
if (argc < 2)
|
if (argc < 2)
|
||||||
goto usage;
|
goto usage;
|
||||||
|
|
||||||
while (n >= 0) {
|
while (n >= 0) {
|
||||||
n = getopt_long(argc, argv, "Sjnuv:hsp:d:lC:K:A:P:mo", options, NULL);
|
n = getopt_long(argc, argv, "Sjnuv:hsp:d:lC:K:A:P:moe", options, NULL);
|
||||||
if (n < 0)
|
if (n < 0)
|
||||||
continue;
|
continue;
|
||||||
switch (n) {
|
switch (n) {
|
||||||
|
@ -485,6 +586,9 @@ int main(int argc, char **argv)
|
||||||
case 'p':
|
case 'p':
|
||||||
port = atoi(optarg);
|
port = atoi(optarg);
|
||||||
break;
|
break;
|
||||||
|
case 'e':
|
||||||
|
flag_echo = 1;
|
||||||
|
break;
|
||||||
case 'P':
|
case 'P':
|
||||||
pp_secs = atoi(optarg);
|
pp_secs = atoi(optarg);
|
||||||
lwsl_notice("Setting pingpong interval to %d\n", pp_secs);
|
lwsl_notice("Setting pingpong interval to %d\n", pp_secs);
|
||||||
|
@ -668,7 +772,7 @@ int main(int argc, char **argv)
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
if (do_ws) {
|
if (do_ws) {
|
||||||
if (!justmirror && !wsi_dumb && ratelimit_connects(&rl_dumb, 2u)) {
|
if (!flag_echo && !justmirror && !wsi_dumb && ratelimit_connects(&rl_dumb, 2u)) {
|
||||||
lwsl_notice("dumb: connecting\n");
|
lwsl_notice("dumb: connecting\n");
|
||||||
i.protocol = protocols[PROTOCOL_DUMB_INCREMENT].name;
|
i.protocol = protocols[PROTOCOL_DUMB_INCREMENT].name;
|
||||||
i.pwsi = &wsi_dumb;
|
i.pwsi = &wsi_dumb;
|
||||||
|
@ -699,6 +803,11 @@ int main(int argc, char **argv)
|
||||||
lws_callback_on_writable_all_protocol(context, &protocols[PROTOCOL_DUMB_INCREMENT]);
|
lws_callback_on_writable_all_protocol(context, &protocols[PROTOCOL_DUMB_INCREMENT]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (flag_echo && lws_now_secs() != last) {
|
||||||
|
lwsl_notice("rxb %d, rx_count %d\n", rxb, rx_count);
|
||||||
|
last = lws_now_secs();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
lwsl_err("Exiting\n");
|
lwsl_err("Exiting\n");
|
||||||
|
|
Loading…
Add table
Reference in a new issue