Zephyr API
4.4.99
A Scalable Open Source RTOS
Toggle main menu visibility
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
>
17
#include <
zephyr/net/http/server.h
>
18
#include <
zephyr/net/http/service.h
>
19
#include <
zephyr/shell/shell.h
>
20
21
#ifdef __cplusplus
22
extern
"C"
{
23
#endif
24
26
27
#define SHELL_WEBSOCKET_SERVICE_COUNT CONFIG_SHELL_WEBSOCKET_BACKEND_COUNT
28
30
struct
shell_websocket_line_buf {
32
char
buf[CONFIG_SHELL_WEBSOCKET_LINE_BUF_SIZE];
33
35
uint16_t
len;
36
};
37
39
struct
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
75
extern
const
struct
shell_transport_api
shell_websocket_transport_api;
76
int
shell_websocket_setup(
int
ws_socket,
struct
http_request_ctx
*request_ctx,
void
*user_data);
77
int
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_ */
shell_transport_handler_t
void(* shell_transport_handler_t)(enum shell_transport_evt evt, void *context)
Shell transport event handler callback.
Definition
shell.h:831
server.h
HTTP server API.
socket.h
BSD Sockets compatible API definitions.
service.h
HTTP service API.
shell.h
Header file for the shell subsystem.
uint8_t
__UINT8_TYPE__ uint8_t
Definition
stdint.h:88
uint16_t
__UINT16_TYPE__ uint16_t
Definition
stdint.h:89
http_request_ctx
HTTP request context.
Definition
server.h:210
shell_transport_api
Unified shell transport interface.
Definition
shell.h:863
shell
Shell instance internals.
Definition
shell.h:1129
zephyr
shell
shell_websocket.h
Generated on
for Zephyr API by
1.17.0