test-apps: mirror echo mode

This commit is contained in:
Andy Green 2017-11-05 06:47:56 +08:00
parent b119f2c471
commit 8c35e14965
2 changed files with 119 additions and 11 deletions

View file

@ -31,7 +31,7 @@
/* queue free space below this, rx flow is disabled */
#define RXFLOW_MIN (4)
/* 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
@ -122,13 +122,12 @@ mirror_update_worst_tail(struct mirror_instance *mi)
lws_ring_update_oldest_tail(mi->ring, worst_tail);
if (oldest == lws_ring_get_oldest_tail(mi->ring))
return 0;
/*
* The oldest tail did move on. Check if we should re-enable rx flow
* for the mirror instance since we made some space now.
*/
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 */
mirror_rxflow_instance(mi, 1);
@ -414,7 +413,7 @@ req_writable:
"lws-mirror-protocol", \
callback_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 \
}

View file

@ -37,12 +37,22 @@
#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 struct lws *wsi_dumb, *wsi_mirror;
static struct lws *wsi_multi[3];
static volatile int force_exit;
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)
char crl_path[1024] = "";
@ -70,6 +80,16 @@ enum demo_protocols {
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)
{
if (lwsl_visible(LLL_INFO)) {
@ -93,6 +113,9 @@ static int
callback_dumb_increment(struct lws *wsi, enum lws_callback_reasons reason,
void *user, void *in, size_t len)
{
#if defined(LWS_OPENSSL_SUPPORT)
union lws_tls_cert_info_results ci;
#endif
const char *which = "http";
char which_wsi[10], buf[50 + LWS_PRE];
int n;
@ -150,6 +173,26 @@ callback_dumb_increment(struct lws *wsi, enum lws_callback_reasons reason,
case LWS_CALLBACK_ESTABLISHED_CLIENT_HTTP:
lwsl_notice("lws_http_client_http_response %d\n",
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;
/* chunked content */
@ -259,7 +302,7 @@ static int
callback_lws_mirror(struct lws *wsi, enum lws_callback_reasons reason,
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];
int l = 0;
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");
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]));
mirror_lifetime = 16384 + (rands[0] & 65535);
/* useful to test single connection stability */
@ -292,13 +345,37 @@ callback_lws_mirror(struct lws *wsi, enum lws_callback_reasons reason,
break;
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;
if (flag_echo)
force_exit = 1;
break;
case LWS_CALLBACK_CLIENT_WRITEABLE:
if (flag_no_mirror_traffic)
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++) {
lws_get_random(lws_get_context(wsi), rands, sizeof(rands));
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);
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:
break;
}
@ -377,7 +476,7 @@ static const struct lws_protocols protocols[] = {
"lws-mirror-protocol",
callback_lws_mirror,
0,
128,
4096,
}, {
"lws-test-raw-client",
callback_test_raw_client,
@ -416,6 +515,7 @@ static struct option options[] = {
{ "strict-ssl", no_argument, NULL, 'S' },
{ "version", required_argument, NULL, 'v' },
{ "undeflated", no_argument, NULL, 'u' },
{ "echo", no_argument, NULL, 'e' },
{ "multi-test", no_argument, NULL, 'm' },
{ "nomirror", no_argument, NULL, 'n' },
{ "justmirror", no_argument, NULL, 'j' },
@ -457,17 +557,18 @@ int main(int argc, char **argv)
char cert_path[1024] = "";
char key_path[1024] = "";
char ca_path[1024] = "";
unsigned long last = lws_now_secs();
memset(&info, 0, sizeof info);
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)
goto usage;
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)
continue;
switch (n) {
@ -485,6 +586,9 @@ int main(int argc, char **argv)
case 'p':
port = atoi(optarg);
break;
case 'e':
flag_echo = 1;
break;
case 'P':
pp_secs = atoi(optarg);
lwsl_notice("Setting pingpong interval to %d\n", pp_secs);
@ -668,7 +772,7 @@ int main(int argc, char **argv)
} else {
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");
i.protocol = protocols[PROTOCOL_DUMB_INCREMENT].name;
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]);
}
}
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");