client fixups after esp8266
This commit is contained in:
parent
7acf76cd3d
commit
bbf93693d8
7 changed files with 125 additions and 36 deletions
34
README.esp8266.md
Normal file
34
README.esp8266.md
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
ESP8266 lws port
|
||||||
|
----------------
|
||||||
|
|
||||||
|
lws can now work well on the ESP8266.
|
||||||
|
|
||||||
|
You should get the ESP8266 Espressif SDK-based project here
|
||||||
|
|
||||||
|
https://github.com/lws-team/esplws
|
||||||
|
|
||||||
|
which includes lws as an "app" in the build. The project provides full AP-based setup over the web, and once the device has been configured to associate to a local AP, a separate station vhost with the lws test protocols.
|
||||||
|
|
||||||
|
Instructions for building that are here
|
||||||
|
|
||||||
|
https://github.com/lws-team/esplws/blob/master/README.md
|
||||||
|
|
||||||
|
There are also instructions there for how to remove the test apps from the build and customize your own station content.
|
||||||
|
|
||||||
|
|
||||||
|
Information about lws integration on ESP8266
|
||||||
|
--------------------------------------------
|
||||||
|
|
||||||
|
The following existing lws features are used to make a nice integration:
|
||||||
|
|
||||||
|
- vhosts: there are separate vhosts for the configuration AP mode and the normal station mode.
|
||||||
|
|
||||||
|
- file_ops: the lws file operations are overridden and handled by a ROMFS parser
|
||||||
|
|
||||||
|
- mounts: mounts are used to serve files automatically from the ROMFS
|
||||||
|
|
||||||
|
- plugins: standalone protocol plugins are included into the build, so there are clean individual implementations for each protocol, while everything is statically linked
|
||||||
|
|
||||||
|
- lws stability and security features like bytewise parsers, sophisticated timeouts, http/1.1 keepalive support
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,11 @@
|
||||||
libwebsockets
|
libwebsockets
|
||||||
-------------
|
-------------
|
||||||
|
|
||||||
|
| News |
|
||||||
|
------
|
||||||
|
| ESP8266 is now supported in lws! See https://github.com/warmcat/libwebsockets/blob/master/README.esp8266.md |
|
||||||
|
|
||||||
|
|
||||||
This is the libwebsockets C library for lightweight websocket clients and
|
This is the libwebsockets C library for lightweight websocket clients and
|
||||||
servers. For support, visit
|
servers. For support, visit
|
||||||
|
|
||||||
|
@ -15,10 +20,6 @@ and consider joining the project mailing list at
|
||||||
|
|
||||||
https://libwebsockets.org/mailman/listinfo/libwebsockets
|
https://libwebsockets.org/mailman/listinfo/libwebsockets
|
||||||
|
|
||||||
| News |
|
|
||||||
------
|
|
||||||
| We have updated https://libwebsockets.org, if you would like your project using lws featured in the image carousel, send an image, project URL and brief summary to andy@warmcat.com |
|
|
||||||
|
|
||||||
You can get the latest version of the library from git:
|
You can get the latest version of the library from git:
|
||||||
|
|
||||||
- https://github.com/warmcat/libwebsockets
|
- https://github.com/warmcat/libwebsockets
|
||||||
|
|
|
@ -175,6 +175,8 @@ lws_client_connect_2(struct lws *wsi)
|
||||||
goto oom4;
|
goto oom4;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
lws_change_pollfd(wsi, 0, LWS_POLLIN);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* past here, we can't simply free the structs as error
|
* past here, we can't simply free the structs as error
|
||||||
* handling as oom4 does. We have to run the whole close flow.
|
* handling as oom4 does. We have to run the whole close flow.
|
||||||
|
@ -485,6 +487,9 @@ lws_client_connect_via_info(struct lws_client_connect_info *i)
|
||||||
if (i->context->requested_kill)
|
if (i->context->requested_kill)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
if (!i->context->protocol_init_done)
|
||||||
|
lws_protocol_init(i->context);
|
||||||
|
|
||||||
wsi = lws_zalloc(sizeof(struct lws));
|
wsi = lws_zalloc(sizeof(struct lws));
|
||||||
if (wsi == NULL)
|
if (wsi == NULL)
|
||||||
goto bail;
|
goto bail;
|
||||||
|
|
|
@ -119,7 +119,7 @@ lws_header_table_attach(struct lws *wsi, int autoservice)
|
||||||
struct lws **pwsi;
|
struct lws **pwsi;
|
||||||
int n;
|
int n;
|
||||||
|
|
||||||
lwsl_notice("%s: wsi %p: ah %p (tsi %d, count = %d) in\n", __func__, (void *)wsi,
|
lwsl_info("%s: wsi %p: ah %p (tsi %d, count = %d) in\n", __func__, (void *)wsi,
|
||||||
(void *)wsi->u.hdr.ah, wsi->tsi, pt->ah_count_in_use);
|
(void *)wsi->u.hdr.ah, wsi->tsi, pt->ah_count_in_use);
|
||||||
|
|
||||||
/* if we are already bound to one, just clear it down */
|
/* if we are already bound to one, just clear it down */
|
||||||
|
@ -291,14 +291,15 @@ int lws_header_table_detach(struct lws *wsi, int autoservice)
|
||||||
lws_header_table_reset(wsi, autoservice);
|
lws_header_table_reset(wsi, autoservice);
|
||||||
time(&wsi->u.hdr.ah->assigned);
|
time(&wsi->u.hdr.ah->assigned);
|
||||||
|
|
||||||
assert(wsi->position_in_fds_table != -1);
|
/* clients acquire the ah and then insert themselves in fds table... */
|
||||||
|
if (wsi->position_in_fds_table != -1) {
|
||||||
|
lwsl_info("%s: Enabling %p POLLIN\n", __func__, wsi);
|
||||||
|
|
||||||
lwsl_info("%s: Enabling %p POLLIN\n", __func__, wsi);
|
/* he has been stuck waiting for an ah, but now his wait is over,
|
||||||
|
* let him progress
|
||||||
/* he has been stuck waiting for an ah, but now his wait is over,
|
*/
|
||||||
* let him progress
|
_lws_change_pollfd(wsi, 0, LWS_POLLIN, &pa);
|
||||||
*/
|
}
|
||||||
_lws_change_pollfd(wsi, 0, LWS_POLLIN, &pa);
|
|
||||||
|
|
||||||
/* point prev guy to next guy in list instead */
|
/* point prev guy to next guy in list instead */
|
||||||
*pwsi = wsi->u.hdr.ah_wait_list;
|
*pwsi = wsi->u.hdr.ah_wait_list;
|
||||||
|
|
|
@ -43,6 +43,8 @@ _lws_change_pollfd(struct lws *wsi, int _and, int _or, struct lws_pollargs *pa)
|
||||||
pa->prev_events = pfd->events;
|
pa->prev_events = pfd->events;
|
||||||
pa->events = pfd->events = (pfd->events & ~_and) | _or;
|
pa->events = pfd->events = (pfd->events & ~_and) | _or;
|
||||||
|
|
||||||
|
//lwsl_notice("%s: wsi %p, posin %d. from %d -> %d\n", __func__, wsi, wsi->position_in_fds_table, pa->prev_events, pa->events);
|
||||||
|
|
||||||
|
|
||||||
if (wsi->http2_substream)
|
if (wsi->http2_substream)
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -147,6 +149,9 @@ insert_wsi_socket_into_fds(struct lws_context *context, struct lws *wsi)
|
||||||
if (wsi->position_in_fds_table == -1)
|
if (wsi->position_in_fds_table == -1)
|
||||||
#endif
|
#endif
|
||||||
wsi->position_in_fds_table = pt->fds_count;
|
wsi->position_in_fds_table = pt->fds_count;
|
||||||
|
|
||||||
|
// lwsl_notice("%s: %p: setting posinfds %d\n", __func__, wsi, wsi->position_in_fds_table);
|
||||||
|
|
||||||
pt->fds[wsi->position_in_fds_table].fd = wsi->sock;
|
pt->fds[wsi->position_in_fds_table].fd = wsi->sock;
|
||||||
#if LWS_POSIX
|
#if LWS_POSIX
|
||||||
pt->fds[wsi->position_in_fds_table].events = LWS_POLLIN;
|
pt->fds[wsi->position_in_fds_table].events = LWS_POLLIN;
|
||||||
|
|
|
@ -701,6 +701,7 @@ struct lws_context_per_thread {
|
||||||
|
|
||||||
short ah_count_in_use;
|
short ah_count_in_use;
|
||||||
unsigned char tid;
|
unsigned char tid;
|
||||||
|
unsigned char lock_depth;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1752,13 +1753,15 @@ lws_pt_mutex_destroy(struct lws_context_per_thread *pt)
|
||||||
static LWS_INLINE void
|
static LWS_INLINE void
|
||||||
lws_pt_lock(struct lws_context_per_thread *pt)
|
lws_pt_lock(struct lws_context_per_thread *pt)
|
||||||
{
|
{
|
||||||
pthread_mutex_lock(&pt->lock);
|
if (!pt->lock_depth++)
|
||||||
|
pthread_mutex_lock(&pt->lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
static LWS_INLINE void
|
static LWS_INLINE void
|
||||||
lws_pt_unlock(struct lws_context_per_thread *pt)
|
lws_pt_unlock(struct lws_context_per_thread *pt)
|
||||||
{
|
{
|
||||||
pthread_mutex_unlock(&pt->lock);
|
if (!(--pt->lock_depth))
|
||||||
|
pthread_mutex_unlock(&pt->lock);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
#define lws_pt_mutex_init(_a) (void)(_a)
|
#define lws_pt_mutex_init(_a) (void)(_a)
|
||||||
|
|
|
@ -39,8 +39,9 @@
|
||||||
|
|
||||||
static int deny_deflate, longlived, mirror_lifetime;
|
static int deny_deflate, longlived, mirror_lifetime;
|
||||||
static struct lws *wsi_dumb, *wsi_mirror;
|
static struct lws *wsi_dumb, *wsi_mirror;
|
||||||
|
static struct lws *wsi_multi[3];
|
||||||
static volatile int force_exit;
|
static volatile int force_exit;
|
||||||
static unsigned int opts;
|
static unsigned int opts, rl_multi[3];
|
||||||
static int flag_no_mirror_traffic;
|
static int flag_no_mirror_traffic;
|
||||||
#if defined(LWS_USE_POLARSSL)
|
#if defined(LWS_USE_POLARSSL)
|
||||||
#else
|
#else
|
||||||
|
@ -87,6 +88,8 @@ 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)
|
||||||
{
|
{
|
||||||
const char *which = "http";
|
const char *which = "http";
|
||||||
|
char which_wsi[10];
|
||||||
|
int n;
|
||||||
|
|
||||||
switch (reason) {
|
switch (reason) {
|
||||||
|
|
||||||
|
@ -116,6 +119,13 @@ callback_dumb_increment(struct lws *wsi, enum lws_callback_reasons reason,
|
||||||
wsi_mirror = NULL;
|
wsi_mirror = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (n = 0; n < ARRAY_SIZE(wsi_multi); n++)
|
||||||
|
if (wsi == wsi_multi[n]) {
|
||||||
|
sprintf(which_wsi, "multi %d", n);
|
||||||
|
which = which_wsi;
|
||||||
|
wsi_multi[n] = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
lwsl_err("CLIENT_CONNECTION_ERROR: %s: %s %p\n", which, in);
|
lwsl_err("CLIENT_CONNECTION_ERROR: %s: %s %p\n", which, in);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -152,6 +162,10 @@ callback_dumb_increment(struct lws *wsi, enum lws_callback_reasons reason,
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case LWS_CALLBACK_CLIENT_WRITEABLE:
|
||||||
|
lwsl_notice("Client wsi %p writable\n", wsi);
|
||||||
|
break;
|
||||||
|
|
||||||
case LWS_CALLBACK_COMPLETED_CLIENT_HTTP:
|
case LWS_CALLBACK_COMPLETED_CLIENT_HTTP:
|
||||||
wsi_dumb = NULL;
|
wsi_dumb = NULL;
|
||||||
force_exit = 1;
|
force_exit = 1;
|
||||||
|
@ -322,6 +336,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' },
|
||||||
|
{ "multi-test", no_argument, NULL, 'm' },
|
||||||
{ "nomirror", no_argument, NULL, 'n' },
|
{ "nomirror", no_argument, NULL, 'n' },
|
||||||
{ "longlived", no_argument, NULL, 'l' },
|
{ "longlived", no_argument, NULL, 'l' },
|
||||||
{ "pingpong-secs", required_argument, NULL, 'P' },
|
{ "pingpong-secs", required_argument, NULL, 'P' },
|
||||||
|
@ -350,8 +365,8 @@ static int ratelimit_connects(unsigned int *last, unsigned int secs)
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
int n = 0, ret = 0, port = 7681, use_ssl = 0, ietf_version = -1;
|
int n = 0, m, ret = 0, port = 7681, use_ssl = 0, ietf_version = -1;
|
||||||
unsigned int rl_dumb = 0, rl_mirror = 0, do_ws = 1, pp_secs = 0;
|
unsigned int rl_dumb = 0, rl_mirror = 0, do_ws = 1, pp_secs = 0, do_multi = 0;
|
||||||
struct lws_context_creation_info info;
|
struct lws_context_creation_info info;
|
||||||
struct lws_client_connect_info i;
|
struct lws_client_connect_info i;
|
||||||
struct lws_context *context;
|
struct lws_context *context;
|
||||||
|
@ -370,7 +385,7 @@ int main(int argc, char **argv)
|
||||||
goto usage;
|
goto usage;
|
||||||
|
|
||||||
while (n >= 0) {
|
while (n >= 0) {
|
||||||
n = getopt_long(argc, argv, "Snuv:hsp:d:lC:K:A:P:", options, NULL);
|
n = getopt_long(argc, argv, "Snuv:hsp:d:lC:K:A:P:m", options, NULL);
|
||||||
if (n < 0)
|
if (n < 0)
|
||||||
continue;
|
continue;
|
||||||
switch (n) {
|
switch (n) {
|
||||||
|
@ -401,6 +416,9 @@ int main(int argc, char **argv)
|
||||||
case 'u':
|
case 'u':
|
||||||
deny_deflate = 1;
|
deny_deflate = 1;
|
||||||
break;
|
break;
|
||||||
|
case 'm':
|
||||||
|
do_multi = 1;
|
||||||
|
break;
|
||||||
case 'n':
|
case 'n':
|
||||||
flag_no_mirror_traffic = 1;
|
flag_no_mirror_traffic = 1;
|
||||||
lwsl_notice("Disabled sending mirror data (for pingpong testing)\n");
|
lwsl_notice("Disabled sending mirror data (for pingpong testing)\n");
|
||||||
|
@ -544,30 +562,52 @@ int main(int argc, char **argv)
|
||||||
* asynchronously.
|
* asynchronously.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
m = 0;
|
||||||
while (!force_exit) {
|
while (!force_exit) {
|
||||||
|
|
||||||
if (do_ws) {
|
if (do_multi) {
|
||||||
if (!wsi_dumb && ratelimit_connects(&rl_dumb, 2u)) {
|
for (n = 0; n < ARRAY_SIZE(wsi_multi); n++) {
|
||||||
lwsl_notice("dumb: connecting\n");
|
if (!wsi_multi[n] && ratelimit_connects(&rl_multi[n], 2u)) {
|
||||||
i.protocol = protocols[PROTOCOL_DUMB_INCREMENT].name;
|
lwsl_notice("dumb %d: connecting\n", n);
|
||||||
i.pwsi = &wsi_dumb;
|
i.protocol = protocols[PROTOCOL_DUMB_INCREMENT].name;
|
||||||
lws_client_connect_via_info(&i);
|
i.pwsi = &wsi_multi[n];
|
||||||
|
lws_client_connect_via_info(&i);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
|
||||||
if (!wsi_mirror && ratelimit_connects(&rl_mirror, 2u)) {
|
if (do_ws) {
|
||||||
lwsl_notice("mirror: connecting\n");
|
if (!wsi_dumb && ratelimit_connects(&rl_dumb, 2u)) {
|
||||||
i.protocol = protocols[PROTOCOL_LWS_MIRROR].name;
|
lwsl_notice("dumb: connecting\n");
|
||||||
i.pwsi = &wsi_mirror;
|
i.protocol = protocols[PROTOCOL_DUMB_INCREMENT].name;
|
||||||
wsi_mirror = lws_client_connect_via_info(&i);
|
i.pwsi = &wsi_dumb;
|
||||||
}
|
lws_client_connect_via_info(&i);
|
||||||
} else
|
}
|
||||||
if (!wsi_dumb && ratelimit_connects(&rl_dumb, 2u)) {
|
|
||||||
lwsl_notice("http: connecting\n");
|
if (!wsi_mirror && ratelimit_connects(&rl_mirror, 2u)) {
|
||||||
i.pwsi = &wsi_dumb;
|
lwsl_notice("mirror: connecting\n");
|
||||||
lws_client_connect_via_info(&i);
|
i.protocol = protocols[PROTOCOL_LWS_MIRROR].name;
|
||||||
}
|
i.pwsi = &wsi_mirror;
|
||||||
|
wsi_mirror = lws_client_connect_via_info(&i);
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
if (!wsi_dumb && ratelimit_connects(&rl_dumb, 2u)) {
|
||||||
|
lwsl_notice("http: connecting\n");
|
||||||
|
i.pwsi = &wsi_dumb;
|
||||||
|
lws_client_connect_via_info(&i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
lws_service(context, 500);
|
lws_service(context, 500);
|
||||||
|
|
||||||
|
if (do_multi) {
|
||||||
|
m++;
|
||||||
|
if (m == 10) {
|
||||||
|
m = 0;
|
||||||
|
lwsl_notice("doing lws_callback_on_writable_all_protocol\n");
|
||||||
|
lws_callback_on_writable_all_protocol(context, &protocols[PROTOCOL_DUMB_INCREMENT]);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
lwsl_err("Exiting\n");
|
lwsl_err("Exiting\n");
|
||||||
|
|
Loading…
Add table
Reference in a new issue