Zephyr API Documentation 4.4.99
A Scalable Open Source RTOS
Loading...
Searching...
No Matches
shell_websocket.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2024 Nordic Semiconductor ASA
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
12
13#ifndef ZEPHYR_INCLUDE_SHELL_SHELL_WEBSOCKET_H_
14#define ZEPHYR_INCLUDE_SHELL_SHELL_WEBSOCKET_H_
15
16#include <zephyr/net/socket.h>
19#include <zephyr/shell/shell.h>
20
21#ifdef __cplusplus
22extern "C" {
23#endif
24
26
27#define SHELL_WEBSOCKET_SERVICE_COUNT CONFIG_SHELL_WEBSOCKET_BACKEND_COUNT
28
30struct shell_websocket_line_buf {
32 char buf[CONFIG_SHELL_WEBSOCKET_LINE_BUF_SIZE];
33
35 uint16_t len;
36};
37
39struct shell_websocket {
41 shell_transport_handler_t shell_handler;
42
44 void *shell_context;
45
47 struct shell_websocket_line_buf line_out;
48
50 struct zsock_pollfd fds[1];
51
53 struct k_mutex socket_lock;
54
56 uint8_t rx_buf[CONFIG_SHELL_CMD_BUFF_SIZE];
57
59 size_t rx_len;
60
62 struct k_mutex rx_lock;
63
68 struct k_work_delayable send_work;
69 struct k_work_sync work_sync;
70
72 bool output_lock;
73};
74
75extern const struct shell_transport_api shell_websocket_transport_api;
76int shell_websocket_setup(int ws_socket, struct http_request_ctx *request_ctx, void *user_data);
77int shell_websocket_enable(const struct shell *sh);
78
79#define GET_WS_NAME(_service) ws_ctx_##_service
80#define GET_WS_SHELL_NAME(_name) shell_websocket_##_name
81#define GET_WS_TRANSPORT_NAME(_service) transport_shell_ws_##_service
82#define GET_WS_DETAIL_NAME(_service) ws_res_detail_##_service
83
84#define SHELL_WEBSOCKET_DEFINE(_service) \
85 static struct shell_websocket GET_WS_NAME(_service); \
86 static struct shell_transport GET_WS_TRANSPORT_NAME(_service) = { \
87 .api = &shell_websocket_transport_api, \
88 .ctx = &GET_WS_NAME(_service), \
89 }
90
91#define SHELL_WS_PORT_NAME(_service) http_service_##_service
92#define SHELL_WS_BUF_NAME(_service) ws_recv_buffer_##_service
93#define SHELL_WS_TEMP_RECV_BUF_SIZE 256
94
95#define DEFINE_WEBSOCKET_HTTP_SERVICE(_service) \
96 uint8_t SHELL_WS_BUF_NAME(_service)[SHELL_WS_TEMP_RECV_BUF_SIZE]; \
97 struct http_resource_detail_websocket \
98 GET_WS_DETAIL_NAME(_service) = { \
99 .common = { \
100 .type = HTTP_RESOURCE_TYPE_WEBSOCKET, \
101 \
102 /* We need HTTP/1.1 GET method for upgrading */ \
103 .bitmask_of_supported_http_methods = BIT(HTTP_GET), \
104 }, \
105 .cb = shell_websocket_setup, \
106 .data_buffer = SHELL_WS_BUF_NAME(_service), \
107 .data_buffer_len = sizeof(SHELL_WS_BUF_NAME(_service)), \
108 .user_data = &GET_WS_NAME(_service), \
109 }; \
110 HTTP_RESOURCE_DEFINE(ws_resource_##_service, _service, \
111 "/" CONFIG_SHELL_WEBSOCKET_ENDPOINT_URL, \
112 &GET_WS_DETAIL_NAME(_service))
113
114#define DEFINE_WEBSOCKET_SERVICE(_service) \
115 SHELL_WEBSOCKET_DEFINE(_service); \
116 SHELL_DEFINE(shell_websocket_##_service, \
117 CONFIG_SHELL_WEBSOCKET_PROMPT, \
118 &GET_WS_TRANSPORT_NAME(_service), \
119 CONFIG_SHELL_WEBSOCKET_LOG_MESSAGE_QUEUE_SIZE, \
120 CONFIG_SHELL_WEBSOCKET_LOG_MESSAGE_QUEUE_TIMEOUT, \
121 SHELL_FLAG_OLF_CRLF); \
122 DEFINE_WEBSOCKET_HTTP_SERVICE(_service)
124
131
132#if defined(CONFIG_NET_SOCKETS_SOCKOPT_TLS)
133/* Use a secure connection only for Websocket. */
145#define WEBSOCKET_CONSOLE_DEFINE(_service, _sec_tag_list, _sec_tag_list_size) \
146 static uint16_t SHELL_WS_PORT_NAME(_service) = \
147 CONFIG_SHELL_WEBSOCKET_PORT; \
148 HTTPS_SERVICE_DEFINE(_service, \
149 CONFIG_SHELL_WEBSOCKET_IP_ADDR, \
150 &SHELL_WS_PORT_NAME(_service), \
151 SHELL_WEBSOCKET_SERVICE_COUNT, \
152 SHELL_WEBSOCKET_SERVICE_COUNT, \
153 NULL, \
154 NULL, \
155 NULL, \
156 _sec_tag_list, \
157 _sec_tag_list_size); \
158 DEFINE_WEBSOCKET_SERVICE(_service); \
159
160
161#else /* CONFIG_NET_SOCKETS_SOCKOPT_TLS */
162/* TLS not possible so define only normal HTTP service */
174#define WEBSOCKET_CONSOLE_DEFINE(_service, _sec_tag_list, _sec_tag_list_size) \
175 static uint16_t SHELL_WS_PORT_NAME(_service) = \
176 CONFIG_SHELL_WEBSOCKET_PORT; \
177 HTTP_SERVICE_DEFINE(_service, \
178 CONFIG_SHELL_WEBSOCKET_IP_ADDR, \
179 &SHELL_WS_PORT_NAME(_service), \
180 SHELL_WEBSOCKET_SERVICE_COUNT, \
181 SHELL_WEBSOCKET_SERVICE_COUNT, \
182 NULL, NULL, NULL); \
183 DEFINE_WEBSOCKET_SERVICE(_service)
184
185#endif /* CONFIG_NET_SOCKETS_SOCKOPT_TLS */
186
192#define WEBSOCKET_CONSOLE_ENABLE(_service) \
193 (void)shell_websocket_enable(&GET_WS_SHELL_NAME(_service))
194
196
197#ifdef __cplusplus
198}
199#endif
200
201#endif /* ZEPHYR_INCLUDE_SHELL_SHELL_WEBSOCKET_H_ */
void(* shell_transport_handler_t)(enum shell_transport_evt evt, void *context)
Shell transport event handler callback.
Definition shell.h:831
HTTP server API.
BSD Sockets compatible API definitions.
HTTP service API.
Header file for the shell subsystem.
__UINT8_TYPE__ uint8_t
Definition stdint.h:88
__UINT16_TYPE__ uint16_t
Definition stdint.h:89
HTTP request context.
Definition server.h:210
Unified shell transport interface.
Definition shell.h:863
Shell instance internals.
Definition shell.h:1128