| /** @file |
| @brief Websocket private header |
| |
| This is not to be included by the application. |
| */ |
| |
| /* |
| * Copyright (c) 2019 Intel Corporation |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| #include <zephyr/toolchain/common.h> |
| |
| #define WS_SHA1_OUTPUT_LEN 20 |
| |
| /* Min Websocket header length */ |
| #define MIN_HEADER_LEN 2 |
| |
| /* Max Websocket header length */ |
| #define MAX_HEADER_LEN 14 |
| |
| /* From RFC 6455 chapter 4.2.2 */ |
| #define WS_MAGIC "258EAFA5-E914-47DA-95CA-C5AB0DC85B11" |
| |
| /** |
| * Websocket parser states |
| */ |
| enum websocket_parser_state { |
| WEBSOCKET_PARSER_STATE_OPCODE, |
| WEBSOCKET_PARSER_STATE_LENGTH, |
| WEBSOCKET_PARSER_STATE_EXT_LEN, |
| WEBSOCKET_PARSER_STATE_MASK, |
| WEBSOCKET_PARSER_STATE_PAYLOAD, |
| }; |
| |
| /** |
| * Description of external buffers for payload and receiving |
| */ |
| struct websocket_buffer { |
| /* external buffer */ |
| uint8_t *buf; |
| /* size of external buffer */ |
| size_t size; |
| /* data length in external buffer */ |
| size_t count; |
| }; |
| |
| /** |
| * Websocket connection information |
| */ |
| __net_socket struct websocket_context { |
| union { |
| /** User data. |
| */ |
| void *user_data; |
| |
| /** This is used during HTTP handshake to verify that the |
| * peer sent proper Sec-WebSocket-Accept key. |
| */ |
| uint8_t *sec_accept_key; |
| }; |
| |
| /** Reference count. |
| */ |
| atomic_t refcount; |
| |
| /** Internal lock for protecting this context from multiple access. |
| */ |
| struct k_mutex lock; |
| |
| /* The socket number is valid only after HTTP handshake is done |
| * so we can share the memory for these. |
| */ |
| union { |
| /** HTTP parser settings for the application usage */ |
| const struct http_parser_settings *http_cb; |
| |
| /** The Websocket socket id. If data is sent via this socket, it |
| * will automatically add Websocket headers etc into the data. |
| */ |
| int sock; |
| }; |
| |
| /** Buffer for receiving from TCP socket. |
| * This buffer used for HTTP handshakes and Websocket packet parser. |
| * User must provide the actual buffer where the data are |
| * stored temporarily. |
| */ |
| struct websocket_buffer recv_buf; |
| |
| /** The real TCP socket to use when sending Websocket data to peer. |
| */ |
| int real_sock; |
| |
| /** Websocket connection masking value */ |
| uint32_t masking_value; |
| |
| /** Message length */ |
| uint64_t message_len; |
| |
| /** Message type */ |
| uint32_t message_type; |
| |
| /** Parser remaining length in current state */ |
| uint64_t parser_remaining; |
| |
| /** Parser state */ |
| enum websocket_parser_state parser_state; |
| |
| /** Is the message masked */ |
| uint8_t masked : 1; |
| |
| /** Did we receive Sec-WebSocket-Accept: field */ |
| uint8_t sec_accept_present : 1; |
| |
| /** Is Sec-WebSocket-Accept field correct */ |
| uint8_t sec_accept_ok : 1; |
| |
| /** Did we receive all from peer during HTTP handshake */ |
| uint8_t all_received : 1; |
| }; |
| |
| #if defined(CONFIG_NET_TEST) |
| /** |
| * Websocket unit test does not use socket layer but feeds |
| * the data directly here when testing this function. |
| */ |
| struct test_data { |
| /** pointer to data "tx" buffer */ |
| uint8_t *input_buf; |
| |
| /** "tx" buffer data length */ |
| size_t input_len; |
| |
| /** "tx" buffer read (recv) position */ |
| size_t input_pos; |
| |
| /** external test context */ |
| struct websocket_context *ctx; |
| }; |
| #endif /* CONFIG_NET_TEST */ |
| |
| /** |
| * @brief Disconnect the Websocket. |
| * |
| * @param sock Websocket id returned by websocket_connect() call. |
| * |
| * @return 0 if ok, <0 if error |
| */ |
| int websocket_disconnect(int sock); |
| |
| /** |
| * @typedef websocket_context_cb_t |
| * @brief Callback used while iterating over websocket contexts |
| * |
| * @param context A valid pointer on current websocket context |
| * @param user_data A valid pointer on some user data or NULL |
| */ |
| typedef void (*websocket_context_cb_t)(struct websocket_context *ctx, |
| void *user_data); |
| |
| /** |
| * @brief Iterate over websocket context. This is mainly used by net-shell |
| * to show information about websockets. |
| * |
| * @param cb Websocket context callback |
| * @param user_data Caller specific data. |
| */ |
| void websocket_context_foreach(websocket_context_cb_t cb, void *user_data); |