blob: adcc32bc921561f81fd8cbff72190f3e101872c7 [file] [log] [blame]
/** @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 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;
};
/** Temporary buffers used for HTTP handshakes and Websocket protocol
* headers. User must provide the actual buffer where the headers are
* stored temporarily.
*/
uint8_t *tmp_buf;
/** Temporary buffer length.
*/
size_t tmp_buf_len;
/** Current reading position in the tmp_buf
*/
size_t tmp_buf_pos;
/** The real TCP socket to use when sending Websocket data to peer.
*/
int real_sock;
/** Websocket connection masking value */
uint32_t masking_value;
/** Amount of data received. */
uint64_t total_read;
/** Message length */
uint64_t message_len;
/** Message type */
uint32_t message_type;
/** 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;
/** Header received */
uint8_t header_received : 1;
};
/**
* @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);