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_WEBSOCKET_H_
14#define ZEPHYR_INCLUDE_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
25#define SHELL_WEBSOCKET_SERVICE_COUNT CONFIG_SHELL_WEBSOCKET_BACKEND_COUNT
26
30 char buf[CONFIG_SHELL_WEBSOCKET_LINE_BUF_SIZE];
31
34};
35
72
74int shell_websocket_setup(int ws_socket, struct http_request_ctx *request_ctx, void *user_data);
75int shell_websocket_enable(const struct shell *sh);
76
77#define GET_WS_NAME(_service) ws_ctx_##_service
78#define GET_WS_SHELL_NAME(_name) shell_websocket_##_name
79#define GET_WS_TRANSPORT_NAME(_service) transport_shell_ws_##_service
80#define GET_WS_DETAIL_NAME(_service) ws_res_detail_##_service
81
82#define SHELL_WEBSOCKET_DEFINE(_service) \
83 static struct shell_websocket GET_WS_NAME(_service); \
84 static struct shell_transport GET_WS_TRANSPORT_NAME(_service) = { \
85 .api = &shell_websocket_transport_api, \
86 .ctx = &GET_WS_NAME(_service), \
87 }
88
89#define SHELL_WS_PORT_NAME(_service) http_service_##_service
90#define SHELL_WS_BUF_NAME(_service) ws_recv_buffer_##_service
91#define SHELL_WS_TEMP_RECV_BUF_SIZE 256
92
93#define DEFINE_WEBSOCKET_HTTP_SERVICE(_service) \
94 uint8_t SHELL_WS_BUF_NAME(_service)[SHELL_WS_TEMP_RECV_BUF_SIZE]; \
95 struct http_resource_detail_websocket \
96 GET_WS_DETAIL_NAME(_service) = { \
97 .common = { \
98 .type = HTTP_RESOURCE_TYPE_WEBSOCKET, \
99 \
100 /* We need HTTP/1.1 GET method for upgrading */ \
101 .bitmask_of_supported_http_methods = BIT(HTTP_GET), \
102 }, \
103 .cb = shell_websocket_setup, \
104 .data_buffer = SHELL_WS_BUF_NAME(_service), \
105 .data_buffer_len = sizeof(SHELL_WS_BUF_NAME(_service)), \
106 .user_data = &GET_WS_NAME(_service), \
107 }; \
108 HTTP_RESOURCE_DEFINE(ws_resource_##_service, _service, \
109 "/" CONFIG_SHELL_WEBSOCKET_ENDPOINT_URL, \
110 &GET_WS_DETAIL_NAME(_service))
111
112#define DEFINE_WEBSOCKET_SERVICE(_service) \
113 SHELL_WEBSOCKET_DEFINE(_service); \
114 SHELL_DEFINE(shell_websocket_##_service, \
115 CONFIG_SHELL_WEBSOCKET_PROMPT, \
116 &GET_WS_TRANSPORT_NAME(_service), \
117 CONFIG_SHELL_WEBSOCKET_LOG_MESSAGE_QUEUE_SIZE, \
118 CONFIG_SHELL_WEBSOCKET_LOG_MESSAGE_QUEUE_TIMEOUT, \
119 SHELL_FLAG_OLF_CRLF); \
120 DEFINE_WEBSOCKET_HTTP_SERVICE(_service)
121
122#if defined(CONFIG_NET_SOCKETS_SOCKOPT_TLS)
123/* Use a secure connection only for Websocket. */
124#define WEBSOCKET_CONSOLE_DEFINE(_service, _sec_tag_list, _sec_tag_list_size) \
125 static uint16_t SHELL_WS_PORT_NAME(_service) = \
126 CONFIG_SHELL_WEBSOCKET_PORT; \
127 HTTPS_SERVICE_DEFINE(_service, \
128 CONFIG_SHELL_WEBSOCKET_IP_ADDR, \
129 &SHELL_WS_PORT_NAME(_service), \
130 SHELL_WEBSOCKET_SERVICE_COUNT, \
131 SHELL_WEBSOCKET_SERVICE_COUNT, \
132 NULL, \
133 NULL, \
134 NULL, \
135 _sec_tag_list, \
136 _sec_tag_list_size); \
137 DEFINE_WEBSOCKET_SERVICE(_service); \
138
139
140#else /* CONFIG_NET_SOCKETS_SOCKOPT_TLS */
141/* TLS not possible so define only normal HTTP service */
142#define WEBSOCKET_CONSOLE_DEFINE(_service, _sec_tag_list, _sec_tag_list_size) \
143 static uint16_t SHELL_WS_PORT_NAME(_service) = \
144 CONFIG_SHELL_WEBSOCKET_PORT; \
145 HTTP_SERVICE_DEFINE(_service, \
146 CONFIG_SHELL_WEBSOCKET_IP_ADDR, \
147 &SHELL_WS_PORT_NAME(_service), \
148 SHELL_WEBSOCKET_SERVICE_COUNT, \
149 SHELL_WEBSOCKET_SERVICE_COUNT, \
150 NULL, NULL, NULL); \
151 DEFINE_WEBSOCKET_SERVICE(_service)
152
153#endif /* CONFIG_NET_SOCKETS_SOCKOPT_TLS */
154
155#define WEBSOCKET_CONSOLE_ENABLE(_service) \
156 (void)shell_websocket_enable(&GET_WS_SHELL_NAME(_service))
157
158#ifdef __cplusplus
159}
160#endif
161
162#endif /* ZEPHYR_INCLUDE_SHELL_WEBSOCKET_H_ */
void(* shell_transport_handler_t)(enum shell_transport_evt evt, void *context)
Definition shell.h:795
BSD Sockets compatible API definitions.
HTTP server API.
HTTP service API.
#define CONFIG_SHELL_CMD_BUFF_SIZE
Definition shell.h:35
int shell_websocket_setup(int ws_socket, struct http_request_ctx *request_ctx, void *user_data)
int shell_websocket_enable(const struct shell *sh)
const struct shell_transport_api shell_websocket_transport_api
__UINT8_TYPE__ uint8_t
Definition stdint.h:88
__UINT16_TYPE__ uint16_t
Definition stdint.h:89
HTTP request context.
Definition server.h:199
Kernel mutex structure.
Definition kernel.h:3437
A structure used to submit work after a delay.
Definition kernel.h:4603
A structure holding internal state for a pending synchronous operation on a work item or queue.
Definition kernel.h:4698
Unified shell transport interface.
Definition shell.h:818
Line buffer structure.
Definition shell_websocket.h:28
char buf[CONFIG_SHELL_WEBSOCKET_LINE_BUF_SIZE]
Line buffer.
Definition shell_websocket.h:30
uint16_t len
Current line length.
Definition shell_websocket.h:33
WEBSOCKET-based shell transport.
Definition shell_websocket.h:37
void * shell_context
Context registered by shell.
Definition shell_websocket.h:42
struct shell_websocket_line_buf line_out
Buffer for outgoing line.
Definition shell_websocket.h:45
struct k_work_sync work_sync
Definition shell_websocket.h:67
size_t rx_len
Number of data bytes within the input buffer.
Definition shell_websocket.h:57
struct zsock_pollfd fds[1]
Array for sockets used by the websocket service.
Definition shell_websocket.h:48
struct k_work_delayable send_work
The delayed work is used to send non-lf terminated output that has been around for "too long".
Definition shell_websocket.h:66
shell_transport_handler_t shell_handler
Handler function registered by shell.
Definition shell_websocket.h:39
struct k_mutex rx_lock
Mutex protecting the input buffer access.
Definition shell_websocket.h:60
bool output_lock
If set, no output is sent to the WEBSOCKET client.
Definition shell_websocket.h:70
uint8_t rx_buf[CONFIG_SHELL_CMD_BUFF_SIZE]
Input buffer.
Definition shell_websocket.h:54
struct k_mutex socket_lock
Mutex protecting the socket access.
Definition shell_websocket.h:51
Shell instance internals.
Definition shell.h:1063
Definition of the monitored socket/file descriptor.
Definition socket_poll.h:31