From 903efd6d1d7e2f6399d20b3a9ed290a69e0d6395 Mon Sep 17 00:00:00 2001 From: Tiago Medicci Date: Fri, 12 Jun 2026 10:46:56 -0300 Subject: [PATCH 1/4] netutils/libwebsockets: Remove hard dependency on mbedTLS libwebsockets can be built without TLS support. To allow this, it was necessary to create a specific Kconfig option that enables TLS support if OPENSSL_MBEDTLS_WRAPPER is enabled. Otherwise, TLS is not supported (but libwebsockets can still be used with plain ws:// connections). Signed-off-by: Tiago Medicci --- netutils/libwebsockets/CMakeLists.txt | 21 ++++++++++++++------- netutils/libwebsockets/Kconfig | 11 ++++++++++- netutils/libwebsockets/Make.defs | 6 ++++-- netutils/libwebsockets/Makefile | 4 +++- netutils/libwebsockets/lws_config.h | 8 +++++--- 5 files changed, 36 insertions(+), 14 deletions(-) diff --git a/netutils/libwebsockets/CMakeLists.txt b/netutils/libwebsockets/CMakeLists.txt index 7977f931179..717788f134b 100644 --- a/netutils/libwebsockets/CMakeLists.txt +++ b/netutils/libwebsockets/CMakeLists.txt @@ -21,7 +21,7 @@ if(CONFIG_NETUTILS_LIBWEBSOCKETS) # ############################################################################ - # Config and Fetch MbedTLS lib + # Config and Fetch libwebsockets # ############################################################################ set(LIBWEBSOCKETS_DIR ${CMAKE_CURRENT_LIST_DIR}/libwebsockets) @@ -66,7 +66,7 @@ if(CONFIG_NETUTILS_LIBWEBSOCKETS) -Wno-shadow) set(INCDIR - . + ${CMAKE_CURRENT_LIST_DIR} ${LIBWEBSOCKETS_DIR}/lib/core ${LIBWEBSOCKETS_DIR}/lib/plat/unix ${LIBWEBSOCKETS_DIR}/lib/event-libs @@ -78,9 +78,7 @@ if(CONFIG_NETUTILS_LIBWEBSOCKETS) ${LIBWEBSOCKETS_DIR}/lib/roles/h1 ${LIBWEBSOCKETS_DIR}/lib/roles/h2 ${LIBWEBSOCKETS_DIR}/lib/roles/ws - ${LIBWEBSOCKETS_DIR}/lib/tls - ${LIBWEBSOCKETS_DIR}/lib/tls/mbedtls/wrapper/include - ${LIBWEBSOCKETS_DIR}/lib/tls/mbedtls/wrapper/include/internal) + ${LIBWEBSOCKETS_DIR}/lib/tls) set(CSRCS ${LIBWEBSOCKETS_DIR}/lib/plat/unix/unix-caps.c @@ -146,7 +144,14 @@ if(CONFIG_NETUTILS_LIBWEBSOCKETS) ${LIBWEBSOCKETS_DIR}/lib/roles/raw-skt/ops-raw-skt.c ${LIBWEBSOCKETS_DIR}/lib/roles/raw-file/ops-raw-file.c ${LIBWEBSOCKETS_DIR}/lib/roles/http/client/client-http.c - ${LIBWEBSOCKETS_DIR}/lib/event-libs/poll/poll.c + ${LIBWEBSOCKETS_DIR}/lib/event-libs/poll/poll.c) + + if(CONFIG_NETUTILS_LIBWEBSOCKETS_TLS) + list(APPEND INCDIR ${LIBWEBSOCKETS_DIR}/lib/tls/mbedtls/wrapper/include + ${LIBWEBSOCKETS_DIR}/lib/tls/mbedtls/wrapper/include/internal) + list( + APPEND + CSRCS ${LIBWEBSOCKETS_DIR}/lib/tls/tls.c ${LIBWEBSOCKETS_DIR}/lib/tls/tls-network.c ${LIBWEBSOCKETS_DIR}/lib/tls/tls-sessions.c @@ -157,6 +162,7 @@ if(CONFIG_NETUTILS_LIBWEBSOCKETS) ${LIBWEBSOCKETS_DIR}/lib/tls/mbedtls/mbedtls-ssl.c ${LIBWEBSOCKETS_DIR}/lib/tls/mbedtls/mbedtls-session.c ${LIBWEBSOCKETS_DIR}/lib/tls/mbedtls/mbedtls-client.c) + endif() if(CONFIG_NETUTILS_MQTTC) list(APPEND INCDIR ${LIBWEBSOCKETS_DIR}/lib/roles/mqtt) @@ -178,7 +184,8 @@ if(CONFIG_NETUTILS_LIBWEBSOCKETS) set_property( TARGET nuttx APPEND - PROPERTY NUTTX_INCLUDE_DIRECTORIES ${LIBWEBSOCKETS_DIR}/include) + PROPERTY NUTTX_INCLUDE_DIRECTORIES ${LIBWEBSOCKETS_DIR}/include + ${CMAKE_CURRENT_LIST_DIR}) nuttx_add_library(libwebsockets STATIC) target_sources(libwebsockets PRIVATE ${CSRCS}) diff --git a/netutils/libwebsockets/Kconfig b/netutils/libwebsockets/Kconfig index 07686db68e8..0e127e2863b 100644 --- a/netutils/libwebsockets/Kconfig +++ b/netutils/libwebsockets/Kconfig @@ -6,7 +6,7 @@ config NETUTILS_LIBWEBSOCKETS bool "libwebsockets library (current version)" default n - depends on NET && OPENSSL_MBEDTLS_WRAPPER + depends on NET ---help--- Enables the libwebsockets library. @@ -16,4 +16,13 @@ config NETUTILS_LIBWEBSOCKETS_VERSION string "Version number" default "4.3.1" +config NETUTILS_LIBWEBSOCKETS_TLS + bool "Enable TLS support" + default y + depends on OPENSSL_MBEDTLS_WRAPPER + ---help--- + Enable TLS in libwebsockets via the OpenSSL-mbedTLS + wrapper. Requires CONFIG_OPENSSL_MBEDTLS_WRAPPER. + When disabled, only plain ws:// connections are supported. + endif diff --git a/netutils/libwebsockets/Make.defs b/netutils/libwebsockets/Make.defs index 13fe3849c63..58ebdbb3e17 100644 --- a/netutils/libwebsockets/Make.defs +++ b/netutils/libwebsockets/Make.defs @@ -25,7 +25,9 @@ CONFIGURED_APPS += $(APPDIR)/netutils/libwebsockets # Allows `.h>` import. -CFLAGS += ${INCDIR_PREFIX}$(APPDIR)/netutils/libwebsockets/libwebsockets/include -CXXFLAGS += ${INCDIR_PREFIX}$(APPDIR)/netutils/libwebsockets/libwebsockets/include +CFLAGS += ${INCDIR_PREFIX}$(APPDIR)/netutils/libwebsockets +CFLAGS += ${INCDIR_PREFIX}$(APPDIR)/netutils/libwebsockets/libwebsockets/include +CXXFLAGS += ${INCDIR_PREFIX}$(APPDIR)/netutils/libwebsockets +CXXFLAGS += ${INCDIR_PREFIX}$(APPDIR)/netutils/libwebsockets/libwebsockets/include endif diff --git a/netutils/libwebsockets/Makefile b/netutils/libwebsockets/Makefile index ad8c0c5e6c8..2dbe644792a 100644 --- a/netutils/libwebsockets/Makefile +++ b/netutils/libwebsockets/Makefile @@ -118,6 +118,7 @@ CSRCS += \ $(LIBWEBSOCKETS_UNPACK)/lib/roles/http/client/client-http.c \ $(LIBWEBSOCKETS_UNPACK)/lib/event-libs/poll/poll.c +ifneq ($(CONFIG_NETUTILS_LIBWEBSOCKETS_TLS),) CSRCS += \ $(LIBWEBSOCKETS_UNPACK)/lib/tls/tls.c \ $(LIBWEBSOCKETS_UNPACK)/lib/tls/tls-network.c \ @@ -128,7 +129,8 @@ CSRCS += \ $(LIBWEBSOCKETS_UNPACK)/lib/tls/mbedtls/mbedtls-x509.c \ $(LIBWEBSOCKETS_UNPACK)/lib/tls/mbedtls/mbedtls-ssl.c \ $(LIBWEBSOCKETS_UNPACK)/lib/tls/mbedtls/mbedtls-session.c \ - $(LIBWEBSOCKETS_UNPACK)/lib/tls/mbedtls/mbedtls-client.c \ + $(LIBWEBSOCKETS_UNPACK)/lib/tls/mbedtls/mbedtls-client.c +endif ifneq ($(CONFIG_NETUTILS_MQTTC),) CFLAGS += -I$(LIBWEBSOCKETS_UNPACK)/lib/roles/mqtt diff --git a/netutils/libwebsockets/lws_config.h b/netutils/libwebsockets/lws_config.h index 3fe970b4772..6a4bcb79bec 100644 --- a/netutils/libwebsockets/lws_config.h +++ b/netutils/libwebsockets/lws_config.h @@ -106,7 +106,7 @@ #define LWS_HAVE_MALLOC_H /* #define LWS_HAVE_MALLOC_TRIM */ #define LWS_HAVE_MALLOC_USABLE_SIZE -#ifdef CONFIG_CRYPTO_MBEDTLS +#ifdef CONFIG_NETUTILS_LIBWEBSOCKETS_TLS #define LWS_HAVE_mbedtls_md_setup #define LWS_HAVE_mbedtls_net_init #define LWS_HAVE_mbedtls_rsa_complete @@ -187,8 +187,10 @@ /* #undef LWS_NO_CLIENT */ #define LWS_NO_DAEMONIZE +#ifdef CONFIG_NETUTILS_LIBWEBSOCKETS_TLS #define LWS_OPENSSL_CLIENT_CERTS "/etc/ssl/certs" #define LWS_OPENSSL_SUPPORT +#endif /* #undef LWS_PLAT_OPTEE */ #define LWS_PLAT_UNIX /* #undef LWS_PLAT_FREERTOS */ @@ -281,7 +283,7 @@ /* #undef LWS_WITH_SDEVENT */ #define LWS_WITH_LWSAC #define LWS_LOGS_TIMESTAMP -#ifdef CONFIG_CRYPTO_MBEDTLS +#ifdef CONFIG_NETUTILS_LIBWEBSOCKETS_TLS #define LWS_WITH_MBEDTLS #endif /* #undef LWS_WITH_MINIZ */ @@ -355,7 +357,7 @@ /* #undef LWS_WITH_SYS_NTPCLIENT */ #define LWS_WITH_SYS_STATE /* #undef LWS_WITH_THREADPOOL */ -#ifdef CONFIG_CRYPTO_MBEDTLS +#ifdef CONFIG_NETUTILS_LIBWEBSOCKETS_TLS #define LWS_WITH_TLS /* #undef LWS_WITH_TLS_JIT_TRUST */ #define LWS_WITH_TLS_SESSIONS From c4fee53d0e093da7d58ce242b74da641ce1e6055 Mon Sep 17 00:00:00 2001 From: Tiago Medicci Date: Fri, 12 Jun 2026 10:50:38 -0300 Subject: [PATCH 2/4] netutils/libwebsockets: Enable libwebsockets server This commit enables building libwebsockets server based on a new Kconfig entry. Signed-off-by: Tiago Medicci --- netutils/libwebsockets/CMakeLists.txt | 10 +++++++++- netutils/libwebsockets/Kconfig | 7 +++++++ netutils/libwebsockets/Makefile | 12 +++++++++++- netutils/libwebsockets/lws_config.h | 4 +++- 4 files changed, 30 insertions(+), 3 deletions(-) diff --git a/netutils/libwebsockets/CMakeLists.txt b/netutils/libwebsockets/CMakeLists.txt index 717788f134b..ed3f586747d 100644 --- a/netutils/libwebsockets/CMakeLists.txt +++ b/netutils/libwebsockets/CMakeLists.txt @@ -63,7 +63,8 @@ if(CONFIG_NETUTILS_LIBWEBSOCKETS) -DLWS_LIBRARY_VERSION_PATCH=${VERSION_PATCH} -DLWS_LIBRARY_VERSION_PATCH_ELABORATED=${VERSION_PATCH}-unknown -DLWS_LIBRARY_VERSION="${CONFIG_NETUTILS_LIBWEBSOCKETS_VERSION}-unknown" - -Wno-shadow) + -Wno-shadow + -Wno-format) set(INCDIR ${CMAKE_CURRENT_LIST_DIR} @@ -146,6 +147,13 @@ if(CONFIG_NETUTILS_LIBWEBSOCKETS) ${LIBWEBSOCKETS_DIR}/lib/roles/http/client/client-http.c ${LIBWEBSOCKETS_DIR}/lib/event-libs/poll/poll.c) + if(CONFIG_NETUTILS_LIBWEBSOCKETS_SERVER) + list(APPEND INCDIR ${LIBWEBSOCKETS_DIR}/lib/roles/http/server) + list(APPEND CSRCS ${LIBWEBSOCKETS_DIR}/lib/roles/ws/server-ws.c + ${LIBWEBSOCKETS_DIR}/lib/roles/http/server/server.c + ${LIBWEBSOCKETS_DIR}/lib/roles/listen/ops-listen.c) + endif() + if(CONFIG_NETUTILS_LIBWEBSOCKETS_TLS) list(APPEND INCDIR ${LIBWEBSOCKETS_DIR}/lib/tls/mbedtls/wrapper/include ${LIBWEBSOCKETS_DIR}/lib/tls/mbedtls/wrapper/include/internal) diff --git a/netutils/libwebsockets/Kconfig b/netutils/libwebsockets/Kconfig index 0e127e2863b..36c904906df 100644 --- a/netutils/libwebsockets/Kconfig +++ b/netutils/libwebsockets/Kconfig @@ -16,6 +16,13 @@ config NETUTILS_LIBWEBSOCKETS_VERSION string "Version number" default "4.3.1" +config NETUTILS_LIBWEBSOCKETS_SERVER + bool "Enable server support" + default n + ---help--- + Enable WebSocket/HTTP server support in libwebsockets. + When disabled, only client-side code is built. + config NETUTILS_LIBWEBSOCKETS_TLS bool "Enable TLS support" default y diff --git a/netutils/libwebsockets/Makefile b/netutils/libwebsockets/Makefile index 2dbe644792a..ff28433cee0 100644 --- a/netutils/libwebsockets/Makefile +++ b/netutils/libwebsockets/Makefile @@ -35,7 +35,8 @@ CFLAGS += \ -DLWS_LIBRARY_VERSION_MINOR=$(call word-dot,$(LIBWEBSOCKETS_VERSION),2) \ -DLWS_LIBRARY_VERSION_PATCH=$(call word-dot,$(LIBWEBSOCKETS_VERSION),3) \ -DLWS_LIBRARY_VERSION_PATCH_ELABORATED=$(call word-dot,$(LIBWEBSOCKETS_VERSION),3)-unknown \ - -DLWS_LIBRARY_VERSION=\"$(LIBWEBSOCKETS_VERSION)-unknown\" + -DLWS_LIBRARY_VERSION=\"$(LIBWEBSOCKETS_VERSION)-unknown\" \ + -Wno-shadow -Wno-format CFLAGS += \ -I. \ @@ -118,6 +119,15 @@ CSRCS += \ $(LIBWEBSOCKETS_UNPACK)/lib/roles/http/client/client-http.c \ $(LIBWEBSOCKETS_UNPACK)/lib/event-libs/poll/poll.c +ifneq ($(CONFIG_NETUTILS_LIBWEBSOCKETS_SERVER),) +CSRCS += \ + $(LIBWEBSOCKETS_UNPACK)/lib/roles/ws/server-ws.c \ + $(LIBWEBSOCKETS_UNPACK)/lib/roles/http/server/server.c \ + $(LIBWEBSOCKETS_UNPACK)/lib/roles/listen/ops-listen.c + +CFLAGS += -I$(LIBWEBSOCKETS_UNPACK)/lib/roles/http/server +endif + ifneq ($(CONFIG_NETUTILS_LIBWEBSOCKETS_TLS),) CSRCS += \ $(LIBWEBSOCKETS_UNPACK)/lib/tls/tls.c \ diff --git a/netutils/libwebsockets/lws_config.h b/netutils/libwebsockets/lws_config.h index 6a4bcb79bec..02fb9ef2c53 100644 --- a/netutils/libwebsockets/lws_config.h +++ b/netutils/libwebsockets/lws_config.h @@ -294,7 +294,9 @@ #define LWS_WITH_CACHE_NSCOOKIEJAR #define LWS_WITH_CLIENT #define LWS_WITHOUT_EXTENSIONS -/* #undef LWS_WITH_SERVER */ +#ifdef CONFIG_NETUTILS_LIBWEBSOCKETS_SERVER +#define LWS_WITH_SERVER +#endif /* #undef LWS_WITH_SPAWN */ From 5472995d1224e7826d4e318dc91bf2f69463a8ee Mon Sep 17 00:00:00 2001 From: Tiago Medicci Date: Fri, 12 Jun 2026 17:17:15 -0300 Subject: [PATCH 3/4] netutils/libwebsockets: Fix error regarding building with CMake Prior to this change, if an empty folder existed instead of the actual libwebsockets source, the build would fail. This commit checks for an actual file instead, avoid such kind of errors. Signed-off-by: Tiago Medicci --- netutils/libwebsockets/CMakeLists.txt | 34 ++++++++++++++++++++------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/netutils/libwebsockets/CMakeLists.txt b/netutils/libwebsockets/CMakeLists.txt index ed3f586747d..8f308e2929f 100644 --- a/netutils/libwebsockets/CMakeLists.txt +++ b/netutils/libwebsockets/CMakeLists.txt @@ -26,12 +26,19 @@ if(CONFIG_NETUTILS_LIBWEBSOCKETS) set(LIBWEBSOCKETS_DIR ${CMAKE_CURRENT_LIST_DIR}/libwebsockets) - if(NOT EXISTS ${LIBWEBSOCKETS_DIR}) + # Match Makefile: strip kconfig quotes; default when olddefconfig has not run + set(LWS_VERSION ${CONFIG_NETUTILS_LIBWEBSOCKETS_VERSION}) + string(REGEX REPLACE "^\"(.*)\"$" "\\1" LWS_VERSION "${LWS_VERSION}") + if(NOT LWS_VERSION) + set(LWS_VERSION "4.3.1") + endif() + + if(NOT EXISTS "${LIBWEBSOCKETS_DIR}/lib/plat/unix/unix-caps.c") set(LIBWEBSOCKETS_URL "https://github.com/warmcat/libwebsockets/archive") FetchContent_Declare( libwebsockets_fetch - URL ${LIBWEBSOCKETS_URL}/v${CONFIG_NETUTILS_LIBWEBSOCKETS_VERSION}.zip - SOURCE_DIR ${LIBWEBSOCKETS_DIR} BINARY_DIR + URL ${LIBWEBSOCKETS_URL}/v${LWS_VERSION}.zip SOURCE_DIR + ${LIBWEBSOCKETS_DIR} BINARY_DIR ${CMAKE_BINARY_DIR}/apps/netutils/libwebsockets/libwebsockets DOWNLOAD_NO_PROGRESS true TIMEOUT 30) @@ -52,17 +59,26 @@ if(CONFIG_NETUTILS_LIBWEBSOCKETS) # Flags # ############################################################################ - string(REGEX MATCHALL "[0-9]" versions - "${CONFIG_NETUTILS_LIBWEBSOCKETS_VERSION}") - list(GET versions 0 VERSION_MAJOR) - list(GET versions 1 VERSION_MINOR) - list(GET versions 2 VERSION_PATCH) + string(REPLACE "." ";" LWS_VERSION_PARTS "${LWS_VERSION}") + list(GET LWS_VERSION_PARTS 0 VERSION_MAJOR) + list(LENGTH LWS_VERSION_PARTS LWS_VERSION_PARTS_LEN) + if(LWS_VERSION_PARTS_LEN GREATER 1) + list(GET LWS_VERSION_PARTS 1 VERSION_MINOR) + else() + set(VERSION_MINOR 0) + endif() + if(LWS_VERSION_PARTS_LEN GREATER 2) + list(GET LWS_VERSION_PARTS 2 VERSION_PATCH) + else() + set(VERSION_PATCH 0) + endif() + set(FLAGS -DLWS_LIBRARY_VERSION_MAJOR=${VERSION_MAJOR} -DLWS_LIBRARY_VERSION_MINOR=${VERSION_MINOR} -DLWS_LIBRARY_VERSION_PATCH=${VERSION_PATCH} -DLWS_LIBRARY_VERSION_PATCH_ELABORATED=${VERSION_PATCH}-unknown - -DLWS_LIBRARY_VERSION="${CONFIG_NETUTILS_LIBWEBSOCKETS_VERSION}-unknown" + -DLWS_LIBRARY_VERSION="${LWS_VERSION}-unknown" -Wno-shadow -Wno-format) From ef9f49f54716595433c3c47acb57f7711d23e4b1 Mon Sep 17 00:00:00 2001 From: Tiago Medicci Date: Fri, 12 Jun 2026 16:15:38 -0300 Subject: [PATCH 4/4] examples/lws_echo: Add a simple websocket server example This commit adds a simple websocket server example that echoes data back to the client using libwebsockets. Signed-off-by: Tiago Medicci --- examples/lws_echo/CMakeLists.txt | 37 ++++++ examples/lws_echo/Kconfig | 31 +++++ examples/lws_echo/Make.defs | 25 ++++ examples/lws_echo/Makefile | 32 +++++ examples/lws_echo/lws_echo_main.c | 203 ++++++++++++++++++++++++++++++ 5 files changed, 328 insertions(+) create mode 100644 examples/lws_echo/CMakeLists.txt create mode 100644 examples/lws_echo/Kconfig create mode 100644 examples/lws_echo/Make.defs create mode 100644 examples/lws_echo/Makefile create mode 100644 examples/lws_echo/lws_echo_main.c diff --git a/examples/lws_echo/CMakeLists.txt b/examples/lws_echo/CMakeLists.txt new file mode 100644 index 00000000000..d959489f6ed --- /dev/null +++ b/examples/lws_echo/CMakeLists.txt @@ -0,0 +1,37 @@ +# ############################################################################## +# apps/examples/lws_echo/CMakeLists.txt +# +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed to the Apache Software Foundation (ASF) under one or more contributor +# license agreements. See the NOTICE file distributed with this work for +# additional information regarding copyright ownership. The ASF licenses this +# file to you under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. +# +# ############################################################################## + +if(CONFIG_EXAMPLES_LWS_ECHO) + nuttx_add_application( + NAME + ${CONFIG_EXAMPLES_LWS_ECHO_PROGNAME} + PRIORITY + ${CONFIG_EXAMPLES_LWS_ECHO_PRIORITY} + STACKSIZE + ${CONFIG_EXAMPLES_LWS_ECHO_STACKSIZE} + MODULE + ${CONFIG_EXAMPLES_LWS_ECHO} + DEPENDS + libwebsockets + SRCS + lws_echo_main.c) +endif() diff --git a/examples/lws_echo/Kconfig b/examples/lws_echo/Kconfig new file mode 100644 index 00000000000..b58daa24e07 --- /dev/null +++ b/examples/lws_echo/Kconfig @@ -0,0 +1,31 @@ +# +# For a description of the syntax of this configuration file, +# see the file kconfig-language.txt in the NuttX tools repository. +# + +config EXAMPLES_LWS_ECHO + tristate "libwebsockets WebSocket echo server" + default n + depends on NETUTILS_LIBWEBSOCKETS && NETUTILS_LIBWEBSOCKETS_SERVER + ---help--- + Simple WebSocket echo server using libwebsockets without TLS. + +if EXAMPLES_LWS_ECHO + +config EXAMPLES_LWS_ECHO_PROGNAME + string "Program name" + default "lws_echo" + +config EXAMPLES_LWS_ECHO_PRIORITY + int "Task priority" + default 100 + +config EXAMPLES_LWS_ECHO_STACKSIZE + int "Stack size" + default 16384 + +config EXAMPLES_LWS_ECHO_PORT + int "WebSocket server TCP port" + default 9000 + +endif diff --git a/examples/lws_echo/Make.defs b/examples/lws_echo/Make.defs new file mode 100644 index 00000000000..b0a46ccd58e --- /dev/null +++ b/examples/lws_echo/Make.defs @@ -0,0 +1,25 @@ +############################################################################ +# apps/examples/lws_echo/Make.defs +# +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. The +# ASF licenses this file to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance with the +# License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +# +############################################################################ + +ifneq ($(CONFIG_EXAMPLES_LWS_ECHO),) +CONFIGURED_APPS += $(APPDIR)/examples/lws_echo +endif diff --git a/examples/lws_echo/Makefile b/examples/lws_echo/Makefile new file mode 100644 index 00000000000..48da9321650 --- /dev/null +++ b/examples/lws_echo/Makefile @@ -0,0 +1,32 @@ +############################################################################ +# apps/examples/lws_echo/Makefile +# +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. The +# ASF licenses this file to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance with the +# License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +# +############################################################################ + +include $(APPDIR)/Make.defs + +PROGNAME = $(CONFIG_EXAMPLES_LWS_ECHO_PROGNAME) +PRIORITY = $(CONFIG_EXAMPLES_LWS_ECHO_PRIORITY) +STACKSIZE = $(CONFIG_EXAMPLES_LWS_ECHO_STACKSIZE) +MODULE = $(CONFIG_EXAMPLES_LWS_ECHO) + +MAINSRC = lws_echo_main.c + +include $(APPDIR)/Application.mk diff --git a/examples/lws_echo/lws_echo_main.c b/examples/lws_echo/lws_echo_main.c new file mode 100644 index 00000000000..48bf644f011 --- /dev/null +++ b/examples/lws_echo/lws_echo_main.c @@ -0,0 +1,203 @@ +/**************************************************************************** + * apps/examples/lws_echo/lws_echo_main.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include +#include + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#ifndef CONFIG_EXAMPLES_LWS_ECHO_PORT +# define CONFIG_EXAMPLES_LWS_ECHO_PORT 9000 +#endif + +#define LWS_ECHO_IOBUF_SIZE 256 + +/**************************************************************************** + * Private Types + ****************************************************************************/ + +struct lws_echo_session_s +{ + unsigned char buf[LWS_PRE + LWS_ECHO_IOBUF_SIZE]; + size_t len; + int pending; +}; + +/**************************************************************************** + * Private Function Prototypes + ****************************************************************************/ + +static int callback_echo(struct lws *wsi, + enum lws_callback_reasons reason, + void *user, void *in, size_t len); + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +static const struct lws_protocols g_protocols[] = +{ + { + "echo-protocol", + callback_echo, + sizeof(struct lws_echo_session_s), + LWS_ECHO_IOBUF_SIZE, + 0, NULL, 0 + }, + LWS_PROTOCOL_LIST_TERM +}; + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: callback_echo + * + * Description: + * libwebsockets protocol callback for the echo server. + * + * Input Parameters: + * wsi - Websocket instance. + * reason - Callback reason. + * user - Per-session data. + * in - Received data. + * len - Length of received data. + * + * Returned Value: + * Zero on success; non-zero on failure. + * + ****************************************************************************/ + +static int callback_echo(struct lws *wsi, + enum lws_callback_reasons reason, + void *user, void *in, size_t len) +{ + struct lws_echo_session_s *pss = (struct lws_echo_session_s *)user; + + switch (reason) + { + case LWS_CALLBACK_ESTABLISHED: + printf("lws_echo: client connected\n"); + pss->pending = 0; + break; + + case LWS_CALLBACK_RECEIVE: + if (len > sizeof(pss->buf) - LWS_PRE) + { + len = sizeof(pss->buf) - LWS_PRE; + } + + memcpy(&pss->buf[LWS_PRE], in, len); + pss->len = len; + pss->pending = 1; + lws_callback_on_writable(wsi); + break; + + case LWS_CALLBACK_SERVER_WRITEABLE: + if (!pss->pending) + { + break; + } + + lws_write(wsi, &pss->buf[LWS_PRE], pss->len, LWS_WRITE_TEXT); + pss->pending = 0; + break; + + case LWS_CALLBACK_CLOSED: + printf("lws_echo: client disconnected\n"); + break; + + default: + break; + } + + return 0; +} + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: main + * + * Description: + * Start a libwebsockets WebSocket echo server. + * + * Input Parameters: + * Standard argc and argv. + * + * Returned Value: + * Zero on success; non-zero on failure. + * + ****************************************************************************/ + +int main(int argc, FAR char *argv[]) +{ + struct lws_context_creation_info info; + struct lws_context *context; + int n; + + lws_set_log_level(LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE, NULL); + + printf("lws_echo: starting WebSocket echo server on port %d\n", + CONFIG_EXAMPLES_LWS_ECHO_PORT); + printf("lws_echo: connect with ws://:%d " + "(subprotocol echo-protocol)\n", + CONFIG_EXAMPLES_LWS_ECHO_PORT); + + memset(&info, 0, sizeof(info)); + info.port = CONFIG_EXAMPLES_LWS_ECHO_PORT; + info.protocols = g_protocols; + info.vhost_name = "localhost"; + info.options = 0; + + context = lws_create_context(&info); + if (context == NULL) + { + printf("lws_echo: ERROR creating context\n"); + return 1; + } + + printf("lws_echo: server running\n"); + + n = 0; + while (n >= 0) + { + n = lws_service(context, 100); + } + + lws_context_destroy(context); + printf("lws_echo: server stopped\n"); + + return 0; +}