Update Files
This commit is contained in:
811
Kinc/Sources/kinc/libs/core/include/libwebsockets.h
Normal file
811
Kinc/Sources/kinc/libs/core/include/libwebsockets.h
Normal file
@ -0,0 +1,811 @@
|
||||
/*
|
||||
* libwebsockets - small server side websockets and web server implementation
|
||||
*
|
||||
* Copyright (C) 2010 - 2019 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
/** @file */
|
||||
|
||||
#ifndef LIBWEBSOCKET_H_3060898B846849FF9F88F5DB59B5950C
|
||||
#define LIBWEBSOCKET_H_3060898B846849FF9F88F5DB59B5950C
|
||||
|
||||
#ifdef __cplusplus
|
||||
#include <cstddef>
|
||||
#include <cstdarg>
|
||||
|
||||
extern "C" {
|
||||
#else
|
||||
#include <stdarg.h>
|
||||
#endif
|
||||
|
||||
#include "lws_config.h"
|
||||
|
||||
#if defined(LWS_HAVE_SYS_TYPES_H) && !defined(LWS_PLAT_BAREMETAL)
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#if defined(LWS_HAVE_NET_ETHERNET_H)
|
||||
#include <net/ethernet.h>
|
||||
#endif
|
||||
#if defined(_WIN32) && !defined(ETHER_ADDR_LEN)
|
||||
#define ETHER_ADDR_LEN 6
|
||||
#endif
|
||||
#define LWS_ETHER_ADDR_LEN ETHER_ADDR_LEN
|
||||
|
||||
#include <stddef.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
|
||||
/* place for one-shot opaque forward references */
|
||||
|
||||
typedef struct lws_context * lws_ctx_t;
|
||||
struct lws_dsh;
|
||||
|
||||
/*
|
||||
* CARE: everything using cmake defines needs to be below here
|
||||
*/
|
||||
|
||||
#define LWS_US_PER_SEC ((lws_usec_t)1000000)
|
||||
#define LWS_MS_PER_SEC ((lws_usec_t)1000)
|
||||
#define LWS_US_PER_MS ((lws_usec_t)1000)
|
||||
#define LWS_NS_PER_US ((lws_usec_t)1000)
|
||||
|
||||
#define LWS_KI (1024)
|
||||
#define LWS_MI (LWS_KI * 1024)
|
||||
#define LWS_GI (LWS_MI * 1024)
|
||||
#define LWS_TI ((uint64_t)LWS_GI * 1024)
|
||||
#define LWS_PI ((uint64_t)LWS_TI * 1024)
|
||||
|
||||
#define LWS_US_TO_MS(x) ((x + (LWS_US_PER_MS / 2)) / LWS_US_PER_MS)
|
||||
|
||||
#define LWS_FOURCC(a, b, c, d) ((a << 24) | (b << 16) | (c << 8) | d)
|
||||
|
||||
#if defined(LWS_HAS_INTPTR_T)
|
||||
#include <stdint.h>
|
||||
#define lws_intptr_t intptr_t
|
||||
#else
|
||||
typedef unsigned long long lws_intptr_t;
|
||||
#endif
|
||||
|
||||
#if defined(WIN32) || defined(_WIN32)
|
||||
#ifndef WIN32_LEAN_AND_MEAN
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#endif
|
||||
|
||||
#include <winsock2.h>
|
||||
#include <ws2tcpip.h>
|
||||
#include <stddef.h>
|
||||
#include <basetsd.h>
|
||||
#include <io.h>
|
||||
#ifndef _WIN32_WCE
|
||||
#include <fcntl.h>
|
||||
#else
|
||||
#define _O_RDONLY 0x0000
|
||||
#define O_RDONLY _O_RDONLY
|
||||
#endif
|
||||
|
||||
typedef unsigned int uid_t;
|
||||
typedef unsigned int gid_t;
|
||||
typedef unsigned short sa_family_t;
|
||||
#if !defined(LWS_HAVE_SUSECONDS_T)
|
||||
typedef unsigned int useconds_t;
|
||||
typedef int suseconds_t;
|
||||
#endif
|
||||
|
||||
#define LWS_INLINE __inline
|
||||
#define LWS_VISIBLE
|
||||
#define LWS_WARN_UNUSED_RESULT
|
||||
#define LWS_WARN_DEPRECATED
|
||||
#define LWS_FORMAT(string_index)
|
||||
|
||||
#if !defined(LWS_EXTERN) && defined(LWS_BUILDING_SHARED)
|
||||
#ifdef LWS_DLL
|
||||
#ifdef LWS_INTERNAL
|
||||
#define LWS_EXTERN extern __declspec(dllexport)
|
||||
#else
|
||||
#define LWS_EXTERN extern __declspec(dllimport)
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if !defined(LWS_INTERNAL) && !defined(LWS_EXTERN)
|
||||
#define LWS_EXTERN
|
||||
#define LWS_VISIBLE
|
||||
#endif
|
||||
|
||||
#if !defined(LWS_EXTERN)
|
||||
#define LWS_EXTERN
|
||||
#endif
|
||||
|
||||
#define LWS_INVALID_FILE INVALID_HANDLE_VALUE
|
||||
#define LWS_SOCK_INVALID (INVALID_SOCKET)
|
||||
#define LWS_O_RDONLY _O_RDONLY
|
||||
#define LWS_O_WRONLY _O_WRONLY
|
||||
#define LWS_O_CREAT _O_CREAT
|
||||
#define LWS_O_TRUNC _O_TRUNC
|
||||
|
||||
#if (__STDC_VERSION__ < 199901L) && !defined(__func__)
|
||||
#define __func__ __FUNCTION__
|
||||
#endif
|
||||
|
||||
#else /* NOT WIN32 */
|
||||
#include <unistd.h>
|
||||
|
||||
#if defined(LWS_HAVE_SYS_CAPABILITY_H) && defined(LWS_HAVE_LIBCAP)
|
||||
#include <sys/capability.h>
|
||||
#endif
|
||||
|
||||
#if defined(__NetBSD__) || defined(__FreeBSD__) || defined(__QNX__) || defined(__OpenBSD__) || defined(__NuttX__)
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#endif
|
||||
|
||||
#define LWS_INLINE inline
|
||||
#define LWS_O_RDONLY O_RDONLY
|
||||
#define LWS_O_WRONLY O_WRONLY
|
||||
#define LWS_O_CREAT O_CREAT
|
||||
#define LWS_O_TRUNC O_TRUNC
|
||||
|
||||
#if !defined(LWS_PLAT_OPTEE) && !defined(OPTEE_TA) && !defined(LWS_PLAT_FREERTOS) && !defined(LWS_PLAT_BAREMETAL)
|
||||
#include <poll.h>
|
||||
#include <netdb.h>
|
||||
#define LWS_INVALID_FILE -1
|
||||
#define LWS_SOCK_INVALID (-1)
|
||||
#else
|
||||
#define getdtablesize() (30)
|
||||
#if defined(LWS_PLAT_FREERTOS)
|
||||
#define LWS_INVALID_FILE NULL
|
||||
#define LWS_SOCK_INVALID (-1)
|
||||
#else
|
||||
#define LWS_INVALID_FILE NULL
|
||||
#define LWS_SOCK_INVALID (-1)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(__FreeBSD__)
|
||||
#include <sys/signal.h>
|
||||
#endif
|
||||
#if defined(__GNUC__)
|
||||
|
||||
/* warn_unused_result attribute only supported by GCC 3.4 or later */
|
||||
#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
|
||||
#define LWS_WARN_UNUSED_RESULT __attribute__((warn_unused_result))
|
||||
#else
|
||||
#define LWS_WARN_UNUSED_RESULT
|
||||
#endif
|
||||
|
||||
#if defined(LWS_BUILDING_SHARED)
|
||||
/* this is only set when we're building lws itself shared */
|
||||
#define LWS_VISIBLE __attribute__((visibility("default")))
|
||||
#define LWS_EXTERN extern
|
||||
|
||||
#else /* not shared */
|
||||
#if defined(WIN32) || defined(_WIN32) || defined(__MINGW32__)
|
||||
#define LWS_VISIBLE
|
||||
#define LWS_EXTERN extern
|
||||
#else
|
||||
/*
|
||||
* If we explicitly say hidden here, symbols exist as T but
|
||||
* cannot be imported at link-time.
|
||||
*/
|
||||
#define LWS_VISIBLE
|
||||
#define LWS_EXTERN
|
||||
#endif
|
||||
|
||||
#endif /* not shared */
|
||||
|
||||
#define LWS_WARN_DEPRECATED __attribute__ ((deprecated))
|
||||
#undef printf
|
||||
#define LWS_FORMAT(string_index) __attribute__ ((format(printf, string_index, string_index+1)))
|
||||
#else /* not GNUC */
|
||||
|
||||
#define LWS_VISIBLE
|
||||
#define LWS_WARN_UNUSED_RESULT
|
||||
#define LWS_WARN_DEPRECATED
|
||||
#define LWS_FORMAT(string_index)
|
||||
#if !defined(LWS_EXTERN)
|
||||
#define LWS_EXTERN extern
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
#if defined(__ANDROID__)
|
||||
#include <netinet/in.h>
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef _WIN32
|
||||
#define random rand
|
||||
#else
|
||||
#if !defined(LWS_PLAT_OPTEE)
|
||||
#include <sys/time.h>
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(LWS_WITH_LIBUV_INTERNAL)
|
||||
#include <uv.h>
|
||||
|
||||
#ifdef LWS_HAVE_UV_VERSION_H
|
||||
#include <uv-version.h>
|
||||
#endif
|
||||
|
||||
#ifdef LWS_HAVE_NEW_UV_VERSION_H
|
||||
#include <uv/version.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(LWS_WITH_TLS)
|
||||
|
||||
#ifdef USE_WOLFSSL
|
||||
#ifdef USE_OLD_CYASSL
|
||||
#ifdef _WIN32
|
||||
/*
|
||||
* Include user-controlled settings for windows from
|
||||
* <wolfssl-root>/IDE/WIN/user_settings.h
|
||||
*/
|
||||
#include <IDE/WIN/user_settings.h>
|
||||
#include <cyassl/ctaocrypt/settings.h>
|
||||
#else
|
||||
#include <cyassl/options.h>
|
||||
#endif
|
||||
#include <cyassl/openssl/ssl.h>
|
||||
#include <cyassl/error-ssl.h>
|
||||
|
||||
#else
|
||||
#ifdef _WIN32
|
||||
/*
|
||||
* Include user-controlled settings for windows from
|
||||
* <wolfssl-root>/IDE/WIN/user_settings.h
|
||||
*/
|
||||
#include <IDE/WIN/user_settings.h>
|
||||
#include <wolfssl/wolfcrypt/settings.h>
|
||||
#else
|
||||
#include <wolfssl/options.h>
|
||||
#endif
|
||||
#include <wolfssl/openssl/ssl.h>
|
||||
#include <wolfssl/error-ssl.h>
|
||||
#endif /* not USE_OLD_CYASSL */
|
||||
#else
|
||||
#if defined(LWS_WITH_MBEDTLS)
|
||||
#if defined(LWS_PLAT_FREERTOS)
|
||||
/* this filepath is passed to us but without quotes or <> */
|
||||
#if !defined(LWS_AMAZON_RTOS)
|
||||
/* AMAZON RTOS has its own setting via MTK_MBEDTLS_CONFIG_FILE */
|
||||
#undef MBEDTLS_CONFIG_FILE
|
||||
#define MBEDTLS_CONFIG_FILE <mbedtls/esp_config.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(LWS_WITH_TLS)
|
||||
#include <mbedtls/ssl.h>
|
||||
#include <mbedtls/entropy.h>
|
||||
#include <mbedtls/ctr_drbg.h>
|
||||
#include <mbedtls/version.h>
|
||||
|
||||
#if !defined(MBEDTLS_PRIVATE)
|
||||
#define MBEDTLS_PRIVATE(_q) _q
|
||||
#endif
|
||||
|
||||
#if (MBEDTLS_VERSION_MAJOR == 3) && (MBEDTLS_VERSION_MINOR == 0)
|
||||
#define MBEDTLS_PRIVATE_V30_ONLY(_q) MBEDTLS_PRIVATE(_q)
|
||||
#else
|
||||
#define MBEDTLS_PRIVATE_V30_ONLY(_q) _q
|
||||
#endif
|
||||
|
||||
#endif
|
||||
#else
|
||||
#include <openssl/ssl.h>
|
||||
#if !defined(LWS_WITH_MBEDTLS)
|
||||
#include <openssl/err.h>
|
||||
#endif
|
||||
#endif
|
||||
#endif /* not USE_WOLFSSL */
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Helpers for pthread mutex in user code... if lws is built for
|
||||
* multiple service threads, these resolve to pthread mutex
|
||||
* operations. In the case LWS_MAX_SMP is 1 (the default), they
|
||||
* are all NOPs and no pthread type or api is referenced.
|
||||
*/
|
||||
|
||||
#if LWS_MAX_SMP > 1
|
||||
|
||||
#include <pthread.h>
|
||||
|
||||
#define lws_pthread_mutex(name) pthread_mutex_t name;
|
||||
|
||||
static LWS_INLINE void
|
||||
lws_pthread_mutex_init(pthread_mutex_t *lock)
|
||||
{
|
||||
pthread_mutex_init(lock, NULL);
|
||||
}
|
||||
|
||||
static LWS_INLINE void
|
||||
lws_pthread_mutex_destroy(pthread_mutex_t *lock)
|
||||
{
|
||||
pthread_mutex_destroy(lock);
|
||||
}
|
||||
|
||||
static LWS_INLINE void
|
||||
lws_pthread_mutex_lock(pthread_mutex_t *lock)
|
||||
{
|
||||
pthread_mutex_lock(lock);
|
||||
}
|
||||
|
||||
static LWS_INLINE void
|
||||
lws_pthread_mutex_unlock(pthread_mutex_t *lock)
|
||||
{
|
||||
pthread_mutex_unlock(lock);
|
||||
}
|
||||
|
||||
#else
|
||||
#define lws_pthread_mutex(name)
|
||||
#define lws_pthread_mutex_init(_a)
|
||||
#define lws_pthread_mutex_destroy(_a)
|
||||
#define lws_pthread_mutex_lock(_a)
|
||||
#define lws_pthread_mutex_unlock(_a)
|
||||
#endif
|
||||
|
||||
|
||||
#define CONTEXT_PORT_NO_LISTEN -1
|
||||
#define CONTEXT_PORT_NO_LISTEN_SERVER -2
|
||||
|
||||
#include <libwebsockets/lws-logs.h>
|
||||
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
#ifndef lws_container_of
|
||||
#define lws_container_of(P,T,M) ((T *)((char *)(P) - offsetof(T, M)))
|
||||
#endif
|
||||
#define LWS_ALIGN_TO(x, bou) x += ((bou) - ((x) % (bou))) % (bou)
|
||||
|
||||
struct lws;
|
||||
|
||||
/* api change list for user code to test against */
|
||||
|
||||
#define LWS_FEATURE_SERVE_HTTP_FILE_HAS_OTHER_HEADERS_ARG
|
||||
|
||||
/* the struct lws_protocols has the id field present */
|
||||
#define LWS_FEATURE_PROTOCOLS_HAS_ID_FIELD
|
||||
|
||||
/* you can call lws_get_peer_write_allowance */
|
||||
#define LWS_FEATURE_PROTOCOLS_HAS_PEER_WRITE_ALLOWANCE
|
||||
|
||||
/* extra parameter introduced in 917f43ab821 */
|
||||
#define LWS_FEATURE_SERVE_HTTP_FILE_HAS_OTHER_HEADERS_LEN
|
||||
|
||||
/* File operations stuff exists */
|
||||
#define LWS_FEATURE_FOPS
|
||||
|
||||
/* Mounts have extra no_cache member */
|
||||
#define LWS_FEATURE_MOUNT_NO_CACHE
|
||||
|
||||
|
||||
#if defined(_WIN32)
|
||||
#if !defined(LWS_WIN32_HANDLE_TYPES)
|
||||
typedef SOCKET lws_sockfd_type;
|
||||
#if defined(__MINGW32__)
|
||||
typedef int lws_filefd_type;
|
||||
#else
|
||||
typedef HANDLE lws_filefd_type;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
#define lws_pollfd pollfd
|
||||
#define LWS_POLLHUP (POLLHUP)
|
||||
#define LWS_POLLIN (POLLRDNORM | POLLRDBAND)
|
||||
#define LWS_POLLOUT (POLLWRNORM)
|
||||
|
||||
#else
|
||||
|
||||
|
||||
#if defined(LWS_PLAT_FREERTOS)
|
||||
#include <libwebsockets/lws-freertos.h>
|
||||
#else
|
||||
typedef int lws_sockfd_type;
|
||||
typedef int lws_filefd_type;
|
||||
#endif
|
||||
|
||||
#if defined(LWS_PLAT_OPTEE)
|
||||
#include <time.h>
|
||||
struct timeval {
|
||||
time_t tv_sec;
|
||||
unsigned int tv_usec;
|
||||
};
|
||||
#if defined(LWS_WITH_NETWORK)
|
||||
// #include <poll.h>
|
||||
#define lws_pollfd pollfd
|
||||
|
||||
struct timezone;
|
||||
|
||||
int gettimeofday(struct timeval *tv, struct timezone *tz);
|
||||
|
||||
/* Internet address. */
|
||||
struct in_addr {
|
||||
uint32_t s_addr; /* address in network byte order */
|
||||
};
|
||||
|
||||
typedef unsigned short sa_family_t;
|
||||
typedef unsigned short in_port_t;
|
||||
typedef uint32_t socklen_t;
|
||||
|
||||
#include <libwebsockets/lws-optee.h>
|
||||
|
||||
#if !defined(TEE_SE_READER_NAME_MAX)
|
||||
struct addrinfo {
|
||||
int ai_flags;
|
||||
int ai_family;
|
||||
int ai_socktype;
|
||||
int ai_protocol;
|
||||
socklen_t ai_addrlen;
|
||||
struct sockaddr *ai_addr;
|
||||
char *ai_canonname;
|
||||
struct addrinfo *ai_next;
|
||||
};
|
||||
#endif
|
||||
|
||||
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
|
||||
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
|
||||
ssize_t read(int fd, void *buf, size_t count);
|
||||
int getsockopt(int sockfd, int level, int optname,
|
||||
void *optval, socklen_t *optlen);
|
||||
int setsockopt(int sockfd, int level, int optname,
|
||||
const void *optval, socklen_t optlen);
|
||||
int connect(int sockfd, const struct sockaddr *addr,
|
||||
socklen_t addrlen);
|
||||
|
||||
extern int errno;
|
||||
|
||||
uint16_t ntohs(uint16_t netshort);
|
||||
uint16_t htons(uint16_t hostshort);
|
||||
|
||||
int bind(int sockfd, const struct sockaddr *addr,
|
||||
socklen_t addrlen);
|
||||
|
||||
|
||||
#define MSG_NOSIGNAL 0x4000
|
||||
#define EAGAIN 11
|
||||
#define EINTR 4
|
||||
#define EWOULDBLOCK EAGAIN
|
||||
#define EADDRINUSE 98
|
||||
#define INADDR_ANY 0
|
||||
#define AF_INET 2
|
||||
#define SHUT_WR 1
|
||||
#define AF_UNSPEC 0
|
||||
#define PF_UNSPEC 0
|
||||
#define SOCK_STREAM 1
|
||||
#define SOCK_DGRAM 2
|
||||
# define AI_PASSIVE 0x0001
|
||||
#define IPPROTO_UDP 17
|
||||
#define SOL_SOCKET 1
|
||||
#define SO_SNDBUF 7
|
||||
#define EISCONN 106
|
||||
#define EALREADY 114
|
||||
#define EINPROGRESS 115
|
||||
int shutdown(int sockfd, int how);
|
||||
int close(int fd);
|
||||
int atoi(const char *nptr);
|
||||
long long atoll(const char *nptr);
|
||||
|
||||
int socket(int domain, int type, int protocol);
|
||||
int getaddrinfo(const char *node, const char *service,
|
||||
const struct addrinfo *hints,
|
||||
struct addrinfo **res);
|
||||
|
||||
void freeaddrinfo(struct addrinfo *res);
|
||||
|
||||
#if !defined(TEE_SE_READER_NAME_MAX)
|
||||
struct lws_pollfd
|
||||
{
|
||||
int fd; /* File descriptor to poll. */
|
||||
short int events; /* Types of events poller cares about. */
|
||||
short int revents; /* Types of events that actually occurred. */
|
||||
};
|
||||
#endif
|
||||
|
||||
int poll(struct pollfd *fds, int nfds, int timeout);
|
||||
|
||||
#define LWS_POLLHUP (0x18)
|
||||
#define LWS_POLLIN (1)
|
||||
#define LWS_POLLOUT (4)
|
||||
#else
|
||||
struct lws_pollfd;
|
||||
struct sockaddr_in;
|
||||
#endif
|
||||
#else
|
||||
#define lws_pollfd pollfd
|
||||
#define LWS_POLLHUP (POLLHUP | POLLERR)
|
||||
#define LWS_POLLIN (POLLIN)
|
||||
#define LWS_POLLOUT (POLLOUT)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
#if (defined(WIN32) || defined(_WIN32)) && !defined(__MINGW32__)
|
||||
/* ... */
|
||||
#define ssize_t SSIZE_T
|
||||
#endif
|
||||
|
||||
#if defined(WIN32) && defined(LWS_HAVE__STAT32I64)
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#endif
|
||||
|
||||
#if defined(LWS_HAVE_STDINT_H)
|
||||
#include <stdint.h>
|
||||
#else
|
||||
#if defined(WIN32) || defined(_WIN32)
|
||||
/* !!! >:-[ */
|
||||
typedef __int64 int64_t;
|
||||
typedef unsigned __int64 uint64_t;
|
||||
typedef __int32 int32_t;
|
||||
typedef unsigned __int32 uint32_t;
|
||||
typedef __int16 int16_t;
|
||||
typedef unsigned __int16 uint16_t;
|
||||
typedef unsigned __int8 uint8_t;
|
||||
#else
|
||||
typedef unsigned int uint32_t;
|
||||
typedef unsigned short uint16_t;
|
||||
typedef unsigned char uint8_t;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
typedef int64_t lws_usec_t;
|
||||
typedef unsigned long long lws_filepos_t;
|
||||
typedef long long lws_fileofs_t;
|
||||
typedef uint32_t lws_fop_flags_t;
|
||||
|
||||
#define lws_concat_temp(_t, _l) (_t + sizeof(_t) - _l)
|
||||
#define lws_concat_used(_t, _l) (sizeof(_t) - _l)
|
||||
|
||||
/** struct lws_pollargs - argument structure for all external poll related calls
|
||||
* passed in via 'in' */
|
||||
struct lws_pollargs {
|
||||
lws_sockfd_type fd; /**< applicable socket descriptor */
|
||||
int events; /**< the new event mask */
|
||||
int prev_events; /**< the previous event mask */
|
||||
};
|
||||
|
||||
#if !defined(LWS_SIZEOFPTR)
|
||||
#define LWS_SIZEOFPTR ((int)sizeof (void *))
|
||||
#endif
|
||||
|
||||
#if defined(__x86_64__)
|
||||
#define _LWS_PAD_SIZE 16 /* Intel recommended for best performance */
|
||||
#else
|
||||
#define _LWS_PAD_SIZE LWS_SIZEOFPTR /* Size of a pointer on the target arch */
|
||||
#endif
|
||||
#define _LWS_PAD(n) (((n) % _LWS_PAD_SIZE) ? \
|
||||
((n) + (_LWS_PAD_SIZE - ((n) % _LWS_PAD_SIZE))) : (n))
|
||||
/* last 2 is for lws-meta */
|
||||
#define LWS_PRE _LWS_PAD(4 + 10 + 2)
|
||||
/* used prior to 1.7 and retained for backward compatibility */
|
||||
#define LWS_SEND_BUFFER_PRE_PADDING LWS_PRE
|
||||
#define LWS_SEND_BUFFER_POST_PADDING 0
|
||||
|
||||
|
||||
|
||||
struct lws_extension; /* needed even with ws exts disabled for create context */
|
||||
struct lws_token_limits;
|
||||
struct lws_protocols;
|
||||
struct lws_context;
|
||||
struct lws_tokens;
|
||||
struct lws_vhost;
|
||||
struct lws;
|
||||
|
||||
/* Generic stateful operation return codes */
|
||||
|
||||
typedef enum {
|
||||
LWS_SRET_OK = 0,
|
||||
LWS_SRET_WANT_INPUT = (1 << 16),
|
||||
LWS_SRET_WANT_OUTPUT = (1 << 17),
|
||||
LWS_SRET_FATAL = (1 << 18),
|
||||
LWS_SRET_NO_FURTHER_IN = (1 << 19),
|
||||
LWS_SRET_NO_FURTHER_OUT = (1 << 20),
|
||||
LWS_SRET_AWAIT_RETRY = (1 << 21),
|
||||
LWS_SRET_YIELD = (1 << 22), /* return to the event loop and continue */
|
||||
} lws_stateful_ret_t;
|
||||
|
||||
typedef struct lws_fixed3232 {
|
||||
int32_t whole; /* signed 32-bit int */
|
||||
int32_t frac; /* signed frac proportion from 0 to (100M - 1) */
|
||||
} lws_fx_t;
|
||||
|
||||
#define LWS_FX_FRACTION_MSD 100000000
|
||||
#define lws_neg(a) (a->whole < 0 || a->frac < 0)
|
||||
#define lws_fx_set(a, x, y) { a.whole = x; a.frac = x < 0 ? -y : y; }
|
||||
#define lws_fix64(a) (((int64_t)a->whole << 32) + \
|
||||
(((1ll << 32) * (a->frac < 0 ? -a->frac : a->frac)) / LWS_FX_FRACTION_MSD))
|
||||
#define lws_fix64_abs(a) \
|
||||
((((int64_t)(a->whole < 0 ? (-a->whole) : a->whole) << 32) + \
|
||||
(((1ll << 32) * (a->frac < 0 ? -a->frac : a->frac)) / LWS_FX_FRACTION_MSD)))
|
||||
|
||||
#define lws_fix3232(a, a64) { a->whole = (int32_t)(a64 >> 32); \
|
||||
a->frac = (int32_t)((100000000 * (a64 & 0xffffffff)) >> 32); }
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN const lws_fx_t *
|
||||
lws_fx_add(lws_fx_t *r, const lws_fx_t *a, const lws_fx_t *b);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN const lws_fx_t *
|
||||
lws_fx_sub(lws_fx_t *r, const lws_fx_t *a, const lws_fx_t *b);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN const lws_fx_t *
|
||||
lws_fx_mul(lws_fx_t *r, const lws_fx_t *a, const lws_fx_t *b);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN const lws_fx_t *
|
||||
lws_fx_div(lws_fx_t *r, const lws_fx_t *a, const lws_fx_t *b);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN const lws_fx_t *
|
||||
lws_fx_sqrt(lws_fx_t *r, const lws_fx_t *a);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_fx_comp(const lws_fx_t *a, const lws_fx_t *b);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_fx_roundup(const lws_fx_t *a);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_fx_rounddown(const lws_fx_t *a);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN const char *
|
||||
lws_fx_string(const lws_fx_t *a, char *buf, size_t size);
|
||||
|
||||
#include <libwebsockets/lws-dll2.h>
|
||||
#include <libwebsockets/lws-map.h>
|
||||
|
||||
#include <libwebsockets/lws-fault-injection.h>
|
||||
#include <libwebsockets/lws-backtrace.h>
|
||||
#include <libwebsockets/lws-timeout-timer.h>
|
||||
#include <libwebsockets/lws-cache-ttl.h>
|
||||
#if defined(LWS_WITH_SYS_SMD)
|
||||
#include <libwebsockets/lws-smd.h>
|
||||
#endif
|
||||
#include <libwebsockets/lws-state.h>
|
||||
#include <libwebsockets/lws-retry.h>
|
||||
#if defined(LWS_WITH_NETWORK)
|
||||
#include <libwebsockets/lws-adopt.h>
|
||||
#include <libwebsockets/lws-network-helper.h>
|
||||
#include <libwebsockets/lws-metrics.h>
|
||||
#endif
|
||||
|
||||
#include <libwebsockets/lws-ota.h>
|
||||
#include <libwebsockets/lws-system.h>
|
||||
#if defined(LWS_WITH_NETWORK)
|
||||
#include <libwebsockets/lws-ws-close.h>
|
||||
#include <libwebsockets/lws-callbacks.h>
|
||||
#include <libwebsockets/lws-ws-state.h>
|
||||
#include <libwebsockets/lws-ws-ext.h>
|
||||
#include <libwebsockets/lws-protocols-plugins.h>
|
||||
#endif
|
||||
#include <libwebsockets/lws-context-vhost.h>
|
||||
|
||||
#if defined(LWS_WITH_NETWORK)
|
||||
#if defined(LWS_WITH_CONMON)
|
||||
#include <libwebsockets/lws-conmon.h>
|
||||
#endif
|
||||
|
||||
#if defined(LWS_ROLE_MQTT)
|
||||
#include <libwebsockets/lws-mqtt.h>
|
||||
#endif
|
||||
#include <libwebsockets/lws-client.h>
|
||||
#include <libwebsockets/lws-http.h>
|
||||
#include <libwebsockets/lws-spa.h>
|
||||
#endif
|
||||
#include <libwebsockets/lws-purify.h>
|
||||
#include <libwebsockets/lws-misc.h>
|
||||
#include <libwebsockets/lws-dsh.h>
|
||||
#if defined(LWS_WITH_NETWORK)
|
||||
#include <libwebsockets/lws-service.h>
|
||||
#include <libwebsockets/lws-write.h>
|
||||
#include <libwebsockets/lws-writeable.h>
|
||||
#endif
|
||||
#include <libwebsockets/lws-ring.h>
|
||||
#include <libwebsockets/lws-sha1-base64.h>
|
||||
#include <libwebsockets/lws-x509.h>
|
||||
#if defined(LWS_WITH_NETWORK)
|
||||
#include <libwebsockets/lws-cgi.h>
|
||||
#endif
|
||||
#if defined(LWS_WITH_FILE_OPS)
|
||||
#include <libwebsockets/lws-vfs.h>
|
||||
#endif
|
||||
#include <libwebsockets/lws-gencrypto.h>
|
||||
|
||||
#include <libwebsockets/lws-lejp.h>
|
||||
#include <libwebsockets/lws-lecp.h>
|
||||
#include <libwebsockets/lws-cose.h>
|
||||
#include <libwebsockets/lws-struct.h>
|
||||
#include <libwebsockets/lws-threadpool.h>
|
||||
#include <libwebsockets/lws-tokenize.h>
|
||||
#include <libwebsockets/lws-lwsac.h>
|
||||
#include <libwebsockets/lws-fts.h>
|
||||
#include <libwebsockets/lws-diskcache.h>
|
||||
#include <libwebsockets/lws-secure-streams.h>
|
||||
#include <libwebsockets/lws-secure-streams-serialization.h>
|
||||
#include <libwebsockets/lws-secure-streams-policy.h>
|
||||
#include <libwebsockets/lws-secure-streams-client.h>
|
||||
#include <libwebsockets/lws-secure-streams-transport-proxy.h>
|
||||
#include <libwebsockets/lws-jrpc.h>
|
||||
|
||||
#include <libwebsockets/lws-async-dns.h>
|
||||
|
||||
#if defined(LWS_WITH_TLS)
|
||||
|
||||
#include <libwebsockets/lws-tls-sessions.h>
|
||||
|
||||
#if defined(LWS_WITH_MBEDTLS)
|
||||
#include <mbedtls/md5.h>
|
||||
#include <mbedtls/sha1.h>
|
||||
#include <mbedtls/sha256.h>
|
||||
#include <mbedtls/sha512.h>
|
||||
#endif
|
||||
|
||||
#include <libwebsockets/lws-genhash.h>
|
||||
#include <libwebsockets/lws-genrsa.h>
|
||||
#include <libwebsockets/lws-genaes.h>
|
||||
#include <libwebsockets/lws-genec.h>
|
||||
|
||||
#include <libwebsockets/lws-jwk.h>
|
||||
#include <libwebsockets/lws-jose.h>
|
||||
#include <libwebsockets/lws-jws.h>
|
||||
#include <libwebsockets/lws-jwe.h>
|
||||
|
||||
#endif
|
||||
|
||||
#if defined(LWS_WITH_NETWORK)
|
||||
#include <libwebsockets/lws-eventlib-exports.h>
|
||||
#endif
|
||||
#include <libwebsockets/lws-i2c.h>
|
||||
#include <libwebsockets/lws-spi.h>
|
||||
#if defined(LWS_ESP_PLATFORM)
|
||||
#include <libwebsockets/lws-esp32-spi.h>
|
||||
#endif
|
||||
#include <libwebsockets/lws-gpio.h>
|
||||
#include <libwebsockets/lws-bb-i2c.h>
|
||||
#include <libwebsockets/lws-bb-spi.h>
|
||||
#include <libwebsockets/lws-button.h>
|
||||
#include <libwebsockets/lws-led.h>
|
||||
#include <libwebsockets/lws-pwm.h>
|
||||
#include <libwebsockets/lws-upng.h>
|
||||
#include <libwebsockets/lws-jpeg.h>
|
||||
#include <libwebsockets/lws-display.h>
|
||||
#include <libwebsockets/lws-dlo.h>
|
||||
#include <libwebsockets/lws-ssd1306-i2c.h>
|
||||
#include <libwebsockets/lws-ili9341-spi.h>
|
||||
#include <libwebsockets/lws-spd1656-spi.h>
|
||||
#include <libwebsockets/lws-uc8176-spi.h>
|
||||
#include <libwebsockets/lws-ssd1675b-spi.h>
|
||||
#include <libwebsockets/lws-settings.h>
|
||||
#if defined(LWS_WITH_NETWORK)
|
||||
#include <libwebsockets/lws-netdev.h>
|
||||
#endif
|
||||
|
||||
#include <libwebsockets/lws-html.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
279
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-adopt.h
Normal file
279
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-adopt.h
Normal file
@ -0,0 +1,279 @@
|
||||
/*
|
||||
* libwebsockets - small server side websockets and web server implementation
|
||||
*
|
||||
* Copyright (C) 2010 - 2019 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
/** \defgroup sock-adopt Socket adoption helpers
|
||||
* ##Socket adoption helpers
|
||||
*
|
||||
* When integrating with an external app with its own event loop, these can
|
||||
* be used to accept connections from someone else's listening socket.
|
||||
*
|
||||
* When using lws own event loop, these are not needed.
|
||||
*/
|
||||
///@{
|
||||
|
||||
/**
|
||||
* lws_adopt_socket() - adopt foreign socket as if listen socket accepted it
|
||||
* for the default vhost of context.
|
||||
*
|
||||
* \param context: lws context
|
||||
* \param accept_fd: fd of already-accepted socket to adopt
|
||||
*
|
||||
* Either returns new wsi bound to accept_fd, or closes accept_fd and
|
||||
* returns NULL, having cleaned up any new wsi pieces.
|
||||
*
|
||||
* LWS adopts the socket in http serving mode, it's ready to accept an upgrade
|
||||
* to ws or just serve http.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN struct lws *
|
||||
lws_adopt_socket(struct lws_context *context, lws_sockfd_type accept_fd);
|
||||
|
||||
/**
|
||||
* lws_adopt_socket_vhost() - adopt foreign socket as if listen socket accepted
|
||||
* it for vhost
|
||||
*
|
||||
* \param vh: lws vhost
|
||||
* \param accept_fd: fd of already-accepted socket to adopt
|
||||
*
|
||||
* Either returns new wsi bound to accept_fd, or closes accept_fd and
|
||||
* returns NULL, having cleaned up any new wsi pieces.
|
||||
*
|
||||
* LWS adopts the socket in http serving mode, it's ready to accept an upgrade
|
||||
* to ws or just serve http.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN struct lws *
|
||||
lws_adopt_socket_vhost(struct lws_vhost *vh, lws_sockfd_type accept_fd);
|
||||
|
||||
typedef enum {
|
||||
LWS_ADOPT_RAW_FILE_DESC = 0, /* convenience constant */
|
||||
LWS_ADOPT_HTTP = 1, /* flag: absent implies RAW */
|
||||
LWS_ADOPT_SOCKET = 2, /* flag: absent implies file */
|
||||
LWS_ADOPT_ALLOW_SSL = 4, /* flag: use tls */
|
||||
LWS_ADOPT_FLAG_UDP = 16, /* flag: socket is UDP */
|
||||
LWS_ADOPT_FLAG_RAW_PROXY = 32, /* flag: raw proxy */
|
||||
|
||||
LWS_ADOPT_RAW_SOCKET_UDP = LWS_ADOPT_SOCKET | LWS_ADOPT_FLAG_UDP,
|
||||
} lws_adoption_type;
|
||||
|
||||
typedef union {
|
||||
lws_sockfd_type sockfd;
|
||||
lws_filefd_type filefd;
|
||||
} lws_sock_file_fd_type;
|
||||
|
||||
#if defined(LWS_ESP_PLATFORM)
|
||||
#include <lwip/sockets.h>
|
||||
#endif
|
||||
|
||||
typedef union {
|
||||
#if defined(LWS_WITH_IPV6)
|
||||
struct sockaddr_in6 sa6;
|
||||
#else
|
||||
#if defined(LWS_ESP_PLATFORM)
|
||||
uint8_t _pad_sa6[28];
|
||||
#endif
|
||||
#endif
|
||||
struct sockaddr_in sa4;
|
||||
} lws_sockaddr46;
|
||||
|
||||
#define sa46_sockaddr(_sa46) ((struct sockaddr *)(_sa46))
|
||||
|
||||
#if defined(LWS_WITH_IPV6)
|
||||
#define sa46_socklen(_sa46) (socklen_t)((_sa46)->sa4.sin_family == AF_INET ? \
|
||||
sizeof(struct sockaddr_in) : \
|
||||
sizeof(struct sockaddr_in6))
|
||||
#define sa46_sockport(_sa46, _sp) { if ((_sa46)->sa4.sin_family == AF_INET) \
|
||||
(_sa46)->sa4.sin_port = (_sp); else \
|
||||
(_sa46)->sa6.sin6_port = (_sp); }
|
||||
#define sa46_address(_sa46) ((uint8_t *)((_sa46)->sa4.sin_family == AF_INET ? \
|
||||
&_sa46->sa4.sin_addr : &_sa46->sa6.sin6_addr ))
|
||||
#else
|
||||
#define sa46_socklen(_sa46) (socklen_t)sizeof(struct sockaddr_in)
|
||||
#define sa46_sockport(_sa46, _sp) (_sa46)->sa4.sin_port = (_sp)
|
||||
#define sa46_address(_sa46) (uint8_t *)&_sa46->sa4.sin_addr
|
||||
#endif
|
||||
|
||||
#define sa46_address_len(_sa46) ((_sa46)->sa4.sin_family == AF_INET ? 4 : 16)
|
||||
|
||||
#if defined(LWS_WITH_UDP)
|
||||
struct lws_udp {
|
||||
lws_sockaddr46 sa46;
|
||||
lws_sockaddr46 sa46_pending;
|
||||
uint8_t connected:1;
|
||||
};
|
||||
#endif
|
||||
|
||||
/**
|
||||
* lws_adopt_descriptor_vhost() - adopt foreign socket or file descriptor
|
||||
* if socket descriptor, should already have been accepted from listen socket
|
||||
*
|
||||
* \param vh: lws vhost
|
||||
* \param type: OR-ed combinations of lws_adoption_type flags
|
||||
* \param fd: union with either .sockfd or .filefd set
|
||||
* \param vh_prot_name: NULL or vh protocol name to bind raw connection to
|
||||
* \param parent: NULL or struct lws to attach new_wsi to as a child
|
||||
*
|
||||
* Either returns new wsi bound to accept_fd, or closes accept_fd and
|
||||
* returns NULL, having cleaned up any new wsi pieces.
|
||||
*
|
||||
* If LWS_ADOPT_SOCKET is set, LWS adopts the socket in http serving mode, it's
|
||||
* ready to accept an upgrade to ws or just serve http.
|
||||
*
|
||||
* parent may be NULL, if given it should be an existing wsi that will become the
|
||||
* parent of the new wsi created by this call.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN struct lws *
|
||||
lws_adopt_descriptor_vhost(struct lws_vhost *vh, lws_adoption_type type,
|
||||
lws_sock_file_fd_type fd, const char *vh_prot_name,
|
||||
struct lws *parent);
|
||||
|
||||
typedef struct lws_adopt_desc {
|
||||
struct lws_vhost *vh; /**< vhost the wsi should belong to */
|
||||
lws_adoption_type type; /**< OR-ed combinations of
|
||||
* lws_adoption_type flags */
|
||||
lws_sock_file_fd_type fd; /**< union with either .sockfd
|
||||
* or .filefd set */
|
||||
const char *vh_prot_name; /**< NULL or vh protocol name to
|
||||
* bind raw connection to */
|
||||
struct lws *parent; /**< NULL or struct lws to
|
||||
* attach new_wsi to as a child */
|
||||
void *opaque; /**< opaque pointer to set on
|
||||
*created wsi */
|
||||
const char *fi_wsi_name; /**< NULL, or Fault Injection
|
||||
* inheritence filter for
|
||||
* wsi=string/ context faults */
|
||||
} lws_adopt_desc_t;
|
||||
|
||||
/**
|
||||
* lws_adopt_descriptor_vhost_via_info() - adopt foreign socket or file descriptor
|
||||
* if socket descriptor, should already have been accepted from listen socket
|
||||
*
|
||||
* \param info: the struct containing the parameters
|
||||
*
|
||||
* - vh: lws vhost
|
||||
* - type: OR-ed combinations of lws_adoption_type flags
|
||||
* - fd: union with either .sockfd or .filefd set
|
||||
* - vh_prot_name: NULL or vh protocol name to bind raw connection to
|
||||
* - parent: NULL or struct lws to attach new_wsi to as a child
|
||||
* - opaque: opaque pointer to set on created wsi
|
||||
*
|
||||
* Either returns new wsi bound to accept_fd, or closes accept_fd and
|
||||
* returns NULL, having cleaned up any new wsi pieces.
|
||||
*
|
||||
* If LWS_ADOPT_SOCKET is set, LWS adopts the socket in http serving mode, it's
|
||||
* ready to accept an upgrade to ws or just serve http.
|
||||
*
|
||||
* parent may be NULL, if given it should be an existing wsi that will become the
|
||||
* parent of the new wsi created by this call.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN struct lws *
|
||||
lws_adopt_descriptor_vhost_via_info(const lws_adopt_desc_t *info);
|
||||
|
||||
/**
|
||||
* lws_adopt_socket_readbuf() - adopt foreign socket and first rx as if listen socket accepted it
|
||||
* for the default vhost of context.
|
||||
* \param context: lws context
|
||||
* \param accept_fd: fd of already-accepted socket to adopt
|
||||
* \param readbuf: NULL or pointer to data that must be drained before reading from
|
||||
* accept_fd
|
||||
* \param len: The length of the data held at \p readbuf
|
||||
*
|
||||
* Either returns new wsi bound to accept_fd, or closes accept_fd and
|
||||
* returns NULL, having cleaned up any new wsi pieces.
|
||||
*
|
||||
* LWS adopts the socket in http serving mode, it's ready to accept an upgrade
|
||||
* to ws or just serve http.
|
||||
*
|
||||
* If your external code did not already read from the socket, you can use
|
||||
* lws_adopt_socket() instead.
|
||||
*
|
||||
* This api is guaranteed to use the data at \p readbuf first, before reading from
|
||||
* the socket.
|
||||
*
|
||||
* \p readbuf is limited to the size of the ah rx buf, currently 2048 bytes.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN struct lws *
|
||||
lws_adopt_socket_readbuf(struct lws_context *context, lws_sockfd_type accept_fd,
|
||||
const char *readbuf, size_t len);
|
||||
/**
|
||||
* lws_adopt_socket_vhost_readbuf() - adopt foreign socket and first rx as if listen socket
|
||||
* accepted it for vhost.
|
||||
* \param vhost: lws vhost
|
||||
* \param accept_fd: fd of already-accepted socket to adopt
|
||||
* \param readbuf: NULL or pointer to data that must be drained before reading from accept_fd
|
||||
* \param len: The length of the data held at \p readbuf
|
||||
*
|
||||
* Either returns new wsi bound to accept_fd, or closes accept_fd and
|
||||
* returns NULL, having cleaned up any new wsi pieces.
|
||||
*
|
||||
* LWS adopts the socket in http serving mode, it's ready to accept an upgrade
|
||||
* to ws or just serve http.
|
||||
*
|
||||
* If your external code did not already read from the socket, you can use
|
||||
* lws_adopt_socket() instead.
|
||||
*
|
||||
* This api is guaranteed to use the data at \p readbuf first, before reading from
|
||||
* the socket.
|
||||
*
|
||||
* \p readbuf is limited to the size of the ah rx buf, currently 2048 bytes.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN struct lws *
|
||||
lws_adopt_socket_vhost_readbuf(struct lws_vhost *vhost,
|
||||
lws_sockfd_type accept_fd, const char *readbuf,
|
||||
size_t len);
|
||||
|
||||
#define LWS_CAUDP_BIND (1 << 0)
|
||||
#define LWS_CAUDP_BROADCAST (1 << 1)
|
||||
#define LWS_CAUDP_PF_PACKET (1 << 2)
|
||||
|
||||
#if defined(LWS_WITH_UDP)
|
||||
/**
|
||||
* lws_create_adopt_udp() - create, bind and adopt a UDP socket
|
||||
*
|
||||
* \param vhost: lws vhost
|
||||
* \param ads: NULL or address to do dns lookup on
|
||||
* \param port: UDP port to bind to, -1 means unbound
|
||||
* \param flags: 0 or LWS_CAUDP_NO_BIND
|
||||
* \param protocol_name: Name of protocol on vhost to bind wsi to
|
||||
* \param ifname: NULL, for network interface name to bind socket to
|
||||
* \param parent_wsi: NULL or parent wsi new wsi will be a child of
|
||||
* \param opaque: set created wsi opaque ptr to this
|
||||
* \param retry_policy: NULL for vhost default policy else wsi specific policy
|
||||
* \param fi_wsi_name: NULL, or string to inherit Fault Injection rules in
|
||||
* form "wsi=string/rule". "wsi/rule" faults will be
|
||||
* automatically applied as well. It's done at creation
|
||||
* time so the rules can, eg, inject faults related to
|
||||
* creation.
|
||||
*
|
||||
* Either returns new wsi bound to accept_fd, or closes accept_fd and
|
||||
* returns NULL, having cleaned up any new wsi pieces.
|
||||
* */
|
||||
LWS_VISIBLE LWS_EXTERN struct lws *
|
||||
lws_create_adopt_udp(struct lws_vhost *vhost, const char *ads, int port,
|
||||
int flags, const char *protocol_name, const char *ifname,
|
||||
struct lws *parent_wsi, void *opaque,
|
||||
const lws_retry_bo_t *retry_policy, const char *fi_wsi_name);
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
///@}
|
||||
@ -0,0 +1,130 @@
|
||||
/*
|
||||
* libwebsockets - small server side websockets and web server implementation
|
||||
*
|
||||
* Copyright (C) 2010 - 2019 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#if defined(LWS_WITH_UDP) && defined(LWS_WITH_NETWORK)
|
||||
|
||||
typedef enum dns_query_type {
|
||||
LWS_ADNS_RECORD_A = 0x01,
|
||||
LWS_ADNS_RECORD_CNAME = 0x05,
|
||||
LWS_ADNS_RECORD_MX = 0x0f,
|
||||
LWS_ADNS_RECORD_AAAA = 0x1c,
|
||||
} adns_query_type_t;
|
||||
|
||||
typedef enum {
|
||||
LADNS_RET_FAILED_WSI_CLOSED = -4,
|
||||
LADNS_RET_NXDOMAIN = -3,
|
||||
LADNS_RET_TIMEDOUT = -2,
|
||||
LADNS_RET_FAILED = -1,
|
||||
LADNS_RET_FOUND,
|
||||
LADNS_RET_CONTINUING
|
||||
} lws_async_dns_retcode_t;
|
||||
|
||||
#define LWS_ADNS_SYNTHETIC 0x10000 /* don't send, synthetic response will
|
||||
* be injected for testing */
|
||||
|
||||
struct addrinfo;
|
||||
|
||||
typedef struct lws * (*lws_async_dns_cb_t)(struct lws *wsi, const char *ads,
|
||||
const struct addrinfo *result, int n, void *opaque);
|
||||
|
||||
struct lws_adns_q;
|
||||
struct lws_async_dns;
|
||||
|
||||
/**
|
||||
* lws_async_dns_query() - perform a dns lookup using async dns
|
||||
*
|
||||
* \param context: the lws_context
|
||||
* \param tsi: thread service index (usually 0)
|
||||
* \param name: DNS name to look up
|
||||
* \param qtype: type of query (A, AAAA etc)
|
||||
* \param cb: query completion callback
|
||||
* \param wsi: wsi if the query is related to one
|
||||
* \param pq: NULL, or pointer to lws_adns_q query (used for testing)
|
||||
*
|
||||
* Starts an asynchronous DNS lookup, on completion the \p cb callback will
|
||||
* be called.
|
||||
*
|
||||
* The reference count on the cached object is incremented for every callback
|
||||
* that was called with the cached addrinfo results.
|
||||
*
|
||||
* The cached object can't be evicted until the reference count reaches zero...
|
||||
* use lws_async_dns_freeaddrinfo() to indicate you're finsihed with the
|
||||
* results for each callback that happened with them.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN lws_async_dns_retcode_t
|
||||
lws_async_dns_query(struct lws_context *context, int tsi, const char *name,
|
||||
adns_query_type_t qtype, lws_async_dns_cb_t cb,
|
||||
struct lws *wsi, void *opaque, struct lws_adns_q **pq);
|
||||
|
||||
/**
|
||||
* lws_async_dns_freeaddrinfo() - decrement refcount on cached addrinfo results
|
||||
*
|
||||
* \param pai: a pointert to a pointer to first addrinfo returned as result in the callback
|
||||
*
|
||||
* Decrements the cache object's reference count. When it reaches zero, the
|
||||
* cached object may be reaped subject to LRU rules.
|
||||
*
|
||||
* The pointer to the first addrinfo give in the argument is set to NULL.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_async_dns_freeaddrinfo(const struct addrinfo **ai);
|
||||
|
||||
/**
|
||||
* lws_async_dns_server_add() - add a DNS server to the lws async DNS list
|
||||
*
|
||||
* \param cx: the lws_context
|
||||
* \param sa46: the ipv4 or ipv6 DNS server address to add
|
||||
*
|
||||
* Adds the given DNS server to the lws list of async DNS servers to query.
|
||||
* If the address is already listed, its refcount is increased, otherwise a new
|
||||
* entry is made.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_async_dns_server_add(struct lws_context *cx, const lws_sockaddr46 *sa46);
|
||||
|
||||
/**
|
||||
* lws_async_dns_server_remove() - remove a DNS server from the lws async DNS list
|
||||
*
|
||||
* \param cx: the lws_context
|
||||
* \param sa46: the ipv4 or ipv6 DNS server address to add
|
||||
*
|
||||
* Removes the given DNS server from the lws list of async DNS servers to query.
|
||||
* If the address does not correspond to an existing entry, no action is taken.
|
||||
* If it does, the refcount on it is decremented, and if it reaches zero, the
|
||||
* entry is detached from the list and destroyed.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_async_dns_server_remove(struct lws_context *cx, const lws_sockaddr46 *sa46);
|
||||
|
||||
/* only needed for testing */
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN uint16_t
|
||||
lws_adns_get_tid(struct lws_adns_q *q);
|
||||
LWS_VISIBLE LWS_EXTERN struct lws_async_dns *
|
||||
lws_adns_get_async_dns(struct lws_adns_q *q);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_adns_parse_udp(struct lws_async_dns *dns, const uint8_t *pkt, size_t len);
|
||||
|
||||
#endif
|
||||
@ -0,0 +1,280 @@
|
||||
/*
|
||||
* libwebsockets - small server side websockets and web server implementation
|
||||
*
|
||||
* Copyright (C) 2010 - 2022 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
/** \defgroup lws_backtrace generic and compressed backtrace acquisition
|
||||
* ##Backtrace apis
|
||||
* \ingroup lwsbacktrace
|
||||
*
|
||||
* lws_backtrace
|
||||
*
|
||||
* These apis abstract acquisition and optionally compressed on binary back-
|
||||
* traces, effectively build-specific signatures for where in the code you are
|
||||
* and how you got there.
|
||||
*/
|
||||
//@{
|
||||
|
||||
typedef struct {
|
||||
uintptr_t st[32];
|
||||
uintptr_t asize;
|
||||
|
||||
uint8_t sp;
|
||||
uint8_t pre;
|
||||
uint8_t post;
|
||||
} lws_backtrace_info_t;
|
||||
|
||||
typedef struct {
|
||||
uint8_t *comp;
|
||||
size_t pos;
|
||||
size_t len;
|
||||
} lws_backtrace_comp_t;
|
||||
|
||||
/*
|
||||
* lws_backtrace() - init and fiull a backtrace struct
|
||||
*
|
||||
* \param si: the backtrace struct to populate
|
||||
* \param pre: the number of call levels to snip from the top
|
||||
* \param post: the number of call levels to snip from the bottom
|
||||
*
|
||||
* This describes the call stack into \p si. \p si doesn't need preparing
|
||||
* before the call. \p pre levels of the call stack at the top will be snipped,
|
||||
* this will usually want to be 1 or 2 to conceal the helpers that are making
|
||||
* the call stack, such as lws_backtrace itself.
|
||||
*
|
||||
* \p post levels of the call stack at the bottom will be snipped, this is to
|
||||
* conceal loaders or other machinery that was used to start your application,
|
||||
* otherwise those entries will bloat all call stacks results on that platform.
|
||||
*
|
||||
* Returns 0 for success.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_backtrace(lws_backtrace_info_t *si, uint8_t pre, uint8_t post);
|
||||
|
||||
/*
|
||||
* lws_backtrace_compression_stream_init() - init and fiull a backtrace struct
|
||||
*
|
||||
* \param c: the backtrace compression struct
|
||||
* \param comp: the buffer to take the compressed bytes
|
||||
* \param comp_len: the number of bytes available at \p comp
|
||||
*
|
||||
* This initializes the caller's lws_backtrace_comp_t. Because it's expected
|
||||
* the caller will want to put his own compressed data after the compressed
|
||||
* backtrace, he is responsible for the compression context.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_backtrace_compression_stream_init(lws_backtrace_comp_t *c,
|
||||
uint8_t *comp, size_t comp_len);
|
||||
|
||||
/*
|
||||
* lws_backtrace_compression_stream() - add bitfields to compression stream
|
||||
*
|
||||
* \param c: the backtrace compression context struct
|
||||
* \param v: the bitfield to add to the stream
|
||||
* \param bits: the number of bits of v to add
|
||||
*
|
||||
* This inserts bits from the LSB end of v to the compression stream.
|
||||
*
|
||||
* This is used by the backtrace compression, user code can use this to add
|
||||
* its own bitfields into the compression stream after the compressed backtrace.
|
||||
*
|
||||
* User data should be added after, so that the backtrace can be processed even
|
||||
* if the additional data is not understood by the processing script.
|
||||
*
|
||||
* Returns 0 for success or nonzero if ran out of compression output buffer.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_backtrace_compression_stream(lws_backtrace_comp_t *c, uintptr_t v,
|
||||
unsigned int bits);
|
||||
|
||||
/*
|
||||
* lws_backtrace_compression_destream() - add bitfields to compression stream
|
||||
*
|
||||
* \param c: the backtrace compression context struct
|
||||
* \param _v: pointer to take the bitfield result
|
||||
* \param bits: the number of bits to bring out into _v
|
||||
*
|
||||
* This reads the compression stream and creates a bitfield from it in \p _v.
|
||||
*
|
||||
* Returns 0 for success (with \p _v set to the value), or nonzero if ran out
|
||||
* of compression output buffer.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_backtrace_compression_destream(lws_backtrace_comp_t *c, uintptr_t *_v,
|
||||
unsigned int bits);
|
||||
|
||||
/*
|
||||
* lws_backtrace_compress_backtrace() - compress backtrace si into c
|
||||
*
|
||||
* \param si: the backtrace struct to compress
|
||||
* \param c: the backtrace compression context struct
|
||||
*
|
||||
* This compresses backtrace information acquired in \p si into the compression
|
||||
* context \p c. It compresses first the call stack length and then each IP
|
||||
* address in turn.
|
||||
*
|
||||
* Returns 0 for success.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_backtrace_compress_backtrace(lws_backtrace_info_t *si,
|
||||
lws_backtrace_comp_t *c);
|
||||
|
||||
//@}
|
||||
|
||||
/** \defgroup lws_alloc_metadata helpers for allocator instrumentation
|
||||
* ##Alloc Metadata APIs
|
||||
* \ingroup lwsallocmetadata
|
||||
*
|
||||
* lws_alloc_metadata
|
||||
*
|
||||
* These helpers let you rapidly instrument your libc or platform memory
|
||||
* allocator so that you can later dump details, including a backtrace of where
|
||||
* the allocation was made, for every live heap allocation.
|
||||
*
|
||||
* You would use it at peak memory usage, to audit who is using what at that
|
||||
* time.
|
||||
*
|
||||
* Effective compression is used to keep the metadata overhead to ~48 bytes
|
||||
* per active allocation on 32-bit systems.
|
||||
*/
|
||||
//@{
|
||||
|
||||
/**
|
||||
* lws_alloc_metadata_gen() - generate metadata blob (with compressed backtrace)
|
||||
*
|
||||
* \param size: the allocation size
|
||||
* \param comp: buffer for compressed backtrace
|
||||
* \param comp_len: number of bytes available in the compressed backtrace
|
||||
* \param adj: takes the count of additional bytes needed for metadata behind
|
||||
* the allocation we tell the user about
|
||||
* \param cl: takes the count of bytes used in comp
|
||||
*
|
||||
* This helper creates the compressed part of the alloc metadata blob and
|
||||
* calculates the total overallocation that is needed in \p adj.
|
||||
*
|
||||
* This doesn't need any locking.
|
||||
*
|
||||
* If \p comp_len is too small for the whole result, or it was not possible to
|
||||
* get the backtrace information, the compressed part is set to empty (total
|
||||
* length 2 to carry the 00 00 length).
|
||||
*
|
||||
* 6 or 10 (64-bit) bytes per backtrace IP allowed (currently 16) should always
|
||||
* be enough, typically the compression reduces this very significantly.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_alloc_metadata_gen(size_t size, uint8_t *comp, size_t comp_len, size_t *adj,
|
||||
size_t *cl);
|
||||
|
||||
/**
|
||||
* _lws_alloc_metadata_adjust() - helper to inject metadata and list as active
|
||||
*
|
||||
* \param active: the allocation owner
|
||||
* \param v: Original, true allocation pointer, adjusted on exit
|
||||
* \param adj: Total size of metadata overallocation
|
||||
* \param comp: The compressed metadata
|
||||
* \param cl: takes the count of bytes used in comp
|
||||
*
|
||||
* THIS MUST BE LOCKED BY THE CALLER IF YOUR ALLOCATOR MAY BE CALLED BY OTHER
|
||||
* THREADS. You can call it from an existing mutex or similar -protected
|
||||
* critical section in your allocator if there is one already, or you will have
|
||||
* to protect the caller of it with your own mutex so it cannot reenter.
|
||||
*
|
||||
* This is a helper that adjusts the allocation past the metadata part so the
|
||||
* caller of the allocator using this sees what he asked for. The deallocator
|
||||
* must call _lws_alloc_metadata_trim() to balance this before actual
|
||||
* deallocation.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
_lws_alloc_metadata_adjust(lws_dll2_owner_t *active, void **v, size_t adj, uint8_t *comp, unsigned int cl);
|
||||
|
||||
/**
|
||||
* _lws_alloc_metadata_trim() - helper to trim metadata and remove from active
|
||||
*
|
||||
* \param ptr: Adjusted allocation pointer on entry, true allocation ptr on exit
|
||||
* \param comp: NULL, or set on exit to point to start of compressed area
|
||||
* \param complen: NULL, or set on exit to length of compressed area in bytes
|
||||
*
|
||||
* THIS MUST BE LOCKED BY THE CALLER IF YOUR DEALLOCATOR MAY BE CALLED BY OTHER
|
||||
* THREADS. You can call it from an existing mutex or similar -protected
|
||||
* critical section in your deallocator if there is one already, or you will
|
||||
* have to protect that caller of it with your own mutex so it cannot reenter.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
_lws_alloc_metadata_trim(void **ptr, uint8_t **comp, uint16_t *complen);
|
||||
|
||||
/**
|
||||
* lws_alloc_metadata_parse() - parse compressed metadata into struct
|
||||
*
|
||||
* \param si: Struct to take the backtrace results from decompression
|
||||
* \param adjusted_alloc: pointer to adjusted, user allocation start
|
||||
*
|
||||
* This api parses and decompresses the blob behind the \p adjusted_alloc
|
||||
* address into \p si.
|
||||
*
|
||||
* Returns 0 for success.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_alloc_metadata_parse(lws_backtrace_info_t *si, const uint8_t *adjusted_alloc);
|
||||
|
||||
/**
|
||||
* lws_alloc_metadata_dump_stdout() - helper to print base64 blob on stdout
|
||||
*
|
||||
* \param d: the current list item
|
||||
* \param user: the optional arg given to the dump api (ignored)
|
||||
*
|
||||
* Generic helper that can be given to _lws_alloc_metadata_dump() as the
|
||||
* callback that will emit a standardized base64 blob for the alloc metadata
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_alloc_metadata_dump_stdout(struct lws_dll2 *d, void *user);
|
||||
|
||||
/**
|
||||
* lws_alloc_metadata_dump_stdout() - dump all live allocs in instrumented heap
|
||||
*
|
||||
* \param active: the owner of the active allocation list for this heap
|
||||
* \param cb: the callback to receive information
|
||||
* \param arg: optional arg devivered to the callback
|
||||
*
|
||||
* THIS MUST BE LOCKED BY THE CALLER IF YOUR ALLOCATOR MAY BE CALLED BY OTHER
|
||||
* THREADS. You can call it from an existing mutex or similar -protected
|
||||
* critical section in your allocator if there is one already, or you will have
|
||||
* to protect the caller of it with your own mutex so it cannot reenter.
|
||||
*
|
||||
* Iterates through the list of instrumented allocations calling the given
|
||||
* callback for each one.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
_lws_alloc_metadata_dump(lws_dll2_owner_t *active, lws_dll2_foreach_cb_t cb,
|
||||
void *arg);
|
||||
|
||||
#if defined(LWS_WITH_ALLOC_METADATA_LWS)
|
||||
/*
|
||||
* Wrapper for _lws_alloc_metadata_dump() that uses the list owner that tracks
|
||||
*
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
_lws_alloc_metadata_dump_lws(lws_dll2_foreach_cb_t cb, void *arg);
|
||||
#else
|
||||
#define _lws_alloc_metadata_dump_lws(_a, _b)
|
||||
#endif
|
||||
|
||||
//@}
|
||||
@ -0,0 +1,66 @@
|
||||
/*
|
||||
* I2C - bitbanged generic gpio implementation
|
||||
*
|
||||
* Copyright (C) 2019 - 2020 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*
|
||||
* This is like an abstract class for gpio, a real implementation provides
|
||||
* functions for the ops that use the underlying OS gpio arrangements.
|
||||
*/
|
||||
|
||||
typedef struct lws_bb_i2c {
|
||||
lws_i2c_ops_t bb_ops; /* init to lws_bb_i2c_ops */
|
||||
|
||||
/* implementation-specific members */
|
||||
|
||||
_lws_plat_gpio_t scl;
|
||||
_lws_plat_gpio_t sda;
|
||||
|
||||
const lws_gpio_ops_t *gpio;
|
||||
void (*delay)(void);
|
||||
} lws_bb_i2c_t;
|
||||
|
||||
#define lws_bb_i2c_ops \
|
||||
{ \
|
||||
.init = lws_bb_i2c_init, \
|
||||
.start = lws_bb_i2c_start, \
|
||||
.stop = lws_bb_i2c_stop, \
|
||||
.write = lws_bb_i2c_write, \
|
||||
.read = lws_bb_i2c_read, \
|
||||
.set_ack = lws_bb_i2c_set_ack, \
|
||||
}
|
||||
|
||||
int
|
||||
lws_bb_i2c_init(const lws_i2c_ops_t *octx);
|
||||
|
||||
int
|
||||
lws_bb_i2c_start(const lws_i2c_ops_t *octx);
|
||||
|
||||
void
|
||||
lws_bb_i2c_stop(const lws_i2c_ops_t *octx);
|
||||
|
||||
int
|
||||
lws_bb_i2c_write(const lws_i2c_ops_t *octx, uint8_t data);
|
||||
|
||||
int
|
||||
lws_bb_i2c_read(const lws_i2c_ops_t *octx);
|
||||
|
||||
void
|
||||
lws_bb_i2c_set_ack(const lws_i2c_ops_t *octx, int ack);
|
||||
@ -0,0 +1,64 @@
|
||||
/*
|
||||
* I2C - bitbanged generic gpio implementation
|
||||
*
|
||||
* Copyright (C) 2019 - 2020 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*
|
||||
* This is like an abstract class for gpio, a real implementation provides
|
||||
* functions for the ops that use the underlying OS gpio arrangements.
|
||||
*/
|
||||
|
||||
#define LWSBBSPI_FLAG_USE_NCMD3 (1 << 7)
|
||||
#define LWSBBSPI_FLAG_USE_NCMD2 (1 << 6)
|
||||
#define LWSBBSPI_FLAG_USE_NCMD1 (1 << 5)
|
||||
#define LWSBBSPI_FLAG_USE_NCMD0 (1 << 4)
|
||||
#define LWSBBSPI_FLAG_USE_NCS3 (1 << 3)
|
||||
#define LWSBBSPI_FLAG_USE_NCS2 (1 << 2)
|
||||
#define LWSBBSPI_FLAG_USE_NCS1 (1 << 1)
|
||||
#define LWSBBSPI_FLAG_USE_NCS0 (1 << 0)
|
||||
|
||||
#define LWS_SPI_BB_MAX_CH 4
|
||||
|
||||
typedef struct lws_bb_spi {
|
||||
lws_spi_ops_t bb_ops; /* init to lws_bb_spi_ops */
|
||||
|
||||
/* implementation-specific members */
|
||||
const lws_gpio_ops_t *gpio;
|
||||
|
||||
_lws_plat_gpio_t clk;
|
||||
_lws_plat_gpio_t ncs[LWS_SPI_BB_MAX_CH];
|
||||
_lws_plat_gpio_t ncmd[LWS_SPI_BB_MAX_CH];
|
||||
_lws_plat_gpio_t mosi;
|
||||
_lws_plat_gpio_t miso;
|
||||
|
||||
uint8_t unit;
|
||||
|
||||
uint8_t flags;
|
||||
} lws_bb_spi_t;
|
||||
|
||||
#define lws_bb_spi_ops \
|
||||
.init = lws_bb_spi_init, \
|
||||
.queue = lws_bb_spi_queue
|
||||
|
||||
int
|
||||
lws_bb_spi_init(const lws_spi_ops_t *octx);
|
||||
|
||||
int
|
||||
lws_bb_spi_queue(const lws_spi_ops_t *octx, const lws_spi_desc_t *desc);
|
||||
120
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-button.h
Normal file
120
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-button.h
Normal file
@ -0,0 +1,120 @@
|
||||
/*
|
||||
* Generic button ops
|
||||
*
|
||||
* Copyright (C) 2019 - 2020 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*
|
||||
* Leverages the lws generic gpio pieces to bind gpio buttons to smd events
|
||||
*/
|
||||
|
||||
#if !defined(__LWS_BUTTON_H__)
|
||||
#define __LWS_BUTTON_H__
|
||||
|
||||
typedef uint16_t lws_button_idx_t;
|
||||
|
||||
/* actual minimum may be 1 x RTOS tick depending on platform */
|
||||
#define LWS_BUTTON_MON_TIMER_MS 5
|
||||
|
||||
typedef void (*lws_button_cb_t)(void *opaque, lws_button_idx_t idx, int state);
|
||||
|
||||
/* These are specified in ms but the granularity is LWS_BUTTON_MON_TIMER_MS,
|
||||
* which may have been rounded up to an RTOS tick depending on platform */
|
||||
|
||||
enum {
|
||||
LWSBTNRGMFLAG_CLASSIFY_DOUBLECLICK = (1 << 0)
|
||||
};
|
||||
|
||||
typedef struct lws_button_regime {
|
||||
uint16_t ms_min_down;
|
||||
uint16_t ms_min_down_longpress;
|
||||
uint16_t ms_up_settle;
|
||||
uint16_t ms_doubleclick_grace;
|
||||
uint16_t ms_repeat_down;
|
||||
uint8_t flags;
|
||||
/**< when double-click classification is enabled, clicks are delayed
|
||||
* by ms_min_down + ms_doubleclick_grace to wait and see if it will
|
||||
* become a double-click. Set LWSBTNRGMFLAG_CLASSIFY_DOUBLECLICK to
|
||||
* enable it or leave that bit at 0 to get faster single-click
|
||||
* classification.
|
||||
*/
|
||||
} lws_button_regime_t;
|
||||
|
||||
/*
|
||||
* This is the const part of the button controller, describing the static
|
||||
* bindings to gpio, and lws_smd event name information
|
||||
*/
|
||||
|
||||
typedef struct lws_button_map {
|
||||
_lws_plat_gpio_t gpio;
|
||||
const char *smd_interaction_name;
|
||||
const lws_button_regime_t *regime;
|
||||
/**< a default regime is applied if this is left NULL */
|
||||
} lws_button_map_t;
|
||||
|
||||
typedef struct lws_button_controller {
|
||||
const char *smd_bc_name;
|
||||
const lws_gpio_ops_t *gpio_ops;
|
||||
const lws_button_map_t *button_map;
|
||||
lws_button_idx_t active_state_bitmap;
|
||||
uint8_t count_buttons;
|
||||
} lws_button_controller_t;
|
||||
|
||||
struct lws_button_state; /* opaque */
|
||||
|
||||
/**
|
||||
* lws_button_controller_create() - instantiate a button controller
|
||||
*
|
||||
* \param ctx: the lws_context
|
||||
* \param controller: the static controller definition
|
||||
*
|
||||
* Instantiates a button controller from a static definition of the buttons
|
||||
* and their smd names, and active levels, and binds it to a gpio implementation
|
||||
*/
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN struct lws_button_state *
|
||||
lws_button_controller_create(struct lws_context *ctx,
|
||||
const lws_button_controller_t *controller);
|
||||
|
||||
/**
|
||||
* lws_button_controller_destroy() - destroys a button controller
|
||||
*
|
||||
* \param bcs: button controller state previously created
|
||||
*
|
||||
* Disables all buttons and then destroys and frees a previously created
|
||||
* button controller.
|
||||
*/
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_button_controller_destroy(struct lws_button_state *bcs);
|
||||
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN lws_button_idx_t
|
||||
lws_button_get_bit(struct lws_button_state *bcs, const char *name);
|
||||
|
||||
/*
|
||||
* lws_button_enable() - enable and disable buttons
|
||||
*/
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_button_enable(struct lws_button_state *bcs,
|
||||
lws_button_idx_t _reset, lws_button_idx_t _set);
|
||||
|
||||
#endif
|
||||
|
||||
@ -0,0 +1,348 @@
|
||||
/*
|
||||
* libwebsockets - small server side websockets and web server implementation
|
||||
*
|
||||
* Copyright (C) 2010 - 2021 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
/** \defgroup lws_cache_ttl Cache supporting expiry
|
||||
* ##Cache supporting expiry
|
||||
*
|
||||
* These apis let you quickly and reliably implement caches of named objects,
|
||||
* that have a "destroy-by date" and cache limits that will be observed.
|
||||
*
|
||||
* You can instantiate as many caches as you need. The first one must be an
|
||||
* L1 / heap cache type, it can have parents and grandparents of other types
|
||||
* which are accessible why writing / looking up and getting from the L1 cache.
|
||||
* The outer "cache" layer may persistently store items to a backing store.
|
||||
*
|
||||
* Allocated object memory is entirely for the use of user code, up to the
|
||||
* requested size.
|
||||
*
|
||||
* The key name for the listed objects may be any string chosen by the user,
|
||||
* there is no special length limit as it is also allocated.
|
||||
*
|
||||
* Both expiry and LRU orderings are kept so it is easy to find out usage
|
||||
* ordering and when the next object that will expire.
|
||||
*
|
||||
* Cached objects may be destroyed any time you go around the event loop, when
|
||||
* you allocate new objects (to keep the whole cache under the specified limit),
|
||||
* or when their expiry time arrives. So you shouldn't keep copies of pointers
|
||||
* to cached objects after returning to the event loop.
|
||||
*/
|
||||
///@{
|
||||
|
||||
|
||||
struct lws_cache_ttl_lru;
|
||||
|
||||
/**
|
||||
* lws_cache_write_through() - add a new cache item object in all layers
|
||||
*
|
||||
* \param cache: the existing cache to allocate the object in
|
||||
* \param specific_key: a key string that identifies the item in the cache
|
||||
* \param source: optional payload for the cached item, NULL means caller will
|
||||
* write the payload
|
||||
* \param size: the size of the object to allocate
|
||||
* \param expiry: the usec time that the object will autodestroy
|
||||
* \param ppay: NULL, or a pointer to a void * to be set to the L1 payload
|
||||
*
|
||||
* If an item with the key already exists, it is destroyed before allocating a
|
||||
* new one.
|
||||
*
|
||||
* Returns 0 if successful. The written entry will be scheduled to be auto-
|
||||
* destroyed when \p expiry occurs.
|
||||
*
|
||||
* Adding or removing cache items may cause invalidation of cached queries.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int /* only valid until return to event loop */
|
||||
lws_cache_write_through(struct lws_cache_ttl_lru *cache,
|
||||
const char *specific_key, const uint8_t *source,
|
||||
size_t size, lws_usec_t expiry, void **ppay);
|
||||
|
||||
typedef struct lws_cache_match {
|
||||
lws_dll2_t list;
|
||||
lws_usec_t expiry;
|
||||
/* earliest expiry amongst results */
|
||||
size_t payload_size;
|
||||
/**< the payload is not attached here. This is a hint about what
|
||||
* (*get)() will return for this tag name.
|
||||
*/
|
||||
size_t tag_size;
|
||||
|
||||
/* tag name + NUL is overcommitted */
|
||||
} lws_cache_match_t;
|
||||
|
||||
/**
|
||||
* lws_cache_heap_lookup() - get a list of matching items
|
||||
*
|
||||
* \param cache: the cache to search for the key
|
||||
* \param wildcard_key: the item key string, may contain wildcards
|
||||
* \param pdata: pointer to pointer to be set to the serialized result list
|
||||
* \param psize: pointer to size_t to receive length of serialized result list
|
||||
*
|
||||
* This finds all unique items in the final cache that match search_key, which
|
||||
* may contain wildcards. It does not return the payloads for matching items,
|
||||
* just a list of specific tags in the that match.
|
||||
*
|
||||
* If successful, results are provided in a serialized list format, in no
|
||||
* particular order, each result has the following fields
|
||||
*
|
||||
* - BE32: payload size in bytes (payload itself is not included)
|
||||
* - BE32: specific tag name length in bytes
|
||||
* - chars: tag name with terminating NUL
|
||||
*
|
||||
* These serialized results are themselves cached in L1 cache (only) and the
|
||||
* result pointers are set pointing into that. If the results are still in L1
|
||||
* cache next time this api is called, the results will be returned directly
|
||||
* from that without repeating the expensive lookup on the backup store. That
|
||||
* is why the results are provided in serialized form.
|
||||
*
|
||||
* The cached results list expiry is set to the earliest expiry of any listed
|
||||
* item. Additionally any cached results are invalidated on addition or
|
||||
* deletion (update is done as addition + deletion) of any item that would
|
||||
* match the results' original wildcard_key. For the typical case new items
|
||||
* are rare compared to lookups, this is efficient.
|
||||
*
|
||||
* Lookup matching does not itself affect LRU or cache status of the result
|
||||
* itsems. Typically user code will get the lookup results, and then perform
|
||||
* get operations on each item in its desired order, that will bring the items
|
||||
* to the head of the LRU list and occupy L1 cache.
|
||||
*
|
||||
* Returns 0 if proceeded alright, or nonzero if error. If there was an error,
|
||||
* any partial results set has been deallocated cleanly before returning.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_cache_lookup(struct lws_cache_ttl_lru *cache, const char *wildcard_key,
|
||||
const void **pdata, size_t *psize);
|
||||
|
||||
/**
|
||||
* lws_cache_item_get() - bring a specific item into L1 and get payload info
|
||||
*
|
||||
* \param cache: the cache to search for the key
|
||||
* \param specific_key: the key string of the item to get
|
||||
* \param pdata: pointer to a void * to be set to the payload in L1 cache
|
||||
* \param psize: pointer to a size_t to be set to the payload size
|
||||
*
|
||||
* If the cache still has an item matching the key string, it will be destroyed.
|
||||
*
|
||||
* Adding or removing cache items may cause invalidation of cached queries.
|
||||
*
|
||||
* Notice the cache payload is a blob of the given size. If you are storing
|
||||
* strings, there is no NUL termination unless you stored them with it.
|
||||
*
|
||||
* Returns 0 if successful.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_cache_item_get(struct lws_cache_ttl_lru *cache, const char *specific_key,
|
||||
const void **pdata, size_t *psize);
|
||||
|
||||
/**
|
||||
* lws_cache_item_remove() - remove item from all cache levels
|
||||
*
|
||||
* \param cache: the cache to search for the key
|
||||
* \param wildcard_key: the item key string
|
||||
*
|
||||
* Removes any copy of any item matching the \p wildcard_key from any cache
|
||||
* level in one step.
|
||||
*
|
||||
* Adding or removing cache items may cause invalidation of cached queries
|
||||
* that could refer to the removed item.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_cache_item_remove(struct lws_cache_ttl_lru *cache, const char *wildcard_key);
|
||||
|
||||
/**
|
||||
* lws_cache_footprint() - query the amount of storage used by the cache layer
|
||||
*
|
||||
* \param cache: cache to query
|
||||
*
|
||||
* Returns number of payload bytes stored in cache currently
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN uint64_t
|
||||
lws_cache_footprint(struct lws_cache_ttl_lru *cache);
|
||||
|
||||
/**
|
||||
* lws_cache_debug_dump() - if built in debug mode dump cache contents to log
|
||||
*
|
||||
* \param cache: cache to dump
|
||||
*
|
||||
* If lws was built in debug mode, dump cache to log, otherwise a NOP.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_cache_debug_dump(struct lws_cache_ttl_lru *cache);
|
||||
|
||||
typedef struct lws_cache_results {
|
||||
const uint8_t *ptr; /* set before using walk api */
|
||||
size_t size; /* set before using walk api */
|
||||
|
||||
size_t payload_len;
|
||||
size_t tag_len;
|
||||
const uint8_t *tag;
|
||||
} lws_cache_results_t;
|
||||
|
||||
/**
|
||||
* lws_cache_results_walk() - parse next result
|
||||
*
|
||||
* \param walk_ctx: the context of the results blob to walk
|
||||
*
|
||||
* Caller must initialize \p walk_ctx.ptr and \p walk_ctx.size before calling.
|
||||
* These are set to the results returned from a _lookup api call.
|
||||
*
|
||||
* The call returns 0 if the struct elements have been set to a result, or 1
|
||||
* if there where no more results in the blob to walk.
|
||||
*
|
||||
* If successful, after the call \p payload_len is set to the length of the
|
||||
* payload related to this result key (the payload itself is not present),
|
||||
* \p tag_len is set to the length of the result key name, and \p tag is set
|
||||
* to the result tag name, with a terminating NUL.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_cache_results_walk(lws_cache_results_t *walk_ctx);
|
||||
|
||||
typedef void (*lws_cache_item_destroy_cb)(void *item, size_t size);
|
||||
struct lws_cache_creation_info {
|
||||
struct lws_context *cx;
|
||||
/**< Mandatory: the lws_context */
|
||||
const char *name;
|
||||
/**< Mandatory: short cache name */
|
||||
lws_cache_item_destroy_cb cb;
|
||||
/**< NULL, or a callback that can hook cache item destory */
|
||||
struct lws_cache_ttl_lru *parent;
|
||||
/**< NULL, or next cache level */
|
||||
const struct lws_cache_ops *ops;
|
||||
/**< NULL for default, heap-based ops, else custom cache storage and
|
||||
* query implementation */
|
||||
|
||||
union {
|
||||
struct {
|
||||
const char *filepath;
|
||||
/**< the filepath to store items in */
|
||||
} nscookiejar;
|
||||
} u;
|
||||
/**< these are extra configuration for specific cache types */
|
||||
|
||||
size_t max_footprint;
|
||||
/**< 0, or the max heap allocation allowed before destroying
|
||||
* lru items to keep it under the limit */
|
||||
size_t max_items;
|
||||
/**< 0, or the max number of items allowed in the cache before
|
||||
* destroying lru items to keep it under the limit */
|
||||
size_t max_payload;
|
||||
/**< 0, or the max allowed payload size for one item */
|
||||
int tsi;
|
||||
/**< 0 unless using SMP, then tsi to bind sul to */
|
||||
};
|
||||
|
||||
struct lws_cache_ops {
|
||||
struct lws_cache_ttl_lru *
|
||||
(*create)(const struct lws_cache_creation_info *info);
|
||||
/**< create an instance of the cache type specified in info */
|
||||
|
||||
void
|
||||
(*destroy)(struct lws_cache_ttl_lru **_cache);
|
||||
/**< destroy the logical cache instance pointed to by *_cache, doesn't
|
||||
* affect any NV backing storage */
|
||||
|
||||
int
|
||||
(*expunge)(struct lws_cache_ttl_lru *cache);
|
||||
/**< completely delete any backing storage related to the cache
|
||||
* instance, eg, delete the backing file */
|
||||
|
||||
int
|
||||
(*write)(struct lws_cache_ttl_lru *cache, const char *specific_key,
|
||||
const uint8_t *source, size_t size, lws_usec_t expiry,
|
||||
void **ppvoid);
|
||||
/**< create an entry in the cache level according to the given info */
|
||||
int
|
||||
(*tag_match)(struct lws_cache_ttl_lru *cache, const char *wc,
|
||||
const char *tag, char lookup_rules);
|
||||
/**< Just tell us if tag would match wildcard, using whatever special
|
||||
* rules the backing store might use for tag matching. 0 indicates
|
||||
* it is a match on wildcard, nonzero means does not match.
|
||||
*/
|
||||
int
|
||||
(*lookup)(struct lws_cache_ttl_lru *cache, const char *wildcard_key,
|
||||
lws_dll2_owner_t *results_owner);
|
||||
/**+ add keys for search_key matches not already listed in the results
|
||||
* owner */
|
||||
int
|
||||
(*invalidate)(struct lws_cache_ttl_lru *cache, const char *wildcard_key);
|
||||
/**< remove matching item(s) from cache level */
|
||||
|
||||
int
|
||||
(*get)(struct lws_cache_ttl_lru *cache, const char *specific_key,
|
||||
const void **pdata, size_t *psize);
|
||||
/**< if it has the item, fills L1 with item. updates LRU, and returns
|
||||
* pointer to payload in L1 */
|
||||
|
||||
void
|
||||
(*debug_dump)(struct lws_cache_ttl_lru *cache);
|
||||
/**< Helper to dump the whole cache contents to log, useful for debug */
|
||||
};
|
||||
|
||||
/**
|
||||
* lws_cache_create() - create an empty cache you can allocate items in
|
||||
*
|
||||
* \param info: a struct describing the cache to create
|
||||
*
|
||||
* Create an empty cache you can allocate items in. The cache will be kept
|
||||
* below the max_footprint and max_items limits if they are nonzero, by
|
||||
* destroying least-recently-used items until it remains below the limits.
|
||||
*
|
||||
* Items will auto-destroy when their expiry time is reached.
|
||||
*
|
||||
* When items are destroyed from the cache, if \p cb is non-NULL, it will be
|
||||
* called back with the item pointer after it has been removed from the cache,
|
||||
* but before it is deallocated and destroyed.
|
||||
*
|
||||
* context and tsi are used when scheduling expiry callbacks
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN struct lws_cache_ttl_lru *
|
||||
lws_cache_create(const struct lws_cache_creation_info *info);
|
||||
|
||||
/**
|
||||
* lws_cache_destroy() - destroy a previously created cache
|
||||
*
|
||||
* \param cache: pointer to the cache
|
||||
*
|
||||
* Everything in the cache is destroyed, then the cache itself is destroyed,
|
||||
* and *cache set to NULL.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_cache_destroy(struct lws_cache_ttl_lru **cache);
|
||||
|
||||
/**
|
||||
* lws_cache_expunge() - destroy all items in cache and parents
|
||||
*
|
||||
* \param cache: pointer to the cache
|
||||
*
|
||||
* Everything in the cache and parents is destroyed, leaving it empty.
|
||||
* If the cache has a backing store, it is deleted.
|
||||
*
|
||||
* Returns 0 if no problems reported at any cache layer, else nonzero.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_cache_expunge(struct lws_cache_ttl_lru *cache);
|
||||
|
||||
LWS_VISIBLE extern const struct lws_cache_ops lws_cache_ops_heap,
|
||||
lws_cache_ops_nscookiejar;
|
||||
|
||||
///@}
|
||||
|
||||
@ -0,0 +1,920 @@
|
||||
/*
|
||||
* libwebsockets - small server side websockets and web server implementation
|
||||
*
|
||||
* Copyright (C) 2010 - 2019 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
/*! \defgroup usercb User Callback
|
||||
*
|
||||
* ##User protocol callback
|
||||
*
|
||||
* The protocol callback is the primary way lws interacts with
|
||||
* user code. For one of a list of a few dozen reasons the callback gets
|
||||
* called at some event to be handled.
|
||||
*
|
||||
* All of the events can be ignored, returning 0 is taken as "OK" and returning
|
||||
* nonzero in most cases indicates that the connection should be closed.
|
||||
*/
|
||||
///@{
|
||||
|
||||
struct lws_ssl_info {
|
||||
int where;
|
||||
int ret;
|
||||
};
|
||||
|
||||
enum lws_cert_update_state {
|
||||
LWS_CUS_IDLE,
|
||||
LWS_CUS_STARTING,
|
||||
LWS_CUS_SUCCESS,
|
||||
LWS_CUS_FAILED,
|
||||
|
||||
LWS_CUS_CREATE_KEYS,
|
||||
LWS_CUS_REG,
|
||||
LWS_CUS_AUTH,
|
||||
LWS_CUS_CHALLENGE,
|
||||
LWS_CUS_CREATE_REQ,
|
||||
LWS_CUS_REQ,
|
||||
LWS_CUS_CONFIRM,
|
||||
LWS_CUS_ISSUE,
|
||||
};
|
||||
|
||||
enum {
|
||||
LWS_TLS_REQ_ELEMENT_COUNTRY,
|
||||
LWS_TLS_REQ_ELEMENT_STATE,
|
||||
LWS_TLS_REQ_ELEMENT_LOCALITY,
|
||||
LWS_TLS_REQ_ELEMENT_ORGANIZATION,
|
||||
LWS_TLS_REQ_ELEMENT_COMMON_NAME,
|
||||
LWS_TLS_REQ_ELEMENT_SUBJECT_ALT_NAME,
|
||||
LWS_TLS_REQ_ELEMENT_EMAIL,
|
||||
|
||||
LWS_TLS_REQ_ELEMENT_COUNT,
|
||||
|
||||
LWS_TLS_SET_DIR_URL = LWS_TLS_REQ_ELEMENT_COUNT,
|
||||
LWS_TLS_SET_AUTH_PATH,
|
||||
LWS_TLS_SET_CERT_PATH,
|
||||
LWS_TLS_SET_KEY_PATH,
|
||||
|
||||
LWS_TLS_TOTAL_COUNT
|
||||
};
|
||||
|
||||
struct lws_acme_cert_aging_args {
|
||||
struct lws_vhost *vh;
|
||||
const char *element_overrides[LWS_TLS_TOTAL_COUNT]; /* NULL = use pvo */
|
||||
};
|
||||
|
||||
/*
|
||||
* With LWS_CALLBACK_FILTER_NETWORK_CONNECTION callback, user_data pointer
|
||||
* points to one of these
|
||||
*/
|
||||
|
||||
struct lws_filter_network_conn_args {
|
||||
struct sockaddr_storage cli_addr;
|
||||
socklen_t clilen;
|
||||
lws_sockfd_type accept_fd;
|
||||
};
|
||||
|
||||
/*
|
||||
* NOTE: These public enums are part of the abi. If you want to add one,
|
||||
* add it at where specified so existing users are unaffected.
|
||||
*/
|
||||
/** enum lws_callback_reasons - reason you're getting a protocol callback */
|
||||
enum lws_callback_reasons {
|
||||
|
||||
/* ---------------------------------------------------------------------
|
||||
* ----- Callbacks related to wsi and protocol binding lifecycle -----
|
||||
*/
|
||||
|
||||
LWS_CALLBACK_PROTOCOL_INIT = 27,
|
||||
/**< One-time call per protocol, per-vhost using it, so it can
|
||||
* do initial setup / allocations etc */
|
||||
|
||||
LWS_CALLBACK_PROTOCOL_DESTROY = 28,
|
||||
/**< One-time call per protocol, per-vhost using it, indicating
|
||||
* this protocol won't get used at all after this callback, the
|
||||
* vhost is getting destroyed. Take the opportunity to
|
||||
* deallocate everything that was allocated by the protocol. */
|
||||
|
||||
LWS_CALLBACK_WSI_CREATE = 29,
|
||||
/**< outermost (earliest) wsi create notification to protocols[0] */
|
||||
|
||||
LWS_CALLBACK_WSI_DESTROY = 30,
|
||||
/**< outermost (latest) wsi destroy notification to protocols[0] */
|
||||
|
||||
LWS_CALLBACK_WSI_TX_CREDIT_GET = 103,
|
||||
/**< manually-managed connection received TX credit (len is int32) */
|
||||
|
||||
|
||||
/* ---------------------------------------------------------------------
|
||||
* ----- Callbacks related to Server TLS -----
|
||||
*/
|
||||
|
||||
LWS_CALLBACK_OPENSSL_LOAD_EXTRA_CLIENT_VERIFY_CERTS = 21,
|
||||
/**< if configured for
|
||||
* including OpenSSL support, this callback allows your user code
|
||||
* to perform extra SSL_CTX_load_verify_locations() or similar
|
||||
* calls to direct OpenSSL where to find certificates the client
|
||||
* can use to confirm the remote server identity. user is the
|
||||
* OpenSSL SSL_CTX* */
|
||||
|
||||
LWS_CALLBACK_OPENSSL_LOAD_EXTRA_SERVER_VERIFY_CERTS = 22,
|
||||
/**< if configured for
|
||||
* including OpenSSL support, this callback allows your user code
|
||||
* to load extra certificates into the server which allow it to
|
||||
* verify the validity of certificates returned by clients. user
|
||||
* is the server's OpenSSL SSL_CTX* and in is the lws_vhost */
|
||||
|
||||
LWS_CALLBACK_OPENSSL_PERFORM_CLIENT_CERT_VERIFICATION = 23,
|
||||
/**< if the libwebsockets vhost was created with the option
|
||||
* LWS_SERVER_OPTION_REQUIRE_VALID_OPENSSL_CLIENT_CERT, then this
|
||||
* callback is generated during OpenSSL verification of the cert
|
||||
* sent from the client. It is sent to protocol[0] callback as
|
||||
* no protocol has been negotiated on the connection yet.
|
||||
* Notice that the libwebsockets context and wsi are both NULL
|
||||
* during this callback. See
|
||||
* http://www.openssl.org/docs/ssl/SSL_CTX_set_verify.html
|
||||
* to understand more detail about the OpenSSL callback that
|
||||
* generates this libwebsockets callback and the meanings of the
|
||||
* arguments passed. In this callback, user is the x509_ctx,
|
||||
* in is the ssl pointer and len is preverify_ok
|
||||
* Notice that this callback maintains libwebsocket return
|
||||
* conventions, return 0 to mean the cert is OK or 1 to fail it.
|
||||
* This also means that if you don't handle this callback then
|
||||
* the default callback action of returning 0 allows the client
|
||||
* certificates. */
|
||||
|
||||
LWS_CALLBACK_SSL_INFO = 67,
|
||||
/**< SSL connections only. An event you registered an
|
||||
* interest in at the vhost has occurred on a connection
|
||||
* using the vhost. in is a pointer to a
|
||||
* struct lws_ssl_info containing information about the
|
||||
* event*/
|
||||
|
||||
/* ---------------------------------------------------------------------
|
||||
* ----- Callbacks related to Client TLS -----
|
||||
*/
|
||||
|
||||
LWS_CALLBACK_OPENSSL_PERFORM_SERVER_CERT_VERIFICATION = 58,
|
||||
/**< Similar to LWS_CALLBACK_OPENSSL_PERFORM_CLIENT_CERT_VERIFICATION
|
||||
* this callback is called during OpenSSL verification of the cert
|
||||
* sent from the server to the client. It is sent to protocol[0]
|
||||
* callback as no protocol has been negotiated on the connection yet.
|
||||
* Notice that the wsi is set because lws_client_connect_via_info was
|
||||
* successful.
|
||||
*
|
||||
* See http://www.openssl.org/docs/ssl/SSL_CTX_set_verify.html
|
||||
* to understand more detail about the OpenSSL callback that
|
||||
* generates this libwebsockets callback and the meanings of the
|
||||
* arguments passed. In this callback, user is the x509_ctx,
|
||||
* in is the ssl pointer and len is preverify_ok.
|
||||
*
|
||||
* THIS IS NOT RECOMMENDED BUT if a cert validation error shall be
|
||||
* overruled and cert shall be accepted as ok,
|
||||
* X509_STORE_CTX_set_error((X509_STORE_CTX*)user, X509_V_OK); must be
|
||||
* called and return value must be 0 to mean the cert is OK;
|
||||
* returning 1 will fail the cert in any case.
|
||||
*
|
||||
* This also means that if you don't handle this callback then
|
||||
* the default callback action of returning 0 will not accept the
|
||||
* certificate in case of a validation error decided by the SSL lib.
|
||||
*
|
||||
* This is expected and secure behaviour when validating certificates.
|
||||
*
|
||||
* Note: LCCSCF_ALLOW_SELFSIGNED and
|
||||
* LCCSCF_SKIP_SERVER_CERT_HOSTNAME_CHECK still work without this
|
||||
* callback being implemented.
|
||||
*/
|
||||
|
||||
/* ---------------------------------------------------------------------
|
||||
* ----- Callbacks related to HTTP Server -----
|
||||
*/
|
||||
|
||||
LWS_CALLBACK_SERVER_NEW_CLIENT_INSTANTIATED = 19,
|
||||
/**< A new client has been accepted by the ws server. This
|
||||
* callback allows setting any relevant property to it. Because this
|
||||
* happens immediately after the instantiation of a new client,
|
||||
* there's no websocket protocol selected yet so this callback is
|
||||
* issued only to protocol 0. Only wsi is defined, pointing to the
|
||||
* new client, and the return value is ignored. */
|
||||
|
||||
LWS_CALLBACK_HTTP = 12,
|
||||
/**< an http request has come from a client that is not
|
||||
* asking to upgrade the connection to a websocket
|
||||
* one. This is a chance to serve http content,
|
||||
* for example, to send a script to the client
|
||||
* which will then open the websockets connection.
|
||||
* in points to the URI path requested and
|
||||
* lws_serve_http_file() makes it very
|
||||
* simple to send back a file to the client.
|
||||
* Normally after sending the file you are done
|
||||
* with the http connection, since the rest of the
|
||||
* activity will come by websockets from the script
|
||||
* that was delivered by http, so you will want to
|
||||
* return 1; to close and free up the connection. */
|
||||
|
||||
LWS_CALLBACK_HTTP_BODY = 13,
|
||||
/**< the next len bytes data from the http
|
||||
* request body HTTP connection is now available in in. */
|
||||
|
||||
LWS_CALLBACK_HTTP_BODY_COMPLETION = 14,
|
||||
/**< the expected amount of http request body has been delivered */
|
||||
|
||||
LWS_CALLBACK_HTTP_FILE_COMPLETION = 15,
|
||||
/**< a file requested to be sent down http link has completed. */
|
||||
|
||||
LWS_CALLBACK_HTTP_WRITEABLE = 16,
|
||||
/**< you can write more down the http protocol link now. */
|
||||
|
||||
LWS_CALLBACK_CLOSED_HTTP = 5,
|
||||
/**< when a HTTP (non-websocket) session ends */
|
||||
|
||||
LWS_CALLBACK_FILTER_HTTP_CONNECTION = 18,
|
||||
/**< called when the request has
|
||||
* been received and parsed from the client, but the response is
|
||||
* not sent yet. Return non-zero to disallow the connection.
|
||||
* user is a pointer to the connection user space allocation,
|
||||
* in is the URI, eg, "/"
|
||||
* In your handler you can use the public APIs
|
||||
* lws_hdr_total_length() / lws_hdr_copy() to access all of the
|
||||
* headers using the header enums lws_token_indexes from
|
||||
* libwebsockets.h to check for and read the supported header
|
||||
* presence and content before deciding to allow the http
|
||||
* connection to proceed or to kill the connection. */
|
||||
|
||||
LWS_CALLBACK_ADD_HEADERS = 53,
|
||||
/**< This gives your user code a chance to add headers to a server
|
||||
* transaction bound to your protocol. `in` points to a
|
||||
* `struct lws_process_html_args` describing a buffer and length
|
||||
* you can add headers into using the normal lws apis.
|
||||
*
|
||||
* (see LWS_CALLBACK_CLIENT_APPEND_HANDSHAKE_HEADER to add headers to
|
||||
* a client transaction)
|
||||
*
|
||||
* Only `args->p` and `args->len` are valid, and `args->p` should
|
||||
* be moved on by the amount of bytes written, if any. Eg
|
||||
*
|
||||
* case LWS_CALLBACK_ADD_HEADERS:
|
||||
*
|
||||
* struct lws_process_html_args *args =
|
||||
* (struct lws_process_html_args *)in;
|
||||
*
|
||||
* if (lws_add_http_header_by_name(wsi,
|
||||
* (unsigned char *)"set-cookie:",
|
||||
* (unsigned char *)cookie, cookie_len,
|
||||
* (unsigned char **)&args->p,
|
||||
* (unsigned char *)args->p + args->max_len))
|
||||
* return 1;
|
||||
*
|
||||
* break;
|
||||
*/
|
||||
|
||||
LWS_CALLBACK_VERIFY_BASIC_AUTHORIZATION = 102,
|
||||
/**< This gives the user code a chance to accept or reject credentials
|
||||
* provided HTTP to basic authorization. It will only be called if the
|
||||
* http mount's authentication_mode is set to LWSAUTHM_BASIC_AUTH_CALLBACK
|
||||
* `in` points to a credential string of the form `username:password` If
|
||||
* the callback returns zero (the default if unhandled), then the
|
||||
* transaction ends with HTTP_STATUS_UNAUTHORIZED, otherwise the request
|
||||
* will be processed */
|
||||
|
||||
LWS_CALLBACK_CHECK_ACCESS_RIGHTS = 51,
|
||||
/**< This gives the user code a chance to forbid an http access.
|
||||
* `in` points to a `struct lws_process_html_args`, which
|
||||
* describes the URL, and a bit mask describing the type of
|
||||
* authentication required. If the callback returns nonzero,
|
||||
* the transaction ends with HTTP_STATUS_UNAUTHORIZED. */
|
||||
|
||||
LWS_CALLBACK_PROCESS_HTML = 52,
|
||||
/**< This gives your user code a chance to mangle outgoing
|
||||
* HTML. `in` points to a `struct lws_process_html_args`
|
||||
* which describes the buffer containing outgoing HTML.
|
||||
* The buffer may grow up to `.max_len` (currently +128
|
||||
* bytes per buffer).
|
||||
*/
|
||||
|
||||
LWS_CALLBACK_HTTP_BIND_PROTOCOL = 49,
|
||||
/**< By default, all HTTP handling is done in protocols[0].
|
||||
* However you can bind different protocols (by name) to
|
||||
* different parts of the URL space using callback mounts. This
|
||||
* callback occurs in the new protocol when a wsi is bound
|
||||
* to that protocol. Any protocol allocation related to the
|
||||
* http transaction processing should be created then.
|
||||
* These specific callbacks are necessary because with HTTP/1.1,
|
||||
* a single connection may perform at series of different
|
||||
* transactions at different URLs, thus the lifetime of the
|
||||
* protocol bind is just for one transaction, not connection. */
|
||||
|
||||
LWS_CALLBACK_HTTP_DROP_PROTOCOL = 50,
|
||||
/**< This is called when a transaction is unbound from a protocol.
|
||||
* It indicates the connection completed its transaction and may
|
||||
* do something different now. Any protocol allocation related
|
||||
* to the http transaction processing should be destroyed. */
|
||||
|
||||
LWS_CALLBACK_HTTP_CONFIRM_UPGRADE = 86,
|
||||
/**< This is your chance to reject an HTTP upgrade action. The
|
||||
* name of the protocol being upgraded to is in 'in', and the ah
|
||||
* is still bound to the wsi, so you can look at the headers.
|
||||
*
|
||||
* The default of returning 0 (ie, also if not handled) means the
|
||||
* upgrade may proceed. Return <0 to just hang up the connection,
|
||||
* or >0 if you have rejected the connection by returning http headers
|
||||
* and response code yourself.
|
||||
*
|
||||
* There is no need for you to call transaction_completed() as the
|
||||
* caller will take care of it when it sees you returned >0.
|
||||
*/
|
||||
|
||||
/* ---------------------------------------------------------------------
|
||||
* ----- Callbacks related to HTTP Client -----
|
||||
*/
|
||||
|
||||
LWS_CALLBACK_ESTABLISHED_CLIENT_HTTP = 44,
|
||||
/**< The HTTP client connection has succeeded, and is now
|
||||
* connected to the server */
|
||||
|
||||
LWS_CALLBACK_CLOSED_CLIENT_HTTP = 45,
|
||||
/**< The HTTP client connection is closing */
|
||||
|
||||
LWS_CALLBACK_RECEIVE_CLIENT_HTTP_READ = 48,
|
||||
/**< This is generated by lws_http_client_read() used to drain
|
||||
* incoming data. In the case the incoming data was chunked, it will
|
||||
* be split into multiple smaller callbacks for each chunk block,
|
||||
* removing the chunk headers. If not chunked, it will appear all in
|
||||
* one callback. */
|
||||
|
||||
LWS_CALLBACK_RECEIVE_CLIENT_HTTP = 46,
|
||||
/**< This indicates data was received on the HTTP client connection. It
|
||||
* does NOT actually drain or provide the data, so if you are doing
|
||||
* http client, you MUST handle this and call lws_http_client_read().
|
||||
* Failure to deal with it as in the minimal examples may cause spinning
|
||||
* around the event loop as it's continuously signalled the same data
|
||||
* is available for read. The related minimal examples show how to
|
||||
* handle it.
|
||||
*
|
||||
* It's possible to defer calling lws_http_client_read() if you use
|
||||
* rx flow control to stop further rx handling on the connection until
|
||||
* you did deal with it. But normally you would call it in the handler.
|
||||
*
|
||||
* lws_http_client_read() strips any chunked framing and calls back
|
||||
* with only payload data to LWS_CALLBACK_RECEIVE_CLIENT_HTTP_READ. The
|
||||
* chunking is the reason this is not just all done in one callback for
|
||||
* http.
|
||||
*/
|
||||
LWS_CALLBACK_COMPLETED_CLIENT_HTTP = 47,
|
||||
/**< The client transaction completed... at the moment this
|
||||
* is the same as closing since transaction pipelining on
|
||||
* client side is not yet supported. */
|
||||
|
||||
LWS_CALLBACK_CLIENT_HTTP_WRITEABLE = 57,
|
||||
/**< when doing an HTTP type client connection, you can call
|
||||
* lws_client_http_body_pending(wsi, 1) from
|
||||
* LWS_CALLBACK_CLIENT_APPEND_HANDSHAKE_HEADER to get these callbacks
|
||||
* sending the HTTP headers.
|
||||
*
|
||||
* From this callback, when you have sent everything, you should let
|
||||
* lws know by calling lws_client_http_body_pending(wsi, 0)
|
||||
*/
|
||||
|
||||
LWS_CALLBACK_CLIENT_HTTP_REDIRECT = 104,
|
||||
/**< we're handling a 3xx redirect... return nonzero to hang up */
|
||||
|
||||
LWS_CALLBACK_CLIENT_HTTP_BIND_PROTOCOL = 85,
|
||||
LWS_CALLBACK_CLIENT_HTTP_DROP_PROTOCOL = 76,
|
||||
|
||||
/* ---------------------------------------------------------------------
|
||||
* ----- Callbacks related to Websocket Server -----
|
||||
*/
|
||||
|
||||
LWS_CALLBACK_ESTABLISHED = 0,
|
||||
/**< (VH) after the server completes a handshake with an incoming
|
||||
* client. If you built the library with ssl support, in is a
|
||||
* pointer to the ssl struct associated with the connection or NULL.
|
||||
*
|
||||
* b0 of len is set if the connection was made using ws-over-h2
|
||||
*/
|
||||
|
||||
LWS_CALLBACK_CLOSED = 4,
|
||||
/**< when the websocket session ends */
|
||||
|
||||
LWS_CALLBACK_SERVER_WRITEABLE = 11,
|
||||
/**< See LWS_CALLBACK_CLIENT_WRITEABLE */
|
||||
|
||||
LWS_CALLBACK_RECEIVE = 6,
|
||||
/**< data has appeared for this server endpoint from a
|
||||
* remote client, it can be found at *in and is
|
||||
* len bytes long */
|
||||
|
||||
LWS_CALLBACK_RECEIVE_PONG = 7,
|
||||
/**< servers receive PONG packets with this callback reason */
|
||||
|
||||
LWS_CALLBACK_WS_PEER_INITIATED_CLOSE = 38,
|
||||
/**< The peer has sent an unsolicited Close WS packet. in and
|
||||
* len are the optional close code (first 2 bytes, network
|
||||
* order) and the optional additional information which is not
|
||||
* defined in the standard, and may be a string or non human-readable
|
||||
* data.
|
||||
* If you return 0 lws will echo the close and then close the
|
||||
* connection. If you return nonzero lws will just close the
|
||||
* connection. */
|
||||
|
||||
LWS_CALLBACK_FILTER_PROTOCOL_CONNECTION = 20,
|
||||
/**< called when the handshake has
|
||||
* been received and parsed from the client, but the response is
|
||||
* not sent yet. Return non-zero to disallow the connection.
|
||||
* user is a pointer to the connection user space allocation,
|
||||
* in is the requested protocol name
|
||||
* In your handler you can use the public APIs
|
||||
* lws_hdr_total_length() / lws_hdr_copy() to access all of the
|
||||
* headers using the header enums lws_token_indexes from
|
||||
* libwebsockets.h to check for and read the supported header
|
||||
* presence and content before deciding to allow the handshake
|
||||
* to proceed or to kill the connection. */
|
||||
|
||||
LWS_CALLBACK_CONFIRM_EXTENSION_OKAY = 25,
|
||||
/**< When the server handshake code
|
||||
* sees that it does support a requested extension, before
|
||||
* accepting the extension by additing to the list sent back to
|
||||
* the client it gives this callback just to check that it's okay
|
||||
* to use that extension. It calls back to the requested protocol
|
||||
* and with in being the extension name, len is 0 and user is
|
||||
* valid. Note though at this time the ESTABLISHED callback hasn't
|
||||
* happened yet so if you initialize user content there, user
|
||||
* content during this callback might not be useful for anything. */
|
||||
|
||||
LWS_CALLBACK_WS_SERVER_BIND_PROTOCOL = 77,
|
||||
LWS_CALLBACK_WS_SERVER_DROP_PROTOCOL = 78,
|
||||
|
||||
/* ---------------------------------------------------------------------
|
||||
* ----- Callbacks related to Websocket Client -----
|
||||
*/
|
||||
|
||||
LWS_CALLBACK_CLIENT_CONNECTION_ERROR = 1,
|
||||
/**< the request client connection has been unable to complete a
|
||||
* handshake with the remote server. If in is non-NULL, you can
|
||||
* find an error string of length len where it points to
|
||||
*
|
||||
* Diagnostic strings that may be returned include
|
||||
*
|
||||
* "getaddrinfo (ipv6) failed"
|
||||
* "unknown address family"
|
||||
* "getaddrinfo (ipv4) failed"
|
||||
* "set socket opts failed"
|
||||
* "insert wsi failed"
|
||||
* "lws_ssl_client_connect1 failed"
|
||||
* "lws_ssl_client_connect2 failed"
|
||||
* "Peer hung up"
|
||||
* "read failed"
|
||||
* "HS: URI missing"
|
||||
* "HS: Redirect code but no Location"
|
||||
* "HS: URI did not parse"
|
||||
* "HS: Redirect failed"
|
||||
* "HS: Server did not return 200"
|
||||
* "HS: OOM"
|
||||
* "HS: disallowed by client filter"
|
||||
* "HS: disallowed at ESTABLISHED"
|
||||
* "HS: ACCEPT missing"
|
||||
* "HS: ws upgrade response not 101"
|
||||
* "HS: UPGRADE missing"
|
||||
* "HS: Upgrade to something other than websocket"
|
||||
* "HS: CONNECTION missing"
|
||||
* "HS: UPGRADE malformed"
|
||||
* "HS: PROTOCOL malformed"
|
||||
* "HS: Cannot match protocol"
|
||||
* "HS: EXT: list too big"
|
||||
* "HS: EXT: failed setting defaults"
|
||||
* "HS: EXT: failed parsing defaults"
|
||||
* "HS: EXT: failed parsing options"
|
||||
* "HS: EXT: Rejects server options"
|
||||
* "HS: EXT: unknown ext"
|
||||
* "HS: Accept hash wrong"
|
||||
* "HS: Rejected by filter cb"
|
||||
* "HS: OOM"
|
||||
* "HS: SO_SNDBUF failed"
|
||||
* "HS: Rejected at CLIENT_ESTABLISHED"
|
||||
*/
|
||||
|
||||
LWS_CALLBACK_CLIENT_FILTER_PRE_ESTABLISH = 2,
|
||||
/**< this is the last chance for the client user code to examine the
|
||||
* http headers and decide to reject the connection. If the
|
||||
* content in the headers is interesting to the
|
||||
* client (url, etc) it needs to copy it out at
|
||||
* this point since it will be destroyed before
|
||||
* the CLIENT_ESTABLISHED call */
|
||||
|
||||
LWS_CALLBACK_CLIENT_ESTABLISHED = 3,
|
||||
/**< after your client connection completed the websocket upgrade
|
||||
* handshake with the remote server */
|
||||
|
||||
LWS_CALLBACK_CLIENT_CLOSED = 75,
|
||||
/**< when a client websocket session ends */
|
||||
|
||||
LWS_CALLBACK_CLIENT_APPEND_HANDSHAKE_HEADER = 24,
|
||||
/**< this callback happens
|
||||
* when a client handshake is being compiled. user is NULL,
|
||||
* in is a char **, it's pointing to a char * which holds the
|
||||
* next location in the header buffer where you can add
|
||||
* headers, and len is the remaining space in the header buffer,
|
||||
* which is typically some hundreds of bytes. So, to add a canned
|
||||
* cookie, your handler code might look similar to:
|
||||
*
|
||||
* char **p = (char **)in, *end = (*p) + len;
|
||||
*
|
||||
* if (lws_add_http_header_by_token(wsi, WSI_TOKEN_HTTP_COOKIE,
|
||||
* (unsigned char)"a=b", 3, p, end))
|
||||
* return -1;
|
||||
*
|
||||
* See LWS_CALLBACK_ADD_HEADERS for adding headers to server
|
||||
* transactions.
|
||||
*/
|
||||
|
||||
LWS_CALLBACK_CLIENT_RECEIVE = 8,
|
||||
/**< data has appeared from the server for the client connection, it
|
||||
* can be found at *in and is len bytes long */
|
||||
|
||||
LWS_CALLBACK_CLIENT_RECEIVE_PONG = 9,
|
||||
/**< clients receive PONG packets with this callback reason */
|
||||
|
||||
LWS_CALLBACK_CLIENT_WRITEABLE = 10,
|
||||
/**< If you call lws_callback_on_writable() on a connection, you will
|
||||
* get one of these callbacks coming when the connection socket
|
||||
* is able to accept another write packet without blocking.
|
||||
* If it already was able to take another packet without blocking,
|
||||
* you'll get this callback at the next call to the service loop
|
||||
* function. Notice that CLIENTs get LWS_CALLBACK_CLIENT_WRITEABLE
|
||||
* and servers get LWS_CALLBACK_SERVER_WRITEABLE. */
|
||||
|
||||
LWS_CALLBACK_CLIENT_CONFIRM_EXTENSION_SUPPORTED = 26,
|
||||
/**< When a ws client
|
||||
* connection is being prepared to start a handshake to a server,
|
||||
* each supported extension is checked with protocols[0] callback
|
||||
* with this reason, giving the user code a chance to suppress the
|
||||
* claim to support that extension by returning non-zero. If
|
||||
* unhandled, by default 0 will be returned and the extension
|
||||
* support included in the header to the server. Notice this
|
||||
* callback comes to protocols[0]. */
|
||||
|
||||
LWS_CALLBACK_WS_EXT_DEFAULTS = 39,
|
||||
/**< Gives client connections an opportunity to adjust negotiated
|
||||
* extension defaults. `user` is the extension name that was
|
||||
* negotiated (eg, "permessage-deflate"). `in` points to a
|
||||
* buffer and `len` is the buffer size. The user callback can
|
||||
* set the buffer to a string describing options the extension
|
||||
* should parse. Or just ignore for defaults. */
|
||||
|
||||
|
||||
LWS_CALLBACK_FILTER_NETWORK_CONNECTION = 17,
|
||||
/**< called when a client connects to
|
||||
* the server at network level; the connection is accepted but then
|
||||
* passed to this callback to decide whether to hang up immediately
|
||||
* or not, based on the client IP.
|
||||
*
|
||||
* user_data in the callback points to a
|
||||
* struct lws_filter_network_conn_args that is prepared with the
|
||||
* sockfd, and the peer's address information.
|
||||
*
|
||||
* in contains the connection socket's descriptor.
|
||||
*
|
||||
* Since the client connection information is not available yet,
|
||||
* wsi still pointing to the main server socket.
|
||||
*
|
||||
* Return non-zero to terminate the connection before sending or
|
||||
* receiving anything. Because this happens immediately after the
|
||||
* network connection from the client, there's no websocket protocol
|
||||
* selected yet so this callback is issued only to protocol 0. */
|
||||
|
||||
LWS_CALLBACK_WS_CLIENT_BIND_PROTOCOL = 79,
|
||||
LWS_CALLBACK_WS_CLIENT_DROP_PROTOCOL = 80,
|
||||
|
||||
/* ---------------------------------------------------------------------
|
||||
* ----- Callbacks related to external poll loop integration -----
|
||||
*/
|
||||
|
||||
LWS_CALLBACK_GET_THREAD_ID = 31,
|
||||
/**< lws can accept callback when writable requests from other
|
||||
* threads, if you implement this callback and return an opaque
|
||||
* current thread ID integer. */
|
||||
|
||||
/* external poll() management support */
|
||||
LWS_CALLBACK_ADD_POLL_FD = 32,
|
||||
/**< lws normally deals with its poll() or other event loop
|
||||
* internally, but in the case you are integrating with another
|
||||
* server you will need to have lws sockets share a
|
||||
* polling array with the other server. This and the other
|
||||
* POLL_FD related callbacks let you put your specialized
|
||||
* poll array interface code in the callback for protocol 0, the
|
||||
* first protocol you support, usually the HTTP protocol in the
|
||||
* serving case.
|
||||
* This callback happens when a socket needs to be
|
||||
* added to the polling loop: in points to a struct
|
||||
* lws_pollargs; the fd member of the struct is the file
|
||||
* descriptor, and events contains the active events
|
||||
*
|
||||
* If you are using the internal lws polling / event loop
|
||||
* you can just ignore these callbacks. */
|
||||
|
||||
LWS_CALLBACK_DEL_POLL_FD = 33,
|
||||
/**< This callback happens when a socket descriptor
|
||||
* needs to be removed from an external polling array. in is
|
||||
* again the struct lws_pollargs containing the fd member
|
||||
* to be removed. If you are using the internal polling
|
||||
* loop, you can just ignore it. */
|
||||
|
||||
LWS_CALLBACK_CHANGE_MODE_POLL_FD = 34,
|
||||
/**< This callback happens when lws wants to modify the events for
|
||||
* a connection.
|
||||
* in is the struct lws_pollargs with the fd to change.
|
||||
* The new event mask is in events member and the old mask is in
|
||||
* the prev_events member.
|
||||
* If you are using the internal polling loop, you can just ignore
|
||||
* it. */
|
||||
|
||||
LWS_CALLBACK_LOCK_POLL = 35,
|
||||
/**< These allow the external poll changes driven
|
||||
* by lws to participate in an external thread locking
|
||||
* scheme around the changes, so the whole thing is threadsafe.
|
||||
* These are called around three activities in the library,
|
||||
* - inserting a new wsi in the wsi / fd table (len=1)
|
||||
* - deleting a wsi from the wsi / fd table (len=1)
|
||||
* - changing a wsi's POLLIN/OUT state (len=0)
|
||||
* Locking and unlocking external synchronization objects when
|
||||
* len == 1 allows external threads to be synchronized against
|
||||
* wsi lifecycle changes if it acquires the same lock for the
|
||||
* duration of wsi dereference from the other thread context. */
|
||||
|
||||
LWS_CALLBACK_UNLOCK_POLL = 36,
|
||||
/**< See LWS_CALLBACK_LOCK_POLL, ignore if using lws internal poll */
|
||||
|
||||
/* ---------------------------------------------------------------------
|
||||
* ----- Callbacks related to CGI serving -----
|
||||
*/
|
||||
|
||||
LWS_CALLBACK_CGI = 40,
|
||||
/**< CGI: CGI IO events on stdin / out / err are sent here on
|
||||
* protocols[0]. The provided `lws_callback_http_dummy()`
|
||||
* handles this and the callback should be directed there if
|
||||
* you use CGI. */
|
||||
|
||||
LWS_CALLBACK_CGI_TERMINATED = 41,
|
||||
/**< CGI: The related CGI process ended, this is called before
|
||||
* the wsi is closed. Used to, eg, terminate chunking.
|
||||
* The provided `lws_callback_http_dummy()`
|
||||
* handles this and the callback should be directed there if
|
||||
* you use CGI. The child PID that terminated is in len. */
|
||||
|
||||
LWS_CALLBACK_CGI_STDIN_DATA = 42,
|
||||
/**< CGI: Data is, to be sent to the CGI process stdin, eg from
|
||||
* a POST body. The provided `lws_callback_http_dummy()`
|
||||
* handles this and the callback should be directed there if
|
||||
* you use CGI. */
|
||||
|
||||
LWS_CALLBACK_CGI_STDIN_COMPLETED = 43,
|
||||
/**< CGI: no more stdin is coming. The provided
|
||||
* `lws_callback_http_dummy()` handles this and the callback
|
||||
* should be directed there if you use CGI. */
|
||||
|
||||
LWS_CALLBACK_CGI_PROCESS_ATTACH = 70,
|
||||
/**< CGI: Sent when the CGI process is spawned for the wsi. The
|
||||
* len parameter is the PID of the child process */
|
||||
|
||||
/* ---------------------------------------------------------------------
|
||||
* ----- Callbacks related to Generic Sessions -----
|
||||
*/
|
||||
|
||||
LWS_CALLBACK_SESSION_INFO = 54,
|
||||
/**< This is only generated by user code using generic sessions.
|
||||
* It's used to get a `struct lws_session_info` filled in by
|
||||
* generic sessions with information about the logged-in user.
|
||||
* See the messageboard sample for an example of how to use. */
|
||||
|
||||
LWS_CALLBACK_GS_EVENT = 55,
|
||||
/**< Indicates an event happened to the Generic Sessions session.
|
||||
* `in` contains a `struct lws_gs_event_args` describing the event. */
|
||||
|
||||
LWS_CALLBACK_HTTP_PMO = 56,
|
||||
/**< per-mount options for this connection, called before
|
||||
* the normal LWS_CALLBACK_HTTP when the mount has per-mount
|
||||
* options.
|
||||
*/
|
||||
|
||||
/* ---------------------------------------------------------------------
|
||||
* ----- Callbacks related to RAW PROXY -----
|
||||
*/
|
||||
|
||||
LWS_CALLBACK_RAW_PROXY_CLI_RX = 89,
|
||||
/**< RAW mode client (outgoing) RX */
|
||||
|
||||
LWS_CALLBACK_RAW_PROXY_SRV_RX = 90,
|
||||
/**< RAW mode server (listening) RX */
|
||||
|
||||
LWS_CALLBACK_RAW_PROXY_CLI_CLOSE = 91,
|
||||
/**< RAW mode client (outgoing) is closing */
|
||||
|
||||
LWS_CALLBACK_RAW_PROXY_SRV_CLOSE = 92,
|
||||
/**< RAW mode server (listening) is closing */
|
||||
|
||||
LWS_CALLBACK_RAW_PROXY_CLI_WRITEABLE = 93,
|
||||
/**< RAW mode client (outgoing) may be written */
|
||||
|
||||
LWS_CALLBACK_RAW_PROXY_SRV_WRITEABLE = 94,
|
||||
/**< RAW mode server (listening) may be written */
|
||||
|
||||
LWS_CALLBACK_RAW_PROXY_CLI_ADOPT = 95,
|
||||
/**< RAW mode client (onward) accepted socket was adopted
|
||||
* (equivalent to 'wsi created') */
|
||||
|
||||
LWS_CALLBACK_RAW_PROXY_SRV_ADOPT = 96,
|
||||
/**< RAW mode server (listening) accepted socket was adopted
|
||||
* (equivalent to 'wsi created') */
|
||||
|
||||
LWS_CALLBACK_RAW_PROXY_CLI_BIND_PROTOCOL = 97,
|
||||
LWS_CALLBACK_RAW_PROXY_SRV_BIND_PROTOCOL = 98,
|
||||
LWS_CALLBACK_RAW_PROXY_CLI_DROP_PROTOCOL = 99,
|
||||
LWS_CALLBACK_RAW_PROXY_SRV_DROP_PROTOCOL = 100,
|
||||
|
||||
|
||||
/* ---------------------------------------------------------------------
|
||||
* ----- Callbacks related to RAW sockets -----
|
||||
*/
|
||||
|
||||
LWS_CALLBACK_RAW_RX = 59,
|
||||
/**< RAW mode connection RX */
|
||||
|
||||
LWS_CALLBACK_RAW_CLOSE = 60,
|
||||
/**< RAW mode connection is closing */
|
||||
|
||||
LWS_CALLBACK_RAW_WRITEABLE = 61,
|
||||
/**< RAW mode connection may be written */
|
||||
|
||||
LWS_CALLBACK_RAW_ADOPT = 62,
|
||||
/**< RAW mode connection was adopted (equivalent to 'wsi created') */
|
||||
|
||||
LWS_CALLBACK_RAW_CONNECTED = 101,
|
||||
/**< outgoing client RAW mode connection was connected */
|
||||
|
||||
LWS_CALLBACK_RAW_SKT_BIND_PROTOCOL = 81,
|
||||
LWS_CALLBACK_RAW_SKT_DROP_PROTOCOL = 82,
|
||||
|
||||
/* ---------------------------------------------------------------------
|
||||
* ----- Callbacks related to RAW file handles -----
|
||||
*/
|
||||
|
||||
LWS_CALLBACK_RAW_ADOPT_FILE = 63,
|
||||
/**< RAW mode file was adopted (equivalent to 'wsi created') */
|
||||
|
||||
LWS_CALLBACK_RAW_RX_FILE = 64,
|
||||
/**< This is the indication the RAW mode file has something to read.
|
||||
* This doesn't actually do the read of the file and len is always
|
||||
* 0... your code should do the read having been informed there is
|
||||
* something to read now. */
|
||||
|
||||
LWS_CALLBACK_RAW_WRITEABLE_FILE = 65,
|
||||
/**< RAW mode file is writeable */
|
||||
|
||||
LWS_CALLBACK_RAW_CLOSE_FILE = 66,
|
||||
/**< RAW mode wsi that adopted a file is closing */
|
||||
|
||||
LWS_CALLBACK_RAW_FILE_BIND_PROTOCOL = 83,
|
||||
LWS_CALLBACK_RAW_FILE_DROP_PROTOCOL = 84,
|
||||
|
||||
/* ---------------------------------------------------------------------
|
||||
* ----- Callbacks related to generic wsi events -----
|
||||
*/
|
||||
|
||||
LWS_CALLBACK_TIMER = 73,
|
||||
/**< When the time elapsed after a call to
|
||||
* lws_set_timer_usecs(wsi, usecs) is up, the wsi will get one of
|
||||
* these callbacks. The deadline can be continuously extended into the
|
||||
* future by later calls to lws_set_timer_usecs() before the deadline
|
||||
* expires, or cancelled by lws_set_timer_usecs(wsi, -1);
|
||||
*/
|
||||
|
||||
LWS_CALLBACK_EVENT_WAIT_CANCELLED = 71,
|
||||
/**< This is sent to every protocol of every vhost in response
|
||||
* to lws_cancel_service() or lws_cancel_service_pt(). This
|
||||
* callback is serialized in the lws event loop normally, even
|
||||
* if the lws_cancel_service[_pt]() call was from a different
|
||||
* thread. */
|
||||
|
||||
LWS_CALLBACK_CHILD_CLOSING = 69,
|
||||
/**< Sent to parent to notify them a child is closing / being
|
||||
* destroyed. in is the child wsi.
|
||||
*/
|
||||
|
||||
LWS_CALLBACK_CONNECTING = 105,
|
||||
/**< Called before a socketfd is about to connect(). In is the
|
||||
* socketfd, cast to a (void *), if on a platform where the socketfd
|
||||
* is an int, recover portably using (lws_sockfd_type)(intptr_t)in.
|
||||
*
|
||||
* It's also called in SOCKS5 or http_proxy cases where the socketfd is
|
||||
* going to try to connect to its proxy.
|
||||
*/
|
||||
|
||||
/* ---------------------------------------------------------------------
|
||||
* ----- Callbacks related to TLS certificate management -----
|
||||
*/
|
||||
|
||||
LWS_CALLBACK_VHOST_CERT_AGING = 72,
|
||||
/**< When a vhost TLS cert has its expiry checked, this callback
|
||||
* is broadcast to every protocol of every vhost in case the
|
||||
* protocol wants to take some action with this information.
|
||||
* \p in is a pointer to a struct lws_acme_cert_aging_args,
|
||||
* and \p len is the number of days left before it expires, as
|
||||
* a (ssize_t). In the struct lws_acme_cert_aging_args, vh
|
||||
* points to the vhost the cert aging information applies to,
|
||||
* and element_overrides[] is an optional way to update information
|
||||
* from the pvos... NULL in an index means use the information from
|
||||
* from the pvo for the cert renewal, non-NULL in the array index
|
||||
* means use that pointer instead for the index. */
|
||||
|
||||
LWS_CALLBACK_VHOST_CERT_UPDATE = 74,
|
||||
/**< When a vhost TLS cert is being updated, progress is
|
||||
* reported to the vhost in question here, including completion
|
||||
* and failure. in points to optional JSON, and len represents the
|
||||
* connection state using enum lws_cert_update_state */
|
||||
|
||||
/* ---------------------------------------------------------------------
|
||||
* ----- Callbacks related to MQTT Client -----
|
||||
*/
|
||||
|
||||
LWS_CALLBACK_MQTT_NEW_CLIENT_INSTANTIATED = 200,
|
||||
LWS_CALLBACK_MQTT_IDLE = 201,
|
||||
LWS_CALLBACK_MQTT_CLIENT_ESTABLISHED = 202,
|
||||
LWS_CALLBACK_MQTT_SUBSCRIBED = 203,
|
||||
LWS_CALLBACK_MQTT_CLIENT_WRITEABLE = 204,
|
||||
LWS_CALLBACK_MQTT_CLIENT_RX = 205,
|
||||
LWS_CALLBACK_MQTT_UNSUBSCRIBED = 206,
|
||||
LWS_CALLBACK_MQTT_DROP_PROTOCOL = 207,
|
||||
LWS_CALLBACK_MQTT_CLIENT_CLOSED = 208,
|
||||
LWS_CALLBACK_MQTT_ACK = 209,
|
||||
/**< When a message is fully sent, if QoS0 this callback is generated
|
||||
* to locally "acknowledge" it. For QoS1, this callback is only
|
||||
* generated when the matching PUBACK is received. Return nonzero to
|
||||
* close the wsi.
|
||||
*/
|
||||
LWS_CALLBACK_MQTT_RESEND = 210,
|
||||
/**< In QoS1 or QoS2, this callback is generated instead of the _ACK one
|
||||
* if we timed out waiting for a PUBACK or a PUBREC, and we must resend
|
||||
* the message. Return nonzero to close the wsi.
|
||||
*/
|
||||
LWS_CALLBACK_MQTT_UNSUBSCRIBE_TIMEOUT = 211,
|
||||
/**< When a UNSUBSCRIBE is sent, this callback is generated instead of
|
||||
* the _UNSUBSCRIBED one if we timed out waiting for a UNSUBACK.
|
||||
* Return nonzero to close the wsi.
|
||||
*/
|
||||
LWS_CALLBACK_MQTT_SHADOW_TIMEOUT = 212,
|
||||
/**< When a Device Shadow is sent, this callback is generated if we
|
||||
* timed out waiting for a response from AWS IoT.
|
||||
* Return nonzero to close the wsi.
|
||||
*/
|
||||
|
||||
/****** add new things just above ---^ ******/
|
||||
|
||||
LWS_CALLBACK_USER = 1000,
|
||||
/**< user code can use any including above without fear of clashes */
|
||||
};
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* typedef lws_callback_function() - User server actions
|
||||
* \param wsi: Opaque websocket instance pointer
|
||||
* \param reason: The reason for the call
|
||||
* \param user: Pointer to per-session user data allocated by library
|
||||
* \param in: Pointer used for some callback reasons
|
||||
* \param len: Length set for some callback reasons
|
||||
*
|
||||
* This callback is the way the user controls what is served. All the
|
||||
* protocol detail is hidden and handled by the library.
|
||||
*
|
||||
* For each connection / session there is user data allocated that is
|
||||
* pointed to by "user". You set the size of this user data area when
|
||||
* the library is initialized with lws_create_server.
|
||||
*/
|
||||
typedef int
|
||||
lws_callback_function(struct lws *wsi, enum lws_callback_reasons reason,
|
||||
void *user, void *in, size_t len);
|
||||
|
||||
#define LWS_CB_REASON_AUX_BF__CGI 1
|
||||
#define LWS_CB_REASON_AUX_BF__PROXY 2
|
||||
#define LWS_CB_REASON_AUX_BF__CGI_CHUNK_END 4
|
||||
#define LWS_CB_REASON_AUX_BF__CGI_HEADERS 8
|
||||
#define LWS_CB_REASON_AUX_BF__PROXY_TRANS_END 16
|
||||
#define LWS_CB_REASON_AUX_BF__PROXY_HEADERS 32
|
||||
///@}
|
||||
104
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-cgi.h
Normal file
104
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-cgi.h
Normal file
@ -0,0 +1,104 @@
|
||||
/*
|
||||
* libwebsockets - small server side websockets and web server implementation
|
||||
*
|
||||
* Copyright (C) 2010 - 2019 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
/*! \defgroup cgi cgi handling
|
||||
*
|
||||
* ##CGI handling
|
||||
*
|
||||
* These functions allow low-level control over stdin/out/err of the cgi.
|
||||
*
|
||||
* However for most cases, binding the cgi to http in and out, the default
|
||||
* lws implementation already does the right thing.
|
||||
*/
|
||||
|
||||
enum lws_enum_stdinouterr {
|
||||
LWS_STDIN = 0,
|
||||
LWS_STDOUT = 1,
|
||||
LWS_STDERR = 2,
|
||||
};
|
||||
|
||||
enum lws_cgi_hdr_state {
|
||||
LCHS_HEADER,
|
||||
LCHS_CR1,
|
||||
LCHS_LF1,
|
||||
LCHS_CR2,
|
||||
LCHS_LF2,
|
||||
LHCS_RESPONSE,
|
||||
LHCS_DUMP_HEADERS,
|
||||
LHCS_PAYLOAD,
|
||||
LCHS_SINGLE_0A,
|
||||
};
|
||||
|
||||
struct lws_cgi_args {
|
||||
struct lws **stdwsi; /**< get fd with lws_get_socket_fd() */
|
||||
enum lws_enum_stdinouterr ch; /**< channel index */
|
||||
unsigned char *data; /**< for messages with payload */
|
||||
enum lws_cgi_hdr_state hdr_state; /**< track where we are in cgi headers */
|
||||
int len; /**< length */
|
||||
};
|
||||
|
||||
#ifdef LWS_WITH_CGI
|
||||
/**
|
||||
* lws_cgi: spawn network-connected cgi process
|
||||
*
|
||||
* \param wsi: connection to own the process
|
||||
* \param exec_array: array of "exec-name" "arg1" ... "argn" NULL
|
||||
* \param script_uri_path_len: how many chars on the left of the uri are the
|
||||
* path to the cgi, or -1 to spawn without URL-related env vars
|
||||
* \param timeout_secs: seconds script should be allowed to run
|
||||
* \param mp_cgienv: pvo list with per-vhost cgi options to put in env
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_cgi(struct lws *wsi, const char * const *exec_array,
|
||||
int script_uri_path_len, int timeout_secs,
|
||||
const struct lws_protocol_vhost_options *mp_cgienv);
|
||||
|
||||
/**
|
||||
* lws_cgi_write_split_stdout_headers: write cgi output accounting for header part
|
||||
*
|
||||
* \param wsi: connection to own the process
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_cgi_write_split_stdout_headers(struct lws *wsi);
|
||||
|
||||
/**
|
||||
* lws_cgi_kill: terminate cgi process associated with wsi
|
||||
*
|
||||
* \param wsi: connection to own the process
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_cgi_kill(struct lws *wsi);
|
||||
|
||||
/**
|
||||
* lws_cgi_get_stdwsi: get wsi for stdin, stdout, or stderr
|
||||
*
|
||||
* \param wsi: parent wsi that has cgi
|
||||
* \param ch: which of LWS_STDIN, LWS_STDOUT or LWS_STDERR
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN struct lws *
|
||||
lws_cgi_get_stdwsi(struct lws *wsi, enum lws_enum_stdinouterr ch);
|
||||
|
||||
#endif
|
||||
///@}
|
||||
|
||||
457
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-client.h
Normal file
457
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-client.h
Normal file
@ -0,0 +1,457 @@
|
||||
/*
|
||||
* libwebsockets - small server side websockets and web server implementation
|
||||
*
|
||||
* Copyright (C) 2010 - 2021 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
/*! \defgroup client Client related functions
|
||||
* ##Client releated functions
|
||||
* \ingroup lwsapi
|
||||
*
|
||||
* */
|
||||
///@{
|
||||
|
||||
/** enum lws_client_connect_ssl_connection_flags - flags that may be used
|
||||
* with struct lws_client_connect_info ssl_connection member to control if
|
||||
* and how SSL checks apply to the client connection being created
|
||||
*/
|
||||
|
||||
enum lws_client_connect_ssl_connection_flags {
|
||||
LCCSCF_USE_SSL = (1 << 0),
|
||||
LCCSCF_ALLOW_SELFSIGNED = (1 << 1),
|
||||
LCCSCF_SKIP_SERVER_CERT_HOSTNAME_CHECK = (1 << 2),
|
||||
LCCSCF_ALLOW_EXPIRED = (1 << 3),
|
||||
LCCSCF_ALLOW_INSECURE = (1 << 4),
|
||||
LCCSCF_H2_QUIRK_NGHTTP2_END_STREAM = (1 << 5),
|
||||
LCCSCF_H2_QUIRK_OVERFLOWS_TXCR = (1 << 6),
|
||||
LCCSCF_H2_AUTH_BEARER = (1 << 7),
|
||||
LCCSCF_H2_HEXIFY_AUTH_TOKEN = (1 << 8),
|
||||
LCCSCF_H2_MANUAL_RXFLOW = (1 << 9),
|
||||
LCCSCF_HTTP_MULTIPART_MIME = (1 << 10),
|
||||
LCCSCF_HTTP_X_WWW_FORM_URLENCODED = (1 << 11),
|
||||
LCCSCF_HTTP_NO_FOLLOW_REDIRECT = (1 << 12),
|
||||
LCCSCF_HTTP_NO_CACHE_CONTROL = (1 << 13),
|
||||
|
||||
LCCSCF_ALLOW_REUSE_ADDR = (1 << 14),
|
||||
/**< allow reuse local addresses in a bind call
|
||||
* When the listening socket is bound to INADDR_ANY with a specific port
|
||||
* then it is not possible to bind to this port for any local address
|
||||
*/
|
||||
|
||||
LCCSCF_IPV6_PREFER_PUBLIC_ADDR = (1 << 15),
|
||||
/**< RFC5014 - For IPv6 systems with SLAAC config, allow for preference
|
||||
* to bind a socket to public address vs temporary private address
|
||||
*/
|
||||
|
||||
LCCSCF_PIPELINE = (1 << 16),
|
||||
/**< Serialize / pipeline multiple client connections
|
||||
* on a single connection where possible.
|
||||
*
|
||||
* HTTP/1.0: possible if Keep-Alive: yes sent by server
|
||||
* HTTP/1.1: always possible... uses pipelining
|
||||
* HTTP/2: always possible... uses parallel streams
|
||||
*/
|
||||
LCCSCF_MUXABLE_STREAM = (1 << 17),
|
||||
LCCSCF_H2_PRIOR_KNOWLEDGE = (1 << 18),
|
||||
LCCSCF_WAKE_SUSPEND__VALIDITY = (1 << 19),
|
||||
/* our validity checks are important enough to wake from suspend */
|
||||
LCCSCF_PRIORITIZE_READS = (1 << 20),
|
||||
/**<
|
||||
* Normally lws balances reads and writes on all connections, so both
|
||||
* are possible even on busy connections, and we go around the event
|
||||
* loop more often to facilitate that, even if there is pending data.
|
||||
*
|
||||
* This flag indicates that you want to handle any pending reads on this
|
||||
* connection without yielding the service loop for anything else. This
|
||||
* means you may block other connection processing in favour of incoming
|
||||
* data processing on this one if it receives back to back incoming rx.
|
||||
*/
|
||||
LCCSCF_SECSTREAM_CLIENT = (1 << 21),
|
||||
/**< used to mark client wsi as bound to secure stream */
|
||||
LCCSCF_SECSTREAM_PROXY_LINK = (1 << 22),
|
||||
/**< client is a link between SS client and SS proxy */
|
||||
LCCSCF_SECSTREAM_PROXY_ONWARD = (1 << 23),
|
||||
/**< client the SS proxy's onward connection */
|
||||
|
||||
LCCSCF_IP_LOW_LATENCY = (1 << 24),
|
||||
/**< set the "low delay" bit on the IP packets of this connection */
|
||||
LCCSCF_IP_HIGH_THROUGHPUT = (1 << 25),
|
||||
/**< set the "high throughput" bit on the IP packets of this
|
||||
* connection */
|
||||
LCCSCF_IP_HIGH_RELIABILITY = (1 << 26),
|
||||
/**< set the "high reliability" bit on the IP packets of this
|
||||
* connection */
|
||||
LCCSCF_IP_LOW_COST = (1 << 27),
|
||||
/**< set the "minimize monetary cost" bit on the IP packets of this
|
||||
* connection */
|
||||
LCCSCF_CONMON = (1 << 28),
|
||||
/**< If LWS_WITH_CONMON enabled for build, keeps a copy of the
|
||||
* getaddrinfo results so they can be queried subsequently */
|
||||
LCCSCF_ACCEPT_TLS_DOWNGRADE_REDIRECTS = (1 << 29),
|
||||
/**< By default lws rejects https redirecting to http. Set this
|
||||
* flag on the client connection to allow it. */
|
||||
LCCSCF_CACHE_COOKIES = (1 << 30),
|
||||
/**< If built with -DLWS_WITH_CACHE_NSCOOKIEJAR, store and reapply
|
||||
* http cookies in a Netscape Cookie Jar on this connection */
|
||||
};
|
||||
|
||||
/** struct lws_client_connect_info - parameters to connect with when using
|
||||
* lws_client_connect_via_info() */
|
||||
|
||||
struct lws_client_connect_info {
|
||||
struct lws_context *context;
|
||||
/**< lws context to create connection in */
|
||||
const char *address;
|
||||
/**< remote address to connect to */
|
||||
int port;
|
||||
/**< remote port to connect to */
|
||||
int ssl_connection;
|
||||
/**< 0, or a combination of LCCSCF_ flags */
|
||||
const char *path;
|
||||
/**< URI path. Prefix with + for a UNIX socket. (+@ for
|
||||
* a Linux abstract-namespace socket) */
|
||||
const char *host;
|
||||
/**< content of host header */
|
||||
const char *origin;
|
||||
/**< content of origin header */
|
||||
const char *protocol;
|
||||
/**< list of ws protocols we could accept */
|
||||
int ietf_version_or_minus_one;
|
||||
/**< deprecated: currently leave at 0 or -1 */
|
||||
void *userdata;
|
||||
/**< if non-NULL, use this as wsi user_data instead of malloc it */
|
||||
const void *client_exts;
|
||||
/**< UNUSED... provide in info.extensions at context creation time */
|
||||
const char *method;
|
||||
/**< if non-NULL, do this http method instead of ws[s] upgrade.
|
||||
* use "GET" to be a simple http client connection. "RAW" gets
|
||||
* you a connected socket that lws itself will leave alone once
|
||||
* connected. */
|
||||
struct lws *parent_wsi;
|
||||
/**< if another wsi is responsible for this connection, give it here.
|
||||
* this is used to make sure if the parent closes so do any
|
||||
* child connections first. */
|
||||
const char *uri_replace_from;
|
||||
/**< if non-NULL, when this string is found in URIs in
|
||||
* text/html content-encoding, it's replaced with uri_replace_to */
|
||||
const char *uri_replace_to;
|
||||
/**< see uri_replace_from */
|
||||
struct lws_vhost *vhost;
|
||||
/**< vhost to bind to (used to determine related SSL_CTX) */
|
||||
struct lws **pwsi;
|
||||
/**< if not NULL, store the new wsi here early in the connection
|
||||
* process. Although we return the new wsi, the call to create the
|
||||
* client connection does progress the connection somewhat and may
|
||||
* meet an error that will result in the connection being scrubbed and
|
||||
* NULL returned. While the wsi exists though, he may process a
|
||||
* callback like CLIENT_CONNECTION_ERROR with his wsi: this gives the
|
||||
* user callback a way to identify which wsi it is that faced the error
|
||||
* even before the new wsi is returned and even if ultimately no wsi
|
||||
* is returned.
|
||||
*/
|
||||
const char *iface;
|
||||
/**< NULL to allow routing on any interface, or interface name or IP
|
||||
* to bind the socket to */
|
||||
int local_port;
|
||||
/**< 0 to pick an ephemeral port, or a specific local port
|
||||
* to bind the socket to */
|
||||
const char *local_protocol_name;
|
||||
/**< NULL: .protocol is used both to select the local protocol handler
|
||||
* to bind to and as the list of remote ws protocols we could
|
||||
* accept.
|
||||
* non-NULL: this protocol name is used to bind the connection to
|
||||
* the local protocol handler. .protocol is used for the
|
||||
* list of remote ws protocols we could accept */
|
||||
const char *alpn;
|
||||
/**< NULL: allow lws default ALPN list, from vhost if present or from
|
||||
* list of roles built into lws
|
||||
* non-NULL: require one from provided comma-separated list of alpn
|
||||
* tokens
|
||||
*/
|
||||
|
||||
void *opaque_user_data;
|
||||
/**< This data has no meaning to lws but is applied to the client wsi
|
||||
* and can be retrieved by user code with lws_get_opaque_user_data().
|
||||
* It's also provided with sequencer messages if the wsi is bound to
|
||||
* an lws_seq_t.
|
||||
*/
|
||||
|
||||
const lws_retry_bo_t *retry_and_idle_policy;
|
||||
/**< optional retry and idle policy to apply to this connection.
|
||||
* Currently only the idle parts are applied to the connection.
|
||||
*/
|
||||
|
||||
int manual_initial_tx_credit;
|
||||
/**< if LCCSCF_H2_MANUAL_REFLOW is set, this becomes the initial tx
|
||||
* credit for the stream.
|
||||
*/
|
||||
|
||||
uint8_t sys_tls_client_cert;
|
||||
/**< 0 means no client cert. 1+ means apply lws_system client cert 0+
|
||||
* to the client connection.
|
||||
*/
|
||||
|
||||
uint8_t priority;
|
||||
/**< 0 means normal priority... otherwise sets the IP priority on
|
||||
* packets coming from this connection, from 1 - 7. Setting 7
|
||||
* (network management priority) requires CAP_NET_ADMIN capability but
|
||||
* the others can be set by anyone.
|
||||
*/
|
||||
|
||||
#if defined(LWS_ROLE_MQTT)
|
||||
const lws_mqtt_client_connect_param_t *mqtt_cp;
|
||||
#else
|
||||
void *mqtt_cp;
|
||||
#endif
|
||||
|
||||
#if defined(LWS_WITH_SYS_FAULT_INJECTION)
|
||||
lws_fi_ctx_t fic;
|
||||
/**< Attach external Fault Injection context to the client wsi,
|
||||
* hierarchy is wsi -> vhost -> context */
|
||||
#endif
|
||||
/* for convenience, available when FI disabled in build */
|
||||
const char *fi_wsi_name;
|
||||
/**< specific Fault Injection namespace name for wsi created for this
|
||||
* connection, allows targeting by "wsi=XXX/..." if you give XXX here.
|
||||
*/
|
||||
|
||||
uint16_t keep_warm_secs;
|
||||
/**< 0 means 5s. If the client connection to the endpoint becomes idle,
|
||||
* defer closing it for this many seconds in case another outgoing
|
||||
* connection to the same endpoint turns up.
|
||||
*/
|
||||
|
||||
lws_log_cx_t *log_cx;
|
||||
/**< NULL to use lws_context log context, else a pointer to a log
|
||||
* context template to take a copy of for this wsi. Used to isolate
|
||||
* wsi-specific logs into their own stream or file.
|
||||
*/
|
||||
const char *auth_username;
|
||||
const char *auth_password;
|
||||
|
||||
#if defined(LWS_ROLE_WS)
|
||||
uint8_t allow_reserved_bits;
|
||||
/**< non-zero to allow reserved bits. You can get it by lws_get_reserved_bits().
|
||||
* Note: default zero means close the websocket connection for non-zero rsv.
|
||||
*/
|
||||
|
||||
uint8_t allow_unknown_opcode;
|
||||
/**< non-zero to allow unknown opcode. You can get it by `lws_get_opcode`.
|
||||
* None: default zero means close the websocket connection for unknown opcode.
|
||||
*/
|
||||
#endif
|
||||
|
||||
/* Add new things just above here ---^
|
||||
* This is part of the ABI, don't needlessly break compatibility
|
||||
*
|
||||
* The below is to ensure later library versions with new
|
||||
* members added above will see 0 (default) even if the app
|
||||
* was not built against the newer headers.
|
||||
*/
|
||||
|
||||
void *_unused[4]; /**< dummy */
|
||||
};
|
||||
|
||||
/**
|
||||
* lws_client_connect_via_info() - Connect to another websocket server
|
||||
* \param ccinfo: pointer to lws_client_connect_info struct
|
||||
*
|
||||
* This function creates a connection to a remote server using the
|
||||
* information provided in ccinfo.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN struct lws *
|
||||
lws_client_connect_via_info(const struct lws_client_connect_info *ccinfo);
|
||||
|
||||
/**
|
||||
* lws_init_vhost_client_ssl() - also enable client SSL on an existing vhost
|
||||
*
|
||||
* \param info: client ssl related info
|
||||
* \param vhost: which vhost to initialize client ssl operations on
|
||||
*
|
||||
* You only need to call this if you plan on using SSL client connections on
|
||||
* the vhost. For non-SSL client connections, it's not necessary to call this.
|
||||
*
|
||||
* The following members of info are used during the call
|
||||
*
|
||||
* - options must have LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT set,
|
||||
* otherwise the call does nothing
|
||||
* - provided_client_ssl_ctx must be NULL to get a generated client
|
||||
* ssl context, otherwise you can pass a prepared one in by setting it
|
||||
* - ssl_cipher_list may be NULL or set to the client valid cipher list
|
||||
* - ssl_ca_filepath may be NULL or client cert filepath
|
||||
* - ssl_cert_filepath may be NULL or client cert filepath
|
||||
* - ssl_private_key_filepath may be NULL or client cert private key
|
||||
*
|
||||
* You must create your vhost explicitly if you want to use this, so you have
|
||||
* a pointer to the vhost. Create the context first with the option flag
|
||||
* LWS_SERVER_OPTION_EXPLICIT_VHOSTS and then call lws_create_vhost() with
|
||||
* the same info struct.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_init_vhost_client_ssl(const struct lws_context_creation_info *info,
|
||||
struct lws_vhost *vhost);
|
||||
/**
|
||||
* lws_http_client_read() - consume waiting received http client data
|
||||
*
|
||||
* \param wsi: client connection
|
||||
* \param buf: pointer to buffer pointer - fill with pointer to your buffer
|
||||
* \param len: pointer to chunk length - fill with max length of buffer
|
||||
*
|
||||
* This is called when the user code is notified client http data has arrived.
|
||||
* The user code may choose to delay calling it to consume the data, for example
|
||||
* waiting until an onward connection is writeable.
|
||||
*
|
||||
* For non-chunked connections, up to len bytes of buf are filled with the
|
||||
* received content. len is set to the actual amount filled before return.
|
||||
*
|
||||
* For chunked connections, the linear buffer content contains the chunking
|
||||
* headers and it cannot be passed in one lump. Instead, this function will
|
||||
* call back LWS_CALLBACK_RECEIVE_CLIENT_HTTP_READ with in pointing to the
|
||||
* chunk start and len set to the chunk length. There will be as many calls
|
||||
* as there are chunks or partial chunks in the buffer.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_http_client_read(struct lws *wsi, char **buf, int *len);
|
||||
|
||||
/**
|
||||
* lws_http_client_http_response() - get last HTTP response code
|
||||
*
|
||||
* \param wsi: client connection
|
||||
*
|
||||
* Returns the last server response code, eg, 200 for client http connections.
|
||||
* If there is no valid response, it will return 0.
|
||||
*
|
||||
* You should capture this during the LWS_CALLBACK_ESTABLISHED_CLIENT_HTTP
|
||||
* callback, because after that the memory reserved for storing the related
|
||||
* headers is freed and this value is lost.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN unsigned int
|
||||
lws_http_client_http_response(struct lws *wsi);
|
||||
|
||||
/**
|
||||
* lws_tls_client_vhost_extra_cert_mem() - add more certs to vh client tls ctx
|
||||
*
|
||||
* \param vh: the vhost to give more client certs to
|
||||
* \param der: pointer to der format additional cert
|
||||
* \param der_len: size in bytes of der
|
||||
*
|
||||
* After the vhost is created with one cert for client verification, you
|
||||
* can add additional, eg, intermediate, certs to the client tls context
|
||||
* of the vhost, for use with validating the incoming server cert(s).
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_tls_client_vhost_extra_cert_mem(struct lws_vhost *vh,
|
||||
const uint8_t *der, size_t der_len);
|
||||
|
||||
/**
|
||||
* lws_client_http_body_pending() - control if client connection needs to send body
|
||||
*
|
||||
* \param wsi: client connection
|
||||
* \param something_left_to_send: nonzero if need to send more body, 0 (default)
|
||||
* if nothing more to send
|
||||
*
|
||||
* If you will send payload data with your HTTP client connection, eg, for POST,
|
||||
* when you set the related http headers in
|
||||
* LWS_CALLBACK_CLIENT_APPEND_HANDSHAKE_HEADER callback you should also call
|
||||
* this API with something_left_to_send nonzero, and call
|
||||
* lws_callback_on_writable(wsi);
|
||||
*
|
||||
* After sending the headers, lws will call your callback with
|
||||
* LWS_CALLBACK_CLIENT_HTTP_WRITEABLE reason when writable. You can send the
|
||||
* next part of the http body payload, calling lws_callback_on_writable(wsi);
|
||||
* if there is more to come, or lws_client_http_body_pending(wsi, 0); to
|
||||
* let lws know the last part is sent and the connection can move on.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_client_http_body_pending(struct lws *wsi, int something_left_to_send);
|
||||
|
||||
/**
|
||||
* lws_client_http_multipart() - issue appropriate multipart header or trailer
|
||||
*
|
||||
* \param wsi: client connection
|
||||
* \param name: multipart header name field, or NULL if end of multipart
|
||||
* \param filename: multipart header filename field, or NULL if none
|
||||
* \param content_type: multipart header content-type part, or NULL if none
|
||||
* \param p: pointer to position in buffer
|
||||
* \param end: end of buffer
|
||||
*
|
||||
* This issues a multipart mime boundary, or terminator if name = NULL.
|
||||
*
|
||||
* Returns 0 if OK or nonzero if couldn't fit in buffer
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_client_http_multipart(struct lws *wsi, const char *name,
|
||||
const char *filename, const char *content_type,
|
||||
char **p, char *end);
|
||||
|
||||
/**
|
||||
* lws_http_basic_auth_gen() - helper to encode client basic auth string
|
||||
*
|
||||
* \param user: user name
|
||||
* \param pw: password
|
||||
* \param buf: where to store base64 result
|
||||
* \param len: max usable size of buf
|
||||
*
|
||||
* Encodes a username and password in Basic Auth format for use with the
|
||||
* Authorization header. On return, buf is filled with something like
|
||||
* "Basic QWxhZGRpbjpPcGVuU2VzYW1l".
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_http_basic_auth_gen(const char *user, const char *pw, char *buf, size_t len);
|
||||
|
||||
/**
|
||||
* lws_http_basic_auth_gen2() - helper to encode client basic auth string
|
||||
*
|
||||
* \param user: user name
|
||||
* \param pw: password
|
||||
* \param pwd_len: count of bytes in password
|
||||
* \param buf: where to store base64 result
|
||||
* \param len: max usable size of buf
|
||||
*
|
||||
* Encodes a username and password in Basic Auth format for use with the
|
||||
* Authorization header. On return, buf is filled with something like
|
||||
* "Basic QWxhZGRpbjpPcGVuU2VzYW1l".
|
||||
*
|
||||
* This differs from lws_http_baic_auth_gen() in that NUL bytes can
|
||||
* appear in the password due to an explicit password length argument.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_http_basic_auth_gen2(const char *user, const void *pw, size_t pwd_len,
|
||||
char *buf, size_t len);
|
||||
|
||||
/**
|
||||
* lws_tls_session_is_reused() - returns nonzero if tls session was cached
|
||||
*
|
||||
* \param wsi: the wsi
|
||||
*
|
||||
* Returns zero if the tls session is fresh, else nonzero if the tls session was
|
||||
* taken from the cache. If lws is built with LWS_WITH_TLS_SESSIONS and the vhost
|
||||
* was created with the option LWS_SERVER_OPTION_ENABLE_TLS_SESSION_CACHE, then
|
||||
* on full tls session establishment of a client connection, the session is added
|
||||
* to the tls cache.
|
||||
*
|
||||
* This lets you find out if your session was new (0) or from the cache (nonzero),
|
||||
* it'a mainly useful for stats and testing.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_tls_session_is_reused(struct lws *wsi);
|
||||
|
||||
///@}
|
||||
155
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-conmon.h
Normal file
155
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-conmon.h
Normal file
@ -0,0 +1,155 @@
|
||||
/*
|
||||
* libwebsockets - small server side websockets and web server implementation
|
||||
*
|
||||
* Copyright (C) 2010 - 2021 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
/** \defgroup conmon Connection Latency information
|
||||
* ## Connection Latency information
|
||||
*
|
||||
* When LWS_WITH_CONMON is enabled at build, collects detailed statistics
|
||||
* about the client connection setup latency, available to the connection
|
||||
* itself
|
||||
*/
|
||||
///@{
|
||||
|
||||
/* enough for 4191s, or just over an hour */
|
||||
typedef uint32_t lws_conmon_interval_us_t;
|
||||
|
||||
/*
|
||||
* Connection latency information... note that not all wsi actually make
|
||||
* connections, for example h2 streams after the initial one will have 0
|
||||
* for everything except ciu_txn_resp.
|
||||
*
|
||||
* If represented in JSON, it should look like this
|
||||
*
|
||||
* {
|
||||
* "peer": "46.105.127.147",
|
||||
* "dns_us": 1234,
|
||||
* "dns_disp": 1,
|
||||
* "sockconn_us": 1234,
|
||||
* "tls_us": 1234,
|
||||
* "txn_resp_us": 1234,
|
||||
* "dns":["46.105.127.147", "2001:41d0:2:ee93::1"],
|
||||
* "prot_specific": {
|
||||
* "protocol": "http",
|
||||
* "resp": 200
|
||||
* }
|
||||
* }
|
||||
*
|
||||
* The indexes in "dns_disp" are declared in lws_conmon_dns_disposition_t
|
||||
* below.
|
||||
*
|
||||
* "prot_specific" may not be present if the protocol doesn't have anything
|
||||
* to report or is not supported.
|
||||
*/
|
||||
|
||||
typedef enum lws_conmon_pcol {
|
||||
LWSCONMON_PCOL_NONE,
|
||||
LWSCONMON_PCOL_HTTP, /* .protocol_specific.http is valid */
|
||||
} lws_conmon_pcol_t;
|
||||
|
||||
typedef enum lws_conmon_dns_disposition {
|
||||
LWSCONMON_DNS_NONE,
|
||||
/**< did not attempt DNS */
|
||||
LWSCONMON_DNS_OK = 1,
|
||||
/**< DNS lookup did give results */
|
||||
LWSCONMON_DNS_SERVER_UNREACHABLE = 2,
|
||||
/**< DNS server was not reachable */
|
||||
LWSCONMON_DNS_NO_RESULT = 3
|
||||
/**< DNS server replied but nothing usable */
|
||||
} lws_conmon_dns_disposition_t;
|
||||
|
||||
struct lws_conmon {
|
||||
lws_sockaddr46 peer46;
|
||||
/**< The peer we actually connected to, if any. .peer46.sa4.sa_family
|
||||
* is either 0 if invalid, or the AF_ */
|
||||
|
||||
union {
|
||||
struct {
|
||||
int response;
|
||||
/**< h1 http response code */
|
||||
} http;
|
||||
} protocol_specific;
|
||||
/**< possibly-present protocol-specific additional information. This
|
||||
* is only valid for the first transaction after connection and does
|
||||
* not capture results for persistent or muxed connections like ws
|
||||
* messages, mqtt messages, or h2 streams */
|
||||
|
||||
struct addrinfo *dns_results_copy;
|
||||
/**< NULL, or Allocated copy of dns results, owned by this object and
|
||||
* freed when object destroyed.
|
||||
* Only set if client flag LCCSCF_CONMON applied */
|
||||
|
||||
lws_conmon_interval_us_t ciu_dns;
|
||||
/**< 0, or if a socket connection, us taken to acquire this DNS response
|
||||
*
|
||||
*/
|
||||
lws_conmon_interval_us_t ciu_sockconn;
|
||||
/**< 0, or if connection-based, the us interval between the socket
|
||||
* connect() attempt that succeeded, and the connection setup */
|
||||
lws_conmon_interval_us_t ciu_tls;
|
||||
/**< 0 if no tls, or us taken to establish the tls tunnel */
|
||||
lws_conmon_interval_us_t ciu_txn_resp;
|
||||
/**< 0, or if the protocol supports transactions, the interval between
|
||||
* sending the initial transaction request and starting to receive the
|
||||
* response */
|
||||
|
||||
lws_conmon_pcol_t pcol;
|
||||
/**< indicates which extra protocol_specific info member is valid,
|
||||
* if any */
|
||||
|
||||
lws_conmon_dns_disposition_t dns_disposition;
|
||||
/**< indicates general disposition of DNS request */
|
||||
};
|
||||
|
||||
/**
|
||||
* lws_conmon_wsi_take() - create a connection latency object from client wsi
|
||||
*
|
||||
* \param context: lws wsi
|
||||
* \param dest: conmon struct to fill
|
||||
*
|
||||
* Copies wsi conmon data into the caller's struct. Passes ownership of
|
||||
* any allocations in the addrinfo list to the caller, lws will not delete that
|
||||
* any more on wsi close after this call. The caller must call
|
||||
* lws_conmon_release() on the struct to destroy any addrinfo in the struct
|
||||
* that is prepared by this eventually but it can defer it as long as it wants.
|
||||
*
|
||||
* Other than the addrinfo list, the contents of the returned object are
|
||||
* completely selfcontained and don't point outside of the object itself, ie,
|
||||
* everything else in there remains in scope while the object itself does.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_conmon_wsi_take(struct lws *wsi, struct lws_conmon *dest);
|
||||
|
||||
/**
|
||||
* lws_conmon_release() - free any allocations in the conmon struct
|
||||
*
|
||||
* \param conmon: pointer to conmon struct
|
||||
*
|
||||
* Destroys any allocations in the conmon struct so it can go out of scope.
|
||||
* It doesn't free \p dest itself, it's designed to clean out a struct that
|
||||
* is on the stack or embedded in another object.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_conmon_release(struct lws_conmon *conmon);
|
||||
|
||||
///@}
|
||||
File diff suppressed because it is too large
Load Diff
511
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-cose.h
Normal file
511
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-cose.h
Normal file
@ -0,0 +1,511 @@
|
||||
/*
|
||||
* libwebsockets - small server side websockets and web server implementation
|
||||
*
|
||||
* Copyright (C) 2010 - 2021 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
/** \defgroup cose COSE apis
|
||||
* ##COSE related functions
|
||||
* \ingroup lwsaoi
|
||||
*
|
||||
* COSE RFC 8152 relates to signed and encrypted CBOR
|
||||
*/
|
||||
//@{
|
||||
|
||||
enum {
|
||||
/* RFC8152: Table 2: Common Header Parameters
|
||||
* https://www.iana.org/assignments/cose/cose.xhtml#header-parameters
|
||||
*/
|
||||
|
||||
LWSCOSE_WKL_ALG = 1, /* int / tstr */
|
||||
LWSCOSE_WKL_CRIT, /* [+ label ] */
|
||||
LWSCOSE_WKL_CONTENT_TYPE, /* tstr / uint */
|
||||
LWSCOSE_WKL_KID, /* bstr */
|
||||
LWSCOSE_WKL_IV, /* bstr */
|
||||
LWSCOSE_WKL_IV_PARTIAL, /* bstr */
|
||||
LWSCOSE_WKL_COUNTERSIG, /* COSE sig(s) */
|
||||
LWSCOSE_WKL_COUNTERSIG0 = 9, /* bstr */
|
||||
LWSCOSE_WKL_KID_CONTEXT, /* bstr */
|
||||
LWSCOSE_WKL_CUPH_NONCE = 256, /* bstr */
|
||||
LWSCOSE_WKL_CUPH_OWNER_PUBKEY = 257, /* array */
|
||||
|
||||
/* RFC8152: Table 3: key map labels */
|
||||
|
||||
LWSCOSE_WKK_KTY = 1, /* int / tstr */
|
||||
LWSCOSE_WKK_KID, /* bstr */
|
||||
LWSCOSE_WKK_ALG, /* int / tstr */
|
||||
LWSCOSE_WKK_KEY_OPS, /* [ + (int / tstr) ] */
|
||||
LWSCOSE_WKK_BASE_IV, /* bstr */
|
||||
|
||||
/* RFC8152: Table 4: Key Operation Values */
|
||||
|
||||
LWSCOSE_WKKO_SIGN = 1,
|
||||
LWSCOSE_WKKO_VERIFY,
|
||||
LWSCOSE_WKKO_ENCRYPT,
|
||||
LWSCOSE_WKKO_DECRYPT,
|
||||
LWSCOSE_WKKO_WRAP_KEY,
|
||||
LWSCOSE_WKKO_UNWRAP_KEY,
|
||||
LWSCOSE_WKKO_DERIVE_KEY,
|
||||
LWSCOSE_WKKO_DERIVE_BITS,
|
||||
LWSCOSE_WKKO_MAC_CREATE,
|
||||
LWSCOSE_WKKO_MAC_VERIFY,
|
||||
|
||||
/* RFC8152: Table 5: ECDSA algs */
|
||||
|
||||
LWSCOSE_WKAECDSA_ALG_ES256 = -7,
|
||||
LWSCOSE_WKAECDSA_ALG_ES384 = -35,
|
||||
LWSCOSE_WKAECDSA_ALG_ES512 = -36,
|
||||
|
||||
/* RFC8152: Table 6: EDDSA algs */
|
||||
|
||||
LWSCOSE_WKAEDDSA_ALG_EDDSA = -8,
|
||||
|
||||
/* RFC8152: Table 7: HMAC algs */
|
||||
|
||||
LWSCOSE_WKAHMAC_256_64 = 4,
|
||||
LWSCOSE_WKAHMAC_256_256,
|
||||
LWSCOSE_WKAHMAC_384_384,
|
||||
LWSCOSE_WKAHMAC_512_512,
|
||||
|
||||
/* RFC8152: Table 8: AES algs */
|
||||
|
||||
LWSCOSE_WKAAES_128_64 = 14,
|
||||
LWSCOSE_WKAAES_256_64,
|
||||
LWSCOSE_WKAAES_128_128 = 25,
|
||||
LWSCOSE_WKAAES_256_128,
|
||||
|
||||
/* RFC8152: Table 9: AES GCM algs */
|
||||
|
||||
LWSCOSE_WKAAESGCM_128 = 1,
|
||||
LWSCOSE_WKAAESGCM_192,
|
||||
LWSCOSE_WKAAESGCM_256,
|
||||
|
||||
/* RFC8152: Table 10: AES CCM algs */
|
||||
|
||||
LWSCOSE_WKAAESCCM_16_64_128 = 10,
|
||||
LWSCOSE_WKAAESCCM_16_64_256,
|
||||
LWSCOSE_WKAAESCCM_64_64_128,
|
||||
LWSCOSE_WKAAESCCM_64_64_256,
|
||||
LWSCOSE_WKAAESCCM_16_128_128,
|
||||
LWSCOSE_WKAAESCCM_16_128_256,
|
||||
LWSCOSE_WKAAESCCM_64_128_128,
|
||||
LWSCOSE_WKAAESCCM_64_128_256,
|
||||
|
||||
/* RFC8152: Table 11: CHACHA20 / Poly1305 */
|
||||
|
||||
LWSCOSE_WKACHACHA_POLY1305 = 24,
|
||||
|
||||
/* RFC8152: Table 13: HKDF param */
|
||||
|
||||
LWSCOSE_WKAPHKDF_SALT = -20,
|
||||
|
||||
/* RFC8152: Table 14: Context Algorithm Parameters */
|
||||
|
||||
LWSCOSE_WKAPCTX_PARTY_U_IDENTITY = -21,
|
||||
LWSCOSE_WKAPCTX_PARTY_U_NONCE = -22,
|
||||
LWSCOSE_WKAPCTX_PARTY_U_OTHER = -23,
|
||||
LWSCOSE_WKAPCTX_PARTY_V_IDENTITY = -24,
|
||||
LWSCOSE_WKAPCTX_PARTY_V_NONCE = -25,
|
||||
LWSCOSE_WKAPCTX_PARTY_V_OTHER = -26,
|
||||
|
||||
/* RFC8152: Table 15: Direct key */
|
||||
|
||||
LWSCOSE_WKK_DIRECT_CEK = -6,
|
||||
|
||||
/* RFC8152: Table 16: Direct key with KDF */
|
||||
|
||||
LWSCOSE_WKK_DIRECT_HKDF_SHA_256 = -10,
|
||||
LWSCOSE_WKK_DIRECT_HKDF_SHA_512 = -11,
|
||||
LWSCOSE_WKK_DIRECT_HKDF_AES_128 = -12,
|
||||
LWSCOSE_WKK_DIRECT_HKDF_AES_256 = -13,
|
||||
|
||||
/* RFC8152: Table 17: AES Key Wrap Algorithm Values */
|
||||
|
||||
LWSCOSE_WKK_DIRECT_HKDFKW_SHA_256 = -3,
|
||||
LWSCOSE_WKK_DIRECT_HKDFKW_SHA_512 = -4,
|
||||
LWSCOSE_WKK_DIRECT_HKDFKW_AES_128 = -5,
|
||||
|
||||
/* RFC8152: Table 18: ECDH Algorithm Values */
|
||||
|
||||
LWSCOSE_WKAECDH_ALG_ES_HKDF_256 = -25,
|
||||
LWSCOSE_WKAECDH_ALG_ES_HKDF_512 = -26,
|
||||
LWSCOSE_WKAECDH_ALG_SS_HKDF_256 = -27,
|
||||
LWSCOSE_WKAECDH_ALG_SS_HKDF_512 = -28,
|
||||
|
||||
/* RFC8152: Table 19: ECDH Algorithm Parameters */
|
||||
|
||||
LWSCOSE_WKAPECDH_EPHEMERAL_KEY = -1,
|
||||
LWSCOSE_WKAPECDH_STATIC_KEY = -2,
|
||||
LWSCOSE_WKAPECDH_STATIC_KEY_ID = -3,
|
||||
|
||||
/* RFC8152: Table 20: ECDH Algorithm Parameters with key wrap */
|
||||
|
||||
LWSCOSE_WKAPECDH_ES_A128KW = -29,
|
||||
LWSCOSE_WKAPECDH_ES_A192KW = -30,
|
||||
LWSCOSE_WKAPECDH_ES_A256KW = -31,
|
||||
LWSCOSE_WKAPECDH_SS_A128KW = -32,
|
||||
LWSCOSE_WKAPECDH_SS_A192KW = -33,
|
||||
LWSCOSE_WKAPECDH_SS_A256KW = -34,
|
||||
|
||||
/* RFC8152: Table 21: Key Type Values
|
||||
* https://www.iana.org/assignments/cose/cose.xhtml#key-type
|
||||
*/
|
||||
|
||||
LWSCOSE_WKKTV_OKP = 1,
|
||||
LWSCOSE_WKKTV_EC2 = 2,
|
||||
LWSCOSE_WKKTV_RSA = 3,
|
||||
LWSCOSE_WKKTV_SYMMETRIC = 4,
|
||||
LWSCOSE_WKKTV_HSS_LMS = 5,
|
||||
LWSCOSE_WKKTV_WALNUTDSA = 6,
|
||||
|
||||
|
||||
/* RFC8152: Table 22: Elliptic Curves
|
||||
* https://www.iana.org/assignments/cose/cose.xhtml#elliptic-curves
|
||||
*/
|
||||
|
||||
LWSCOSE_WKEC_P256 = 1,
|
||||
LWSCOSE_WKEC_P384,
|
||||
LWSCOSE_WKEC_P521,
|
||||
LWSCOSE_WKEC_X25519,
|
||||
LWSCOSE_WKEC_X448,
|
||||
LWSCOSE_WKEC_ED25519,
|
||||
LWSCOSE_WKEC_ED448,
|
||||
LWSCOSE_WKEC_SECP256K1,
|
||||
|
||||
/* RFC8152: Table 23: EC Key Parameters */
|
||||
|
||||
LWSCOSE_WKECKP_CRV = -1,
|
||||
LWSCOSE_WKECKP_X = -2,
|
||||
LWSCOSE_WKECKP_Y = -3,
|
||||
LWSCOSE_WKECKP_D = -4,
|
||||
|
||||
/* RFC8152: Table 24: Octet Key Pair (OKP) Parameters */
|
||||
|
||||
LWSCOSE_WKOKP_CRV = -1,
|
||||
LWSCOSE_WKOKP_X = -2,
|
||||
LWSCOSE_WKOKP_D = -4,
|
||||
|
||||
/* Additional from
|
||||
* https://www.iana.org/assignments/cose/cose.xhtml#key-type-parameters
|
||||
*/
|
||||
|
||||
LWSCOSE_WKKPRSA_N = -1,
|
||||
LWSCOSE_WKKPRSA_E = -2,
|
||||
LWSCOSE_WKKPRSA_D = -3,
|
||||
LWSCOSE_WKKPRSA_P = -4,
|
||||
LWSCOSE_WKKPRSA_Q = -5,
|
||||
LWSCOSE_WKKPRSA_DP = -6,
|
||||
LWSCOSE_WKKPRSA_DQ = -7,
|
||||
LWSCOSE_WKKPRSA_QINV = -8,
|
||||
LWSCOSE_WKKPRSA_OTHER = -9,
|
||||
LWSCOSE_WKKPRSA_RI = -10,
|
||||
LWSCOSE_WKKPRSA_DI = -11,
|
||||
LWSCOSE_WKKPRSA_TI = -12,
|
||||
|
||||
/* RFC8152: Table 25: Symmetric Key Parameters */
|
||||
|
||||
LWSCOSE_WKSYMKP_KEY_VALUE = 4,
|
||||
|
||||
/* RFC8152: Table 26: CoAP Content-Formats for COSE */
|
||||
|
||||
LWSCOAP_CONTENTFORMAT_COSE_SIGN = 98,
|
||||
LWSCOAP_CONTENTFORMAT_COSE_SIGN1 = 18,
|
||||
LWSCOAP_CONTENTFORMAT_COSE_ENCRYPT = 96,
|
||||
LWSCOAP_CONTENTFORMAT_COSE_ENCRYPT0 = 16,
|
||||
LWSCOAP_CONTENTFORMAT_COSE_MAC = 97,
|
||||
LWSCOAP_CONTENTFORMAT_COSE_MAC0 = 17,
|
||||
LWSCOAP_CONTENTFORMAT_COSE_KEY = 101,
|
||||
LWSCOAP_CONTENTFORMAT_COSE_KEY_SET = 102,
|
||||
|
||||
/* RFC8152: Table 27: Header Parameter for CounterSignature0 */
|
||||
|
||||
LWSCOSE_WKL_COUNTERSIGNATURE0 = 9, /* bstr */
|
||||
|
||||
/* RFC8812: Table 1: RSASSA-PKCS1-v1_5 Algorithm Values */
|
||||
|
||||
LWSCOSE_WKARSA_ALG_RS256 = -257, /* + SHA-256 */
|
||||
LWSCOSE_WKARSA_ALG_RS384 = -258, /* + SHA-384 */
|
||||
LWSCOSE_WKARSA_ALG_RS512 = -259, /* + SHA-512 */
|
||||
};
|
||||
|
||||
enum enum_cose_key_meta_tok {
|
||||
COSEKEY_META_KTY,
|
||||
COSEKEY_META_KID,
|
||||
COSEKEY_META_KEY_OPS,
|
||||
COSEKEY_META_BASE_IV,
|
||||
COSEKEY_META_ALG,
|
||||
|
||||
LWS_COUNT_COSE_KEY_ELEMENTS
|
||||
};
|
||||
|
||||
typedef int64_t cose_param_t;
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN const char *
|
||||
lws_cose_alg_to_name(cose_param_t alg);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN cose_param_t
|
||||
lws_cose_name_to_alg(const char *name);
|
||||
|
||||
/*
|
||||
* cose_key
|
||||
*/
|
||||
|
||||
typedef struct lws_cose_key {
|
||||
/* key data elements */
|
||||
struct lws_gencrypto_keyelem e[LWS_GENCRYPTO_MAX_KEYEL_COUNT];
|
||||
/* generic meta key elements, like KID */
|
||||
struct lws_gencrypto_keyelem meta[LWS_COUNT_COSE_KEY_ELEMENTS];
|
||||
lws_dll2_t list; /* used when part of a set */
|
||||
int gencrypto_kty; /**< one of LWS_GENCRYPTO_KTY_ */
|
||||
cose_param_t kty;
|
||||
cose_param_t cose_alg;
|
||||
cose_param_t cose_curve;
|
||||
char private_key; /* nonzero = has private key elements */
|
||||
} lws_cose_key_t;
|
||||
|
||||
typedef int (*lws_cose_key_import_callback)(struct lws_cose_key *s, void *user);
|
||||
|
||||
/** lws_cose_jwk_import() - Create an lws_cose_key_t object from cose_key CBOR
|
||||
*
|
||||
* \param pkey_set: NULL, or a pointer to an lws_dll2_owner_t for a cose_key set
|
||||
* \param cb: callback for each jwk-processed key, or NULL if importing a single
|
||||
* key with no parent "keys" JSON
|
||||
* \param user: pointer to be passed to the callback, otherwise ignored by lws.
|
||||
* NULL if importing a single key with no parent "keys" JSON
|
||||
* \param in: a single cose_key
|
||||
* \param len: the length of the cose_key in bytes
|
||||
*
|
||||
* Creates a single lws_cose_key_t if \p pkey_set is NULL or if the incoming
|
||||
* CBOR doesn't start with an array, otherwise expects a CBOR array containing
|
||||
* zero or more cose_key CBOR, and adds each to the \p pkey_set
|
||||
* lws_dll2_owner_t struct. Created lws_cose_key_t are filled with data from
|
||||
* the COSE representation and can be used with other COSE crypto ops.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN lws_cose_key_t *
|
||||
lws_cose_key_import(lws_dll2_owner_t *pkey_set, lws_cose_key_import_callback cb,
|
||||
void *user, const uint8_t *in, size_t len);
|
||||
|
||||
/** lws_cose_key_export() - Create cose_key CBOR from an lws_cose_key_t
|
||||
*
|
||||
* \param ck: the lws_cose_key_t to export to CBOR
|
||||
* \param ctx: the CBOR writing context (same as for lws_lec_printf())
|
||||
* \param flags: 0 to export only public elements, or LWSJWKF_EXPORT_PRIVATE
|
||||
*
|
||||
* Creates an lws_jwk struct filled with data from the COSE representation.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN enum lws_lec_pctx_ret
|
||||
lws_cose_key_export(lws_cose_key_t *ck, lws_lec_pctx_t *ctx, int flags);
|
||||
|
||||
/**
|
||||
* lws_cose_key_generate() - generate a fresh key
|
||||
*
|
||||
* \param context: the lws_context used to get random
|
||||
* \param cose_kty: one of LWSCOSE_WKKTV_ indicating the well-known key type
|
||||
* \param use_mask: 0, or a bitfield where (1 << LWSCOSE_WKKO_...) set means valid for use
|
||||
* \param bits: key bits for RSA
|
||||
* \param curve: for EC keys, one of "P-256", "P-384" or "P-521" currently
|
||||
* \param kid: string describing the key, or NULL
|
||||
*
|
||||
* Create an lws_cose_key_t of the specified type and return it
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN lws_cose_key_t *
|
||||
lws_cose_key_generate(struct lws_context *context, cose_param_t cose_kty,
|
||||
int use_mask, int bits, const char *curve,
|
||||
const uint8_t *kid, size_t kl);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN lws_cose_key_t *
|
||||
lws_cose_key_from_set(lws_dll2_owner_t *set, const uint8_t *kid, size_t kl);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_cose_key_destroy(lws_cose_key_t **ck);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_cose_key_set_destroy(lws_dll2_owner_t *o);
|
||||
|
||||
/* only available in _DEBUG build */
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_cose_key_dump(const lws_cose_key_t *ck);
|
||||
|
||||
/*
|
||||
* cose_sign
|
||||
*/
|
||||
|
||||
struct lws_cose_validate_context;
|
||||
|
||||
|
||||
enum lws_cose_sig_types {
|
||||
SIGTYPE_UNKNOWN,
|
||||
SIGTYPE_MULTI,
|
||||
SIGTYPE_SINGLE,
|
||||
SIGTYPE_COUNTERSIGNED, /* not yet supported */
|
||||
SIGTYPE_MAC, /* only supported for validation */
|
||||
SIGTYPE_MAC0,
|
||||
};
|
||||
|
||||
/* a list of these result objects is the output of the validation process */
|
||||
|
||||
typedef struct {
|
||||
lws_dll2_t list;
|
||||
|
||||
const lws_cose_key_t *cose_key;
|
||||
cose_param_t cose_alg;
|
||||
|
||||
int result; /* 0 = validated */
|
||||
|
||||
} lws_cose_validate_res_t;
|
||||
|
||||
enum {
|
||||
LCOSESIGEXTCB_RET_FINISHED,
|
||||
LCOSESIGEXTCB_RET_AGAIN,
|
||||
LCOSESIGEXTCB_RET_ERROR = -1
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
struct lws_cose_validate_context *cps;
|
||||
const uint8_t *ext;
|
||||
size_t xl;
|
||||
} lws_cose_sig_ext_pay_t;
|
||||
|
||||
typedef int (*lws_cose_sign_ext_pay_cb_t)(lws_cose_sig_ext_pay_t *x);
|
||||
typedef int (*lws_cose_validate_pay_cb_t)(struct lws_cose_validate_context *cps,
|
||||
void *opaque, const uint8_t *paychunk,
|
||||
size_t paychunk_len);
|
||||
|
||||
typedef struct lws_cose_validate_create_info {
|
||||
struct lws_context *cx;
|
||||
/**< REQUIRED: the lws context */
|
||||
lws_dll2_owner_t *keyset;
|
||||
/**< REQUIRED: one or more cose_keys */
|
||||
|
||||
enum lws_cose_sig_types sigtype;
|
||||
/**< 0 if a CBOR tag is in the sig, else one of SIGTYPE_MULTI,
|
||||
* SIGTYPE_SINGLE, etc*/
|
||||
|
||||
lws_cose_validate_pay_cb_t pay_cb;
|
||||
/**< optional: called back with unvalidated payload pieces */
|
||||
void *pay_opaque;
|
||||
/**< optional: passed into pay_cb callback along with payload chunk */
|
||||
|
||||
lws_cose_sign_ext_pay_cb_t ext_cb;
|
||||
/**< optional extra application data provision callback */
|
||||
void *ext_opaque;
|
||||
/**< optional extra application data provision callback opaque */
|
||||
size_t ext_len;
|
||||
/**< if we have extra app data, this must be set to the length of it */
|
||||
} lws_cose_validate_create_info_t;
|
||||
|
||||
/**
|
||||
* lws_cose_validate_create() - create a signature validation context
|
||||
*
|
||||
* \param info: struct describing the validation context to create
|
||||
*
|
||||
* Creates a signature validation context set up as described in \p info.
|
||||
*
|
||||
* You can then pass the signature cbor chunks to it using
|
||||
* lws_cose_validate_chunk(), finialize and get the results list using
|
||||
* lws_cose_validate_results() and destroy with lws_cose_validate_destroy().
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN struct lws_cose_validate_context *
|
||||
lws_cose_validate_create(const lws_cose_validate_create_info_t *info);
|
||||
|
||||
/**
|
||||
* lws_cose_validate_chunk() - passes chunks of CBOR into the signature validator
|
||||
*
|
||||
* \param cps: the validation context
|
||||
* \param in: the chunk of CBOR (does not have to be logically complete)
|
||||
* \param in_len: number of bytes available at \p in
|
||||
*
|
||||
* Parses signature CBOR to produce a list of result objects.
|
||||
*
|
||||
*
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_cose_validate_chunk(struct lws_cose_validate_context *cps,
|
||||
const uint8_t *in, size_t in_len, size_t *used_in);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN lws_dll2_owner_t *
|
||||
lws_cose_validate_results(struct lws_cose_validate_context *cps);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_cose_validate_destroy(struct lws_cose_validate_context **cps);
|
||||
|
||||
struct lws_cose_sign_context;
|
||||
|
||||
#define LCSC_FL_ADD_CBOR_TAG (1 << 0)
|
||||
#define LCSC_FL_ADD_CBOR_PREFER_MAC0 (1 << 1)
|
||||
|
||||
typedef struct lws_cose_sign_create_info {
|
||||
struct lws_context *cx;
|
||||
/**< REQUIRED: the lws context */
|
||||
lws_dll2_owner_t *keyset;
|
||||
/**< REQUIRED: one or more cose_keys */
|
||||
|
||||
lws_lec_pctx_t *lec;
|
||||
/**< REQUIRED: the cbor output context to emit to, user must
|
||||
* initialize with lws_lec_init() beforehand */
|
||||
|
||||
lws_cose_sign_ext_pay_cb_t ext_cb;
|
||||
/**< optional extra application data provision callback */
|
||||
void *ext_opaque;
|
||||
/**< optional extra application data provision callback opaque */
|
||||
size_t ext_len;
|
||||
/**< if we have extra app data, this must be set to the length of it */
|
||||
|
||||
size_t inline_payload_len;
|
||||
/**< REQUIRED: size of the inline payload we will provide */
|
||||
|
||||
int flags;
|
||||
/**< bitmap of LCSC_FL_* */
|
||||
enum lws_cose_sig_types sigtype;
|
||||
/**< 0, or sign type hint */
|
||||
} lws_cose_sign_create_info_t;
|
||||
|
||||
/**
|
||||
* lws_cose_sign_create() - Create a signing context
|
||||
*
|
||||
* \param info: a structure describing the signing context you want to create
|
||||
*
|
||||
* This allocates and returns a signing context created according to what is in
|
||||
* the \p info parameter.
|
||||
*
|
||||
* \p info must be prepared with the lws_context, a keyset to use, a CBOR
|
||||
* output context, and the inline payload length.
|
||||
*
|
||||
* Returns NULL on failure or the created signing context ready to add alg(s)
|
||||
* to.
|
||||
*/
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN struct lws_cose_sign_context *
|
||||
lws_cose_sign_create(const lws_cose_sign_create_info_t *info);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_cose_sign_add(struct lws_cose_sign_context *csc, cose_param_t alg,
|
||||
const lws_cose_key_t *ck);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN enum lws_lec_pctx_ret
|
||||
lws_cose_sign_payload_chunk(struct lws_cose_sign_context *csc,
|
||||
const uint8_t *in, size_t in_len);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_cose_sign_destroy(struct lws_cose_sign_context **csc);
|
||||
|
||||
//@}
|
||||
94
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-dbus.h
Normal file
94
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-dbus.h
Normal file
@ -0,0 +1,94 @@
|
||||
/*
|
||||
* libwebsockets - small server side websockets and web server implementation
|
||||
*
|
||||
* Copyright (C) 2010 - 2019 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*
|
||||
* must be included manually as
|
||||
*
|
||||
* #include <libwebsockets/lws-dbus.h>
|
||||
*
|
||||
* if dbus apis needed
|
||||
*/
|
||||
|
||||
#if !defined(__LWS_DBUS_H__)
|
||||
#define __LWS_DBUS_H__
|
||||
|
||||
#include <dbus/dbus.h>
|
||||
|
||||
/* helper type to simplify implementing methods as individual functions */
|
||||
typedef DBusHandlerResult (*lws_dbus_message_handler)(DBusConnection *conn,
|
||||
DBusMessage *message, DBusMessage **reply, void *d);
|
||||
|
||||
struct lws_dbus_ctx;
|
||||
typedef void (*lws_dbus_closing_t)(struct lws_dbus_ctx *ctx);
|
||||
|
||||
struct lws_dbus_ctx {
|
||||
struct lws_dll2_owner owner; /* dbusserver ctx: HEAD of accepted list */
|
||||
struct lws_dll2 next; /* dbusserver ctx: HEAD of accepted list */
|
||||
struct lws_vhost *vh; /* the vhost we logically bind to in lws */
|
||||
int tsi; /* the lws thread service index (0 if only one service
|
||||
thread as is the default */
|
||||
DBusConnection *conn;
|
||||
DBusServer *dbs;
|
||||
DBusWatch *w[4];
|
||||
DBusPendingCall *pc;
|
||||
|
||||
char hup;
|
||||
char timeouts;
|
||||
|
||||
/* cb_closing callback will be called after the connection and this
|
||||
* related ctx struct have effectively gone out of scope.
|
||||
*
|
||||
* The callback should close and clean up the connection and free the
|
||||
* ctx.
|
||||
*/
|
||||
lws_dbus_closing_t cb_closing;
|
||||
};
|
||||
|
||||
/**
|
||||
* lws_dbus_connection_setup() - bind dbus connection object to lws event loop
|
||||
*
|
||||
* \param ctx: additional information about the connection
|
||||
* \param conn: the DBusConnection object to bind
|
||||
*
|
||||
* This configures a DBusConnection object to use lws for watchers and timeout
|
||||
* operations.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_dbus_connection_setup(struct lws_dbus_ctx *ctx, DBusConnection *conn,
|
||||
lws_dbus_closing_t cb_closing);
|
||||
|
||||
/**
|
||||
* lws_dbus_server_listen() - bind dbus connection object to lws event loop
|
||||
*
|
||||
* \param ctx: additional information about the connection
|
||||
* \param ads: the DBUS address to listen on, eg, "unix:abstract=mysocket"
|
||||
* \param err: a DBusError object to take any extra error information
|
||||
* \param new_conn: a callback function to prepare new accepted connections
|
||||
*
|
||||
* This creates a DBusServer and binds it to the lws event loop, and your
|
||||
* callback to accept new connections.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN DBusServer *
|
||||
lws_dbus_server_listen(struct lws_dbus_ctx *ctx, const char *ads,
|
||||
DBusError *err, DBusNewConnectionFunction new_conn);
|
||||
|
||||
#endif
|
||||
@ -0,0 +1,187 @@
|
||||
/*
|
||||
* libwebsockets - small server side websockets and web server implementation
|
||||
*
|
||||
* Copyright (C) 2010 - 2019 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
/*! \defgroup diskcache LWS disk cache
|
||||
* ## Disk cache API
|
||||
*
|
||||
* Lws provides helper apis useful if you need a disk cache containing hashed
|
||||
* files and need to delete files from it on an LRU basis to keep it below some
|
||||
* size limit.
|
||||
*
|
||||
* The API `lws_diskcache_prepare()` deals with creating the cache dir and
|
||||
* 256 subdirs, which are used according to the first two chars of the hex
|
||||
* hash of the cache file.
|
||||
*
|
||||
* `lws_diskcache_create()` and `lws_diskcache_destroy()` allocate and free
|
||||
* an opaque struct that represents the disk cache.
|
||||
*
|
||||
* `lws_diskcache_trim()` should be called at eg, 1s intervals to perform the
|
||||
* cache dir monitoring and LRU autodelete in the background lazily. It can
|
||||
* be done in its own thread or on a timer... it monitors the directories in a
|
||||
* stateful way that stats one or more file in the cache per call, and keeps
|
||||
* a list of the oldest files as it goes. When it completes a scan, if the
|
||||
* aggregate size is over the limit, it will delete oldest files first to try
|
||||
* to keep it under the limit.
|
||||
*
|
||||
* The cache size monitoring is extremely efficient in time and memory even when
|
||||
* the cache directory becomes huge.
|
||||
*
|
||||
* `lws_diskcache_query()` is used to determine if the file already exists in
|
||||
* the cache, or if it must be created. If it must be created, then the file
|
||||
* is opened using a temp name that must be converted to a findable name with
|
||||
* `lws_diskcache_finalize_name()` when the generation of the file contents are
|
||||
* complete. Aborted cached files that did not complete generation will be
|
||||
* flushed by the LRU eventually. If the file already exists, it is 'touched'
|
||||
* to make it new again and the fd returned.
|
||||
*
|
||||
*/
|
||||
///@{
|
||||
|
||||
struct lws_diskcache_scan;
|
||||
|
||||
/**
|
||||
* lws_diskcache_create() - creates an opaque struct representing the disk cache
|
||||
*
|
||||
* \param cache_dir_base: The cache dir path, eg `/var/cache/mycache`
|
||||
* \param cache_size_limit: maximum size on disk the cache is allowed to use
|
||||
*
|
||||
* This returns an opaque `struct lws_diskcache_scan *` which represents the
|
||||
* disk cache, the trim scanning state and so on. You should use
|
||||
* `lws_diskcache_destroy()` to free it to destroy it.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN struct lws_diskcache_scan *
|
||||
lws_diskcache_create(const char *cache_dir_base, uint64_t cache_size_limit);
|
||||
|
||||
/**
|
||||
* lws_diskcache_destroy() - destroys the pointer returned by ...create()
|
||||
*
|
||||
* \param lds: pointer to the pointer returned by lws_diskcache_create()
|
||||
*
|
||||
* Frees *lds and any allocations it did, and then sets *lds to NULL and
|
||||
* returns.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_diskcache_destroy(struct lws_diskcache_scan **lds);
|
||||
|
||||
/**
|
||||
* lws_diskcache_prepare() - ensures the cache dir structure exists on disk
|
||||
*
|
||||
* \param cache_base_dir: The cache dir path, eg `/var/cache/mycache`
|
||||
* \param mode: octal dir mode to enforce, like 0700
|
||||
* \param uid: uid the cache dir should belong to
|
||||
*
|
||||
* This should be called while your app is still privileged. It will create
|
||||
* the cache directory structure on disk as necessary, enforce the given access
|
||||
* mode on it and set the given uid as the owner. It won't make any trouble
|
||||
* if the cache already exists.
|
||||
*
|
||||
* Typically the mode is 0700 and the owner is the user that your application
|
||||
* will transition to use when it drops root privileges.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_diskcache_prepare(const char *cache_base_dir, int mode, uid_t uid);
|
||||
|
||||
#define LWS_DISKCACHE_QUERY_NO_CACHE 0
|
||||
#define LWS_DISKCACHE_QUERY_EXISTS 1
|
||||
#define LWS_DISKCACHE_QUERY_CREATING 2
|
||||
#define LWS_DISKCACHE_QUERY_ONGOING 3 /* something else is creating it */
|
||||
|
||||
/**
|
||||
* lws_diskcache_query() - ensures the cache dir structure exists on disk
|
||||
*
|
||||
* \param lds: The opaque struct representing the disk cache
|
||||
* \param is_bot: nonzero means the request is from a bot. Don't create new cache contents if so.
|
||||
* \param hash_hex: hex string representation of the cache object hash
|
||||
* \param _fd: pointer to the fd to be set
|
||||
* \param cache: destination string to take the cache filepath
|
||||
* \param cache_len: length of the buffer at `cache`
|
||||
* \param extant_cache_len: pointer to a size_t to take any extant cached file size
|
||||
*
|
||||
* This function is called when you want to find if the hashed name already
|
||||
* exists in the cache. The possibilities for the return value are
|
||||
*
|
||||
* - LWS_DISKCACHE_QUERY_NO_CACHE: It's not in the cache and you can't create
|
||||
* it in the cache for whatever reason.
|
||||
* - LWS_DISKCACHE_QUERY_EXISTS: It exists in the cache. It's open RDONLY and
|
||||
* *_fd has been set to the file descriptor. *extant_cache_len has been set
|
||||
* to the size of the cached file in bytes. cache has been set to the
|
||||
* full filepath of the cached file. Closing _fd is your responsibility.
|
||||
* - LWS_DISKCACHE_QUERY_CREATING: It didn't exist, but a temp file has been
|
||||
* created in the cache and *_fd set to a file descriptor opened on it RDWR.
|
||||
* You should create the contents, and call `lws_diskcache_finalize_name()`
|
||||
* when it is done. Closing _fd is your responsibility.
|
||||
* - LWS_DISKCACHE_QUERY_ONGOING: not returned by this api, but you may find it
|
||||
* desirable to make a wrapper function which can handle another asynchronous
|
||||
* process that is already creating the cached file. This can be used to
|
||||
* indicate that situation externally... how to determine the same thing is
|
||||
* already being generated is out of scope of this api.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_diskcache_query(struct lws_diskcache_scan *lds, int is_bot,
|
||||
const char *hash_hex, int *_fd, char *cache, int cache_len,
|
||||
size_t *extant_cache_len);
|
||||
|
||||
/**
|
||||
* lws_diskcache_query() - ensures the cache dir structure exists on disk
|
||||
*
|
||||
* \param cache: The cache file temp name returned with LWS_DISKCACHE_QUERY_CREATING
|
||||
*
|
||||
* This renames the cache file you are creating to its final name. It should
|
||||
* be called on the temp name returned by `lws_diskcache_query()` if it gave a
|
||||
* LWS_DISKCACHE_QUERY_CREATING return, after you have filled the cache file and
|
||||
* closed it.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_diskcache_finalize_name(char *cache);
|
||||
|
||||
/**
|
||||
* lws_diskcache_trim() - performs one or more file checks in the cache for size management
|
||||
*
|
||||
* \param lds: The opaque object representing the cache
|
||||
*
|
||||
* This should be called periodically to statefully walk the cache on disk
|
||||
* collecting the oldest files. When it has visited every file, if the cache
|
||||
* is oversize it will delete the oldest files until it's back under size again.
|
||||
*
|
||||
* Each time it's called, it will look at one or more dir in the cache. If
|
||||
* called when the cache is oversize, it increases the amount of work done each
|
||||
* call until it is reduced again. Typically it will take 256 calls before it
|
||||
* deletes anything, so if called once per second, it will delete files once
|
||||
* every 4 minutes. Each call is very inexpensive both in memory and time.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_diskcache_trim(struct lws_diskcache_scan *lds);
|
||||
|
||||
|
||||
/**
|
||||
* lws_diskcache_secs_to_idle() - see how long to idle before calling trim
|
||||
*
|
||||
* \param lds: The opaque object representing the cache
|
||||
*
|
||||
* If the cache is undersize, there's no need to monitor it immediately. This
|
||||
* suggests how long to "sleep" before calling `lws_diskcache_trim()` again.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_diskcache_secs_to_idle(struct lws_diskcache_scan *lds);
|
||||
///@}
|
||||
224
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-display.h
Normal file
224
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-display.h
Normal file
@ -0,0 +1,224 @@
|
||||
/*
|
||||
* lws abstract display
|
||||
*
|
||||
* Copyright (C) 2019 - 2022 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#if !defined(__LWS_DISPLAY_H__)
|
||||
#define __LWS_DISPLAY_H__
|
||||
|
||||
typedef int16_t lws_display_list_coord_t;
|
||||
typedef uint16_t lws_display_scalar;
|
||||
typedef uint16_t lws_display_rotation_t;
|
||||
typedef uint32_t lws_display_colour_t;
|
||||
typedef uint16_t lws_display_palette_idx_t;
|
||||
|
||||
typedef struct lws_box {
|
||||
lws_fx_t x;
|
||||
lws_fx_t y;
|
||||
lws_fx_t w;
|
||||
lws_fx_t h;
|
||||
} lws_box_t;
|
||||
|
||||
struct lws_display_state;
|
||||
struct lws_display;
|
||||
|
||||
typedef enum {
|
||||
LWSSURF_TRUECOLOR32,
|
||||
LWSSURF_565,
|
||||
LWSSURF_PALETTE,
|
||||
LWSSURF_QUANTIZED_4BPP
|
||||
} lws_surface_type_t;
|
||||
|
||||
typedef struct lws_surface_info {
|
||||
lws_fx_t wh_px[2];
|
||||
lws_fx_t wh_mm[2];
|
||||
const lws_display_colour_t *palette;
|
||||
size_t palette_depth;
|
||||
lws_surface_type_t type;
|
||||
uint8_t greyscale:1; /* line: 0 = RGBA, 1 = YA */
|
||||
uint8_t partial:1; /* can handle partial */
|
||||
uint8_t render_to_rgba:1; /* render to 32-bit RGBA, not 24-bit RGB */
|
||||
} lws_surface_info_t;
|
||||
|
||||
typedef struct lws_greyscale_error {
|
||||
int16_t rgb[1];
|
||||
} lws_greyscale_error_t;
|
||||
|
||||
typedef struct lws_colour_error {
|
||||
int16_t rgb[3];
|
||||
} lws_colour_error_t;
|
||||
|
||||
typedef union {
|
||||
lws_greyscale_error_t grey; /* when ic->greyscale set */
|
||||
lws_colour_error_t colour; /* when ic->greyscale == 0 */
|
||||
} lws_surface_error_t;
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_surface_set_px(const lws_surface_info_t *ic, uint8_t *line, int x,
|
||||
const lws_display_colour_t *c);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN lws_display_palette_idx_t
|
||||
lws_display_palettize_grey(const lws_surface_info_t *ic,
|
||||
const lws_display_colour_t *palette, size_t pdepth,
|
||||
lws_display_colour_t c, lws_greyscale_error_t *ectx);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN lws_display_palette_idx_t
|
||||
lws_display_palettize_col(const lws_surface_info_t *ic,
|
||||
const lws_display_colour_t *palette, size_t pdepth,
|
||||
lws_display_colour_t c, lws_colour_error_t *ectx);
|
||||
|
||||
/*
|
||||
* This is embedded in the actual display implementation object at the top,
|
||||
* so a pointer to this can be cast to a pointer to the implementation object
|
||||
* by any code that is specific to how it was implemented.
|
||||
*
|
||||
* Notice for the backlight / display intensity we contain pwm_ops... these can
|
||||
* be some other pwm_ops like existing gpio pwm ops, or handled in a customized
|
||||
* way like set oled contrast. Either way, the pwm level is arrived at via a
|
||||
* full set of lws_led_sequences capable of generic lws transitions
|
||||
*/
|
||||
|
||||
typedef struct lws_display {
|
||||
int (*init)(struct lws_display_state *lds);
|
||||
const lws_pwm_ops_t *bl_pwm_ops;
|
||||
int (*contrast)(struct lws_display_state *lds, uint8_t contrast);
|
||||
int (*blit)(struct lws_display_state *lds, const uint8_t *src,
|
||||
lws_box_t *box, lws_dll2_owner_t *ids);
|
||||
int (*power)(struct lws_display_state *lds, int state);
|
||||
|
||||
const lws_led_sequence_def_t *bl_active;
|
||||
const lws_led_sequence_def_t *bl_dim;
|
||||
const lws_led_sequence_def_t *bl_transition;
|
||||
|
||||
const char *name;
|
||||
void *variant;
|
||||
|
||||
int bl_index;
|
||||
|
||||
lws_surface_info_t ic;
|
||||
|
||||
uint16_t latency_wake_ms;
|
||||
/**< ms required after wake from sleep before display usable again...
|
||||
* delay bringing up the backlight for this amount of time on wake.
|
||||
* This is managed via a sul on the event loop, not blocking. */
|
||||
uint16_t latency_update_ms;
|
||||
/**< nominal update latency in ms */
|
||||
} lws_display_t;
|
||||
|
||||
/*
|
||||
* This contains dynamic data related to display state
|
||||
*/
|
||||
|
||||
enum lws_display_controller_state {
|
||||
LWSDISPS_OFF,
|
||||
LWSDISPS_AUTODIMMED, /* is in pre- blanking static dim mode */
|
||||
LWSDISPS_BECOMING_ACTIVE, /* waiting for wake latency before active */
|
||||
LWSDISPS_ACTIVE, /* is active */
|
||||
LWSDISPS_GOING_OFF /* dimming then off */
|
||||
};
|
||||
|
||||
typedef struct lws_display_state {
|
||||
|
||||
lws_sorted_usec_list_t sul_autodim;
|
||||
|
||||
char current_url[96];
|
||||
|
||||
const lws_display_t *disp;
|
||||
struct lws_context *ctx;
|
||||
|
||||
void *priv; /* subclass driver alloc'd priv */
|
||||
|
||||
int autodim_ms;
|
||||
int off_ms;
|
||||
|
||||
struct lws_led_state *bl_lcs;
|
||||
|
||||
lws_led_state_chs_t chs;
|
||||
/* set of sequencer transition channels */
|
||||
|
||||
enum lws_display_controller_state state;
|
||||
|
||||
char display_busy;
|
||||
|
||||
} lws_display_state_t;
|
||||
|
||||
/* Used for async display driver events, eg, EPD refresh completion */
|
||||
typedef int (*lws_display_completion_t)(lws_display_state_t *lds, int a);
|
||||
|
||||
/**
|
||||
* lws_display_state_init() - initialize display states
|
||||
*
|
||||
* \param lds: the display state object
|
||||
* \param ctx: the lws context
|
||||
* \param autodim_ms: ms since last active report to dim display (<0 = never)
|
||||
* \param off_ms: ms since dim to turn display off (<0 = never)
|
||||
* \param bl_lcs: the led controller instance that has the backlight
|
||||
* \param disp: generic display object we belong to
|
||||
*
|
||||
* This initializes a display's state, and sets up the optional screen auto-dim
|
||||
* and blanking on inactive, and gradual brightness change timer.
|
||||
*
|
||||
* - auto-dim then off: set autodim to some ms and off_ms to some ms
|
||||
* - auto-dim only: set autodim to some ms and off_ms to -1
|
||||
* - off-only: set autodim to some ms and off_ms to 0
|
||||
* - neither: set both autodim and off_ms to -1
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_display_state_init(lws_display_state_t *lds, struct lws_context *ctx,
|
||||
int autodim_ms, int off_ms, struct lws_led_state *bl_lcs,
|
||||
const lws_display_t *disp);
|
||||
|
||||
/**
|
||||
* lws_display_state_set_brightness() - gradually change the brightness
|
||||
*
|
||||
* \param lds: the display state we are changing
|
||||
* \param target: the target brightness to transition to
|
||||
*
|
||||
* Adjusts the brightness gradually twoards the target at 20Hz
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_display_state_set_brightness(lws_display_state_t *lds,
|
||||
const lws_led_sequence_def_t *pwmseq);
|
||||
|
||||
/*
|
||||
* lws_display_state_active() - inform the system the display is active
|
||||
*
|
||||
* \param lds: the display state we are marking as active
|
||||
*
|
||||
* Resets the auto-dim and auto-off timers and makes sure the display is on and
|
||||
* at the active brightness level
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_display_state_active(lws_display_state_t *lds);
|
||||
|
||||
/*
|
||||
* lws_display_state_off() - turns off the related display
|
||||
*
|
||||
* \param lds: the display state we are turning off
|
||||
*
|
||||
* Turns the display to least power mode or completely off if possible.
|
||||
* Disables the timers related to dimming and blanking.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_display_state_off(lws_display_state_t *lds);
|
||||
|
||||
#endif
|
||||
308
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-dll2.h
Normal file
308
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-dll2.h
Normal file
@ -0,0 +1,308 @@
|
||||
/*
|
||||
* libwebsockets - small server side websockets and web server implementation
|
||||
*
|
||||
* Copyright (C) 2010 - 2019 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
/** \defgroup ll linked-lists
|
||||
* ##Linked list apis
|
||||
*
|
||||
* simple single and doubly-linked lists
|
||||
*/
|
||||
///@{
|
||||
|
||||
/**
|
||||
* lws_start_foreach_ll(): linkedlist iterator helper start
|
||||
*
|
||||
* \param type: type of iteration, eg, struct xyz *
|
||||
* \param it: iterator var name to create
|
||||
* \param start: start of list
|
||||
*
|
||||
* This helper creates an iterator and starts a while (it) {
|
||||
* loop. The iterator runs through the linked list starting at start and
|
||||
* ends when it gets a NULL.
|
||||
* The while loop should be terminated using lws_start_foreach_ll().
|
||||
*/
|
||||
#define lws_start_foreach_ll(type, it, start)\
|
||||
{ \
|
||||
type it = start; \
|
||||
while (it) {
|
||||
|
||||
/**
|
||||
* lws_end_foreach_ll(): linkedlist iterator helper end
|
||||
*
|
||||
* \param it: same iterator var name given when starting
|
||||
* \param nxt: member name in the iterator pointing to next list element
|
||||
*
|
||||
* This helper is the partner for lws_start_foreach_ll() that ends the
|
||||
* while loop.
|
||||
*/
|
||||
|
||||
#define lws_end_foreach_ll(it, nxt) \
|
||||
it = it->nxt; \
|
||||
} \
|
||||
}
|
||||
|
||||
/**
|
||||
* lws_start_foreach_ll_safe(): linkedlist iterator helper start safe against delete
|
||||
*
|
||||
* \param type: type of iteration, eg, struct xyz *
|
||||
* \param it: iterator var name to create
|
||||
* \param start: start of list
|
||||
* \param nxt: member name in the iterator pointing to next list element
|
||||
*
|
||||
* This helper creates an iterator and starts a while (it) {
|
||||
* loop. The iterator runs through the linked list starting at start and
|
||||
* ends when it gets a NULL.
|
||||
* The while loop should be terminated using lws_end_foreach_ll_safe().
|
||||
* Performs storage of next increment for situations where iterator can become invalidated
|
||||
* during iteration.
|
||||
*/
|
||||
#define lws_start_foreach_ll_safe(type, it, start, nxt)\
|
||||
{ \
|
||||
type it = start; \
|
||||
while (it) { \
|
||||
type next_##it = it->nxt;
|
||||
|
||||
/**
|
||||
* lws_end_foreach_ll_safe(): linkedlist iterator helper end (pre increment storage)
|
||||
*
|
||||
* \param it: same iterator var name given when starting
|
||||
*
|
||||
* This helper is the partner for lws_start_foreach_ll_safe() that ends the
|
||||
* while loop. It uses the precreated next_ variable already stored during
|
||||
* start.
|
||||
*/
|
||||
|
||||
#define lws_end_foreach_ll_safe(it) \
|
||||
it = next_##it; \
|
||||
} \
|
||||
}
|
||||
|
||||
/**
|
||||
* lws_start_foreach_llp(): linkedlist pointer iterator helper start
|
||||
*
|
||||
* \param type: type of iteration, eg, struct xyz **
|
||||
* \param it: iterator var name to create
|
||||
* \param start: start of list
|
||||
*
|
||||
* This helper creates an iterator and starts a while (it) {
|
||||
* loop. The iterator runs through the linked list starting at the
|
||||
* address of start and ends when it gets a NULL.
|
||||
* The while loop should be terminated using lws_start_foreach_llp().
|
||||
*
|
||||
* This helper variant iterates using a pointer to the previous linked-list
|
||||
* element. That allows you to easily delete list members by rewriting the
|
||||
* previous pointer to the element's next pointer.
|
||||
*/
|
||||
#define lws_start_foreach_llp(type, it, start)\
|
||||
{ \
|
||||
type it = &(start); \
|
||||
while (*(it)) {
|
||||
|
||||
#define lws_start_foreach_llp_safe(type, it, start, nxt)\
|
||||
{ \
|
||||
type it = &(start); \
|
||||
type next; \
|
||||
while (*(it)) { \
|
||||
next = &((*(it))->nxt); \
|
||||
|
||||
/**
|
||||
* lws_end_foreach_llp(): linkedlist pointer iterator helper end
|
||||
*
|
||||
* \param it: same iterator var name given when starting
|
||||
* \param nxt: member name in the iterator pointing to next list element
|
||||
*
|
||||
* This helper is the partner for lws_start_foreach_llp() that ends the
|
||||
* while loop.
|
||||
*/
|
||||
|
||||
#define lws_end_foreach_llp(it, nxt) \
|
||||
it = &(*(it))->nxt; \
|
||||
} \
|
||||
}
|
||||
|
||||
#define lws_end_foreach_llp_safe(it) \
|
||||
it = next; \
|
||||
} \
|
||||
}
|
||||
|
||||
#define lws_ll_fwd_insert(\
|
||||
___new_object, /* pointer to new object */ \
|
||||
___m_list, /* member for next list object ptr */ \
|
||||
___list_head /* list head */ \
|
||||
) {\
|
||||
___new_object->___m_list = ___list_head; \
|
||||
___list_head = ___new_object; \
|
||||
}
|
||||
|
||||
#define lws_ll_fwd_remove(\
|
||||
___type, /* type of listed object */ \
|
||||
___m_list, /* member for next list object ptr */ \
|
||||
___target, /* object to remove from list */ \
|
||||
___list_head /* list head */ \
|
||||
) { \
|
||||
lws_start_foreach_llp(___type **, ___ppss, ___list_head) { \
|
||||
if (*___ppss == ___target) { \
|
||||
*___ppss = ___target->___m_list; \
|
||||
break; \
|
||||
} \
|
||||
} lws_end_foreach_llp(___ppss, ___m_list); \
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* doubly linked-list
|
||||
*/
|
||||
|
||||
/*
|
||||
* lws_dll2_owner / lws_dll2 : more capable version of lws_dll. Differences:
|
||||
*
|
||||
* - there's an explicit lws_dll2_owner struct which holds head, tail and
|
||||
* count of members.
|
||||
*
|
||||
* - list members all hold a pointer to their owner. So user code does not
|
||||
* have to track anything about exactly what lws_dll2_owner list the object
|
||||
* is a member of.
|
||||
*
|
||||
* - you can use lws_dll unless you want the member count or the ability to
|
||||
* not track exactly which list it's on.
|
||||
*
|
||||
* - layout is compatible with lws_dll (but lws_dll apis will not update the
|
||||
* new stuff)
|
||||
*/
|
||||
|
||||
|
||||
struct lws_dll2;
|
||||
struct lws_dll2_owner;
|
||||
|
||||
typedef struct lws_dll2 {
|
||||
struct lws_dll2 *prev;
|
||||
struct lws_dll2 *next;
|
||||
struct lws_dll2_owner *owner;
|
||||
} lws_dll2_t;
|
||||
|
||||
typedef struct lws_dll2_owner {
|
||||
struct lws_dll2 *tail;
|
||||
struct lws_dll2 *head;
|
||||
|
||||
uint32_t count;
|
||||
} lws_dll2_owner_t;
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_dll2_is_detached(const struct lws_dll2 *d);
|
||||
|
||||
static LWS_INLINE const struct lws_dll2_owner *
|
||||
lws_dll2_owner(const struct lws_dll2 *d) { return d->owner; }
|
||||
|
||||
static LWS_INLINE struct lws_dll2 *
|
||||
lws_dll2_get_head(struct lws_dll2_owner *owner) { return owner->head; }
|
||||
|
||||
static LWS_INLINE struct lws_dll2 *
|
||||
lws_dll2_get_tail(struct lws_dll2_owner *owner) { return owner->tail; }
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_dll2_add_head(struct lws_dll2 *d, struct lws_dll2_owner *owner);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_dll2_add_tail(struct lws_dll2 *d, struct lws_dll2_owner *owner);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_dll2_remove(struct lws_dll2 *d);
|
||||
|
||||
typedef int (*lws_dll2_foreach_cb_t)(struct lws_dll2 *d, void *user);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_dll2_foreach_safe(struct lws_dll2_owner *owner, void *user,
|
||||
lws_dll2_foreach_cb_t cb);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_dll2_clear(struct lws_dll2 *d);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_dll2_owner_clear(struct lws_dll2_owner *d);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_dll2_add_before(struct lws_dll2 *d, struct lws_dll2 *after);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_dll2_add_insert(struct lws_dll2 *d, struct lws_dll2 *prev);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_dll2_add_sorted(lws_dll2_t *d, lws_dll2_owner_t *own,
|
||||
int (*compare)(const lws_dll2_t *d, const lws_dll2_t *i));
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_dll2_add_sorted_priv(lws_dll2_t *d, lws_dll2_owner_t *own, void *priv,
|
||||
int (*compare3)(void *priv, const lws_dll2_t *d,
|
||||
const lws_dll2_t *i));
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void *
|
||||
_lws_dll2_search_sz_pl(lws_dll2_owner_t *own, const char *name, size_t namelen,
|
||||
size_t dll2_ofs, size_t ptr_ofs);
|
||||
|
||||
/*
|
||||
* Searches objects in an owner list linearly and returns one with a given
|
||||
* member C-string matching a supplied length-provided string if it exists, else
|
||||
* NULL.
|
||||
*/
|
||||
|
||||
#define lws_dll2_search_sz_pl(own, name, namelen, type, membd2list, membptr) \
|
||||
((type *)_lws_dll2_search_sz_pl(own, name, namelen, \
|
||||
offsetof(type, membd2list), \
|
||||
offsetof(type, membptr)))
|
||||
|
||||
#if defined(_DEBUG)
|
||||
void
|
||||
lws_dll2_describe(struct lws_dll2_owner *owner, const char *desc);
|
||||
#else
|
||||
#define lws_dll2_describe(x, y)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* these are safe against the current container object getting deleted,
|
||||
* since the hold his next in a temp and go to that next. ___tmp is
|
||||
* the temp.
|
||||
*/
|
||||
|
||||
#define lws_start_foreach_dll_safe(___type, ___it, ___tmp, ___start) \
|
||||
{ \
|
||||
___type ___it = ___start; \
|
||||
while (___it) { \
|
||||
___type ___tmp = (___it)->next;
|
||||
|
||||
#define lws_end_foreach_dll_safe(___it, ___tmp) \
|
||||
___it = ___tmp; \
|
||||
} \
|
||||
}
|
||||
|
||||
#define lws_start_foreach_dll(___type, ___it, ___start) \
|
||||
{ \
|
||||
___type ___it = ___start; \
|
||||
while (___it) {
|
||||
|
||||
#define lws_end_foreach_dll(___it) \
|
||||
___it = (___it)->next; \
|
||||
} \
|
||||
}
|
||||
|
||||
///@}
|
||||
|
||||
524
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-dlo.h
Normal file
524
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-dlo.h
Normal file
@ -0,0 +1,524 @@
|
||||
/*
|
||||
* lws abstract display
|
||||
*
|
||||
* Copyright (C) 2019 - 2022 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*
|
||||
* lws display_list and display_list objects (dlo)
|
||||
*/
|
||||
|
||||
#if !defined(__LWS_DLO_H__)
|
||||
#define __LWS_DLO_H__
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
struct lws_display_render_state;
|
||||
struct lws_surface_info;
|
||||
struct lws_display_state;
|
||||
struct lws_display_font;
|
||||
struct lws_dlo_text;
|
||||
struct lws_display;
|
||||
struct lws_dlo_text;
|
||||
struct lws_dlo;
|
||||
|
||||
#define LWSDC_RGBA(_r, _g, _b, _a) (((uint32_t)(_r) & 0xff) | \
|
||||
(((uint32_t)(_g) & 0xff) << 8) | \
|
||||
(((uint32_t)(_b) & 0xff) << 16) | \
|
||||
(((uint32_t)(_a) & 0xff) << 24))
|
||||
|
||||
#define LWSDC_R(_c) ((_c) & 0xff)
|
||||
#define LWSDC_G(_c) ((_c >> 8) & 0xff)
|
||||
#define LWSDC_B(_c) ((_c >> 16) & 0xff)
|
||||
#define LWSDC_ALPHA(_c) ((_c >> 24) & 0xff)
|
||||
|
||||
#define RGB_TO_Y(_r, _g, _b) ((((_r) * 299) + ((_g) * 587) + ((_b) * 114)) / 1000)
|
||||
/* stores Y in RGBY */
|
||||
#define PALETTE_RGBY(_r, _g, _b) LWSDC_RGBA(_r, _g, _b, (RGB_TO_Y(_r, _g, _b)))
|
||||
|
||||
typedef struct {
|
||||
lws_fx_t w;
|
||||
lws_fx_t h;
|
||||
} lws_dlo_dim_t;
|
||||
|
||||
/*
|
||||
* When using RGBA to describe native greyscale, R is Y and A is A, GB is ignored
|
||||
*/
|
||||
|
||||
/* composed at start of larger, font-specific glyph struct */
|
||||
|
||||
typedef struct lws_font_glyph {
|
||||
lws_dll2_t list;
|
||||
|
||||
lws_fx_t xorg;
|
||||
lws_fx_t xpx;
|
||||
lws_fx_t height;
|
||||
lws_fx_t cwidth;
|
||||
|
||||
int8_t x; /* x offset inside the glyph */
|
||||
|
||||
} lws_font_glyph_t;
|
||||
|
||||
typedef lws_stateful_ret_t (*lws_dlo_renderer_t)(struct lws_display_render_state *rs);
|
||||
typedef lws_font_glyph_t * (*lws_dlo_image_glyph_t)(
|
||||
struct lws_dlo_text *text,
|
||||
uint32_t unicode, char attach);
|
||||
typedef void (*lws_dlo_destroy_t)(struct lws_dlo *dlo);
|
||||
|
||||
typedef struct lws_display_id {
|
||||
lws_dll2_t list;
|
||||
|
||||
char id[16];
|
||||
lws_box_t box; /* taken from DLO after layout */
|
||||
|
||||
void *priv_user;
|
||||
void *priv_driver;
|
||||
|
||||
char exists;
|
||||
char iframe; /* 1 = render html as if partial
|
||||
* is the origin, otherwise
|
||||
* render html with surface
|
||||
* (0,0) as origin and rs->box
|
||||
* is a viewport on to that */
|
||||
} lws_display_id_t;
|
||||
|
||||
/*
|
||||
* Common dlo object that joins the display list, composed into a subclass
|
||||
* object like lws_dlo_rect_t etc
|
||||
*/
|
||||
|
||||
typedef struct lws_dlo {
|
||||
lws_dll2_t list;
|
||||
|
||||
lws_dll2_t col_list; /* lws_dlo_t: column-mates */
|
||||
lws_dll2_t row_list; /* lws_dlo_t: row-mates */
|
||||
|
||||
/* children are rendered "inside" the parent DLO box after allowing
|
||||
* for parent padding */
|
||||
lws_dll2_owner_t children;
|
||||
|
||||
/* only used for dlo rect representing whole table */
|
||||
|
||||
lws_dll2_owner_t table_cols; /* lhp_table_col_t */
|
||||
lws_dll2_owner_t table_rows; /* lhp_table_row_t */
|
||||
|
||||
/* may point to dlo whose width or height decides our x or y */
|
||||
|
||||
struct lws_dlo *abut_x;
|
||||
struct lws_dlo *abut_y;
|
||||
|
||||
lws_dlo_destroy_t _destroy; /* dlo-type specific cb */
|
||||
lws_dlo_renderer_t render; /* dlo-type specific cb */
|
||||
|
||||
lws_fx_t margin[4];
|
||||
lws_fx_t padding[4]; /* child origin */
|
||||
|
||||
lws_display_id_t *id; /* only valid until ids destroyed */
|
||||
|
||||
lws_box_t box;
|
||||
lws_display_colour_t dc;
|
||||
|
||||
uint8_t flag_runon:1; /* continues same line */
|
||||
uint8_t flag_done_align:1;
|
||||
uint8_t flag_toplevel:1; /* don't scan up with me (different owner) */
|
||||
|
||||
/* render-specific members ... */
|
||||
} lws_dlo_t;
|
||||
|
||||
typedef struct lws_circle {
|
||||
lws_fx_t r;
|
||||
|
||||
/* rasterization temps */
|
||||
lws_fx_t orx; /* abs pixel x for centre */
|
||||
lws_fx_t ory; /* abs pixel y for centre */
|
||||
lws_fx_t rsq;
|
||||
lws_fx_t ys;
|
||||
} lws_circle_t;
|
||||
|
||||
typedef struct lws_dlo_rect {
|
||||
lws_dlo_t dlo;
|
||||
lws_circle_t c[4]; /* t-l, t-r, b-l, b-r */
|
||||
lws_fx_t b[4]; /* border width on t/r/b/l */
|
||||
lws_display_colour_t dcb; /* border colour */
|
||||
|
||||
/* rasterization temps */
|
||||
|
||||
lws_fx_t btm;
|
||||
lws_fx_t right;
|
||||
lws_box_t db;
|
||||
|
||||
uint8_t init;
|
||||
uint8_t alt;
|
||||
} lws_dlo_rect_t;
|
||||
|
||||
typedef struct lws_dlo_circle {
|
||||
lws_dlo_t dlo;
|
||||
} lws_dlo_circle_t;
|
||||
|
||||
typedef struct lws_font_choice {
|
||||
const char *family_name;
|
||||
const char *generic_name;
|
||||
uint16_t weight;
|
||||
uint16_t style; /* normal, italic, oblique */
|
||||
uint16_t fixed_height;
|
||||
} lws_font_choice_t;
|
||||
|
||||
typedef struct lws_display_font {
|
||||
lws_dll2_t list;
|
||||
|
||||
lws_font_choice_t choice;
|
||||
|
||||
const uint8_t *data; /* may be cast to imp struct */
|
||||
uint8_t *priv; /* only used by implementation */
|
||||
size_t data_len;
|
||||
lws_dlo_renderer_t renderer;
|
||||
lws_dlo_image_glyph_t image_glyph;
|
||||
|
||||
lws_fx_t em; /* 1 em in pixels */
|
||||
lws_fx_t ex; /* 1 ex in pixels */
|
||||
} lws_display_font_t;
|
||||
|
||||
typedef struct lws_dlo_filesystem {
|
||||
lws_dll2_t list;
|
||||
|
||||
const char *name;
|
||||
const void *data;
|
||||
size_t len;
|
||||
} lws_dlo_filesystem_t;
|
||||
|
||||
#define LWSDLO_TEXT_FLAG_WRAP (1 << 0)
|
||||
|
||||
typedef struct lws_dlo_text {
|
||||
lws_dlo_t dlo;
|
||||
const lws_display_font_t *font;
|
||||
lws_dll2_owner_t glyphs;
|
||||
lws_box_t bounding_box; /* { 0, 0, w, h } relative
|
||||
* to and subject to
|
||||
* clipping by .dlo.box */
|
||||
|
||||
/* referred to by glyphs */
|
||||
const struct lws_surface_info *ic;
|
||||
struct lwsac *ac_glyphs;
|
||||
uint8_t *line;
|
||||
uint16_t curr;
|
||||
|
||||
char *text;
|
||||
uint8_t *kern;
|
||||
size_t text_len;
|
||||
lws_display_list_coord_t clkernpx;
|
||||
lws_display_list_coord_t cwidth;
|
||||
|
||||
lws_fx_t indent;
|
||||
|
||||
uint32_t flags;
|
||||
int16_t font_y_baseline;
|
||||
int16_t font_height;
|
||||
int16_t font_line_height;
|
||||
|
||||
int16_t group_height;
|
||||
int16_t group_y_baseline;
|
||||
|
||||
lws_fx_t _cwidth;
|
||||
} lws_dlo_text_t;
|
||||
|
||||
typedef struct lws_dlo_rasterize {
|
||||
lws_dll2_owner_t owner; /* lws_flow_t */
|
||||
lws_sorted_usec_list_t sul;
|
||||
int lines;
|
||||
} lws_dlo_rasterize_t;
|
||||
|
||||
typedef struct lws_dlo_png {
|
||||
lws_dlo_t dlo; /* ordering: first */
|
||||
lws_flow_t flow; /* ordering: second */
|
||||
lws_upng_t *png;
|
||||
} lws_dlo_png_t;
|
||||
|
||||
typedef struct lws_dlo_jpeg {
|
||||
lws_dlo_t dlo; /* ordering: first */
|
||||
lws_flow_t flow; /* ordering: second */
|
||||
lws_jpeg_t *j;
|
||||
} lws_dlo_jpeg_t;
|
||||
|
||||
typedef enum {
|
||||
LWSDLOSS_TYPE_JPEG,
|
||||
LWSDLOSS_TYPE_PNG,
|
||||
LWSDLOSS_TYPE_CSS,
|
||||
} lws_dlo_image_type_t;
|
||||
|
||||
typedef struct {
|
||||
union {
|
||||
lws_dlo_jpeg_t *dlo_jpeg;
|
||||
lws_dlo_png_t *dlo_png;
|
||||
} u;
|
||||
lws_dlo_image_type_t type;
|
||||
char failed;
|
||||
} lws_dlo_image_t;
|
||||
|
||||
typedef struct lws_displaylist {
|
||||
lws_dll2_owner_t dl;
|
||||
struct lws_display_state *ds;
|
||||
} lws_displaylist_t;
|
||||
|
||||
typedef struct lws_dl_rend {
|
||||
lws_displaylist_t *dl;
|
||||
int w;
|
||||
int h;
|
||||
} lws_dl_rend_t;
|
||||
|
||||
typedef struct lws_display_render_stack {
|
||||
lws_dlo_t *dlo; /* position in dlo owner */
|
||||
lws_box_t co; /* our origin as parent */
|
||||
} lws_display_render_stack_t;
|
||||
|
||||
typedef struct lws_display_render_state {
|
||||
lws_sorted_usec_list_t sul; /* return to event loop statefully */
|
||||
struct lws_display_state *lds; /* optional, if using lws_display */
|
||||
|
||||
lws_dll2_owner_t ids;
|
||||
|
||||
const struct lws_surface_info *ic; /* display dimensions, palette */
|
||||
|
||||
lws_display_render_stack_t st[12]; /* DLO child stack */
|
||||
int sp; /* DLO child stack level */
|
||||
|
||||
uint8_t *line; /* Y or RGB line comp buffer */
|
||||
|
||||
lws_displaylist_t displaylist;
|
||||
|
||||
lws_display_scalar curr;
|
||||
lws_display_scalar lowest_id_y;
|
||||
|
||||
char html;
|
||||
|
||||
} lws_display_render_state_t;
|
||||
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_display_render_free_ids(lws_display_render_state_t *rs);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN lws_display_id_t *
|
||||
lws_display_render_add_id(lws_display_render_state_t *rs, const char *id, void *priv);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN lws_display_id_t *
|
||||
lws_display_render_get_id(lws_display_render_state_t *rs, const char *id);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_display_render_dump_ids(lws_dll2_owner_t *ids);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_dlo_contents(lws_dlo_t *parent, lws_dlo_dim_t *dim);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_display_dlo_adjust_dims(lws_dlo_t *dlo, lws_dlo_dim_t *dim);
|
||||
|
||||
/**
|
||||
* lws_display_dl_init() - init display list object
|
||||
*
|
||||
* \param dl: Pointer to the display list
|
||||
* \param ds: Lws display state to bind the list to
|
||||
*
|
||||
* Initializes the display list \p dl and binds it to the display state \p ds.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_display_dl_init(lws_displaylist_t *dl, struct lws_display_state *ds);
|
||||
|
||||
//#if defined(_DEBUG)
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_display_dl_dump(lws_displaylist_t *dl);
|
||||
//#endif
|
||||
|
||||
/**
|
||||
* lws_display_list_destroy() - destroys display list and objects on it
|
||||
*
|
||||
* \param dl: Pointer to the display list
|
||||
*
|
||||
* Destroys every DLO on the list.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_display_list_destroy(lws_displaylist_t *dl);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_display_dlo_destroy(lws_dlo_t **r);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_display_dlo_add(lws_displaylist_t *dl, lws_dlo_t *dlo_parent, lws_dlo_t *dlo);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_dlo_ensure_err_diff(lws_dlo_t *dlo);
|
||||
|
||||
/*
|
||||
* lws_display_list_render_line() - render a single raster line of the list
|
||||
*
|
||||
* \param rs: prepared render state object
|
||||
*
|
||||
* Allocates a line pair buffer into ds->line if necessary, and renders the
|
||||
* current line (set by ds->curr) of the display list rasterization into it
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN lws_stateful_ret_t
|
||||
lws_display_list_render_line(lws_display_render_state_t *rs);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN lws_stateful_ret_t
|
||||
lws_display_get_ids_boxes(lws_display_render_state_t *rs);
|
||||
|
||||
/*
|
||||
* rect
|
||||
*/
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN lws_dlo_rect_t *
|
||||
lws_display_dlo_rect_new(lws_displaylist_t *dl, lws_dlo_t *dlo_parent,
|
||||
lws_box_t *box, const lws_fx_t *radii,
|
||||
lws_display_colour_t dc);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN lws_stateful_ret_t
|
||||
lws_display_render_rect(struct lws_display_render_state *rs);
|
||||
|
||||
/*
|
||||
* dlo text
|
||||
*/
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN lws_dlo_text_t *
|
||||
lws_display_dlo_text_new(lws_displaylist_t *dl, lws_dlo_t *dlo_parent,
|
||||
lws_box_t *box, const lws_display_font_t *font);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_display_dlo_text_update(lws_dlo_text_t *text, lws_display_colour_t dc,
|
||||
lws_fx_t indent, const char *utf8, size_t text_len);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_display_dlo_text_destroy(struct lws_dlo *dlo);
|
||||
|
||||
/*
|
||||
* PNG
|
||||
*/
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN lws_dlo_png_t *
|
||||
lws_display_dlo_png_new(lws_displaylist_t *dl, lws_dlo_t *dlo_parent,
|
||||
lws_box_t *box);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN lws_stateful_ret_t
|
||||
lws_display_render_png(struct lws_display_render_state *rs);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN lws_stateful_ret_t
|
||||
lws_display_dlo_png_metadata_scan(lws_dlo_png_t *dp);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_display_dlo_png_destroy(struct lws_dlo *dlo);
|
||||
|
||||
/*
|
||||
* JPEG
|
||||
*/
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN lws_dlo_jpeg_t *
|
||||
lws_display_dlo_jpeg_new(lws_displaylist_t *dl, lws_dlo_t *dlo_parent,
|
||||
lws_box_t *box);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN lws_stateful_ret_t
|
||||
lws_display_render_jpeg(struct lws_display_render_state *rs);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN lws_stateful_ret_t
|
||||
lws_display_dlo_jpeg_metadata_scan(lws_dlo_jpeg_t *dj);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_display_dlo_jpeg_destroy(struct lws_dlo *dlo);
|
||||
|
||||
/*
|
||||
* SS / dlo images
|
||||
*/
|
||||
|
||||
struct lhp_ctx;
|
||||
|
||||
typedef struct {
|
||||
struct lws_context *cx;
|
||||
lws_displaylist_t *dl;
|
||||
lws_dlo_t *dlo_parent;
|
||||
lws_box_t *box;
|
||||
sul_cb_t on_rx;
|
||||
lws_sorted_usec_list_t *on_rx_sul;
|
||||
const char *url;
|
||||
struct lhp_ctx *lhp;
|
||||
lws_dlo_image_t *u;
|
||||
int32_t window;
|
||||
|
||||
uint8_t type;
|
||||
} lws_dlo_ss_create_info_t;
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_dlo_ss_create(lws_dlo_ss_create_info_t *i, lws_dlo_t **pdlo);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_dlo_ss_find(struct lws_context *cx, const char *url, lws_dlo_image_t *u);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN lws_stateful_ret_t
|
||||
lhp_displaylist_layout(struct lhp_ctx *ctx, char reason);
|
||||
|
||||
#define lws_dlo_image_width(_u) ((_u)->failed ? -1 : \
|
||||
((_u)->type == LWSDLOSS_TYPE_JPEG ? \
|
||||
(int)lws_jpeg_get_width((_u)->u.dlo_jpeg->j) : \
|
||||
(int)lws_upng_get_width((_u)->u.dlo_png->png)))
|
||||
#define lws_dlo_image_height(_u) ((_u)->failed ? -1 : \
|
||||
((_u)->type == LWSDLOSS_TYPE_JPEG ? \
|
||||
(int)lws_jpeg_get_height((_u)->u.dlo_jpeg->j) : \
|
||||
(int)lws_upng_get_height((_u)->u.dlo_png->png)))
|
||||
|
||||
#define lws_dlo_image_metadata_scan(_u) ((_u)->failed ? LWS_SRET_FATAL : \
|
||||
((_u)->type == LWSDLOSS_TYPE_JPEG ? \
|
||||
lws_display_dlo_jpeg_metadata_scan((_u)->u.dlo_jpeg) : \
|
||||
lws_display_dlo_png_metadata_scan((_u)->u.dlo_png)))
|
||||
|
||||
/*
|
||||
* Font registry
|
||||
*
|
||||
* Register fonts (currently, psfu) to the lws_context, and select the closest
|
||||
* matching. Used to pick fonts from whatever CSS information is available.
|
||||
*/
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_font_register(struct lws_context *cx, const uint8_t *data, size_t data_len);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN const lws_display_font_t *
|
||||
lws_font_choose(struct lws_context *cx, const lws_font_choice_t *hints);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_fonts_destroy(struct lws_context *cx);
|
||||
|
||||
/*
|
||||
* Static blob registry (built-in, name-accessible blobs)
|
||||
*/
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN lws_dlo_filesystem_t *
|
||||
lws_dlo_file_register(struct lws_context *cx, const lws_dlo_filesystem_t *f);
|
||||
|
||||
/* only needed if f dynamically heap-allocated... doesn't free data; data
|
||||
* is typically overallocated after the lws_dlo_filesystem_t and freed when
|
||||
* that is freed by this. */
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_dlo_file_unregister(lws_dlo_filesystem_t **f);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_dlo_file_unregister_by_name(struct lws_context *cx, const char *name);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN const lws_dlo_filesystem_t *
|
||||
lws_dlo_file_choose(struct lws_context *cx, const char *name);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_dlo_file_destroy(struct lws_context *cx);
|
||||
|
||||
LWS_VISIBLE extern const struct lws_plat_file_ops lws_dlo_fops;
|
||||
#endif
|
||||
169
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-dsh.h
Normal file
169
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-dsh.h
Normal file
@ -0,0 +1,169 @@
|
||||
/*
|
||||
* libwebsockets - small server side websockets and web server implementation
|
||||
*
|
||||
* Copyright (C) 2010 - 2019 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
/*
|
||||
* lws_dsh (Disordered Shared Heap) is an opaque abstraction supporting a single
|
||||
* linear buffer (overallocated at end of the lws_dsh_t) which may contain
|
||||
* multiple kinds of packets that are retired out of order, and tracked by kind.
|
||||
*
|
||||
* Each kind of packet has an lws_dll2 list of its kind of packets and acts as
|
||||
* a FIFO; packets of a particular type are always retired in order. But there
|
||||
* is no requirement about the order types are retired matching the original
|
||||
* order they arrived.
|
||||
*
|
||||
* Gaps are tracked as just another kind of "packet" list.
|
||||
*
|
||||
* "allocations" (including gaps) are prepended by an lws_dsh_object_t.
|
||||
*
|
||||
* dsh may themselves be on an lws_dll2_owner list, and under memory pressure
|
||||
* allocate into other buffers on the list.
|
||||
*
|
||||
* All management structures exist inside the allocated buffer.
|
||||
*/
|
||||
|
||||
enum {
|
||||
LWS_DSHFLAG_ENABLE_COALESCE = (1u << 24),
|
||||
LWS_DSHFLAG_ENABLE_SPLIT = (1u << 25),
|
||||
};
|
||||
|
||||
/**
|
||||
* lws_dsh_create() - Allocate a DSH buffer
|
||||
*
|
||||
* \param owner: the owning list this dsh belongs on, or NULL if standalone
|
||||
* \param buffer_size: the allocation in bytes
|
||||
* \param count_kinds: how many separately-tracked fifos use the buffer, or-ed
|
||||
* with optional LWS_DSHFLAGs
|
||||
*
|
||||
* This makes a single heap allocation that includes internal tracking objects
|
||||
* in the buffer. Sub-allocated objects are bound to a "kind" index and
|
||||
* managed via a FIFO for each kind.
|
||||
*
|
||||
* Every "kind" of allocation shares the same buffer space.
|
||||
*
|
||||
* Multiple buffers may be bound together in an lws_dll2 list, and if an
|
||||
* allocation cannot be satisfied by the local buffer, space can be borrowed
|
||||
* from other dsh in the same list (the local dsh FIFO tracks these "foreign"
|
||||
* allocations as if they were local).
|
||||
*
|
||||
* Returns an opaque pointer to the dsh, or NULL if allocation failed.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN struct lws_dsh *
|
||||
lws_dsh_create(lws_dll2_owner_t *owner, size_t buffer_size, int count_kinds);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_dsh_empty(struct lws_dsh *dsh);
|
||||
|
||||
/**
|
||||
* lws_dsh_destroy() - Destroy a DSH buffer
|
||||
*
|
||||
* \param pdsh: pointer to the dsh pointer
|
||||
*
|
||||
* Deallocates the DSH and sets *pdsh to NULL.
|
||||
*
|
||||
* Before destruction, any foreign buffer usage on the part of this dsh are
|
||||
* individually freed. All dsh on the same list are walked and checked if they
|
||||
* have their own foreign allocations on the dsh buffer being destroyed. If so,
|
||||
* it attempts to migrate the allocation to a dsh that is not currently being
|
||||
* destroyed. If all else fails (basically the buffer memory is being shrunk)
|
||||
* unmigratable objects are cleanly destroyed.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_dsh_destroy(struct lws_dsh **pdsh);
|
||||
|
||||
/**
|
||||
* lws_dsh_alloc_tail() - make a suballocation inside a dsh
|
||||
*
|
||||
* \param dsh: the dsh tracking the allocation
|
||||
* \param kind: the kind of allocation
|
||||
* \param src1: the first source data to copy
|
||||
* \param size1: the size of the first source data
|
||||
* \param src2: the second source data to copy (after the first), or NULL
|
||||
* \param size2: the size of the second source data
|
||||
*
|
||||
* Allocates size1 + size2 bytes in a dsh (it prefers the given dsh but will
|
||||
* borrow space from other dsh on the same list if necessary) and copies size1
|
||||
* bytes into it from src1, followed by size2 bytes from src2 if src2 isn't
|
||||
* NULL. The actual suballocation is a bit larger because of alignment and a
|
||||
* prepended management header.
|
||||
*
|
||||
* The suballocation is added to the kind-specific FIFO at the tail.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_dsh_alloc_tail(struct lws_dsh *dsh, int kind, const void *src1,
|
||||
size_t size1, const void *src2, size_t size2);
|
||||
|
||||
/**
|
||||
* lws_dsh_free() - free a suballocation from the dsh
|
||||
*
|
||||
* \param obj: a pointer to a void * that pointed to the allocated payload
|
||||
*
|
||||
* This returns the space used by \p obj in the dsh buffer to the free list
|
||||
* of the dsh the allocation came from.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_dsh_free(void **obj);
|
||||
|
||||
/**
|
||||
* lws_dsh_consume() - partially consume a dsh
|
||||
*
|
||||
* \param dsh: the dsh
|
||||
* \param kind: the kind of allocation (0 +)
|
||||
* \param len: length to consume
|
||||
*
|
||||
* Consume part of a dsh object.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_dsh_consume(struct lws_dsh *dsh, int kind, size_t len);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN size_t
|
||||
lws_dsh_get_size(struct lws_dsh *dsh, int kind);
|
||||
|
||||
/**
|
||||
* lws_dsh_get_head() - get the head allocation inside the dsh
|
||||
*
|
||||
* \param dsh: the dsh tracking the allocation
|
||||
* \param kind: the kind of allocation
|
||||
* \param obj: pointer to a void * to be set to the payload
|
||||
* \param size: set to the size of the allocation
|
||||
*
|
||||
* This gets the "next" object in the kind FIFO for the dsh, and returns 0 if
|
||||
* any. If none, returns nonzero.
|
||||
*
|
||||
* This is nondestructive of the fifo or the payload. Use lws_dsh_free on
|
||||
* obj to remove the entry from the kind fifo and return the payload to the
|
||||
* free list.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_dsh_get_head(struct lws_dsh *dsh, int kind, void **obj, size_t *size);
|
||||
|
||||
/**
|
||||
* lws_dsh_describe() - DEBUG BUILDS ONLY dump the dsh to the logs
|
||||
*
|
||||
* \param dsh: the dsh to dump
|
||||
* \param desc: text that appears at the top of the dump
|
||||
*
|
||||
* Useful information for debugging lws_dsh
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_dsh_describe(struct lws_dsh *dsh, const char *desc);
|
||||
@ -0,0 +1,52 @@
|
||||
/*
|
||||
* SPI - esp32 esp-idf api implementation
|
||||
*
|
||||
* Copyright (C) 2019 - 2020 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*
|
||||
* This is like an abstract class for gpio, a real implementation provides
|
||||
* functions for the ops that use the underlying OS gpio arrangements.
|
||||
*/
|
||||
|
||||
#if defined(ESP_PLATFORM)
|
||||
|
||||
#define lws_esp32_spi_ops \
|
||||
.init = lws_esp32_spi_init, \
|
||||
.queue = lws_esp32_spi_queue, \
|
||||
.alloc_dma = lws_esp32_spi_alloc_dma, \
|
||||
.free_dma = lws_esp32_spi_free_dma, \
|
||||
.in_flight = lws_esp32_spi_in_flight
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_esp32_spi_init(const lws_spi_ops_t *spi_ops);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_esp32_spi_queue(const lws_spi_ops_t *spi_ops, const lws_spi_desc_t *desc);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void *
|
||||
lws_esp32_spi_alloc_dma(const struct lws_spi_ops *ctx, size_t size);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_esp32_spi_free_dma(const struct lws_spi_ops *ctx, void **p);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_esp32_spi_in_flight(const struct lws_spi_ops *ctx);
|
||||
|
||||
#endif
|
||||
@ -0,0 +1,153 @@
|
||||
/*
|
||||
* libwebsockets - small server side websockets and web server implementation
|
||||
*
|
||||
* Copyright (C) 2010 - 2021 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*
|
||||
* These are exports needed by event lib plugins.
|
||||
*/
|
||||
|
||||
enum lws_event_lib_ops_flags {
|
||||
LELOF_ISPOLL = (1 >> 0),
|
||||
LELOF_DESTROY_FINAL = (1 >> 1),
|
||||
};
|
||||
|
||||
enum {
|
||||
LWS_EV_READ = (1 << 0),
|
||||
LWS_EV_WRITE = (1 << 1),
|
||||
LWS_EV_START = (1 << 2),
|
||||
LWS_EV_STOP = (1 << 3),
|
||||
};
|
||||
|
||||
struct lws_event_loop_ops {
|
||||
const char *name;
|
||||
/* event loop-specific context init during context creation */
|
||||
int (*init_context)(struct lws_context *context,
|
||||
const struct lws_context_creation_info *info);
|
||||
/* called during lws_destroy_context */
|
||||
int (*destroy_context1)(struct lws_context *context);
|
||||
/* called during lws_destroy_context2 */
|
||||
int (*destroy_context2)(struct lws_context *context);
|
||||
/* init vhost listening wsi */
|
||||
int (*init_vhost_listen_wsi)(struct lws *wsi);
|
||||
/* init the event loop for a pt */
|
||||
int (*init_pt)(struct lws_context *context, void *_loop, int tsi);
|
||||
/* called at end of first phase of close_free_wsi() */
|
||||
int (*wsi_logical_close)(struct lws *wsi);
|
||||
/* return nonzero if client connect not allowed */
|
||||
int (*check_client_connect_ok)(struct lws *wsi);
|
||||
/* close handle manually */
|
||||
void (*close_handle_manually)(struct lws *wsi);
|
||||
/* event loop accept processing */
|
||||
int (*sock_accept)(struct lws *wsi);
|
||||
/* control wsi active events */
|
||||
void (*io)(struct lws *wsi, unsigned int flags);
|
||||
/* run the event loop for a pt */
|
||||
void (*run_pt)(struct lws_context *context, int tsi);
|
||||
/* called before pt is destroyed */
|
||||
void (*destroy_pt)(struct lws_context *context, int tsi);
|
||||
/* called just before wsi is freed */
|
||||
void (*destroy_wsi)(struct lws *wsi);
|
||||
/* return nonzero if caller thread is not loop service thread */
|
||||
int (*foreign_thread)(struct lws_context *context, int tsi);
|
||||
/* optional: custom implementation for faking POLLIN for buffered.
|
||||
* return nonzero if any wsi faked */
|
||||
int (*fake_POLLIN_override)(struct lws_context *context, int tsi);
|
||||
|
||||
uint8_t flags;
|
||||
|
||||
uint16_t evlib_size_ctx;
|
||||
uint16_t evlib_size_pt;
|
||||
uint16_t evlib_size_vh;
|
||||
uint16_t evlib_size_wsi;
|
||||
};
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void *
|
||||
lws_evlib_wsi_to_evlib_pt(struct lws *wsi);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void *
|
||||
lws_evlib_tsi_to_evlib_pt(struct lws_context *ctx, int tsi);
|
||||
|
||||
/*
|
||||
* You should consider these opaque for normal user code.
|
||||
*/
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void *
|
||||
lws_realloc(void *ptr, size_t size, const char *reason);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_vhost_destroy1(struct lws_vhost *vh);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_close_free_wsi(struct lws *wsi, enum lws_close_status reason,
|
||||
const char *caller);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_vhost_foreach_listen_wsi(struct lws_context *cx, void *arg,
|
||||
lws_dll2_foreach_cb_t cb);
|
||||
|
||||
struct lws_context_per_thread;
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_service_do_ripe_rxflow(struct lws_context_per_thread *pt);
|
||||
|
||||
#if !defined(wsi_from_fd) && !defined(WIN32) && !defined(_WIN32)
|
||||
struct lws_context;
|
||||
LWS_VISIBLE LWS_EXTERN struct lws *
|
||||
wsi_from_fd(const struct lws_context *context, int fd);
|
||||
#endif
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
_lws_plat_service_forced_tsi(struct lws_context *context, int tsi);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_context_destroy2(struct lws_context *context);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_destroy_event_pipe(struct lws *wsi);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
__lws_close_free_wsi_final(struct lws *wsi);
|
||||
|
||||
#if LWS_MAX_SMP > 1
|
||||
|
||||
struct lws_mutex_refcount {
|
||||
pthread_mutex_t lock;
|
||||
pthread_t lock_owner;
|
||||
const char *last_lock_reason;
|
||||
char lock_depth;
|
||||
char metadata;
|
||||
};
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_mutex_refcount_assert_held(struct lws_mutex_refcount *mr);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_mutex_refcount_init(struct lws_mutex_refcount *mr);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_mutex_refcount_destroy(struct lws_mutex_refcount *mr);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_mutex_refcount_lock(struct lws_mutex_refcount *mr, const char *reason);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_mutex_refcount_unlock(struct lws_mutex_refcount *mr);
|
||||
|
||||
#endif
|
||||
@ -0,0 +1,251 @@
|
||||
/*
|
||||
* libwebsockets - small server side websockets and web server implementation
|
||||
*
|
||||
* Copyright (C) 2010 - 2021 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*
|
||||
* Fault injection api if built with LWS_WITH_SYS_FAULT_INJECTION
|
||||
*/
|
||||
|
||||
typedef struct lws_xos {
|
||||
uint64_t s[4];
|
||||
} lws_xos_t;
|
||||
|
||||
/**
|
||||
* lws_xos_init() - seed xoshiro256 PRNG
|
||||
*
|
||||
* \param xos: the prng state object to initialize
|
||||
* \param seed: the 64-bit seed
|
||||
*
|
||||
* Initialize PRNG \xos with the starting state represented by \p seed
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_xos_init(struct lws_xos *xos, uint64_t seed);
|
||||
|
||||
/**
|
||||
* lws_xos() - get next xoshiro256 PRNG result and update state
|
||||
*
|
||||
* \param xos: the PRNG state to use
|
||||
*
|
||||
* Returns next 64-bit PRNG result. These are cheap to get,
|
||||
* quite a white noise sequence, and completely deterministic
|
||||
* according to the seed it was initialized with.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN uint64_t LWS_WARN_UNUSED_RESULT
|
||||
lws_xos(struct lws_xos *xos);
|
||||
|
||||
/**
|
||||
* lws_xos_percent() - return 1 a given percent of the time on average
|
||||
*
|
||||
* \param xos: the PRNG state to use
|
||||
* \param percent: chance in 100 of returning 1
|
||||
*
|
||||
* Returns 1 if next random % 100 is < \p percent, such that
|
||||
* 100 always returns 1, 0 never returns 1, and the chance linearly scales
|
||||
* inbetween
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
|
||||
lws_xos_percent(struct lws_xos *xos, int percent);
|
||||
|
||||
#if defined(LWS_WITH_SYS_FAULT_INJECTION)
|
||||
|
||||
enum {
|
||||
LWSFI_ALWAYS,
|
||||
LWSFI_DETERMINISTIC, /* do .count injections after .pre then stop */
|
||||
LWSFI_PROBABILISTIC, /* .pre % chance of injection */
|
||||
LWSFI_PATTERN, /* use .count bits in .pattern after .pre */
|
||||
LWSFI_PATTERN_ALLOC, /* as _PATTERN, but .pattern is malloc'd */
|
||||
LWSFI_RANGE /* pick a number between pre and count */
|
||||
};
|
||||
|
||||
typedef struct lws_fi {
|
||||
const char *name;
|
||||
const uint8_t *pattern;
|
||||
uint64_t pre;
|
||||
uint64_t count;
|
||||
uint64_t times; /* start at 0, tracks usage */
|
||||
char type; /* LWSFI_* */
|
||||
} lws_fi_t;
|
||||
|
||||
typedef struct lws_fi_ctx {
|
||||
lws_dll2_owner_t fi_owner;
|
||||
struct lws_xos xos;
|
||||
const char *name;
|
||||
} lws_fi_ctx_t;
|
||||
|
||||
/**
|
||||
* lws_fi() - find out if we should perform the named fault injection this time
|
||||
*
|
||||
* \param fic: fault injection tracking context
|
||||
* \param fi_name: name of fault injection
|
||||
*
|
||||
* This checks if the named fault is configured in the fi tracking context
|
||||
* provided, if it is, then it will make a decision if the named fault should
|
||||
* be applied this time, using the tracking in the named lws_fi_t.
|
||||
*
|
||||
* If the provided context has a parent, that is also checked for the named fi
|
||||
* item recursively, with the first found being used to determine if to inject
|
||||
* or not.
|
||||
*
|
||||
* If LWS_WITH_SYS_FAULT_INJECTION is not defined, then this always return 0.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_fi(const lws_fi_ctx_t *fic, const char *fi_name);
|
||||
|
||||
/**
|
||||
* lws_fi_range() - get a random number from a range
|
||||
*
|
||||
* \param fic: fault injection tracking context
|
||||
* \param fi_name: name of fault injection
|
||||
* \param result: points to uint64_t to be set to the result
|
||||
*
|
||||
* This lets you get a random number from an externally-set range, set using a
|
||||
* fault injection syntax like "myfault(123..456)". That will cause us to
|
||||
* return a number between those two inclusive, from the seeded PRNG.
|
||||
*
|
||||
* This is useful when you used lws_fi() with its own fault name to decide
|
||||
* whether to inject the fault, and then the code to cause the fault needs
|
||||
* additional constrained pseudo-random fuzzing for, eg, delays before issuing
|
||||
* the fault.
|
||||
*
|
||||
* Returns 0 if \p *result is set, else nonzero for failure.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_fi_range(const lws_fi_ctx_t *fic, const char *name, uint64_t *result);
|
||||
|
||||
/**
|
||||
* lws_fi_add() - add an allocated copy of fault injection to a context
|
||||
*
|
||||
* \param fic: fault injection tracking context
|
||||
* \param fi: the fault injection details
|
||||
*
|
||||
* This allocates a copy of \p fi and attaches it to the fault injection context
|
||||
* \p fic. \p fi can go out of scope after this safely.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_fi_add(lws_fi_ctx_t *fic, const lws_fi_t *fi);
|
||||
|
||||
/**
|
||||
* lws_fi_remove() - remove an allocated copy of fault injection from a context
|
||||
*
|
||||
* \param fic: fault injection tracking context
|
||||
* \param name: the fault injection name to remove
|
||||
*
|
||||
* This looks for the named fault injection and removes and destroys it from
|
||||
* the specified fault injection context
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_fi_remove(lws_fi_ctx_t *fic, const char *name);
|
||||
|
||||
/**
|
||||
* lws_fi_import() - transfers all the faults from one context to another
|
||||
*
|
||||
* \param fic_dest: the fault context to receive the faults
|
||||
* \param fic_src: the fault context that will be emptied out into \p fic_dest
|
||||
*
|
||||
* This is used to initialize created object fault injection contexts from
|
||||
* the caller.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_fi_import(lws_fi_ctx_t *fic_dest, const lws_fi_ctx_t *fic_src);
|
||||
|
||||
/**
|
||||
* lws_fi_inherit_copy() - attach copies of matching fault injection objects to dest
|
||||
*
|
||||
* \param fic_dest: destination Fault Injection context
|
||||
* \param fic_src: parent fault context that may contain matching rules
|
||||
* \param scope: the name of the path match required, eg, "vh"
|
||||
* \param value: the dynamic name of our match, eg, "myvhost"
|
||||
*
|
||||
* If called with scope "vh" and value "myvhost", then matches faults starting
|
||||
* "vh=myvhost/", strips that part of the name if it matches and makes a copy
|
||||
* of the rule with the modified name attached to the destination Fault Injection
|
||||
* context.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_fi_inherit_copy(lws_fi_ctx_t *fic_dest, const lws_fi_ctx_t *fic_src,
|
||||
const char *scope, const char *value);
|
||||
|
||||
/**
|
||||
* lws_fi_destroy() - removes all allocated fault injection entries
|
||||
*
|
||||
* \param fic: fault injection tracking context
|
||||
*
|
||||
* This walks any allocated fault injection entries in \p fic and detaches and
|
||||
* destroys them. It doesn't try to destroc \p fic itself, since this is
|
||||
* not usually directly allocated.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_fi_destroy(const lws_fi_ctx_t *fic);
|
||||
|
||||
/**
|
||||
* lws_fi_deserialize() - adds fault in string form to Fault Injection Context
|
||||
*
|
||||
* \p fic: the fault injection context
|
||||
* \p sers: the string serializing the desired fault details
|
||||
*
|
||||
* This turns a string like "ss=captive_portal_detect/wsi/dnsfail(10%)" into
|
||||
* a fault injection struct added to the fault injection context \p fic
|
||||
*
|
||||
* You can prepare the context creation info .fic with these before creating
|
||||
* the context, and use namespace paths on those to target other objects.
|
||||
*/
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_fi_deserialize(lws_fi_ctx_t *fic, const char *sers);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
_lws_fi_user_wsi_fi(struct lws *wsi, const char *name);
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
_lws_fi_user_context_fi(struct lws_context *ctx, const char *name);
|
||||
|
||||
#if defined(LWS_WITH_SECURE_STREAMS)
|
||||
struct lws_ss_handle;
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
_lws_fi_user_ss_fi(struct lws_ss_handle *h, const char *name);
|
||||
#if defined(LWS_WITH_SECURE_STREAMS_PROXY_API)
|
||||
struct lws_sspc_handle;
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
_lws_fi_user_sspc_fi(struct lws_sspc_handle *h, const char *name);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#define lws_fi_user_wsi_fi(_wsi, _name) _lws_fi_user_wsi_fi(_wsi, _name)
|
||||
#define lws_fi_user_context_fi(_ctx, _name) _lws_fi_user_context_fi(_ctx, _name)
|
||||
#define lws_fi_user_ss_fi(_h, _name) _lws_fi_user_ss_fi(_h, _name)
|
||||
#define lws_fi_user_sspc_fi(_h, _name) _lws_fi_user_sspc_fi(_h, _name)
|
||||
|
||||
#else
|
||||
|
||||
/*
|
||||
* Helper so we can leave lws_fi() calls embedded in the code being tested,
|
||||
* if fault injection is not enabled then it just always says "no" at buildtime.
|
||||
*/
|
||||
|
||||
#define lws_fi(_fi_name, _fic) (0)
|
||||
#define lws_fi_destroy(_x)
|
||||
#define lws_fi_inherit_copy(_a, _b, _c, _d)
|
||||
#define lws_fi_deserialize(_x, _y)
|
||||
#define lws_fi_user_wsi_fi(_wsi, _name) (0)
|
||||
#define lws_fi_user_context_fi(_wsi, _name) (0)
|
||||
#define lws_fi_user_ss_fi(_h, _name) (0)
|
||||
#define lws_fi_user_sspc_fi(_h, _name) (0)
|
||||
|
||||
#endif
|
||||
@ -0,0 +1,87 @@
|
||||
/*
|
||||
* libwebsockets - small server side websockets and web server implementation
|
||||
*
|
||||
* Copyright (C) 2010 - 2020 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*
|
||||
* This is included from libwebsockets.h if LWS_PLAT_FREERTOS
|
||||
*/
|
||||
|
||||
typedef int lws_sockfd_type;
|
||||
typedef int lws_filefd_type;
|
||||
|
||||
#if defined(LWS_AMAZON_RTOS)
|
||||
#include <FreeRTOS.h>
|
||||
#include <event_groups.h>
|
||||
#include <string.h>
|
||||
#include "timers.h"
|
||||
#include <lwip/sockets.h>
|
||||
|
||||
/*
|
||||
* Later lwip (at least 2.1.12) already defines these in its own headers
|
||||
* protected by the same test as used here... if POLLIN / POLLOUT already exist
|
||||
* then assume no need to declare those and struct pollfd.
|
||||
*
|
||||
* Older lwip needs these declarations done here.
|
||||
*/
|
||||
|
||||
#if !defined(POLLIN) && !defined(POLLOUT)
|
||||
|
||||
struct pollfd {
|
||||
lws_sockfd_type fd; /**< fd related to */
|
||||
short events; /**< which POLL... events to respond to */
|
||||
short revents; /**< which POLL... events occurred */
|
||||
};
|
||||
#define POLLIN 0x0001
|
||||
#define POLLPRI 0x0002
|
||||
#define POLLOUT 0x0004
|
||||
#define POLLERR 0x0008
|
||||
#define POLLHUP 0x0010
|
||||
#define POLLNVAL 0x0020
|
||||
|
||||
#endif
|
||||
|
||||
#else /* LWS_AMAZON_RTOS */
|
||||
#include <freertos/FreeRTOS.h>
|
||||
#include <freertos/event_groups.h>
|
||||
#include <string.h>
|
||||
#include "esp_wifi.h"
|
||||
#include "esp_system.h"
|
||||
#include "esp_event.h"
|
||||
//#include "esp_event_loop.h"
|
||||
#include "nvs.h"
|
||||
#include "driver/gpio.h"
|
||||
#include "spi_flash_mmap.h"
|
||||
#include "freertos/timers.h"
|
||||
|
||||
#if defined(LWS_ESP_PLATFORM)
|
||||
#include "lwip/sockets.h"
|
||||
#include "lwip/netdb.h"
|
||||
#if defined(LWS_WITH_DRIVERS)
|
||||
#include "libwebsockets/lws-gpio.h"
|
||||
extern const lws_gpio_ops_t lws_gpio_plat;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#endif /* LWS_AMAZON_RTOS */
|
||||
|
||||
#if !defined(CONFIG_FREERTOS_HZ)
|
||||
#define CONFIG_FREERTOS_HZ 100
|
||||
#endif
|
||||
215
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-fts.h
Normal file
215
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-fts.h
Normal file
@ -0,0 +1,215 @@
|
||||
/*
|
||||
* libwebsockets - small server side websockets and web server implementation
|
||||
*
|
||||
* Copyright (C) 2010 - 2019 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
/** \defgroup search Search
|
||||
*
|
||||
* ##Full-text search
|
||||
*
|
||||
* Lws provides superfast indexing and fulltext searching from index files on
|
||||
* storage.
|
||||
*/
|
||||
///@{
|
||||
|
||||
struct lws_fts;
|
||||
struct lws_fts_file;
|
||||
|
||||
/*
|
||||
* Queries produce their results in an lwsac, using these public API types.
|
||||
* The first thing in the lwsac is always a struct lws_fts_result (see below)
|
||||
* containing heads for linked-lists of the other result types.
|
||||
*/
|
||||
|
||||
/* one filepath's results */
|
||||
|
||||
struct lws_fts_result_filepath {
|
||||
struct lws_fts_result_filepath *next;
|
||||
int matches; /* logical number of matches */
|
||||
int matches_length; /* bytes in length table (may be zero) */
|
||||
int lines_in_file;
|
||||
int filepath_length;
|
||||
|
||||
/* - uint32_t line table follows (first for alignment) */
|
||||
/* - filepath (of filepath_length) follows */
|
||||
};
|
||||
|
||||
/* autocomplete result */
|
||||
|
||||
struct lws_fts_result_autocomplete {
|
||||
struct lws_fts_result_autocomplete *next;
|
||||
int instances;
|
||||
int agg_instances;
|
||||
int ac_length;
|
||||
char elided; /* children skipped in interest of antecedent children */
|
||||
char has_children;
|
||||
|
||||
/* - autocomplete suggestion (of length ac_length) follows */
|
||||
};
|
||||
|
||||
/*
|
||||
* The results lwsac always starts with this. If no results and / or no
|
||||
* autocomplete the members may be NULL. This implies the symbol nor any
|
||||
* suffix on it exists in the trie file.
|
||||
*/
|
||||
struct lws_fts_result {
|
||||
struct lws_fts_result_filepath *filepath_head;
|
||||
struct lws_fts_result_autocomplete *autocomplete_head;
|
||||
int duration_ms;
|
||||
int effective_flags; /* the search flags that were used */
|
||||
};
|
||||
|
||||
/*
|
||||
* index creation functions
|
||||
*/
|
||||
|
||||
/**
|
||||
* lws_fts_create() - Create a new index file
|
||||
*
|
||||
* \param fd: The fd opened for write
|
||||
*
|
||||
* Inits a new index file, returning a struct lws_fts to represent it
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN struct lws_fts *
|
||||
lws_fts_create(int fd);
|
||||
|
||||
/**
|
||||
* lws_fts_destroy() - Finalize a new index file / destroy the trie lwsac
|
||||
*
|
||||
* \param trie: The previously opened index being finalized
|
||||
*
|
||||
* Finalizes an index file that was being created, and frees the memory involved
|
||||
* *trie is set to NULL afterwards.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_fts_destroy(struct lws_fts **trie);
|
||||
|
||||
/**
|
||||
* lws_fts_file_index() - Create a new entry in the trie file for an input path
|
||||
*
|
||||
* \param t: The previously opened index being written
|
||||
* \param filepath: The filepath (which may be virtual) associated with this file
|
||||
* \param filepath_len: The number of chars in the filepath
|
||||
* \param priority: not used yet
|
||||
*
|
||||
* Returns an ordinal that represents this new filepath in the index file.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_fts_file_index(struct lws_fts *t, const char *filepath, int filepath_len,
|
||||
int priority);
|
||||
|
||||
/**
|
||||
* lws_fts_fill() - Process all or a bufferload of input file
|
||||
*
|
||||
* \param t: The previously opened index being written
|
||||
* \param file_index: The ordinal representing this input filepath
|
||||
* \param buf: A bufferload of data from the input file
|
||||
* \param len: The number of bytes in buf
|
||||
*
|
||||
* Indexes a buffer of data from the input file.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_fts_fill(struct lws_fts *t, uint32_t file_index, const char *buf,
|
||||
size_t len);
|
||||
|
||||
/**
|
||||
* lws_fts_serialize() - Store the in-memory trie into the index file
|
||||
*
|
||||
* \param t: The previously opened index being written
|
||||
*
|
||||
* The trie is held in memory where it can be added to... after all the input
|
||||
* filepaths and data have been processed, this is called to serialize /
|
||||
* write the trie data into the index file.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_fts_serialize(struct lws_fts *t);
|
||||
|
||||
/*
|
||||
* index search functions
|
||||
*/
|
||||
|
||||
/**
|
||||
* lws_fts_open() - Open an existing index file to search it
|
||||
*
|
||||
* \param filepath: The filepath to the index file to open
|
||||
*
|
||||
* Opening the index file returns an opaque struct lws_fts_file * that is
|
||||
* used to perform other operations on it, or NULL if it can't be opened.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN struct lws_fts_file *
|
||||
lws_fts_open(const char *filepath);
|
||||
|
||||
#define LWSFTS_F_QUERY_AUTOCOMPLETE (1 << 0)
|
||||
#define LWSFTS_F_QUERY_FILES (1 << 1)
|
||||
#define LWSFTS_F_QUERY_FILE_LINES (1 << 2)
|
||||
#define LWSFTS_F_QUERY_QUOTE_LINE (1 << 3)
|
||||
|
||||
struct lws_fts_search_params {
|
||||
/* the actual search term */
|
||||
const char *needle;
|
||||
/* if non-NULL, FILE results for this filepath only */
|
||||
const char *only_filepath;
|
||||
/* will be set to the results lwsac */
|
||||
struct lwsac *results_head;
|
||||
/* combination of LWSFTS_F_QUERY_* flags */
|
||||
int flags;
|
||||
/* maximum number of autocomplete suggestions to return */
|
||||
int max_autocomplete;
|
||||
/* maximum number of filepaths to return */
|
||||
int max_files;
|
||||
/* maximum number of line number results to return per filepath */
|
||||
int max_lines;
|
||||
};
|
||||
|
||||
/**
|
||||
* lws_fts_search() - Perform a search operation on an index
|
||||
*
|
||||
* \param jtf: The index file struct returned by lws_fts_open
|
||||
* \param ftsp: The struct lws_fts_search_params filled in by the caller
|
||||
*
|
||||
* The caller should memset the ftsp struct to 0 to ensure members that may be
|
||||
* introduced in later versions contain known values, then set the related
|
||||
* members to describe the kind of search action required.
|
||||
*
|
||||
* ftsp->results_head is the results lwsac, or NULL. It should be freed with
|
||||
* lwsac_free() when the results are finished with.
|
||||
*
|
||||
* Returns a pointer into the results lwsac that is a struct lws_fts_result
|
||||
* containing the head pointers into linked-lists of results for autocomplete
|
||||
* and filepath data, along with some sundry information. This does not need
|
||||
* to be freed since freeing the lwsac will also remove this and everything it
|
||||
* points to.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN struct lws_fts_result *
|
||||
lws_fts_search(struct lws_fts_file *jtf, struct lws_fts_search_params *ftsp);
|
||||
|
||||
/**
|
||||
* lws_fts_close() - Close a previously-opened index file
|
||||
*
|
||||
* \param jtf: The pointer returned from the open
|
||||
*
|
||||
* Closes the file handle on the index and frees any allocations
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_fts_close(struct lws_fts_file *jtf);
|
||||
|
||||
///@}
|
||||
170
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-genaes.h
Normal file
170
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-genaes.h
Normal file
@ -0,0 +1,170 @@
|
||||
/*
|
||||
* libwebsockets - small server side websockets and web server implementation
|
||||
*
|
||||
* Copyright (C) 2010 - 2020 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
/*! \defgroup generic AES
|
||||
* ## Generic AES related functions
|
||||
*
|
||||
* Lws provides generic AES functions that abstract the ones
|
||||
* provided by whatever tls library you are linking against.
|
||||
*
|
||||
* It lets you use the same code if you build against mbedtls or OpenSSL
|
||||
* for example.
|
||||
*/
|
||||
///@{
|
||||
|
||||
#if defined(LWS_WITH_MBEDTLS)
|
||||
#include <mbedtls/aes.h>
|
||||
#include <mbedtls/gcm.h>
|
||||
#endif
|
||||
|
||||
enum enum_aes_modes {
|
||||
LWS_GAESM_CBC,
|
||||
LWS_GAESM_CFB128,
|
||||
LWS_GAESM_CFB8,
|
||||
LWS_GAESM_CTR,
|
||||
LWS_GAESM_ECB,
|
||||
LWS_GAESM_OFB,
|
||||
LWS_GAESM_XTS, /* care... requires double-length key */
|
||||
LWS_GAESM_GCM,
|
||||
LWS_GAESM_KW,
|
||||
};
|
||||
|
||||
enum enum_aes_operation {
|
||||
LWS_GAESO_ENC,
|
||||
LWS_GAESO_DEC
|
||||
};
|
||||
|
||||
enum enum_aes_padding {
|
||||
LWS_GAESP_NO_PADDING,
|
||||
LWS_GAESP_WITH_PADDING
|
||||
};
|
||||
|
||||
/* include/libwebsockets/lws-jwk.h must be included before this */
|
||||
|
||||
#define LWS_AES_BLOCKSIZE 128
|
||||
#define LWS_AES_CBC_BLOCKLEN 16
|
||||
|
||||
struct lws_genaes_ctx {
|
||||
#if defined(LWS_WITH_MBEDTLS)
|
||||
union {
|
||||
mbedtls_aes_context ctx;
|
||||
#if defined(MBEDTLS_CIPHER_MODE_XTS)
|
||||
mbedtls_aes_xts_context ctx_xts;
|
||||
#endif
|
||||
mbedtls_gcm_context ctx_gcm;
|
||||
} u;
|
||||
#else
|
||||
EVP_CIPHER_CTX *ctx;
|
||||
const EVP_CIPHER *cipher;
|
||||
ENGINE *engine;
|
||||
char init;
|
||||
#endif
|
||||
unsigned char tag[16];
|
||||
struct lws_gencrypto_keyelem *k;
|
||||
enum enum_aes_operation op;
|
||||
enum enum_aes_modes mode;
|
||||
enum enum_aes_padding padding;
|
||||
int taglen;
|
||||
char underway;
|
||||
};
|
||||
|
||||
/** lws_genaes_create() - Create genaes AES context
|
||||
*
|
||||
* \param ctx: your struct lws_genaes_ctx
|
||||
* \param op: LWS_GAESO_ENC or LWS_GAESO_DEC
|
||||
* \param mode: one of LWS_GAESM_
|
||||
* \param el: struct prepared with key element data
|
||||
* \param padding: 0 = no padding, 1 = padding
|
||||
* \param engine: if openssl engine used, pass the pointer here
|
||||
*
|
||||
* Creates an AES context with a key associated with it, formed from
|
||||
* the key elements in \p el.
|
||||
*
|
||||
* Returns 0 for OK or nonzero for error.
|
||||
*
|
||||
* This and related APIs operate identically with OpenSSL or mbedTLS backends.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_genaes_create(struct lws_genaes_ctx *ctx, enum enum_aes_operation op,
|
||||
enum enum_aes_modes mode, struct lws_gencrypto_keyelem *el,
|
||||
enum enum_aes_padding padding, void *engine);
|
||||
|
||||
/** lws_genaes_destroy() - Destroy genaes AES context
|
||||
*
|
||||
* \param ctx: your struct lws_genaes_ctx
|
||||
* \param tag: NULL, or, GCM-only: buffer to receive tag
|
||||
* \param tlen: 0, or, GCM-only: length of tag buffer
|
||||
*
|
||||
* Destroys any allocations related to \p ctx.
|
||||
*
|
||||
* For GCM only, up to tlen bytes of tag buffer will be set on exit.
|
||||
*
|
||||
* This and related APIs operate identically with OpenSSL or mbedTLS backends.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_genaes_destroy(struct lws_genaes_ctx *ctx, unsigned char *tag, size_t tlen);
|
||||
|
||||
/** lws_genaes_crypt() - Encrypt or decrypt
|
||||
*
|
||||
* \param ctx: your struct lws_genaes_ctx
|
||||
* \param in: input plaintext or ciphertext
|
||||
* \param len: length of input (which is always length of output)
|
||||
* \param out: output plaintext or ciphertext
|
||||
* \param iv_or_nonce_ctr_or_data_unit_16: NULL, iv, nonce_ctr16, or data_unit16
|
||||
* \param stream_block_16: pointer to 16-byte stream block for CTR mode only
|
||||
* \param nc_or_iv_off: NULL or pointer to nc, or iv_off
|
||||
* \param taglen: length of tag
|
||||
*
|
||||
* Encrypts or decrypts using the AES mode set when the ctx was created.
|
||||
* The last three arguments have different meanings depending on the mode:
|
||||
*
|
||||
* KW CBC CFB128 CFB8 CTR ECB OFB XTS
|
||||
* iv_or_nonce_ct.._unit_16 : iv iv iv iv nonce NULL iv dataunt
|
||||
* stream_block_16 : NULL NULL NULL NULL stream NULL NULL NULL
|
||||
* nc_or_iv_off : NULL NULL iv_off NULL nc_off NULL iv_off NULL
|
||||
*
|
||||
* For GCM:
|
||||
*
|
||||
* iv_or_nonce_ctr_or_data_unit_16 : iv
|
||||
* stream_block_16 : pointer to tag
|
||||
* nc_or_iv_off : set pointed-to size_t to iv length
|
||||
* in : first call: additional data, subsequently
|
||||
* : input data
|
||||
* len : first call: add data length, subsequently
|
||||
* : input / output length
|
||||
*
|
||||
* The length of the optional arg is always 16 if used, regardless of the mode.
|
||||
*
|
||||
* Returns 0 for OK or nonzero for error.
|
||||
*
|
||||
* This and related APIs operate identically with OpenSSL or mbedTLS backends.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_genaes_crypt(struct lws_genaes_ctx *ctx, const uint8_t *in, size_t len,
|
||||
uint8_t *out,
|
||||
uint8_t *iv_or_nonce_ctr_or_data_unit_16,
|
||||
uint8_t *stream_block_16,
|
||||
size_t *nc_or_iv_off, int taglen);
|
||||
|
||||
///@}
|
||||
@ -0,0 +1,137 @@
|
||||
/*
|
||||
* libwebsockets - small server side websockets and web server implementation
|
||||
*
|
||||
* Copyright (C) 2010 - 2020 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
/*
|
||||
* These are gencrypto-level constants... they are used by both JOSE and direct
|
||||
* gencrypto code. However while JWK relies on these, using gencrypto apis has
|
||||
* no dependency at all on any JOSE type.
|
||||
*/
|
||||
|
||||
enum lws_gencrypto_kty {
|
||||
LWS_GENCRYPTO_KTY_UNKNOWN,
|
||||
|
||||
LWS_GENCRYPTO_KTY_OCT,
|
||||
LWS_GENCRYPTO_KTY_RSA,
|
||||
LWS_GENCRYPTO_KTY_EC
|
||||
};
|
||||
|
||||
/*
|
||||
* Keytypes where the same element name is reused must all agree to put the
|
||||
* same-named element at the same e[] index. It's because when used with jwk,
|
||||
* we parse and store in incoming key data, but we may not be informed of the
|
||||
* definitive keytype until the end.
|
||||
*/
|
||||
|
||||
enum lws_gencrypto_oct_tok {
|
||||
LWS_GENCRYPTO_OCT_KEYEL_K, /* note... same offset as AES K */
|
||||
|
||||
LWS_GENCRYPTO_OCT_KEYEL_COUNT
|
||||
};
|
||||
|
||||
enum lws_gencrypto_rsa_tok {
|
||||
LWS_GENCRYPTO_RSA_KEYEL_E,
|
||||
LWS_GENCRYPTO_RSA_KEYEL_N,
|
||||
LWS_GENCRYPTO_RSA_KEYEL_D, /* note... same offset as EC D */
|
||||
LWS_GENCRYPTO_RSA_KEYEL_P,
|
||||
LWS_GENCRYPTO_RSA_KEYEL_Q,
|
||||
LWS_GENCRYPTO_RSA_KEYEL_DP,
|
||||
LWS_GENCRYPTO_RSA_KEYEL_DQ,
|
||||
LWS_GENCRYPTO_RSA_KEYEL_QI,
|
||||
|
||||
/* we don't actively use these if given, but may come from COSE */
|
||||
|
||||
LWS_GENCRYPTO_RSA_KEYEL_OTHER,
|
||||
LWS_GENCRYPTO_RSA_KEYEL_RI,
|
||||
LWS_GENCRYPTO_RSA_KEYEL_DI,
|
||||
LWS_GENCRYPTO_RSA_KEYEL_TI,
|
||||
|
||||
LWS_GENCRYPTO_RSA_KEYEL_COUNT
|
||||
};
|
||||
|
||||
enum lws_gencrypto_ec_tok {
|
||||
LWS_GENCRYPTO_EC_KEYEL_CRV,
|
||||
LWS_GENCRYPTO_EC_KEYEL_X,
|
||||
/* note... same offset as RSA D */
|
||||
LWS_GENCRYPTO_EC_KEYEL_D = LWS_GENCRYPTO_RSA_KEYEL_D,
|
||||
LWS_GENCRYPTO_EC_KEYEL_Y,
|
||||
|
||||
LWS_GENCRYPTO_EC_KEYEL_COUNT
|
||||
};
|
||||
|
||||
enum lws_gencrypto_aes_tok {
|
||||
/* note... same offset as OCT K */
|
||||
LWS_GENCRYPTO_AES_KEYEL_K = LWS_GENCRYPTO_OCT_KEYEL_K,
|
||||
|
||||
LWS_GENCRYPTO_AES_KEYEL_COUNT
|
||||
};
|
||||
|
||||
/* largest number of key elements for any algorithm */
|
||||
#define LWS_GENCRYPTO_MAX_KEYEL_COUNT LWS_GENCRYPTO_RSA_KEYEL_COUNT
|
||||
|
||||
/* this "stretchy" type holds individual key element data in binary form.
|
||||
* It's typcially used in an array with the layout mapping the element index to
|
||||
* the key element meaning defined by the enums above. An array of these of
|
||||
* length LWS_GENCRYPTO_MAX_KEYEL_COUNT can define key elements for any key
|
||||
* type.
|
||||
*/
|
||||
|
||||
typedef struct lws_gencrypto_keyelem {
|
||||
uint8_t *buf;
|
||||
uint32_t len;
|
||||
} lws_gc_elem_t;
|
||||
|
||||
|
||||
/**
|
||||
* lws_gencrypto_bits_to_bytes() - returns rounded up bytes needed for bits
|
||||
*
|
||||
* \param bits
|
||||
*
|
||||
* Returns the number of bytes needed to store the given number of bits. If
|
||||
* a byte is partially used, the byte count is rounded up.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_gencrypto_bits_to_bytes(int bits);
|
||||
|
||||
/**
|
||||
* lws_base64_size() - returns estimated size of base64 encoding
|
||||
*
|
||||
* \param bytes
|
||||
*
|
||||
* Returns a slightly oversize estimate of the size of a base64 encoded version
|
||||
* of the given amount of unencoded data.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_base64_size(int bytes);
|
||||
|
||||
/**
|
||||
* lws_gencrypto_padded_length() - returns PKCS#5/#7 padded length
|
||||
*
|
||||
* @param blocksize - blocksize to pad to
|
||||
* @param len - Length of input to pad
|
||||
*
|
||||
* Returns the length of a buffer originally of size len after PKCS#5 or PKCS#7
|
||||
* padding has been applied to it.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN size_t
|
||||
lws_gencrypto_padded_length(size_t block_size, size_t len);
|
||||
211
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-genec.h
Normal file
211
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-genec.h
Normal file
@ -0,0 +1,211 @@
|
||||
/*
|
||||
* libwebsockets - small server side websockets and web server implementation
|
||||
*
|
||||
* Copyright (C) 2010 - 2019 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
enum enum_genec_alg {
|
||||
LEGENEC_UNKNOWN,
|
||||
|
||||
LEGENEC_ECDH,
|
||||
LEGENEC_ECDSA
|
||||
};
|
||||
|
||||
struct lws_genec_ctx {
|
||||
#if defined(LWS_WITH_MBEDTLS)
|
||||
union {
|
||||
mbedtls_ecdh_context *ctx_ecdh;
|
||||
mbedtls_ecdsa_context *ctx_ecdsa;
|
||||
} u;
|
||||
#else
|
||||
EVP_PKEY_CTX *ctx[2];
|
||||
#endif
|
||||
struct lws_context *context;
|
||||
const struct lws_ec_curves *curve_table;
|
||||
enum enum_genec_alg genec_alg;
|
||||
|
||||
char has_private;
|
||||
};
|
||||
|
||||
#if defined(LWS_WITH_MBEDTLS)
|
||||
enum enum_lws_dh_side {
|
||||
LDHS_OURS = MBEDTLS_ECDH_OURS,
|
||||
LDHS_THEIRS = MBEDTLS_ECDH_THEIRS
|
||||
};
|
||||
#else
|
||||
enum enum_lws_dh_side {
|
||||
LDHS_OURS,
|
||||
LDHS_THEIRS
|
||||
};
|
||||
#endif
|
||||
|
||||
struct lws_ec_curves {
|
||||
const char *name;
|
||||
int tls_lib_nid;
|
||||
uint16_t key_bytes;
|
||||
};
|
||||
|
||||
|
||||
/* ECDH-specific apis */
|
||||
|
||||
/** lws_genecdh_create() - Create a genecdh
|
||||
*
|
||||
* \param ctx: your genec context
|
||||
* \param context: your lws_context (for RNG access)
|
||||
* \param curve_table: NULL, enabling P-256, P-384 and P-521, or a replacement
|
||||
* struct lws_ec_curves array, terminated by an entry with
|
||||
* .name = NULL, of curves you want to allow
|
||||
*
|
||||
* Initializes a genecdh
|
||||
*/
|
||||
LWS_VISIBLE int
|
||||
lws_genecdh_create(struct lws_genec_ctx *ctx, struct lws_context *context,
|
||||
const struct lws_ec_curves *curve_table);
|
||||
|
||||
/** lws_genecdh_set_key() - Apply an EC key to our or theirs side
|
||||
*
|
||||
* \param ctx: your genecdh context
|
||||
* \param el: your key elements
|
||||
* \param side: LDHS_OURS or LDHS_THEIRS
|
||||
*
|
||||
* Applies an EC key to one side or the other of an ECDH ctx
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_genecdh_set_key(struct lws_genec_ctx *ctx, struct lws_gencrypto_keyelem *el,
|
||||
enum enum_lws_dh_side side);
|
||||
|
||||
/** lws_genecdh_new_keypair() - Create a genec with a new public / private key
|
||||
*
|
||||
* \param ctx: your genec context
|
||||
* \param side: LDHS_OURS or LDHS_THEIRS
|
||||
* \param curve_name: an EC curve name, like "P-256"
|
||||
* \param el: array pf LWS_GENCRYPTO_EC_KEYEL_COUNT key elems to take the new key
|
||||
*
|
||||
* Creates a genecdh with a newly minted EC public / private key
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_genecdh_new_keypair(struct lws_genec_ctx *ctx, enum enum_lws_dh_side side,
|
||||
const char *curve_name, struct lws_gencrypto_keyelem *el);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_genecdh_compute_shared_secret(struct lws_genec_ctx *ctx, uint8_t *ss,
|
||||
int *ss_len);
|
||||
|
||||
|
||||
/* ECDSA-specific apis */
|
||||
|
||||
/** lws_genecdsa_create() - Create a genecdsa and
|
||||
*
|
||||
* \param ctx: your genec context
|
||||
* \param context: your lws_context (for RNG access)
|
||||
* \param curve_table: NULL, enabling P-256, P-384 and P-521, or a replacement
|
||||
* struct lws_ec_curves array, terminated by an entry with
|
||||
* .name = NULL, of curves you want to allow
|
||||
*
|
||||
* Initializes a genecdh
|
||||
*/
|
||||
LWS_VISIBLE int
|
||||
lws_genecdsa_create(struct lws_genec_ctx *ctx, struct lws_context *context,
|
||||
const struct lws_ec_curves *curve_table);
|
||||
|
||||
/** lws_genecdsa_new_keypair() - Create a genecdsa with a new public / private key
|
||||
*
|
||||
* \param ctx: your genec context
|
||||
* \param curve_name: an EC curve name, like "P-256"
|
||||
* \param el: array pf LWS_GENCRYPTO_EC_KEYEL_COUNT key elements to take the new key
|
||||
*
|
||||
* Creates a genecdsa with a newly minted EC public / private key
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_genecdsa_new_keypair(struct lws_genec_ctx *ctx, const char *curve_name,
|
||||
struct lws_gencrypto_keyelem *el);
|
||||
|
||||
/** lws_genecdsa_set_key() - Apply an EC key to an ecdsa context
|
||||
*
|
||||
* \param ctx: your genecdsa context
|
||||
* \param el: your key elements
|
||||
*
|
||||
* Applies an EC key to an ecdsa context
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_genecdsa_set_key(struct lws_genec_ctx *ctx,
|
||||
const struct lws_gencrypto_keyelem *el);
|
||||
|
||||
/** lws_genecdsa_hash_sig_verify_jws() - Verifies a JWS ECDSA signature on a given hash
|
||||
*
|
||||
* \param ctx: your struct lws_genrsa_ctx
|
||||
* \param in: unencrypted payload (usually a recomputed hash)
|
||||
* \param hash_type: one of LWS_GENHASH_TYPE_
|
||||
* \param keybits: number of bits in the crypto key
|
||||
* \param sig: pointer to the signature we received with the payload
|
||||
* \param sig_len: length of the signature we are checking in bytes
|
||||
*
|
||||
* This just looks at the signed hash... that's why there's no input length
|
||||
* parameter, it's decided by the choice of hash. It's up to you to confirm
|
||||
* separately the actual payload matches the hash that was confirmed by this to
|
||||
* be validly signed.
|
||||
*
|
||||
* Returns <0 for error, or 0 if signature matches the hash + key..
|
||||
*
|
||||
* The JWS ECDSA signature verification algorithm differs to generic ECDSA
|
||||
* signatures and they're not interoperable.
|
||||
*
|
||||
* This and related APIs operate identically with OpenSSL or mbedTLS backends.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_genecdsa_hash_sig_verify_jws(struct lws_genec_ctx *ctx, const uint8_t *in,
|
||||
enum lws_genhash_types hash_type, int keybits,
|
||||
const uint8_t *sig, size_t sig_len);
|
||||
|
||||
/** lws_genecdsa_hash_sign_jws() - Creates a JWS ECDSA signature for a hash you provide
|
||||
*
|
||||
* \param ctx: your struct lws_genrsa_ctx
|
||||
* \param in: precomputed hash
|
||||
* \param hash_type: one of LWS_GENHASH_TYPE_
|
||||
* \param keybits: number of bits in the crypto key
|
||||
* \param sig: pointer to buffer to take signature
|
||||
* \param sig_len: length of the buffer (must be >= length of key N)
|
||||
*
|
||||
* Returns <0 for error, or >=0 for success.
|
||||
*
|
||||
* This creates a JWS ECDSA signature for a hash you already computed and provide.
|
||||
*
|
||||
* The JWS ECDSA signature generation algorithm differs to generic ECDSA
|
||||
* signatures and they're not interoperable.
|
||||
*
|
||||
* This and related APIs operate identically with OpenSSL or mbedTLS backends.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_genecdsa_hash_sign_jws(struct lws_genec_ctx *ctx, const uint8_t *in,
|
||||
enum lws_genhash_types hash_type, int keybits,
|
||||
uint8_t *sig, size_t sig_len);
|
||||
|
||||
|
||||
/* Apis that apply to both ECDH and ECDSA */
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_genec_destroy(struct lws_genec_ctx *ctx);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_genec_destroy_elements(struct lws_gencrypto_keyelem *el);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_genec_dump(struct lws_gencrypto_keyelem *el);
|
||||
193
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-genhash.h
Normal file
193
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-genhash.h
Normal file
@ -0,0 +1,193 @@
|
||||
/*
|
||||
* libwebsockets - small server side websockets and web server implementation
|
||||
*
|
||||
* Copyright (C) 2010 - 2019 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
/*! \defgroup generichash Generic Hash
|
||||
* ## Generic Hash related functions
|
||||
*
|
||||
* Lws provides generic hash / digest accessors that abstract the ones
|
||||
* provided by whatever tls library you are linking against.
|
||||
*
|
||||
* It lets you use the same code if you build against mbedtls or OpenSSL
|
||||
* for example.
|
||||
*/
|
||||
///@{
|
||||
|
||||
enum lws_genhash_types {
|
||||
LWS_GENHASH_TYPE_UNKNOWN,
|
||||
LWS_GENHASH_TYPE_MD5,
|
||||
LWS_GENHASH_TYPE_SHA1,
|
||||
LWS_GENHASH_TYPE_SHA256,
|
||||
LWS_GENHASH_TYPE_SHA384,
|
||||
LWS_GENHASH_TYPE_SHA512,
|
||||
};
|
||||
|
||||
enum lws_genhmac_types {
|
||||
LWS_GENHMAC_TYPE_UNKNOWN,
|
||||
LWS_GENHMAC_TYPE_SHA256,
|
||||
LWS_GENHMAC_TYPE_SHA384,
|
||||
LWS_GENHMAC_TYPE_SHA512,
|
||||
};
|
||||
|
||||
#define LWS_GENHASH_LARGEST 64
|
||||
|
||||
#if defined(LWS_WITH_TLS) && defined(LWS_WITH_GENCRYPTO)
|
||||
|
||||
struct lws_genhash_ctx {
|
||||
uint8_t type;
|
||||
#if defined(LWS_WITH_MBEDTLS)
|
||||
union {
|
||||
mbedtls_md5_context md5;
|
||||
mbedtls_sha1_context sha1;
|
||||
mbedtls_sha256_context sha256;
|
||||
mbedtls_sha512_context sha512; /* 384 also uses this */
|
||||
const mbedtls_md_info_t *hmac;
|
||||
} u;
|
||||
#else
|
||||
const EVP_MD *evp_type;
|
||||
EVP_MD_CTX *mdctx;
|
||||
#endif
|
||||
};
|
||||
|
||||
struct lws_genhmac_ctx {
|
||||
uint8_t type;
|
||||
#if defined(LWS_WITH_MBEDTLS)
|
||||
const mbedtls_md_info_t *hmac;
|
||||
mbedtls_md_context_t ctx;
|
||||
#else
|
||||
const EVP_MD *evp_type;
|
||||
|
||||
#if defined(LWS_HAVE_EVP_PKEY_new_raw_private_key)
|
||||
EVP_MD_CTX *ctx;
|
||||
EVP_PKEY *key;
|
||||
#else
|
||||
#if defined(LWS_HAVE_HMAC_CTX_new)
|
||||
HMAC_CTX *ctx;
|
||||
#else
|
||||
HMAC_CTX ctx;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#endif
|
||||
};
|
||||
|
||||
/** lws_genhash_size() - get hash size in bytes
|
||||
*
|
||||
* \param type: one of LWS_GENHASH_TYPE_...
|
||||
*
|
||||
* Returns number of bytes in this type of hash, if the hash type is unknown, it
|
||||
* will return 0.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN size_t LWS_WARN_UNUSED_RESULT
|
||||
lws_genhash_size(enum lws_genhash_types type);
|
||||
|
||||
/** lws_genhmac_size() - get hash size in bytes
|
||||
*
|
||||
* \param type: one of LWS_GENHASH_TYPE_...
|
||||
*
|
||||
* Returns number of bytes in this type of hmac, if the hmac type is unknown, it
|
||||
* will return 0.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN size_t LWS_WARN_UNUSED_RESULT
|
||||
lws_genhmac_size(enum lws_genhmac_types type);
|
||||
|
||||
/** lws_genhash_init() - prepare your struct lws_genhash_ctx for use
|
||||
*
|
||||
* \param ctx: your struct lws_genhash_ctx
|
||||
* \param type: one of LWS_GENHASH_TYPE_...
|
||||
*
|
||||
* Initializes the hash context for the type you requested
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
|
||||
lws_genhash_init(struct lws_genhash_ctx *ctx, enum lws_genhash_types type);
|
||||
|
||||
/** lws_genhash_update() - digest len bytes of the buffer starting at in
|
||||
*
|
||||
* \param ctx: your struct lws_genhash_ctx
|
||||
* \param in: start of the bytes to digest
|
||||
* \param len: count of bytes to digest
|
||||
*
|
||||
* Updates the state of your hash context to reflect digesting len bytes from in
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
|
||||
lws_genhash_update(struct lws_genhash_ctx *ctx, const void *in, size_t len);
|
||||
|
||||
/** lws_genhash_destroy() - copy out the result digest and destroy the ctx
|
||||
*
|
||||
* \param ctx: your struct lws_genhash_ctx
|
||||
* \param result: NULL, or where to copy the result hash
|
||||
*
|
||||
* Finalizes the hash and copies out the digest. Destroys any allocations such
|
||||
* that ctx can safely go out of scope after calling this.
|
||||
*
|
||||
* NULL result is supported so that you can destroy the ctx cleanly on error
|
||||
* conditions, where there is no valid result.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_genhash_destroy(struct lws_genhash_ctx *ctx, void *result);
|
||||
|
||||
/** lws_genhmac_init() - prepare your struct lws_genhmac_ctx for use
|
||||
*
|
||||
* \param ctx: your struct lws_genhmac_ctx
|
||||
* \param type: one of LWS_GENHMAC_TYPE_...
|
||||
* \param key: pointer to the start of the HMAC key
|
||||
* \param key_len: length of the HMAC key
|
||||
*
|
||||
* Initializes the hash context for the type you requested
|
||||
*
|
||||
* If the return is nonzero, it failed and there is nothing needing to be
|
||||
* destroyed.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
|
||||
lws_genhmac_init(struct lws_genhmac_ctx *ctx, enum lws_genhmac_types type,
|
||||
const uint8_t *key, size_t key_len);
|
||||
|
||||
/** lws_genhmac_update() - digest len bytes of the buffer starting at in
|
||||
*
|
||||
* \param ctx: your struct lws_genhmac_ctx
|
||||
* \param in: start of the bytes to digest
|
||||
* \param len: count of bytes to digest
|
||||
*
|
||||
* Updates the state of your hash context to reflect digesting len bytes from in
|
||||
*
|
||||
* If the return is nonzero, it failed and needs destroying.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
|
||||
lws_genhmac_update(struct lws_genhmac_ctx *ctx, const void *in, size_t len);
|
||||
|
||||
/** lws_genhmac_destroy() - copy out the result digest and destroy the ctx
|
||||
*
|
||||
* \param ctx: your struct lws_genhmac_ctx
|
||||
* \param result: NULL, or where to copy the result hash
|
||||
*
|
||||
* Finalizes the hash and copies out the digest. Destroys any allocations such
|
||||
* that ctx can safely go out of scope after calling this.
|
||||
*
|
||||
* NULL result is supported so that you can destroy the ctx cleanly on error
|
||||
* conditions, where there is no valid result.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_genhmac_destroy(struct lws_genhmac_ctx *ctx, void *result);
|
||||
|
||||
#endif
|
||||
///@}
|
||||
255
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-genrsa.h
Normal file
255
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-genrsa.h
Normal file
@ -0,0 +1,255 @@
|
||||
/*
|
||||
* libwebsockets - small server side websockets and web server implementation
|
||||
*
|
||||
* Copyright (C) 2010 - 2019 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
/*! \defgroup genericRSA Generic RSA
|
||||
* ## Generic RSA related functions
|
||||
*
|
||||
* Lws provides generic RSA functions that abstract the ones
|
||||
* provided by whatever OpenSSL library you are linking against.
|
||||
*
|
||||
* It lets you use the same code if you build against mbedtls or OpenSSL
|
||||
* for example.
|
||||
*/
|
||||
///@{
|
||||
|
||||
/* include/libwebsockets/lws-jwk.h must be included before this */
|
||||
|
||||
enum enum_genrsa_mode {
|
||||
LGRSAM_PKCS1_1_5,
|
||||
LGRSAM_PKCS1_OAEP_PSS,
|
||||
|
||||
LGRSAM_COUNT
|
||||
};
|
||||
|
||||
struct lws_genrsa_ctx {
|
||||
#if defined(LWS_WITH_MBEDTLS)
|
||||
mbedtls_rsa_context *ctx;
|
||||
#else
|
||||
BIGNUM *bn[LWS_GENCRYPTO_RSA_KEYEL_COUNT];
|
||||
EVP_PKEY_CTX *ctx;
|
||||
RSA *rsa;
|
||||
#endif
|
||||
struct lws_context *context;
|
||||
enum enum_genrsa_mode mode;
|
||||
};
|
||||
|
||||
/** lws_genrsa_public_decrypt_create() - Create RSA public decrypt context
|
||||
*
|
||||
* \param ctx: your struct lws_genrsa_ctx
|
||||
* \param el: struct prepared with key element data
|
||||
* \param context: lws_context for RNG
|
||||
* \param mode: RSA mode, one of LGRSAM_ constants
|
||||
* \param oaep_hashid: the lws genhash id for the hash used in MFG1 hash
|
||||
* used in OAEP mode - normally, SHA1
|
||||
*
|
||||
* Creates an RSA context with a public key associated with it, formed from
|
||||
* the key elements in \p el.
|
||||
*
|
||||
* Mode LGRSAM_PKCS1_1_5 is in widespread use but has weaknesses. It's
|
||||
* recommended to use LGRSAM_PKCS1_OAEP_PSS for new implementations.
|
||||
*
|
||||
* Returns 0 for OK or nonzero for error.
|
||||
*
|
||||
* This and related APIs operate identically with OpenSSL or mbedTLS backends.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_genrsa_create(struct lws_genrsa_ctx *ctx,
|
||||
const struct lws_gencrypto_keyelem *el,
|
||||
struct lws_context *context, enum enum_genrsa_mode mode,
|
||||
enum lws_genhash_types oaep_hashid);
|
||||
|
||||
/** lws_genrsa_destroy_elements() - Free allocations in genrsa_elements
|
||||
*
|
||||
* \param el: your struct lws_gencrypto_keyelem
|
||||
*
|
||||
* This is a helper for user code making use of struct lws_gencrypto_keyelem
|
||||
* where the elements are allocated on the heap, it frees any non-NULL
|
||||
* buf element and sets the buf to NULL.
|
||||
*
|
||||
* NB: lws_genrsa_public_... apis do not need this as they take care of the key
|
||||
* creation and destruction themselves.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_genrsa_destroy_elements(struct lws_gencrypto_keyelem *el);
|
||||
|
||||
/** lws_genrsa_new_keypair() - Create new RSA keypair
|
||||
*
|
||||
* \param context: your struct lws_context (may be used for RNG)
|
||||
* \param ctx: your struct lws_genrsa_ctx
|
||||
* \param mode: RSA mode, one of LGRSAM_ constants
|
||||
* \param el: struct to get the new key element data allocated into it
|
||||
* \param bits: key size, eg, 4096
|
||||
*
|
||||
* Creates a new RSA context and generates a new keypair into it, with \p bits
|
||||
* bits.
|
||||
*
|
||||
* Returns 0 for OK or nonzero for error.
|
||||
*
|
||||
* Mode LGRSAM_PKCS1_1_5 is in widespread use but has weaknesses. It's
|
||||
* recommended to use LGRSAM_PKCS1_OAEP_PSS for new implementations.
|
||||
*
|
||||
* This and related APIs operate identically with OpenSSL or mbedTLS backends.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_genrsa_new_keypair(struct lws_context *context, struct lws_genrsa_ctx *ctx,
|
||||
enum enum_genrsa_mode mode, struct lws_gencrypto_keyelem *el,
|
||||
int bits);
|
||||
|
||||
/** lws_genrsa_public_encrypt() - Perform RSA public key encryption
|
||||
*
|
||||
* \param ctx: your struct lws_genrsa_ctx
|
||||
* \param in: plaintext input
|
||||
* \param in_len: length of plaintext input
|
||||
* \param out: encrypted output
|
||||
*
|
||||
* Performs PKCS1 v1.5 Encryption
|
||||
*
|
||||
* Returns <0 for error, or length of decrypted data.
|
||||
*
|
||||
* This and related APIs operate identically with OpenSSL or mbedTLS backends.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_genrsa_public_encrypt(struct lws_genrsa_ctx *ctx, const uint8_t *in,
|
||||
size_t in_len, uint8_t *out);
|
||||
|
||||
/** lws_genrsa_private_encrypt() - Perform RSA private key encryption
|
||||
*
|
||||
* \param ctx: your struct lws_genrsa_ctx
|
||||
* \param in: plaintext input
|
||||
* \param in_len: length of plaintext input
|
||||
* \param out: encrypted output
|
||||
*
|
||||
* Performs PKCS1 v1.5 Encryption
|
||||
*
|
||||
* Returns <0 for error, or length of decrypted data.
|
||||
*
|
||||
* This and related APIs operate identically with OpenSSL or mbedTLS backends.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_genrsa_private_encrypt(struct lws_genrsa_ctx *ctx, const uint8_t *in,
|
||||
size_t in_len, uint8_t *out);
|
||||
|
||||
/** lws_genrsa_public_decrypt() - Perform RSA public key decryption
|
||||
*
|
||||
* \param ctx: your struct lws_genrsa_ctx
|
||||
* \param in: encrypted input
|
||||
* \param in_len: length of encrypted input
|
||||
* \param out: decrypted output
|
||||
* \param out_max: size of output buffer
|
||||
*
|
||||
* Performs PKCS1 v1.5 Decryption
|
||||
*
|
||||
* Returns <0 for error, or length of decrypted data.
|
||||
*
|
||||
* This and related APIs operate identically with OpenSSL or mbedTLS backends.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_genrsa_public_decrypt(struct lws_genrsa_ctx *ctx, const uint8_t *in,
|
||||
size_t in_len, uint8_t *out, size_t out_max);
|
||||
|
||||
/** lws_genrsa_private_decrypt() - Perform RSA private key decryption
|
||||
*
|
||||
* \param ctx: your struct lws_genrsa_ctx
|
||||
* \param in: encrypted input
|
||||
* \param in_len: length of encrypted input
|
||||
* \param out: decrypted output
|
||||
* \param out_max: size of output buffer
|
||||
*
|
||||
* Performs PKCS1 v1.5 Decryption
|
||||
*
|
||||
* Returns <0 for error, or length of decrypted data.
|
||||
*
|
||||
* This and related APIs operate identically with OpenSSL or mbedTLS backends.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_genrsa_private_decrypt(struct lws_genrsa_ctx *ctx, const uint8_t *in,
|
||||
size_t in_len, uint8_t *out, size_t out_max);
|
||||
|
||||
/** lws_genrsa_hash_sig_verify() - Verifies RSA signature on a given hash
|
||||
*
|
||||
* \param ctx: your struct lws_genrsa_ctx
|
||||
* \param in: input to be hashed
|
||||
* \param hash_type: one of LWS_GENHASH_TYPE_
|
||||
* \param sig: pointer to the signature we received with the payload
|
||||
* \param sig_len: length of the signature we are checking in bytes
|
||||
*
|
||||
* Returns <0 for error, or 0 if signature matches the payload + key.
|
||||
*
|
||||
* This just looks at a hash... that's why there's no input length
|
||||
* parameter, it's decided by the choice of hash. It's up to you to confirm
|
||||
* separately the actual payload matches the hash that was confirmed by this to
|
||||
* be validly signed.
|
||||
*
|
||||
* This and related APIs operate identically with OpenSSL or mbedTLS backends.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_genrsa_hash_sig_verify(struct lws_genrsa_ctx *ctx, const uint8_t *in,
|
||||
enum lws_genhash_types hash_type,
|
||||
const uint8_t *sig, size_t sig_len);
|
||||
|
||||
/** lws_genrsa_hash_sign() - Creates an ECDSA signature for a hash you provide
|
||||
*
|
||||
* \param ctx: your struct lws_genrsa_ctx
|
||||
* \param in: input to be hashed and signed
|
||||
* \param hash_type: one of LWS_GENHASH_TYPE_
|
||||
* \param sig: pointer to buffer to take signature
|
||||
* \param sig_len: length of the buffer (must be >= length of key N)
|
||||
*
|
||||
* Returns <0 for error, or \p sig_len for success.
|
||||
*
|
||||
* This creates an RSA signature for a hash you already computed and provide.
|
||||
* You should have created the hash before calling this by iterating over the
|
||||
* actual payload you need to confirm.
|
||||
*
|
||||
* This and related APIs operate identically with OpenSSL or mbedTLS backends.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_genrsa_hash_sign(struct lws_genrsa_ctx *ctx, const uint8_t *in,
|
||||
enum lws_genhash_types hash_type,
|
||||
uint8_t *sig, size_t sig_len);
|
||||
|
||||
/** lws_genrsa_public_decrypt_destroy() - Destroy RSA public decrypt context
|
||||
*
|
||||
* \param ctx: your struct lws_genrsa_ctx
|
||||
*
|
||||
* Destroys any allocations related to \p ctx.
|
||||
*
|
||||
* This and related APIs operate identically with OpenSSL or mbedTLS backends.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_genrsa_destroy(struct lws_genrsa_ctx *ctx);
|
||||
|
||||
/** lws_genrsa_render_pkey_asn1() - Exports public or private key to ASN1/DER
|
||||
*
|
||||
* \param ctx: your struct lws_genrsa_ctx
|
||||
* \param _private: 0 = public part only, 1 = all parts of the key
|
||||
* \param pkey_asn1: pointer to buffer to take the ASN1
|
||||
* \param pkey_asn1_len: max size of the pkey_asn1_len
|
||||
*
|
||||
* Returns length of pkey_asn1 written, or -1 for error.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_genrsa_render_pkey_asn1(struct lws_genrsa_ctx *ctx, int _private,
|
||||
uint8_t *pkey_asn1, size_t pkey_asn1_len);
|
||||
///@}
|
||||
60
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-gpio.h
Normal file
60
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-gpio.h
Normal file
@ -0,0 +1,60 @@
|
||||
/*
|
||||
* Generic GPIO ops
|
||||
*
|
||||
* Copyright (C) 2019 - 2020 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*
|
||||
* This is like an abstract class for gpio, a real implementation provides
|
||||
* functions for the ops that use the underlying OS gpio arrangements.
|
||||
*/
|
||||
|
||||
#if !defined(__LWS_GPIO_H__)
|
||||
#define __LWS_GPIO_H__
|
||||
|
||||
typedef int _lws_plat_gpio_t;
|
||||
|
||||
typedef enum {
|
||||
LWSGGPIO_IRQ_NONE,
|
||||
LWSGGPIO_IRQ_RISING,
|
||||
LWSGGPIO_IRQ_FALLING,
|
||||
LWSGGPIO_IRQ_CHANGE,
|
||||
LWSGGPIO_IRQ_LOW,
|
||||
LWSGGPIO_IRQ_HIGH
|
||||
} lws_gpio_irq_t;
|
||||
|
||||
enum {
|
||||
LWSGGPIO_FL_READ = (1 << 0),
|
||||
LWSGGPIO_FL_WRITE = (1 << 1),
|
||||
LWSGGPIO_FL_PULLUP = (1 << 2),
|
||||
LWSGGPIO_FL_PULLDOWN = (1 << 3),
|
||||
LWSGGPIO_FL_START_LOW = (1 << 4),
|
||||
};
|
||||
|
||||
typedef void (*lws_gpio_irq_cb_t)(void *arg);
|
||||
|
||||
typedef struct lws_gpio_ops {
|
||||
void (*mode)(_lws_plat_gpio_t gpio, int flags);
|
||||
int (*read)(_lws_plat_gpio_t gpio);
|
||||
void (*set)(_lws_plat_gpio_t gpio, int val);
|
||||
int (*irq_mode)(_lws_plat_gpio_t gpio, lws_gpio_irq_t irq,
|
||||
lws_gpio_irq_cb_t cb, void *arg);
|
||||
} lws_gpio_ops_t;
|
||||
|
||||
#endif
|
||||
717
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-html.h
Normal file
717
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-html.h
Normal file
@ -0,0 +1,717 @@
|
||||
/*
|
||||
* libwebsockets - small server side websockets and web server implementation
|
||||
*
|
||||
* Copyright (C) 2010 - 2022 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*
|
||||
* Extremely Lightweight HTML5 Stream Parser, same approach as lecp but for
|
||||
* html5.
|
||||
*/
|
||||
|
||||
#if !defined(LHP_MAX_ELEMS_NEST)
|
||||
#define LHP_MAX_ELEMS_NEST 32
|
||||
#endif
|
||||
#if !defined(LHP_MAX_DEPTH)
|
||||
#define LHP_MAX_DEPTH 12
|
||||
#endif
|
||||
#if !defined(LHP_STRING_CHUNK)
|
||||
#define LHP_STRING_CHUNK 254
|
||||
#endif
|
||||
|
||||
enum lhp_callbacks {
|
||||
|
||||
LHPCB_ERR_ATTRIB_SYNTAX = -5,
|
||||
LHPCB_ERR_ATTRIB_LEN = -4,
|
||||
LHPCB_ERR_OOM = -3,
|
||||
LHPCB_ERR_ELEM_DEPTH = -2,
|
||||
LHPCB_CONTINUE = -1,
|
||||
|
||||
LHPCB_CONSTRUCTED = 0,
|
||||
LHPCB_DESTRUCTED = 1,
|
||||
|
||||
LHPCB_COMPLETE = 2,
|
||||
LHPCB_FAILED = 3,
|
||||
|
||||
LHPCB_ELEMENT_START = 4, /* reported at end of <> */
|
||||
LHPCB_ELEMENT_END = 5,
|
||||
|
||||
LHPCB_CONTENT = 6,
|
||||
|
||||
LHPCB_COMMENT = 7,
|
||||
};
|
||||
|
||||
/*
|
||||
* CSS v2.1 full property set, taken from
|
||||
*
|
||||
* https://www.w3.org/TR/CSS21/propidx.html
|
||||
*/
|
||||
|
||||
typedef enum lcsp_props {
|
||||
LCSP_PROP_AZIMUTH,
|
||||
LCSP_PROP_BACKGROUND_ATTACHMENT,
|
||||
LCSP_PROP_BACKGROUND_COLOR,
|
||||
LCSP_PROP_BACKGROUND_IMAGE,
|
||||
LCSP_PROP_BACKGROUND_POSITION,
|
||||
LCSP_PROP_BACKGROUND_REPEAT,
|
||||
LCSP_PROP_BACKGROUND,
|
||||
LCSP_PROP_BORDER_COLLAPSE,
|
||||
LCSP_PROP_BORDER_COLOR,
|
||||
LCSP_PROP_BORDER_SPACING,
|
||||
LCSP_PROP_BORDER_STYLE,
|
||||
LCSP_PROP_BORDER_TOP,
|
||||
LCSP_PROP_BORDER_RIGHT,
|
||||
LCSP_PROP_BORDER_BOTTOM,
|
||||
LCSP_PROP_BORDER_LEFT,
|
||||
LCSP_PROP_BORDER_TOP_COLOR,
|
||||
LCSP_PROP_BORDER_RIGHT_COLOR,
|
||||
LCSP_PROP_BORDER_BOTTOM_COLOR,
|
||||
LCSP_PROP_BORDER_LEFT_COLOR,
|
||||
LCSP_PROP_BORDER_TOP_STYLE,
|
||||
LCSP_PROP_BORDER_RIGHT_STYLE,
|
||||
LCSP_PROP_BORDER_BOTTOM_STYLE,
|
||||
LCSP_PROP_BORDER_LEFT_STYLE,
|
||||
LCSP_PROP_BORDER_TOP_WIDTH,
|
||||
LCSP_PROP_BORDER_RIGHT_WIDTH,
|
||||
LCSP_PROP_BORDER_BOTTOM_WIDTH,
|
||||
LCSP_PROP_BORDER_LEFT_WIDTH,
|
||||
LCSP_PROP_BORDER_WIDTH,
|
||||
LCSP_PROP_BORDER_TOP_LEFT_RADIUS,
|
||||
LCSP_PROP_BORDER_TOP_RIGHT_RADIUS,
|
||||
LCSP_PROP_BORDER_BOTTOM_LEFT_RADIUS,
|
||||
LCSP_PROP_BORDER_BOTTOM_RIGHT_RADIUS,
|
||||
LCSP_PROP_BORDER_RADIUS,
|
||||
LCSP_PROP_BORDER,
|
||||
LCSP_PROP_BOTTOM,
|
||||
LCSP_PROP_CAPTION_SIDE,
|
||||
LCSP_PROP_CLEAR,
|
||||
LCSP_PROP_CLIP,
|
||||
LCSP_PROP_COLOR,
|
||||
LCSP_PROP_CONTENT,
|
||||
LCSP_PROP_COUNTER_INCREMENT,
|
||||
LCSP_PROP_COUNTER_RESET,
|
||||
LCSP_PROP_CUE_AFTER,
|
||||
LCSP_PROP_CUE_BEFORE,
|
||||
LCSP_PROP_CUE,
|
||||
LCSP_PROP_CURSOR,
|
||||
LCSP_PROP_DIRECTION,
|
||||
LCSP_PROP_DISPLAY,
|
||||
LCSP_PROP_ELEVATION,
|
||||
LCSP_PROP_EMPTY_CELLS,
|
||||
LCSP_PROP_FLOAT,
|
||||
LCSP_PROP_FONT_FAMILY,
|
||||
LCSP_PROP_FONT_SIZE,
|
||||
LCSP_PROP_FONT_STYLE,
|
||||
LCSP_PROP_FONT_VARAIANT,
|
||||
LCSP_PROP_FONT_WEIGHT,
|
||||
LCSP_PROP_FONT,
|
||||
LCSP_PROP_HEIGHT,
|
||||
LCSP_PROP_LEFT,
|
||||
LCSP_PROP_LETTER_SPACING,
|
||||
LCSP_PROP_LINE_HEIGHT,
|
||||
LCSP_PROP_LIST_STYLE_IMAGE,
|
||||
LCSP_PROP_LIST_STYLE_POSITION,
|
||||
LCSP_PROP_LIST_STYLE_TYPE,
|
||||
LCSP_PROP_LIST_STYLE,
|
||||
LCSP_PROP_MARGIN_RIGHT,
|
||||
LCSP_PROP_MARGIN_LEFT,
|
||||
LCSP_PROP_MARGIN_TOP,
|
||||
LCSP_PROP_MARGIN_BOTTOM,
|
||||
LCSP_PROP_MARGIN,
|
||||
LCSP_PROP_MAX_HEIGHT,
|
||||
LCSP_PROP_MAX_WIDTH,
|
||||
LCSP_PROP_MIN_HEIGHT,
|
||||
LCSP_PROP_MIN_WIDTH,
|
||||
LCSP_PROP_ORPHANS,
|
||||
LCSP_PROP_OUTLINE_COLOR,
|
||||
LCSP_PROP_OUTLINE_STYLE,
|
||||
LCSP_PROP_OUTLINE_WIDTH,
|
||||
LCSP_PROP_OUTLINE,
|
||||
LCSP_PROP_OVERFLOW,
|
||||
LCSP_PROP_PADDING_TOP,
|
||||
LCSP_PROP_PADDING_RIGHT,
|
||||
LCSP_PROP_PADDING_BOTTOM,
|
||||
LCSP_PROP_PADDING_LEFT,
|
||||
LCSP_PROP_PADDING,
|
||||
LCSP_PROP_PAGE_BREAK_AFTER,
|
||||
LCSP_PROP_PAGE_BREAK_BEFORE,
|
||||
LCSP_PROP_PAGE_BREAK_INSIDE,
|
||||
LCSP_PROP_PAUSE_AFTER,
|
||||
LCSP_PROP_PAUSE_BEFORE,
|
||||
LCSP_PROP_PAUSE,
|
||||
LCSP_PROP_PITCH_RANGE,
|
||||
LCSP_PROP_PITCH,
|
||||
LCSP_PROP_PLAY_DURING,
|
||||
LCSP_PROP_POSITION,
|
||||
LCSP_PROP_QUOTES,
|
||||
LCSP_PROP_RICHNESS,
|
||||
LCSP_PROP_RIGHT,
|
||||
LCSP_PROP_SPEAK_HEADER,
|
||||
LCSP_PROP_SPEAK_NUMERAL,
|
||||
LCSP_PROP_SPEAK_PUNCTUATION,
|
||||
LCSP_PROP_SPEAK,
|
||||
LCSP_PROP_SPEECH_RATE,
|
||||
LCSP_PROP_STRESS,
|
||||
LCSP_PROP_TABLE_LAYOUT,
|
||||
LCSP_PROP_TEXT_ALIGN,
|
||||
LCSP_PROP_TEXT_DECORATION,
|
||||
LCSP_PROP_TEXT_INDENT,
|
||||
LCSP_PROP_TEXT_TRANSFORM,
|
||||
LCSP_PROP_TOP,
|
||||
LCSP_PROP_UNICODE_BIDI,
|
||||
LCSP_PROP_VERTICAL_ALIGN,
|
||||
LCSP_PROP_VISIBILITY,
|
||||
LCSP_PROP_VOICE_FAMILY,
|
||||
LCSP_PROP_VOLUME,
|
||||
LCSP_PROP_WHITE_SPACE,
|
||||
LCSP_PROP_WIDOWS,
|
||||
LCSP_PROP_WIDTH,
|
||||
LCSP_PROP_WORD_SPACING,
|
||||
LCSP_PROP_Z_INDEX,
|
||||
|
||||
LCSP_PROP__COUNT /* always last */
|
||||
} lcsp_props_t;
|
||||
|
||||
/*
|
||||
* Indexes for the well-known property values
|
||||
*/
|
||||
|
||||
typedef enum {
|
||||
LCSP_PROPVAL_ABOVE,
|
||||
LCSP_PROPVAL_ABSOLUTE,
|
||||
LCSP_PROPVAL_ALWAYS,
|
||||
LCSP_PROPVAL_ARMENIAN,
|
||||
LCSP_PROPVAL_AUTO,
|
||||
LCSP_PROPVAL_AVOID,
|
||||
LCSP_PROPVAL_BASELINE,
|
||||
LCSP_PROPVAL_BEHIND,
|
||||
LCSP_PROPVAL_BELOW,
|
||||
LCSP_PROPVAL_BIDI_OVERRIDE,
|
||||
LCSP_PROPVAL_BLINK,
|
||||
LCSP_PROPVAL_BLOCK,
|
||||
LCSP_PROPVAL_BOLD,
|
||||
LCSP_PROPVAL_BOLDER,
|
||||
LCSP_PROPVAL_BOTH,
|
||||
LCSP_PROPVAL_BOTTOM,
|
||||
LCSP_PROPVAL_CAPITALIZE,
|
||||
LCSP_PROPVAL_CAPTION,
|
||||
LCSP_PROPVAL_CENTER,
|
||||
LCSP_PROPVAL_CIRCLE,
|
||||
LCSP_PROPVAL_CLOSE_QUOTE,
|
||||
LCSP_PROPVAL_CODE,
|
||||
LCSP_PROPVAL_COLLAPSE,
|
||||
LCSP_PROPVAL_CONTINUOUS,
|
||||
LCSP_PROPVAL_CROSSHAIR,
|
||||
LCSP_PROPVAL_DECIMAL_LEADING_ZERO,
|
||||
LCSP_PROPVAL_DECIMAL,
|
||||
LCSP_PROPVAL_DIGITS,
|
||||
LCSP_PROPVAL_DISC,
|
||||
LCSP_PROPVAL_EMBED,
|
||||
LCSP_PROPVAL_E_RESIZE,
|
||||
LCSP_PROPVAL_FIXED,
|
||||
LCSP_PROPVAL_GEORGIAN,
|
||||
LCSP_PROPVAL_HELP,
|
||||
LCSP_PROPVAL_HIDDEN,
|
||||
LCSP_PROPVAL_HIDE,
|
||||
LCSP_PROPVAL_HIGH,
|
||||
LCSP_PROPVAL_HIGHER,
|
||||
LCSP_PROPVAL_ICON,
|
||||
LCSP_PROPVAL_INHERIT,
|
||||
LCSP_PROPVAL_INLINE,
|
||||
LCSP_PROPVAL_INLINE_BLOCK,
|
||||
LCSP_PROPVAL_INLINE_TABLE,
|
||||
LCSP_PROPVAL_INVERT,
|
||||
LCSP_PROPVAL_ITALIC,
|
||||
LCSP_PROPVAL_JUSTIFY,
|
||||
LCSP_PROPVAL_LEFT,
|
||||
LCSP_PROPVAL_LIGHTER,
|
||||
LCSP_PROPVAL_LINE_THROUGH,
|
||||
LCSP_PROPVAL_LIST_ITEM,
|
||||
LCSP_PROPVAL_LOW,
|
||||
LCSP_PROPVAL_LOWER,
|
||||
LCSP_PROPVAL_LOWER_ALPHA,
|
||||
LCSP_PROPVAL_LOWERCASE,
|
||||
LCSP_PROPVAL_LOWER_GREEK,
|
||||
LCSP_PROPVAL_LOWER_LATIN,
|
||||
LCSP_PROPVAL_LOWER_ROMAN,
|
||||
LCSP_PROPVAL_LTR,
|
||||
LCSP_PROPVAL_MENU,
|
||||
LCSP_PROPVAL_MESSAGE_BOX,
|
||||
LCSP_PROPVAL_MIDDLE,
|
||||
LCSP_PROPVAL_MIX,
|
||||
LCSP_PROPVAL_MOVE,
|
||||
LCSP_PROPVAL_NE_RESIZE,
|
||||
LCSP_PROPVAL_NO_CLOSE_QUOTE,
|
||||
LCSP_PROPVAL_NONE,
|
||||
LCSP_PROPVAL_NO_OPEN_QUOTE,
|
||||
LCSP_PROPVAL_NO_REPEAT,
|
||||
LCSP_PROPVAL_NORMAL,
|
||||
LCSP_PROPVAL_NOWRAP,
|
||||
LCSP_PROPVAL_N_RESIZE,
|
||||
LCSP_PROPVAL_NW_RESIZE,
|
||||
LCSP_PROPVAL_OBLIQUE,
|
||||
LCSP_PROPVAL_ONCE,
|
||||
LCSP_PROPVAL_OPEN_QUOTE,
|
||||
LCSP_PROPVAL_OUTSIDE,
|
||||
LCSP_PROPVAL_OVERLINE,
|
||||
LCSP_PROPVAL_POINTER,
|
||||
LCSP_PROPVAL_PRE,
|
||||
LCSP_PROPVAL_PRE_LINE,
|
||||
LCSP_PROPVAL_PRE_WRAP,
|
||||
LCSP_PROPVAL_PROGRESS,
|
||||
LCSP_PROPVAL_RELATIVE,
|
||||
LCSP_PROPVAL_REPEAT,
|
||||
LCSP_PROPVAL_REPEAT_X,
|
||||
LCSP_PROPVAL_REPEAT_Y,
|
||||
LCSP_PROPVAL_RIGHT,
|
||||
LCSP_PROPVAL_RTL,
|
||||
LCSP_PROPVAL_SCROLL,
|
||||
LCSP_PROPVAL_SEPARATE,
|
||||
LCSP_PROPVAL_SE_RESIZE,
|
||||
LCSP_PROPVAL_SHOW,
|
||||
LCSP_PROPVAL_SILENT,
|
||||
LCSP_PROPVAL_SMALL_CAPS,
|
||||
LCSP_PROPVAL_SMALL_CAPTION,
|
||||
LCSP_PROPVAL_SPELL_OUT,
|
||||
LCSP_PROPVAL_SQUARE,
|
||||
LCSP_PROPVAL_S_RESIZE,
|
||||
LCSP_PROPVAL_STATIC,
|
||||
LCSP_PROPVAL_STATUS_BAR,
|
||||
LCSP_PROPVAL_SUB,
|
||||
LCSP_PROPVAL_SUPER,
|
||||
LCSP_PROPVAL_SW_RESIZE,
|
||||
LCSP_PROPVAL_TABLE,
|
||||
LCSP_PROPVAL_TABLE_CAPTION,
|
||||
LCSP_PROPVAL_TABLE_CELL,
|
||||
LCSP_PROPVAL_TABLE_COLUMN,
|
||||
LCSP_PROPVAL_TABLE_COLUMN_GROUP,
|
||||
LCSP_PROPVAL_TABLE_FOOTER_GROUP,
|
||||
LCSP_PROPVAL_TABLE_HEADER_GROUP,
|
||||
LCSP_PROPVAL_TABLE_ROW,
|
||||
LCSP_PROPVAL_TABLE_ROW_GROUP,
|
||||
LCSP_PROPVAL_TEXT_BOTTOM,
|
||||
LCSP_PROPVAL_TEXT_TOP,
|
||||
LCSP_PROPVAL_TEXT,
|
||||
LCSP_PROPVAL_TOP,
|
||||
LCSP_PROPVAL_TRANSPARENT,
|
||||
LCSP_PROPVAL_UNDERLINE,
|
||||
LCSP_PROPVAL_UPPER_ALPHA,
|
||||
LCSP_PROPVAL_UPPERCASE,
|
||||
LCSP_PROPVAL_UPPER_LATIN,
|
||||
LCSP_PROPVAL_UPPER_ROMAN,
|
||||
LCSP_PROPVAL_VISIBLE,
|
||||
LCSP_PROPVAL_WAIT,
|
||||
LCSP_PROPVAL_W_RESIZE,
|
||||
|
||||
LCSP_PROPVAL__COUNT /* always last */
|
||||
} lcsp_propvals_t;
|
||||
|
||||
struct lhp_ctx;
|
||||
typedef lws_stateful_ret_t (*lhp_callback)(struct lhp_ctx *ctx, char reason);
|
||||
|
||||
/* html attribute */
|
||||
|
||||
typedef struct lhp_atr {
|
||||
lws_dll2_t list;
|
||||
size_t name_len; /* 0 if it is elem tag */
|
||||
size_t value_len;
|
||||
|
||||
/* name+NUL then value+NUL follow */
|
||||
} lhp_atr_t;
|
||||
|
||||
/*
|
||||
* In order to lay out the table, we have to incrementally adjust all foregoing
|
||||
* DLOs as newer cells change the situation. So we have to keep track of all
|
||||
* cell DLOs in a stack of tables until it's all done.
|
||||
*/
|
||||
|
||||
typedef struct {
|
||||
lws_dll2_t list; /* ps->table_cols */
|
||||
|
||||
lws_dll2_owner_t row_dlos; /* lws_dlo_t in column */
|
||||
|
||||
lws_fx_t height; /* currently computed row height */
|
||||
} lhp_table_row_t;
|
||||
|
||||
typedef struct {
|
||||
lws_dll2_t list; /* ps->table_cols */
|
||||
|
||||
lws_dll2_owner_t col_dlos; /* lws_dlo_t in column */
|
||||
|
||||
lws_fx_t width; /* currently computed column width */
|
||||
} lhp_table_col_t;
|
||||
|
||||
struct lcsp_atr;
|
||||
|
||||
#define CCPAS_TOP 0
|
||||
#define CCPAS_RIGHT 1
|
||||
#define CCPAS_BOTTOM 2
|
||||
#define CCPAS_LEFT 3
|
||||
|
||||
typedef struct lhp_pstack {
|
||||
lws_dll2_t list;
|
||||
void *user; /* private to the stack level */
|
||||
lhp_callback cb;
|
||||
|
||||
/* static: x,y: offset from parent, w,h: surface size of this object */
|
||||
lws_box_t drt;
|
||||
|
||||
/* dynamic cursor inside drt for progressive child placement */
|
||||
lws_fx_t curx;
|
||||
lws_fx_t cury;
|
||||
lws_fx_t widest;
|
||||
lws_fx_t deepest;
|
||||
|
||||
lws_dlo_t *dlo_set_curx;
|
||||
lws_dlo_t *dlo_set_cury;
|
||||
|
||||
lws_dll2_owner_t atr; /* lhp_atr_t */
|
||||
|
||||
const lws_display_font_t *f;
|
||||
|
||||
const struct lcsp_atr *css_background_color;
|
||||
const struct lcsp_atr *css_color;
|
||||
|
||||
const struct lcsp_atr *css_position;
|
||||
const struct lcsp_atr *css_display;
|
||||
const struct lcsp_atr *css_width;
|
||||
const struct lcsp_atr *css_height;
|
||||
|
||||
const struct lcsp_atr *css_border_radius[4];
|
||||
|
||||
const struct lcsp_atr *css_pos[4];
|
||||
const struct lcsp_atr *css_margin[4];
|
||||
const struct lcsp_atr *css_padding[4];
|
||||
|
||||
uint16_t tr_idx; /* in table */
|
||||
uint16_t td_idx; /* in current tr */
|
||||
|
||||
uint8_t is_block:1; /* children use space in our drt */
|
||||
uint8_t is_table:1;
|
||||
|
||||
/* user layout owns these after initial values set */
|
||||
|
||||
lws_dlo_t *dlo;
|
||||
const lws_display_font_t *font;
|
||||
int oi[4];
|
||||
int positioned[4];
|
||||
int rel_layout_cursor[4];
|
||||
uint8_t runon; /* continues same line */
|
||||
|
||||
} lhp_pstack_t;
|
||||
|
||||
typedef enum lcsp_css_units {
|
||||
LCSP_UNIT_NONE,
|
||||
|
||||
LCSP_UNIT_NUM, /* u.i */
|
||||
|
||||
LCSP_UNIT_LENGTH_EM, /* u.i */
|
||||
LCSP_UNIT_LENGTH_EX, /* u.i */
|
||||
LCSP_UNIT_LENGTH_IN, /* u.i */
|
||||
LCSP_UNIT_LENGTH_CM, /* u.i */
|
||||
LCSP_UNIT_LENGTH_MM, /* u.i */
|
||||
LCSP_UNIT_LENGTH_PT, /* u.i */
|
||||
LCSP_UNIT_LENGTH_PC, /* u.i */
|
||||
LCSP_UNIT_LENGTH_PX, /* u.i */
|
||||
LCSP_UNIT_LENGTH_PERCENT, /* u.i */
|
||||
|
||||
LCSP_UNIT_ANGLE_ABS_DEG, /* u.i */
|
||||
LCSP_UNIT_ANGLE_REL_DEG, /* u.i */
|
||||
|
||||
LCSP_UNIT_FREQ_HZ, /* u.i */
|
||||
|
||||
LCSP_UNIT_RGBA, /* u.rgba */
|
||||
|
||||
LCSP_UNIT_URL, /* string at end of atr */
|
||||
LCSP_UNIT_STRING, /* string at end of atr */
|
||||
LCSP_UNIT_DATA, /* binary data at end of atr */
|
||||
|
||||
} lcsp_css_units_t;
|
||||
|
||||
typedef struct lcsp_atr {
|
||||
lws_dll2_t list;
|
||||
|
||||
int propval; /* lcsp_propvals_t LCSP_PROPVAL_ */
|
||||
|
||||
size_t value_len; /* for string . url */
|
||||
lcsp_css_units_t unit;
|
||||
|
||||
union {
|
||||
lws_fx_t i;
|
||||
uint32_t rgba; /* for colours */
|
||||
} u;
|
||||
|
||||
lws_fx_t r;
|
||||
|
||||
uint8_t op;
|
||||
|
||||
/* .value_len bytes follow (for strings and blobs) */
|
||||
} lcsp_atr_t;
|
||||
|
||||
/* css definitions like font-weight: */
|
||||
typedef struct lcsp_defs {
|
||||
lws_dll2_t list;
|
||||
lws_dll2_owner_t atrs; /* lcsp_atr_t */
|
||||
lcsp_props_t prop; /* lcsp_props_t, LCSP_PROP_* */
|
||||
} lcsp_defs_t;
|
||||
|
||||
typedef struct lcsp_names {
|
||||
lws_dll2_t list;
|
||||
size_t name_len;
|
||||
|
||||
/* name + NUL follow */
|
||||
} lcsp_names_t;
|
||||
|
||||
typedef struct lcsp_stanza { /* css stanza, with names and defs */
|
||||
lws_dll2_t list;
|
||||
|
||||
lws_dll2_owner_t names; /* lcsp_names_t */
|
||||
lws_dll2_owner_t defs; /* lcsp_defs_t */
|
||||
|
||||
} lcsp_stanza_t;
|
||||
|
||||
/*
|
||||
* A list of stanza references can easily have to bring in the same stanza
|
||||
* multiple times, eg, <div><span class=x><div> won't work unless the div
|
||||
* stanzas are listed twice at different places in the list. It means we can't
|
||||
* use dll2 directly since the number of references is open-ended.
|
||||
*
|
||||
* lcsp_stanza_ptr provides indirection that allows multiple listings.
|
||||
*/
|
||||
|
||||
typedef struct lcsp_stanza_ptr {
|
||||
lws_dll2_t list;
|
||||
|
||||
lcsp_stanza_t *stz;
|
||||
} lcsp_stanza_ptr_t;
|
||||
|
||||
typedef struct lcsp_atr_ptr {
|
||||
lws_dll2_t list;
|
||||
|
||||
lcsp_atr_t *atr;
|
||||
} lcsp_atr_ptr_t;
|
||||
|
||||
#define LHP_FLAG_DOCUMENT_END (1 << 0)
|
||||
|
||||
typedef struct lhp_ctx {
|
||||
lws_dll2_owner_t stack; /* lhp_pstack_t */
|
||||
|
||||
struct lwsac *cssac; /* css allocations all in an ac */
|
||||
struct lwsac *cascadeac; /* active_stanzas ac */
|
||||
struct lwsac *propatrac; /* prop atr query results ac */
|
||||
lws_dll2_owner_t css; /* lcsp_stanza_t (all in ac) */
|
||||
|
||||
lws_dll2_owner_t *ids;
|
||||
|
||||
lws_fx_t tf;
|
||||
lcsp_css_units_t unit;
|
||||
lcsp_stanza_t *stz; /* current stanza getting properties */
|
||||
lcsp_defs_t *def; /* current property getting values */
|
||||
|
||||
lws_dll2_owner_t active_stanzas; /* lcsp_stanza_ptr_t allocated
|
||||
* in cascadeac */
|
||||
lws_dll2_owner_t active_atr; /* lcsp_atr_ptr_t allocated in
|
||||
* propatrac */
|
||||
|
||||
lws_surface_info_t ic;
|
||||
|
||||
const char *base_url; /* strdup of https://x.com/y.html */
|
||||
sul_cb_t ssevcb; /* callback for ss events */
|
||||
lws_sorted_usec_list_t *ssevsul; /* sul to use to resume rz */
|
||||
sul_cb_t sshtmlevcb; /* callback for more html parse */
|
||||
lws_sorted_usec_list_t *sshtmlevsul; /* sul for more html parse */
|
||||
|
||||
void *user;
|
||||
void *user1;
|
||||
const char *tag; /* private */
|
||||
size_t tag_len; /* private */
|
||||
|
||||
int npos;
|
||||
int state; /* private */
|
||||
int state_css_comm; /* private */
|
||||
int nl_temp;
|
||||
int temp_count;
|
||||
|
||||
uint32_t flags;
|
||||
uint32_t temp;
|
||||
int32_t window; /* 0, or ss item flow control limit */
|
||||
|
||||
union {
|
||||
uint32_t s;
|
||||
struct {
|
||||
uint32_t first:1;
|
||||
uint32_t closing:1;
|
||||
uint32_t void_element:1;
|
||||
uint32_t doctype:1;
|
||||
uint32_t inq:1;
|
||||
uint32_t tag_used:1;
|
||||
uint32_t arg:1;
|
||||
uint32_t default_css:1;
|
||||
#define LHP_CSS_PROPVAL_INT_WHOLE 1
|
||||
#define LHP_CSS_PROPVAL_INT_FRAC 2
|
||||
#define LHP_CSS_PROPVAL_INT_UNIT 3
|
||||
uint32_t integer:2;
|
||||
uint32_t color:2;
|
||||
} f;
|
||||
} u;
|
||||
|
||||
int prop; /* lcsp_props_t */
|
||||
int propval; /* lcsp_propvals_t */
|
||||
int16_t css_state; /* private */
|
||||
int16_t cssval_state; /* private */
|
||||
|
||||
uint8_t in_body:1;
|
||||
uint8_t finish_css:1;
|
||||
uint8_t is_css:1;
|
||||
uint8_t await_css_done:1;
|
||||
|
||||
/* at end so we can memset members above it in one go */
|
||||
|
||||
char buf[LHP_STRING_CHUNK + 1];
|
||||
|
||||
} lhp_ctx_t;
|
||||
|
||||
/*
|
||||
* lws_lhp_construct() - Construct an lhp context
|
||||
*
|
||||
* \param ctx: the lhp context to prepare
|
||||
* \param cb: the stream parsing callback
|
||||
* \param user: opaque user pointer available from the lhp context
|
||||
* \param ic: struct with arguments for lhp context
|
||||
*
|
||||
* The lhp context is allocated by the caller (the size is known).
|
||||
* Prepares an lhp context to parse html. Returns 0 for OK, or nonzero if OOM.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_lhp_construct(lhp_ctx_t *ctx, lhp_callback cb, void *user,
|
||||
const lws_surface_info_t *ic);
|
||||
|
||||
/*
|
||||
* lws_lhp_destruct() - Destroy an lhp context
|
||||
*
|
||||
* \param ctx: the lhp context to prepare
|
||||
*
|
||||
* Destroys an lhp context. The lhp context is allocated by the caller (the
|
||||
* size is known). But there are suballocations that must be destroyed with
|
||||
* this.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_lhp_destruct(lhp_ctx_t *ctx);
|
||||
|
||||
/**
|
||||
* lws_lhp_ss_browse() - browse url using SS and parse via lhp to DLOs
|
||||
*
|
||||
* \param cx: the lws_context
|
||||
* \param rs: the user's render state object
|
||||
* \param url: the https://x.com/y.xyz URL to browse
|
||||
* \param render: the user's linewise render callback (called from \p rs.sul)
|
||||
*
|
||||
* High level network fetch via SS and render html via lhp / DLO
|
||||
*
|
||||
* rs->ic must be prepared before calling.
|
||||
*
|
||||
* Returns nonzero if an early, fatal problem, else returns 0 and continues
|
||||
* asynchronously.
|
||||
*
|
||||
* If rs->box is (0,0,0,0) on entry, it is set to represent the whole display
|
||||
* surface. Otherwise if not representing the whole display surface, it
|
||||
* indicates partial mode should be used.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_lhp_ss_browse(struct lws_context *cx, lws_display_render_state_t *rs,
|
||||
const char *url, sul_cb_t render);
|
||||
|
||||
/**
|
||||
* lws_lhp_parse() - parses a chunk of input HTML
|
||||
*
|
||||
* \p ctx: the parsing context
|
||||
* \p buf: pointer to the start of the chunk of html
|
||||
* \p len: pointer the number of bytes of html available at *\pbuf
|
||||
*
|
||||
* Parses up to *len bytes at *buf. On exit, *buf and *len are adjusted
|
||||
* according to how much data was used. May return before processing all the
|
||||
* input.
|
||||
*
|
||||
* Returns LWS_SRET_WANT_INPUT if the parsing is stalled on some other async
|
||||
* event (eg, fetch of image to find out the dimensions).
|
||||
*
|
||||
* The lws_lhp_ss_browse() api wraps this.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN lws_stateful_ret_t
|
||||
lws_lhp_parse(lhp_ctx_t *ctx, const uint8_t **buf, size_t *len);
|
||||
|
||||
/**
|
||||
* lws_css_cascade_get_prop_atr() - create active css atr list for property
|
||||
*
|
||||
* \p ctx: the parsing context
|
||||
* \p prop: the LCSP_PROP_ property to generate the attribute list for
|
||||
*
|
||||
* Returns NULL if no atr or OOM.
|
||||
*
|
||||
* Otherwise produces a list of active CSS property attributes walkable via
|
||||
* ctx->active_atr, and returns the tail one. For simple attributes where the
|
||||
* last definition is the active one, this points to the last definition.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN const lcsp_atr_t *
|
||||
lws_css_cascade_get_prop_atr(lhp_ctx_t *ctx, lcsp_props_t prop);
|
||||
|
||||
/**
|
||||
* lws_http_rel_to_url() - make absolute url from base and relative
|
||||
*
|
||||
* \param dest: place to store the result
|
||||
* \param len: max length of result including NUL
|
||||
* \param base: a reference url including a file part
|
||||
* \param rel: the absolute or relative url or path to apply to base
|
||||
*
|
||||
* Copy the url formof rel into dest, using base to fill in missing context
|
||||
*
|
||||
* If base is https://x.com/y/z.html
|
||||
*
|
||||
* a.html -> https://x.com/y/a/html
|
||||
* ../b.html -> https://x.com/b.html
|
||||
* /c.html -> https://x.com/c.html
|
||||
* https://y.com/a.html -> https://y.com/a.html
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_http_rel_to_url(char *dest, size_t len, const char *base, const char *rel);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN lhp_pstack_t *
|
||||
lws_css_get_parent_block(lhp_ctx_t *ctx, lhp_pstack_t *ps);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN const char *
|
||||
lws_css_pstack_name(lhp_pstack_t *ps);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN const char *
|
||||
lws_html_get_atr(lhp_pstack_t *ps, const char *aname, size_t aname_len);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN const lws_fx_t *
|
||||
lws_csp_px(const lcsp_atr_t *a, lhp_pstack_t *ps);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_lhp_tag_dlo_id(lhp_ctx_t *ctx, lhp_pstack_t *ps, lws_dlo_t *dlo);
|
||||
|
||||
void
|
||||
lhp_set_dlo_padding_margin(lhp_pstack_t *ps, lws_dlo_t *dlo);
|
||||
|
||||
#define LWS_LHPREF_WIDTH 0
|
||||
#define LWS_LHPREF_HEIGHT 1
|
||||
#define LWS_LHPREF_NONE 2
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lhp_prop_axis(const lcsp_atr_t *a);
|
||||
1029
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-http.h
Normal file
1029
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-http.h
Normal file
File diff suppressed because it is too large
Load Diff
54
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-i2c.h
Normal file
54
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-i2c.h
Normal file
@ -0,0 +1,54 @@
|
||||
/*
|
||||
* Generic I2C ops
|
||||
*
|
||||
* Copyright (C) 2019 - 2020 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*
|
||||
* This is like an abstract class for i2c, a real implementation provides
|
||||
* functions for the ops that use the underlying OS arrangements.
|
||||
*/
|
||||
|
||||
#if !defined(__LWS_I2C_H__)
|
||||
#define __LWS_I2C_H__
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stddef.h>
|
||||
|
||||
typedef struct lws_i2c_ops {
|
||||
int (*init)(const struct lws_i2c_ops *ctx);
|
||||
int (*start)(const struct lws_i2c_ops *ctx);
|
||||
void (*stop)(const struct lws_i2c_ops *ctx);
|
||||
int (*write)(const struct lws_i2c_ops *ctx, uint8_t data);
|
||||
int (*read)(const struct lws_i2c_ops *ctx);
|
||||
void (*set_ack)(const struct lws_i2c_ops *octx, int ack);
|
||||
} lws_i2c_ops_t;
|
||||
|
||||
/*
|
||||
* These are implemented by calling the ops above, and so are generic
|
||||
*/
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_i2c_command(const lws_i2c_ops_t *ctx, uint8_t ads7, uint8_t c);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_i2c_command_list(const lws_i2c_ops_t *ctx, uint8_t ads7, const uint8_t *buf,
|
||||
size_t len);
|
||||
|
||||
#endif
|
||||
@ -0,0 +1,54 @@
|
||||
/*
|
||||
* lws abstract display implementation for ili9341 on spi
|
||||
*
|
||||
* Copyright (C) 2019 - 2022 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#if !defined(__LWS_DISPLAY_ILI9341_SPI_H__)
|
||||
#define __LWS_DISPLAY_ILI9341_SPI_H__
|
||||
|
||||
|
||||
typedef struct lws_display_ili9341 {
|
||||
|
||||
lws_display_t disp; /* use lws_display_ili9341_ops to set */
|
||||
const lws_spi_ops_t *spi; /* spi ops */
|
||||
|
||||
lws_display_completion_t cb;
|
||||
const lws_gpio_ops_t *gpio; /* NULL or gpio ops */
|
||||
_lws_plat_gpio_t reset_gpio; /* if gpio ops, nReset gpio # */
|
||||
|
||||
uint8_t spi_index; /* cs index starting from 0 */
|
||||
|
||||
} lws_display_ili9341_t;
|
||||
|
||||
int
|
||||
lws_display_ili9341_spi_init(lws_display_state_t *lds);
|
||||
int
|
||||
lws_display_ili9341_spi_blit(lws_display_state_t *lds, const uint8_t *src,
|
||||
lws_box_t *box, lws_dll2_owner_t *ids);
|
||||
int
|
||||
lws_display_ili9341_spi_power(lws_display_state_t *lds, int state);
|
||||
|
||||
#define lws_display_ili9341_ops \
|
||||
.init = lws_display_ili9341_spi_init, \
|
||||
.blit = lws_display_ili9341_spi_blit, \
|
||||
.power = lws_display_ili9341_spi_power
|
||||
#endif
|
||||
215
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-jose.h
Normal file
215
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-jose.h
Normal file
@ -0,0 +1,215 @@
|
||||
/*
|
||||
* libwebsockets - small server side websockets and web server implementation
|
||||
*
|
||||
* Copyright (C) 2010 - 2019 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
enum lws_jws_jose_hdr_indexes {
|
||||
LJJHI_ALG, /* REQUIRED */
|
||||
LJJHI_JKU, /* Optional: string */
|
||||
LJJHI_JWK, /* Optional: jwk JSON object: public key: */
|
||||
LJJHI_KID, /* Optional: string */
|
||||
LJJHI_X5U, /* Optional: string: url of public key cert / chain */
|
||||
LJJHI_X5C, /* Optional: base64 (NOT -url): actual cert */
|
||||
LJJHI_X5T, /* Optional: base64url: SHA-1 of actual cert */
|
||||
LJJHI_X5T_S256, /* Optional: base64url: SHA-256 of actual cert */
|
||||
LJJHI_TYP, /* Optional: string: media type */
|
||||
LJJHI_CTY, /* Optional: string: content media type */
|
||||
LJJHI_CRIT, /* Optional for send, REQUIRED: array of strings:
|
||||
* mustn't contain standardized strings or null set */
|
||||
|
||||
LJJHI_RECIPS_HDR,
|
||||
LJJHI_RECIPS_HDR_ALG,
|
||||
LJJHI_RECIPS_HDR_KID,
|
||||
LJJHI_RECIPS_EKEY,
|
||||
|
||||
LJJHI_ENC, /* JWE only: Optional: string */
|
||||
LJJHI_ZIP, /* JWE only: Optional: string ("DEF" = deflate) */
|
||||
|
||||
LJJHI_EPK, /* Additional arg for JWE ECDH: ephemeral public key */
|
||||
LJJHI_APU, /* Additional arg for JWE ECDH: base64url */
|
||||
LJJHI_APV, /* Additional arg for JWE ECDH: base64url */
|
||||
LJJHI_IV, /* Additional arg for JWE AES: base64url */
|
||||
LJJHI_TAG, /* Additional arg for JWE AES: base64url */
|
||||
LJJHI_P2S, /* Additional arg for JWE PBES2: base64url: salt */
|
||||
LJJHI_P2C, /* Additional arg for JWE PBES2: integer: count */
|
||||
|
||||
LWS_COUNT_JOSE_HDR_ELEMENTS
|
||||
};
|
||||
|
||||
enum lws_jose_algtype {
|
||||
LWS_JOSE_ENCTYPE_NONE,
|
||||
|
||||
LWS_JOSE_ENCTYPE_RSASSA_PKCS1_1_5,
|
||||
LWS_JOSE_ENCTYPE_RSASSA_PKCS1_OAEP,
|
||||
LWS_JOSE_ENCTYPE_RSASSA_PKCS1_PSS,
|
||||
|
||||
LWS_JOSE_ENCTYPE_ECDSA,
|
||||
LWS_JOSE_ENCTYPE_ECDHES,
|
||||
|
||||
LWS_JOSE_ENCTYPE_AES_CBC,
|
||||
LWS_JOSE_ENCTYPE_AES_CFB128,
|
||||
LWS_JOSE_ENCTYPE_AES_CFB8,
|
||||
LWS_JOSE_ENCTYPE_AES_CTR,
|
||||
LWS_JOSE_ENCTYPE_AES_ECB,
|
||||
LWS_JOSE_ENCTYPE_AES_OFB,
|
||||
LWS_JOSE_ENCTYPE_AES_XTS, /* care: requires double-length key */
|
||||
LWS_JOSE_ENCTYPE_AES_GCM,
|
||||
};
|
||||
|
||||
/* there's a table of these defined in lws-gencrypto-common.c */
|
||||
|
||||
struct lws_jose_jwe_alg {
|
||||
enum lws_genhash_types hash_type;
|
||||
enum lws_genhmac_types hmac_type;
|
||||
enum lws_jose_algtype algtype_signing; /* the signing cipher */
|
||||
enum lws_jose_algtype algtype_crypto; /* the encryption cipher */
|
||||
const char *alg; /* the JWA enc alg name, eg "ES512" */
|
||||
const char *curve_name; /* NULL, or, eg, "P-256" */
|
||||
unsigned short keybits_min, keybits_fixed;
|
||||
unsigned short ivbits;
|
||||
};
|
||||
|
||||
/*
|
||||
* For JWS, "JOSE header" is defined to be the union of...
|
||||
*
|
||||
* o JWS Protected Header
|
||||
* o JWS Unprotected Header
|
||||
*
|
||||
* For JWE, the "JOSE header" is the union of...
|
||||
*
|
||||
* o JWE Protected Header
|
||||
* o JWE Shared Unprotected Header
|
||||
* o JWE Per-Recipient Unprotected Header
|
||||
*/
|
||||
|
||||
#define LWS_JWS_MAX_RECIPIENTS 3
|
||||
|
||||
struct lws_jws_recpient {
|
||||
/*
|
||||
* JOSE per-recipient unprotected header... for JWS this contains
|
||||
* protected / header / signature
|
||||
*/
|
||||
struct lws_gencrypto_keyelem unprot[LWS_COUNT_JOSE_HDR_ELEMENTS];
|
||||
struct lws_jwk jwk_ephemeral; /* recipient ephemeral key if any */
|
||||
struct lws_jwk jwk; /* recipient "jwk" key if any */
|
||||
};
|
||||
|
||||
struct lws_jose {
|
||||
/* JOSE protected and unprotected header elements */
|
||||
struct lws_gencrypto_keyelem e[LWS_COUNT_JOSE_HDR_ELEMENTS];
|
||||
|
||||
struct lws_jws_recpient recipient[LWS_JWS_MAX_RECIPIENTS];
|
||||
|
||||
char typ[32];
|
||||
char edone[LWS_COUNT_JOSE_HDR_ELEMENTS];
|
||||
|
||||
/* information from the protected header part */
|
||||
const struct lws_jose_jwe_alg *alg;
|
||||
const struct lws_jose_jwe_alg *enc_alg;
|
||||
|
||||
int recipients; /* count of used recipient[] entries */
|
||||
};
|
||||
|
||||
/**
|
||||
* lws_jose_init() - prepare a struct lws_jose for use
|
||||
*
|
||||
* \param jose: the jose header struct to prepare
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_jose_init(struct lws_jose *jose);
|
||||
|
||||
/**
|
||||
* lws_jose_destroy() - retire a struct lws_jose from use
|
||||
*
|
||||
* \param jose: the jose header struct to destroy
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_jose_destroy(struct lws_jose *jose);
|
||||
|
||||
/**
|
||||
* lws_gencrypto_jws_alg_to_definition() - look up a jws alg name
|
||||
*
|
||||
* \param alg: the jws alg name
|
||||
* \param jose: pointer to the pointer to the info struct to set on success
|
||||
*
|
||||
* Returns 0 if *jose set, else nonzero for failure
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_gencrypto_jws_alg_to_definition(const char *alg,
|
||||
const struct lws_jose_jwe_alg **jose);
|
||||
|
||||
/**
|
||||
* lws_gencrypto_jwe_alg_to_definition() - look up a jwe alg name
|
||||
*
|
||||
* \param alg: the jwe alg name
|
||||
* \param jose: pointer to the pointer to the info struct to set on success
|
||||
*
|
||||
* Returns 0 if *jose set, else nonzero for failure
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_gencrypto_jwe_alg_to_definition(const char *alg,
|
||||
const struct lws_jose_jwe_alg **jose);
|
||||
|
||||
/**
|
||||
* lws_gencrypto_jwe_enc_to_definition() - look up a jwe enc name
|
||||
*
|
||||
* \param alg: the jwe enc name
|
||||
* \param jose: pointer to the pointer to the info struct to set on success
|
||||
*
|
||||
* Returns 0 if *jose set, else nonzero for failure
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_gencrypto_jwe_enc_to_definition(const char *enc,
|
||||
const struct lws_jose_jwe_alg **jose);
|
||||
|
||||
/**
|
||||
* lws_jws_parse_jose() - parse a JWS JOSE header
|
||||
*
|
||||
* \param jose: the jose struct to set to parsing results
|
||||
* \param buf: the raw JOSE header
|
||||
* \param len: the length of the raw JOSE header
|
||||
* \param temp: parent-owned buffer to "allocate" elements into
|
||||
* \param temp_len: amount of space available in temp
|
||||
*
|
||||
* returns 0 for success, or -1 for error
|
||||
* *\p temp_len is updated to reflect the amount of \p temp used if successful.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_jws_parse_jose(struct lws_jose *jose,
|
||||
const char *buf, int len, char *temp, int *temp_len);
|
||||
|
||||
/**
|
||||
* lws_jwe_parse_jose() - parse a JWE JOSE header
|
||||
*
|
||||
* \param jose: the jose struct to set to parsing results
|
||||
* \param buf: the raw JOSE header
|
||||
* \param len: the length of the raw JOSE header
|
||||
* \param temp: parent-owned buffer to "allocate" elements into
|
||||
* \param temp_len: amount of space available in temp
|
||||
*
|
||||
* returns 0 for success, or -1 for error
|
||||
* *\p temp_len is updated to reflect the amount of \p temp used if successful.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_jwe_parse_jose(struct lws_jose *jose,
|
||||
const char *buf, int len, char *temp, int *temp_len);
|
||||
|
||||
104
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-jpeg.h
Normal file
104
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-jpeg.h
Normal file
@ -0,0 +1,104 @@
|
||||
/*
|
||||
* lws jpeg
|
||||
*
|
||||
* Copyright (C) 2019 - 2022 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*
|
||||
* Based on public domain original with notice -->
|
||||
*
|
||||
* picojpeg.c v1.1 - Public domain, Rich Geldreich <richgel99@gmail.com>
|
||||
* Nov. 27, 2010 - Initial release
|
||||
* Feb. 9, 2013 - Added H1V2/H2V1 support, cleaned up macros, signed shift fixes
|
||||
* Also integrated and tested changes from Chris Phoenix <cphoenix@gmail.com>.
|
||||
*
|
||||
* This version is rewritten for lws, changing the whole approach to decode on
|
||||
* demand to issue a line of output at a time, statefully. This version is
|
||||
* licensed MIT to match the rest of lws.
|
||||
*/
|
||||
|
||||
typedef struct lws_jpeg lws_jpeg_t;
|
||||
|
||||
/**
|
||||
* lws_jpeg_new() - Create new JPEG decode object
|
||||
*
|
||||
* Returns a new jpeg decoding object, which should be destroyed with
|
||||
* lws_jpeg_free() when done with, or NULL if OOM.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN lws_jpeg_t *
|
||||
lws_jpeg_new(void);
|
||||
|
||||
/**
|
||||
* lws_jpeg_free() - Destroy a JPEG decode object
|
||||
*
|
||||
* \param j: Pointer to the decode object to destroy and set to NULL
|
||||
*
|
||||
* This also frees any sub-allocations in the object.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_jpeg_free(lws_jpeg_t **j);
|
||||
|
||||
/**
|
||||
* lws_jpeg_emit_next_line() - deocde the next line
|
||||
*
|
||||
* \param j: the decode object
|
||||
* \param ppix: pointer to a pointer set to the line's decoded pixel data
|
||||
* \param buf: pointer to a const uint8_t array of jpeg input
|
||||
* \param size: pointer to the count of bytes available at *buf
|
||||
* \param hold_at_metadata: true if we should not advance to decode
|
||||
*
|
||||
* Make jpeg input available to the decoder so it can issue the next line's
|
||||
* worth of pixels. If the call consumed any input, *buf and *size are
|
||||
* adjusted accordingly.
|
||||
*
|
||||
* The decoder is stateful so it is not sensitive to the chunk size for the
|
||||
* input.
|
||||
*
|
||||
* If \p hold_at_metadata is set, then the decoder will only go as far as
|
||||
* picking out the metadata like image dimensions, but not start the decode,
|
||||
* which requires the >30KB heap allocation. This lets you put off for as long
|
||||
* as possible committing to the decode allocation... this only helps overall
|
||||
* if you have flow controlled the incoming PNG data.
|
||||
*
|
||||
* Return will be one of LWS_SRET_WANT_INPUT is the decoder is stalled waiting
|
||||
* for more input to be provided, LWS_SRET_WANT_OUTPUT is the decoder stopped
|
||||
* because it had produced a whole line of output pixels (which can be found
|
||||
* starting at *ppix), LWS_SRET_OK is it completed and LWS_SRET_FATAL or larger
|
||||
* if the decode failed.
|
||||
*
|
||||
* The output at *ppix is either 3-byte per pixel RGB, or 1-byte grayscale, you
|
||||
* can query lws_jpeg_get_components() to find out how many bytes per pixel.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN lws_stateful_ret_t
|
||||
lws_jpeg_emit_next_line(lws_jpeg_t *j, const uint8_t **ppix,
|
||||
const uint8_t **buf, size_t *size, char hold_at_metadata);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN unsigned int
|
||||
lws_jpeg_get_width(const lws_jpeg_t *j);
|
||||
LWS_VISIBLE LWS_EXTERN unsigned int
|
||||
lws_jpeg_get_height(const lws_jpeg_t *j);
|
||||
LWS_VISIBLE LWS_EXTERN unsigned int
|
||||
lws_jpeg_get_bpp(const lws_jpeg_t *j);
|
||||
LWS_VISIBLE LWS_EXTERN unsigned int
|
||||
lws_jpeg_get_bitdepth(const lws_jpeg_t *j);
|
||||
LWS_VISIBLE LWS_EXTERN unsigned int
|
||||
lws_jpeg_get_components(const lws_jpeg_t *j);
|
||||
LWS_VISIBLE LWS_EXTERN unsigned int
|
||||
lws_jpeg_get_pixelsize(const lws_jpeg_t *j);
|
||||
|
||||
229
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-jrpc.h
Normal file
229
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-jrpc.h
Normal file
@ -0,0 +1,229 @@
|
||||
/*
|
||||
* libwebsockets - small server side websockets and web server implementation
|
||||
*
|
||||
* Copyright (C) 2010 - 2020 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*
|
||||
*
|
||||
* This is a JSON-RPC parser and state management implementation that's:
|
||||
*
|
||||
* - Lightweight, it uses lws LEJP JSON stream parser for requests, responses,
|
||||
* and user-defined parameter objects
|
||||
*
|
||||
* - Stateful... you can give it sequential input buffers randomly fragmented
|
||||
* and it will complete when it has enough
|
||||
*
|
||||
* - Asynchronous... response processing can return to the event loop both
|
||||
* while the RX is still coming and after it's all received before forming
|
||||
* the response, eg, because it's querying on a remote connection to get the
|
||||
* response data. Any number of RPCs can be either in flight or waiting for
|
||||
* response processing to complete before responding.
|
||||
*
|
||||
* - Supports "version" extension
|
||||
*
|
||||
* - allows binding different method names to different callbacks
|
||||
*
|
||||
* - Supports both client and server roles, eg, can parse both requests and
|
||||
* responses
|
||||
*
|
||||
* - No support for batch. Batching is not widely used because it doesn't
|
||||
* add anything for the vast bulk of cases compared to sending n requests.
|
||||
*
|
||||
* This handles client and server RX and transaction state, creating a callback
|
||||
* when parameters can be parsed and all of the request or notification is
|
||||
* done.
|
||||
*
|
||||
* Producing JSON is usually simpler and more compact than expressing it as an
|
||||
* object model, ie often a response can be completely formed in a single
|
||||
* lws_snprintf(). Response JSON must be buffered on heap until the method
|
||||
* callback is called with NULL / 0 buf len indicating that the incoming request
|
||||
* has completed parsing.
|
||||
*
|
||||
*/
|
||||
|
||||
/* these are opaque */
|
||||
|
||||
struct lws_jrpc_obj;
|
||||
struct lws_jrpc;
|
||||
|
||||
typedef enum {
|
||||
LJRPC_CBRET_CONTINUE,
|
||||
LJRPC_CBRET_WANT_TO_EMIT,
|
||||
LJRPC_CBRET_FINISHED,
|
||||
LJRPC_CBRET_FAILED
|
||||
} lws_jrpc_cb_return_t;
|
||||
|
||||
/*
|
||||
* method name to lejp parsing handler map
|
||||
*/
|
||||
|
||||
typedef struct lws_jrpc_method {
|
||||
const char *method_name;
|
||||
const char * const *paths;
|
||||
lejp_callback cb;
|
||||
int count_paths;
|
||||
} lws_jrpc_method_t;
|
||||
|
||||
/*
|
||||
* Boilerplate for forming correct requests
|
||||
*/
|
||||
|
||||
/* Boilerplate to start a request */
|
||||
#define LWSJRPCBP_REQ_START_S "{\"jsonrpc\":\"2.0\",\"method\":\"%s\""
|
||||
/* Boilerplate to start parameters (params are left freeform for user) */
|
||||
#define LWSJRPCBP_REQ_VERSION_S ",\"version\":\"%s\""
|
||||
/* Boilerplate to start parameters (params are left freeform for user) */
|
||||
#define LWSJRPCBP_REQ_PARAMS ",\"params\":"
|
||||
/* Boilerplate to complete the result object */
|
||||
#define LWSJRPCBP_REQ_NOTIF_END "}"
|
||||
/* Boilerplate to complete the result object */
|
||||
#define LWSJRPCBP_REQ_ID_END_S ",\"id\":%s}"
|
||||
|
||||
/*
|
||||
* Boilerplate for forming correct responses
|
||||
*/
|
||||
|
||||
/* Boilerplate to start a result */
|
||||
#define LWSJRPCBP_RESP_RESULT "{\"jsonrpc\":\"2.0\",\"result\":"
|
||||
/* Boilerplate to complete the result object */
|
||||
#define LWSJRPCBP_RESP_ID_END_S ",\"id\":%s}"
|
||||
|
||||
/* Boilerplate to form an error */
|
||||
#define LWSJRPCBP_RESP_ERROR_D "{\"jsonrpc\":\"2.0\",\"error\":{\"code\":%d"
|
||||
/* optional */
|
||||
#define LWSJRPCBP_RESP_ERROR_MSG_S ",\"message\":\"%s\""
|
||||
/* optional */
|
||||
#define LWSJRPCBP_RESP_ERROR_DATA ",\"data\":"
|
||||
/* required */
|
||||
#define LWSJRPCBP_RESP_ERROR_END "}"
|
||||
|
||||
/*
|
||||
* JSONRPC Well-known Errors
|
||||
*/
|
||||
|
||||
enum {
|
||||
LWSJRPCE__NO_ERROR = 0,
|
||||
|
||||
LWSJRPCWKE__PARSE_ERROR = -32700, /* invalid JSON */
|
||||
LWSJRPCWKE__INVALID_REQUEST = -32600, /* not valid JSONRPC object */
|
||||
LWSJRPCWKE__METHOD_NOT_FOUND = -32601, /* method not supported */
|
||||
LWSJRPCWKE__INVALID_PARAMS = -32602, /* parameters are invalid */
|
||||
LWSJRPCWKE__INTERNAL_ERROR = -32603, /* internal JSONRPC error */
|
||||
LWSJRPCWKE__SERVER_ERROR_FIRST = -32000, /* implementation-defined...*/
|
||||
LWSJRPCWKE__SERVER_ERROR_LAST = -32099, /* ... server errors range */
|
||||
|
||||
LWSJRPCE__INVALID_MEMBERS = -31000, /* reponse membs in req, vv */
|
||||
};
|
||||
|
||||
enum {
|
||||
LWSJRPC_PARSE_REQUEST,
|
||||
LWSJRPC_PARSE_RESPONSE
|
||||
};
|
||||
|
||||
/*
|
||||
* APIs for the opaque JRPC request object
|
||||
*/
|
||||
|
||||
/**
|
||||
* lws_jrpc_obj_parse() - parse a request or response
|
||||
*
|
||||
* \param jrpc: the jrpc context this belongs to
|
||||
* \param type: LWSJRPC_PARSE_REQUEST or ..._RESPONSE
|
||||
* \param opaque: user-defined pointer bound to lws_jrpc, ignored by lws
|
||||
* \param buf: chunk of JSON-RPC
|
||||
* \param l: remaining length of JSON (may be under or oversize)
|
||||
* \param r: NULL to indicate starting new req, already set means continue parse
|
||||
*
|
||||
* If necessary creates an opaque req object and starts parsing len bytes of
|
||||
* buf. This may be undersize (more parts coming) in which case \p req will be
|
||||
* set on entry next time indicating a continuation.
|
||||
*
|
||||
* \p type and \p opaque are ignored if it it's not the first buffer that
|
||||
* creates the req object.
|
||||
*
|
||||
* Return code is >= 0 if completed, representing the amount of unused data in
|
||||
* the input buffer. -1 indicates more input data needed, <-1 indicates an
|
||||
* error from the LWSJRPCWKE_ set above, or LEJP_REJECT_UNKNOWN for OOM
|
||||
*/
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_jrpc_obj_parse(struct lws_jrpc *jrpc, int type, void *opaque,
|
||||
const char *buf, size_t l, struct lws_jrpc_obj **r);
|
||||
|
||||
/*
|
||||
* lws_jrpc_obj_destroy() - detach and destroy a JRPC request or response
|
||||
*
|
||||
* \param _r: pointer to pointer to JRPC request to detach and free
|
||||
*
|
||||
* Detaches the req from its JRPC context and frees it and any internal
|
||||
* allocations.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_jrpc_obj_destroy(struct lws_jrpc_obj **_r);
|
||||
|
||||
/*
|
||||
* lws_jrpc_obj_get_opaque() - retreive the opaque pointer bound to the req
|
||||
*
|
||||
* \param r: pointer to pointer to JRPC request
|
||||
*
|
||||
* Returns the opaque pointer for a req given when it was parsed / created.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void *
|
||||
lws_jrpc_obj_get_opaque(const struct lws_jrpc_obj *r);
|
||||
|
||||
/*
|
||||
* lws_jrpc_obj_id() - retreive the object's id string
|
||||
*
|
||||
* \param r: pointer to pointer to JRPC object
|
||||
*
|
||||
* Returns a pointer to a correctly-typed id for use in a response; if a string,
|
||||
* then it is already quoted, if an int or null then it's provided without
|
||||
* quotes.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN const char *
|
||||
lws_jrpc_obj_id(const struct lws_jrpc_obj *r);
|
||||
|
||||
|
||||
/*
|
||||
* APIs for the opaque JRPC context
|
||||
*/
|
||||
|
||||
/**
|
||||
* lws_jrpc_create() - Allocate and initialize a JRPC context
|
||||
*
|
||||
* \param methods: the method callbacks and names we can process
|
||||
* \param opaque: user-defined pointer bound to lws_jrpc ignored by lws
|
||||
*
|
||||
* Allocates an opaque lws_jrpc object and binds it to the given array of
|
||||
* method names and callbacks
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN struct lws_jrpc *
|
||||
lws_jrpc_create(const lws_jrpc_method_t *methods, void *opaque);
|
||||
|
||||
/*
|
||||
* lws_jrpc_destroy() - destroy an allocated JRPC context
|
||||
*
|
||||
* \param jrpc: pointer to pointer to jrpc to destroy
|
||||
*
|
||||
* Destroys any ongoing reqs in the JRPC and then destroys the JRPC and sets the
|
||||
* given pointer to NULL.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_jrpc_destroy(struct lws_jrpc **jrpc);
|
||||
164
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-jwe.h
Normal file
164
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-jwe.h
Normal file
@ -0,0 +1,164 @@
|
||||
/*
|
||||
* libwebsockets - small server side websockets and web server implementation
|
||||
*
|
||||
* Copyright (C) 2010 - 2019 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*
|
||||
* JWE Compact Serialization consists of
|
||||
*
|
||||
* BASE64URL(UTF8(JWE Protected Header)) || '.' ||
|
||||
* BASE64URL(JWE Encrypted Key) || '.' ||
|
||||
* BASE64URL(JWE Initialization Vector) || '.' ||
|
||||
* BASE64URL(JWE Ciphertext) || '.' ||
|
||||
* BASE64URL(JWE Authentication Tag)
|
||||
*/
|
||||
|
||||
#define LWS_JWE_RFC3394_OVERHEAD_BYTES 8
|
||||
#define LWS_JWE_AES_IV_BYTES 16
|
||||
|
||||
#define LWS_JWE_LIMIT_RSA_KEY_BITS 4096
|
||||
#define LWS_JWE_LIMIT_AES_KEY_BITS (512 + 64) /* RFC3394 Key Wrap adds 64b */
|
||||
#define LWS_JWE_LIMIT_EC_KEY_BITS 528 /* 521 rounded to byte boundary */
|
||||
#define LWS_JWE_LIMIT_HASH_BITS (LWS_GENHASH_LARGEST * 8)
|
||||
|
||||
/* the largest key element for any cipher */
|
||||
#define LWS_JWE_LIMIT_KEY_ELEMENT_BYTES (LWS_JWE_LIMIT_RSA_KEY_BITS / 8)
|
||||
|
||||
|
||||
struct lws_jwe {
|
||||
struct lws_jose jose;
|
||||
struct lws_jws jws;
|
||||
struct lws_jwk jwk;
|
||||
|
||||
/*
|
||||
* We have to keep a copy of the CEK so we can reuse it with later
|
||||
* key encryptions for the multiple recipient case.
|
||||
*/
|
||||
uint8_t cek[LWS_JWE_LIMIT_KEY_ELEMENT_BYTES];
|
||||
unsigned int cek_valid:1;
|
||||
|
||||
int recip;
|
||||
};
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_jwe_init(struct lws_jwe *jwe, struct lws_context *context);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_jwe_destroy(struct lws_jwe *jwe);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_jwe_be64(uint64_t c, uint8_t *p8);
|
||||
|
||||
/*
|
||||
* JWE Compact Serialization consists of
|
||||
*
|
||||
* BASE64URL(UTF8(JWE Protected Header)) || '.' ||
|
||||
* BASE64URL(JWE Encrypted Key) || '.' ||
|
||||
* BASE64URL(JWE Initialization Vector) || '.' ||
|
||||
* BASE64URL(JWE Ciphertext) || '.' ||
|
||||
* BASE64URL(JWE Authentication Tag)
|
||||
*/
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_jwe_render_compact(struct lws_jwe *jwe, char *out, size_t out_len);
|
||||
|
||||
LWS_VISIBLE int
|
||||
lws_jwe_render_flattened(struct lws_jwe *jwe, char *out, size_t out_len);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_jwe_json_parse(struct lws_jwe *jwe, const uint8_t *buf, int len,
|
||||
char *temp, int *temp_len);
|
||||
|
||||
/**
|
||||
* lws_jwe_auth_and_decrypt() - confirm and decrypt JWE
|
||||
*
|
||||
* \param jose: jose context
|
||||
* \param jws: jws / jwe context... .map and .map_b64 must be filled already
|
||||
*
|
||||
* This is a high level JWE decrypt api that takes a jws with the maps
|
||||
* already processed, and if the authentication passes, returns the decrypted
|
||||
* plaintext in jws.map.buf[LJWE_CTXT] and its length in jws.map.len[LJWE_CTXT].
|
||||
*
|
||||
* In the jws, the following fields must have been set by the caller
|
||||
*
|
||||
* .context
|
||||
* .jwk (the key encryption key)
|
||||
* .map
|
||||
* .map_b64
|
||||
*
|
||||
* Having the b64 and decoded maps filled externally makes it flexible where
|
||||
* the data was picked from, eg, from a Complete JWE JSON serialization, a
|
||||
* flattened one, or a Compact Serialization.
|
||||
*
|
||||
* Returns decrypt length, or -1 for failure.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_jwe_auth_and_decrypt(struct lws_jwe *jwe, char *temp, int *temp_len);
|
||||
|
||||
/**
|
||||
* lws_jwe_encrypt() - perform JWE encryption
|
||||
*
|
||||
* \param jose: the JOSE header information (encryption types, etc)
|
||||
* \param jws: the JWE elements, pointer to jwk etc
|
||||
* \param temp: parent-owned buffer to "allocate" elements into
|
||||
* \param temp_len: amount of space available in temp
|
||||
*
|
||||
* May be called up to LWS_JWS_MAX_RECIPIENTS times to encrypt the same CEK
|
||||
* multiple ways on the same JWE payload.
|
||||
*
|
||||
* returns the amount of temp used, or -1 for error.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_jwe_encrypt(struct lws_jwe *jwe, char *temp, int *temp_len);
|
||||
|
||||
/**
|
||||
* lws_jwe_create_packet() - add b64 sig to b64 hdr + payload
|
||||
*
|
||||
* \param jwe: the struct lws_jwe we are trying to render
|
||||
* \param payload: unencoded payload JSON
|
||||
* \param len: length of unencoded payload JSON
|
||||
* \param nonce: Nonse string to include in protected header
|
||||
* \param out: buffer to take signed packet
|
||||
* \param out_len: size of \p out buffer
|
||||
* \param conext: lws_context to get random from
|
||||
*
|
||||
* This creates a "flattened" JWS packet from the jwk and the plaintext
|
||||
* payload, and signs it. The packet is written into \p out.
|
||||
*
|
||||
* This does the whole packet assembly and signing, calling through to
|
||||
* lws_jws_sign_from_b64() as part of the process.
|
||||
*
|
||||
* Returns the length written to \p out, or -1.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_jwe_create_packet(struct lws_jwe *jwe,
|
||||
const char *payload, size_t len, const char *nonce,
|
||||
char *out, size_t out_len, struct lws_context *context);
|
||||
|
||||
|
||||
/* only exposed because we have test vectors that need it */
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_jwe_auth_and_decrypt_cbc_hs(struct lws_jwe *jwe, uint8_t *enc_cek,
|
||||
uint8_t *aad, int aad_len);
|
||||
|
||||
/* only exposed because we have test vectors that need it */
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_jwa_concat_kdf(struct lws_jwe *jwe, int direct,
|
||||
uint8_t *out, const uint8_t *shared_secret, int sslen);
|
||||
220
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-jwk.h
Normal file
220
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-jwk.h
Normal file
@ -0,0 +1,220 @@
|
||||
/*
|
||||
* libwebsockets - small server side websockets and web server implementation
|
||||
*
|
||||
* Copyright (C) 2010 - 2019 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
/*! \defgroup jwk JSON Web Keys
|
||||
* ## JSON Web Keys API
|
||||
*
|
||||
* Lws provides an API to parse JSON Web Keys into a struct lws_gencrypto_keyelem.
|
||||
*
|
||||
* "oct" and "RSA" type keys are supported. For "oct" keys, they are held in
|
||||
* the "e" member of the struct lws_gencrypto_keyelem.
|
||||
*
|
||||
* Keys elements are allocated on the heap. You must destroy the allocations
|
||||
* in the struct lws_gencrypto_keyelem by calling
|
||||
* lws_genrsa_destroy_elements() when you are finished with it.
|
||||
*/
|
||||
///@{
|
||||
|
||||
enum enum_jwk_meta_tok {
|
||||
JWK_META_KTY,
|
||||
JWK_META_KID,
|
||||
JWK_META_USE,
|
||||
JWK_META_KEY_OPS,
|
||||
JWK_META_X5C,
|
||||
JWK_META_ALG,
|
||||
|
||||
LWS_COUNT_JWK_ELEMENTS
|
||||
};
|
||||
|
||||
struct lws_jwk {
|
||||
/* key data elements */
|
||||
struct lws_gencrypto_keyelem e[LWS_GENCRYPTO_MAX_KEYEL_COUNT];
|
||||
/* generic meta key elements, like KID */
|
||||
struct lws_gencrypto_keyelem meta[LWS_COUNT_JWK_ELEMENTS];
|
||||
int kty; /**< one of LWS_GENCRYPTO_KTY_ */
|
||||
char private_key; /* nonzero = has private key elements */
|
||||
};
|
||||
|
||||
typedef int (*lws_jwk_key_import_callback)(struct lws_jwk *s, void *user);
|
||||
|
||||
struct lws_jwk_parse_state {
|
||||
struct lws_jwk *jwk;
|
||||
char b64[(((8192 / 8) * 4) / 3) + 1]; /* enough for 8Kb key */
|
||||
lws_jwk_key_import_callback per_key_cb;
|
||||
void *user;
|
||||
int pos;
|
||||
int cose_state;
|
||||
int seen;
|
||||
unsigned short possible;
|
||||
};
|
||||
|
||||
/** lws_jwk_import() - Create a JSON Web key from the textual representation
|
||||
*
|
||||
* \param jwk: the JWK object to create
|
||||
* \param cb: callback for each jwk-processed key, or NULL if importing a single
|
||||
* key with no parent "keys" JSON
|
||||
* \param user: pointer to be passed to the callback, otherwise ignored by lws.
|
||||
* NULL if importing a single key with no parent "keys" JSON
|
||||
* \param in: a single JWK JSON stanza in utf-8
|
||||
* \param len: the length of the JWK JSON stanza in bytes
|
||||
*
|
||||
* Creates an lws_jwk struct filled with data from the JSON representation.
|
||||
*
|
||||
* There are two ways to use this... with some protocols a single jwk is
|
||||
* delivered with no parent "keys": [] array. If you call this with cb and
|
||||
* user as NULL, then the input will be interpreted like that and the results
|
||||
* placed in s.
|
||||
*
|
||||
* The second case is that you are dealing with a "keys":[] array with one or
|
||||
* more keys in it. In this case, the function iterates through the keys using
|
||||
* s as a temporary jwk, and calls the user-provided callback for each key in
|
||||
* turn while it return 0 (nonzero return from the callback terminates the
|
||||
* iteration through any further keys).
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_jwk_import(struct lws_jwk *jwk, lws_jwk_key_import_callback cb, void *user,
|
||||
const char *in, size_t len);
|
||||
|
||||
/** lws_jwk_destroy() - Destroy a JSON Web key
|
||||
*
|
||||
* \param jwk: the JWK object to destroy
|
||||
*
|
||||
* All allocations in the lws_jwk are destroyed
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_jwk_destroy(struct lws_jwk *jwk);
|
||||
|
||||
/** lws_jwk_dup_oct() - Set a jwk to a dup'd binary OCT key
|
||||
*
|
||||
* \param jwk: the JWK object to set
|
||||
* \param key: the JWK object to destroy
|
||||
* \param len: the JWK object to destroy
|
||||
*
|
||||
* Sets the kty to OCT, allocates len bytes for K and copies len bytes of key
|
||||
* into the allocation.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_jwk_dup_oct(struct lws_jwk *jwk, const void *key, int len);
|
||||
|
||||
#define LWSJWKF_EXPORT_PRIVATE (1 << 0)
|
||||
#define LWSJWKF_EXPORT_NOCRLF (1 << 1)
|
||||
|
||||
/** lws_jwk_export() - Export a JSON Web key to a textual representation
|
||||
*
|
||||
* \param jwk: the JWK object to export
|
||||
* \param flags: control export options
|
||||
* \param p: the buffer to write the exported JWK to
|
||||
* \param len: the length of the buffer \p p in bytes... reduced by used amount
|
||||
*
|
||||
* Returns length of the used part of the buffer if OK, or -1 for error.
|
||||
*
|
||||
* \p flags can be OR-ed together
|
||||
*
|
||||
* LWSJWKF_EXPORT_PRIVATE: default is only public part, set this to also export
|
||||
* the private part
|
||||
*
|
||||
* LWSJWKF_EXPORT_NOCRLF: normally adds a CRLF at the end of the export, if
|
||||
* you need to suppress it, set this flag
|
||||
*
|
||||
* Serializes the content of the JWK into a char buffer.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_jwk_export(struct lws_jwk *jwk, int flags, char *p, int *len);
|
||||
|
||||
/** lws_jwk_load() - Import a JSON Web key from a file
|
||||
*
|
||||
* \param jwk: the JWK object to load into
|
||||
* \param filename: filename to load from
|
||||
* \param cb: optional callback for each key
|
||||
* \param user: opaque user pointer passed to cb if given
|
||||
*
|
||||
* Returns 0 for OK or -1 for failure
|
||||
*
|
||||
* There are two ways to use this... with some protocols a single jwk is
|
||||
* delivered with no parent "keys": [] array. If you call this with cb and
|
||||
* user as NULL, then the input will be interpreted like that and the results
|
||||
* placed in s.
|
||||
*
|
||||
* The second case is that you are dealing with a "keys":[] array with one or
|
||||
* more keys in it. In this case, the function iterates through the keys using
|
||||
* s as a temporary jwk, and calls the user-provided callback for each key in
|
||||
* turn while it return 0 (nonzero return from the callback terminates the
|
||||
* iteration through any further keys, leaving the last one in s).
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_jwk_load(struct lws_jwk *jwk, const char *filename,
|
||||
lws_jwk_key_import_callback cb, void *user);
|
||||
|
||||
/** lws_jwk_save() - Export a JSON Web key to a file
|
||||
*
|
||||
* \param jwk: the JWK object to save from
|
||||
* \param filename: filename to save to
|
||||
*
|
||||
* Returns 0 for OK or -1 for failure
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_jwk_save(struct lws_jwk *jwk, const char *filename);
|
||||
|
||||
/** lws_jwk_rfc7638_fingerprint() - jwk to RFC7638 compliant fingerprint
|
||||
*
|
||||
* \param jwk: the JWK object to fingerprint
|
||||
* \param digest32: buffer to take 32-byte digest
|
||||
*
|
||||
* Returns 0 for OK or -1 for failure
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_jwk_rfc7638_fingerprint(struct lws_jwk *jwk, char *digest32);
|
||||
|
||||
/** lws_jwk_strdup_meta() - allocate a duplicated string meta element
|
||||
*
|
||||
* \param jwk: the JWK object to fingerprint
|
||||
* \param idx: JWK_META_ element index
|
||||
* \param in: string to copy
|
||||
* \param len: length of string to copy
|
||||
*
|
||||
* Returns 0 for OK or nonzero for failure
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_jwk_strdup_meta(struct lws_jwk *jwk, enum enum_jwk_meta_tok idx,
|
||||
const char *in, int len);
|
||||
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_jwk_dump(struct lws_jwk *jwk);
|
||||
|
||||
/** lws_jwk_generate() - create a new key of given type and characteristics
|
||||
*
|
||||
* \param context: the struct lws_context used for RNG
|
||||
* \param jwk: the JWK object to fingerprint
|
||||
* \param kty: One of the LWS_GENCRYPTO_KTY_ key types
|
||||
* \param bits: for OCT and RSA keys, the number of bits
|
||||
* \param curve: for EC keys, the name of the curve
|
||||
*
|
||||
* Returns 0 for OK or nonzero for failure
|
||||
*/
|
||||
LWS_VISIBLE int
|
||||
lws_jwk_generate(struct lws_context *context, struct lws_jwk *jwk,
|
||||
enum lws_gencrypto_kty kty, int bits, const char *curve);
|
||||
|
||||
///@}
|
||||
601
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-jws.h
Normal file
601
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-jws.h
Normal file
@ -0,0 +1,601 @@
|
||||
/*
|
||||
* libwebsockets - small server side websockets and web server implementation
|
||||
*
|
||||
* Copyright (C) 2010 - 2019 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
/*! \defgroup jws JSON Web Signature
|
||||
* ## JSON Web Signature API
|
||||
*
|
||||
* Lws provides an API to check and create RFC7515 JSON Web Signatures
|
||||
*
|
||||
* SHA256/384/512 HMAC, and RSA 256/384/512 are supported.
|
||||
*
|
||||
* The API uses your TLS library crypto, but works exactly the same no matter
|
||||
* what your TLS backend is.
|
||||
*/
|
||||
///@{
|
||||
|
||||
/*
|
||||
* The maps are built to work with both JWS (LJWS_) and JWE (LJWE_), and are
|
||||
* sized to the slightly larger JWE case.
|
||||
*/
|
||||
|
||||
enum enum_jws_sig_elements {
|
||||
|
||||
/* JWS block namespace */
|
||||
LJWS_JOSE,
|
||||
LJWS_PYLD,
|
||||
LJWS_SIG,
|
||||
LJWS_UHDR,
|
||||
|
||||
/* JWE block namespace */
|
||||
LJWE_JOSE = 0,
|
||||
LJWE_EKEY,
|
||||
LJWE_IV,
|
||||
LJWE_CTXT,
|
||||
LJWE_ATAG,
|
||||
LJWE_AAD,
|
||||
|
||||
LWS_JWS_MAX_COMPACT_BLOCKS
|
||||
};
|
||||
|
||||
struct lws_jws_map {
|
||||
const char *buf[LWS_JWS_MAX_COMPACT_BLOCKS];
|
||||
uint32_t len[LWS_JWS_MAX_COMPACT_BLOCKS];
|
||||
};
|
||||
|
||||
#define LWS_JWS_MAX_SIGS 3
|
||||
|
||||
struct lws_jws {
|
||||
struct lws_jwk *jwk; /* the struct lws_jwk containing the signing key */
|
||||
struct lws_context *context; /* the lws context (used to get random) */
|
||||
struct lws_jws_map map, map_b64;
|
||||
};
|
||||
|
||||
/* jws EC signatures do not have ASN.1 in them, meaning they're incompatible
|
||||
* with generic signatures.
|
||||
*/
|
||||
|
||||
/**
|
||||
* lws_jws_init() - initialize a jws for use
|
||||
*
|
||||
* \param jws: pointer to the jws to initialize
|
||||
* \param jwk: the jwk to use with this jws
|
||||
* \param context: the lws_context to use
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_jws_init(struct lws_jws *jws, struct lws_jwk *jwk,
|
||||
struct lws_context *context);
|
||||
|
||||
/**
|
||||
* lws_jws_destroy() - scrub a jws
|
||||
*
|
||||
* \param jws: pointer to the jws to destroy
|
||||
*
|
||||
* Call before the jws goes out of scope.
|
||||
*
|
||||
* Elements defined in the jws are zeroed.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_jws_destroy(struct lws_jws *jws);
|
||||
|
||||
/**
|
||||
* lws_jws_sig_confirm_compact() - check signature
|
||||
*
|
||||
* \param map: pointers and lengths for each of the unencoded JWS elements
|
||||
* \param jwk: public key
|
||||
* \param context: lws_context
|
||||
* \param temp: scratchpad
|
||||
* \param temp_len: length of scratchpad
|
||||
*
|
||||
* Confirms the signature on a JWS. Use if you have non-b64 plain JWS elements
|
||||
* in a map... it'll make a temp b64 version needed for comparison. See below
|
||||
* for other variants.
|
||||
*
|
||||
* Returns 0 on match, else nonzero.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_jws_sig_confirm_compact(struct lws_jws_map *map, struct lws_jwk *jwk,
|
||||
struct lws_context *context,
|
||||
char *temp, int *temp_len);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_jws_sig_confirm_compact_b64_map(struct lws_jws_map *map_b64,
|
||||
struct lws_jwk *jwk,
|
||||
struct lws_context *context,
|
||||
char *temp, int *temp_len);
|
||||
|
||||
/**
|
||||
* lws_jws_sig_confirm_compact_b64() - check signature on b64 compact JWS
|
||||
*
|
||||
* \param in: pointer to b64 jose.payload[.hdr].sig
|
||||
* \param len: bytes available at \p in
|
||||
* \param map: map to take decoded non-b64 content
|
||||
* \param jwk: public key
|
||||
* \param context: lws_context
|
||||
* \param temp: scratchpad
|
||||
* \param temp_len: size of scratchpad
|
||||
*
|
||||
* Confirms the signature on a JWS. Use if you have you have b64 compact layout
|
||||
* (jose.payload.hdr.sig) as an aggregated string... it'll make a temp plain
|
||||
* version needed for comparison.
|
||||
*
|
||||
* Returns 0 on match, else nonzero.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_jws_sig_confirm_compact_b64(const char *in, size_t len,
|
||||
struct lws_jws_map *map,
|
||||
struct lws_jwk *jwk,
|
||||
struct lws_context *context,
|
||||
char *temp, int *temp_len);
|
||||
|
||||
/**
|
||||
* lws_jws_sig_confirm() - check signature on plain + b64 JWS elements
|
||||
*
|
||||
* \param map_b64: pointers and lengths for each of the b64-encoded JWS elements
|
||||
* \param map: pointers and lengths for each of the unencoded JWS elements
|
||||
* \param jwk: public key
|
||||
* \param context: lws_context
|
||||
*
|
||||
* Confirms the signature on a JWS. Use if you have you already have both b64
|
||||
* compact layout (jose.payload.hdr.sig) and decoded JWS elements in maps.
|
||||
*
|
||||
* If you had the b64 string and called lws_jws_compact_decode() on it, you
|
||||
* will end up with both maps, and can use this api version, saving needlessly
|
||||
* regenerating any temp map.
|
||||
*
|
||||
* Returns 0 on match, else nonzero.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_jws_sig_confirm(struct lws_jws_map *map_b64, /* b64-encoded */
|
||||
struct lws_jws_map *map, /* non-b64 */
|
||||
struct lws_jwk *jwk, struct lws_context *context);
|
||||
|
||||
/**
|
||||
* lws_jws_sign_from_b64() - add b64 sig to b64 hdr + payload
|
||||
*
|
||||
* \param jose: jose header information
|
||||
* \param jws: information to include in the signature
|
||||
* \param b64_sig: output buffer for b64 signature
|
||||
* \param sig_len: size of \p b64_sig output buffer
|
||||
*
|
||||
* This adds a b64-coded JWS signature of the b64-encoded protected header
|
||||
* and b64-encoded payload, at \p b64_sig. The signature will be as large
|
||||
* as the N element of the RSA key when the RSA key is used, eg, 512 bytes for
|
||||
* a 4096-bit key, and then b64-encoding on top.
|
||||
*
|
||||
* In some special cases, there is only payload to sign and no header, in that
|
||||
* case \p b64_hdr may be NULL, and only the payload will be hashed before
|
||||
* signing.
|
||||
*
|
||||
* If successful, returns the length of the encoded signature written to
|
||||
* \p b64_sig. If the jose signing type is unknown, 0 is returned. Otherwise
|
||||
* -1 indicates failure.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_jws_sign_from_b64(struct lws_jose *jose, struct lws_jws *jws, char *b64_sig,
|
||||
size_t sig_len);
|
||||
|
||||
/**
|
||||
* lws_jws_compact_decode() - converts and maps compact serialization b64 sections
|
||||
*
|
||||
* \param in: the incoming compact serialized b64
|
||||
* \param len: the length of the incoming compact serialized b64
|
||||
* \param map: pointer to the results structure
|
||||
* \param map_b64: NULL, or pointer to a second results structure taking block
|
||||
* information about the undecoded b64
|
||||
* \param out: buffer to hold decoded results
|
||||
* \param out_len: size of out in bytes
|
||||
*
|
||||
* Returns number of sections (2 if "none", else 3), or -1 if illegal.
|
||||
*
|
||||
* map is set to point to the start and hold the length of each decoded block.
|
||||
* If map_b64 is non-NULL, then it's set with information about the input b64
|
||||
* blocks.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_jws_compact_decode(const char *in, int len, struct lws_jws_map *map,
|
||||
struct lws_jws_map *map_b64, char *out, int *out_len);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_jws_compact_encode(struct lws_jws_map *map_b64, /* b64-encoded */
|
||||
const struct lws_jws_map *map, /* non-b64 */
|
||||
char *buf, int *out_len);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_jws_sig_confirm_json(const char *in, size_t len,
|
||||
struct lws_jws *jws, struct lws_jwk *jwk,
|
||||
struct lws_context *context,
|
||||
char *temp, int *temp_len);
|
||||
|
||||
/**
|
||||
* lws_jws_write_flattened_json() - create flattened JSON sig
|
||||
*
|
||||
* \param jws: information to include in the signature
|
||||
* \param flattened: output buffer for JSON
|
||||
* \param len: size of \p flattened output buffer
|
||||
*
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_jws_write_flattened_json(struct lws_jws *jws, char *flattened, size_t len);
|
||||
|
||||
/**
|
||||
* lws_jws_write_compact() - create flattened JSON sig
|
||||
*
|
||||
* \param jws: information to include in the signature
|
||||
* \param compact: output buffer for compact format
|
||||
* \param len: size of \p flattened output buffer
|
||||
*
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_jws_write_compact(struct lws_jws *jws, char *compact, size_t len);
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* below apis are not normally needed if dealing with whole JWS... they're
|
||||
* useful for creating from scratch
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* lws_jws_dup_element() - allocate space for an element and copy data into it
|
||||
*
|
||||
* \param map: map to create the element in
|
||||
* \param idx: index of element in the map to create
|
||||
* \param temp: space to allocate in
|
||||
* \param temp_len: available space at temp
|
||||
* \param in: data to duplicate into element
|
||||
* \param in_len: length of data to duplicate
|
||||
* \param actual_alloc: 0 for same as in_len, else actual allocation size
|
||||
*
|
||||
* Copies in_len from in to temp, if temp_len is sufficient.
|
||||
*
|
||||
* Returns 0 or -1 if not enough space in temp / temp_len.
|
||||
*
|
||||
* Over-allocation can be acheived by setting actual_alloc to the real
|
||||
* allocation desired... in_len will be copied into it.
|
||||
*
|
||||
* *temp_len is reduced by actual_alloc if successful.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_jws_dup_element(struct lws_jws_map *map, int idx,
|
||||
char *temp, int *temp_len, const void *in, size_t in_len,
|
||||
size_t actual_alloc);
|
||||
|
||||
/**
|
||||
* lws_jws_randomize_element() - create an element and fill with random
|
||||
*
|
||||
* \param context: lws_context used for random
|
||||
* \param map: map to create the element in
|
||||
* \param idx: index of element in the map to create
|
||||
* \param temp: space to allocate in
|
||||
* \param temp_len: available space at temp
|
||||
* \param random_len: length of data to fill with random
|
||||
* \param actual_alloc: 0 for same as random_len, else actual allocation size
|
||||
*
|
||||
* Randomize random_len bytes at temp, if temp_len is sufficient.
|
||||
*
|
||||
* Returns 0 or -1 if not enough space in temp / temp_len.
|
||||
*
|
||||
* Over-allocation can be acheived by setting actual_alloc to the real
|
||||
* allocation desired... the first random_len will be filled with random.
|
||||
*
|
||||
* *temp_len is reduced by actual_alloc if successful.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_jws_randomize_element(struct lws_context *context,
|
||||
struct lws_jws_map *map,
|
||||
int idx, char *temp, int *temp_len, size_t random_len,
|
||||
size_t actual_alloc);
|
||||
|
||||
/**
|
||||
* lws_jws_alloc_element() - create an element and reserve space for content
|
||||
*
|
||||
* \param map: map to create the element in
|
||||
* \param idx: index of element in the map to create
|
||||
* \param temp: space to allocate in
|
||||
* \param temp_len: available space at temp
|
||||
* \param len: logical length of element
|
||||
* \param actual_alloc: 0 for same as len, else actual allocation size
|
||||
*
|
||||
* Allocate len bytes at temp, if temp_len is sufficient.
|
||||
*
|
||||
* Returns 0 or -1 if not enough space in temp / temp_len.
|
||||
*
|
||||
* Over-allocation can be acheived by setting actual_alloc to the real
|
||||
* allocation desired... the element logical length will be set to len.
|
||||
*
|
||||
* *temp_len is reduced by actual_alloc if successful.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_jws_alloc_element(struct lws_jws_map *map, int idx, char *temp,
|
||||
int *temp_len, size_t len, size_t actual_alloc);
|
||||
|
||||
/**
|
||||
* lws_jws_encode_b64_element() - create an b64-encoded element
|
||||
*
|
||||
* \param map: map to create the element in
|
||||
* \param idx: index of element in the map to create
|
||||
* \param temp: space to allocate in
|
||||
* \param temp_len: available space at temp
|
||||
* \param in: pointer to unencoded input
|
||||
* \param in_len: length of unencoded input
|
||||
*
|
||||
* Allocate len bytes at temp, if temp_len is sufficient.
|
||||
*
|
||||
* Returns 0 or -1 if not enough space in temp / temp_len.
|
||||
*
|
||||
* Over-allocation can be acheived by setting actual_alloc to the real
|
||||
* allocation desired... the element logical length will be set to len.
|
||||
*
|
||||
* *temp_len is reduced by actual_alloc if successful.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_jws_encode_b64_element(struct lws_jws_map *map, int idx,
|
||||
char *temp, int *temp_len, const void *in,
|
||||
size_t in_len);
|
||||
|
||||
|
||||
/**
|
||||
* lws_jws_b64_compact_map() - find block starts and lengths in compact b64
|
||||
*
|
||||
* \param in: pointer to b64 jose.payload[.hdr].sig
|
||||
* \param len: bytes available at \p in
|
||||
* \param map: output struct with pointers and lengths for each JWS element
|
||||
*
|
||||
* Scans a jose.payload[.hdr].sig b64 string and notes where the blocks start
|
||||
* and their length into \p map.
|
||||
*
|
||||
* Returns number of blocks if OK. May return <0 if malformed.
|
||||
* May not fill all map entries.
|
||||
*/
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_jws_b64_compact_map(const char *in, int len, struct lws_jws_map *map);
|
||||
|
||||
|
||||
/**
|
||||
* lws_jws_base64_enc() - encode input data into b64url data
|
||||
*
|
||||
* \param in: the incoming plaintext
|
||||
* \param in_len: the length of the incoming plaintext in bytes
|
||||
* \param out: the buffer to store the b64url encoded data to
|
||||
* \param out_max: the length of \p out in bytes
|
||||
*
|
||||
* Returns either -1 if problems, or the number of bytes written to \p out.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_jws_base64_enc(const char *in, size_t in_len, char *out, size_t out_max);
|
||||
|
||||
/**
|
||||
* lws_jws_encode_section() - encode input data into b64url data,
|
||||
* prepending . if not first
|
||||
*
|
||||
* \param in: the incoming plaintext
|
||||
* \param in_len: the length of the incoming plaintext in bytes
|
||||
* \param first: nonzero if the first section
|
||||
* \param p: the buffer to store the b64url encoded data to
|
||||
* \param end: just past the end of p
|
||||
*
|
||||
* Returns either -1 if problems, or the number of bytes written to \p out.
|
||||
* If the section is not the first one, '.' is prepended.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_jws_encode_section(const char *in, size_t in_len, int first, char **p,
|
||||
char *end);
|
||||
|
||||
/**
|
||||
* lws_jwt_signed_validate() - check a compact JWT against a key and alg
|
||||
*
|
||||
* \param ctx: the lws_context
|
||||
* \param jwk: the key for checking the signature
|
||||
* \param alg_list: the expected alg name, like "ES512"
|
||||
* \param com: the compact JWT
|
||||
* \param len: the length of com
|
||||
* \param temp: a temp scratchpad
|
||||
* \param tl: available length of temp scratchpad
|
||||
* \param out: the output buffer to hold the validated plaintext
|
||||
* \param out_len: on entry, max length of out; on exit, used length of out
|
||||
*
|
||||
* Returns nonzero if the JWT cannot be validated or the plaintext can't fit the
|
||||
* provided output buffer, or 0 if it is validated as being signed by the
|
||||
* provided jwk.
|
||||
*
|
||||
* If validated, the plaintext in the JWT is copied into out and out_len set to
|
||||
* the used length.
|
||||
*
|
||||
* temp can be discarded or reused after the call returned, it's used to hold
|
||||
* transformations of the B64 JWS in the JWT.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_jwt_signed_validate(struct lws_context *ctx, struct lws_jwk *jwk,
|
||||
const char *alg_list, const char *com, size_t len,
|
||||
char *temp, int tl, char *out, size_t *out_len);
|
||||
|
||||
/**
|
||||
* lws_jwt_sign_compact() - generate a compact JWT using a key and alg
|
||||
*
|
||||
* \param ctx: the lws_context
|
||||
* \param jwk: the signing key
|
||||
* \param alg: the signing alg name, like "ES512"
|
||||
* \param out: the output buffer to hold the signed JWT in compact form
|
||||
* \param out_len: on entry, the length of out; on exit, the used amount of out
|
||||
* \param temp: a temp scratchpad
|
||||
* \param tl: available length of temp scratchpad
|
||||
* \param format: a printf style format specification
|
||||
* \param ...: zero or more args for the format specification
|
||||
*
|
||||
* Creates a JWT in a single step, from the format string and args through to
|
||||
* outputting a well-formed compact JWT representation in out.
|
||||
*
|
||||
* Returns 0 if all is well and *out_len is the amount of data in out, else
|
||||
* nonzero if failed. Temp must be large enough to hold various intermediate
|
||||
* representations.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_jwt_sign_compact(struct lws_context *ctx, struct lws_jwk *jwk,
|
||||
const char *alg, char *out, size_t *out_len, char *temp,
|
||||
int tl, const char *format, ...) LWS_FORMAT(8);
|
||||
|
||||
struct lws_jwt_sign_info {
|
||||
const char *alg;
|
||||
/**< entry: signing alg name, like "RS256" */
|
||||
const char *jose_hdr;
|
||||
/**< entry: optional JOSE hdr; if present, alg field is ignored; instead the
|
||||
* whole claim object has to be provided in this parameter */
|
||||
size_t jose_hdr_len;
|
||||
/**< entry: if jose_hdr is not NULL, JOSE header length without terminating '\0' */
|
||||
char *out;
|
||||
/**< exit: signed JWT in compact form*/
|
||||
size_t *out_len;
|
||||
/**< entry,exit: buffer size of out; actual size of JWT on exit */
|
||||
char *temp;
|
||||
/**< exit undefined content, used by the function as a temporary scratchpad; MUST
|
||||
* be large enogh to store various intermediate representations */
|
||||
int tl;
|
||||
/**< entry: size of temp buffer */
|
||||
};
|
||||
|
||||
/**
|
||||
* lws_jwt_sign_via_info() - generate a compact JWT using a key and JOSE header
|
||||
*
|
||||
* \param ctx: the lws_context
|
||||
* \param jwk: the signing key
|
||||
* \param info: info describing the JWT's content and output/temp buffers
|
||||
* \param format: a printf style format specification of the claims object
|
||||
* \param ...: zero or more args for the format specification
|
||||
*
|
||||
* Creates a JWT in a single step, from the format string and args through to
|
||||
* outputting a well-formed compact JWT representation in out. The provided
|
||||
* JOSE header's syntax is checked before it is added to the JWT.
|
||||
*
|
||||
* Returns 0 if all is well and *out_len is the amount of data in out, else
|
||||
* nonzero if failed. Temp must be large enough to hold various intermediate
|
||||
* representations.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_jwt_sign_via_info(struct lws_context *ctx, struct lws_jwk *jwk,
|
||||
const struct lws_jwt_sign_info *info, const char *format, ...) LWS_FORMAT(4);
|
||||
|
||||
/**
|
||||
* lws_jwt_token_sanity() - check a validated jwt payload for sanity
|
||||
*
|
||||
* \param in: the JWT payload
|
||||
* \param in_len: the length of the JWT payload
|
||||
* \param iss: the expected issuer of the token
|
||||
* \param aud: the expected audience of the token
|
||||
* \param csrf_in: NULL, or the csrf token that came in on a URL
|
||||
* \param sub: a buffer to hold the subject name in the JWT (eg, account name)
|
||||
* \param sub_len: the max length of the sub buffer
|
||||
* \param secs_left: set to the number of seconds of valid auth left if valid
|
||||
*
|
||||
* This performs some generic sanity tests on validated JWT payload...
|
||||
*
|
||||
* - the issuer is as expected
|
||||
* - the audience is us
|
||||
* - current time is OK for nbf ("not before") in the token
|
||||
* - current time is OK for exp ("expiry") in the token
|
||||
* - if csrf_in is not NULL, that the JWK has a csrf and it matches it
|
||||
* - if sub is not NULL, that the JWK provides a subject (and copies it to sub)
|
||||
*
|
||||
* If the tests pass, *secs_left is set to the number of remaining seconds the
|
||||
* auth is valid.
|
||||
*
|
||||
* Returns 0 if no inconsistency, else nonzero.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_jwt_token_sanity(const char *in, size_t in_len,
|
||||
const char *iss, const char *aud, const char *csrf_in,
|
||||
char *sub, size_t sub_len, unsigned long *exp_unix_time);
|
||||
|
||||
#if defined(LWS_ROLE_H1) || defined(LWS_ROLE_H2)
|
||||
|
||||
struct lws_jwt_sign_set_cookie {
|
||||
struct lws_jwk *jwk;
|
||||
/**< entry: required signing key */
|
||||
const char *alg;
|
||||
/**< entry: required signing alg, eg, "ES512" */
|
||||
const char *iss;
|
||||
/**< entry: issuer name to use */
|
||||
const char *aud;
|
||||
/**< entry: audience */
|
||||
const char *cookie_name;
|
||||
/**< entry: the name of the cookie */
|
||||
char sub[33];
|
||||
/**< sign-entry, validate-exit: subject */
|
||||
const char *extra_json;
|
||||
/**< sign-entry, validate-exit:
|
||||
* optional "ext" JSON object contents for the JWT */
|
||||
size_t extra_json_len;
|
||||
/**< validate-exit:
|
||||
* length of optional "ext" JSON object contents for the JWT */
|
||||
const char *csrf_in;
|
||||
/**< validate-entry:
|
||||
* NULL, or an external CSRF token to check against what is in the JWT */
|
||||
unsigned long expiry_unix_time;
|
||||
/**< sign-entry: seconds the JWT and cookie may live,
|
||||
* validate-exit: expiry unix time */
|
||||
};
|
||||
|
||||
/**
|
||||
* lws_jwt_sign_token_set_http_cookie() - creates sets a JWT in a wsi cookie
|
||||
*
|
||||
* \param wsi: the wsi to create the cookie header on
|
||||
* \param i: structure describing what should be in the JWT
|
||||
* \param p: wsi headers area
|
||||
* \param end: end of wsi headers area
|
||||
*
|
||||
* Creates a JWT specified \p i, and attaches it to the outgoing headers on
|
||||
* wsi. Returns 0 if successful.
|
||||
*
|
||||
* Best-practice security restrictions are applied to the cookie set action,
|
||||
* including forcing httponly, and __Host- prefix. As required by __Host-, the
|
||||
* cookie Path is set to /. __Host- is applied by the function, the cookie_name
|
||||
* should just be "xyz" for "__Host-xyz".
|
||||
*
|
||||
* \p extra_json should just be the bare JSON, a { } is provided around it by
|
||||
* the function if it's non-NULL. For example, "\"authorization\": 1".
|
||||
*
|
||||
* It's recommended the secs parameter is kept as small as consistent with one
|
||||
* user session on the site if possible, eg, 10 minutes or 20 minutes. At the
|
||||
* server, it can determine how much time is left in the auth and inform the
|
||||
* client; if the JWT validity expires, the page should reload so the UI always
|
||||
* reflects what's possible to do with the authorization state correctly. If
|
||||
* the JWT expires, the user can log back in using credentials usually stored in
|
||||
* the browser and auto-filled-in, so this is not very inconvenient.
|
||||
*
|
||||
* This is a helper on top of the other JOSE and JWT apis that somewhat crosses
|
||||
* over between JWT and HTTP, since it knows about cookies. So it is only built
|
||||
* if both LWS_WITH_JOSE and one of the http-related roles enabled.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_jwt_sign_token_set_http_cookie(struct lws *wsi,
|
||||
const struct lws_jwt_sign_set_cookie *i,
|
||||
uint8_t **p, uint8_t *end);
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_jwt_get_http_cookie_validate_jwt(struct lws *wsi,
|
||||
struct lws_jwt_sign_set_cookie *i,
|
||||
char *out, size_t *out_len);
|
||||
#endif
|
||||
|
||||
///@}
|
||||
539
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-lecp.h
Normal file
539
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-lecp.h
Normal file
@ -0,0 +1,539 @@
|
||||
/*
|
||||
* libwebsockets - small server side websockets and web server implementation
|
||||
*
|
||||
* Copyright (C) 2010 - 2021 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
/** \defgroup lecp CBOR parser
|
||||
* ##CBOR parsing related functions
|
||||
* \ingroup lwsapi
|
||||
*
|
||||
* LECP is an extremely lightweight CBOR stream parser included in lws. It
|
||||
* is aligned in approach with the LEJP JSON stream parser, with some additional
|
||||
* things needed for CBOR.
|
||||
*/
|
||||
//@{
|
||||
|
||||
#ifndef LECP_MAX_PARSING_STACK_DEPTH
|
||||
#define LECP_MAX_PARSING_STACK_DEPTH 5
|
||||
#endif
|
||||
#ifndef LECP_MAX_DEPTH
|
||||
#define LECP_MAX_DEPTH 12
|
||||
#endif
|
||||
#ifndef LECP_MAX_INDEX_DEPTH
|
||||
#define LECP_MAX_INDEX_DEPTH 8
|
||||
#endif
|
||||
#ifndef LECP_MAX_PATH
|
||||
#define LECP_MAX_PATH 128
|
||||
#endif
|
||||
#ifndef LECP_STRING_CHUNK
|
||||
/* must be >= 30 to assemble floats */
|
||||
#define LECP_STRING_CHUNK 254
|
||||
#endif
|
||||
|
||||
#define LECP_FLAG_CB_IS_VALUE 64
|
||||
|
||||
/*
|
||||
* CBOR initial byte 3 x MSB bits are these
|
||||
*/
|
||||
|
||||
enum {
|
||||
LWS_CBOR_MAJTYP_UINT = 0 << 5,
|
||||
LWS_CBOR_MAJTYP_INT_NEG = 1 << 5,
|
||||
LWS_CBOR_MAJTYP_BSTR = 2 << 5,
|
||||
LWS_CBOR_MAJTYP_TSTR = 3 << 5,
|
||||
LWS_CBOR_MAJTYP_ARRAY = 4 << 5,
|
||||
LWS_CBOR_MAJTYP_MAP = 5 << 5,
|
||||
LWS_CBOR_MAJTYP_TAG = 6 << 5,
|
||||
LWS_CBOR_MAJTYP_FLOAT = 7 << 5, /* also BREAK */
|
||||
|
||||
LWS_CBOR_MAJTYP_MASK = 7 << 5,
|
||||
|
||||
/*
|
||||
* For the low 5 bits of the opcode, 0-23 are literals, unless it's
|
||||
* FLOAT.
|
||||
*
|
||||
* 24 = 1 byte; 25 = 2..., 26 = 4... and 27 = 8 bytes following literal.
|
||||
*/
|
||||
LWS_CBOR_1 = 24,
|
||||
LWS_CBOR_2 = 25,
|
||||
LWS_CBOR_4 = 26,
|
||||
LWS_CBOR_8 = 27,
|
||||
|
||||
LWS_CBOR_RESERVED = 28,
|
||||
|
||||
LWS_CBOR_SUBMASK = 0x1f,
|
||||
|
||||
/*
|
||||
* Major type 7 discriminators in low 5 bits
|
||||
* 0 - 23 is SIMPLE implicit value (like, eg, LWS_CBOR_SWK_TRUE)
|
||||
*/
|
||||
LWS_CBOR_SWK_FALSE = 20,
|
||||
LWS_CBOR_SWK_TRUE = 21,
|
||||
LWS_CBOR_SWK_NULL = 22,
|
||||
LWS_CBOR_SWK_UNDEFINED = 23,
|
||||
|
||||
LWS_CBOR_M7_SUBTYP_SIMPLE_X8 = 24, /* simple with additional byte */
|
||||
LWS_CBOR_M7_SUBTYP_FLOAT16 = 25,
|
||||
LWS_CBOR_M7_SUBTYP_FLOAT32 = 26,
|
||||
LWS_CBOR_M7_SUBTYP_FLOAT64 = 27,
|
||||
LWS_CBOR_M7_BREAK = 31,
|
||||
|
||||
/* 28, 29, 30 are illegal.
|
||||
*
|
||||
* 31 is illegal for UINT, INT_NEG, and TAG;
|
||||
* for BSTR, TSTR, ARRAY and MAP it means "indefinite length", ie,
|
||||
* it's made up of an endless amount of determinite-length
|
||||
* fragments terminated with a BREAK (FLOAT | 31) instead of the
|
||||
* next determinite-length fragment. The second framing level
|
||||
* means no need for escapes for BREAK in the data.
|
||||
*/
|
||||
|
||||
LWS_CBOR_INDETERMINITE = 31,
|
||||
|
||||
/*
|
||||
* Well-known tags
|
||||
*/
|
||||
|
||||
LWS_CBOR_WKTAG_DATETIME_STD = 0, /* text */
|
||||
LWS_CBOR_WKTAG_DATETIME_EPOCH = 1, /* int or float */
|
||||
LWS_CBOR_WKTAG_BIGNUM_UNSIGNED = 2, /* byte string */
|
||||
LWS_CBOR_WKTAG_BIGNUM_NEGATIVE = 3, /* byte string */
|
||||
LWS_CBOR_WKTAG_DECIMAL_FRAC = 4, /* array */
|
||||
LWS_CBOR_WKTAG_BIGFLOAT = 5, /* array */
|
||||
|
||||
LWS_CBOR_WKTAG_COSE_ENC0 = 16,
|
||||
LWS_CBOR_WKTAG_COSE_MAC0 = 17,
|
||||
LWS_CBOR_WKTAG_COSE_SIGN1 = 18,
|
||||
|
||||
LWS_CBOR_WKTAG_TO_B64U = 21, /* any */
|
||||
LWS_CBOR_WKTAG_TO_B64 = 22, /* any */
|
||||
LWS_CBOR_WKTAG_TO_B16 = 23, /* any */
|
||||
LWS_CBOR_WKTAG_CBOR = 24, /* byte string */
|
||||
|
||||
LWS_CBOR_WKTAG_URI = 32, /* text string */
|
||||
LWS_CBOR_WKTAG_B64U = 33, /* text string */
|
||||
LWS_CBOR_WKTAG_B64 = 34, /* text string */
|
||||
LWS_CBOR_WKTAG_MIME = 36, /* text string */
|
||||
|
||||
LWS_CBOR_WKTAG_COSE_ENC = 96,
|
||||
LWS_CBOR_WKTAG_COSE_MAC = 97,
|
||||
LWS_CBOR_WKTAG_COSE_SIGN = 98,
|
||||
|
||||
LWS_CBOR_WKTAG_SELFDESCCBOR = 55799
|
||||
};
|
||||
|
||||
enum lecp_callbacks {
|
||||
LECPCB_CONSTRUCTED = 0,
|
||||
LECPCB_DESTRUCTED = 1,
|
||||
|
||||
LECPCB_COMPLETE = 3,
|
||||
LECPCB_FAILED = 4,
|
||||
|
||||
LECPCB_PAIR_NAME = 5,
|
||||
|
||||
LECPCB_VAL_TRUE = LECP_FLAG_CB_IS_VALUE | 6,
|
||||
LECPCB_VAL_FALSE = LECP_FLAG_CB_IS_VALUE | 7,
|
||||
LECPCB_VAL_NULL = LECP_FLAG_CB_IS_VALUE | 8,
|
||||
LECPCB_VAL_NUM_INT = LECP_FLAG_CB_IS_VALUE | 9,
|
||||
LECPCB_VAL_RESERVED = LECP_FLAG_CB_IS_VALUE | 10,
|
||||
LECPCB_VAL_STR_START = 11, /* notice handle separately */
|
||||
LECPCB_VAL_STR_CHUNK = LECP_FLAG_CB_IS_VALUE | 12,
|
||||
LECPCB_VAL_STR_END = LECP_FLAG_CB_IS_VALUE | 13,
|
||||
|
||||
LECPCB_ARRAY_START = 14,
|
||||
LECPCB_ARRAY_END = 15,
|
||||
|
||||
LECPCB_OBJECT_START = 16,
|
||||
LECPCB_OBJECT_END = 17,
|
||||
|
||||
LECPCB_TAG_START = 18,
|
||||
LECPCB_TAG_END = 19,
|
||||
|
||||
LECPCB_VAL_NUM_UINT = LECP_FLAG_CB_IS_VALUE | 20,
|
||||
LECPCB_VAL_UNDEFINED = LECP_FLAG_CB_IS_VALUE | 21,
|
||||
LECPCB_VAL_FLOAT16 = LECP_FLAG_CB_IS_VALUE | 22,
|
||||
LECPCB_VAL_FLOAT32 = LECP_FLAG_CB_IS_VALUE | 23,
|
||||
LECPCB_VAL_FLOAT64 = LECP_FLAG_CB_IS_VALUE | 24,
|
||||
|
||||
LECPCB_VAL_SIMPLE = LECP_FLAG_CB_IS_VALUE | 25,
|
||||
|
||||
LECPCB_VAL_BLOB_START = 26, /* notice handle separately */
|
||||
LECPCB_VAL_BLOB_CHUNK = LECP_FLAG_CB_IS_VALUE | 27,
|
||||
LECPCB_VAL_BLOB_END = LECP_FLAG_CB_IS_VALUE | 28,
|
||||
|
||||
LECPCB_ARRAY_ITEM_START = 29,
|
||||
LECPCB_ARRAY_ITEM_END = 30,
|
||||
|
||||
LECPCB_LITERAL_CBOR = 31,
|
||||
};
|
||||
|
||||
enum lecp_reasons {
|
||||
LECP_CONTINUE = -1,
|
||||
LECP_REJECT_BAD_CODING = -2,
|
||||
LECP_REJECT_UNKNOWN = -3,
|
||||
LECP_REJECT_CALLBACK = -4,
|
||||
LECP_STACK_OVERFLOW = -5,
|
||||
};
|
||||
|
||||
|
||||
struct lecp_item {
|
||||
union {
|
||||
uint64_t u64;
|
||||
int64_t i64;
|
||||
|
||||
uint64_t u32;
|
||||
|
||||
uint16_t hf;
|
||||
#if defined(LWS_WITH_CBOR_FLOAT)
|
||||
float f;
|
||||
double d;
|
||||
#else
|
||||
uint32_t f;
|
||||
uint64_t d;
|
||||
#endif
|
||||
} u;
|
||||
uint8_t opcode;
|
||||
};
|
||||
|
||||
struct lecp_ctx;
|
||||
typedef signed char (*lecp_callback)(struct lecp_ctx *ctx, char reason);
|
||||
|
||||
struct _lecp_stack {
|
||||
char s; /* lejp_state stack*/
|
||||
uint8_t p; /* path length */
|
||||
char i; /* index array length */
|
||||
char indet; /* indeterminite */
|
||||
char intermediate; /* in middle of string */
|
||||
|
||||
char pop_iss;
|
||||
uint64_t tag;
|
||||
uint64_t collect_rem;
|
||||
uint32_t ordinal;
|
||||
uint8_t opcode;
|
||||
uint8_t send_new_array_item;
|
||||
uint8_t barrier;
|
||||
};
|
||||
|
||||
struct _lecp_parsing_stack {
|
||||
void *user; /* private to the stack level */
|
||||
lecp_callback cb;
|
||||
const char * const *paths;
|
||||
uint8_t count_paths;
|
||||
uint8_t ppos;
|
||||
uint8_t path_match;
|
||||
};
|
||||
|
||||
struct lecp_ctx {
|
||||
|
||||
/* sorted by type for most compact alignment
|
||||
*
|
||||
* pointers
|
||||
*/
|
||||
void *user;
|
||||
uint8_t *collect_tgt;
|
||||
|
||||
/* arrays */
|
||||
|
||||
struct _lecp_parsing_stack pst[LECP_MAX_PARSING_STACK_DEPTH];
|
||||
struct _lecp_stack st[LECP_MAX_DEPTH];
|
||||
uint16_t i[LECP_MAX_INDEX_DEPTH]; /* index array */
|
||||
uint16_t wild[LECP_MAX_INDEX_DEPTH]; /* index array */
|
||||
char path[LECP_MAX_PATH];
|
||||
uint8_t cbor[64]; /* literal cbor capture */
|
||||
|
||||
struct lecp_item item;
|
||||
|
||||
|
||||
/* size_t */
|
||||
|
||||
size_t path_stride; /* 0 means default ptr size, else
|
||||
* stride... allows paths to be
|
||||
* provided composed inside a
|
||||
* larger user struct instead of a
|
||||
* duplicated array */
|
||||
size_t used_in; /* bytes of input consumed */
|
||||
|
||||
/* short */
|
||||
|
||||
uint16_t uni;
|
||||
|
||||
/* char */
|
||||
|
||||
uint8_t npos;
|
||||
uint8_t dcount;
|
||||
uint8_t f;
|
||||
uint8_t sp; /* stack head */
|
||||
uint8_t ipos; /* index stack depth */
|
||||
uint8_t count_paths;
|
||||
uint8_t path_match;
|
||||
uint8_t path_match_len;
|
||||
uint8_t wildcount;
|
||||
uint8_t pst_sp; /* parsing stack head */
|
||||
uint8_t outer_array;
|
||||
uint8_t cbor_pos;
|
||||
uint8_t literal_cbor_report;
|
||||
char present; /* temp for cb reason to use */
|
||||
|
||||
uint8_t be; /* big endian */
|
||||
|
||||
/* at end so we can memset the rest of it */
|
||||
|
||||
char buf[LECP_STRING_CHUNK + 1];
|
||||
};
|
||||
|
||||
enum lws_lec_pctx_ret {
|
||||
LWS_LECPCTX_RET_FINISHED = 0,
|
||||
LWS_LECPCTX_RET_AGAIN, /* call again to continue writing buffer */
|
||||
LWS_LECPCTX_RET_FAIL /* something broken, eg, format string */
|
||||
};
|
||||
|
||||
enum cbp_state {
|
||||
CBPS_IDLE,
|
||||
CBPS_PC1,
|
||||
CBPS_PC2,
|
||||
CBPS_PC3,
|
||||
|
||||
CBPS_STRING_BODY,
|
||||
|
||||
CBPS_NUM_LIT,
|
||||
|
||||
CBPS_STRING_LIT,
|
||||
|
||||
CBPS_CONTYPE,
|
||||
};
|
||||
|
||||
typedef struct lws_lec_pctx {
|
||||
uint8_t stack[16];
|
||||
uint8_t vaa[16];
|
||||
uint8_t indet[16];
|
||||
uint8_t scratch[24];
|
||||
uint8_t *start; /* the beginning of the out buf */
|
||||
uint8_t *buf; /* cur pos in output buf */
|
||||
uint8_t *end; /* the end of the output buf */
|
||||
|
||||
const uint8_t *ongoing_src;
|
||||
uint64_t ongoing_len;
|
||||
uint64_t ongoing_done;
|
||||
|
||||
struct lecp_item item;
|
||||
|
||||
size_t used; /* number of bytes valid from start */
|
||||
|
||||
int opaque[4]; /* ignored by lws, caller may use */
|
||||
|
||||
enum cbp_state state;
|
||||
unsigned int fmt_pos;
|
||||
uint8_t sp;
|
||||
uint8_t scratch_len;
|
||||
uint8_t escflag;
|
||||
uint8_t _long;
|
||||
uint8_t vaa_pos;
|
||||
uint8_t dotstar;
|
||||
} lws_lec_pctx_t;
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_lec_int(lws_lec_pctx_t *ctx, uint8_t opcode, uint8_t indet, uint64_t num);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_lec_scratch(lws_lec_pctx_t *ctx);
|
||||
|
||||
/*
|
||||
* lws_lec_init() - prepare a cbor writing context
|
||||
*
|
||||
* \param ctx: the cbor writing context to prepare
|
||||
* \param buf: the output buffer start
|
||||
* \param len: the amount of the output buffer we can use
|
||||
*
|
||||
* Prepares a cbor writing context so that les_lec_printf can be used to
|
||||
* write into it.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_lec_init(lws_lec_pctx_t *ctx, uint8_t *buf, size_t len);
|
||||
|
||||
/*
|
||||
* lws_lec_setbuf() - update the output buffer for an initialized cbor writing ctx
|
||||
*
|
||||
* \param ctx: the cbor writing context to prepare
|
||||
* \param buf: the output buffer start
|
||||
* \param len: the amount of the output buffer we can use
|
||||
*
|
||||
* Leaves the cbor writing context state as it is, but resets the output buffer
|
||||
* it writes into as given in \p buf and \p len
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_lec_setbuf(lws_lec_pctx_t *ctx, uint8_t *buf, size_t len);
|
||||
|
||||
/*
|
||||
* lws_lec_vsprintf() - write into a cbor writing context
|
||||
*
|
||||
* \param ctx: the cbor writing context to prepare
|
||||
* \param format: a printf style argument map
|
||||
* \param args: the va args
|
||||
*
|
||||
* CBOR-aware vsprintf which pauses output when it fills the output buffer. You
|
||||
* can call it again with the same args and same lws_lex_pctx to resume filling
|
||||
*
|
||||
* Returns either LWS_LECPCTX_RET_FINISHED if we have nothing left over that we
|
||||
* want to put in the buffer, or LWS_LECPCTX_RET_AGAIN if the function should
|
||||
* be called again with the same arguments (perhaps into a different output
|
||||
* buffer) to continue emitting output from where it left off.
|
||||
*
|
||||
* If LWS_LECPCTX_RET_AGAIN is returned, lws_lec_setbuf() must be used on the
|
||||
* context to reset or change the output buffer before calling again.
|
||||
*
|
||||
* The number of bytes placed in the output buffer is available in ctx->used.
|
||||
*
|
||||
* \p format is a printf-type format string that is specialized for CBOR
|
||||
* generation. It understands the following specifiers
|
||||
*
|
||||
* |`123`||unsigned literal number|
|
||||
* |`-123`||signed literal number|
|
||||
* |`%u`|`unsigned int`|number|
|
||||
* |`%lu`|`unsigned long int`|number|
|
||||
* |`%llu`|`unsigned long long int`|number|
|
||||
* |`%d`|`signed int`|number|
|
||||
* |`%ld`|`signed long int`|number|
|
||||
* |`%lld`|`signed long long int`|number|
|
||||
* |`%f`|`double`|floating point number|
|
||||
* |`123(...)`||literal tag and scope|
|
||||
* |`%t(...)`|`unsigned int`|tag and scope|
|
||||
* |`%lt(...)`|`unsigned long int`|tag and scope|
|
||||
* |`%llt(...)`|`unsigned long long int`|tag and scope|
|
||||
* |`[...]`||Array (fixed len if `]` in same format string)|
|
||||
* |`{...}`||Map (fixed len if `}` in same format string)|
|
||||
* |`<t...>`||Container for indeterminite text string frags|
|
||||
* |`<b...>`||Container for indeterminite binary string frags|
|
||||
* |`'string'`||Literal text of known length|
|
||||
* |`%s`|`const char *`|NUL-terminated string|
|
||||
* |`%.*s`|`int`, `const char *`|length-specified string|
|
||||
* |`%.*b`|`int`, `const uint8_t *`|length-specified binary|
|
||||
* |`:`||separator between Map items (a:b)|
|
||||
* |`,`||separator between Map pairs or array items|
|
||||
*
|
||||
* See READMEs/README.cbor-lecp.md for more details.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN enum lws_lec_pctx_ret
|
||||
lws_lec_vsprintf(lws_lec_pctx_t *ctx, const char *format, va_list args);
|
||||
|
||||
/*
|
||||
* lws_lec_printf() - write into a cbor writing context
|
||||
*
|
||||
* \param ctx: the cbor writing context to prepare
|
||||
* \param format: a printf style argument map
|
||||
* \param ...: format args
|
||||
*
|
||||
* See lws_lec_vsprintf() for format details. This is the most common way
|
||||
* to format the CBOR output.
|
||||
*
|
||||
* See READMEs/README.cbor-lecp.md for more details.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN enum lws_lec_pctx_ret
|
||||
lws_lec_printf(lws_lec_pctx_t *ctx, const char *format, ...);
|
||||
|
||||
/**
|
||||
* lecp_construct() - Construct an LECP parser context
|
||||
*
|
||||
* \param ctx: the parser context object to be initialized
|
||||
* \param cb: the user callback to receive the parsing events
|
||||
* \param user: an opaque user pointer available at \p cb
|
||||
* \param paths: an optional array of parsing paths
|
||||
* \param paths_count: how many paths in \p paths
|
||||
*
|
||||
* Prepares an LECP parser context for parsing.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lecp_construct(struct lecp_ctx *ctx, lecp_callback cb, void *user,
|
||||
const char * const *paths, unsigned char paths_count);
|
||||
|
||||
/**
|
||||
* lecp_destruct() - Destroys an LECP parser context
|
||||
*
|
||||
* \param ctx: the parser context object to be destroyed
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lecp_destruct(struct lecp_ctx *ctx);
|
||||
|
||||
/**
|
||||
* lecp_parse() - parses a chunk of input CBOR
|
||||
*
|
||||
* \p ctx: the parsing context
|
||||
* \p cbor: the start of the chunk of CBOR
|
||||
* \p len: the number of bytes of CBOR available at \p cbor
|
||||
*
|
||||
* Returns LECP_CONTINUE if more input needed, one of enum lecp_reasons for a
|
||||
* fatal error, else 0 for successful parsing completion.
|
||||
*
|
||||
* On success or _CONTINUE, ctx->used_in is set to the number of input bytes
|
||||
* consumed.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lecp_parse(struct lecp_ctx *ctx, const uint8_t *cbor, size_t len);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lecp_change_callback(struct lecp_ctx *ctx, lecp_callback cb);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN const char *
|
||||
lecp_error_to_string(int e);
|
||||
|
||||
/**
|
||||
* lecp_parse_report_raw() - turn cbor raw reporting on and off
|
||||
*
|
||||
* \param ctx: the lecp context
|
||||
* \param on: 0 to disable (defaults disabled), 1 to enable
|
||||
*
|
||||
* For cose_sign, it needs access to raw cbor subtrees for the hash input.
|
||||
* This api causes LECPCB_LITERAL_CBOR parse callbacks when there are
|
||||
* ctx->cbor_pos bytes of raw cbor available in ctx->cbor[]. the callbacks
|
||||
* occur when the ctx->cbor[] buffer fills or if it holds anything when this
|
||||
* spi is used to stop the reports.
|
||||
*
|
||||
* The same CBOR that is being captured continues to be passed for parsing.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lecp_parse_report_raw(struct lecp_ctx *ctx, int on);
|
||||
|
||||
/**
|
||||
* lecp_parse_map_is_key() - return nonzero if we're in a map and this is a key
|
||||
*
|
||||
* \param ctx: the lwcp context
|
||||
*
|
||||
* Checks if the current value is a key in a map, ie, that you are on a "key" in
|
||||
* a list of "{key: value}" pairs. Zero means you're either not in a map or not
|
||||
* on the key part, and nonzero means you are in a map and on a key part.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lecp_parse_map_is_key(struct lecp_ctx *ctx);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lecp_parse_subtree(struct lecp_ctx *ctx, const uint8_t *in, size_t len);
|
||||
|
||||
/*
|
||||
* Helpers for half-float
|
||||
*/
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_singles2halfp(uint16_t *hp, uint32_t x);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_halfp2singles(uint32_t *xp, uint16_t h);
|
||||
|
||||
//@}
|
||||
146
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-led.h
Normal file
146
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-led.h
Normal file
@ -0,0 +1,146 @@
|
||||
/*
|
||||
* Generic LED controller ops
|
||||
*
|
||||
* Copyright (C) 2019 - 2020 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*
|
||||
* This is like an abstract class for leds, a real implementation provides
|
||||
* functions for the ops that use the underlying, eg, OS gpio arrangements.
|
||||
*/
|
||||
|
||||
/* only b15 significant for GPIO */
|
||||
typedef uint16_t lws_led_intensity_t;
|
||||
typedef uint16_t lws_led_seq_phase_t;
|
||||
|
||||
/* the normalized max intensity */
|
||||
#define LWS_LED_MAX_INTENSITY (0xffff)
|
||||
|
||||
/* the normalized 360 degree phase count for intensity functions */
|
||||
#define LWS_LED_FUNC_PHASE 65536
|
||||
/* used when the sequence doesn't stop by itself and goes around forever */
|
||||
#define LWS_SEQ_LEDPHASE_TOTAL_ENDLESS (-1)
|
||||
|
||||
#define LWS_LED_SEQUENCER_UPDATE_INTERVAL_MS 33
|
||||
|
||||
struct lws_led_state; /* opaque */
|
||||
struct lws_pwm_ops; /* forward ref */
|
||||
|
||||
typedef lws_led_intensity_t (*lws_led_lookup_t)(lws_led_seq_phase_t ph);
|
||||
|
||||
typedef struct lws_led_sequence_def_t {
|
||||
lws_led_lookup_t func;
|
||||
lws_led_seq_phase_t ledphase_offset;
|
||||
int ledphase_total; /* 65536= one cycle */
|
||||
uint16_t ms;
|
||||
uint8_t flags;
|
||||
} lws_led_sequence_def_t;
|
||||
|
||||
enum {
|
||||
LLSI_CURR,
|
||||
LLSI_NEXT,
|
||||
LLSI_TRANS
|
||||
};
|
||||
|
||||
typedef struct lws_led_state_ch
|
||||
{
|
||||
const lws_led_sequence_def_t *seq; /* NULL = inactive */
|
||||
lws_led_seq_phase_t ph;
|
||||
lws_led_seq_phase_t step;
|
||||
int phase_budget;
|
||||
lws_led_intensity_t last;
|
||||
/**< at the end of the sequence we decouple the sequencer, but leave
|
||||
* the last computed sample behind for further transitions to base off
|
||||
*/
|
||||
} lws_led_state_ch_t;
|
||||
|
||||
typedef struct lws_led_state_chs
|
||||
{
|
||||
lws_led_state_ch_t seqs[3];
|
||||
} lws_led_state_chs_t;
|
||||
|
||||
/* this should always be first in the subclassed implementation types */
|
||||
|
||||
typedef struct lws_led_ops {
|
||||
void (*intensity)(const struct lws_led_ops *lo, const char *name,
|
||||
lws_led_intensity_t inten);
|
||||
/**< for BOOL led control like GPIO, only inten b15 is significant */
|
||||
struct lws_led_state * (*create)(const struct lws_led_ops *led_ops);
|
||||
void (*destroy)(struct lws_led_state *);
|
||||
} lws_led_ops_t;
|
||||
|
||||
typedef struct lws_led_gpio_map {
|
||||
const char *name;
|
||||
_lws_plat_gpio_t gpio;
|
||||
lws_led_lookup_t intensity_correction;
|
||||
/**< May be NULL. If GPIO-based LED, ignored. If pwm_ops provided,
|
||||
* NULL means use default CIE 100% correction function. If non-NULL,
|
||||
* use the pointed-to correction function. This is useful to provide
|
||||
* LED-specific intensity correction / scaling so different types of
|
||||
* LED can "look the same". */
|
||||
const struct lws_pwm_ops *pwm_ops;
|
||||
/**< if NULL, gpio controls the led directly. If set to a pwm_ops,
|
||||
* the led control is outsourced to the pwm controller. */
|
||||
uint8_t active_level;
|
||||
} lws_led_gpio_map_t;
|
||||
|
||||
typedef struct lws_led_gpio_controller {
|
||||
const lws_led_ops_t led_ops;
|
||||
|
||||
const lws_gpio_ops_t *gpio_ops;
|
||||
const lws_led_gpio_map_t *led_map;
|
||||
uint8_t count_leds;
|
||||
} lws_led_gpio_controller_t;
|
||||
|
||||
/* ops */
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN struct lws_led_state *
|
||||
lws_led_gpio_create(const lws_led_ops_t *led_ops);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_led_gpio_destroy(struct lws_led_state *lcs);
|
||||
|
||||
/**
|
||||
* lws_led_gpio_intensity() - set the static intensity of an led
|
||||
*
|
||||
* \param lo: the base class of the led controller
|
||||
* \param index: which led in the controller set
|
||||
* \param inten: 16-bit unsigned intensity
|
||||
*
|
||||
* For LEDs controlled by a BOOL like GPIO, only inten b15 is significant.
|
||||
* For PWM type LED control, as many bits as the hardware can support from b15
|
||||
* down are significant.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_led_gpio_intensity(const struct lws_led_ops *lo, const char *name,
|
||||
lws_led_intensity_t inten);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_led_transition(struct lws_led_state *lcs, const char *name,
|
||||
const lws_led_sequence_def_t *next,
|
||||
const lws_led_sequence_def_t *trans);
|
||||
|
||||
|
||||
#define lws_led_gpio_ops \
|
||||
{ \
|
||||
.create = lws_led_gpio_create, \
|
||||
.destroy = lws_led_gpio_destroy, \
|
||||
.intensity = lws_led_gpio_intensity, \
|
||||
}
|
||||
|
||||
309
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-lejp.h
Normal file
309
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-lejp.h
Normal file
@ -0,0 +1,309 @@
|
||||
/*
|
||||
* libwebsockets - small server side websockets and web server implementation
|
||||
*
|
||||
* Copyright (C) 2010 - 2019 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
/** \defgroup lejp JSON parser
|
||||
* ##JSON parsing related functions
|
||||
* \ingroup lwsapi
|
||||
*
|
||||
* LEJP is an extremely lightweight JSON stream parser included in lws.
|
||||
*/
|
||||
//@{
|
||||
struct lejp_ctx;
|
||||
|
||||
#if !defined(LWS_ARRAY_SIZE)
|
||||
#define LWS_ARRAY_SIZE(_x) (sizeof(_x) / sizeof(_x[0]))
|
||||
#endif
|
||||
#define LEJP_FLAG_WS_KEEP 64
|
||||
#define LEJP_FLAG_WS_COMMENTLINE 32
|
||||
|
||||
enum lejp_states {
|
||||
LEJP_IDLE = 0,
|
||||
LEJP_MEMBERS = 1,
|
||||
LEJP_M_P = 2,
|
||||
LEJP_MP_STRING = LEJP_FLAG_WS_KEEP | 3,
|
||||
LEJP_MP_STRING_ESC = LEJP_FLAG_WS_KEEP | 4,
|
||||
LEJP_MP_STRING_ESC_U1 = LEJP_FLAG_WS_KEEP | 5,
|
||||
LEJP_MP_STRING_ESC_U2 = LEJP_FLAG_WS_KEEP | 6,
|
||||
LEJP_MP_STRING_ESC_U3 = LEJP_FLAG_WS_KEEP | 7,
|
||||
LEJP_MP_STRING_ESC_U4 = LEJP_FLAG_WS_KEEP | 8,
|
||||
LEJP_MP_DELIM = 9,
|
||||
LEJP_MP_VALUE = 10,
|
||||
LEJP_MP_VALUE_NUM_INT = LEJP_FLAG_WS_KEEP | 11,
|
||||
LEJP_MP_VALUE_NUM_EXP = LEJP_FLAG_WS_KEEP | 12,
|
||||
LEJP_MP_VALUE_TOK = LEJP_FLAG_WS_KEEP | 13,
|
||||
LEJP_MP_COMMA_OR_END = 14,
|
||||
LEJP_MP_ARRAY_END = 15,
|
||||
};
|
||||
|
||||
enum lejp_reasons {
|
||||
LEJP_CONTINUE = -1,
|
||||
LEJP_REJECT_IDLE_NO_BRACE = -2,
|
||||
LEJP_REJECT_MEMBERS_NO_CLOSE = -3,
|
||||
LEJP_REJECT_MP_NO_OPEN_QUOTE = -4,
|
||||
LEJP_REJECT_MP_STRING_UNDERRUN = -5,
|
||||
LEJP_REJECT_MP_ILLEGAL_CTRL = -6,
|
||||
LEJP_REJECT_MP_STRING_ESC_ILLEGAL_ESC = -7,
|
||||
LEJP_REJECT_ILLEGAL_HEX = -8,
|
||||
LEJP_REJECT_MP_DELIM_MISSING_COLON = -9,
|
||||
LEJP_REJECT_MP_DELIM_BAD_VALUE_START = -10,
|
||||
LEJP_REJECT_MP_VAL_NUM_INT_NO_FRAC = -11,
|
||||
LEJP_REJECT_MP_VAL_NUM_FORMAT = -12,
|
||||
LEJP_REJECT_MP_VAL_NUM_EXP_BAD_EXP = -13,
|
||||
LEJP_REJECT_MP_VAL_TOK_UNKNOWN = -14,
|
||||
LEJP_REJECT_MP_C_OR_E_UNDERF = -15,
|
||||
LEJP_REJECT_MP_C_OR_E_NOTARRAY = -16,
|
||||
LEJP_REJECT_MP_ARRAY_END_MISSING = -17,
|
||||
LEJP_REJECT_STACK_OVERFLOW = -18,
|
||||
LEJP_REJECT_MP_DELIM_ISTACK = -19,
|
||||
LEJP_REJECT_NUM_TOO_LONG = -20,
|
||||
LEJP_REJECT_MP_C_OR_E_NEITHER = -21,
|
||||
LEJP_REJECT_UNKNOWN = -22,
|
||||
LEJP_REJECT_CALLBACK = -23
|
||||
};
|
||||
|
||||
#define LEJP_FLAG_CB_IS_VALUE 64
|
||||
|
||||
enum lejp_callbacks {
|
||||
LEJPCB_CONSTRUCTED = 0,
|
||||
LEJPCB_DESTRUCTED = 1,
|
||||
|
||||
LEJPCB_START = 2,
|
||||
LEJPCB_COMPLETE = 3,
|
||||
LEJPCB_FAILED = 4,
|
||||
|
||||
LEJPCB_PAIR_NAME = 5,
|
||||
|
||||
LEJPCB_VAL_TRUE = LEJP_FLAG_CB_IS_VALUE | 6,
|
||||
LEJPCB_VAL_FALSE = LEJP_FLAG_CB_IS_VALUE | 7,
|
||||
LEJPCB_VAL_NULL = LEJP_FLAG_CB_IS_VALUE | 8,
|
||||
LEJPCB_VAL_NUM_INT = LEJP_FLAG_CB_IS_VALUE | 9,
|
||||
LEJPCB_VAL_NUM_FLOAT = LEJP_FLAG_CB_IS_VALUE | 10,
|
||||
LEJPCB_VAL_STR_START = 11, /* notice handle separately */
|
||||
LEJPCB_VAL_STR_CHUNK = LEJP_FLAG_CB_IS_VALUE | 12,
|
||||
LEJPCB_VAL_STR_END = LEJP_FLAG_CB_IS_VALUE | 13,
|
||||
|
||||
LEJPCB_ARRAY_START = 14,
|
||||
LEJPCB_ARRAY_END = 15,
|
||||
|
||||
LEJPCB_OBJECT_START = 16,
|
||||
LEJPCB_OBJECT_END = 17,
|
||||
|
||||
LEJPCB_USER_START = 32,
|
||||
};
|
||||
|
||||
/**
|
||||
* _lejp_callback() - User parser actions
|
||||
* \param ctx: LEJP context
|
||||
* \param reason: Callback reason
|
||||
*
|
||||
* Your user callback is associated with the context at construction time,
|
||||
* and receives calls as the parsing progresses.
|
||||
*
|
||||
* All of the callbacks may be ignored and just return 0.
|
||||
*
|
||||
* The reasons it might get called, found in @reason, are:
|
||||
*
|
||||
* LEJPCB_CONSTRUCTED: The context was just constructed... you might want to
|
||||
* perform one-time allocation for the life of the context.
|
||||
*
|
||||
* LEJPCB_DESTRUCTED: The context is being destructed... if you made any
|
||||
* allocations at construction-time, you can free them now
|
||||
*
|
||||
* LEJPCB_START: Parsing is beginning at the first byte of input
|
||||
*
|
||||
* LEJPCB_COMPLETE: Parsing has completed successfully. You'll get a 0 or
|
||||
* positive return code from lejp_parse indicating the
|
||||
* amount of unused bytes left in the input buffer
|
||||
*
|
||||
* LEJPCB_FAILED: Parsing failed. You'll get a negative error code
|
||||
* returned from lejp_parse
|
||||
*
|
||||
* LEJPCB_PAIR_NAME: When a "name":"value" pair has had the name parsed,
|
||||
* this callback occurs. You can find the new name at
|
||||
* the end of ctx->path[]
|
||||
*
|
||||
* LEJPCB_VAL_TRUE: The "true" value appeared
|
||||
*
|
||||
* LEJPCB_VAL_FALSE: The "false" value appeared
|
||||
*
|
||||
* LEJPCB_VAL_NULL: The "null" value appeared
|
||||
*
|
||||
* LEJPCB_VAL_NUM_INT: A string representing an integer is in ctx->buf
|
||||
*
|
||||
* LEJPCB_VAL_NUM_FLOAT: A string representing a float is in ctx->buf
|
||||
*
|
||||
* LEJPCB_VAL_STR_START: We are starting to parse a string, no data yet
|
||||
*
|
||||
* LEJPCB_VAL_STR_CHUNK: We filled the string buffer in the ctx, but it's not
|
||||
* the end of the string. We produce this to spill the
|
||||
* intermediate buffer to the user code, so we can handle
|
||||
* huge JSON strings using only the small buffer in the
|
||||
* ctx. If the whole JSON string fits in the ctx buffer,
|
||||
* you won't get these callbacks.
|
||||
*
|
||||
* LEJPCB_VAL_STR_END: String parsing has completed, the last chunk of the
|
||||
* string is in ctx->buf.
|
||||
*
|
||||
* LEJPCB_ARRAY_START: An array started
|
||||
*
|
||||
* LEJPCB_ARRAY_END: An array ended
|
||||
*
|
||||
* LEJPCB_OBJECT_START: An object started
|
||||
*
|
||||
* LEJPCB_OBJECT_END: An object ended
|
||||
*/
|
||||
LWS_EXTERN signed char _lejp_callback(struct lejp_ctx *ctx, char reason);
|
||||
|
||||
typedef signed char (*lejp_callback)(struct lejp_ctx *ctx, char reason);
|
||||
|
||||
#ifndef LEJP_MAX_PARSING_STACK_DEPTH
|
||||
#define LEJP_MAX_PARSING_STACK_DEPTH 8
|
||||
#endif
|
||||
#ifndef LEJP_MAX_DEPTH
|
||||
#define LEJP_MAX_DEPTH 16
|
||||
#endif
|
||||
#ifndef LEJP_MAX_INDEX_DEPTH
|
||||
#define LEJP_MAX_INDEX_DEPTH 12
|
||||
#endif
|
||||
#ifndef LEJP_MAX_PATH
|
||||
#define LEJP_MAX_PATH 192
|
||||
#endif
|
||||
#ifndef LEJP_STRING_CHUNK
|
||||
/* must be >= 30 to assemble floats */
|
||||
#define LEJP_STRING_CHUNK 254
|
||||
#endif
|
||||
|
||||
enum num_flags {
|
||||
LEJP_SEEN_MINUS = (1 << 0),
|
||||
LEJP_SEEN_POINT = (1 << 1),
|
||||
LEJP_SEEN_POST_POINT = (1 << 2),
|
||||
LEJP_SEEN_EXP = (1 << 3)
|
||||
};
|
||||
|
||||
struct _lejp_stack {
|
||||
char s; /* lejp_state stack*/
|
||||
char p; /* path length */
|
||||
char i; /* index array length */
|
||||
char b; /* user bitfield */
|
||||
};
|
||||
|
||||
struct _lejp_parsing_stack {
|
||||
void *user; /* private to the stack level */
|
||||
signed char (*callback)(struct lejp_ctx *ctx, char reason);
|
||||
const char * const *paths;
|
||||
uint8_t count_paths;
|
||||
uint8_t ppos;
|
||||
uint8_t path_match;
|
||||
};
|
||||
|
||||
struct lejp_ctx {
|
||||
|
||||
/* sorted by type for most compact alignment
|
||||
*
|
||||
* pointers
|
||||
*/
|
||||
void *user;
|
||||
|
||||
/* arrays */
|
||||
|
||||
struct _lejp_parsing_stack pst[LEJP_MAX_PARSING_STACK_DEPTH];
|
||||
struct _lejp_stack st[LEJP_MAX_DEPTH];
|
||||
uint16_t i[LEJP_MAX_INDEX_DEPTH]; /* index array */
|
||||
uint16_t wild[LEJP_MAX_INDEX_DEPTH]; /* index array */
|
||||
char path[LEJP_MAX_PATH];
|
||||
char buf[LEJP_STRING_CHUNK + 1];
|
||||
|
||||
/* size_t */
|
||||
|
||||
size_t path_stride; /* 0 means default ptr size, else stride */
|
||||
|
||||
/* int */
|
||||
|
||||
uint32_t line;
|
||||
|
||||
/* short */
|
||||
|
||||
uint16_t uni;
|
||||
#define LEJP_FLAG_FEAT_OBJECT_INDEXES (1 << 0)
|
||||
#define LEJP_FLAG_FEAT_LEADING_WC (1 << 1)
|
||||
#define LEJP_FLAG_LATEST \
|
||||
(LEJP_FLAG_FEAT_OBJECT_INDEXES | \
|
||||
LEJP_FLAG_FEAT_LEADING_WC)
|
||||
uint16_t flags;
|
||||
|
||||
/* char */
|
||||
|
||||
uint8_t npos;
|
||||
uint8_t dcount;
|
||||
uint8_t f;
|
||||
uint8_t sp; /* stack head */
|
||||
uint8_t ipos; /* index stack depth */
|
||||
uint8_t count_paths;
|
||||
uint8_t path_match;
|
||||
uint8_t path_match_len;
|
||||
uint8_t wildcount;
|
||||
uint8_t pst_sp; /* parsing stack head */
|
||||
uint8_t outer_array;
|
||||
};
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lejp_construct(struct lejp_ctx *ctx,
|
||||
signed char (*callback)(struct lejp_ctx *ctx, char reason),
|
||||
void *user, const char * const *paths, unsigned char paths_count);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lejp_destruct(struct lejp_ctx *ctx);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lejp_parse(struct lejp_ctx *ctx, const unsigned char *json, int len);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lejp_change_callback(struct lejp_ctx *ctx,
|
||||
signed char (*callback)(struct lejp_ctx *ctx, char reason));
|
||||
|
||||
/*
|
||||
* push the current paths / paths_count and lejp_cb to a stack in the ctx, and
|
||||
* start using the new ones
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lejp_parser_push(struct lejp_ctx *ctx, void *user, const char * const *paths,
|
||||
unsigned char paths_count, lejp_callback lejp_cb);
|
||||
|
||||
/*
|
||||
* pop the previously used paths / paths_count and lejp_cb, and continue
|
||||
* parsing using those as before
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lejp_parser_pop(struct lejp_ctx *ctx);
|
||||
|
||||
/* exported for use when reevaluating a path for use with a subcontext */
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lejp_check_path_match(struct lejp_ctx *ctx);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lejp_get_wildcard(struct lejp_ctx *ctx, int wildcard, char *dest, int len);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN const char *
|
||||
lejp_error_to_string(int e);
|
||||
//@}
|
||||
799
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-logs.h
Normal file
799
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-logs.h
Normal file
@ -0,0 +1,799 @@
|
||||
/*
|
||||
* libwebsockets - small server side websockets and web server implementation
|
||||
*
|
||||
* Copyright (C) 2010 - 2021 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
/** \defgroup log Logging
|
||||
*
|
||||
* ##Logging
|
||||
*
|
||||
* Lws provides flexible and filterable logging facilities, which can be
|
||||
* used inside lws and in user code.
|
||||
*
|
||||
* Log categories may be individually filtered bitwise, and directed to built-in
|
||||
* sinks for syslog-compatible logging, or a user-defined function.
|
||||
*
|
||||
* Traditional logs use a single, processwide logging context. New style log
|
||||
* apis (lws_xxx_cx()) can pass the logging context to use in.
|
||||
*/
|
||||
///@{
|
||||
|
||||
#define LLL_ERR (1 << 0)
|
||||
#define LLL_WARN (1 << 1)
|
||||
#define LLL_NOTICE (1 << 2)
|
||||
#define LLL_INFO (1 << 3)
|
||||
#define LLL_DEBUG (1 << 4)
|
||||
#define LLL_PARSER (1 << 5)
|
||||
#define LLL_HEADER (1 << 6)
|
||||
#define LLL_EXT (1 << 7)
|
||||
#define LLL_CLIENT (1 << 8)
|
||||
#define LLL_LATENCY (1 << 9)
|
||||
#define LLL_USER (1 << 10)
|
||||
#define LLL_THREAD (1 << 11)
|
||||
|
||||
#define LLL_COUNT (12) /* set to count of valid flags */
|
||||
|
||||
#define LLLF_SECRECY_PII (1 << 16)
|
||||
/**< contains Personally Identifiable Information */
|
||||
#define LLLF_SECRECY_BEARER (1 << 17)
|
||||
/**< possession of this data allows impersonation */
|
||||
|
||||
#define LLLF_LOG_TIMESTAMP (1 << 18)
|
||||
/**< set to prepend logs with timestamp */
|
||||
|
||||
#define LLLF_LOG_CONTEXT_AWARE (1 << 30)
|
||||
/**< set if the context uses an emit function that takes the logctx, auto-
|
||||
* applied when setting emit using lws_set_log_level_cx() api */
|
||||
|
||||
struct lws_log_cx;
|
||||
|
||||
typedef void (*lws_log_emit_t)(int level, const char *line);
|
||||
typedef void (*lws_log_emit_cx_t)(struct lws_log_cx *cx, int level,
|
||||
const char *line, size_t len);
|
||||
typedef void (*lws_log_prepend_cx_t)(struct lws_log_cx *cx, void *obj,
|
||||
char **p, char *e);
|
||||
typedef void (*lws_log_use_cx_t)(struct lws_log_cx *cx, int _new);
|
||||
|
||||
/*
|
||||
* This is the logging context
|
||||
*/
|
||||
|
||||
typedef struct lws_log_cx {
|
||||
union {
|
||||
lws_log_emit_t emit; /* legacy emit function */
|
||||
lws_log_emit_cx_t emit_cx; /* LLLF_LOG_CONTEXT_AWARE */
|
||||
} u;
|
||||
|
||||
#if LWS_MAX_SMP > 1
|
||||
pthread_mutex_t refcount_lock;
|
||||
#endif
|
||||
|
||||
lws_log_use_cx_t refcount_cb;
|
||||
/**< NULL, or a function called after each change to .refcount below,
|
||||
* this enables implementing side-effects like opening and closing
|
||||
* log files when the first and last object binds / unbinds */
|
||||
lws_log_prepend_cx_t prepend;
|
||||
/**< NULL, or a cb to optionally prepend a string to logs we are a
|
||||
* parent of */
|
||||
struct lws_log_cx *parent;
|
||||
/**< NULL, or points to log ctx we are a child of */
|
||||
void *opaque;
|
||||
/**< ignored by lws, used to pass config to emit_cx, eg, filepath */
|
||||
void *stg;
|
||||
/**< ignored by lws, may be used a storage by refcount_cb / emit_cx */
|
||||
uint32_t lll_flags;
|
||||
/**< mask of log levels we want to emit in this context */
|
||||
int32_t refcount;
|
||||
/**< refcount of objects bound to this log context */
|
||||
#if LWS_MAX_SMP > 1
|
||||
char inited;
|
||||
#endif
|
||||
} lws_log_cx_t;
|
||||
|
||||
/**
|
||||
* lwsl_timestamp: generate logging timestamp string
|
||||
*
|
||||
* \param level: logging level
|
||||
* \param p: char * buffer to take timestamp
|
||||
* \param len: length of p
|
||||
*
|
||||
* returns length written in p
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lwsl_timestamp(int level, char *p, size_t len);
|
||||
|
||||
#if defined(LWS_PLAT_OPTEE) && !defined(LWS_WITH_NETWORK)
|
||||
#define _lws_log(aaa, ...) SMSG(__VA_ARGS__)
|
||||
#else
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
_lws_log(int filter, const char *format, ...) LWS_FORMAT(2);
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
_lws_logv(int filter, const char *format, va_list vl);
|
||||
#endif
|
||||
|
||||
struct lws_vhost;
|
||||
struct lws;
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN struct lws_log_cx *
|
||||
lwsl_context_get_cx(struct lws_context *cx);
|
||||
LWS_VISIBLE LWS_EXTERN struct lws_log_cx *
|
||||
lwsl_vhost_get_cx(struct lws_vhost *vh);
|
||||
LWS_VISIBLE LWS_EXTERN struct lws_log_cx *
|
||||
lwsl_wsi_get_cx(struct lws *wsi);
|
||||
#if defined(LWS_WITH_SECURE_STREAMS)
|
||||
struct lws_ss_handle;
|
||||
LWS_VISIBLE LWS_EXTERN struct lws_log_cx *
|
||||
lwsl_ss_get_cx(struct lws_ss_handle *ss);
|
||||
#endif
|
||||
#if defined(LWS_WITH_SECURE_STREAMS_PROXY_API)
|
||||
struct lws_sspc_handle;
|
||||
LWS_VISIBLE LWS_EXTERN struct lws_log_cx *
|
||||
lwsl_sspc_get_cx(struct lws_sspc_handle *ss);
|
||||
#endif
|
||||
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_log_emit_cx_file(struct lws_log_cx *cx, int level, const char *line,
|
||||
size_t len);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_log_use_cx_file(struct lws_log_cx *cx, int _new);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_log_prepend_context(struct lws_log_cx *cx, void *obj, char **p, char *e);
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_log_prepend_vhost(struct lws_log_cx *cx, void *obj, char **p, char *e);
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_log_prepend_wsi(struct lws_log_cx *cx, void *obj, char **p, char *e);
|
||||
#if defined(LWS_WITH_SECURE_STREAMS)
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_log_prepend_ss(struct lws_log_cx *cx, void *obj, char **p, char *e);
|
||||
#endif
|
||||
#if defined(LWS_WITH_SECURE_STREAMS_PROXY_API)
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_log_prepend_sspc(struct lws_log_cx *cx, void *obj, char **p, char *e);
|
||||
#endif
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
_lws_log_cx(lws_log_cx_t *cx, lws_log_prepend_cx_t prep, void *obj,
|
||||
int filter, const char *_fun, const char *format, ...) LWS_FORMAT(6);
|
||||
|
||||
#define lwsl_cx(_c, _fil, ...) \
|
||||
_lws_log_cx(lwsl_context_get_cx(_c), lws_log_prepend_context, \
|
||||
_c, _fil, __func__, __VA_ARGS__)
|
||||
#define lwsl_vhost(_v, _fil, ...) \
|
||||
_lws_log_cx(lwsl_vhost_get_cx(_v), lws_log_prepend_vhost, _v, \
|
||||
_fil, __func__, __VA_ARGS__)
|
||||
#define lwsl_wsi(_w, _fil, ...) \
|
||||
_lws_log_cx(lwsl_wsi_get_cx(_w), lws_log_prepend_wsi, _w, \
|
||||
_fil, __func__, __VA_ARGS__)
|
||||
#define lwsl_ss(_h, _fil, ...) \
|
||||
_lws_log_cx(lwsl_ss_get_cx(_h), lws_log_prepend_ss, _h, \
|
||||
_fil, __func__, __VA_ARGS__)
|
||||
|
||||
#define lwsl_hexdump_context(_c, _fil, _buf, _len) \
|
||||
lwsl_hexdump_level_cx(lwsl_context_get_cx(_c), \
|
||||
lws_log_prepend_context, \
|
||||
_c, _fil, _buf, _len)
|
||||
#define lwsl_hexdump_vhost(_v, _fil, _buf, _len) \
|
||||
lwsl_hexdump_level_cx(lwsl_vhost_get_cx(_v), \
|
||||
lws_log_prepend_vhost, \
|
||||
_v, _fil, _buf, _len)
|
||||
#define lwsl_hexdump_wsi(_w, _fil, _buf, _len) \
|
||||
lwsl_hexdump_level_cx(lwsl_wsi_get_cx(_w), \
|
||||
lws_log_prepend_wsi, \
|
||||
_w, _fil, _buf, _len)
|
||||
#define lwsl_hexdump_ss(_h, _fil, _buf, _len) \
|
||||
lwsl_hexdump_level_cx(lwsl_ss_get_cx(_h), \
|
||||
lws_log_prepend_ss, \
|
||||
_h, _fil, _buf, _len)
|
||||
|
||||
/*
|
||||
* Figure out which logs to build in or not
|
||||
*/
|
||||
|
||||
#if defined(_DEBUG)
|
||||
/*
|
||||
* In DEBUG build, select all logs unless NO_LOGS
|
||||
*/
|
||||
#if defined(LWS_WITH_NO_LOGS)
|
||||
#define _LWS_LINIT (LLL_ERR | LLL_USER)
|
||||
#else
|
||||
#define _LWS_LINIT ((1 << LLL_COUNT) - 1)
|
||||
#endif
|
||||
#else /* not _DEBUG */
|
||||
#if defined(LWS_WITH_NO_LOGS)
|
||||
#define _LWS_LINIT (LLL_ERR | LLL_USER)
|
||||
#else
|
||||
#define _LWS_LINIT (LLL_ERR | LLL_USER | LLL_WARN | LLL_NOTICE)
|
||||
#endif
|
||||
#endif /* _DEBUG */
|
||||
|
||||
/*
|
||||
* Create either empty overrides or the ones forced at build-time.
|
||||
* These overrides have the final say... any bits set in
|
||||
* LWS_LOGGING_BITFIELD_SET force the build of those logs, any bits
|
||||
* set in LWS_LOGGING_BITFIELD_CLEAR disable the build of those logs.
|
||||
*
|
||||
* If not defined lws decides based on CMAKE_BUILD_TYPE=DEBUG or not
|
||||
*/
|
||||
|
||||
#if defined(LWS_LOGGING_BITFIELD_SET)
|
||||
#define _LWS_LBS (LWS_LOGGING_BITFIELD_SET)
|
||||
#else
|
||||
#define _LWS_LBS 0
|
||||
#endif
|
||||
|
||||
#if defined(LWS_LOGGING_BITFIELD_CLEAR)
|
||||
#define _LWS_LBC (LWS_LOGGING_BITFIELD_CLEAR)
|
||||
#else
|
||||
#define _LWS_LBC 0
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Compute the final active logging bitfield for build
|
||||
*/
|
||||
#define _LWS_ENABLED_LOGS (((_LWS_LINIT) | (_LWS_LBS)) & ~(_LWS_LBC))
|
||||
|
||||
/*
|
||||
* Individually enable or disable log levels for build
|
||||
* depending on what was computed
|
||||
*/
|
||||
|
||||
/*
|
||||
* Process scope logs
|
||||
*/
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_ERR)
|
||||
#define lwsl_err(...) _lws_log(LLL_ERR, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_err(...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_WARN)
|
||||
#define lwsl_warn(...) _lws_log(LLL_WARN, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_warn(...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_NOTICE)
|
||||
#define lwsl_notice(...) _lws_log(LLL_NOTICE, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_notice(...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_INFO)
|
||||
#define lwsl_info(...) _lws_log(LLL_INFO, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_info(...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_DEBUG)
|
||||
#define lwsl_debug(...) _lws_log(LLL_DEBUG, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_debug(...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_PARSER)
|
||||
#define lwsl_parser(...) _lws_log(LLL_PARSER, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_parser(...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_HEADER)
|
||||
#define lwsl_header(...) _lws_log(LLL_HEADER, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_header(...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_EXT)
|
||||
#define lwsl_ext(...) _lws_log(LLL_EXT, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_ext(...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_CLIENT)
|
||||
#define lwsl_client(...) _lws_log(LLL_CLIENT, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_client(...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_LATENCY)
|
||||
#define lwsl_latency(...) _lws_log(LLL_LATENCY, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_latency(...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_THREAD)
|
||||
#define lwsl_thread(...) _lws_log(LLL_THREAD, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_thread(...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_USER)
|
||||
#define lwsl_user(...) _lws_log(LLL_USER, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_user(...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#define lwsl_hexdump_err(...) lwsl_hexdump_level(LLL_ERR, __VA_ARGS__)
|
||||
#define lwsl_hexdump_warn(...) lwsl_hexdump_level(LLL_WARN, __VA_ARGS__)
|
||||
#define lwsl_hexdump_notice(...) lwsl_hexdump_level(LLL_NOTICE, __VA_ARGS__)
|
||||
#define lwsl_hexdump_info(...) lwsl_hexdump_level(LLL_INFO, __VA_ARGS__)
|
||||
#define lwsl_hexdump_debug(...) lwsl_hexdump_level(LLL_DEBUG, __VA_ARGS__)
|
||||
|
||||
/*
|
||||
* lws_context scope logs
|
||||
*/
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_ERR)
|
||||
#define lwsl_cx_err(_c, ...) lwsl_cx(_c, LLL_ERR, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_cx_err(_c, ...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_WARN)
|
||||
#define lwsl_cx_warn(_c, ...) lwsl_cx(_c, LLL_WARN, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_cx_warn(_c, ...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_NOTICE)
|
||||
#define lwsl_cx_notice(_c, ...) lwsl_cx(_c, LLL_NOTICE, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_cx_notice(_c, ...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_INFO)
|
||||
#define lwsl_cx_info(_c, ...) lwsl_cx(_c, LLL_INFO, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_cx_info(_c, ...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_DEBUG)
|
||||
#define lwsl_cx_debug(_c, ...) lwsl_cx(_c, LLL_DEBUG, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_cx_debug(_c, ...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_PARSER)
|
||||
#define lwsl_cx_parser(_c, ...) lwsl_cx(_c, LLL_PARSER, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_cx_parser(_c, ...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_HEADER)
|
||||
#define lwsl_cx_header(_c, ...) lwsl_cx(_c, LLL_HEADER, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_cx_header(_c, ...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_EXT)
|
||||
#define lwsl_cx_ext(_c, ...) lwsl_cx(_c, LLL_EXT, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_cx_ext(_c, ...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_CLIENT)
|
||||
#define lwsl_cx_client(_c, ...) lwsl_cx(_c, LLL_CLIENT, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_cx_client(_c, ...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_LATENCY)
|
||||
#define lwsl_cx_latency(_c, ...) lwsl_cx(_c, LLL_LATENCY, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_cx_latency(_c, ...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_THREAD)
|
||||
#define lwsl_cx_thread(_c, ...) lwsl_cx(_c, LLL_THREAD, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_cx_thread(_c, ...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_USER)
|
||||
#define lwsl_cx_user(_c, ...) lwsl_cx(_c, LLL_USER, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_cx_user(_c, ...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#define lwsl_hexdump_cx_err(_c, ...) lwsl_hexdump_context(_c, LLL_ERR, __VA_ARGS__)
|
||||
#define lwsl_hexdump_cx_warn(_c, ...) lwsl_hexdump_context(_c, LLL_WARN, __VA_ARGS__)
|
||||
#define lwsl_hexdump_cx_notice(_c, ...) lwsl_hexdump_context(_c, LLL_NOTICE, __VA_ARGS__)
|
||||
#define lwsl_hexdump_cx_info(_c, ...) lwsl_hexdump_context(_c, LLL_INFO, __VA_ARGS__)
|
||||
#define lwsl_hexdump_cx_debug(_c, ...) lwsl_hexdump_context(_c, LLL_DEBUG, __VA_ARGS__)
|
||||
|
||||
/*
|
||||
* lws_vhost
|
||||
*/
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_ERR)
|
||||
#define lwsl_vhost_err(_v, ...) lwsl_vhost(_v, LLL_ERR, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_vhost_err(_v, ...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_WARN)
|
||||
#define lwsl_vhost_warn(_v, ...) lwsl_vhost(_v, LLL_WARN, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_vhost_warn(_v, ...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_NOTICE)
|
||||
#define lwsl_vhost_notice(_v, ...) lwsl_vhost(_v, LLL_NOTICE, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_vhost_notice(_v, ...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_INFO)
|
||||
#define lwsl_vhost_info(_v, ...) lwsl_vhost(_v, LLL_INFO, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_vhost_info(_v, ...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_DEBUG)
|
||||
#define lwsl_vhost_debug(_v, ...) lwsl_vhost(_v, LLL_DEBUG, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_vhost_debug(_v, ...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_PARSER)
|
||||
#define lwsl_vhost_parser(_v, ...) lwsl_vhost(_v, LLL_PARSER, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_vhost_parser(_v, ...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_HEADER)
|
||||
#define lwsl_vhost_header(_v, ...) lwsl_vhost(_v, LLL_HEADER, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_vhost_header(_v, ...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_EXT)
|
||||
#define lwsl_vhost_ext(_v, ...) lwsl_vhost(_v, LLL_EXT, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_vhost_ext(_v, ...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_CLIENT)
|
||||
#define lwsl_vhost_client(_v, ...) lwsl_vhost(_v, LLL_CLIENT, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_vhost_client(_v, ...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_LATENCY)
|
||||
#define lwsl_vhost_latency(_v, ...) lwsl_vhost(_v, LLL_LATENCY, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_vhost_latency(_v, ...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_THREAD)
|
||||
#define lwsl_vhost_thread(_v, ...) lwsl_vhost(_v, LLL_THREAD, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_vhost_thread(_v, ...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_USER)
|
||||
#define lwsl_vhost_user(_v, ...) lwsl_vhost(_v, LLL_USER, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_vhost_user(_v, ...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#define lwsl_hexdump_vhost_err(_v, ...) lwsl_hexdump_vhost(_v, LLL_ERR, __VA_ARGS__)
|
||||
#define lwsl_hexdump_vhost_warn(_v, ...) lwsl_hexdump_vhost(_v, LLL_WARN, __VA_ARGS__)
|
||||
#define lwsl_hexdump_vhost_notice(_v, ...) lwsl_hexdump_vhost(_v, LLL_NOTICE, __VA_ARGS__)
|
||||
#define lwsl_hexdump_vhost_info(_v, ...) lwsl_hexdump_vhost(_v, LLL_INFO, __VA_ARGS__)
|
||||
#define lwsl_hexdump_vhost_debug(_v, ...) lwsl_hexdump_vhost(_v, LLL_DEBUG, __VA_ARGS__)
|
||||
|
||||
|
||||
/*
|
||||
* lws_wsi
|
||||
*/
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_ERR)
|
||||
#define lwsl_wsi_err(_w, ...) lwsl_wsi(_w, LLL_ERR, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_wsi_err(_w, ...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_WARN)
|
||||
#define lwsl_wsi_warn(_w, ...) lwsl_wsi(_w, LLL_WARN, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_wsi_warn(_w, ...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_NOTICE)
|
||||
#define lwsl_wsi_notice(_w, ...) lwsl_wsi(_w, LLL_NOTICE, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_wsi_notice(_w, ...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_INFO)
|
||||
#define lwsl_wsi_info(_w, ...) lwsl_wsi(_w, LLL_INFO, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_wsi_info(_w, ...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_DEBUG)
|
||||
#define lwsl_wsi_debug(_w, ...) lwsl_wsi(_w, LLL_DEBUG, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_wsi_debug(_w, ...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_PARSER)
|
||||
#define lwsl_wsi_parser(_w, ...) lwsl_wsi(_w, LLL_PARSER, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_wsi_parser(_w, ...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_HEADER)
|
||||
#define lwsl_wsi_header(_w, ...) lwsl_wsi(_w, LLL_HEADER, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_wsi_header(_w, ...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_EXT)
|
||||
#define lwsl_wsi_ext(_w, ...) lwsl_wsi(_w, LLL_EXT, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_wsi_ext(_w, ...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_CLIENT)
|
||||
#define lwsl_wsi_client(_w, ...) lwsl_wsi(_w, LLL_CLIENT, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_wsi_client(_w, ...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_LATENCY)
|
||||
#define lwsl_wsi_latency(_w, ...) lwsl_wsi(_w, LLL_LATENCY, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_wsi_latency(_w, ...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_THREAD)
|
||||
#define lwsl_wsi_thread(_w, ...) lwsl_wsi(_w, LLL_THREAD, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_wsi_thread(_w, ...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_USER)
|
||||
#define lwsl_wsi_user(_w, ...) lwsl_wsi(_w, LLL_USER, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_wsi_user(_w, ...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#define lwsl_hexdump_wsi_err(_v, ...) lwsl_hexdump_wsi(_v, LLL_ERR, __VA_ARGS__)
|
||||
#define lwsl_hexdump_wsi_warn(_v, ...) lwsl_hexdump_wsi(_v, LLL_WARN, __VA_ARGS__)
|
||||
#define lwsl_hexdump_wsi_notice(_v, ...) lwsl_hexdump_wsi(_v, LLL_NOTICE, __VA_ARGS__)
|
||||
#define lwsl_hexdump_wsi_info(_v, ...) lwsl_hexdump_wsi(_v, LLL_INFO, __VA_ARGS__)
|
||||
#define lwsl_hexdump_wsi_debug(_v, ...) lwsl_hexdump_wsi(_v, LLL_DEBUG, __VA_ARGS__)
|
||||
|
||||
|
||||
/*
|
||||
* lwsl_ss
|
||||
*/
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_ERR)
|
||||
#define lwsl_ss_err(_w, ...) lwsl_ss(_w, LLL_ERR, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_ss_err(_w, ...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_WARN)
|
||||
#define lwsl_ss_warn(_w, ...) lwsl_ss(_w, LLL_WARN, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_ss_warn(_w, ...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_NOTICE)
|
||||
#define lwsl_ss_notice(_w, ...) lwsl_ss(_w, LLL_NOTICE, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_ss_notice(_w, ...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_INFO)
|
||||
#define lwsl_ss_info(_w, ...) lwsl_ss(_w, LLL_INFO, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_ss_info(_w, ...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_DEBUG)
|
||||
#define lwsl_ss_debug(_w, ...) lwsl_ss(_w, LLL_DEBUG, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_ss_debug(_w, ...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_PARSER)
|
||||
#define lwsl_ss_parser(_w, ...) lwsl_ss(_w, LLL_PARSER, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_ss_parser(_w, ...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_HEADER)
|
||||
#define lwsl_ss_header(_w, ...) lwsl_ss(_w, LLL_HEADER, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_ss_header(_w, ...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_EXT)
|
||||
#define lwsl_ss_ext(_w, ...) lwsl_ss(_w, LLL_EXT, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_ss_ext(_w, ...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_CLIENT)
|
||||
#define lwsl_ss_client(_w, ...) lwsl_ss(_w, LLL_CLIENT, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_ss_client(_w, ...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_LATENCY)
|
||||
#define lwsl_ss_latency(_w, ...) lwsl_ss(_w, LLL_LATENCY, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_ss_latency(_w, ...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_THREAD)
|
||||
#define lwsl_ss_thread(_w, ...) lwsl_ss(_w, LLL_THREAD, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_ss_thread(_w, ...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_USER)
|
||||
#define lwsl_ss_user(_w, ...) lwsl_ss(_w, LLL_USER, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_ss_user(_w, ...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#define lwsl_hexdump_ss_err(_v, ...) lwsl_hexdump_ss(_v, LLL_ERR, __VA_ARGS__)
|
||||
#define lwsl_hexdump_ss_warn(_v, ...) lwsl_hexdump_ss(_v, LLL_WARN, __VA_ARGS__)
|
||||
#define lwsl_hexdump_ss_notice(_v, ...) lwsl_hexdump_ss(_v, LLL_NOTICE, __VA_ARGS__)
|
||||
#define lwsl_hexdump_ss_info(_v, ...) lwsl_hexdump_ss(_v, LLL_INFO, __VA_ARGS__)
|
||||
#define lwsl_hexdump_ss_debug(_v, ...) lwsl_hexdump_ss(_v, LLL_DEBUG, __VA_ARGS__)
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* lwsl_hexdump_level() - helper to hexdump a buffer at a selected debug level
|
||||
*
|
||||
* \param level: one of LLL_ constants
|
||||
* \param vbuf: buffer start to dump
|
||||
* \param len: length of buffer to dump
|
||||
*
|
||||
* If \p level is visible, does a nice hexdump -C style dump of \p vbuf for
|
||||
* \p len bytes. This can be extremely convenient while debugging.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lwsl_hexdump_level(int level, const void *vbuf, size_t len);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lwsl_hexdump_level_cx(lws_log_cx_t *cx, lws_log_prepend_cx_t prep, void *obj,
|
||||
int hexdump_level, const void *vbuf, size_t len);
|
||||
|
||||
/**
|
||||
* lwsl_hexdump() - helper to hexdump a buffer (DEBUG builds only)
|
||||
*
|
||||
* \param buf: buffer start to dump
|
||||
* \param len: length of buffer to dump
|
||||
*
|
||||
* Calls through to lwsl_hexdump_level(LLL_DEBUG, ... for compatability.
|
||||
* It's better to use lwsl_hexdump_level(level, ... directly so you can control
|
||||
* the visibility.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lwsl_hexdump(const void *buf, size_t len);
|
||||
|
||||
/**
|
||||
* lws_is_be() - returns nonzero if the platform is Big Endian
|
||||
*/
|
||||
static LWS_INLINE int lws_is_be(void) {
|
||||
const int probe = ~0xff;
|
||||
|
||||
return *(const char *)&probe;
|
||||
}
|
||||
|
||||
/**
|
||||
* lws_set_log_level() - Set the logging bitfield
|
||||
* \param level: OR together the LLL_ debug contexts you want output from
|
||||
* \param log_emit_function: NULL to leave it as it is, or a user-supplied
|
||||
* function to perform log string emission instead of
|
||||
* the default stderr one.
|
||||
*
|
||||
* log level defaults to "err", "warn" and "notice" contexts enabled and
|
||||
* emission on stderr. If stderr is a tty (according to isatty()) then
|
||||
* the output is coloured according to the log level using ANSI escapes.
|
||||
*
|
||||
* You can set the default security level for logging using the
|
||||
* secrecy_and_log_level() macro to set the \p level parameter, eg
|
||||
*
|
||||
* lws_set_log_level(secrecy_and_log_level(LWS_SECRECY_PII, LLL_ERR | LLL_WARN),
|
||||
* my_emit_function);
|
||||
*
|
||||
* Normally you can just leave it at the default.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_set_log_level(int level, lws_log_emit_t log_emit_function);
|
||||
|
||||
/**
|
||||
* lwsl_emit_syslog() - helper log emit function writes to system log
|
||||
*
|
||||
* \param level: one of LLL_ log level indexes
|
||||
* \param line: log string
|
||||
*
|
||||
* You use this by passing the function pointer to lws_set_log_level(), to set
|
||||
* it as the log emit function, it is not called directly.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lwsl_emit_syslog(int level, const char *line);
|
||||
|
||||
/**
|
||||
* lwsl_emit_stderr() - helper log emit function writes to stderr
|
||||
*
|
||||
* \param level: one of LLL_ log level indexes
|
||||
* \param line: log string
|
||||
*
|
||||
* You use this by passing the function pointer to lws_set_log_level(), to set
|
||||
* it as the log emit function, it is not called directly.
|
||||
*
|
||||
* It prepends a system timestamp like [2018/11/13 07:41:57:3989]
|
||||
*
|
||||
* If stderr is a tty, then ansi colour codes are added.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lwsl_emit_stderr(int level, const char *line);
|
||||
|
||||
/**
|
||||
* lwsl_emit_stderr_notimestamp() - helper log emit function writes to stderr
|
||||
*
|
||||
* \param level: one of LLL_ log level indexes
|
||||
* \param line: log string
|
||||
*
|
||||
* You use this by passing the function pointer to lws_set_log_level(), to set
|
||||
* it as the log emit function, it is not called directly.
|
||||
*
|
||||
* If stderr is a tty, then ansi colour codes are added.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lwsl_emit_stderr_notimestamp(int level, const char *line);
|
||||
|
||||
/**
|
||||
* lwsl_visible() - returns true if the log level should be printed
|
||||
*
|
||||
* \param level: one of LLL_ log level indexes
|
||||
*
|
||||
* This is useful if you have to do work to generate the log content, you
|
||||
* can skip the work if the log level used to print it is not actually
|
||||
* enabled at runtime.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lwsl_visible(int level);
|
||||
|
||||
struct lws;
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN const char *
|
||||
lws_wsi_tag(struct lws *wsi);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lwsl_refcount_cx(lws_log_cx_t *cx, int _new);
|
||||
|
||||
///@}
|
||||
290
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-lwsac.h
Normal file
290
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-lwsac.h
Normal file
@ -0,0 +1,290 @@
|
||||
/*
|
||||
* libwebsockets - small server side websockets and web server implementation
|
||||
*
|
||||
* Copyright (C) 2010 - 2020 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
/** \defgroup lwsac lwsac
|
||||
*
|
||||
* ##Allocated Chunks
|
||||
*
|
||||
* If you know you will be allocating a large, unknown number of same or
|
||||
* differently sized objects, it's certainly possible to do it with libc
|
||||
* malloc. However the allocation cost in time and memory overhead can
|
||||
* add up, and deallocation means walking the structure of every object and
|
||||
* freeing them in turn.
|
||||
*
|
||||
* lwsac (LWS Allocated Chunks) allocates chunks intended to be larger
|
||||
* than your objects (4000 bytes by default) which you linearly allocate from
|
||||
* using lwsac_use().
|
||||
*
|
||||
* If your next request won't fit in the current chunk, a new chunk is added
|
||||
* to the chain of chunks and the allocaton done from there. If the request
|
||||
* is larger than the chunk size, an oversize chunk is created to satisfy it.
|
||||
*
|
||||
* When you are finished with the allocations, you call lwsac_free() and
|
||||
* free all the *chunks*. So you may have thousands of objects in the chunks,
|
||||
* but they are all destroyed with the chunks without having to deallocate them
|
||||
* one by one pointlessly.
|
||||
*/
|
||||
///@{
|
||||
|
||||
struct lwsac;
|
||||
typedef unsigned char * lwsac_cached_file_t;
|
||||
|
||||
|
||||
#define lws_list_ptr_container(P,T,M) ((T *)((char *)(P) - offsetof(T, M)))
|
||||
|
||||
/*
|
||||
* linked-list helper that's commonly useful to manage lists of things
|
||||
* allocated using lwsac.
|
||||
*
|
||||
* These lists point to their corresponding "next" member in the target, NOT
|
||||
* the original containing struct. To get the containing struct, you must use
|
||||
* lws_list_ptr_container() to convert.
|
||||
*
|
||||
* It's like that because it means we no longer have to have the next pointer
|
||||
* at the start of the struct, and we can have the same struct on multiple
|
||||
* linked-lists with everything held in the struct itself.
|
||||
*/
|
||||
typedef void * lws_list_ptr;
|
||||
|
||||
/*
|
||||
* optional sorting callback called by lws_list_ptr_insert() to sort the right
|
||||
* things inside the opqaue struct being sorted / inserted on the list.
|
||||
*/
|
||||
typedef int (*lws_list_ptr_sort_func_t)(lws_list_ptr a, lws_list_ptr b);
|
||||
|
||||
#define lws_list_ptr_advance(_lp) _lp = *((void **)_lp)
|
||||
|
||||
/* sort may be NULL if you don't care about order */
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_list_ptr_insert(lws_list_ptr *phead, lws_list_ptr *add,
|
||||
lws_list_ptr_sort_func_t sort);
|
||||
|
||||
|
||||
/**
|
||||
* lwsac_use - allocate / use some memory from a lwsac
|
||||
*
|
||||
* \param head: pointer to the lwsac list object
|
||||
* \param ensure: the number of bytes we want to use
|
||||
* \param chunk_size: 0, or the size of the chunk to (over)allocate if
|
||||
* what we want won't fit in the current tail chunk. If
|
||||
* 0, the default value of 4000 is used. If ensure is
|
||||
* larger, it is used instead.
|
||||
*
|
||||
* This also serves to init the lwsac if *head is NULL. Basically it does
|
||||
* whatever is necessary to return you a pointer to ensure bytes of memory
|
||||
* reserved for the caller.
|
||||
*
|
||||
* This always allocates in the current chunk or a new chunk... see the
|
||||
* lwsac_use_backfill() variant to try first to find space in earlier chunks.
|
||||
*
|
||||
* Returns NULL if OOM.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void *
|
||||
lwsac_use(struct lwsac **head, size_t ensure, size_t chunk_size);
|
||||
|
||||
/**
|
||||
* lwsac_use_backfill - allocate / use some memory from a lwsac
|
||||
*
|
||||
* \param head: pointer to the lwsac list object
|
||||
* \param ensure: the number of bytes we want to use
|
||||
* \param chunk_size: 0, or the size of the chunk to (over)allocate if
|
||||
* what we want won't fit in the current tail chunk. If
|
||||
* 0, the default value of 4000 is used. If ensure is
|
||||
* larger, it is used instead.
|
||||
*
|
||||
* This also serves to init the lwsac if *head is NULL. Basically it does
|
||||
* whatever is necessary to return you a pointer to ensure bytes of memory
|
||||
* reserved for the caller.
|
||||
*
|
||||
* Also checks if earlier blocks have enough remaining space to take the
|
||||
* allocation before making a new allocation.
|
||||
*
|
||||
* Returns NULL if OOM.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void *
|
||||
lwsac_use_backfill(struct lwsac **head, size_t ensure, size_t chunk_size);
|
||||
|
||||
/**
|
||||
* lwsac_use - allocate / use some memory from a lwsac
|
||||
*
|
||||
* \param head: pointer to the lwsac list object
|
||||
* \param ensure: the number of bytes we want to use, which must be zeroed
|
||||
* \param chunk_size: 0, or the size of the chunk to (over)allocate if
|
||||
* what we want won't fit in the current tail chunk. If
|
||||
* 0, the default value of 4000 is used. If ensure is
|
||||
* larger, it is used instead.
|
||||
*
|
||||
* Same as lwsac_use(), but \p ensure bytes of memory at the return address
|
||||
* are zero'd before returning.
|
||||
*
|
||||
* Returns NULL if OOM.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void *
|
||||
lwsac_use_zero(struct lwsac **head, size_t ensure, size_t chunk_size);
|
||||
|
||||
#define lwsac_use_zeroed lwsac_use_zero
|
||||
|
||||
/**
|
||||
* lwsac_free - deallocate all chunks in the lwsac and set head NULL
|
||||
*
|
||||
* \param head: pointer to the lwsac list object
|
||||
*
|
||||
* This deallocates all chunks in the lwsac, then sets *head to NULL. All
|
||||
* lwsac_use() pointers are invalidated in one hit without individual frees.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lwsac_free(struct lwsac **head);
|
||||
|
||||
/*
|
||||
* Optional helpers useful for where consumers may need to defer destruction
|
||||
* until all consumers are finished with the lwsac
|
||||
*/
|
||||
|
||||
/**
|
||||
* lwsac_detach() - destroy an lwsac unless somebody else is referencing it
|
||||
*
|
||||
* \param head: pointer to the lwsac list object
|
||||
*
|
||||
* The creator of the lwsac can all this instead of lwsac_free() when it itself
|
||||
* has finished with the lwsac, but other code may be consuming it.
|
||||
*
|
||||
* If there are no other references, the lwsac is destroyed, *head is set to
|
||||
* NULL and that's the end; however if something else has called
|
||||
* lwsac_reference() on the lwsac, it simply returns. When lws_unreference()
|
||||
* is called and no references are left, it will be destroyed then.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lwsac_detach(struct lwsac **head);
|
||||
|
||||
/**
|
||||
* lwsac_reference() - increase the lwsac reference count
|
||||
*
|
||||
* \param head: pointer to the lwsac list object
|
||||
*
|
||||
* Increment the reference count on the lwsac to defer destruction.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lwsac_reference(struct lwsac *head);
|
||||
|
||||
/**
|
||||
* lwsac_unreference() - decrease the lwsac reference count
|
||||
*
|
||||
* \param head: pointer to the lwsac list object
|
||||
*
|
||||
* Decrement the reference count on the lwsac... if it reached 0 on a detached
|
||||
* lwsac then the lwsac is immediately destroyed and *head set to NULL.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lwsac_unreference(struct lwsac **head);
|
||||
|
||||
/**
|
||||
* lwsac_extend() - try to increase the size of the last block
|
||||
*
|
||||
* \param head: pointer to the lwsac list object
|
||||
* \param amount: amount to try to increase usage for
|
||||
*
|
||||
* This will either increase the usage reservation of the last allocated block
|
||||
* by amount and return 0, or fail and return 1.
|
||||
*
|
||||
* This is very cheap to call and is designed to optimize usage after a static
|
||||
* struct for vari-sized additional content which may flow into an additional
|
||||
* block in a new chunk if necessary, but wants to make the most of the space
|
||||
* in front of it first to try to avoid gaps and the new chunk if it can.
|
||||
*
|
||||
* The additional area if the call succeeds will have been memset to 0.
|
||||
*
|
||||
* To use it, the following must be true:
|
||||
*
|
||||
* - only the last lwsac use can be extended
|
||||
*
|
||||
* - if another use happens inbetween the use and extend, it will break
|
||||
*
|
||||
* - the use cannot have been using backfill
|
||||
*
|
||||
* - a user object must be tracking the current allocated size of the last use
|
||||
* (lwsac doesn't know it) and increment by amount if the extend call succeeds
|
||||
*
|
||||
* Despite these restrictions this can be an important optimization for some
|
||||
* cases
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lwsac_extend(struct lwsac *head, size_t amount);
|
||||
|
||||
/* helpers to keep a file cached in memory */
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lwsac_use_cached_file_start(lwsac_cached_file_t cache);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lwsac_use_cached_file_end(lwsac_cached_file_t *cache);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lwsac_use_cached_file_detach(lwsac_cached_file_t *cache);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lwsac_cached_file(const char *filepath, lwsac_cached_file_t *cache,
|
||||
size_t *len);
|
||||
|
||||
/* more advanced helpers */
|
||||
|
||||
/* offset from lac to start of payload, first = 1 = first lac in chain */
|
||||
LWS_VISIBLE LWS_EXTERN size_t
|
||||
lwsac_sizeof(int first);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN size_t
|
||||
lwsac_get_tail_pos(struct lwsac *lac);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN struct lwsac *
|
||||
lwsac_get_next(struct lwsac *lac);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN size_t
|
||||
lwsac_align(size_t length);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lwsac_info(struct lwsac *head);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN uint64_t
|
||||
lwsac_total_alloc(struct lwsac *head);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN uint64_t
|
||||
lwsac_total_overhead(struct lwsac *head);
|
||||
|
||||
/**
|
||||
* lwsac_scan_extant() - returns existing copy of blob, or NULL
|
||||
*
|
||||
* \param head: the lwsac to scan
|
||||
* \param find: the blob to look for
|
||||
* \param len: the length of the blob to look for
|
||||
* \param nul: nonzero if the next byte must be NUL
|
||||
*
|
||||
* Helper that looks through a whole lwsac for a given binary blob already
|
||||
* present. Used in the case that lwsac contents are const once written, and
|
||||
* strings or blobs may be repeated in the input: this allows the earlier
|
||||
* copy to be pointed to by subsequent references without repeating the string
|
||||
* or blob redundantly.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN uint8_t *
|
||||
lwsac_scan_extant(struct lwsac *head, uint8_t *find, size_t len, int nul);
|
||||
|
||||
///@}
|
||||
188
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-map.h
Normal file
188
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-map.h
Normal file
@ -0,0 +1,188 @@
|
||||
/*
|
||||
* libwebsockets - small server side websockets and web server implementation
|
||||
*
|
||||
* Copyright (C) 2010 - 2021 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
/** \defgroup lws_map generic map apis
|
||||
* ##Generic map structures and apis
|
||||
* \ingroup lwsapi
|
||||
*
|
||||
* lws_map
|
||||
*
|
||||
* Discrete owner object represents the whole map, created with key-specific
|
||||
* ops for hashing the key to a uint32_t and comparing two keys. Owns a list
|
||||
* of hash tables whose size / modulo it set at creation time.
|
||||
*
|
||||
* Items in the map are contained in a lws_map_item_t that is indexed in a
|
||||
* hash table.
|
||||
*
|
||||
* It's difficult to make a single compact map abstraction that fits all cases,
|
||||
* this is useful to the extent you have the memory to trade off the number of
|
||||
* hashtables needed for the amount of items and the lookup latency limit for
|
||||
* your application, typically for hundreds or low thousands of items.
|
||||
*/
|
||||
//@{
|
||||
|
||||
typedef struct lws_map lws_map_t;
|
||||
struct lws_map_item;
|
||||
|
||||
typedef void * lws_map_key_t;
|
||||
typedef void * lws_map_value_t;
|
||||
typedef uint32_t lws_map_hash_t;
|
||||
|
||||
typedef lws_map_hash_t (*lws_map_hash_from_key_t)(const lws_map_key_t key,
|
||||
size_t kl);
|
||||
typedef int (*lws_map_compare_key_t)(const lws_map_key_t key1, size_t kl1,
|
||||
const lws_map_value_t key2, size_t kl2);
|
||||
typedef void * (*lws_map_alloc_t)(struct lws_map *mo, size_t x);
|
||||
typedef void (*lws_map_free_t)(void *);
|
||||
|
||||
/*
|
||||
* Creation parameters for the map, copied into the map owner
|
||||
*/
|
||||
|
||||
typedef struct lws_map_info {
|
||||
lws_map_hash_from_key_t _hash;
|
||||
lws_map_compare_key_t _compare;
|
||||
lws_map_alloc_t _alloc; /* NULL = lws_malloc */
|
||||
lws_map_free_t _free; /* NULL = lws_free */
|
||||
|
||||
void *opaque;
|
||||
/**< &lwsac if using lwsac allocator */
|
||||
void *aux;
|
||||
/**< chunk size if using lwsac allocator */
|
||||
/**< this can be used by the alloc handler, eg for lws_ac */
|
||||
size_t modulo;
|
||||
/**< number of hashed owner lists to create */
|
||||
} lws_map_info_t;
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN const void *
|
||||
lws_map_item_key(struct lws_map_item *_item);
|
||||
LWS_VISIBLE LWS_EXTERN const void *
|
||||
lws_map_item_value(struct lws_map_item *_item);
|
||||
LWS_VISIBLE LWS_EXTERN size_t
|
||||
lws_map_item_key_len(struct lws_map_item *_item);
|
||||
LWS_VISIBLE LWS_EXTERN size_t
|
||||
lws_map_item_value_len(struct lws_map_item *_item);
|
||||
|
||||
/*
|
||||
* Helpers for C string keys case
|
||||
*/
|
||||
|
||||
#define lws_map_item_create_ks(_map, _str, _v, _vl) \
|
||||
lws_map_item_create(_map, (const lws_map_key_t)_str, \
|
||||
strlen(_str), (const lws_map_value_t)_v, \
|
||||
_vl)
|
||||
#define lws_map_item_lookup_ks(_map, _str) \
|
||||
lws_map_item_lookup(_map, (const lws_map_key_t)_str, strlen(_str))
|
||||
|
||||
/**
|
||||
* lws_map_create() - create a map object and hashtables on heap
|
||||
*
|
||||
* \param info: description of map to create
|
||||
*
|
||||
* Creates a map object on heap, using lws_malloc().
|
||||
*
|
||||
* \p info may be all zeros inside, if so, modulo defaults to 8, and the
|
||||
* operation callbacks default to using lws_malloc() / _free() for item alloc,
|
||||
* a default xor / shift based hash and simple linear memory key compare.
|
||||
*
|
||||
* For less typical use-cases, the provided \p info members can be tuned to
|
||||
* control how the allocation of mapped items is done, lws provides two exports
|
||||
* lws_map_alloc_lwsac() and lws_map_free_lwsac() that can be used for _alloc
|
||||
* and _free to have items allocated inside an lwsac.
|
||||
*
|
||||
* The map itself is created on the heap directly, the info._alloc() op is only
|
||||
* used when creating items.
|
||||
*
|
||||
* keys have individual memory sizes and do not need to all be the same length.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN lws_map_t *
|
||||
lws_map_create(const lws_map_info_t *info);
|
||||
|
||||
/*
|
||||
* helpers that can be used for info._alloc and info._free if using lwsac
|
||||
* allocation for items, set info.opaque to point to the lwsac pointer, and
|
||||
* aux to (void *)chunksize, or leave zero / NULL for the default
|
||||
*/
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void *
|
||||
lws_map_alloc_lwsac(struct lws_map *map, size_t x);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_map_free_lwsac(void *v);
|
||||
|
||||
/**
|
||||
* lws_map_destroy() - deallocate all items and free map
|
||||
*
|
||||
* \param pmap: pointer to pointer map object to deallocate
|
||||
*
|
||||
* Frees all items in the map, using info._free(), and then frees the map
|
||||
* from heap directly. \p *pmap is set to NULL.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_map_destroy(lws_map_t **pmap);
|
||||
|
||||
/**
|
||||
* lws_map_item_create() - allocate and map an item into an existing map
|
||||
*
|
||||
* \param map: the map to add items into
|
||||
* \param key: the key, may be any kind of object
|
||||
* \param keylen: the length of the key in bytes
|
||||
* \param value: the value, may be any kind of object
|
||||
* \param valuelen: the length of value
|
||||
*
|
||||
* Allocates space for the item, key and value using the map allocator, and
|
||||
* if non-NULL, copies the key and value into the item.
|
||||
*
|
||||
* If an item with the same key exists, it is removed and destroyed before
|
||||
* creating and adding the new one.
|
||||
*/
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN struct lws_map_item *
|
||||
lws_map_item_create(lws_map_t *map,
|
||||
const lws_map_key_t key, size_t keylen,
|
||||
const lws_map_value_t value, size_t valuelen);
|
||||
|
||||
/**
|
||||
* lws_map_item_destroy() - remove item from map and free
|
||||
*
|
||||
* \param item: the item in the map to remove and free
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_map_item_destroy(struct lws_map_item *item);
|
||||
|
||||
/**
|
||||
* lws_map_item_lookup() - look for a item with the given key in the map
|
||||
*
|
||||
* \param map: the map
|
||||
* \param key: the key to look for
|
||||
* \param keylen: the length of the key to look for
|
||||
*
|
||||
* Searches for the key in the map, using the map's key hash and key compare
|
||||
* functions.
|
||||
*/
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN struct lws_map_item *
|
||||
lws_map_item_lookup(lws_map_t *map, const lws_map_key_t key, size_t keylen);
|
||||
|
||||
//@}
|
||||
329
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-metrics.h
Normal file
329
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-metrics.h
Normal file
@ -0,0 +1,329 @@
|
||||
/*
|
||||
* libwebsockets - small server side websockets and web server implementation
|
||||
*
|
||||
* Copyright (C) 2010 - 2021 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*
|
||||
* Public apis related to metric collection and reporting
|
||||
*/
|
||||
|
||||
/* lws_metrics public part */
|
||||
|
||||
typedef uint64_t u_mt_t;
|
||||
|
||||
enum {
|
||||
LWSMTFL_REPORT_OUTLIERS = (1 << 0),
|
||||
/**< track outliers and report them internally */
|
||||
LWSMTFL_REPORT_OOB = (1 << 1),
|
||||
/**< report events as they happen */
|
||||
LWSMTFL_REPORT_INACTIVITY_AT_PERIODIC = (1 << 2),
|
||||
/**< explicitly externally report no activity at periodic cb, by
|
||||
* default no events in the period is just not reported */
|
||||
LWSMTFL_REPORT_MEAN = (1 << 3),
|
||||
/**< average/min/max is meaningful, else only sum is meaningful */
|
||||
LWSMTFL_REPORT_ONLY_GO = (1 << 4),
|
||||
/**< no-go pieces invalid */
|
||||
LWSMTFL_REPORT_DUTY_WALLCLOCK_US = (1 << 5),
|
||||
/**< aggregate compares to wallclock us for duty cycle */
|
||||
LWSMTFL_REPORT_HIST = (1 << 6),
|
||||
/**< our type is histogram (otherwise, sum / mean aggregation) */
|
||||
};
|
||||
|
||||
/*
|
||||
* lws_metrics_tag allows your object to accumulate OpenMetrics-style
|
||||
* descriptive tags before accounting for it with a metrics object at the end.
|
||||
*
|
||||
* Tags should represent low entropy information that is likely to repeat
|
||||
* identically, so, eg, http method name, not eg, latency in us which is
|
||||
* unlikely to be seen the same twice.
|
||||
*
|
||||
* Tags are just a list of name=value pairs, used for qualifying the final
|
||||
* metrics entry with decorations in additional dimensions. For example,
|
||||
* rather than keep individual metrics on methods, scheme, mountpoint, result
|
||||
* code, you can keep metrics on http transactions only, and qualify the
|
||||
* transaction metrics entries with tags that can be queried on the metrics
|
||||
* backend to get the finer-grained information.
|
||||
*
|
||||
* http_srv{code="404",mount="/",method="GET",scheme="http"} 3
|
||||
*
|
||||
* For OpenMetrics the tags are converted to a { list } and appended to the base
|
||||
* metrics name before using with actual metrics objects, the same set of tags
|
||||
* on different transactions resolve to the same qualification string.
|
||||
*/
|
||||
|
||||
typedef struct lws_metrics_tag {
|
||||
lws_dll2_t list;
|
||||
|
||||
const char *name; /* tag, intended to be in .rodata, not copied */
|
||||
/* overallocated value */
|
||||
} lws_metrics_tag_t;
|
||||
|
||||
LWS_EXTERN LWS_VISIBLE int
|
||||
lws_metrics_tag_add(lws_dll2_owner_t *owner, const char *name, const char *val);
|
||||
|
||||
#if defined(LWS_WITH_SYS_METRICS)
|
||||
/*
|
||||
* wsi-specific version that also appends the tag value to the lifecycle tag
|
||||
* used for logging the wsi identity
|
||||
*/
|
||||
LWS_EXTERN LWS_VISIBLE int
|
||||
lws_metrics_tag_wsi_add(struct lws *wsi, const char *name, const char *val);
|
||||
#else
|
||||
#define lws_metrics_tag_wsi_add(_a, _b, _c)
|
||||
#endif
|
||||
|
||||
#if defined(LWS_WITH_SECURE_STREAMS)
|
||||
/*
|
||||
* ss-specific version that also appends the tag value to the lifecycle tag
|
||||
* used for logging the ss identity
|
||||
*/
|
||||
#if defined(LWS_WITH_SYS_METRICS)
|
||||
LWS_EXTERN LWS_VISIBLE int
|
||||
lws_metrics_tag_ss_add(struct lws_ss_handle *ss, const char *name, const char *val);
|
||||
#else
|
||||
#define lws_metrics_tag_ss_add(_a, _b, _c)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
LWS_EXTERN LWS_VISIBLE void
|
||||
lws_metrics_tags_destroy(lws_dll2_owner_t *owner);
|
||||
|
||||
LWS_EXTERN LWS_VISIBLE size_t
|
||||
lws_metrics_tags_serialize(lws_dll2_owner_t *owner, char *buf, size_t len);
|
||||
|
||||
LWS_EXTERN LWS_VISIBLE const char *
|
||||
lws_metrics_tag_get(lws_dll2_owner_t *owner, const char *name);
|
||||
|
||||
/* histogram bucket */
|
||||
|
||||
typedef struct lws_metric_bucket {
|
||||
struct lws_metric_bucket *next;
|
||||
uint64_t count;
|
||||
|
||||
/* name + NUL is overallocated */
|
||||
} lws_metric_bucket_t;
|
||||
|
||||
/* get overallocated name of bucket from bucket pointer */
|
||||
#define lws_metric_bucket_name_len(_b) (*((uint8_t *)&(_b)[1]))
|
||||
#define lws_metric_bucket_name(_b) (((const char *)&(_b)[1]) + 1)
|
||||
|
||||
/*
|
||||
* These represent persistent local event measurements. They may aggregate
|
||||
* a large number of events inbetween external dumping of summaries of the
|
||||
* period covered, in two different ways
|
||||
*
|
||||
* 1) aggregation by sum or mean, to absorb multiple scalar readings
|
||||
*
|
||||
* - go / no-go ratio counting
|
||||
* - mean averaging for, eg, latencies
|
||||
* - min / max for averaged values
|
||||
* - period the stats covers
|
||||
*
|
||||
* 2) aggregation by histogram, to absorb a range of outcomes that may occur
|
||||
* multiple times
|
||||
*
|
||||
* - add named buckets to histogram
|
||||
* - bucket has a 64-bit count
|
||||
* - bumping a bucket just increments the count if already exists, else adds
|
||||
* a new one with count set to 1
|
||||
*
|
||||
* The same type with a union covers both cases.
|
||||
*
|
||||
* The lws_system ops api that hooks lws_metrics up to a metrics backend is
|
||||
* given a pointer to these according to the related policy, eg, hourly, or
|
||||
* every event passed straight through.
|
||||
*/
|
||||
|
||||
typedef struct lws_metric_pub {
|
||||
const char *name;
|
||||
/**< eg, "n.cn.dns", "vh.myendpoint" */
|
||||
void *backend_opaque;
|
||||
/**< ignored by lws, backend handler completely owns it */
|
||||
|
||||
lws_usec_t us_first;
|
||||
/**< us time metric started collecting, reset to us_dumped at dump */
|
||||
lws_usec_t us_last;
|
||||
/**< 0, or us time last event, reset to 0 at last dump */
|
||||
lws_usec_t us_dumped;
|
||||
/**< 0 if never, else us time of last dump to external api */
|
||||
|
||||
/* scope of data in .u is "since last dump" --> */
|
||||
|
||||
union {
|
||||
/* aggregation, by sum or mean */
|
||||
|
||||
struct {
|
||||
u_mt_t sum[2];
|
||||
/**< go, no-go summed for mean or plan sum */
|
||||
u_mt_t min;
|
||||
/**< smallest individual measurement */
|
||||
u_mt_t max;
|
||||
/**< largest individual measurement */
|
||||
|
||||
uint32_t count[2];
|
||||
/**< go, no-go count of measurements in sum */
|
||||
} agg;
|
||||
|
||||
/* histogram with dynamic named buckets */
|
||||
|
||||
struct {
|
||||
lws_metric_bucket_t *head;
|
||||
/**< first bucket in our bucket list */
|
||||
|
||||
uint64_t total_count;
|
||||
/**< total count in all of our buckets */
|
||||
uint32_t list_size;
|
||||
/**< number of buckets in our bucket list */
|
||||
} hist;
|
||||
} u;
|
||||
|
||||
uint8_t flags;
|
||||
|
||||
} lws_metric_pub_t;
|
||||
|
||||
LWS_EXTERN LWS_VISIBLE void
|
||||
lws_metrics_hist_bump_priv_tagged(lws_metric_pub_t *mt, lws_dll2_owner_t *tow,
|
||||
lws_dll2_owner_t *tow2);
|
||||
|
||||
|
||||
/*
|
||||
* Calipers are a helper struct for implementing "hanging latency" detection,
|
||||
* where setting the start time and finding the end time may happen in more than
|
||||
* one place.
|
||||
*
|
||||
* There are convenience wrappers to eliminate caliper definitions and code
|
||||
* cleanly if WITH_SYS_METRICS is disabled for the build.
|
||||
*/
|
||||
|
||||
struct lws_metric;
|
||||
|
||||
typedef struct lws_metric_caliper {
|
||||
struct lws_dll2_owner mtags_owner; /**< collect tags here during
|
||||
* caliper lifetime */
|
||||
struct lws_metric *mt; /**< NULL == inactive */
|
||||
lws_usec_t us_start;
|
||||
} lws_metric_caliper_t;
|
||||
|
||||
#if defined(LWS_WITH_SYS_METRICS)
|
||||
#define lws_metrics_caliper_compose(_name) \
|
||||
lws_metric_caliper_t _name;
|
||||
#define lws_metrics_caliper_bind(_name, _mt) \
|
||||
{ if (_name.mt) { \
|
||||
lwsl_err("caliper: overwrite %s\n", \
|
||||
lws_metrics_priv_to_pub(_name.mt)->name); \
|
||||
assert(0); } \
|
||||
_name.mt = _mt; _name.us_start = lws_now_usecs(); }
|
||||
#define lws_metrics_caliper_declare(_name, _mt) \
|
||||
lws_metric_caliper_t _name = { .mt = _mt, .us_start = lws_now_usecs() }
|
||||
#define lws_metrics_caliper_report(_name, _go_nogo) \
|
||||
{ if (_name.us_start) { lws_metric_event(_name.mt, _go_nogo, \
|
||||
(u_mt_t)(lws_now_usecs() - \
|
||||
_name.us_start)); \
|
||||
} lws_metrics_caliper_done(_name); }
|
||||
#define lws_metrics_caliper_report_hist(_name, pwsi) if (_name.mt) { \
|
||||
lws_metrics_hist_bump_priv_tagged(lws_metrics_priv_to_pub(_name.mt), \
|
||||
&_name.mtags_owner, \
|
||||
pwsi ? &((pwsi)->cal_conn.mtags_owner) : NULL); \
|
||||
lws_metrics_caliper_done(_name); }
|
||||
|
||||
#define lws_metrics_caliper_cancel(_name) { lws_metrics_caliper_done(_name); }
|
||||
#define lws_metrics_hist_bump(_mt, _name) \
|
||||
lws_metrics_hist_bump_(_mt, _name)
|
||||
#define lws_metrics_hist_bump_priv(_mt, _name) \
|
||||
lws_metrics_hist_bump_(lws_metrics_priv_to_pub(_mt), _name)
|
||||
#define lws_metrics_caliper_done(_name) { \
|
||||
_name.us_start = 0; _name.mt = NULL; \
|
||||
lws_metrics_tags_destroy(&_name.mtags_owner); }
|
||||
#else
|
||||
#define lws_metrics_caliper_compose(_name)
|
||||
#define lws_metrics_caliper_bind(_name, _mt)
|
||||
#define lws_metrics_caliper_declare(_name, _mp)
|
||||
#define lws_metrics_caliper_report(_name, _go_nogo)
|
||||
#define lws_metrics_caliper_report_hist(_name, pwsiconn)
|
||||
#define lws_metrics_caliper_cancel(_name)
|
||||
#define lws_metrics_hist_bump(_mt, _name)
|
||||
#define lws_metrics_hist_bump_priv(_mt, _name)
|
||||
#define lws_metrics_caliper_done(_name)
|
||||
#endif
|
||||
|
||||
/**
|
||||
* lws_metrics_format() - helper to format a metrics object for logging
|
||||
*
|
||||
* \param pub: public part of metrics object
|
||||
* \param buf: output buffer to place string in
|
||||
* \param len: available length of \p buf
|
||||
*
|
||||
* Helper for describing the state of a metrics object as a human-readable
|
||||
* string, accounting for how its flags indicate what it contains. This is not
|
||||
* how you would report metrics, but during development it can be useful to
|
||||
* log them inbetween possibily long report intervals.
|
||||
*
|
||||
* It uses the metric's flags to adapt the format shown appropriately, eg,
|
||||
* as a histogram if LWSMTFL_REPORT_HIST etc
|
||||
*/
|
||||
LWS_EXTERN LWS_VISIBLE int
|
||||
lws_metrics_format(lws_metric_pub_t *pub, lws_metric_bucket_t **sub,
|
||||
char *buf, size_t len);
|
||||
|
||||
/**
|
||||
* lws_metrics_hist_bump() - add or increment histogram bucket
|
||||
*
|
||||
* \param pub: public part of metrics object
|
||||
* \param name: bucket name to increment
|
||||
*
|
||||
* Either increment the count of an existing bucket of the right name in the
|
||||
* metrics object, or add a new bucket of the given name and set its count to 1.
|
||||
*
|
||||
* The metrics object must have been created with flag LWSMTFL_REPORT_HIST
|
||||
*
|
||||
* Normally, you will actually use the preprocessor wrapper
|
||||
* lws_metrics_hist_bump() defined above, since this automatically takes care of
|
||||
* removing itself from the build if WITH_SYS_METRICS is not defined, without
|
||||
* needing any preprocessor conditionals.
|
||||
*/
|
||||
LWS_EXTERN LWS_VISIBLE int
|
||||
lws_metrics_hist_bump_(lws_metric_pub_t *pub, const char *name);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_metrics_foreach(struct lws_context *ctx, void *user,
|
||||
int (*cb)(lws_metric_pub_t *pub, void *user));
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_metrics_hist_bump_describe_wsi(struct lws *wsi, lws_metric_pub_t *pub,
|
||||
const char *name);
|
||||
|
||||
enum {
|
||||
LMT_NORMAL = 0, /* related to successful events */
|
||||
LMT_OUTLIER, /* related to successful events outside of bounds */
|
||||
|
||||
LMT_FAIL, /* related to failed events */
|
||||
|
||||
LMT_COUNT,
|
||||
};
|
||||
|
||||
typedef enum lws_metric_rpt {
|
||||
LMR_PERIODIC = 0, /* we are reporting on a schedule */
|
||||
LMR_OUTLIER, /* we are reporting the last outlier */
|
||||
} lws_metric_rpt_kind_t;
|
||||
|
||||
#define METRES_GO 0
|
||||
#define METRES_NOGO 1
|
||||
|
||||
|
||||
1264
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-misc.h
Normal file
1264
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-misc.h
Normal file
File diff suppressed because it is too large
Load Diff
381
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-mqtt.h
Normal file
381
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-mqtt.h
Normal file
@ -0,0 +1,381 @@
|
||||
/*
|
||||
* libwebsockets - protocol - mqtt
|
||||
*
|
||||
* Copyright (C) 2010 - 2021 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*
|
||||
* included from libwebsockets.h
|
||||
*/
|
||||
|
||||
#ifndef _LWS_MQTT_H
|
||||
#define _LWS_MQTT_H 1
|
||||
|
||||
struct _lws_mqtt_related;
|
||||
typedef struct _lws_mqtt_related lws_mqtt_related_t;
|
||||
struct lws_mqtt_str_st;
|
||||
typedef struct lws_mqtt_str_st lws_mqtt_str_t;
|
||||
|
||||
#define MQTT_VER_3_1_1 4
|
||||
|
||||
#define LWS_MQTT_FINAL_PART 1
|
||||
|
||||
#define LWS_MQTT_MAX_AWSIOT_TOPICLEN 256
|
||||
#define LWS_MQTT_MAX_TOPICLEN 65535
|
||||
#define LWS_MQTT_MAX_CIDLEN 128
|
||||
#define LWS_MQTT_RANDOM_CIDLEN 23 /* 3.1.3.1-5: Server MUST... between
|
||||
1 and 23 chars... */
|
||||
|
||||
#define LWS_MQTT_SHADOW_MAX_THING_LEN 128
|
||||
#define LWS_MQTT_SHADOW_MAX_SHADOW_LEN 64
|
||||
#define LWS_MQTT_SHADOW_UPDATE_STR "/update"
|
||||
#define LWS_MQTT_SHADOW_DELETE_STR "/delete"
|
||||
#define LWS_MQTT_SHADOW_GET_STR "/get"
|
||||
#define LWS_MQTT_SHADOW_RESP_ACCEPTED_STR "/accepted"
|
||||
#define LWS_MQTT_SHADOW_RESP_REJECTED_STR "/rejected"
|
||||
#define LWS_MQTT_SHADOW_RESP_DELTA_STR "/delta"
|
||||
#define LWS_MQTT_SHADOW_RESP_DOCUMENT_STR "/documents"
|
||||
#define LWS_MQTT_SHADOW_UPDATE_ACCEPTED_STR LWS_MQTT_SHADOW_UPDATE_STR LWS_MQTT_SHADOW_RESP_ACCEPTED_STR
|
||||
#define LWS_MQTT_SHADOW_UPDATE_REJECTED_STR LWS_MQTT_SHADOW_UPDATE_STR LWS_MQTT_SHADOW_RESP_REJECTED_STR
|
||||
#define LWS_MQTT_SHADOW_UPDATE_DELTA_STR LWS_MQTT_SHADOW_UPDATE_STR LWS_MQTT_SHADOW_RESP_DELTA_STR
|
||||
#define LWS_MQTT_SHADOW_UPDATE_DOCUMENT_STR LWS_MQTT_SHADOW_UPDATE_STR LWS_MQTT_SHADOW_RESP_DOCUMENT_STR
|
||||
#define LWS_MQTT_SHADOW_DELETE_ACCEPTED_STR LWS_MQTT_SHADOW_DELETE_STR LWS_MQTT_SHADOW_RESP_ACCEPTED_STR
|
||||
#define LWS_MQTT_SHADOW_DELETE_REJECTED_STR LWS_MQTT_SHADOW_DELETE_STR LWS_MQTT_SHADOW_RESP_REJECTED_STR
|
||||
#define LWS_MQTT_SHADOW_GET_ACCEPTED_STR LWS_MQTT_SHADOW_GET_STR LWS_MQTT_SHADOW_RESP_ACCEPTED_STR
|
||||
#define LWS_MQTT_SHADOW_GET_REJECTED_STR LWS_MQTT_SHADOW_GET_STR LWS_MQTT_SHADOW_RESP_REJECTED_STR
|
||||
#define LWS_MQTT_SHADOW_PREFIX_FORMAT "$aws/things/%s"
|
||||
#define LWS_MQTT_SHADOW_NAMED_SHADOW_TOPIC_FORMAT LWS_MQTT_SHADOW_PREFIX_FORMAT "/shadow/name/%s%s"
|
||||
#define LWS_MQTT_SHADOW_UNNAMED_SHADOW_TOPIC_FORMAT LWS_MQTT_SHADOW_PREFIX_FORMAT "/shadow%s"
|
||||
#define LWS_MQTT_SHADOW_UNNAMED_TOPIC_MATCH "$aws/things/+/shadow/+"
|
||||
#define LWS_MQTT_SHADOW_NAMED_TOPIC_MATCH "$aws/things/+/shadow/name/+/+"
|
||||
|
||||
typedef enum {
|
||||
QOS0,
|
||||
QOS1,
|
||||
QOS2, /* not supported */
|
||||
RESERVED_QOS_LEVEL,
|
||||
FAILURE_QOS_LEVEL = 0x80
|
||||
} lws_mqtt_qos_levels_t;
|
||||
|
||||
typedef union {
|
||||
struct {
|
||||
uint8_t retain:1;
|
||||
uint8_t qos:2;
|
||||
uint8_t dup:1;
|
||||
uint8_t ctrl_pkt_type:4;
|
||||
} flags;
|
||||
uint8_t bits;
|
||||
} lws_mqtt_fixed_hdr_t;
|
||||
|
||||
/*
|
||||
* MQTT connection parameters, passed into struct
|
||||
* lws_client_connect_info to establish a connection using
|
||||
* lws_client_connect_via_info().
|
||||
*/
|
||||
typedef struct lws_mqtt_client_connect_param_s {
|
||||
const char *client_id; /* Client ID */
|
||||
uint16_t keep_alive; /* MQTT keep alive
|
||||
interval in
|
||||
seconds */
|
||||
uint8_t clean_start:1; /* MQTT clean
|
||||
session */
|
||||
uint8_t client_id_nofree:1;
|
||||
/**< do not free the client id */
|
||||
uint8_t username_nofree:1;
|
||||
/**< do not free the username */
|
||||
uint8_t password_nofree:1;
|
||||
/**< do not free the password */
|
||||
struct {
|
||||
const char *topic;
|
||||
const char *message;
|
||||
lws_mqtt_qos_levels_t qos;
|
||||
uint8_t retain;
|
||||
} will_param; /* MQTT LWT
|
||||
parameters */
|
||||
struct {
|
||||
const char *topic;
|
||||
const char *message;
|
||||
lws_mqtt_qos_levels_t qos;
|
||||
uint8_t retain;
|
||||
} birth_param; /* MQTT Birth
|
||||
parameters */
|
||||
const char *username;
|
||||
const char *password;
|
||||
uint8_t aws_iot;
|
||||
} lws_mqtt_client_connect_param_t;
|
||||
|
||||
/*
|
||||
* MQTT publish parameters
|
||||
*/
|
||||
typedef struct lws_mqtt_publish_param_s {
|
||||
char *topic; /* Topic Name */
|
||||
uint16_t topic_len;
|
||||
const void *payload; /* Publish Payload */
|
||||
uint32_t payload_len; /* Size of the
|
||||
complete payload */
|
||||
uint32_t payload_pos; /* where we are in payload */
|
||||
lws_mqtt_qos_levels_t qos;
|
||||
|
||||
/*--v-Following will be used by LWS-v--*/
|
||||
uint16_t packet_id; /* Packet ID for QoS >
|
||||
0 */
|
||||
uint8_t dup:1; /* Retried PUBLISH,
|
||||
for QoS > 0 */
|
||||
uint8_t retain:1; /* Retained message */
|
||||
} lws_mqtt_publish_param_t;
|
||||
|
||||
typedef struct topic_elem {
|
||||
const char *name; /* Topic Name */
|
||||
lws_mqtt_qos_levels_t qos; /* Requested QoS */
|
||||
|
||||
/*--v-Following will be used by LWS-v--*/
|
||||
uint8_t acked;
|
||||
} lws_mqtt_topic_elem_t;
|
||||
|
||||
/*
|
||||
* MQTT publish parameters
|
||||
*/
|
||||
typedef struct lws_mqtt_subscribe_param_s {
|
||||
uint32_t num_topics; /* Number of topics */
|
||||
lws_mqtt_topic_elem_t *topic; /* Array of topic elements */
|
||||
|
||||
/*--v-Following will be used by LWS-v--*/
|
||||
uint16_t packet_id;
|
||||
} lws_mqtt_subscribe_param_t;
|
||||
|
||||
typedef enum {
|
||||
LMQCP_RESERVED,
|
||||
LMQCP_CTOS_CONNECT, /* Connection request */
|
||||
LMQCP_STOC_CONNACK, /* Connection acknowledgment */
|
||||
LMQCP_PUBLISH, /* Publish Message */
|
||||
LMQCP_PUBACK, /* QoS 1: Publish acknowledgment */
|
||||
LMQCP_PUBREC, /* QoS 2.1: Publish received */
|
||||
LMQCP_PUBREL, /* QoS 2.2: Publish release */
|
||||
LMQCP_PUBCOMP, /* QoS 2.3: Publish complete */
|
||||
LMQCP_CTOS_SUBSCRIBE, /* Subscribe request */
|
||||
LMQCP_STOC_SUBACK, /* Subscribe acknowledgment */
|
||||
LMQCP_CTOS_UNSUBSCRIBE, /* Unsubscribe request */
|
||||
LMQCP_STOC_UNSUBACK, /* Unsubscribe acknowledgment */
|
||||
LMQCP_CTOS_PINGREQ, /* PING request */
|
||||
LMQCP_STOC_PINGRESP, /* PONG response */
|
||||
LMQCP_DISCONNECT, /* Disconnect notification */
|
||||
LMQCP_AUTH /* Authentication exchange */
|
||||
} lws_mqtt_control_packet_t;
|
||||
|
||||
/* flags from byte 8 of C_TO_S CONNECT */
|
||||
typedef enum {
|
||||
LMQCFT_USERNAME_NOFREE = (1 << 10),
|
||||
LMQCFT_PASSWORD_NOFREE = (1 << 9),
|
||||
LMQCFT_CLIENT_ID_NOFREE = (1 << 8),
|
||||
/* only the low 8 are standardized and go out in the protocol */
|
||||
LMQCFT_USERNAME = (1 << 7),
|
||||
LMQCFT_PASSWORD = (1 << 6),
|
||||
LMQCFT_WILL_RETAIN = (1 << 5),
|
||||
LMQCFT_WILL_QOS = (1 << 3),
|
||||
LMQCFT_WILL_FLAG = (1 << 2),
|
||||
LMQCFT_CLEAN_START = (1 << 1),
|
||||
LMQCFT_RESERVED = (1 << 0),
|
||||
|
||||
LMQCFT_WILL_QOS_MASK = (3 << 3),
|
||||
} lws_mqtt_connect_flags_t;
|
||||
|
||||
/* flags for S_TO_C CONNACK */
|
||||
typedef enum {
|
||||
LMQCFT_SESSION_PRESENT = (1 << 0),
|
||||
} lws_mqtt_connack_flags_t;
|
||||
|
||||
typedef enum {
|
||||
LMQCP_REASON_SUCCESS = 0x00,
|
||||
LMQCP_REASON_NORMAL_DISCONNECTION = 0x00,
|
||||
LMQCP_REASON_GRANTED_QOS0 = 0x00,
|
||||
LMQCP_REASON_GRANTED_QOS1 = 0x01,
|
||||
LMQCP_REASON_GRANTED_QOS2 = 0x02,
|
||||
LMQCP_REASON_DISCONNECT_WILL = 0x04,
|
||||
LMQCP_REASON_NO_MATCHING_SUBSCRIBER = 0x10,
|
||||
LMQCP_REASON_NO_SUBSCRIPTION_EXISTED = 0x11,
|
||||
LMQCP_REASON_CONTINUE_AUTHENTICATION = 0x18,
|
||||
LMQCP_REASON_RE_AUTHENTICATE = 0x19,
|
||||
|
||||
LMQCP_REASON_UNSPECIFIED_ERROR = 0x80,
|
||||
LMQCP_REASON_MALFORMED_PACKET = 0x81,
|
||||
LMQCP_REASON_PROTOCOL_ERROR = 0x82,
|
||||
LMQCP_REASON_IMPLEMENTATION_SPECIFIC_ERROR = 0x83,
|
||||
|
||||
/* Begin - Error codes for CONNACK */
|
||||
LMQCP_REASON_UNSUPPORTED_PROTOCOL = 0x84,
|
||||
LMQCP_REASON_CLIENT_ID_INVALID = 0x85,
|
||||
LMQCP_REASON_BAD_CREDENTIALS = 0x86,
|
||||
LMQCP_REASON_NOT_AUTHORIZED = 0x87,
|
||||
/* End - Error codes for CONNACK */
|
||||
|
||||
LMQCP_REASON_SERVER_UNAVAILABLE = 0x88,
|
||||
LMQCP_REASON_SERVER_BUSY = 0x89,
|
||||
LMQCP_REASON_BANNED = 0x8a,
|
||||
LMQCP_REASON_SERVER_SHUTTING_DOWN = 0x8b,
|
||||
LMQCP_REASON_BAD_AUTHENTICATION_METHOD = 0x8c,
|
||||
LMQCP_REASON_KEEPALIVE_TIMEOUT = 0x8d,
|
||||
LMQCP_REASON_SESSION_TAKEN_OVER = 0x8e,
|
||||
LMQCP_REASON_TOPIC_FILTER_INVALID = 0x8f,
|
||||
LMQCP_REASON_TOPIC_NAME_INVALID = 0x90,
|
||||
LMQCP_REASON_PACKET_ID_IN_USE = 0x91,
|
||||
LMQCP_REASON_PACKET_ID_NOT_FOUND = 0x92,
|
||||
LMQCP_REASON_MAX_RX_EXCEEDED = 0x93,
|
||||
LMQCP_REASON_TOPIC_ALIAS_INVALID = 0x94,
|
||||
LMQCP_REASON_PACKET_TOO_LARGE = 0x95,
|
||||
LMQCP_REASON_RATELIMIT = 0x96,
|
||||
LMQCP_REASON_QUOTA_EXCEEDED = 0x97,
|
||||
LMQCP_REASON_ADMINISTRATIVE_ACTION = 0x98,
|
||||
LMQCP_REASON_PAYLOAD_FORMAT_INVALID = 0x99,
|
||||
LMQCP_REASON_RETAIN_NOT_SUPPORTED = 0x9a,
|
||||
LMQCP_REASON_QOS_NOT_SUPPORTED = 0x9b,
|
||||
LMQCP_REASON_USE_ANOTHER_SERVER = 0x9c,
|
||||
LMQCP_REASON_SERVER_MOVED = 0x9d,
|
||||
LMQCP_REASON_SHARED_SUBSCRIPTIONS_NOT_SUPPORTED = 0x9e,
|
||||
LMQCP_REASON_CONNECTION_RATE_EXCEEDED = 0x9f,
|
||||
LMQCP_REASON_MAXIMUM_CONNECT_TIME = 0xa0,
|
||||
LMQCP_REASON_SUBSCRIPTION_IDS_NOT_SUPPORTED = 0xa1,
|
||||
LMQCP_REASON_WILDCARD_SUBSCRIPTIONS_NOT_SUPPORTED = 0xa2,
|
||||
} lws_mqtt_reason_t;
|
||||
|
||||
typedef enum {
|
||||
LMQPROP_INVALID,
|
||||
LMQPROP_PAYLOAD_FORMAT_INDICATOR = 0x01,
|
||||
LMQPROP_MESSAGE_EXPIRY_INTERVAL = 0x02,
|
||||
LMQPROP_CONTENT_TYPE = 0x03,
|
||||
LMQPROP_RESPONSE_TOPIC = 0x08,
|
||||
LMQPROP_CORRELATION_DATA = 0x09,
|
||||
LMQPROP_SUBSCRIPTION_IDENTIFIER = 0x0b,
|
||||
LMQPROP_SESSION_EXPIRY_INTERVAL = 0x11,
|
||||
LMQPROP_ASSIGNED_CLIENT_IDENTIFIER = 0x12,
|
||||
LMQPROP_SERVER_KEEP_ALIVE = 0x13,
|
||||
LMQPROP_AUTHENTICATION_METHOD = 0x15,
|
||||
LMQPROP_AUTHENTICATION_DATA = 0x16,
|
||||
LMQPROP_REQUEST_PROBLEM_INFORMATION = 0x17,
|
||||
LMQPROP_WILL_DELAY_INTERVAL = 0x18,
|
||||
LMQPROP_REQUEST_RESPONSE_INFORMATION = 0x19,
|
||||
LMQPROP_RESPONSE_INFORMATION = 0x1a,
|
||||
LMQPROP_SERVER_REFERENCE = 0x1c,
|
||||
LMQPROP_REASON_STRING = 0x1f,
|
||||
LMQPROP_RECEIVE_MAXIMUM = 0x21,
|
||||
LMQPROP_TOPIC_ALIAS_MAXIMUM = 0x22,
|
||||
LMQPROP_TOPIC_ALIAS = 0x23,
|
||||
LMQPROP_MAXIMUM_QOS = 0x24,
|
||||
LMQPROP_RETAIN_AVAILABLE = 0x25,
|
||||
LMQPROP_USER_PROPERTY = 0x26,
|
||||
LMQPROP_MAXIMUM_PACKET_SIZE = 0x27,
|
||||
LMQPROP_WILDCARD_SUBSCRIPTION_AVAIL = 0x28,
|
||||
LMQPROP_SUBSCRIPTION_IDENTIFIER_AVAIL = 0x29,
|
||||
LMQPROP_SHARED_SUBSCRIPTION_AVAIL = 0x2a
|
||||
} lws_mqtt_property;
|
||||
|
||||
int
|
||||
lws_read_mqtt(struct lws *wsi, unsigned char *buf, lws_filepos_t len);
|
||||
|
||||
/* returns 0 if bd1 and bd2 are "the same", that includes empty, else nonzero */
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_mqtt_bindata_cmp(const lws_mqtt_str_t *bd1, const lws_mqtt_str_t *bd2);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_mqtt_str_init(lws_mqtt_str_t *s, uint8_t *buf, uint16_t lim, char nf);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN lws_mqtt_str_t *
|
||||
lws_mqtt_str_create(uint16_t lim);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN lws_mqtt_str_t *
|
||||
lws_mqtt_str_create_init(uint8_t *buf, uint16_t len, uint16_t lim);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN lws_mqtt_str_t *
|
||||
lws_mqtt_str_create_cstr_dup(const char *buf, uint16_t lim);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN uint8_t *
|
||||
lws_mqtt_str_next(lws_mqtt_str_t *s, uint16_t *budget);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_mqtt_str_advance(lws_mqtt_str_t *s, int n);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_mqtt_str_free(lws_mqtt_str_t **s);
|
||||
|
||||
|
||||
/**
|
||||
* lws_mqtt_client_send_publish() - lws_write a publish packet
|
||||
*
|
||||
* \param wsi: the mqtt child wsi
|
||||
* \param pub: additional information on what we're publishing
|
||||
* \param buf: payload to send
|
||||
* \param len: length of data in buf
|
||||
* \param final: flag indicating this is the last part
|
||||
*
|
||||
* Issues part of, or the whole of, a PUBLISH frame. The first part of the
|
||||
* frame contains the header, and uses the .qos and .payload_len parts of \p pub
|
||||
* since MQTT requires the frame to specify the PUBLISH message length at the
|
||||
* start. The \p len paramter may be less than \p pub.payload_len, in which
|
||||
* case subsequent calls with more payload are needed to complete the frame.
|
||||
*
|
||||
* Although the connection is stuck waiting for the remainder, in that it can't
|
||||
* issue any other frames until the current one is completed, lws returns to the
|
||||
* event loop normally and can continue the calls with additional payload even
|
||||
* for huge frames as the data becomes available, consistent with timeout needs
|
||||
* and latency to start any new frame (even, eg, related to ping / pong).
|
||||
*
|
||||
* If you're sending large frames, the OS will typically not allow the data to
|
||||
* be sent all at once to kernel side. So you should ideally cut the payload
|
||||
* up into 1 or 2- mtu sized chunks and send that.
|
||||
*
|
||||
* Final should be set when you're calling with the last part of the payload.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_mqtt_client_send_publish(struct lws *wsi, lws_mqtt_publish_param_t *pub,
|
||||
const void *buf, uint32_t len, int final);
|
||||
|
||||
/**
|
||||
* lws_mqtt_client_send_subcribe() - lws_write a subscribe packet
|
||||
*
|
||||
* \param wsi: the mqtt child wsi
|
||||
* \param sub: which topic(s) we want to subscribe to
|
||||
*
|
||||
* For topics other child streams have not already subscribed to, send a packet
|
||||
* to the server asking to subscribe to them. If all topics listed are already
|
||||
* subscribed to be the shared network connection, just trigger the
|
||||
* LWS_CALLBACK_MQTT_SUBSCRIBED callback as if a SUBACK had come.
|
||||
*
|
||||
* \p sub doesn't need to exist after the return from this function.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_mqtt_client_send_subcribe(struct lws *wsi, lws_mqtt_subscribe_param_t *sub);
|
||||
|
||||
/**
|
||||
* lws_mqtt_client_send_unsubcribe() - lws_write a unsubscribe packet
|
||||
*
|
||||
* \param wsi: the mqtt child wsi
|
||||
* \param sub: which topic(s) we want to unsubscribe from
|
||||
*
|
||||
* For topics other child streams are not subscribed to, send a packet
|
||||
* to the server asking to unsubscribe from them. If all topics
|
||||
* listed are already subscribed by other child streams on the shared
|
||||
* network connection, just trigger the LWS_CALLBACK_MQTT_UNSUBSCRIBED
|
||||
* callback as if a UNSUBACK had come.
|
||||
*
|
||||
* \p unsub doesn't need to exist after the return from this function.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
|
||||
lws_mqtt_client_send_unsubcribe(struct lws *wsi,
|
||||
const lws_mqtt_subscribe_param_t *unsub);
|
||||
|
||||
#endif /* _LWS_MQTT_H */
|
||||
283
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-netdev.h
Normal file
283
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-netdev.h
Normal file
@ -0,0 +1,283 @@
|
||||
/*
|
||||
* libwebsockets - small server side websockets and web server implementation
|
||||
*
|
||||
* Copyright (C) 2010 - 2020 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#define LWS_WIFI_MAX_SCAN_TRACK 16
|
||||
#define LWS_ETH_ALEN 6
|
||||
|
||||
typedef uint8_t lws_wifi_ch_t;
|
||||
typedef int8_t lws_wifi_rssi_t;
|
||||
struct lws_netdev_instance;
|
||||
|
||||
typedef enum {
|
||||
LWSNDTYP_UNKNOWN,
|
||||
LWSNDTYP_WIFI,
|
||||
LWSNDTYP_ETH,
|
||||
} lws_netdev_type_t;
|
||||
|
||||
/*
|
||||
* Base class for netdev configuration
|
||||
*/
|
||||
|
||||
typedef struct lws_netdev_config {
|
||||
void *plat_config;
|
||||
} lws_netdev_config_t;
|
||||
|
||||
/*
|
||||
* Const Logical generic network interface ops
|
||||
*/
|
||||
|
||||
typedef struct lws_netdev_ops {
|
||||
struct lws_netdev_instance * (*create)(struct lws_context *ctx,
|
||||
const struct lws_netdev_ops *ops,
|
||||
const char *name, void *platinfo);
|
||||
int (*configure)(struct lws_netdev_instance *nd,
|
||||
lws_netdev_config_t *config);
|
||||
int (*up)(struct lws_netdev_instance *nd);
|
||||
int (*down)(struct lws_netdev_instance *nd);
|
||||
int (*event)(struct lws_netdev_instance *nd, lws_usec_t timestamp,
|
||||
void *buf, size_t len);
|
||||
/**< these are SMD events coming from lws event loop thread context */
|
||||
void (*destroy)(struct lws_netdev_instance **pnd);
|
||||
int (*connect)(struct lws_netdev_instance *wnd, const char *ssid,
|
||||
const char *passphrase, uint8_t *bssid);
|
||||
void (*scan)(struct lws_netdev_instance *nd);
|
||||
} lws_netdev_ops_t;
|
||||
|
||||
/*
|
||||
* Network devices on this platform
|
||||
*
|
||||
* We also hold a list of all known network credentials (when they are needed
|
||||
* because there is a network interface without anything to connect to) and
|
||||
* the lws_settings instance they are stored in
|
||||
*/
|
||||
|
||||
typedef struct lws_netdevs {
|
||||
lws_dll2_owner_t owner;
|
||||
/**< list of netdevs / lws_netdev_instance_t -based objects */
|
||||
|
||||
lws_dll2_owner_t owner_creds;
|
||||
/**< list of known credentials */
|
||||
struct lwsac *ac_creds;
|
||||
/**< lwsac holding retreived credentials settings, or NULL */
|
||||
lws_settings_instance_t *si;
|
||||
|
||||
lws_sockaddr46 sa46_dns_resolver;
|
||||
|
||||
uint8_t refcount_creds;
|
||||
/**< when there are multiple netdevs, must refcount creds in mem */
|
||||
} lws_netdevs_t;
|
||||
|
||||
/*
|
||||
* Base class for an allocated instantiated derived object using lws_netdev_ops,
|
||||
* ie, a specific ethernet device
|
||||
*/
|
||||
|
||||
typedef struct lws_netdev_instance {
|
||||
const char *name;
|
||||
const lws_netdev_ops_t *ops;
|
||||
void *platinfo;
|
||||
lws_dll2_t list;
|
||||
uint8_t mac[LWS_ETH_ALEN];
|
||||
uint8_t type; /* lws_netdev_type_t */
|
||||
} lws_netdev_instance_t;
|
||||
|
||||
enum {
|
||||
LNDIW_ALG_OPEN,
|
||||
LNDIW_ALG_WPA2,
|
||||
|
||||
LNDIW_MODE_STA = (1 << 0),
|
||||
LNDIW_MODE_AP = (1 << 1),
|
||||
LNDIW_UP = (1 << 7),
|
||||
|
||||
LNDIW_ACQ_IPv4 = (1 << 0),
|
||||
LNDIW_ACQ_IPv6 = (1 << 1),
|
||||
};
|
||||
|
||||
/*
|
||||
* Group AP / Station State
|
||||
*/
|
||||
|
||||
typedef enum {
|
||||
LWSNDVWIFI_STATE_INITIAL,
|
||||
/*
|
||||
* We should gratuitously try whatever last worked for us, then
|
||||
* if that fails, worry about the rest of the logic
|
||||
*/
|
||||
LWSNDVWIFI_STATE_SCAN,
|
||||
/*
|
||||
* Unconnected, scanning: AP known in one of the config slots ->
|
||||
* configure it, start timeout + LWSNDVWIFI_STATE_STAT, if no AP
|
||||
* already up in same group with lower MAC, after a random
|
||||
* period start up our AP (LWSNDVWIFI_STATE_AP)
|
||||
*/
|
||||
LWSNDVWIFI_STATE_AP,
|
||||
/* Trying to be the group AP... periodically do a scan
|
||||
* LWSNDVWIFI_STATE_AP_SCAN, faster and then slower
|
||||
*/
|
||||
LWSNDVWIFI_STATE_AP_SCAN,
|
||||
/*
|
||||
* doing a scan while trying to be the group AP... if we see a
|
||||
* lower MAC being the AP for the same group AP, abandon being
|
||||
* an AP and join that AP as a station
|
||||
*/
|
||||
LWSNDVWIFI_STATE_STAT_GRP_AP,
|
||||
/*
|
||||
* We have decided to join another group member who is being the
|
||||
* AP, as its MAC is lower than ours. This is a stable state,
|
||||
* but we still do periodic scans
|
||||
* LWSNDVWIFI_STATE_STAT_GRP_AP_SCAN and will always prefer an
|
||||
* AP configured in a slot.
|
||||
*/
|
||||
LWSNDVWIFI_STATE_STAT_GRP_AP_SCAN,
|
||||
/*
|
||||
* We have joined a group member who is doing the AP job... we
|
||||
* want to check every now and then if a configured AP has
|
||||
* appeared that we should better use instead. Otherwise stay
|
||||
* in LWSNDVWIFI_STATE_STAT_GRP_AP
|
||||
*/
|
||||
LWSNDVWIFI_STATE_STAT,
|
||||
/*
|
||||
* trying to connect to another non-group AP. If we don't get an
|
||||
* IP within a timeout and retries, mark it as unusable it and go back
|
||||
*/
|
||||
LWSNDVWIFI_STATE_STAT_HAPPY,
|
||||
} lws_netdev_wifi_state_t;
|
||||
|
||||
/*
|
||||
* Generic WIFI credentials
|
||||
*/
|
||||
|
||||
typedef struct lws_wifi_creds {
|
||||
lws_dll2_t list;
|
||||
|
||||
uint8_t bssid[LWS_ETH_ALEN];
|
||||
char passphrase[64];
|
||||
char ssid[33];
|
||||
uint8_t alg;
|
||||
} lws_wifi_creds_t;
|
||||
|
||||
/*
|
||||
* Generic WIFI Network Device Instance
|
||||
*/
|
||||
|
||||
typedef struct lws_netdev_instance_wifi {
|
||||
lws_netdev_instance_t inst;
|
||||
lws_dll2_owner_t scan; /* sorted scan results */
|
||||
lws_sorted_usec_list_t sul_scan;
|
||||
|
||||
lws_wifi_creds_t *ap_cred;
|
||||
const char *ap_ip;
|
||||
|
||||
const char *sta_ads;
|
||||
|
||||
char current_attempt_ssid[33];
|
||||
uint8_t current_attempt_bssid[LWS_ETH_ALEN];
|
||||
|
||||
uint8_t flags;
|
||||
uint8_t state; /* lws_netdev_wifi_state_t */
|
||||
} lws_netdev_instance_wifi_t;
|
||||
|
||||
/*
|
||||
* Logical scan results sorted list item
|
||||
*/
|
||||
|
||||
typedef struct lws_wifi_sta {
|
||||
lws_dll2_t list;
|
||||
|
||||
uint32_t last_seen; /* unix time */
|
||||
uint32_t last_tried; /* unix time */
|
||||
|
||||
uint8_t bssid[LWS_ETH_ALEN];
|
||||
char *ssid; /* points to overallocation */
|
||||
uint8_t ssid_len;
|
||||
lws_wifi_ch_t ch;
|
||||
lws_wifi_rssi_t rssi[8];
|
||||
int16_t rssi_avg;
|
||||
uint8_t authmode;
|
||||
|
||||
uint8_t rssi_count;
|
||||
uint8_t rssi_next;
|
||||
|
||||
/* ssid overallocated afterwards */
|
||||
} lws_wifi_sta_t;
|
||||
|
||||
#define rssi_averaged(_x) (_x->rssi_count ? \
|
||||
((int)_x->rssi_avg / (int)_x->rssi_count) : \
|
||||
-200)
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN lws_netdevs_t *
|
||||
lws_netdevs_from_ctx(struct lws_context *ctx);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_netdev_credentials_settings_set(lws_netdevs_t *nds);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_netdev_credentials_settings_get(lws_netdevs_t *nds);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN struct lws_netdev_instance *
|
||||
lws_netdev_wifi_create_plat(struct lws_context *ctx,
|
||||
const lws_netdev_ops_t *ops, const char *name,
|
||||
void *platinfo);
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_netdev_wifi_configure_plat(struct lws_netdev_instance *nd,
|
||||
lws_netdev_config_t *config);
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_netdev_wifi_event_plat(struct lws_netdev_instance *nd, lws_usec_t timestamp,
|
||||
void *buf, size_t len);
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_netdev_wifi_up_plat(struct lws_netdev_instance *nd);
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_netdev_wifi_down_plat(struct lws_netdev_instance *nd);
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_netdev_wifi_destroy_plat(struct lws_netdev_instance **pnd);
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_netdev_wifi_scan_plat(lws_netdev_instance_t *nd);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_netdev_wifi_connect_plat(lws_netdev_instance_t *wnd, const char *ssid,
|
||||
const char *passphrase, uint8_t *bssid);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN lws_netdev_instance_t *
|
||||
lws_netdev_find(lws_netdevs_t *netdevs, const char *ifname);
|
||||
|
||||
#define lws_netdev_wifi_plat_ops \
|
||||
.create = lws_netdev_wifi_create_plat, \
|
||||
.configure = lws_netdev_wifi_configure_plat, \
|
||||
.event = lws_netdev_wifi_event_plat, \
|
||||
.up = lws_netdev_wifi_up_plat, \
|
||||
.down = lws_netdev_wifi_down_plat, \
|
||||
.connect = lws_netdev_wifi_connect_plat, \
|
||||
.scan = lws_netdev_wifi_scan_plat, \
|
||||
.destroy = lws_netdev_wifi_destroy_plat
|
||||
|
||||
/*
|
||||
* This is for plat / OS level init that is necessary to be able to use
|
||||
* networking or wifi at all, without mentioning any specific device
|
||||
*/
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_netdev_plat_init(void);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_netdev_plat_wifi_init(void);
|
||||
@ -0,0 +1,261 @@
|
||||
/*
|
||||
* libwebsockets - small server side websockets and web server implementation
|
||||
*
|
||||
* Copyright (C) 2010 - 2023 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
/** \defgroup net Network related helper APIs
|
||||
* ##Network related helper APIs
|
||||
*
|
||||
* These wrap miscellaneous useful network-related functions
|
||||
*/
|
||||
///@{
|
||||
|
||||
#if defined(LWS_ESP_PLATFORM)
|
||||
#include <lwip/sockets.h>
|
||||
#endif
|
||||
|
||||
/* cope with large amounts of route information */
|
||||
typedef uint16_t lws_route_uidx_t;
|
||||
|
||||
typedef struct lws_dns_score {
|
||||
uint8_t precedence;
|
||||
uint8_t label;
|
||||
} lws_dns_score_t;
|
||||
|
||||
/*
|
||||
* This represents an entry in the system routing table
|
||||
*/
|
||||
|
||||
typedef struct lws_route {
|
||||
lws_dll2_t list;
|
||||
|
||||
lws_sockaddr46 src;
|
||||
lws_sockaddr46 dest;
|
||||
lws_sockaddr46 gateway;
|
||||
|
||||
struct lws_route *source; /* when used as lws_dns_sort_t */
|
||||
lws_dns_score_t score; /* when used as lws_dns_sort_t */
|
||||
|
||||
int if_idx;
|
||||
int priority;
|
||||
int ifa_flags; /* if source_ads */
|
||||
|
||||
lws_route_uidx_t uidx; /* unique index for this route */
|
||||
|
||||
uint8_t proto;
|
||||
uint8_t dest_len;
|
||||
uint8_t src_len;
|
||||
uint8_t scope; /* if source_ads */
|
||||
uint8_t af; /* if source_ads */
|
||||
|
||||
uint8_t source_ads:1;
|
||||
} lws_route_t;
|
||||
|
||||
/*
|
||||
* We reuse the route object as the dns sort granule, so there's only one
|
||||
* struct needs to know all the gnarly ipv6 details
|
||||
*/
|
||||
|
||||
typedef lws_route_t lws_dns_sort_t;
|
||||
|
||||
/**
|
||||
* lws_canonical_hostname() - returns this host's hostname
|
||||
*
|
||||
* This is typically used by client code to fill in the host parameter
|
||||
* when making a client connection. You can only call it after the context
|
||||
* has been created.
|
||||
*
|
||||
* \param context: Websocket context
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN const char * LWS_WARN_UNUSED_RESULT
|
||||
lws_canonical_hostname(struct lws_context *context);
|
||||
|
||||
/**
|
||||
* lws_get_peer_addresses() - Get client address information
|
||||
* \param wsi: Local struct lws associated with
|
||||
* \param fd: Connection socket descriptor
|
||||
* \param name: Buffer to take client address name
|
||||
* \param name_len: Length of client address name buffer
|
||||
* \param rip: Buffer to take client address IP dotted quad
|
||||
* \param rip_len: Length of client address IP buffer
|
||||
*
|
||||
* This function fills in name and rip with the name and IP of
|
||||
* the client connected with socket descriptor fd. Names may be
|
||||
* truncated if there is not enough room. If either cannot be
|
||||
* determined, they will be returned as valid zero-length strings.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_get_peer_addresses(struct lws *wsi, lws_sockfd_type fd, char *name,
|
||||
int name_len, char *rip, int rip_len);
|
||||
|
||||
/**
|
||||
* lws_get_peer_simple() - Get client address information without RDNS
|
||||
*
|
||||
* \param wsi: Local struct lws associated with
|
||||
* \param name: Buffer to take client address name
|
||||
* \param namelen: Length of client address name buffer
|
||||
*
|
||||
* This provides a 123.123.123.123 type IP address in name from the
|
||||
* peer that has connected to wsi
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN const char *
|
||||
lws_get_peer_simple(struct lws *wsi, char *name, size_t namelen);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN const char *
|
||||
lws_get_peer_simple_fd(lws_sockfd_type fd, char *name, size_t namelen);
|
||||
|
||||
#define LWS_ITOSA_USABLE 0
|
||||
#define LWS_ITOSA_NOT_EXIST -1
|
||||
#define LWS_ITOSA_NOT_USABLE -2
|
||||
#define LWS_ITOSA_BUSY -3 /* only returned by lws_socket_bind() on
|
||||
EADDRINUSE */
|
||||
|
||||
#if !defined(LWS_PLAT_FREERTOS) && !defined(LWS_PLAT_OPTEE)
|
||||
/**
|
||||
* lws_interface_to_sa() - Convert interface name or IP to sockaddr struct
|
||||
*
|
||||
* \param ipv6: Allow IPV6 addresses
|
||||
* \param ifname: Interface name or IP
|
||||
* \param addr: struct sockaddr_in * to be written
|
||||
* \param addrlen: Length of addr
|
||||
*
|
||||
* This converts a textual network interface name to a sockaddr usable by
|
||||
* other network functions.
|
||||
*
|
||||
* If the network interface doesn't exist, it will return LWS_ITOSA_NOT_EXIST.
|
||||
*
|
||||
* If the network interface is not usable, eg ethernet cable is removed, it
|
||||
* may logically exist but not have any IP address. As such it will return
|
||||
* LWS_ITOSA_NOT_USABLE.
|
||||
*
|
||||
* If the network interface exists and is usable, it will return
|
||||
* LWS_ITOSA_USABLE.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_interface_to_sa(int ipv6, const char *ifname, struct sockaddr_in *addr,
|
||||
size_t addrlen);
|
||||
#endif
|
||||
|
||||
/**
|
||||
* lws_sa46_compare_ads() - checks if two sa46 have the same address
|
||||
*
|
||||
* \param sa46a: first
|
||||
* \param sa46b: second
|
||||
*
|
||||
* Returns 0 if the address family is INET or INET6 and the address is the same,
|
||||
* or if the AF is the same but not INET or INET6, otherwise nonzero.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_sa46_compare_ads(const lws_sockaddr46 *sa46a, const lws_sockaddr46 *sa46b);
|
||||
|
||||
/**
|
||||
* lws_sa46_on_net() - checks if an sa46 is on the subnet represented by another
|
||||
*
|
||||
* \param sa46a: first
|
||||
* \param sa46_net: network
|
||||
* \param net_len: length of network non-mask
|
||||
*
|
||||
* Returns 0 if sa46a belongs on network sa46_net/net_len
|
||||
*
|
||||
* If there is an ipv4 / v6 mismatch between the ip and the net, the ipv4
|
||||
* address is promoted to ::ffff:x.x.x.x before the comparison.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_sa46_on_net(const lws_sockaddr46 *sa46a, const lws_sockaddr46 *sa46_net,
|
||||
int net_len);
|
||||
|
||||
/*
|
||||
* lws_parse_numeric_address() - converts numeric ipv4 or ipv6 to byte address
|
||||
*
|
||||
* \param ads: the numeric ipv4 or ipv6 address string
|
||||
* \param result: result array
|
||||
* \param max_len: max length of result array
|
||||
*
|
||||
* Converts a 1.2.3.4 or 2001:abcd:123:: or ::ffff:1.2.3.4 formatted numeric
|
||||
* address into an array of network ordered byte address elements.
|
||||
*
|
||||
* Returns < 0 on error, else length of result set, either 4 or 16 for ipv4 /
|
||||
* ipv6.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_parse_numeric_address(const char *ads, uint8_t *result, size_t max_len);
|
||||
|
||||
/*
|
||||
* lws_sa46_parse_numeric_address() - converts numeric ipv4 or ipv6 to sa46
|
||||
*
|
||||
* \param ads: the numeric ipv4 or ipv6 address string
|
||||
* \param sa46: pointer to sa46 to set
|
||||
*
|
||||
* Converts a 1.2.3.4 or 2001:abcd:123:: or ::ffff:1.2.3.4 formatted numeric
|
||||
* address into an sa46, a union of sockaddr_in or sockaddr_in6 depending on
|
||||
* what kind of address was found. sa46->sa4.sin_fmaily will be AF_INET if
|
||||
* ipv4, or AF_INET6 if ipv6.
|
||||
*
|
||||
* Returns 0 if the sa46 was set, else < 0 on error.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_sa46_parse_numeric_address(const char *ads, lws_sockaddr46 *sa46);
|
||||
|
||||
/**
|
||||
* lws_write_numeric_address() - convert network byte order ads to text
|
||||
*
|
||||
* \param ads: network byte order address array
|
||||
* \param size: number of bytes valid in ads
|
||||
* \param buf: result buffer to take text format
|
||||
* \param len: max size of text buffer
|
||||
*
|
||||
* Converts an array of network-ordered byte address elements to a textual
|
||||
* representation of the numeric address, like "1.2.3.4" or "::1". Returns the
|
||||
* number of chars written into buf, else < 0. ipv6 only supported with
|
||||
* LWS_IPV6=1 at cmake.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_write_numeric_address(const uint8_t *ads, int size, char *buf, size_t len);
|
||||
|
||||
/**
|
||||
* lws_sa46_write_numeric_address() - convert sa46 ads to textual numeric ads
|
||||
*
|
||||
* \param sa46: the sa46 whose address to show
|
||||
* \param buf: result buffer to take text format
|
||||
* \param len: max size of text buffer
|
||||
*
|
||||
* Converts the ipv4 or ipv6 address in an lws_sockaddr46 to a textual
|
||||
* representation of the numeric address, like "1.2.3.4" or "::1". Returns the
|
||||
* number of chars written into buf, else < 0. ipv6 only supported with
|
||||
* LWS_IPV6=1 at cmake.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_sa46_write_numeric_address(lws_sockaddr46 *sa46, char *buf, size_t len);
|
||||
|
||||
/**
|
||||
* lws_parse_mac() - convert XX:XX:XX:XX:XX:XX to 6-byte MAC address
|
||||
*
|
||||
* \param ads: mac address as XX:XX:XX:XX:XX:XX string
|
||||
* \param result_6_bytes: result buffer to take 6 bytes
|
||||
*
|
||||
* Converts a string representation of a 6-byte hex mac address to a 6-byte
|
||||
* array.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_parse_mac(const char *ads, uint8_t *result_6_bytes);
|
||||
|
||||
///@}
|
||||
@ -0,0 +1,77 @@
|
||||
/*
|
||||
* libwebsockets - small server side websockets and web server implementation
|
||||
*
|
||||
* Copyright (C) 2010 - 2019 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef __LWS_OPTEE_H
|
||||
#define __LWS_OPTEE_H
|
||||
|
||||
/* 128-bit IP6 address */
|
||||
struct in6_addr {
|
||||
union {
|
||||
uint8_t u6_addr8[16];
|
||||
uint16_t u6_addr16[8];
|
||||
uint32_t u6_addr32[4];
|
||||
};
|
||||
};
|
||||
|
||||
#define _SS_MAXSIZE 128U
|
||||
#define _SS_ALIGNSIZE (sizeof(int64_t))
|
||||
#define _SS_PAD1SIZE (_SS_ALIGNSIZE - \
|
||||
sizeof(sa_family_t))
|
||||
#define _SS_PAD2SIZE (_SS_MAXSIZE - \
|
||||
sizeof(sa_family_t) - _SS_PAD1SIZE - _SS_ALIGNSIZE)
|
||||
|
||||
struct sockaddr_storage {
|
||||
sa_family_t ss_family; /* address family */
|
||||
char __ss_pad1[_SS_PAD1SIZE];
|
||||
int64_t __ss_align; /* force desired struct alignment */
|
||||
char __ss_pad2[_SS_PAD2SIZE];
|
||||
};
|
||||
|
||||
#define __SOCK_SIZE__ 16 /* sizeof(struct sockaddr) */
|
||||
struct sockaddr {
|
||||
sa_family_t sa_family; /* address family */
|
||||
uint8_t sa_data[__SOCK_SIZE__ /* address value */
|
||||
- sizeof(sa_family_t)];
|
||||
};
|
||||
|
||||
/* 16 bytes */
|
||||
struct sockaddr_in {
|
||||
sa_family_t sin_family;
|
||||
in_port_t sin_port;
|
||||
struct in_addr sin_addr;
|
||||
uint8_t sin_zero[__SOCK_SIZE__ /* padding until 16 bytes */
|
||||
- sizeof(sa_family_t)
|
||||
- sizeof(in_port_t)
|
||||
- sizeof(struct in_addr)];
|
||||
};
|
||||
|
||||
struct sockaddr_in6 {
|
||||
sa_family_t sin6_family; /* AF_INET6 */
|
||||
in_port_t sin6_port; /* Transport layer port # */
|
||||
uint32_t sin6_flowinfo; /* IP6 flow information */
|
||||
struct in6_addr sin6_addr; /* IP6 address */
|
||||
uint32_t sin6_scope_id; /* scope zone index */
|
||||
};
|
||||
|
||||
#endif /* __LWS_OPTEE_H */
|
||||
122
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-ota.h
Normal file
122
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-ota.h
Normal file
@ -0,0 +1,122 @@
|
||||
/*
|
||||
* lws OTA updates
|
||||
*
|
||||
* Copyright (C) 2019 - 2022 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*
|
||||
* This is the platform interface that lws_ota uses to flash new firmware.
|
||||
* The platform implementation for these ops is set via lws_system and consists
|
||||
* of user code.
|
||||
*
|
||||
* All the update-related calls have async interfaces with a callback and opaque
|
||||
* callback context that is called on completion. This allows us to, eg,
|
||||
* download the next buffer while flashing the previous one.
|
||||
*
|
||||
* If the platform implementation is actually synchronous, then just call the
|
||||
* callback before returning.
|
||||
*
|
||||
* If it is async, because eg, erase is slow, in the platform ota op
|
||||
* implementation spawn a thread to do the platform operation, return
|
||||
* immediately with LWSOTARET_ONGOING, and call the callback from the spawned
|
||||
* thread context with the real return before terminating the thread.
|
||||
*/
|
||||
|
||||
typedef void * lws_ota_process_t;
|
||||
|
||||
typedef enum {
|
||||
LWSOTARET_OK,
|
||||
LWSOTARET_ONGOING, /* result not ready to read yet */
|
||||
LWSOTARET_REJECTED,
|
||||
LWSOTARET_NOSLOT,
|
||||
|
||||
LWSOTARET_UPDATE_AVAILABLE,
|
||||
LWSOTARET_PROGRESS,
|
||||
LWSOTARET_FAILED,
|
||||
LWSOTARET_COMPLETED
|
||||
} lws_ota_ret_t;
|
||||
|
||||
typedef enum {
|
||||
LWS_OTA_ASYNC_START = 1,
|
||||
LWS_OTA_ASYNC_WRITE,
|
||||
LWS_OTA_ASYNC_ABORT,
|
||||
LWS_OTA_ASYNC_FINALIZE
|
||||
} lws_ota_async_t;
|
||||
|
||||
struct lws_ota;
|
||||
|
||||
typedef void (*lws_ota_cb_t)(void *ctx, lws_ota_ret_t r);
|
||||
|
||||
typedef struct {
|
||||
|
||||
/* asynchronous (completions via lws_cancel_service) */
|
||||
|
||||
int (*ota_start)(struct lws_ota *g);
|
||||
/**< Creates the ota task and queues LWS_OTA_ASYNC_START on it. */
|
||||
|
||||
void (*ota_queue)(struct lws_ota *g, lws_ota_async_t a);
|
||||
/**< Queue next command to OTA task (args are in g) */
|
||||
|
||||
/* synchronous */
|
||||
|
||||
int (*ota_report_current)(struct lws_ota *g, int bad);
|
||||
/**< Report information to the platform code about how we feel about the
|
||||
* current boot... if we can check the OTA then we report it seems in
|
||||
* good shape (bad = 0), if we can identify it's brain-damaged then
|
||||
* (bad = 1). What action the platform takes about these reports is up
|
||||
* to the platform code */
|
||||
|
||||
int (*ota_progress)(lws_ota_ret_t state, int percent);
|
||||
/**< Gets called so the platform can represent OTA progress, give
|
||||
* platform a chance to choose what to do about an available update */
|
||||
|
||||
int (*ota_get_last_fw_unixtime)(uint64_t *fw_unixtime);
|
||||
/**< tries to recover the newest firmware unixtime that had been
|
||||
* OTA'd into fw_unixtime, updates from same or earlier unixtime are
|
||||
* ignored for update purposes. */
|
||||
|
||||
int ota_periodic_check_secs;
|
||||
/**< Check after this many seconds for a new update */
|
||||
} lws_ota_ops_t;
|
||||
|
||||
/**
|
||||
* lws_ota_variant_name() - returns the build variant name
|
||||
*
|
||||
* Returns a string that uniquely identifies the kind of firmware build this
|
||||
* device is running.
|
||||
*/
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN const char *
|
||||
lws_ota_variant_name(void);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_plat_ota_start(struct lws_ota *g);
|
||||
|
||||
|
||||
#define LWSOTAFIN_OK 0
|
||||
#define LWSOTAFIN_BAD 1
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_plat_ota_queue(struct lws_ota *g, lws_ota_async_t a);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_plat_ota_report_current(struct lws_ota *g, int bad);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_plat_ota_get_last_fw_unixtime(uint64_t *fw_unixtime);
|
||||
@ -0,0 +1,383 @@
|
||||
/*
|
||||
* libwebsockets - small server side websockets and web server implementation
|
||||
*
|
||||
* Copyright (C) 2010 - 2019 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
/*! \defgroup Protocols-and-Plugins Protocols and Plugins
|
||||
* \ingroup lwsapi
|
||||
*
|
||||
* ##Protocol and protocol plugin -related apis
|
||||
*
|
||||
* Protocols bind ws protocol names to a custom callback specific to that
|
||||
* protocol implementaion.
|
||||
*
|
||||
* A list of protocols can be passed in at context creation time, but it is
|
||||
* also legal to leave that NULL and add the protocols and their callback code
|
||||
* using plugins.
|
||||
*
|
||||
* Plugins are much preferable compared to cut and pasting code into an
|
||||
* application each time, since they can be used standalone.
|
||||
*/
|
||||
///@{
|
||||
/** struct lws_protocols - List of protocols and handlers client or server
|
||||
* supports. */
|
||||
|
||||
struct lws_protocols {
|
||||
const char *name;
|
||||
/**< Protocol name that must match the one given in the client
|
||||
* Javascript new WebSocket(url, 'protocol') name. */
|
||||
lws_callback_function *callback;
|
||||
/**< The service callback used for this protocol. It allows the
|
||||
* service action for an entire protocol to be encapsulated in
|
||||
* the protocol-specific callback */
|
||||
size_t per_session_data_size;
|
||||
/**< Each new connection using this protocol gets
|
||||
* this much memory allocated on connection establishment and
|
||||
* freed on connection takedown. A pointer to this per-connection
|
||||
* allocation is passed into the callback in the 'user' parameter */
|
||||
size_t rx_buffer_size;
|
||||
/**< lws allocates this much space for rx data and informs callback
|
||||
* when something came. Due to rx flow control, the callback may not
|
||||
* be able to consume it all without having to return to the event
|
||||
* loop. That is supported in lws.
|
||||
*
|
||||
* If .tx_packet_size is 0, this also controls how much may be sent at
|
||||
* once for backwards compatibility.
|
||||
*/
|
||||
unsigned int id;
|
||||
/**< ignored by lws, but useful to contain user information bound
|
||||
* to the selected protocol. For example if this protocol was
|
||||
* called "myprotocol-v2", you might set id to 2, and the user
|
||||
* code that acts differently according to the version can do so by
|
||||
* switch (wsi->a.protocol->id), user code might use some bits as
|
||||
* capability flags based on selected protocol version, etc. */
|
||||
void *user; /**< ignored by lws, but user code can pass a pointer
|
||||
here it can later access from the protocol callback */
|
||||
size_t tx_packet_size;
|
||||
/**< 0 indicates restrict send() size to .rx_buffer_size for backwards-
|
||||
* compatibility.
|
||||
* If greater than zero, a single send() is restricted to this amount
|
||||
* and any remainder is buffered by lws and sent afterwards also in
|
||||
* these size chunks. Since that is expensive, it's preferable
|
||||
* to restrict one fragment you are trying to send to match this
|
||||
* size.
|
||||
*/
|
||||
|
||||
/* Add new things just above here ---^
|
||||
* This is part of the ABI, don't needlessly break compatibility */
|
||||
};
|
||||
|
||||
#define LWS_PROTOCOL_LIST_TERM { NULL, NULL, 0, 0, 0, NULL, 0 }
|
||||
|
||||
/**
|
||||
* lws_vhost_name_to_protocol() - get vhost's protocol object from its name
|
||||
*
|
||||
* \param vh: vhost to search
|
||||
* \param name: protocol name
|
||||
*
|
||||
* Returns NULL or a pointer to the vhost's protocol of the requested name
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN const struct lws_protocols *
|
||||
lws_vhost_name_to_protocol(struct lws_vhost *vh, const char *name);
|
||||
|
||||
/**
|
||||
* lws_get_protocol() - Returns a protocol pointer from a websocket
|
||||
* connection.
|
||||
* \param wsi: pointer to struct websocket you want to know the protocol of
|
||||
*
|
||||
*
|
||||
* Some apis can act on all live connections of a given protocol,
|
||||
* this is how you can get a pointer to the active protocol if needed.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN const struct lws_protocols *
|
||||
lws_get_protocol(struct lws *wsi);
|
||||
|
||||
/** lws_protocol_get() - deprecated: use lws_get_protocol */
|
||||
LWS_VISIBLE LWS_EXTERN const struct lws_protocols *
|
||||
lws_protocol_get(struct lws *wsi) LWS_WARN_DEPRECATED;
|
||||
|
||||
/**
|
||||
* lws_protocol_vh_priv_zalloc() - Allocate and zero down a protocol's per-vhost
|
||||
* storage
|
||||
* \param vhost: vhost the instance is related to
|
||||
* \param prot: protocol the instance is related to
|
||||
* \param size: bytes to allocate
|
||||
*
|
||||
* Protocols often find it useful to allocate a per-vhost struct, this is a
|
||||
* helper to be called in the per-vhost init LWS_CALLBACK_PROTOCOL_INIT
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void *
|
||||
lws_protocol_vh_priv_zalloc(struct lws_vhost *vhost,
|
||||
const struct lws_protocols *prot, int size);
|
||||
|
||||
/**
|
||||
* lws_protocol_vh_priv_get() - retreive a protocol's per-vhost storage
|
||||
*
|
||||
* \param vhost: vhost the instance is related to
|
||||
* \param prot: protocol the instance is related to
|
||||
*
|
||||
* Recover a pointer to the allocated per-vhost storage for the protocol created
|
||||
* by lws_protocol_vh_priv_zalloc() earlier
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void *
|
||||
lws_protocol_vh_priv_get(struct lws_vhost *vhost,
|
||||
const struct lws_protocols *prot);
|
||||
|
||||
/**
|
||||
* lws_vhd_find_by_pvo() - find a partner vhd
|
||||
*
|
||||
* \param cx: the lws_context
|
||||
* \param protname: the name of the lws_protocol the vhd belongs to
|
||||
* \param pvo_name: the name of a pvo that must exist bound to the vhd
|
||||
* \param pvo_value: the required value of the named pvo
|
||||
*
|
||||
* This allows architectures with multiple protocols bound together to
|
||||
* cleanly discover partner protocol instances even on completely
|
||||
* different vhosts. For example, a proxy may consist of two protocols
|
||||
* listening on different vhosts, and there may be multiple instances
|
||||
* of the proxy in the same process. It's desirable that each side of
|
||||
* the proxy is an independent protocol that can be freely bound to any
|
||||
* vhost, eg, allowing Unix Domain to tls / h2 proxying, or each side
|
||||
* bound to different network interfaces for localhost-only visibility
|
||||
* on one side, using existing vhost management.
|
||||
*
|
||||
* That leaves the problem that the two sides have to find each other
|
||||
* and bind at runtime. This api allows each side to specify the
|
||||
* protocol name, and a common pvo name and pvo value that indicates
|
||||
* the two sides belong together, and search through all the instantiated
|
||||
* vhost-protocols looking for a match. If found, the private allocation
|
||||
* (aka "vhd" of the match is returned). NULL is returned on no match.
|
||||
*
|
||||
* Since this can only succeed when called by the last of the two
|
||||
* protocols to be instantiated, both sides should call it and handle
|
||||
* NULL gracefully, since it may mean that they were first and their
|
||||
* partner vhsot-protocol has not been instantiated yet.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void *
|
||||
lws_vhd_find_by_pvo(struct lws_context *cx, const char *protname,
|
||||
const char *pvo_name, const char *pvo_value);
|
||||
|
||||
|
||||
/**
|
||||
* lws_adjust_protocol_psds - change a vhost protocol's per session data size
|
||||
*
|
||||
* \param wsi: a connection with the protocol to change
|
||||
* \param new_size: the new size of the per session data size for the protocol
|
||||
*
|
||||
* Returns user_space for the wsi, after allocating
|
||||
*
|
||||
* This should not be used except to initalize a vhost protocol's per session
|
||||
* data size one time, before any connections are accepted.
|
||||
*
|
||||
* Sometimes the protocol wraps another protocol and needs to discover and set
|
||||
* its per session data size at runtime.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void *
|
||||
lws_adjust_protocol_psds(struct lws *wsi, size_t new_size);
|
||||
|
||||
/**
|
||||
* lws_finalize_startup() - drop initial process privileges
|
||||
*
|
||||
* \param context: lws context
|
||||
*
|
||||
* This is called after the end of the vhost protocol initializations, but
|
||||
* you may choose to call it earlier
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_finalize_startup(struct lws_context *context);
|
||||
|
||||
/**
|
||||
* lws_pvo_search() - helper to find a named pvo in a linked-list
|
||||
*
|
||||
* \param pvo: the first pvo in the linked-list
|
||||
* \param name: the name of the pvo to return if found
|
||||
*
|
||||
* Returns NULL, or a pointer to the name pvo in the linked-list
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN const struct lws_protocol_vhost_options *
|
||||
lws_pvo_search(const struct lws_protocol_vhost_options *pvo, const char *name);
|
||||
|
||||
/**
|
||||
* lws_pvo_get_str() - retreive a string pvo value
|
||||
*
|
||||
* \param in: the first pvo in the linked-list
|
||||
* \param name: the name of the pvo to return if found
|
||||
* \param result: pointer to a const char * to get the result if any
|
||||
*
|
||||
* Returns 0 if found and *result set, or nonzero if not found
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_pvo_get_str(void *in, const char *name, const char **result);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_protocol_init(struct lws_context *context);
|
||||
|
||||
#define LWS_PLUGIN_API_MAGIC 191
|
||||
|
||||
/*
|
||||
* Abstract plugin header for any kind of plugin class, always at top of
|
||||
* actual class plugin export type.
|
||||
*
|
||||
* The export type object must be exported with the same name as the plugin
|
||||
* file, eg, libmyplugin.so must export a const one of these as the symbol
|
||||
* "myplugin".
|
||||
*
|
||||
* That is the only expected export from the plugin.
|
||||
*/
|
||||
|
||||
typedef struct lws_plugin_header {
|
||||
const char *name;
|
||||
const char *_class;
|
||||
const char *lws_build_hash; /* set to LWS_BUILD_HASH */
|
||||
|
||||
unsigned int api_magic;
|
||||
/* set to LWS_PLUGIN_API_MAGIC at plugin build time */
|
||||
|
||||
/* plugin-class specific superclass data follows */
|
||||
} lws_plugin_header_t;
|
||||
|
||||
/*
|
||||
* "lws_protocol_plugin" class export, for lws_protocol implementations done
|
||||
* as plugins
|
||||
*/
|
||||
typedef struct lws_plugin_protocol {
|
||||
lws_plugin_header_t hdr;
|
||||
|
||||
const struct lws_protocols *protocols; /**< array of supported protocols provided by plugin */
|
||||
const struct lws_extension *extensions; /**< array of extensions provided by plugin */
|
||||
int count_protocols; /**< how many protocols */
|
||||
int count_extensions; /**< how many extensions */
|
||||
} lws_plugin_protocol_t;
|
||||
|
||||
|
||||
/*
|
||||
* This is the dynamic, runtime created part of the plugin instantiation.
|
||||
* These are kept in a linked-list and destroyed with the context.
|
||||
*/
|
||||
|
||||
struct lws_plugin {
|
||||
struct lws_plugin *list; /**< linked list */
|
||||
|
||||
const lws_plugin_header_t *hdr;
|
||||
|
||||
union {
|
||||
#if defined(LWS_WITH_LIBUV) && defined(UV_ERRNO_MAP)
|
||||
#if (UV_VERSION_MAJOR > 0)
|
||||
uv_lib_t lib; /**< shared library pointer */
|
||||
#endif
|
||||
#endif
|
||||
void *l; /**< */
|
||||
} u;
|
||||
};
|
||||
|
||||
/*
|
||||
* Event lib library plugin type (when LWS_WITH_EVLIB_PLUGINS)
|
||||
* Public so new event libs can equally be supported outside lws itself
|
||||
*/
|
||||
|
||||
typedef struct lws_plugin_evlib {
|
||||
lws_plugin_header_t hdr;
|
||||
const struct lws_event_loop_ops *ops;
|
||||
} lws_plugin_evlib_t;
|
||||
|
||||
typedef int (*each_plugin_cb_t)(struct lws_plugin *p, void *user);
|
||||
|
||||
/**
|
||||
* lws_plugins_init() - dynamically load plugins of matching class from dirs
|
||||
*
|
||||
* \param pplugin: pointer to linked-list for this kind of plugin
|
||||
* \param d: array of directory paths to look in
|
||||
* \param _class: class string that plugin must declare
|
||||
* \param filter: NULL, or a string that must appear after the third char of the plugin filename
|
||||
* \param each: NULL, or each_plugin_cb_t callback for each instantiated plugin
|
||||
* \param each_user: pointer passed to each callback
|
||||
*
|
||||
* Allows you to instantiate a class of plugins to a specified linked-list.
|
||||
* The each callback allows you to init each inistantiated callback and pass a
|
||||
* pointer each_user to it.
|
||||
*
|
||||
* To take down the plugins, pass a pointer to the linked-list head to
|
||||
* lws_plugins_destroy.
|
||||
*
|
||||
* This is used for lws protocol plugins but you can define your own plugin
|
||||
* class name like "mypluginclass", declare it in your plugin headers, and load
|
||||
* your own plugins to your own list using this api the same way.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_plugins_init(struct lws_plugin **pplugin, const char * const *d,
|
||||
const char *_class, const char *filter,
|
||||
each_plugin_cb_t each, void *each_user);
|
||||
|
||||
/**
|
||||
* lws_plugins_destroy() - dynamically unload list of plugins
|
||||
*
|
||||
* \param pplugin: pointer to linked-list for this kind of plugin
|
||||
* \param each: NULL, or each_plugin_cb_t callback for each instantiated plugin
|
||||
* \param each_user: pointer passed to each callback
|
||||
*
|
||||
* Allows you to destroy a class of plugins from a specified linked-list
|
||||
* created by a call to lws_plugins_init().
|
||||
*
|
||||
* The each callback allows you to deinit each inistantiated callback and pass a
|
||||
* pointer each_user to it, just before its footprint is destroyed.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_plugins_destroy(struct lws_plugin **pplugin, each_plugin_cb_t each,
|
||||
void *each_user);
|
||||
|
||||
#if defined(LWS_WITH_PLUGINS_BUILTIN)
|
||||
|
||||
/* provide exports for builtin plugin protocols */
|
||||
|
||||
extern const struct lws_protocols post_demo_protocols[1];
|
||||
extern const struct lws_protocols lws_raw_proxy_protocols[1];
|
||||
extern const struct lws_protocols lws_status_protocols[1];
|
||||
extern const struct lws_protocols lws_mirror_protocols[1];
|
||||
extern const struct lws_protocols lws_ssh_base_protocols[2];
|
||||
extern const struct lws_protocols post_demo_protocols[1];
|
||||
extern const struct lws_protocols dumb_increment_protocols[1];
|
||||
extern const struct lws_protocols deaddrop_protocols[1];
|
||||
extern const struct lws_protocols lws_raw_test_protocols[1];
|
||||
extern const struct lws_protocols lws_sshd_demo_protocols[1];
|
||||
extern const struct lws_protocols lws_acme_client_protocols[1];
|
||||
extern const struct lws_protocols client_loopback_test_protocols[1];
|
||||
extern const struct lws_protocols fulltext_demo_protocols[1];
|
||||
extern const struct lws_protocols lws_openmetrics_export_protocols[
|
||||
#if defined(LWS_WITH_SERVER) && defined(LWS_WITH_CLIENT) && defined(LWS_ROLE_WS)
|
||||
4
|
||||
#else
|
||||
#if defined(LWS_WITH_SERVER)
|
||||
3
|
||||
#else
|
||||
1
|
||||
#endif
|
||||
#endif
|
||||
];
|
||||
|
||||
#define LWSOMPROIDX_DIRECT_HTTP_SERVER 0
|
||||
#define LWSOMPROIDX_PROX_HTTP_SERVER 1
|
||||
#define LWSOMPROIDX_PROX_WS_SERVER 2
|
||||
#define LWSOMPROIDX_PROX_WS_CLIENT 3
|
||||
|
||||
#endif
|
||||
|
||||
///@}
|
||||
105
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-purify.h
Normal file
105
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-purify.h
Normal file
@ -0,0 +1,105 @@
|
||||
/*
|
||||
* libwebsockets - small server side websockets and web server implementation
|
||||
*
|
||||
* Copyright (C) 2010 - 2019 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
/*! \defgroup pur Sanitize / purify SQL and JSON helpers
|
||||
*
|
||||
* ##Sanitize / purify SQL and JSON helpers
|
||||
*
|
||||
* APIs for escaping untrusted JSON and SQL safely before use
|
||||
*/
|
||||
//@{
|
||||
|
||||
/**
|
||||
* lws_sql_purify() - like strncpy but with escaping for sql quotes
|
||||
*
|
||||
* \param escaped: output buffer
|
||||
* \param string: input buffer ('/0' terminated)
|
||||
* \param len: output buffer max length
|
||||
*
|
||||
* Because escaping expands the output string, it's not
|
||||
* possible to do it in-place, ie, with escaped == string
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN const char *
|
||||
lws_sql_purify(char *escaped, const char *string, size_t len);
|
||||
|
||||
/**
|
||||
* lws_sql_purify_len() - return length of purified version of input string
|
||||
*
|
||||
* \param string: input buffer ('/0' terminated)
|
||||
*
|
||||
* Calculates any character escaping without writing it anywhere and returns the
|
||||
* calculated length of the purified string.
|
||||
*/
|
||||
int
|
||||
lws_sql_purify_len(const char *p);
|
||||
|
||||
/**
|
||||
* lws_json_purify() - like strncpy but with escaping for json chars
|
||||
*
|
||||
* \param escaped: output buffer
|
||||
* \param string: input buffer ('/0' terminated)
|
||||
* \param len: output buffer max length
|
||||
* \param in_used: number of bytes of string we could escape in len
|
||||
*
|
||||
* Because escaping expands the output string, it's not
|
||||
* possible to do it in-place, ie, with escaped == string
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN const char *
|
||||
lws_json_purify(char *escaped, const char *string, int len, int *in_used);
|
||||
|
||||
/**
|
||||
* lws_json_purify_len() - find out the escaped length of a string
|
||||
*
|
||||
* \param string: input buffer ('/0' terminated)
|
||||
*
|
||||
* JSON may have to expand escapes by up to 6x the original depending on what
|
||||
* it is. This doesn't actually do the escaping but goes through the motions
|
||||
* and computes the length of the escaped string.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_json_purify_len(const char *string);
|
||||
|
||||
/**
|
||||
* lws_filename_purify_inplace() - replace scary filename chars with underscore
|
||||
*
|
||||
* \param filename: filename to be purified
|
||||
*
|
||||
* Replace scary characters in the filename (it should not be a path)
|
||||
* with underscore, so it's safe to use.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_filename_purify_inplace(char *filename);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_plat_write_cert(struct lws_vhost *vhost, int is_key, int fd, void *buf,
|
||||
size_t len);
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_plat_write_file(const char *filename, void *buf, size_t len);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_plat_read_file(const char *filename, void *buf, size_t len);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_plat_recommended_rsa_bits(void);
|
||||
///@}
|
||||
67
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-pwm.h
Normal file
67
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-pwm.h
Normal file
@ -0,0 +1,67 @@
|
||||
/*
|
||||
* Generic PWM controller ops
|
||||
*
|
||||
* Copyright (C) 2019 - 2020 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
typedef struct lws_pwm_map {
|
||||
_lws_plat_gpio_t gpio;
|
||||
uint8_t index;
|
||||
uint8_t active_level;
|
||||
} lws_pwm_map_t;
|
||||
|
||||
typedef struct lws_pwm_ops {
|
||||
int (*init)(const struct lws_pwm_ops *lo);
|
||||
void (*intensity)(const struct lws_pwm_ops *lo, _lws_plat_gpio_t gpio,
|
||||
lws_led_intensity_t inten);
|
||||
const lws_pwm_map_t *pwm_map;
|
||||
uint8_t count_pwm_map;
|
||||
} lws_pwm_ops_t;
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_pwm_plat_init(const struct lws_pwm_ops *lo);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_pwm_plat_intensity(const struct lws_pwm_ops *lo, _lws_plat_gpio_t gpio,
|
||||
lws_led_intensity_t inten);
|
||||
|
||||
#define lws_pwm_plat_ops \
|
||||
.init = lws_pwm_plat_init, \
|
||||
.intensity = lws_pwm_plat_intensity
|
||||
|
||||
/*
|
||||
* May be useful for making your own transitions or sequences
|
||||
*/
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN lws_led_intensity_t
|
||||
lws_led_func_linear(lws_led_seq_phase_t n);
|
||||
LWS_VISIBLE LWS_EXTERN lws_led_intensity_t
|
||||
lws_led_func_sine(lws_led_seq_phase_t n);
|
||||
|
||||
/* canned sequences that can work out of the box */
|
||||
|
||||
extern const lws_led_sequence_def_t lws_pwmseq_sine_endless_slow,
|
||||
lws_pwmseq_sine_endless_fast,
|
||||
lws_pwmseq_linear_wipe,
|
||||
lws_pwmseq_sine_up, lws_pwmseq_sine_down,
|
||||
lws_pwmseq_static_on,
|
||||
lws_pwmseq_static_half,
|
||||
lws_pwmseq_static_off;
|
||||
@ -0,0 +1,95 @@
|
||||
/*
|
||||
* libwebsockets - small server side websockets and web server implementation
|
||||
*
|
||||
* Copyright (C) 2010 - 2019 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
typedef struct lws_retry_bo {
|
||||
const uint32_t *retry_ms_table; /* base delay in ms */
|
||||
uint16_t retry_ms_table_count; /* entries in table */
|
||||
uint16_t conceal_count; /* max retries to conceal */
|
||||
uint16_t secs_since_valid_ping; /* idle before PING issued */
|
||||
uint16_t secs_since_valid_hangup; /* idle before hangup conn */
|
||||
uint8_t jitter_percent; /* % additional random jitter */
|
||||
} lws_retry_bo_t;
|
||||
|
||||
#define LWS_RETRY_CONCEAL_ALWAYS (0xffff)
|
||||
|
||||
/**
|
||||
* lws_retry_get_delay_ms() - get next delay from backoff table
|
||||
*
|
||||
* \param lws_context: the lws context (used for getting random)
|
||||
* \param retry: the retry backoff table we are using, or NULL for default
|
||||
* \param ctry: pointer to the try counter
|
||||
* \param conceal: pointer to flag set to nonzero if the try should be concealed
|
||||
* in terms of creating an error
|
||||
*
|
||||
* Increments *\p try and retruns the number of ms that should elapse before the
|
||||
* next connection retry, according to the backoff table \p retry. *\p conceal is
|
||||
* set if the number of tries is less than the backoff table conceal_count, or
|
||||
* is zero if it exceeded it. This lets you conceal a certain number of retries
|
||||
* before alerting the caller there is a problem.
|
||||
*
|
||||
* If \p retry is NULL, a default of 3s + (0..300ms jitter) is used. If it's
|
||||
* non-NULL but jitter_percent is 0, the default of 30% jitter is retained.
|
||||
*/
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN unsigned int
|
||||
lws_retry_get_delay_ms(struct lws_context *context, const lws_retry_bo_t *retry,
|
||||
uint16_t *ctry, char *conceal);
|
||||
|
||||
/**
|
||||
* lws_retry_sul_schedule() - schedule a sul according to the backoff table
|
||||
*
|
||||
* \param lws_context: the lws context (used for getting random)
|
||||
* \param sul: pointer to the sul to schedule
|
||||
* \param retry: the retry backoff table we are using, or NULL for default
|
||||
* \param cb: the callback for when the sul schedule time arrives
|
||||
* \param ctry: pointer to the try counter
|
||||
*
|
||||
* Helper that combines interpreting the retry table with scheduling a sul to
|
||||
* the computed delay. If conceal is not set, it will not schedule the sul
|
||||
* and just return 1. Otherwise the sul is scheduled and it returns 0.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_retry_sul_schedule(struct lws_context *context, int tid,
|
||||
lws_sorted_usec_list_t *sul, const lws_retry_bo_t *retry,
|
||||
sul_cb_t cb, uint16_t *ctry);
|
||||
|
||||
/**
|
||||
* lws_retry_sul_schedule_retry_wsi() - retry sul schedule helper using wsi
|
||||
*
|
||||
* \param wsi: the wsi to set the hrtimer sul on to the next retry interval
|
||||
* \param sul: pointer to the sul to schedule
|
||||
* \param cb: the callback for when the sul schedule time arrives
|
||||
* \param ctry: pointer to the try counter
|
||||
*
|
||||
* Helper that uses context, tid and retry policy from a wsi to call
|
||||
* lws_retry_sul_schedule.
|
||||
*
|
||||
* Since a udp connection can have many writes in flight, the retry count and
|
||||
* the sul used to track each thing that wants to be written have to be handled
|
||||
* individually, not the wsi. But the retry policy and the other things can
|
||||
* be filled in from the wsi conveniently.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_retry_sul_schedule_retry_wsi(struct lws *wsi, lws_sorted_usec_list_t *sul,
|
||||
sul_cb_t cb, uint16_t *ctry);
|
||||
306
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-ring.h
Normal file
306
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-ring.h
Normal file
@ -0,0 +1,306 @@
|
||||
/*
|
||||
* libwebsockets - small server side websockets and web server implementation
|
||||
*
|
||||
* Copyright (C) 2010 - 2019 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
/** \defgroup lws_ring LWS Ringbuffer APIs
|
||||
* ##lws_ring: generic ringbuffer struct
|
||||
*
|
||||
* Provides an abstract ringbuffer api supporting one head and one or an
|
||||
* unlimited number of tails.
|
||||
*
|
||||
* All of the members are opaque and manipulated by lws_ring_...() apis.
|
||||
*
|
||||
* The lws_ring and its buffer is allocated at runtime on the heap, using
|
||||
*
|
||||
* - lws_ring_create()
|
||||
* - lws_ring_destroy()
|
||||
*
|
||||
* It may contain any type, the size of the "element" stored in the ring
|
||||
* buffer and the number of elements is given at creation time.
|
||||
*
|
||||
* When you create the ringbuffer, you can optionally provide an element
|
||||
* destroy callback that frees any allocations inside the element. This is then
|
||||
* automatically called for elements with no tail behind them, ie, elements
|
||||
* which don't have any pending consumer are auto-freed.
|
||||
*
|
||||
* Whole elements may be inserted into the ringbuffer and removed from it, using
|
||||
*
|
||||
* - lws_ring_insert()
|
||||
* - lws_ring_consume()
|
||||
*
|
||||
* You can find out how many whole elements are free or waiting using
|
||||
*
|
||||
* - lws_ring_get_count_free_elements()
|
||||
* - lws_ring_get_count_waiting_elements()
|
||||
*
|
||||
* In addition there are special purpose optional byte-centric apis
|
||||
*
|
||||
* - lws_ring_next_linear_insert_range()
|
||||
* - lws_ring_bump_head()
|
||||
*
|
||||
* which let you, eg, read() directly into the ringbuffer without needing
|
||||
* an intermediate bounce buffer.
|
||||
*
|
||||
* The accessors understand that the ring wraps, and optimizes insertion and
|
||||
* consumption into one or two memcpy()s depending on if the head or tail
|
||||
* wraps.
|
||||
*
|
||||
* lws_ring only supports a single head, but optionally multiple tails with
|
||||
* an API to inform it when the "oldest" tail has moved on. You can give
|
||||
* NULL where-ever an api asks for a tail pointer, and it will use an internal
|
||||
* single tail pointer for convenience.
|
||||
*
|
||||
* The "oldest tail", which is the only tail if you give it NULL instead of
|
||||
* some other tail, is used to track which elements in the ringbuffer are
|
||||
* still unread by anyone.
|
||||
*
|
||||
* - lws_ring_update_oldest_tail()
|
||||
*/
|
||||
///@{
|
||||
struct lws_ring;
|
||||
|
||||
/**
|
||||
* lws_ring_create(): create a new ringbuffer
|
||||
*
|
||||
* \param element_len: the size in bytes of one element in the ringbuffer
|
||||
* \param count: the number of elements the ringbuffer can contain
|
||||
* \param destroy_element: NULL, or callback to be called for each element
|
||||
* that is removed from the ringbuffer due to the
|
||||
* oldest tail moving beyond it
|
||||
*
|
||||
* Creates the ringbuffer and allocates the storage. Returns the new
|
||||
* lws_ring *, or NULL if the allocation failed.
|
||||
*
|
||||
* If non-NULL, destroy_element will get called back for every element that is
|
||||
* retired from the ringbuffer after the oldest tail has gone past it, and for
|
||||
* any element still left in the ringbuffer when it is destroyed. It replaces
|
||||
* all other element destruction code in your user code.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN struct lws_ring *
|
||||
lws_ring_create(size_t element_len, size_t count,
|
||||
void (*destroy_element)(void *element));
|
||||
|
||||
/**
|
||||
* lws_ring_destroy(): destroy a previously created ringbuffer
|
||||
*
|
||||
* \param ring: the struct lws_ring to destroy
|
||||
*
|
||||
* Destroys the ringbuffer allocation and the struct lws_ring itself.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_ring_destroy(struct lws_ring *ring);
|
||||
|
||||
/**
|
||||
* lws_ring_get_count_free_elements(): return how many elements can fit
|
||||
* in the free space
|
||||
*
|
||||
* \param ring: the struct lws_ring to report on
|
||||
*
|
||||
* Returns how much room is left in the ringbuffer for whole element insertion.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN size_t
|
||||
lws_ring_get_count_free_elements(struct lws_ring *ring);
|
||||
|
||||
/**
|
||||
* lws_ring_get_count_waiting_elements(): return how many elements can be consumed
|
||||
*
|
||||
* \param ring: the struct lws_ring to report on
|
||||
* \param tail: a pointer to the tail struct to use, or NULL for single tail
|
||||
*
|
||||
* Returns how many elements are waiting to be consumed from the perspective
|
||||
* of the tail pointer given.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN size_t
|
||||
lws_ring_get_count_waiting_elements(struct lws_ring *ring, uint32_t *tail);
|
||||
|
||||
/**
|
||||
* lws_ring_insert(): attempt to insert up to max_count elements from src
|
||||
*
|
||||
* \param ring: the struct lws_ring to report on
|
||||
* \param src: the array of elements to be inserted
|
||||
* \param max_count: the number of available elements at src
|
||||
*
|
||||
* Attempts to insert as many of the elements at src as possible, up to the
|
||||
* maximum max_count. Returns the number of elements actually inserted.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN size_t
|
||||
lws_ring_insert(struct lws_ring *ring, const void *src, size_t max_count);
|
||||
|
||||
/**
|
||||
* lws_ring_consume(): attempt to copy out and remove up to max_count elements
|
||||
* to src
|
||||
*
|
||||
* \param ring: the struct lws_ring to report on
|
||||
* \param tail: a pointer to the tail struct to use, or NULL for single tail
|
||||
* \param dest: the array of elements to be inserted. or NULL for no copy
|
||||
* \param max_count: the number of available elements at src
|
||||
*
|
||||
* Attempts to copy out as many waiting elements as possible into dest, from
|
||||
* the perspective of the given tail, up to max_count. If dest is NULL, the
|
||||
* copying out is not done but the elements are logically consumed as usual.
|
||||
* NULL dest is useful in combination with lws_ring_get_element(), where you
|
||||
* can use the element direct from the ringbuffer and then call this with NULL
|
||||
* dest to logically consume it.
|
||||
*
|
||||
* Increments the tail position according to how many elements could be
|
||||
* consumed.
|
||||
*
|
||||
* Returns the number of elements consumed.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN size_t
|
||||
lws_ring_consume(struct lws_ring *ring, uint32_t *tail, void *dest,
|
||||
size_t max_count);
|
||||
|
||||
/**
|
||||
* lws_ring_get_element(): get a pointer to the next waiting element for tail
|
||||
*
|
||||
* \param ring: the struct lws_ring to report on
|
||||
* \param tail: a pointer to the tail struct to use, or NULL for single tail
|
||||
*
|
||||
* Points to the next element that tail would consume, directly in the
|
||||
* ringbuffer. This lets you write() or otherwise use the element without
|
||||
* having to copy it out somewhere first.
|
||||
*
|
||||
* After calling this, you must call lws_ring_consume(ring, &tail, NULL, 1)
|
||||
* which will logically consume the element you used up and increment your
|
||||
* tail (tail may also be NULL there if you use a single tail).
|
||||
*
|
||||
* Returns NULL if no waiting element, or a const void * pointing to it.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN const void *
|
||||
lws_ring_get_element(struct lws_ring *ring, uint32_t *tail);
|
||||
|
||||
/**
|
||||
* lws_ring_update_oldest_tail(): free up elements older than tail for reuse
|
||||
*
|
||||
* \param ring: the struct lws_ring to report on
|
||||
* \param tail: a pointer to the tail struct to use, or NULL for single tail
|
||||
*
|
||||
* If you are using multiple tails, you must use this API to inform the
|
||||
* lws_ring when none of the tails still need elements in the fifo any more,
|
||||
* by updating it when the "oldest" tail has moved on.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_ring_update_oldest_tail(struct lws_ring *ring, uint32_t tail);
|
||||
|
||||
/**
|
||||
* lws_ring_get_oldest_tail(): get current oldest available data index
|
||||
*
|
||||
* \param ring: the struct lws_ring to report on
|
||||
*
|
||||
* If you are initializing a new ringbuffer consumer, you can set its tail to
|
||||
* this to start it from the oldest ringbuffer entry still available.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN uint32_t
|
||||
lws_ring_get_oldest_tail(struct lws_ring *ring);
|
||||
|
||||
/**
|
||||
* lws_ring_next_linear_insert_range(): used to write directly into the ring
|
||||
*
|
||||
* \param ring: the struct lws_ring to report on
|
||||
* \param start: pointer to a void * set to the start of the next ringbuffer area
|
||||
* \param bytes: pointer to a size_t set to the max length you may use from *start
|
||||
*
|
||||
* This provides a low-level, bytewise access directly into the ringbuffer
|
||||
* allowing direct insertion of data without having to use a bounce buffer.
|
||||
*
|
||||
* The api reports the position and length of the next linear range that can
|
||||
* be written in the ringbuffer, ie, up to the point it would wrap, and sets
|
||||
* *start and *bytes accordingly. You can then, eg, directly read() into
|
||||
* *start for up to *bytes, and use lws_ring_bump_head() to update the lws_ring
|
||||
* with what you have done.
|
||||
*
|
||||
* Returns nonzero if no insertion is currently possible.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_ring_next_linear_insert_range(struct lws_ring *ring, void **start,
|
||||
size_t *bytes);
|
||||
|
||||
/**
|
||||
* lws_ring_bump_head(): used to write directly into the ring
|
||||
*
|
||||
* \param ring: the struct lws_ring to operate on
|
||||
* \param bytes: the number of bytes you inserted at the current head
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_ring_bump_head(struct lws_ring *ring, size_t bytes);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_ring_dump(struct lws_ring *ring, uint32_t *tail);
|
||||
|
||||
/*
|
||||
* This is a helper that combines the common pattern of needing to consume
|
||||
* some ringbuffer elements, move the consumer tail on, and check if that
|
||||
* has moved any ringbuffer elements out of scope, because it was the last
|
||||
* consumer that had not already consumed them.
|
||||
*
|
||||
* Elements that go out of scope because the oldest tail is now after them
|
||||
* get garbage-collected by calling the destroy_element callback on them
|
||||
* defined when the ringbuffer was created.
|
||||
*/
|
||||
|
||||
#define lws_ring_consume_and_update_oldest_tail(\
|
||||
___ring, /* the lws_ring object */ \
|
||||
___type, /* type of objects with tails */ \
|
||||
___ptail, /* ptr to tail of obj with tail doing consuming */ \
|
||||
___count, /* count of payload objects being consumed */ \
|
||||
___list_head, /* head of list of objects with tails */ \
|
||||
___mtail, /* member name of tail in ___type */ \
|
||||
___mlist /* member name of next list member ptr in ___type */ \
|
||||
) { \
|
||||
int ___n, ___m; \
|
||||
\
|
||||
___n = lws_ring_get_oldest_tail(___ring) == *(___ptail); \
|
||||
lws_ring_consume(___ring, ___ptail, NULL, ___count); \
|
||||
if (___n) { \
|
||||
uint32_t ___oldest; \
|
||||
___n = 0; \
|
||||
___oldest = *(___ptail); \
|
||||
lws_start_foreach_llp(___type **, ___ppss, ___list_head) { \
|
||||
___m = (int)lws_ring_get_count_waiting_elements( \
|
||||
___ring, &(*___ppss)->___mtail); \
|
||||
if (___m >= ___n) { \
|
||||
___n = ___m; \
|
||||
___oldest = (*___ppss)->___mtail; \
|
||||
} \
|
||||
} lws_end_foreach_llp(___ppss, ___mlist); \
|
||||
\
|
||||
lws_ring_update_oldest_tail(___ring, ___oldest); \
|
||||
} \
|
||||
}
|
||||
|
||||
/*
|
||||
* This does the same as the lws_ring_consume_and_update_oldest_tail()
|
||||
* helper, but for the simpler case there is only one consumer, so one
|
||||
* tail, and that tail is always the oldest tail.
|
||||
*/
|
||||
|
||||
#define lws_ring_consume_single_tail(\
|
||||
___ring, /* the lws_ring object */ \
|
||||
___ptail, /* ptr to tail of obj with tail doing consuming */ \
|
||||
___count /* count of payload objects being consumed */ \
|
||||
) { \
|
||||
lws_ring_consume(___ring, ___ptail, NULL, ___count); \
|
||||
lws_ring_update_oldest_tail(___ring, *(___ptail)); \
|
||||
}
|
||||
///@}
|
||||
@ -0,0 +1,362 @@
|
||||
/*
|
||||
* libwebsockets - small server side websockets and web server implementation
|
||||
*
|
||||
* Copyright (C) 2019 - 2020 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*
|
||||
* This is the headers for secure stream api variants that deal with clients in
|
||||
* different threads or even different processes.
|
||||
*
|
||||
* lws_ss_ when client is directly using the event loop
|
||||
* lws_sstc_ when client is in a different thread to the event loop
|
||||
* lws_sspc_ when client is in a different process to the event loop
|
||||
*
|
||||
* The client api is almost the same except the slightly diffent names.
|
||||
*
|
||||
* This header is included as part of libwebsockets.h, for link against the
|
||||
* libwebsockets library.
|
||||
*/
|
||||
|
||||
/*
|
||||
* lws_sspc_ apis... different process
|
||||
*/
|
||||
|
||||
/*
|
||||
* Helper translation so user code written to lws_ss_ can be built for
|
||||
* lws_sspc_ in one step by #define LWS_SS_USE_SSPC before including
|
||||
*/
|
||||
|
||||
|
||||
struct lws_sspc_handle;
|
||||
|
||||
#if defined(LWS_SS_USE_SSPC)
|
||||
#define lws_ss_handle lws_sspc_handle
|
||||
#define lws_ss_create lws_sspc_create
|
||||
#define lws_ss_destroy lws_sspc_destroy
|
||||
#define lws_ss_request_tx lws_sspc_request_tx
|
||||
#define lws_ss_request_tx_len lws_sspc_request_tx_len
|
||||
#define lws_ss_client_connect lws_sspc_client_connect
|
||||
#define lws_ss_get_sequencer lws_sspc_get_sequencer
|
||||
#define lws_ss_proxy_create lws_sspc_proxy_create
|
||||
#define lws_ss_get_context lws_sspc_get_context
|
||||
#define lws_ss_rideshare lws_sspc_rideshare
|
||||
#define lws_ss_set_metadata lws_sspc_set_metadata
|
||||
#define lws_ss_get_metadata lws_sspc_get_metadata
|
||||
#define lws_ss_add_peer_tx_credit lws_sspc_add_peer_tx_credit
|
||||
#define lws_ss_get_est_peer_tx_credit lws_sspc_get_est_peer_tx_credit
|
||||
#define lws_ss_start_timeout lws_sspc_start_timeout
|
||||
#define lws_ss_cancel_timeout lws_sspc_cancel_timeout
|
||||
#define lws_ss_to_user_object lws_sspc_to_user_object
|
||||
#define lws_ss_change_handlers lws_sspc_change_handlers
|
||||
#define lws_smd_ss_rx_forward lws_smd_sspc_rx_forward
|
||||
#define lws_ss_server_ack lws_sspc_server_ack
|
||||
#define lws_ss_tag lws_sspc_tag
|
||||
#define _lws_fi_user_ss_fi _lws_fi_user_sspc_fi
|
||||
#define lwsl_ss_get_cx lwsl_sspc_get_cx
|
||||
|
||||
#undef lwsl_ss
|
||||
#define lwsl_ss lwsl_sspc
|
||||
|
||||
#undef lwsl_hexdump_ss
|
||||
#define lwsl_hexdump_ss lwsl_hexdump_sspc
|
||||
#endif
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_log_prepend_sspc(struct lws_log_cx *cx, void *obj, char **p, char *e);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN struct lws_log_cx *
|
||||
lwsl_sspc_get_cx(struct lws_sspc_handle *ss);
|
||||
|
||||
#define lwsl_sspc(_h, _fil, ...) \
|
||||
_lws_log_cx(lwsl_sspc_get_cx(_h), lws_log_prepend_sspc, _h, \
|
||||
_fil, __func__, __VA_ARGS__)
|
||||
|
||||
#define lwsl_hexdump_sspc(_h, _fil, _buf, _len) \
|
||||
lwsl_hexdump_level_cx(lwsl_sspc_get_cx(_h), \
|
||||
lws_log_prepend_sspc, \
|
||||
_h, _fil, _buf, _len)
|
||||
|
||||
/*
|
||||
* lwsl_sspc
|
||||
*/
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_ERR)
|
||||
#define lwsl_sspc_err(_w, ...) lwsl_sspc(_w, LLL_ERR, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_sspc_err(_w, ...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_WARN)
|
||||
#define lwsl_sspc_warn(_w, ...) lwsl_sspc(_w, LLL_WARN, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_sspc_warn(_w, ...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_NOTICE)
|
||||
#define lwsl_sspc_notice(_w, ...) lwsl_sspc(_w, LLL_NOTICE, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_sspc_notice(_w, ...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_INFO)
|
||||
#define lwsl_sspc_info(_w, ...) lwsl_sspc(_w, LLL_INFO, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_sspc_info(_w, ...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_DEBUG)
|
||||
#define lwsl_sspc_debug(_w, ...) lwsl_sspc(_w, LLL_DEBUG, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_sspc_debug(_w, ...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_PARSER)
|
||||
#define lwsl_sspc_parser(_w, ...) lwsl_sspc(_w, LLL_PARSER, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_sspc_parser(_w, ...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_HEADER)
|
||||
#define lwsl_sspc_header(_w, ...) lwsl_sspc(_w, LLL_HEADER, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_sspc_header(_w, ...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_EXT)
|
||||
#define lwsl_sspc_ext(_w, ...) lwsl_sspc(_w, LLL_EXT, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_sspc_ext(_w, ...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_CLIENT)
|
||||
#define lwsl_sspc_client(_w, ...) lwsl_sspc(_w, LLL_CLIENT, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_sspc_client(_w, ...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_LATENCY)
|
||||
#define lwsl_sspc_latency(_w, ...) lwsl_sspc(_w, LLL_LATENCY, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_sspc_latency(_w, ...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_THREAD)
|
||||
#define lwsl_sspc_thread(_w, ...) lwsl_sspc(_w, LLL_THREAD, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_sspc_thread(_w, ...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#if (_LWS_ENABLED_LOGS & LLL_USER)
|
||||
#define lwsl_sspc_user(_w, ...) lwsl_sspc(_w, LLL_USER, __VA_ARGS__)
|
||||
#else
|
||||
#define lwsl_sspc_user(_w, ...) do {} while(0)
|
||||
#endif
|
||||
|
||||
#define lwsl_hexdump_sspc_err(_v, ...) lwsl_hexdump_sspc(_v, LLL_ERR, __VA_ARGS__)
|
||||
#define lwsl_hexdump_sspc_warn(_v, ...) lwsl_hexdump_sspc(_v, LLL_WARN, __VA_ARGS__)
|
||||
#define lwsl_hexdump_sspc_notice(_v, ...) lwsl_hexdump_sspc(_v, LLL_NOTICE, __VA_ARGS__)
|
||||
#define lwsl_hexdump_sspc_info(_v, ...) lwsl_hexdump_sspc(_v, LLL_INFO, __VA_ARGS__)
|
||||
#define lwsl_hexdump_sspc_debug(_v, ...) lwsl_hexdump_sspc(_v, LLL_DEBUG, __VA_ARGS__)
|
||||
|
||||
/*
|
||||
* How lws refers to your per-proxy-link private data... not allocated or freed
|
||||
* by lws, nor used except to pass a pointer to it through to ops callbacks
|
||||
* below. Should be set to your transport private instance object, it's set to
|
||||
* the wsi for the wsi transport. Notice it is provided as a ** (ptr-to-ptr) in
|
||||
* most apis.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Stub context when using LWS_ONLY_SSPC
|
||||
*/
|
||||
|
||||
struct lws_context_standalone {
|
||||
lws_txp_path_client_t txp_cpath;
|
||||
lws_dll2_owner_t ss_client_owner;
|
||||
uint32_t ssidx;
|
||||
};
|
||||
|
||||
#if defined(STANDALONE)
|
||||
#define lws_context lws_context_standalone
|
||||
struct lws_context_standalone;
|
||||
#endif
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_sspc_create(struct lws_context *context, int tsi, const lws_ss_info_t *ssi,
|
||||
void *opaque_user_data, struct lws_sspc_handle **ppss,
|
||||
void *reserved, const char **ppayload_fmt);
|
||||
|
||||
/**
|
||||
* lws_sspc_destroy() - Destroy secure stream
|
||||
*
|
||||
* \param ppss: pointer to lws_ss_t pointer to be destroyed
|
||||
*
|
||||
* Destroys the lws_ss_t pointed to by *ppss, and sets *ppss to NULL.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_sspc_destroy(struct lws_sspc_handle **ppss);
|
||||
|
||||
/**
|
||||
* lws_sspc_request_tx() - Schedule stream for tx
|
||||
*
|
||||
* \param pss: pointer to lws_ss_t representing stream that wants to transmit
|
||||
*
|
||||
* Schedules a write on the stream represented by \p pss. When it's possible to
|
||||
* write on this stream, the *tx callback will occur with an empty buffer for
|
||||
* the stream owner to fill in.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN lws_ss_state_return_t
|
||||
lws_sspc_request_tx(struct lws_sspc_handle *pss);
|
||||
|
||||
/**
|
||||
* lws_sspc_request_tx_len() - Schedule stream for tx with length hint
|
||||
*
|
||||
* \param h: pointer to handle representing stream that wants to transmit
|
||||
* \param len: the length of the write in bytes
|
||||
*
|
||||
* Schedules a write on the stream represented by \p pss. When it's possible to
|
||||
* write on this stream, the *tx callback will occur with an empty buffer for
|
||||
* the stream owner to fill in.
|
||||
*
|
||||
* This api variant should be used when it's possible the payload will go out
|
||||
* over h1 with x-web-form-urlencoded or similar Content-Type.
|
||||
*
|
||||
* The serialized, sspc type api actually serializes and forwards the length
|
||||
* hint to its upstream proxy, where it's available for use to produce the
|
||||
* internet-capable protocol framing.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN lws_ss_state_return_t
|
||||
lws_sspc_request_tx_len(struct lws_sspc_handle *h, unsigned long len);
|
||||
|
||||
/**
|
||||
* lws_sspc_client_connect() - Attempt the client connect
|
||||
*
|
||||
* \param h: secure streams handle
|
||||
*
|
||||
* Starts the connection process for the secure stream. Returns 0.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN lws_ss_state_return_t
|
||||
lws_sspc_client_connect(struct lws_sspc_handle *h);
|
||||
|
||||
/**
|
||||
* lws_sspc_proxy_create() - Start a unix domain socket proxy for Secure Streams
|
||||
*
|
||||
* \param context: lws_context
|
||||
*
|
||||
* Creates a vhost that listens on an abstract namespace unix domain socket at
|
||||
* address "proxy.ss.lws". Client connections to this proxy to Secure Streams
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_sspc_proxy_create(struct lws_context *context);
|
||||
|
||||
/**
|
||||
* lws_ss_get_context() - convenience helper to recover the lws context
|
||||
*
|
||||
* \h: secure streams handle
|
||||
*
|
||||
* Returns the lws context. Dispenses with the need to pass a copy of it into
|
||||
* your secure streams handler.
|
||||
*/
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN struct lws_context *
|
||||
lws_sspc_get_context(struct lws_sspc_handle *h);
|
||||
|
||||
#if defined(LWS_WITH_NETWORK)
|
||||
extern const struct lws_protocols lws_sspc_protocols[2];
|
||||
#endif
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN const char *
|
||||
lws_sspc_rideshare(struct lws_sspc_handle *h);
|
||||
|
||||
|
||||
/**
|
||||
* lws_sspc_set_metadata() - allow user to bind external data to defined ss metadata
|
||||
*
|
||||
* \h: secure streams handle
|
||||
* \name: metadata name from the policy
|
||||
* \value: pointer to user-managed data to bind to name
|
||||
* \len: length of the user-managed data in value
|
||||
*
|
||||
* Binds user-managed data to the named metadata item from the ss policy.
|
||||
* If present, the metadata item is handled in a protocol-specific way using
|
||||
* the associated policy information. For example, in the policy
|
||||
*
|
||||
* "\"metadata\":" "["
|
||||
* "{\"uptag\":" "\"X-Upload-Tag:\"},"
|
||||
* "{\"ctype\":" "\"Content-Type:\"},"
|
||||
* "{\"xctype\":" "\"X-Content-Type:\"}"
|
||||
* "],"
|
||||
*
|
||||
* when the policy is using h1 is interpreted to add h1 headers of the given
|
||||
* name with the value of the metadata on the left.
|
||||
*
|
||||
* Return 0 if OK, or nonzero if failed.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_sspc_set_metadata(struct lws_sspc_handle *h, const char *name,
|
||||
const void *value, size_t len);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_sspc_get_metadata(struct lws_sspc_handle *h, const char *name,
|
||||
const void **value, size_t *len);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_sspc_add_peer_tx_credit(struct lws_sspc_handle *h, int32_t add);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_sspc_get_est_peer_tx_credit(struct lws_sspc_handle *h);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_sspc_start_timeout(struct lws_sspc_handle *h, unsigned int timeout_ms);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_sspc_cancel_timeout(struct lws_sspc_handle *h);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void *
|
||||
lws_sspc_to_user_object(struct lws_sspc_handle *h);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_sspc_change_handlers(struct lws_sspc_handle *h,
|
||||
lws_sscb_rx rx,lws_sscb_tx tx, lws_sscb_state state);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_sspc_server_ack(struct lws_sspc_handle *h, int nack);
|
||||
|
||||
|
||||
/*
|
||||
* Helpers offered by lws to handle transport SSPC-side proxy link events
|
||||
*/
|
||||
|
||||
/**
|
||||
* lws_sspc_tag() - get the sspc log tag
|
||||
*
|
||||
* \param h: the sspc handle
|
||||
*
|
||||
* Returns the sspc log tag, to assist in logging traceability
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN const char *
|
||||
lws_sspc_tag(struct lws_sspc_handle *h);
|
||||
|
||||
|
||||
#if defined(STANDALONE)
|
||||
#undef lws_context
|
||||
#endif
|
||||
|
||||
|
||||
@ -0,0 +1,392 @@
|
||||
/*
|
||||
* libwebsockets - small server side websockets and web server implementation
|
||||
*
|
||||
* Copyright (C) 2019 - 2021 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*
|
||||
* included from libwebsockets.h
|
||||
*/
|
||||
|
||||
typedef int (*plugin_auth_status_cb)(struct lws_ss_handle *ss, int status);
|
||||
|
||||
/**
|
||||
* lws_ss_plugin_auth_t - api for an auth plugin
|
||||
*
|
||||
* Auth plugins create and sequence authenticated connections that can carry one
|
||||
* or more streams to an endpoint. That may involve other connections to other
|
||||
* places to eg, gather authenticated tokens and then make the real connection
|
||||
* using the tokens.
|
||||
*
|
||||
* The secure stream object contains members to record which auth plugin the
|
||||
* stream is bound to and an over-allocation of the secure stream object to
|
||||
* contain the plugin auth private data.
|
||||
*
|
||||
* The auth plugin controls the state of the stream connection via the status
|
||||
* callback, and handles retries.
|
||||
*
|
||||
* Network connections may require one kind of auth sequencing, and streams
|
||||
* inside those connections another kind of auth sequencing depending on their
|
||||
* role. So the secure stream object allows defining plugins for both kinds.
|
||||
*
|
||||
* Streams may disappear at any time and require reauth to bring a new one up.
|
||||
* The auth plugin sequencer will connect / reconnect either on demand, or from
|
||||
* the start and after any connectivity loss if any stream using the connection
|
||||
* has the LWSSSPOLF_NAILED_UP flag.
|
||||
*/
|
||||
|
||||
/* the public, const metrics policy definition */
|
||||
|
||||
typedef struct lws_metric_policy {
|
||||
/* order of first two mandated by JSON policy parsing scope union */
|
||||
const struct lws_metric_policy *next;
|
||||
const char *name;
|
||||
|
||||
const char *report;
|
||||
|
||||
/**< the metrics policy name in the policy, used to bind to it */
|
||||
uint64_t us_schedule;
|
||||
/**< us interval between lws_system metrics api reports */
|
||||
|
||||
uint32_t us_decay_unit;
|
||||
/**< how many us to decay avg by half, 0 = no decay */
|
||||
uint8_t min_contributors;
|
||||
/**< before we can judge something is an outlier */
|
||||
} lws_metric_policy_t;
|
||||
|
||||
typedef struct lws_ss_x509 {
|
||||
struct lws_ss_x509 *next;
|
||||
const char *vhost_name; /**< vhost name using cert ctx */
|
||||
const uint8_t *ca_der; /**< DER x.509 cert */
|
||||
size_t ca_der_len; /**< length of DER cert */
|
||||
uint8_t keep:1; /**< ie, if used in server tls */
|
||||
} lws_ss_x509_t;
|
||||
|
||||
enum {
|
||||
LWSSSPOLF_OPPORTUNISTIC = (1 << 0),
|
||||
/**< the connection doesn't exist unless client asks to write */
|
||||
LWSSSPOLF_NAILED_UP = (1 << 1),
|
||||
/**< the connection tries to be connected the whole life of the ss */
|
||||
LWSSSPOLF_URGENT_TX = (1 << 2),
|
||||
/**< this connection carries critical tx data */
|
||||
LWSSSPOLF_URGENT_RX = (1 << 3),
|
||||
/**< this connection carries critical rx data */
|
||||
LWSSSPOLF_TLS = (1 << 4),
|
||||
/**< stream must be connected via a tls tunnel */
|
||||
LWSSSPOLF_LONG_POLL = (1 << 5),
|
||||
/**< stream used to receive async rx at arbitrary intervals */
|
||||
LWSSSPOLF_AUTH_BEARER = (1 << 6),
|
||||
/**< for http, use lws_system auth token 0 in authentication: bearer */
|
||||
LWSSSPOLF_HTTP_NO_CONTENT_LENGTH = (1 << 7),
|
||||
/**< don't add any content length even if we have it */
|
||||
LWSSSPOLF_QUIRK_NGHTTP2_END_STREAM = (1 << 8),
|
||||
/**< set the client flag LCCSCF_H2_QUIRK_NGHTTP2_END_STREAM */
|
||||
LWSSSPOLF_H2_QUIRK_OVERFLOWS_TXCR = (1 << 9),
|
||||
/**< set the client flag LCCSCF_H2_QUIRK_OVERFLOWS_TXCR */
|
||||
LWSSSPOLF_H2_QUIRK_UNCLEAN_HPACK_STATE = (1 << 10),
|
||||
/**< HPACK decoder state does not end cleanly */
|
||||
LWSSSPOLF_HTTP_MULTIPART = (1 << 11),
|
||||
/**< indicates stream goes out as specifically a multipart mime POST
|
||||
* section... if the tx has LWSSS_FLAG_COALESCE_CONTINUES flag then more
|
||||
* multipart sections are expected. Without it, the multipart wrapper
|
||||
* is closed and the http transaction issue completed when this message
|
||||
* finishes. */
|
||||
LWSSSPOLF_HTTP_X_WWW_FORM_URLENCODED = (1 << 12),
|
||||
/**< set up lws_system client cert */
|
||||
LWSSSPOLF_LOCAL_SINK = (1 << 13),
|
||||
/**< expected to bind to a local sink only */
|
||||
LWSSSPOLF_WAKE_SUSPEND__VALIDITY = (1 << 14),
|
||||
/**< this stream's idle validity checks are critical enough we
|
||||
* should arrange to wake from suspend to perform them
|
||||
*/
|
||||
LWSSSPOLF_SERVER = (1 << 15),
|
||||
/**< we listen on a socket as a server */
|
||||
LWSSSPOLF_ALLOW_REDIRECTS = (1 << 16),
|
||||
/**< follow redirects */
|
||||
LWSSSPOLF_HTTP_MULTIPART_IN = (1 << 17),
|
||||
/**< handle inbound multipart mime at SS level */
|
||||
|
||||
LWSSSPOLF_ATTR_LOW_LATENCY = (1 << 18),
|
||||
/**< stream requires low latency */
|
||||
LWSSSPOLF_ATTR_HIGH_THROUGHPUT = (1 << 19),
|
||||
/**< stream requires high throughput */
|
||||
LWSSSPOLF_ATTR_HIGH_RELIABILITY = (1 << 20),
|
||||
/**< stream requires high reliability */
|
||||
LWSSSPOLF_ATTR_LOW_COST = (1 << 21),
|
||||
/**< stream is not critical and should be handled as cheap as poss */
|
||||
LWSSSPOLF_PERF = (1 << 22),
|
||||
/**< capture and report performace information */
|
||||
LWSSSPOLF_DIRECT_PROTO_STR = (1 << 23),
|
||||
/**< metadata as direct protocol string, e.g. http header */
|
||||
LWSSSPOLF_HTTP_CACHE_COOKIES = (1 << 24),
|
||||
/**< Record http cookies and pass them back on future requests */
|
||||
LWSSSPOLF_PRIORITIZE_READS = (1 << 25),
|
||||
/**< prioritize clearing reads at expense of writes */
|
||||
|
||||
};
|
||||
|
||||
typedef struct lws_ss_trust_store {
|
||||
struct lws_ss_trust_store *next;
|
||||
const char *name;
|
||||
|
||||
const lws_ss_x509_t *ssx509[6];
|
||||
int count;
|
||||
} lws_ss_trust_store_t;
|
||||
|
||||
enum {
|
||||
LWSSSP_H1,
|
||||
LWSSSP_H2,
|
||||
LWSSSP_WS,
|
||||
LWSSSP_MQTT,
|
||||
LWSSSP_RAW,
|
||||
|
||||
|
||||
LWSSS_HBI_AUTH = 0,
|
||||
LWSSS_HBI_DSN,
|
||||
LWSSS_HBI_FWV,
|
||||
LWSSS_HBI_TYPE,
|
||||
|
||||
_LWSSS_HBI_COUNT /* always last */
|
||||
};
|
||||
|
||||
/*
|
||||
* This does for both the static policy metadata entry, and the runtime metadata
|
||||
* handling object.
|
||||
*/
|
||||
|
||||
typedef struct lws_ss_metadata {
|
||||
struct lws_ss_metadata *next;
|
||||
const char *name;
|
||||
void *value__may_own_heap;
|
||||
size_t length;
|
||||
|
||||
uint8_t value_length; /* only valid if set by policy */
|
||||
uint8_t value_is_http_token; /* valid if set by policy */
|
||||
#if defined(LWS_WITH_SS_DIRECT_PROTOCOL_STR)
|
||||
uint8_t name_on_lws_heap:1; /* proxy metatadata does this */
|
||||
#endif
|
||||
uint8_t value_on_lws_heap:1; /* proxy + rx metadata does this */
|
||||
#if defined(LWS_WITH_SECURE_STREAMS_PROXY_API)
|
||||
uint8_t pending_onward:1;
|
||||
#endif
|
||||
} lws_ss_metadata_t;
|
||||
|
||||
typedef struct lws_ss_http_respmap {
|
||||
uint16_t resp; /* the http response code */
|
||||
uint16_t state; /* low 16-bits of associated state */
|
||||
} lws_ss_http_respmap_t;
|
||||
|
||||
/*
|
||||
* This is a mapping between an auth streamtype and a name and other information
|
||||
* that can be independently instantiated. Other streamtypes can indicate they
|
||||
* require this authentication on their connection.
|
||||
*/
|
||||
|
||||
typedef struct lws_ss_auth {
|
||||
struct lws_ss_auth *next;
|
||||
const char *name;
|
||||
|
||||
const char *type;
|
||||
const char *streamtype;
|
||||
uint8_t blob_index;
|
||||
} lws_ss_auth_t;
|
||||
|
||||
/**
|
||||
* lws_ss_policy_t: policy database entry for a stream type
|
||||
*
|
||||
* Decides the system policy for how to implement connections of name
|
||||
* .streamtype.
|
||||
*
|
||||
* Streams may need one kind of auth sequencing for the network connection and
|
||||
* another kind of auth sequencing for the streams that are carried inside it,
|
||||
* this is the purpose of .nauth and .sauth. Both are optional and may be NULL.
|
||||
*
|
||||
* An array of these is set at context creation time, ending with one with a
|
||||
* NULL streamtype.
|
||||
*/
|
||||
typedef struct lws_ss_policy {
|
||||
struct lws_ss_policy *next;
|
||||
const char *streamtype; /**< stream type lhs to match on */
|
||||
|
||||
const char *endpoint; /**< DNS address to connect to */
|
||||
const char *rideshare_streamtype; /**< optional transport
|
||||
* on another, preexisting stream of this
|
||||
* streamtype name */
|
||||
const char *payload_fmt;
|
||||
const char *socks5_proxy;
|
||||
lws_ss_metadata_t *metadata; /* linked-list of metadata */
|
||||
const lws_metric_policy_t *metrics; /* linked-list of metric policies */
|
||||
const lws_ss_auth_t *auth; /* NULL or auth object we bind to */
|
||||
|
||||
#if defined(LWS_WITH_SERVER)
|
||||
const struct lws_protocol_vhost_options *pvo;
|
||||
#endif
|
||||
|
||||
/* protocol-specific connection policy details */
|
||||
|
||||
union {
|
||||
|
||||
#if defined(LWS_ROLE_H1) || defined(LWS_ROLE_H2) || defined(LWS_ROLE_WS)
|
||||
|
||||
/* details for http-related protocols... */
|
||||
|
||||
struct {
|
||||
|
||||
/* common to all http-related protocols */
|
||||
|
||||
const char *method;
|
||||
const char *url;
|
||||
|
||||
const char *multipart_name;
|
||||
const char *multipart_filename;
|
||||
const char *multipart_content_type;
|
||||
|
||||
const char *blob_header[_LWSSS_HBI_COUNT];
|
||||
const char *auth_preamble;
|
||||
|
||||
const lws_ss_http_respmap_t *respmap;
|
||||
|
||||
union {
|
||||
// struct { /* LWSSSP_H1 */
|
||||
// } h1;
|
||||
// struct { /* LWSSSP_H2 */
|
||||
// } h2;
|
||||
struct { /* LWSSSP_WS */
|
||||
const char *subprotocol;
|
||||
uint8_t binary;
|
||||
/* false = TEXT, true = BINARY */
|
||||
} ws;
|
||||
} u;
|
||||
|
||||
uint16_t resp_expect;
|
||||
uint8_t count_respmap;
|
||||
uint8_t fail_redirect:1;
|
||||
} http;
|
||||
|
||||
#endif
|
||||
|
||||
#if defined(LWS_ROLE_MQTT)
|
||||
|
||||
struct {
|
||||
const char *topic; /* stream sends on this topic */
|
||||
const char *subscribe; /* stream subscribes to this topic */
|
||||
|
||||
const char *will_topic;
|
||||
const char *will_message;
|
||||
|
||||
const char *birth_topic;
|
||||
const char *birth_message;
|
||||
|
||||
uint16_t keep_alive;
|
||||
uint8_t qos;
|
||||
uint8_t clean_start;
|
||||
uint8_t will_qos;
|
||||
uint8_t will_retain;
|
||||
uint8_t birth_qos;
|
||||
uint8_t birth_retain;
|
||||
uint8_t aws_iot;
|
||||
uint8_t retain;
|
||||
|
||||
} mqtt;
|
||||
|
||||
#endif
|
||||
|
||||
/* details for non-http related protocols... */
|
||||
} u;
|
||||
|
||||
#if defined(LWS_WITH_SECURE_STREAMS_AUTH_SIGV4)
|
||||
/* directly point to the metadata name, no need to expand */
|
||||
const char *aws_region;
|
||||
const char *aws_service;
|
||||
#endif
|
||||
/*
|
||||
* We're either a client connection policy that wants a trust store,
|
||||
* or we're a server policy that wants a mem cert and key... Hold
|
||||
* these mutually-exclusive things in a union.
|
||||
*/
|
||||
|
||||
union {
|
||||
const lws_ss_trust_store_t *store;
|
||||
/**< CA certs needed for conn validation, only set between
|
||||
* policy parsing and vhost creation */
|
||||
struct {
|
||||
const lws_ss_x509_t *cert;
|
||||
/**< the server's signed cert with the pubkey */
|
||||
const lws_ss_x509_t *key;
|
||||
/**< the server's matching private key */
|
||||
} server;
|
||||
} trust;
|
||||
|
||||
const lws_retry_bo_t *retry_bo; /**< retry policy to use */
|
||||
|
||||
int32_t txc;
|
||||
int32_t txc_peer;
|
||||
|
||||
uint32_t proxy_buflen; /**< max dsh alloc for proxy */
|
||||
uint32_t proxy_buflen_rxflow_on_above;
|
||||
uint32_t proxy_buflen_rxflow_off_below;
|
||||
|
||||
uint32_t client_buflen; /**< max dsh alloc for client */
|
||||
uint32_t client_buflen_rxflow_on_above;
|
||||
uint32_t client_buflen_rxflow_off_below;
|
||||
|
||||
uint32_t timeout_ms; /**< default message response
|
||||
* timeout in ms */
|
||||
uint32_t flags; /**< stream attribute flags */
|
||||
|
||||
uint16_t port; /**< endpoint port */
|
||||
|
||||
uint8_t metadata_count; /**< metadata count */
|
||||
uint8_t protocol; /**< protocol index */
|
||||
uint8_t client_cert; /**< which client cert to apply
|
||||
0 = none, 1+ = cc 0+ */
|
||||
uint8_t priority; /* 0 = normal, 6 = max normal,
|
||||
* 7 = network management */
|
||||
} lws_ss_policy_t;
|
||||
|
||||
#if !defined(LWS_WITH_SECURE_STREAMS_STATIC_POLICY_ONLY)
|
||||
|
||||
/*
|
||||
* These only exist / have meaning if there's a dynamic JSON policy enabled
|
||||
*/
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_ss_policy_parse_begin(struct lws_context *context, int overlay);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_ss_policy_parse_abandon(struct lws_context *context);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_ss_policy_parse(struct lws_context *context, const uint8_t *buf, size_t len);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_ss_policy_overlay(struct lws_context *context, const char *overlay);
|
||||
|
||||
/*
|
||||
* You almost certainly don't want these, they return the first policy or auth
|
||||
* object in a linked-list of objects created by lws_ss_policy_parse above,
|
||||
* they are exported to generate static policy with
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN const lws_ss_policy_t *
|
||||
lws_ss_policy_get(struct lws_context *context);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN const lws_ss_auth_t *
|
||||
lws_ss_auth_get(struct lws_context *context);
|
||||
|
||||
#endif
|
||||
@ -0,0 +1,599 @@
|
||||
/*
|
||||
* libwebsockets - small server side websockets and web server implementation
|
||||
*
|
||||
* Copyright (C) 2019 - 2021 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*
|
||||
* included from libwebsockets.h
|
||||
*
|
||||
* This defines the Serialized Secure Streams framing, and the optional
|
||||
* lws_transport_mux framing.
|
||||
*
|
||||
* APIs are declared for lws_transport and binding those to the SSPC and proxy
|
||||
* sides in lws.
|
||||
*/
|
||||
|
||||
#if defined(STANDALONE)
|
||||
struct lws_context_standalone;
|
||||
#define lws_context lws_context_standalone
|
||||
#endif
|
||||
|
||||
#define LWSSSS_VERSION 1
|
||||
|
||||
typedef enum {
|
||||
/*
|
||||
* This is the Serialized Serure Streams framing. It's sufficient to
|
||||
* carry all SS API actions over a point-to-point bytestream between
|
||||
* an SSPC client and an SS oroxy, in both directions.
|
||||
*
|
||||
* These serialized streams may be multiplexed by the transport (eg,
|
||||
* for unix domain sockets transport, each SS opens its own UDS socket
|
||||
* to the proxy) or via lws_transport_mux framing encapsulation.
|
||||
*
|
||||
*
|
||||
* Framing for Proxy -> Client direction
|
||||
*/
|
||||
|
||||
LWSSS_SER_RXPRE_RX_PAYLOAD = 0x55,
|
||||
/*
|
||||
* Proxied rx
|
||||
*
|
||||
* - 0: LWSSS_SER_RXPRE_RX_PAYLOAD
|
||||
* - 1: 2 byte MSB-first rest-of-frame length
|
||||
* - 3: 4-byte MSB-first flags
|
||||
* - 7: 4-byte MSB-first us between inbound read and wrote to client
|
||||
* - 11: 8-byte MSB-first us resolution unix time proxy wrote to client
|
||||
* - 17: (rideshare name len + rideshare name if flags &
|
||||
* LWSSS_FLAG_RIDESHARE) payload
|
||||
*/
|
||||
LWSSS_SER_RXPRE_CREATE_RESULT,
|
||||
/*
|
||||
* Proxied connection setup result
|
||||
*
|
||||
* - 0: LWSSS_SER_RXPRE_CREATE_RESULT
|
||||
* - 1: 2 byte MSB-first rest-of-frame length (usually 00, 03)
|
||||
* - 3: 1 byte result, 0 = success. On failure, proxy will close
|
||||
* connection.
|
||||
* - 4: 4 byte client dsh allocation recommended for stream type,
|
||||
* from policy (introduced in SSSv1)
|
||||
* - 8: 2 byte MSB-first initial tx credit
|
||||
* - 10: if present, comma-sep list of rideshare types from policy
|
||||
*/
|
||||
LWSSS_SER_RXPRE_CONNSTATE,
|
||||
/*
|
||||
* Proxied state (8 or 11 byte packet)
|
||||
*
|
||||
* - 0: LWSSS_SER_RXPRE_CONNSTATE
|
||||
* - 1: 00, 05 if state < 256, else 00, 08
|
||||
* - 3: 1 byte state index if state < 256, else 4-byte MSB-first
|
||||
* state index
|
||||
* - 4 or 7: 4-byte MSB-first ordinal
|
||||
*/
|
||||
LWSSS_SER_RXPRE_TXCR_UPDATE,
|
||||
/*
|
||||
* Proxied tx credit
|
||||
*
|
||||
* - 0: LWSSS_SER_RXPRE_TXCR_UPDATE
|
||||
* - 1: 00, 04
|
||||
* - 3: 4-byte MSB-first addition tx credit bytes
|
||||
*/
|
||||
LWSSS_SER_RXPRE_METADATA,
|
||||
/*
|
||||
* Proxied rx metadata
|
||||
*
|
||||
* - 0: LWSSS_SER_RXPRE_METADATA
|
||||
* - 1: 2-byte MSB-first rest-of-frame length
|
||||
* - 3: 1-byte metadata name length
|
||||
* - 4: metadata name
|
||||
* - ...: metadata value (for rest of packet)
|
||||
*/
|
||||
LWSSS_SER_RXPRE_TLSNEG_ENCLAVE_SIGN,
|
||||
/* reserved */
|
||||
LWSSS_SER_RXPRE_PERF,
|
||||
/*
|
||||
* Proxied performance information
|
||||
*
|
||||
* - 0: LWSSS_SER_RXPRE_PERF
|
||||
* - 1: 2-byte MSB-first rest-of-frame length
|
||||
* - 3: ... performance JSON (for rest of packet)
|
||||
*/
|
||||
|
||||
/*
|
||||
* Framing for Client -> Proxy direction
|
||||
*/
|
||||
|
||||
LWSSS_SER_TXPRE_STREAMTYPE = 0xaa,
|
||||
/*
|
||||
* Proxied connection setup
|
||||
*
|
||||
* - 0: LWSSS_SER_TXPRE_STREAMTYPE
|
||||
* - 1: 2-byte MSB-first rest-of-frame length
|
||||
* - 3: 1-byte Client SSS protocol version (introduced in SSSv1)
|
||||
* - 4: 4-byte Client PID (introduced in SSSv1)
|
||||
* - 8: 4-byte MSB-first initial tx credit
|
||||
* - 12: the streamtype name with no NUL
|
||||
*/
|
||||
LWSSS_SER_TXPRE_ONWARD_CONNECT,
|
||||
/*
|
||||
* Proxied request for onward connection
|
||||
*
|
||||
* - 0: LWSSS_SER_TXPRE_ONWARD_CONNECT
|
||||
* - 1: 00, 00
|
||||
*/
|
||||
LWSSS_SER_TXPRE_DESTROYING,
|
||||
/*
|
||||
* Proxied secure stream destroy
|
||||
*
|
||||
* - 0: LWSSS_SER_TXPRE_DESTROYING
|
||||
* - 1: 00, 00
|
||||
*/
|
||||
LWSSS_SER_TXPRE_TX_PAYLOAD,
|
||||
/*
|
||||
* Proxied tx
|
||||
*
|
||||
* - 0: LWSSS_SER_TXPRE_TX_PAYLOAD
|
||||
* - 1: 2 byte MSB-first rest-of-frame length
|
||||
* - 3: 4-byte MSB-first flags
|
||||
* - 7: 4-byte MSB-first us between client requested write and wrote
|
||||
* to proxy
|
||||
* - 11: 8-byte MSB-first us resolution unix time client wrote to proxy
|
||||
* - 19: ...payload (for rest of packet)
|
||||
*/
|
||||
LWSSS_SER_TXPRE_METADATA,
|
||||
/*
|
||||
* Proxied metadata - sent when one metadata item set clientside
|
||||
*
|
||||
* - 0: LWSSS_SER_TXPRE_METADATA
|
||||
* - 1: 2-byte MSB-first rest-of-frame length
|
||||
* - 3: 1-byte metadata name length
|
||||
* - 4: metadata name
|
||||
* - ...: metadata value (for rest of packet)
|
||||
*/
|
||||
LWSSS_SER_TXPRE_TXCR_UPDATE,
|
||||
/*
|
||||
* TX credit management - sent when using tx credit apis, cf METADATA
|
||||
*
|
||||
* - 0: LWSSS_SER_TXPRE_TXCR_UPDATE
|
||||
* - 1: 2-byte MSB-first rest-of-frame length 00, 04
|
||||
* - 3: 4-byte additional tx credit adjust value
|
||||
*/
|
||||
LWSSS_SER_TXPRE_TIMEOUT_UPDATE,
|
||||
/*
|
||||
* Stream timeout management - forwarded when user applying or
|
||||
* cancelling t.o.
|
||||
*
|
||||
* - 0: LWSSS_SER_TXPRE_TIMEOUT_UPDATE
|
||||
* - 1: 2-byte MSB-first rest-of-frame length 00, 04
|
||||
* - 3: 4-byte MSB-first unsigned 32-bit timeout,
|
||||
* 0 = use policy, -1 = cancel
|
||||
*/
|
||||
LWSSS_SER_TXPRE_PAYLOAD_LENGTH_HINT,
|
||||
/*
|
||||
* Passing up payload length hint
|
||||
*
|
||||
* - 0: LWSSS_SER_TXPRE_PAYLOAD_LENGTH_HINT
|
||||
* - 1: 2-byte MSB-first rest-of-frame length 00, 04
|
||||
* - 3: 4-byte MSB-first unsigned 32-bit payload length hint
|
||||
*/
|
||||
LWSSS_SER_TXPRE_TLSNEG_ENCLAVE_SIGNED,
|
||||
/* reserved */
|
||||
LWSSS_SER_TXPRE_LINK_VALIDITY_PROBE,
|
||||
} lws_sss_cmds_t;
|
||||
|
||||
/* SSPC serialization states */
|
||||
|
||||
typedef enum {
|
||||
LPCSPROX_WAIT_INITIAL_TX = 1, /* after connect, must send streamtype */
|
||||
LPCSPROX_REPORTING_FAIL, /* stream creation failed, wait to to tell */
|
||||
LPCSPROX_REPORTING_OK, /* stream creation succeeded, wait to to tell */
|
||||
LPCSPROX_OPERATIONAL, /* ready for payloads */
|
||||
LPCSPROX_DESTROYED,
|
||||
|
||||
LPCSCLI_SENDING_INITIAL_TX, /* after connect, must send streamtype */
|
||||
LPCSCLI_WAITING_CREATE_RESULT, /* wait to hear if proxy ss create OK */
|
||||
LPCSCLI_LOCAL_CONNECTED, /* we are in touch with the proxy */
|
||||
LPCSCLI_ONWARD_CONNECT, /* request onward ss connection */
|
||||
LPCSCLI_OPERATIONAL, /* ready for payloads */
|
||||
|
||||
} lws_ss_conn_states_t;
|
||||
|
||||
/*
|
||||
* Optional multiplexing layer
|
||||
*
|
||||
* Either side can:
|
||||
*
|
||||
* - open and close channels asynchronously
|
||||
* - send and receive transport-level (not mux channel) timed PINGs / PONGs
|
||||
* - send and receive data bound to an open mux channel
|
||||
*
|
||||
* PONGs are produced and sent automatically on recipt of a PING from the peer
|
||||
* The peer sends a PONGACK so the single transaction can validate connection
|
||||
* viability in both directions.
|
||||
*/
|
||||
|
||||
enum {
|
||||
LWSSSS_LLM_CHANNEL_REQ = 0xf0,
|
||||
/**<
|
||||
* Either side proposes to open a new mux channel
|
||||
*
|
||||
* - 0: LWSSSS_LLM_CHANNEL_REQ
|
||||
* - 1: 1-byte mux channel index, client initiated: first free from
|
||||
* zero up, server initiated: first free from 0xff down
|
||||
*/
|
||||
LWSSSS_LLM_CHANNEL_ACK,
|
||||
/**<
|
||||
* Positive response to earlier LWSSSS_LLM_CHANNEL_REQ
|
||||
*
|
||||
* - 0: LWSSSS_LLM_CHANNEL_ACK
|
||||
* - 1: 1-byte mux channel index, from the reqyuest
|
||||
*/
|
||||
LWSSSS_LLM_CHANNEL_NACK,
|
||||
/**<
|
||||
* Negative response to earlier LWSSSS_LLM_CHANNEL_REQ. This also acts
|
||||
* as a FIN if one arrives on a channel unsolicited.
|
||||
*
|
||||
* - 0: LWSSSS_LLM_CHANNEL_NACK
|
||||
* - 1: 1-byte mux channel index, from the reqyuest
|
||||
*/
|
||||
LWSSSS_LLM_CHANNEL_CLOSE,
|
||||
/**<
|
||||
* Either side informs peer it is closing a mux channel
|
||||
*
|
||||
* - 0: LWSSSS_LLM_CHANNEL_CLOSE
|
||||
* - 1: 1-byte mux channel index
|
||||
*/
|
||||
LWSSSS_LLM_CHANNEL_CLOSE_ACK,
|
||||
/**<
|
||||
* Peer acknowledges closing a mux channel, so it can be reused
|
||||
*
|
||||
* - 0: LWSSSS_LLM_CHANNEL_CLOSE_ACK
|
||||
* - 1: 1-byte mux channel index
|
||||
*/
|
||||
LWSSSS_LLM_MUX,
|
||||
/**<
|
||||
* Encapsulate data on an open mux channel
|
||||
*
|
||||
* - 0: LWSSSS_LLM_MUX
|
||||
* - 1: 1-byte mux channel index
|
||||
* - 2: 2-byte MSB-first rest-of-frame length
|
||||
* - 4... mux payload
|
||||
*/
|
||||
LWSSSS_LLM_PING,
|
||||
/**<
|
||||
* Either side wants to validate communication on mux transport
|
||||
*
|
||||
* - 0: LWSSSS_LLM_PING
|
||||
* - 1: 8-byte MSB-first us resolution unix time this was issued
|
||||
*/
|
||||
LWSSSS_LLM_PONG,
|
||||
/**<
|
||||
* Either side responds to peer's PING.
|
||||
*
|
||||
* - 0: LWSSSS_LLM_PONG
|
||||
* - 1: 8-byte MSB-first us resolution unix time from PING
|
||||
* - 9: 8-byte MSB-first us resolution unix time this PONG sent
|
||||
*/
|
||||
LWSSSS_LLM_PONGACK,
|
||||
/**<
|
||||
* When the original PING sender receives a PONG, it immediately sends
|
||||
* a PINGACK, which is not replied to. This allows the other side to
|
||||
* also know the connection is valid in both directions, with only one
|
||||
* side needing to issue PINGs.
|
||||
*
|
||||
* It also synchronizes both sides' understanding of the transport
|
||||
* validity in one transaction.
|
||||
*
|
||||
* - 0: LWSSSS_LLM_PONGACK
|
||||
* - 1: 8-byte MSB-first us resolution unix time from PING
|
||||
*/
|
||||
LWSSSS_LLM_RESET_TRANSPORT,
|
||||
/**<
|
||||
* Either side can issue this to indicate they no longer trust the
|
||||
* transport link. They should close all their channels and enter a
|
||||
* state trying to resync using 3-way PINGs
|
||||
*/
|
||||
};
|
||||
|
||||
typedef void * lws_transport_priv_t; /* care - this is a pointer type already */
|
||||
struct lws_transport_mux;
|
||||
struct lws_sss_proxy_conn;
|
||||
struct lws_transport_client_ops;
|
||||
struct lws_transport_proxy_ops;
|
||||
struct lws_sspc_handle;
|
||||
|
||||
/*
|
||||
* These describe the path through different transport layers. Each has an
|
||||
* 'in' and 'onw' (onward) side that can be bound to different parts in lws.
|
||||
* SSPC and the SS Proxy code in lws each exposes one of these as terminals
|
||||
* for the "path" to handle the SS Serialization on each side.
|
||||
*
|
||||
* sspc-transport-wsi and proxy-transport-wsi expose possible endpoints for the
|
||||
* paths, so you can simply "wire SSPC and proxy up to a wsi transport".
|
||||
*
|
||||
* You can also create a lws_transport_mux_t and interpose it in the transport
|
||||
* path on each side, and produce your own custom lws_transport ops implementing
|
||||
* arbitrary transport support.
|
||||
*/
|
||||
|
||||
typedef struct lws_txp_path_client {
|
||||
const struct lws_transport_client_ops *ops_in;
|
||||
lws_transport_priv_t priv_in;
|
||||
const struct lws_transport_client_ops *ops_onw;
|
||||
lws_transport_priv_t priv_onw;
|
||||
struct lws_transport_mux *mux;
|
||||
} lws_txp_path_client_t;
|
||||
|
||||
typedef struct lws_txp_path_proxy {
|
||||
const struct lws_transport_proxy_ops *ops_in;
|
||||
lws_transport_priv_t priv_in;
|
||||
const struct lws_transport_proxy_ops *ops_onw;
|
||||
lws_transport_priv_t priv_onw;
|
||||
struct lws_transport_mux *mux;
|
||||
} lws_txp_path_proxy_t;
|
||||
|
||||
/*
|
||||
* Operations for client-side transport
|
||||
*/
|
||||
|
||||
typedef struct lws_transport_client_ops {
|
||||
const char *name;
|
||||
|
||||
int (*event_retry_connect)(lws_txp_path_client_t *path,
|
||||
struct lws_sspc_handle *h);
|
||||
/**< Attempt to create a new connection / channel to the proxy */
|
||||
lws_ss_state_return_t (*event_connect_disposition)(
|
||||
struct lws_sspc_handle *h, int disposition);
|
||||
/**< Connection attempt result, disposition 9 = success, else failed */
|
||||
void (*req_write)(lws_transport_priv_t priv);
|
||||
/**< Request a write to the proxy on this channel */
|
||||
int (*_write)(lws_transport_priv_t priv, uint8_t *buf, size_t len);
|
||||
/**< Write the requested data on the channel to the proxy *** MUST have
|
||||
* LWS_PRE usable behind buf */
|
||||
lws_ss_state_return_t (*event_read)(lws_transport_priv_t priv,
|
||||
const uint8_t *buf, size_t len);
|
||||
/**< len bytes at buf have been received */
|
||||
void (*lost_coherence)(lws_transport_priv_t priv);
|
||||
/**< report that the framing inside the mux channel is broken */
|
||||
void (*_close)(lws_transport_priv_t priv);
|
||||
/**< Close the channel to the proxy */
|
||||
void (*event_stream_up)(lws_transport_priv_t priv);
|
||||
/**< Called when a new channel to the proxy is acknowledged as up */
|
||||
void (*event_client_up)(lws_transport_priv_t priv);
|
||||
/**< Called when a client channel is acknowledged as up */
|
||||
lws_ss_state_return_t (*event_can_write)(struct lws_sspc_handle *h,
|
||||
size_t metadata_limit);
|
||||
/**< Called when possible to write on the transport, after req_write */
|
||||
lws_ss_state_return_t (*event_closed)(lws_transport_priv_t priv /*struct lws_sspc_handle *h */);
|
||||
/**< we notice an onward proxy connection had closed */
|
||||
uint32_t flags;
|
||||
/**< Used for DSH creation flags */
|
||||
uint32_t dsh_splitat;
|
||||
} lws_transport_client_ops_t;
|
||||
|
||||
/*
|
||||
* Operations for proxy-side transport
|
||||
*/
|
||||
|
||||
typedef struct lws_transport_proxy_ops {
|
||||
const char *name;
|
||||
int (*init_proxy_server)(struct lws_context *context,
|
||||
const struct lws_transport_proxy_ops *txp_ops_inward,
|
||||
lws_transport_priv_t txp_priv_inward,
|
||||
lws_txp_path_proxy_t *txp_ppath, const void *aux,
|
||||
const char *bind, int port);
|
||||
/**< Instantiate a proxy transport... bind/port are as shown for wsi
|
||||
* transport, but may be overloaded to provide transport-specific init */
|
||||
int (*destroy_proxy_server)(struct lws_context *context);
|
||||
lws_ss_state_return_t (*event_new_conn)(struct lws_context *cx,
|
||||
const struct lws_transport_proxy_ops *txp_ops_inward,
|
||||
lws_transport_priv_t txp_priv_inward,
|
||||
#if defined(LWS_WITH_SYS_FAULT_INJECTION)
|
||||
const lws_fi_ctx_t *fic,
|
||||
#endif
|
||||
struct lws_sss_proxy_conn **conn,
|
||||
lws_transport_priv_t txp_priv);
|
||||
/**< proxy has received a new connection from client */
|
||||
void (*event_onward_bind)(lws_transport_priv_t priv,
|
||||
struct lws_ss_handle *h);
|
||||
/**< Called when the proxy creates an onward SS for a client channel */
|
||||
void (*proxy_req_write)(lws_transport_priv_t priv);
|
||||
/**< Request a write to the proxy on this channel */
|
||||
lws_ss_state_return_t (*event_proxy_can_write)(
|
||||
lws_transport_priv_t priv
|
||||
#if defined(LWS_WITH_SYS_FAULT_INJECTION)
|
||||
, const lws_fi_ctx_t *fic
|
||||
#endif
|
||||
);
|
||||
/**< Transport can now be written on, after earlier proxy_req_write */
|
||||
int (*proxy_write)(lws_transport_priv_t priv, uint8_t *buf, size_t *len);
|
||||
/**< Write the requested data on the channel to the proxy *** MUST have
|
||||
* LWS_PRE usable behind buf. May do partial writes, len is set on return
|
||||
* to actual length written*/
|
||||
lws_ss_state_return_t (*event_close_conn)(
|
||||
struct lws_sss_proxy_conn *conn);
|
||||
/**< proxy sees an existing conn closes */
|
||||
#if defined(LWS_WITH_SYS_FAULT_INJECTION)
|
||||
const lws_fi_ctx_t * (*fault_context)(lws_transport_priv_t priv);
|
||||
/**< Get the fault context relating to the proxy connection, if any */
|
||||
#endif
|
||||
lws_ss_state_return_t (*close_conn)(struct lws_sss_proxy_conn *conn);
|
||||
/**< called to handle closure of underlying transport */
|
||||
lws_ss_state_return_t (*proxy_read)(lws_transport_priv_t priv,
|
||||
const uint8_t *buf, size_t len);
|
||||
void (*event_client_up)(lws_transport_priv_t priv);
|
||||
/**< Called when the proxy has accepted a new client conn */
|
||||
int (*proxy_check_write_more)(lws_transport_priv_t priv);
|
||||
/**< optional, allows checking if we can write again */
|
||||
uint32_t flags; /* dsh flags */
|
||||
} lws_transport_proxy_ops_t;
|
||||
|
||||
/* lws_transport_mux parser states */
|
||||
|
||||
enum lwstmc_parser {
|
||||
LWSTMCPAR_CMD,
|
||||
LWSTMCPAR_CHIDX_DONE,
|
||||
LWSTMCPAR_CHIDX,
|
||||
LWSTMCPAR_PLENH,
|
||||
LWSTMCPAR_PLENL,
|
||||
LWSTMCPAR_PAY,
|
||||
LWSTMCPAR_T64_1,
|
||||
LWSTMCPAR_T64_2
|
||||
};
|
||||
|
||||
/* lws_transport_mux channel definitions */
|
||||
|
||||
typedef uint8_t lws_mux_ch_idx_t;
|
||||
#define LWS_MUCH_RANGE 256
|
||||
|
||||
/* lws_transport mux states */
|
||||
|
||||
enum {
|
||||
/* lws_transport_mux_ch_t created */
|
||||
LWSTMC_PENDING_CREATE_CHANNEL, /* waiting to send create channel */
|
||||
LWSTMC_AWAITING_CREATE_CHANNEL_ACK, /* sent create ch, awaiting ack */
|
||||
LWSTMC_PENDING_CREATE_CHANNEL_NACK, /* waiting to send create ch ack */
|
||||
LWSTMC_PENDING_CREATE_CHANNEL_ACK, /* waiting to send create ch ack */
|
||||
LWSTMC_OPERATIONAL, /* had ack, we are operational */
|
||||
LWSTMC_PENDING_CLOSE_CHANNEL, /* waiting to send close channel */
|
||||
LWSTMC_AWAITING_CLOSE_CHANNEL_ACK, /* sent close ch, awaiting ack */
|
||||
LWSTMC_PENDING_CLOSE_CHANNEL_ACK, /* waiting to send close ch ack */
|
||||
/* lws_transport_mux_ch_t destroyed */
|
||||
};
|
||||
|
||||
#define LWS_TRANSPORT_MUXCH_MAGIC LWS_FOURCC('T', 'm', 'C', 'h')
|
||||
#define assert_is_tmch(_tm) lws_assert_fourcc(_tm->magic, LWS_TRANSPORT_MUXCH_MAGIC)
|
||||
|
||||
typedef struct lws_transport_mux_ch {
|
||||
#if defined(_DEBUG)
|
||||
uint32_t magic;
|
||||
#endif
|
||||
lws_dll2_t list;
|
||||
lws_dll2_t list_pending_tx;
|
||||
lws_transport_priv_t priv;
|
||||
lws_sorted_usec_list_t sul;
|
||||
void *opaque;
|
||||
lws_mux_ch_idx_t ch_idx;
|
||||
uint8_t state;
|
||||
uint8_t server:1;
|
||||
} lws_transport_mux_ch_t;
|
||||
|
||||
enum { /* states of the transport */
|
||||
LWSTM_TRANSPORT_DOWN,
|
||||
LWSTM_OPERATIONAL,
|
||||
};
|
||||
|
||||
#define LWSTMINFO_SERVER (1 << 0)
|
||||
|
||||
typedef struct lws_transport_info {
|
||||
uint32_t ping_interval_us;
|
||||
/**< us inbetween transport mux sending pings on transport */
|
||||
uint32_t pong_grace_us;
|
||||
/**< us we should wait for pong before assuming transport down */
|
||||
lws_txp_path_client_t txp_cpath;
|
||||
lws_txp_path_proxy_t txp_ppath;
|
||||
struct lws_transport_info *onward_txp_info;
|
||||
uint32_t flags; /* LWSTMINFO_.... */
|
||||
} lws_transport_info_t;
|
||||
|
||||
#define LWS_TRANSPORT_MUX_MAGIC LWS_FOURCC('I', 's', 'T', 'M')
|
||||
#define assert_is_tm(_tm) lws_assert_fourcc(_tm->magic, LWS_TRANSPORT_MUX_MAGIC)
|
||||
|
||||
typedef struct lws_transport_mux {
|
||||
#if defined(_DEBUG)
|
||||
uint32_t magic;
|
||||
#endif
|
||||
struct lws_context *cx;
|
||||
lws_transport_info_t info;
|
||||
lws_sorted_usec_list_t sul_ping;
|
||||
void *txp_handle;
|
||||
void *txp_aux;
|
||||
uint64_t us_ping_in;
|
||||
uint64_t us_ping_out;
|
||||
uint64_t us_unixtime_peer;
|
||||
uint64_t us_unixtime_peer_loc;
|
||||
uint64_t mp_time;
|
||||
uint64_t mp_time1;
|
||||
enum lwstmc_parser mp_state;
|
||||
uint32_t mp_pay; /* remaining payload */
|
||||
uint8_t mp_cmd;
|
||||
lws_mux_ch_idx_t mp_idx;
|
||||
uint8_t mp_ctr;
|
||||
uint32_t _open[LWS_MUCH_RANGE / 32];
|
||||
uint32_t fin[LWS_MUCH_RANGE / 32];
|
||||
lws_dll2_owner_t pending_tx;
|
||||
lws_dll2_owner_t owner; /* lws_mux_ch_t */
|
||||
uint8_t link_state;
|
||||
uint8_t issue_ping:1;
|
||||
uint8_t issue_pong:1;
|
||||
uint8_t issue_pongack:1;
|
||||
uint8_t awaiting_pong:1;
|
||||
} lws_transport_mux_t;
|
||||
|
||||
lws_transport_mux_t *
|
||||
lws_transport_mux_create(struct lws_context *cx, lws_transport_info_t *info,
|
||||
void *txp_handle);
|
||||
|
||||
void
|
||||
lws_transport_mux_destroy(lws_transport_mux_t **tm);
|
||||
|
||||
void
|
||||
lws_transport_mux_request_tx(lws_transport_mux_t *tm);
|
||||
|
||||
#if defined(_DEBUG)
|
||||
void
|
||||
lws_transport_path_client_dump(lws_txp_path_client_t *path, const char *ctx);
|
||||
void
|
||||
lws_transport_path_proxy_dump(lws_txp_path_proxy_t *path, const char *ctx);
|
||||
#else
|
||||
#define lws_transport_path_client_dump(_a, _b)
|
||||
#define lws_transport_path_proxy_dump(_a, _b)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Callback set used to customize parser and _pending apis
|
||||
*/
|
||||
|
||||
typedef struct lws_txp_mux_parse_cbs {
|
||||
int (*payload)(lws_transport_mux_ch_t *tmc, const uint8_t *buf,
|
||||
size_t len);
|
||||
int (*ch_opens)(lws_transport_mux_ch_t *tmc, int determination);
|
||||
int (*ch_closes)(lws_transport_mux_ch_t *tmc);
|
||||
void (*txp_req_write)(lws_transport_mux_t *tm);
|
||||
int (*txp_can_write)(lws_transport_mux_ch_t *tmc);
|
||||
} lws_txp_mux_parse_cbs_t;
|
||||
|
||||
int
|
||||
lws_transport_mux_rx_parse(lws_transport_mux_t *tm, const uint8_t *buf,
|
||||
size_t len, const lws_txp_mux_parse_cbs_t *cbs);
|
||||
|
||||
int /* nonzero if the transport mux has filled buf and wants to write it */
|
||||
lws_transport_mux_pending(lws_transport_mux_t *tm, uint8_t *buf, size_t *len,
|
||||
const lws_txp_mux_parse_cbs_t *cbs);
|
||||
|
||||
extern const lws_transport_client_ops_t lws_transport_mux_client_ops;
|
||||
extern const lws_transport_proxy_ops_t lws_transport_mux_proxy_ops;
|
||||
|
||||
extern const lws_transport_client_ops_t lws_txp_inside_sspc;
|
||||
extern const lws_transport_proxy_ops_t lws_txp_inside_proxy;
|
||||
|
||||
#if defined(STANDALONE)
|
||||
#undef lws_context
|
||||
#endif
|
||||
|
||||
@ -0,0 +1,47 @@
|
||||
/*
|
||||
* libwebsockets - small server side websockets and web server implementation
|
||||
*
|
||||
* Copyright (C) 2019 - 2021 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*
|
||||
*
|
||||
* These headers are related to providing user Secure Streams Serialization
|
||||
* transport implementations in user code.
|
||||
*
|
||||
* The default implementation uses wsi for proxy serving and connecting clients,
|
||||
* but it's also possible to provide user implementations of the operations
|
||||
* needed to serve on a different transport for proxy, and to connect out on
|
||||
* the different transport for client.
|
||||
*
|
||||
* You can provide your own lws_sss_ops_client_t and lws_sss_ops_proxy_t to
|
||||
* control how serialized data is transmitted and received, to use SS
|
||||
* serialization over, eg, UART instead.
|
||||
*
|
||||
* This allows situations where full SS proxy services can be offered to much
|
||||
* weker devices, without any networking stack or tls library being needed.
|
||||
*/
|
||||
|
||||
/*
|
||||
* SSS Proxy Transport-related implementation apis
|
||||
*/
|
||||
|
||||
struct lws_sss_proxy_conn;
|
||||
|
||||
|
||||
@ -0,0 +1,713 @@
|
||||
/*
|
||||
* libwebsockets - small server side websockets and web server implementation
|
||||
*
|
||||
* Copyright (C) 2019 - 2021 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*
|
||||
* included from libwebsockets.h
|
||||
*
|
||||
*
|
||||
* Secure Streams is a *payload-only* client communication channel where all the
|
||||
* details about the connection are held in a systemwide policy database and
|
||||
* are keyed by the streamtype field... the user of the communication channel
|
||||
* does not know or manage the choice of endpoint, tls CA, or even wire
|
||||
* protocol. The advantage is he then does not have any dependency on any of
|
||||
* those and they can be changed just by changing the policy database without
|
||||
* touching the code using the stream.
|
||||
*
|
||||
* There are two ways secure streams interfaces to user code:
|
||||
*
|
||||
* 1) [Linux / RTOS] the natural, smallest interface is to call back to user
|
||||
* code that only operates directly from the lws event loop thread context
|
||||
* (direct callbacks from lws_ss_t)
|
||||
*
|
||||
* lws_thread( [user code] ---- lws )
|
||||
*
|
||||
* 2) [Linux] where the user code is in a different process and communicates
|
||||
* asynchronously via a proxy socket
|
||||
*
|
||||
* user_process{ [user code] | shim | socket-}------ lws_process{ lws }
|
||||
*
|
||||
* In the second, IPC, case, all packets are prepended by one or more bytes
|
||||
* indicating the packet type and serializing any associated data, known as
|
||||
* Serialized Secure Streams or SSS.
|
||||
*/
|
||||
|
||||
/** \defgroup secstr Secure Streams
|
||||
* ##Secure Streams
|
||||
*
|
||||
* Secure Streams related apis
|
||||
*/
|
||||
///@{
|
||||
|
||||
#define LWS_SS_MTU 1540
|
||||
|
||||
struct lws_ss_handle;
|
||||
typedef uint32_t lws_ss_tx_ordinal_t;
|
||||
|
||||
#if defined(STANDALONE)
|
||||
#define lws_context lws_context_standalone
|
||||
struct lws_context_standalone;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* connection state events
|
||||
*
|
||||
* If you add states, take care about the state names and state transition
|
||||
* validity enforcement tables too
|
||||
*/
|
||||
typedef enum {
|
||||
/* zero means unset */
|
||||
LWSSSCS_CREATING = 1,
|
||||
LWSSSCS_DISCONNECTED,
|
||||
LWSSSCS_UNREACHABLE, /* oridinal arg = 1 = caused by dns
|
||||
* server reachability failure */
|
||||
LWSSSCS_AUTH_FAILED,
|
||||
LWSSSCS_CONNECTED,
|
||||
LWSSSCS_CONNECTING,
|
||||
LWSSSCS_DESTROYING,
|
||||
LWSSSCS_POLL,
|
||||
LWSSSCS_ALL_RETRIES_FAILED, /* all retries in bo policy failed */
|
||||
LWSSSCS_QOS_ACK_REMOTE, /* remote peer received and acked tx */
|
||||
LWSSSCS_QOS_NACK_REMOTE,
|
||||
LWSSSCS_QOS_ACK_LOCAL, /* local proxy accepted our tx */
|
||||
LWSSSCS_QOS_NACK_LOCAL, /* local proxy refused our tx */
|
||||
LWSSSCS_TIMEOUT, /* optional timeout timer fired */
|
||||
|
||||
LWSSSCS_SERVER_TXN,
|
||||
LWSSSCS_SERVER_UPGRADE, /* the server protocol upgraded */
|
||||
|
||||
LWSSSCS_EVENT_WAIT_CANCELLED, /* somebody called lws_cancel_service */
|
||||
|
||||
LWSSSCS_UPSTREAM_LINK_RETRY, /* if we are being proxied over some
|
||||
* intermediate link, this transient
|
||||
* state may be sent to indicate we are
|
||||
* waiting to establish that link before
|
||||
* creation can proceed.. ack is the
|
||||
* number of ms we have been trying */
|
||||
|
||||
LWSSSCS_SINK_JOIN, /* sinks get this when a new source
|
||||
* stream joins the sink */
|
||||
LWSSSCS_SINK_PART, /* sinks get this when a new source
|
||||
* stream leaves the sink */
|
||||
|
||||
LWSSSCS_USER_BASE = 1000
|
||||
} lws_ss_constate_t;
|
||||
|
||||
enum {
|
||||
LWSSS_FLAG_SOM = (1 << 0),
|
||||
/* payload contains the start of new message */
|
||||
LWSSS_FLAG_EOM = (1 << 1),
|
||||
/* payload contains the end of message */
|
||||
LWSSS_FLAG_POLL = (1 << 2),
|
||||
/* Not a real transmit... poll for rx if protocol needs it */
|
||||
LWSSS_FLAG_RELATED_START = (1 << 3),
|
||||
/* Appears in a zero-length message indicating a message group of zero
|
||||
* or more messages is now starting. */
|
||||
LWSSS_FLAG_RELATED_END = (1 << 4),
|
||||
/* Appears in a zero-length message indicating a message group of zero
|
||||
* or more messages has now finished. */
|
||||
LWSSS_FLAG_RIDESHARE = (1 << 5),
|
||||
/* Serialized payload starts with non-default rideshare name length and
|
||||
* name string without NUL, then payload */
|
||||
LWSSS_FLAG_PERF_JSON = (1 << 6),
|
||||
/* This RX is JSON performance data, only on streams with "perf" flag
|
||||
* set */
|
||||
};
|
||||
|
||||
/*
|
||||
* Returns from state() callback can tell the caller what the user code
|
||||
* wants to do
|
||||
*/
|
||||
|
||||
typedef enum lws_ss_state_return {
|
||||
LWSSSSRET_TX_DONT_SEND = 1, /* (*tx) only, or failure */
|
||||
|
||||
LWSSSSRET_OK = 0, /* no error */
|
||||
LWSSSSRET_DISCONNECT_ME = -1, /* caller should disconnect us */
|
||||
LWSSSSRET_DESTROY_ME = -2, /* caller should destroy us */
|
||||
} lws_ss_state_return_t;
|
||||
|
||||
/**
|
||||
* lws_ss_info_t: information about stream to be created
|
||||
*
|
||||
* Prepare this struct with information about what the stream type is and how
|
||||
* the stream should interface with your code, and pass it to lws_ss_create()
|
||||
* to create the requested stream.
|
||||
*/
|
||||
|
||||
enum {
|
||||
LWSSSINFLAGS_REGISTER_SINK = (1 << 0),
|
||||
/**< If set, we're not creating a specific stream, but registering
|
||||
* ourselves as the "sink" for .streamtype. It's analogous to saying
|
||||
* we want to be the many-to-one "server" for .streamtype; when other
|
||||
* streams are created with that streamtype, they should be forwarded
|
||||
* to this stream owner, where they join and part from the sink via
|
||||
* (*state) LWSSSCS_SINK_JOIN / _PART events, the new client handle
|
||||
* being provided in the h_src parameter.
|
||||
*/
|
||||
LWSSSINFLAGS_PROXIED = (1 << 1),
|
||||
/**< Set if the stream is being created as a stand-in at the proxy */
|
||||
LWSSSINFLAGS_SERVER = (1 << 2),
|
||||
/**< Set on the server object copy of the ssi / info to indicate that
|
||||
* stream creation using this ssi is for Accepted connections belonging
|
||||
* to a server */
|
||||
LWSSSINFLAGS_ACCEPTED = (1 << 3),
|
||||
/**< Set on the accepted object copy of the ssi / info to indicate that
|
||||
* we are an accepted connection from a server's listening socket */
|
||||
LWSSSINFLAGS_ACCEPTED_SINK = (1 << 4),
|
||||
/**< Set on the accepted object copy of the ssi / info to indicate that
|
||||
* we are an accepted connection from a local sink */
|
||||
};
|
||||
|
||||
typedef lws_ss_state_return_t (*lws_sscb_rx)(void *userobj, const uint8_t *buf,
|
||||
size_t len, int flags);
|
||||
typedef lws_ss_state_return_t (*lws_sscb_tx)(void *userobj,
|
||||
lws_ss_tx_ordinal_t ord,
|
||||
uint8_t *buf, size_t *len,
|
||||
int *flags);
|
||||
typedef lws_ss_state_return_t (*lws_sscb_state)(void *userobj, void *h_src,
|
||||
lws_ss_constate_t state,
|
||||
lws_ss_tx_ordinal_t ack);
|
||||
|
||||
#if defined(LWS_WITH_SECURE_STREAMS_BUFFER_DUMP)
|
||||
typedef void (*lws_ss_buffer_dump_cb)(void *userobj, const uint8_t *buf,
|
||||
size_t len, int done);
|
||||
#endif
|
||||
|
||||
struct lws_ss_policy;
|
||||
|
||||
typedef struct lws_ss_info {
|
||||
const char *streamtype; /**< type of stream we want to create */
|
||||
size_t user_alloc; /**< size of user allocation */
|
||||
size_t handle_offset; /**< offset of handle stg in user_alloc type,
|
||||
set to offsetof(mytype, my_handle_member) */
|
||||
size_t opaque_user_data_offset;
|
||||
/**< offset of opaque user data ptr in user_alloc type, set to
|
||||
offsetof(mytype, opaque_ud_member) */
|
||||
|
||||
#if defined(LWS_WITH_SECURE_STREAMS_CPP)
|
||||
const struct lws_ss_policy *policy;
|
||||
/**< Normally NULL, or a locally-generated policy to apply to this
|
||||
* connection instead of a named streamtype */
|
||||
#endif
|
||||
|
||||
#if defined(LWS_WITH_SYS_FAULT_INJECTION)
|
||||
lws_fi_ctx_t fic;
|
||||
/**< Attach external Fault Injection context to the stream, hierarchy
|
||||
* is ss->context */
|
||||
#endif
|
||||
|
||||
lws_sscb_rx rx;
|
||||
/**< callback with rx payload for this stream */
|
||||
lws_sscb_tx tx;
|
||||
/**< callback to send payload on this stream... 0 = send as set in
|
||||
* len and flags, 1 = do not send anything (ie, not even 0 len frame) */
|
||||
lws_sscb_state state;
|
||||
/**< advisory cb about state of stream and QoS status if applicable...
|
||||
* h_src is only used with sinks and LWSSSCS_SINK_JOIN/_PART events.
|
||||
* Return nonzero to indicate you want to destroy the stream. */
|
||||
#if defined(LWS_WITH_SECURE_STREAMS_BUFFER_DUMP)
|
||||
lws_ss_buffer_dump_cb dump;
|
||||
/**< cb to record needed protocol buffer data*/
|
||||
#endif
|
||||
int manual_initial_tx_credit;
|
||||
/**< 0 = manage any tx credit automatically, nonzero explicitly sets the
|
||||
* peer stream to have the given amount of tx credit, if the protocol
|
||||
* can support it.
|
||||
*
|
||||
* In the special case of _lws_smd streamtype, this is used to indicate
|
||||
* the connection's rx class mask.
|
||||
* */
|
||||
uint32_t client_pid;
|
||||
/**< used in proxy / serialization case to hold the client pid this
|
||||
* proxied connection is to be tagged with
|
||||
*/
|
||||
uint8_t flags;
|
||||
uint8_t sss_protocol_version;
|
||||
/**< used in proxy / serialization case to hold the SS serialization
|
||||
* protocol level to use with this peer... clients automatically request
|
||||
* the most recent version they were built with
|
||||
* (LWS_SSS_CLIENT_PROTOCOL_VERSION) and the proxy stores the requested
|
||||
* version in here
|
||||
*/
|
||||
|
||||
} lws_ss_info_t;
|
||||
|
||||
#define LWS_SS_USER_TYPEDEF \
|
||||
typedef struct { \
|
||||
struct lws_ss_handle *ss; \
|
||||
void *opaque_data;
|
||||
|
||||
#define LWS_SS_INFO(_streamtype, _type) \
|
||||
const lws_ss_info_t ssi_##_type = { \
|
||||
.handle_offset = offsetof(_type, ss), \
|
||||
.opaque_user_data_offset = offsetof(_type, opaque_data), \
|
||||
.user_alloc = sizeof(_type), \
|
||||
.streamtype = _streamtype,
|
||||
|
||||
#define lws_ss_from_user(_u) (_u)->ss
|
||||
#define lws_ss_opaque_from_user(_u) (_u)->opaque_data
|
||||
#define lws_ss_cx_from_user(_u) lws_ss_get_context((_u)->ss)
|
||||
|
||||
#if defined(LWS_SS_USE_SSPC)
|
||||
#define lws_context_info_defaults(_x, _y) _lws_context_info_defaults(_x, NULL)
|
||||
#else
|
||||
#define lws_context_info_defaults(_x, _y) _lws_context_info_defaults(_x, _y)
|
||||
#endif
|
||||
|
||||
/**
|
||||
* lws_ss_create() - Create secure stream
|
||||
*
|
||||
* \param context: the lws context to create this inside
|
||||
* \param tsi: service thread index to create on (normally 0)
|
||||
* \param ssi: pointer to lws_ss_info_t filled in with info about desired stream
|
||||
* \param opaque_user_data: opaque data to set in the stream's user object
|
||||
* \param ppss: pointer to secure stream handle pointer set on exit
|
||||
* \param ppayload_fmt: NULL or pointer to a string ptr to take payload format
|
||||
* name from the policy
|
||||
*
|
||||
* Requests a new secure stream described by \p ssi be created. If successful,
|
||||
* the stream is created, its state callback called with LWSSSCS_CREATING, \p *ppss
|
||||
* is set to point to the handle, and it returns 0. If it failed, it returns
|
||||
* nonzero.
|
||||
*
|
||||
* Along with the opaque stream object, streams overallocate
|
||||
*
|
||||
* 1) a user data struct whose size is set in ssi
|
||||
* 2) nauth plugin instantiation data (size set in the plugin struct)
|
||||
* 3) sauth plugin instantiation data (size set in the plugin struct)
|
||||
* 4) space for a copy of the stream type name
|
||||
*
|
||||
* The user data struct is initialized to all zeros, then the .handle_offset and
|
||||
* .opaque_user_data_offset fields of the ssi are used to prepare the user data
|
||||
* struct with the ss handle that was created, and a copy of the
|
||||
* opaque_user_data pointer given as an argument.
|
||||
*
|
||||
* If you want to set up the stream with specific information, point to it in
|
||||
* opaque_user_data and use the copy of that pointer in your user data member
|
||||
* for it starting from the LWSSSCS_CREATING state call.
|
||||
*
|
||||
* Since different endpoints chosen by the policy may require different payload
|
||||
* formats, \p ppayload_fmt is set to point to the name of the needed payload
|
||||
* format from the policy database if non-NULL.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
|
||||
lws_ss_create(struct lws_context *context, int tsi, const lws_ss_info_t *ssi,
|
||||
void *opaque_user_data, struct lws_ss_handle **ppss,
|
||||
void *reserved, const char **ppayload_fmt);
|
||||
|
||||
/**
|
||||
* lws_ss_destroy() - Destroy secure stream
|
||||
*
|
||||
* \param ppss: pointer to lws_ss_t pointer to be destroyed
|
||||
*
|
||||
* Destroys the lws_ss_t pointed to by \p *ppss, and sets \p *ppss to NULL.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_ss_destroy(struct lws_ss_handle **ppss);
|
||||
|
||||
/**
|
||||
* lws_ss_request_tx() - Schedule stream for tx
|
||||
*
|
||||
* \param pss: pointer to lws_ss_t representing stream that wants to transmit
|
||||
*
|
||||
* Schedules a write on the stream represented by \p pss. When it's possible to
|
||||
* write on this stream, the \p *tx callback will occur with an empty buffer for
|
||||
* the stream owner to fill in.
|
||||
*
|
||||
* Returns 0 or LWSSSSRET_DESTROY_ME
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN lws_ss_state_return_t LWS_WARN_UNUSED_RESULT
|
||||
lws_ss_request_tx(struct lws_ss_handle *pss);
|
||||
|
||||
/**
|
||||
* lws_ss_request_tx() - Schedule stream for tx
|
||||
*
|
||||
* \param pss: pointer to lws_ss_t representing stream that wants to transmit
|
||||
* \param len: the length of the write in bytes
|
||||
*
|
||||
* Schedules a write on the stream represented by \p pss. When it's possible to
|
||||
* write on this stream, the \p *tx callback will occur with an empty buffer for
|
||||
* the stream owner to fill in.
|
||||
*
|
||||
* This api variant should be used when it's possible the payload will go out
|
||||
* over h1 with x-web-form-urlencoded or similar Content-Type.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN lws_ss_state_return_t LWS_WARN_UNUSED_RESULT
|
||||
lws_ss_request_tx_len(struct lws_ss_handle *pss, unsigned long len);
|
||||
|
||||
/**
|
||||
* lws_ss_client_connect() - Attempt the client connect
|
||||
*
|
||||
* \param h: secure streams handle
|
||||
*
|
||||
* Starts the connection process for the secure stream.
|
||||
*
|
||||
* Can return any of the lws_ss_state_return_t values depending on user
|
||||
* state callback returns.
|
||||
*
|
||||
* LWSSSSRET_OK means the connection is ongoing.
|
||||
*
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN lws_ss_state_return_t LWS_WARN_UNUSED_RESULT
|
||||
lws_ss_client_connect(struct lws_ss_handle *h);
|
||||
|
||||
/**
|
||||
* lws_ss_proxy_create() - Start a unix domain socket proxy for Secure Streams
|
||||
*
|
||||
* \param context: lws_context
|
||||
* \param bind: if port is 0, unix domain path with leading @ for abstract.
|
||||
* if port nonzero, NULL, or network interface to bind listen to
|
||||
* \param port: tcp port to listen on
|
||||
*
|
||||
* Creates a vhost that listens either on an abstract namespace unix domain
|
||||
* socket (port = 0) or a tcp listen socket (port nonzero). If bind is NULL
|
||||
* and port is 0, the abstract unix domain socket defaults to "proxy.ss.lws".
|
||||
*
|
||||
* Client connections to this proxy to Secure Streams are fulfilled using the
|
||||
* policy local to the proxy and the data passed between the client and the
|
||||
* proxy using serialized Secure Streams protocol.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_ss_proxy_create(struct lws_context *context, const char *bind, int port);
|
||||
|
||||
/**
|
||||
* lws_ss_state_name() - convenience helper to get a printable conn state name
|
||||
*
|
||||
* \param state: the connection state index
|
||||
*
|
||||
* Returns a printable name for the connection state index passed in.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN const char *
|
||||
lws_ss_state_name(int state);
|
||||
|
||||
/**
|
||||
* lws_ss_get_context() - convenience helper to recover the lws context
|
||||
*
|
||||
* \param h: secure streams handle
|
||||
*
|
||||
* Returns the lws context. Dispenses with the need to pass a copy of it into
|
||||
* your secure streams handler.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN struct lws_context *
|
||||
lws_ss_get_context(struct lws_ss_handle *h);
|
||||
|
||||
/**
|
||||
* lws_ss_get_vhost() - convenience helper to get the vhost the ss is bound to
|
||||
*
|
||||
* \param h: secure streams handle
|
||||
*
|
||||
* Returns NULL if disconnected, or the the lws_vhost of the ss' wsi connection.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN struct lws_vhost *
|
||||
lws_ss_get_vhost(struct lws_ss_handle *h);
|
||||
|
||||
|
||||
#define LWSSS_TIMEOUT_FROM_POLICY 0
|
||||
|
||||
/**
|
||||
* lws_ss_start_timeout() - start or restart the timeout on the stream
|
||||
*
|
||||
* \param h: secure streams handle
|
||||
* \param timeout_ms: LWSSS_TIMEOUT_FROM_POLICY for policy value, else use timeout_ms
|
||||
*
|
||||
* Starts or restarts the stream's own timeout timer. If the specified time
|
||||
* passes without lws_ss_cancel_timeout() being called on the stream, then the
|
||||
* stream state callback receives LWSSSCS_TIMEOUT
|
||||
*
|
||||
* The process being protected by the timeout is up to the user code, it may be
|
||||
* arbitrarily long and cross multiple protocol transactions or involve other
|
||||
* streams. It's up to the user to decide when to start and when / if to cancel
|
||||
* the stream timeout.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_ss_start_timeout(struct lws_ss_handle *h, unsigned int timeout_ms);
|
||||
|
||||
/**
|
||||
* lws_ss_cancel_timeout() - remove any timeout on the stream
|
||||
*
|
||||
* \param h: secure streams handle
|
||||
*
|
||||
* Disable any timeout that was applied to the stream by lws_ss_start_timeout().
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_ss_cancel_timeout(struct lws_ss_handle *h);
|
||||
|
||||
/**
|
||||
* lws_ss_to_user_object() - convenience helper to get user object from handle
|
||||
*
|
||||
* \param h: secure streams handle
|
||||
*
|
||||
* Returns the user allocation related to the handle. Normally you won't need
|
||||
* this since it's available in the rx, tx and state callbacks as "userdata"
|
||||
* already.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void *
|
||||
lws_ss_to_user_object(struct lws_ss_handle *h);
|
||||
|
||||
/**
|
||||
* lws_ss_rideshare() - find the current streamtype when types rideshare
|
||||
*
|
||||
* \param h: the stream handle
|
||||
*
|
||||
* Under some conditions, the payloads may be structured using protocol-
|
||||
* specific formatting, eg, http multipart mime. It's possible to map the
|
||||
* logical partitions in the payload to different stream types using
|
||||
* the policy "rideshare" feature.
|
||||
*
|
||||
* This api lets the callback code find out which rideshare stream type the
|
||||
* current payload chunk belongs to.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN const char *
|
||||
lws_ss_rideshare(struct lws_ss_handle *h);
|
||||
|
||||
|
||||
/**
|
||||
* lws_ss_set_metadata() - allow user to bind external data to defined ss metadata
|
||||
*
|
||||
* \param h: secure streams handle
|
||||
* \param name: metadata name from the policy
|
||||
* \param value: pointer to user-managed data to bind to name
|
||||
* \param len: length of the user-managed data in value
|
||||
*
|
||||
* Binds user-managed data to the named metadata item from the ss policy.
|
||||
* If present, the metadata item is handled in a protocol-specific way using
|
||||
* the associated policy information. For example, in the policy
|
||||
*
|
||||
* "\"metadata\":" "["
|
||||
* "{\"uptag\":" "\"X-Upload-Tag:\"},"
|
||||
* "{\"ctype\":" "\"Content-Type:\"},"
|
||||
* "{\"xctype\":" "\"\"}"
|
||||
* "],"
|
||||
*
|
||||
* when the policy is using h1 is interpreted to add h1 headers of the given
|
||||
* name with the value of the metadata on the left.
|
||||
*
|
||||
* Return 0 if OK or nonzero if, eg, metadata name does not exist on the
|
||||
* streamtype. You must check the result of this, eg, transient OOM can cause
|
||||
* these to fail and you should retry later.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
|
||||
lws_ss_set_metadata(struct lws_ss_handle *h, const char *name,
|
||||
const void *value, size_t len);
|
||||
|
||||
/**
|
||||
* lws_ss_alloc_set_metadata() - copy data and bind to ss metadata
|
||||
*
|
||||
* \param h: secure streams handle
|
||||
* \param name: metadata name from the policy
|
||||
* \param value: pointer to user-managed data to bind to name
|
||||
* \param len: length of the user-managed data in value
|
||||
*
|
||||
* Same as lws_ss_set_metadata(), but allocates a heap buffer for the data
|
||||
* first and takes a copy of it, so the original can go out of scope
|
||||
* immediately after.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
|
||||
lws_ss_alloc_set_metadata(struct lws_ss_handle *h, const char *name,
|
||||
const void *value, size_t len);
|
||||
|
||||
/**
|
||||
* lws_ss_get_metadata() - get current value of stream metadata item
|
||||
*
|
||||
* \param h: secure streams handle
|
||||
* \param name: metadata name from the policy
|
||||
* \param value: pointer to pointer to be set to point at the value
|
||||
* \param len: pointer to size_t to set to the length of the value
|
||||
*
|
||||
* Binds user-managed data to the named metadata item from the ss policy.
|
||||
* If present, the metadata item is handled in a protocol-specific way using
|
||||
* the associated policy information. For example, in the policy
|
||||
*
|
||||
* "\"metadata\":" "["
|
||||
* "{\"uptag\":" "\"X-Upload-Tag:\"},"
|
||||
* "{\"ctype\":" "\"Content-Type:\"},"
|
||||
* "{\"xctype\":" "\"\"}"
|
||||
* "],"
|
||||
*
|
||||
* when the policy is using h1 is interpreted to add h1 headers of the given
|
||||
* name with the value of the metadata on the left.
|
||||
*
|
||||
* Return 0 if \p *value and \p *len set OK, or nonzero if, eg, metadata \p name does
|
||||
* not exist on the streamtype.
|
||||
*
|
||||
* The pointed-to values may only exist until the next time around the event
|
||||
* loop.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_ss_get_metadata(struct lws_ss_handle *h, const char *name,
|
||||
const void **value, size_t *len);
|
||||
|
||||
/**
|
||||
* lws_ss_server_ack() - indicate how we feel about what the server has sent
|
||||
*
|
||||
* \param h: ss handle of accepted connection
|
||||
* \param nack: 0 means we are OK with it, else some problem
|
||||
*
|
||||
* For SERVER secure streams
|
||||
*
|
||||
* Depending on the protocol, the server sending us something may be
|
||||
* transactional, ie, built into it sending something is the idea we will
|
||||
* respond somehow out-of-band; HTTP is like this with, eg, 200 response code.
|
||||
*
|
||||
* Calling this with nack=0 indicates that when we later respond, we want to
|
||||
* acknowledge the transaction (eg, it means a 200 if http underneath), if
|
||||
* nonzero that the transaction should act like it failed.
|
||||
*
|
||||
* If the underlying protocol doesn't understand transactions (eg, ws) then this
|
||||
* has no effect either way.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_ss_server_ack(struct lws_ss_handle *h, int nack);
|
||||
|
||||
typedef void (*lws_sssfec_cb)(struct lws_ss_handle *h, void *arg);
|
||||
|
||||
/**
|
||||
* lws_ss_server_foreach_client() - callback for each live client connected to server
|
||||
*
|
||||
* \param h: server ss handle
|
||||
* \param cb: the callback
|
||||
* \param arg: arg passed to callback
|
||||
*
|
||||
* For SERVER secure streams
|
||||
*
|
||||
* Call the callback \p cb once for each client ss connected to the server,
|
||||
* passing \p arg as an additional callback argument each time.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_ss_server_foreach_client(struct lws_ss_handle *h, lws_sssfec_cb cb,
|
||||
void *arg);
|
||||
|
||||
/**
|
||||
* lws_ss_change_handlers() - helper for dynamically changing stream handlers
|
||||
*
|
||||
* \param h: ss handle
|
||||
* \param rx: the new RX handler
|
||||
* \param tx: the new TX handler
|
||||
* \param state: the new state handler
|
||||
*
|
||||
* Handlers set to NULL are left unchanged.
|
||||
*
|
||||
* This works on any handle, client or server and takes effect immediately.
|
||||
*
|
||||
* Depending on circumstances this may be helpful when
|
||||
*
|
||||
* a) a server stream undergoes an LWSSSCS_SERVER_UPGRADE (as in http -> ws) and
|
||||
* the payloads in the new protocol have a different purpose that is best
|
||||
* handled in their own rx and tx callbacks, and
|
||||
*
|
||||
* b) you may want to serve several different, possibly large things based on
|
||||
* what was requested. Setting a customized handler allows clean encapsulation
|
||||
* of the different serving strategies.
|
||||
*
|
||||
* If the stream is long-lived, like ws, you should set the changed handler back
|
||||
* to the default when the transaction wanting it is completed.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_ss_change_handlers(struct lws_ss_handle *h, lws_sscb_rx rx, lws_sscb_tx tx,
|
||||
lws_sscb_state state);
|
||||
|
||||
/**
|
||||
* lws_ss_add_peer_tx_credit() - allow peer to transmit more to us
|
||||
*
|
||||
* \param h: secure streams handle
|
||||
* \param add: additional tx credit (signed)
|
||||
*
|
||||
* Indicate to remote peer that we can accept \p add bytes more payload being
|
||||
* sent to us.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_ss_add_peer_tx_credit(struct lws_ss_handle *h, int32_t add);
|
||||
|
||||
/**
|
||||
* lws_ss_get_est_peer_tx_credit() - get our current estimate of peer's tx credit
|
||||
*
|
||||
* \param h: secure streams handle
|
||||
*
|
||||
* Based on what credit we gave it, and what we have received, report our
|
||||
* estimate of peer's tx credit usable to transmit to us. This may be outdated
|
||||
* in that some or all of its credit may already have been expended by sending
|
||||
* stuff to us that is in flight already.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_ss_get_est_peer_tx_credit(struct lws_ss_handle *h);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN const char *
|
||||
lws_ss_tag(struct lws_ss_handle *h);
|
||||
|
||||
/**
|
||||
* lws_ss_adopt_raw() - bind ss to existing fd
|
||||
*
|
||||
* \param ss: pointer to lws_ss_t to adopt the fd
|
||||
* \param fd: the existing fd
|
||||
*
|
||||
* "connects" the existing ss to a wsi adoption of fd, it's useful for cases
|
||||
* like local representation of eg a pipe() fd using ss.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_ss_adopt_raw(struct lws_ss_handle *ss, lws_sock_file_fd_type fd);
|
||||
|
||||
#if defined(LWS_WITH_SECURE_STREAMS_AUTH_SIGV4)
|
||||
/**
|
||||
* lws_ss_sigv4_set_aws_key() - set aws credential into system blob
|
||||
*
|
||||
* \param context: lws_context
|
||||
* \param idx: the system blob index specified in the policy, currently
|
||||
* up to 4 blobs.
|
||||
* \param keyid: aws access keyid
|
||||
* \param key: aws access key
|
||||
*
|
||||
* Return 0 if OK or nonzero if e.g. idx is invalid; system blob heap appending
|
||||
* fails.
|
||||
*/
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_ss_sigv4_set_aws_key(struct lws_context* context, uint8_t idx,
|
||||
const char * keyid, const char * key);
|
||||
|
||||
/**
|
||||
* lws_aws_filesystem_credentials_helper() - read aws credentials from file
|
||||
*
|
||||
* \param path: path to read, ~ at start is converted to $HOME contents if any
|
||||
* \param kid: eg, "aws_access_key_id"
|
||||
* \param ak: eg, "aws_secret_access_key"
|
||||
* \param aws_keyid: pointer to pointer for allocated keyid from credentials file
|
||||
* \param aws_key: pointer to pointer for allocated key from credentials file
|
||||
*
|
||||
* Return 0 if both *aws_keyid and *aws_key allocated from the config file, else
|
||||
* nonzero, and neither *aws_keyid or *aws_key are allocated.
|
||||
*
|
||||
* If *aws_keyid and *aws_key are set, it's the user's responsibility to
|
||||
* free() them when they are no longer needed.
|
||||
*/
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_aws_filesystem_credentials_helper(const char *path, const char *kid,
|
||||
const char *ak, char **aws_keyid,
|
||||
char **aws_key);
|
||||
#endif
|
||||
|
||||
#if defined(STANDALONE)
|
||||
#undef lws_context
|
||||
#endif
|
||||
|
||||
///@}
|
||||
|
||||
202
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-service.h
Normal file
202
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-service.h
Normal file
@ -0,0 +1,202 @@
|
||||
/*
|
||||
* libwebsockets - small server side websockets and web server implementation
|
||||
*
|
||||
* Copyright (C) 2010 - 2019 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
/** \defgroup service Built-in service loop entry
|
||||
*
|
||||
* ##Built-in service loop entry
|
||||
*
|
||||
* If you're not using libev / libuv, these apis are needed to enter the poll()
|
||||
* wait in lws and service any connections with pending events.
|
||||
*/
|
||||
///@{
|
||||
|
||||
/**
|
||||
* lws_service() - Service any pending websocket activity
|
||||
* \param context: Websocket context
|
||||
* \param timeout_ms: Set to 0; ignored; for backward compatibility
|
||||
*
|
||||
* This function deals with any pending websocket traffic, for three
|
||||
* kinds of event. It handles these events on both server and client
|
||||
* types of connection the same.
|
||||
*
|
||||
* 1) Accept new connections to our context's server
|
||||
*
|
||||
* 2) Call the receive callback for incoming frame data received by
|
||||
* server or client connections.
|
||||
*
|
||||
* Since v3.2 internally the timeout wait is ignored, the lws scheduler is
|
||||
* smart enough to stay asleep until an event is queued.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_service(struct lws_context *context, int timeout_ms);
|
||||
|
||||
/**
|
||||
* lws_service_tsi() - Service any pending websocket activity
|
||||
*
|
||||
* \param context: Websocket context
|
||||
* \param timeout_ms: Set to 0; ignored; for backwards compatibility
|
||||
* \param tsi: Thread service index, starting at 0
|
||||
*
|
||||
* Same as lws_service(), but for a specific thread service index. Only needed
|
||||
* if you are spawning multiple service threads that operate on the same lws_context.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_service_tsi(struct lws_context *context, int timeout_ms, int tsi);
|
||||
|
||||
/**
|
||||
* lws_cancel_service_pt() - Cancel servicing of pending socket activity
|
||||
* on one thread
|
||||
* \param wsi: Cancel service on the thread this wsi is serviced by
|
||||
*
|
||||
* Same as lws_cancel_service(), but targets a single service thread, the one
|
||||
* the wsi belongs to. You probably want to use lws_cancel_service() instead.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_cancel_service_pt(struct lws *wsi);
|
||||
|
||||
/**
|
||||
* lws_cancel_service() - Cancel wait for new pending socket activity
|
||||
* \param context: Websocket context
|
||||
*
|
||||
* This function creates an immediate "synchronous interrupt" to the lws poll()
|
||||
* wait or event loop. As soon as possible in the serialzed service sequencing,
|
||||
* a LWS_CALLBACK_EVENT_WAIT_CANCELLED callback is sent to every protocol on
|
||||
* every vhost.
|
||||
*
|
||||
* lws_cancel_service() may be called from another thread while the context
|
||||
* exists, and its effect will be immediately serialized.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_cancel_service(struct lws_context *context);
|
||||
|
||||
/**
|
||||
* lws_service_fd() - Service polled socket with something waiting
|
||||
* \param context: Websocket context
|
||||
* \param pollfd: The pollfd entry describing the socket fd and which events
|
||||
* happened
|
||||
*
|
||||
* This function takes a pollfd that has POLLIN or POLLOUT activity and
|
||||
* services it according to the state of the associated
|
||||
* struct lws.
|
||||
*
|
||||
* The one call deals with all "service" that might happen on a socket
|
||||
* including listen accepts, http files as well as websocket protocol.
|
||||
*
|
||||
* If a pollfd says it has something, you can just pass it to
|
||||
* lws_service_fd() whether it is a socket handled by lws or not.
|
||||
* If it sees it is a lws socket, the traffic will be handled and
|
||||
* pollfd->revents will be zeroed now.
|
||||
*
|
||||
* If the socket is foreign to lws, it leaves revents alone. So you can
|
||||
* see if you should service yourself by checking the pollfd revents
|
||||
* after letting lws try to service it.
|
||||
*
|
||||
* lws before v3.2 allowed pollfd to be NULL, to indicate that background
|
||||
* periodic processing should be done. Since v3.2, lws schedules any items
|
||||
* that need handling in the future using lws_sul and NULL is no longer valid.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_service_fd(struct lws_context *context, struct lws_pollfd *pollfd);
|
||||
|
||||
/**
|
||||
* lws_service_fd_tsi() - Service polled socket in specific service thread
|
||||
* \param context: Websocket context
|
||||
* \param pollfd: The pollfd entry describing the socket fd and which events
|
||||
* happened.
|
||||
* \param tsi: thread service index
|
||||
*
|
||||
* Same as lws_service_fd() but used with multiple service threads
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_service_fd_tsi(struct lws_context *context, struct lws_pollfd *pollfd,
|
||||
int tsi);
|
||||
|
||||
/**
|
||||
* lws_service_adjust_timeout() - Check for any connection needing forced service
|
||||
* \param context: Websocket context
|
||||
* \param timeout_ms: The original poll timeout value. You can just set this
|
||||
* to 1 if you don't really have a poll timeout.
|
||||
* \param tsi: thread service index
|
||||
*
|
||||
* Under some conditions connections may need service even though there is no
|
||||
* pending network action on them, this is "forced service". For default
|
||||
* poll() and libuv / libev, the library takes care of calling this and
|
||||
* dealing with it for you. But for external poll() integration, you need
|
||||
* access to the apis.
|
||||
*
|
||||
* If anybody needs "forced service", returned timeout is zero. In that case,
|
||||
* you can call lws_service_tsi() with a timeout of -1 to only service
|
||||
* guys who need forced service.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_service_adjust_timeout(struct lws_context *context, int timeout_ms, int tsi);
|
||||
|
||||
/* Backwards compatibility */
|
||||
#define lws_plat_service_tsi lws_service_tsi
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_handle_POLLOUT_event(struct lws *wsi, struct lws_pollfd *pollfd);
|
||||
|
||||
///@}
|
||||
|
||||
/*! \defgroup uv libuv helpers
|
||||
*
|
||||
* ##libuv helpers
|
||||
*
|
||||
* APIs specific to libuv event loop itegration
|
||||
*/
|
||||
///@{
|
||||
#if defined(LWS_WITH_LIBUV) && defined(UV_ERRNO_MAP)
|
||||
|
||||
/*
|
||||
* Any direct libuv allocations in lws protocol handlers must participate in the
|
||||
* lws reference counting scheme. Two apis are provided:
|
||||
*
|
||||
* - lws_libuv_static_refcount_add(handle, context, tsi) to mark the handle with
|
||||
* a pointer to the context and increment the global uv object counter
|
||||
*
|
||||
* - lws_libuv_static_refcount_del() which should be used as the close callback
|
||||
* for your own libuv objects declared in the protocol scope.
|
||||
*
|
||||
* Using the apis allows lws to detach itself from a libuv loop completely
|
||||
* cleanly and at the moment all of its libuv objects have completed close.
|
||||
*/
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN uv_loop_t *
|
||||
lws_uv_getloop(struct lws_context *context, int tsi);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_libuv_static_refcount_add(uv_handle_t *, struct lws_context *context,
|
||||
int tsi);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_libuv_static_refcount_del(uv_handle_t *);
|
||||
|
||||
#endif /* LWS_WITH_LIBUV */
|
||||
|
||||
#if defined(LWS_PLAT_FREERTOS)
|
||||
#define lws_libuv_static_refcount_add(_a, _b, _c)
|
||||
#define lws_libuv_static_refcount_del NULL
|
||||
#endif
|
||||
///@}
|
||||
112
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-settings.h
Normal file
112
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-settings.h
Normal file
@ -0,0 +1,112 @@
|
||||
/*
|
||||
* Generic Settings storage
|
||||
*
|
||||
* Copyright (C) 2020 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*
|
||||
*
|
||||
* This is like an abstract class for non-volatile storage, whether in a file-
|
||||
* system or flash-backed blocks, etc. Named blobs of variable size are stored
|
||||
* in nonvolatile media of some sort. Typically, these are JSON objects under
|
||||
* a naming scheme like, eg, "network".
|
||||
*
|
||||
* There's a platform-specific storage identifier opaque_plat provided when the
|
||||
* storage object is instantiated, this describes eg the storage device or
|
||||
* partition in instantiation-specific terms.
|
||||
*
|
||||
* Blobs have a further "filename" associated with them.
|
||||
*/
|
||||
|
||||
#define LSOOPEN_FLAG_WRITEABLE (1 << 0)
|
||||
|
||||
struct lws_settings_ops;
|
||||
|
||||
typedef struct {
|
||||
void *handle_plat;
|
||||
const struct lws_settings_ops *so;
|
||||
uint8_t refcount;
|
||||
void *opaque_plat;
|
||||
} lws_settings_instance_t;
|
||||
|
||||
typedef struct lws_settings_ops {
|
||||
int (*get)(lws_settings_instance_t *si, const char *name,
|
||||
uint8_t *dest, size_t *max_actual);
|
||||
/**< if dest is NULL, max_actual is set to the actual length without
|
||||
* copying anything out */
|
||||
int (*set)(lws_settings_instance_t *si, const char *name,
|
||||
const uint8_t *src, size_t len);
|
||||
} lws_settings_ops_t;
|
||||
|
||||
/**
|
||||
* lws_settings_plat_get() - read a named blob from a settings instance
|
||||
*
|
||||
* \param si: the settings instance
|
||||
* \param name: the name of the setting blob in the instance
|
||||
* \param dest: NULL, or the buffer to copy the setting blob info
|
||||
* \param max_actual: point to size of dest, or zero; actual blob size on exit
|
||||
*
|
||||
* If the named blob doesn't exist in the si, or can't read, returns nonzero.
|
||||
* Otherwise, returns 0 and sets *max_actual to the true blob size. If dest is
|
||||
* non-NULL, as much of the blob as will fit in the amount specified by
|
||||
* *max_actual on entry is copied to dest.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_settings_plat_get(lws_settings_instance_t *si, const char *name,
|
||||
uint8_t *dest, size_t *max_actual);
|
||||
|
||||
/**
|
||||
* lws_settings_plat_get() - read a named blob from a settings instance
|
||||
*
|
||||
* \param si: the settings instance
|
||||
* \param name: the name of the setting blob in the instance
|
||||
* \param src: blob to copy to settings instance
|
||||
* \param len: length of blob to copy
|
||||
*
|
||||
* Creates or replaces a settings blob of the given name made up of the \p len
|
||||
* bytes of data from \p src.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_settings_plat_set(lws_settings_instance_t *si, const char *name,
|
||||
const uint8_t *src, size_t len);
|
||||
|
||||
/**
|
||||
* lws_settings_plat_printf() - read a named blob from a settings instance
|
||||
*
|
||||
* \param si: the settings instance
|
||||
* \param name: the name of the setting blob in the instance
|
||||
* \param format: printf-style format string
|
||||
*
|
||||
* Creates or replaces a settings blob of the given name from the printf-style
|
||||
* format string and arguments provided. There's no specific limit to the size,
|
||||
* the size is computed and then a temp heap buffer used.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_settings_plat_printf(lws_settings_instance_t *si, const char *name,
|
||||
const char *format, ...) LWS_FORMAT(3);
|
||||
|
||||
#define lws_settings_ops_plat \
|
||||
.get = lws_settings_plat_get, \
|
||||
.set = lws_settings_plat_set,
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN lws_settings_instance_t *
|
||||
lws_settings_init(const lws_settings_ops_t *so, void *opaque_plat);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_settings_deinit(lws_settings_instance_t **si);
|
||||
@ -0,0 +1,113 @@
|
||||
/*
|
||||
* libwebsockets - small server side websockets and web server implementation
|
||||
*
|
||||
* Copyright (C) 2010 - 2019 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
/** \defgroup sha SHA and B64 helpers
|
||||
* ##SHA and B64 helpers
|
||||
*
|
||||
* These provide SHA-1 and B64 helper apis
|
||||
*/
|
||||
///@{
|
||||
#ifdef LWS_SHA1_USE_OPENSSL_NAME
|
||||
#define lws_SHA1 SHA1
|
||||
#else
|
||||
/**
|
||||
* lws_SHA1(): make a SHA-1 digest of a buffer
|
||||
*
|
||||
* \param d: incoming buffer
|
||||
* \param n: length of incoming buffer
|
||||
* \param md: buffer for message digest (must be >= 20 bytes)
|
||||
*
|
||||
* Reduces any size buffer into a 20-byte SHA-1 hash.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN unsigned char *
|
||||
lws_SHA1(const unsigned char *d, size_t n, unsigned char *md);
|
||||
#endif
|
||||
/**
|
||||
* lws_b64_encode_string(): encode a string into base 64
|
||||
*
|
||||
* \param in: incoming buffer
|
||||
* \param in_len: length of incoming buffer
|
||||
* \param out: result buffer
|
||||
* \param out_size: length of result buffer
|
||||
*
|
||||
* Encodes a string using b64
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_b64_encode_string(const char *in, int in_len, char *out, int out_size);
|
||||
/**
|
||||
* lws_b64_encode_string_url(): encode a string into base 64
|
||||
*
|
||||
* \param in: incoming buffer
|
||||
* \param in_len: length of incoming buffer
|
||||
* \param out: result buffer
|
||||
* \param out_size: length of result buffer
|
||||
*
|
||||
* Encodes a string using b64 with the "URL" variant (+ -> -, and / -> _)
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_b64_encode_string_url(const char *in, int in_len, char *out, int out_size);
|
||||
/**
|
||||
* lws_b64_decode_string(): decode a string from base 64
|
||||
*
|
||||
* \param in: incoming buffer
|
||||
* \param out: result buffer
|
||||
* \param out_size: length of result buffer
|
||||
*
|
||||
* Decodes a NUL-terminated string using b64
|
||||
*
|
||||
* Returns used length of output buffer
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_b64_decode_string(const char *in, char *out, int out_size);
|
||||
/**
|
||||
* lws_b64_decode_string_len(): decode a string from base 64
|
||||
*
|
||||
* \param in: incoming buffer
|
||||
* \param in_len: length of incoming buffer
|
||||
* \param out: result buffer
|
||||
* \param out_size: length of result buffer
|
||||
*
|
||||
* Decodes a range of chars using b64
|
||||
*
|
||||
* Returns used length of output buffer
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_b64_decode_string_len(const char *in, int in_len, char *out, int out_size);
|
||||
|
||||
struct lws_b64state {
|
||||
unsigned char quad[4];
|
||||
size_t done;
|
||||
size_t len;
|
||||
int i;
|
||||
int c;
|
||||
};
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_b64_decode_state_init(struct lws_b64state *state);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_b64_decode_stateful(struct lws_b64state *s, const char *in, size_t *in_len,
|
||||
uint8_t *out, size_t *out_size, int final);
|
||||
///@}
|
||||
|
||||
227
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-smd.h
Normal file
227
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-smd.h
Normal file
@ -0,0 +1,227 @@
|
||||
/*
|
||||
* lws System Message Distribution
|
||||
*
|
||||
* Copyright (C) 2010 - 2020 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#define LWS_SMD_MAX_PAYLOAD 384
|
||||
#define LWS_SMD_CLASS_BITFIELD_BYTES 4
|
||||
|
||||
#define LWS_SMD_STREAMTYPENAME "_lws_smd"
|
||||
#define LWS_SMD_SS_RX_HEADER_LEN 16
|
||||
|
||||
typedef uint32_t lws_smd_class_t;
|
||||
|
||||
struct lws_smd_msg; /* opaque */
|
||||
struct lws_smd_peer; /* opaque */
|
||||
|
||||
/*
|
||||
* Well-known device classes
|
||||
*/
|
||||
|
||||
enum {
|
||||
LWSSMDCL_INTERACTION = (1 << 0),
|
||||
/**<
|
||||
* Any kind of event indicating a user was interacting with the device,
|
||||
* eg, press a button, touched the screen, lifted the device etc
|
||||
*/
|
||||
LWSSMDCL_SYSTEM_STATE = (1 << 1),
|
||||
/**<
|
||||
* The lws_system state changed, eg, to OPERATIONAL
|
||||
*/
|
||||
LWSSMDCL_NETWORK = (1 << 2),
|
||||
/**<
|
||||
* Something happened on the network, eg, link-up or DHCP, or captive
|
||||
* portal state update
|
||||
*/
|
||||
LWSSMDCL_METRICS = (1 << 3),
|
||||
/**<
|
||||
* An SS client process is reporting a metric to the proxy (this class
|
||||
* is special in that it is not rebroadcast by the proxy)
|
||||
*/
|
||||
|
||||
LWSSMDCL_USER_BASE_BITNUM = 24
|
||||
};
|
||||
|
||||
/**
|
||||
* lws_smd_msg_alloc() - allocate a message of length len
|
||||
*
|
||||
* \param ctx: the lws_context
|
||||
* \param _class: the smd message class, recipients filter on this
|
||||
* \param len: the required payload length
|
||||
*
|
||||
* This helper returns an opaque lws_smd_msg pointer and sets *buf to a buffer
|
||||
* associated with it of length \p len.
|
||||
*
|
||||
* In this way the lws_msg_smd type remains completely opaque and the allocated
|
||||
* area can be prepared by the caller directly, without copying.
|
||||
*
|
||||
* On failure, it returns NULL... it may fail for OOM but it may also fail if
|
||||
* you request to allocate for a message class that the system has no
|
||||
* participant who is listening for that class of event currently... the event
|
||||
* generation action at the caller should be bypassed without error then.
|
||||
*
|
||||
* This is useful if you have a message you know the length of. For text-based
|
||||
* messages like JSON, lws_smd_msg_printf() is more convenient.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void * /* payload */
|
||||
lws_smd_msg_alloc(struct lws_context *ctx, lws_smd_class_t _class, size_t len);
|
||||
|
||||
/**
|
||||
* lws_smd_msg_free() - abandon a previously allocated message before sending
|
||||
*
|
||||
* \param payload: pointer the previously-allocated message payload
|
||||
*
|
||||
* Destroys a previously-allocated opaque message object and the requested
|
||||
* buffer space, in the case that between allocating it and sending it, some
|
||||
* condition was met that means it can no longer be sent, eg, an error
|
||||
* generating the content. Otherwise there is no need to destroy allocated
|
||||
* message objects with this, lws will take care of it.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_smd_msg_free(void **payload);
|
||||
|
||||
/**
|
||||
* lws_smd_msg_send() - queue a previously allocated message
|
||||
*
|
||||
* \param ctx: the lws_context
|
||||
* \param msg: the prepared message
|
||||
*
|
||||
* Queues an allocated, prepared message for delivery to smd clients
|
||||
*
|
||||
* This is threadsafe to call from a non-service thread.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_smd_msg_send(struct lws_context *ctx, void *payload);
|
||||
|
||||
/**
|
||||
* lws_smd_msg_printf() - queue a previously allocated message
|
||||
*
|
||||
* \param ctx: the lws_context
|
||||
* \param _class: the message class
|
||||
* \param format: the format string to prepare the payload with
|
||||
* \param ...: arguments for the format string, if any
|
||||
*
|
||||
* For string-based messages, eg, JSON, allows formatted creating of the payload
|
||||
* size discovery, allocation and message send all in one step.
|
||||
*
|
||||
* Unlike lws_smd_msg_alloc() you do not need to know the length beforehand as
|
||||
* this computes it and calls lws_smd_msg_alloc() with the correct length.
|
||||
*
|
||||
* To be clear this also calls through to lws_smd_msg_send(), it really does
|
||||
* everything in one step. If there are no registered participants that want
|
||||
* messages of \p _class, this function returns immediately without doing any
|
||||
* allocation or anything else.
|
||||
*
|
||||
* This is threadsafe to call from a non-service thread.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_smd_msg_printf(struct lws_context *ctx, lws_smd_class_t _class,
|
||||
const char *format, ...) LWS_FORMAT(3);
|
||||
|
||||
/**
|
||||
* lws_smd_ss_msg_printf() - helper to prepare smd ss message tx
|
||||
*
|
||||
* \param h: the ss handle
|
||||
* \param buf: the ss tx buffer
|
||||
* \param len: on entry, points to the ss tx buffer length, on exit, set to used
|
||||
* \param _class: the message class
|
||||
* \param format: the format string to prepare the payload with
|
||||
* \param ...: arguments for the format string, if any
|
||||
*
|
||||
* This helper lets you produce SMD messages on an SS link of the builtin
|
||||
* streamtype LWS_SMD_STREAMTYPENAME, using the same api format as
|
||||
* lws_smd_msg_prinf(), but writing the message into the ss tx buffer from
|
||||
* its tx() callback.
|
||||
*/
|
||||
|
||||
struct lws_ss_handle;
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_smd_ss_msg_printf(const char *tag, uint8_t *buf, size_t *len,
|
||||
lws_smd_class_t _class, const char *format, ...)
|
||||
LWS_FORMAT(5);
|
||||
|
||||
/**
|
||||
* lws_smd_ss_rx_forward() - helper to forward smd messages that came in by SS
|
||||
*
|
||||
* \param ss_user: ss user pointer, as delivered to rx callback
|
||||
* \param buf: the ss rx buffer
|
||||
* \param len: the length of the ss rx buffer
|
||||
*
|
||||
* Proxied Secure Streams with the streamtype LWS_SMD_STREAMTYPENAME receive
|
||||
* serialized SMD messages from the proxy, this helper allows them to be
|
||||
* translated into deserialized SMD messages and forwarded to registered SMD
|
||||
* participants in the local context in one step.
|
||||
*
|
||||
* Just pass through what arrived in the LWS_SMD_STREAMTYPENAME rx() callback
|
||||
* to this api.
|
||||
*
|
||||
* Returns 0 if OK else nonzero if unable to queue the SMD message.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_smd_ss_rx_forward(void *ss_user, const uint8_t *buf, size_t len);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_smd_sspc_rx_forward(void *ss_user, const uint8_t *buf, size_t len);
|
||||
|
||||
typedef int (*lws_smd_notification_cb_t)(void *opaque, lws_smd_class_t _class,
|
||||
lws_usec_t timestamp, void *buf,
|
||||
size_t len);
|
||||
|
||||
#define LWSSMDREG_FLAG_PROXIED_SS (1 << 0)
|
||||
/**< It's actually a proxied SS connection registering, opaque is the ss h */
|
||||
|
||||
/*
|
||||
* lws_smd_register() - register to receive smd messages
|
||||
*
|
||||
* \param ctx: the lws_context
|
||||
* \param opaque: an opaque pointer handed to the callback
|
||||
* \param flags: typically 0
|
||||
* \param _class_filter: bitmap of message classes we care about
|
||||
* \param cb: the callback to receive messages
|
||||
*
|
||||
* Queues an allocated, prepared message for delivery to smd clients.
|
||||
*
|
||||
* Returns NULL on failure, or an opaque handle which may be given to
|
||||
* lws_smd_unregister() to stop participating in the shared message queue.
|
||||
*
|
||||
* This is threadsafe to call from a non-service thread.
|
||||
*/
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN struct lws_smd_peer *
|
||||
lws_smd_register(struct lws_context *ctx, void *opaque, int flags,
|
||||
lws_smd_class_t _class_filter, lws_smd_notification_cb_t cb);
|
||||
|
||||
/*
|
||||
* lws_smd_unregister() - unregister receiving smd messages
|
||||
*
|
||||
* \param pr: the handle returned from the registration
|
||||
*
|
||||
* Destroys the registration of the callback for messages and ability to send
|
||||
* messages.
|
||||
*
|
||||
* It's not necessary to call this if the registration wants to survive for as
|
||||
* long as the lws_context... lws_context_destroy will also clean up any
|
||||
* registrations still active by then.
|
||||
*/
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_smd_unregister(struct lws_smd_peer *pr);
|
||||
177
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-spa.h
Normal file
177
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-spa.h
Normal file
@ -0,0 +1,177 @@
|
||||
/*
|
||||
* libwebsockets - small server side websockets and web server implementation
|
||||
*
|
||||
* Copyright (C) 2010 - 2019 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
/** \defgroup form-parsing Form Parsing
|
||||
* \ingroup http
|
||||
* ##POSTed form parsing functions
|
||||
*
|
||||
* These lws_spa (stateful post arguments) apis let you parse and urldecode
|
||||
* POSTed form arguments, both using simple urlencoded and multipart transfer
|
||||
* encoding.
|
||||
*
|
||||
* It's capable of handling file uploads as well a named input parsing,
|
||||
* and the apis are the same for both form upload styles.
|
||||
*
|
||||
* You feed it a list of parameter names and it creates pointers to the
|
||||
* urldecoded arguments: file upload parameters pass the file data in chunks to
|
||||
* a user-supplied callback as they come.
|
||||
*
|
||||
* Since it's stateful, it handles the incoming data needing more than one
|
||||
* POST_BODY callback and has no limit on uploaded file size.
|
||||
*/
|
||||
///@{
|
||||
|
||||
/** enum lws_spa_fileupload_states */
|
||||
enum lws_spa_fileupload_states {
|
||||
LWS_UFS_CONTENT,
|
||||
/**< a chunk of file content has arrived */
|
||||
LWS_UFS_FINAL_CONTENT,
|
||||
/**< the last chunk (possibly zero length) of file content has arrived */
|
||||
LWS_UFS_OPEN,
|
||||
/**< a new file is starting to arrive */
|
||||
LWS_UFS_CLOSE
|
||||
/**< the file decode stuff is being destroyed */
|
||||
};
|
||||
|
||||
/**
|
||||
* lws_spa_fileupload_cb() - callback to receive file upload data
|
||||
*
|
||||
* \param data: opt_data pointer set in lws_spa_create
|
||||
* \param name: name of the form field being uploaded
|
||||
* \param filename: original filename from client
|
||||
* \param buf: start of data to receive
|
||||
* \param len: length of data to receive
|
||||
* \param state: information about how this call relates to file
|
||||
*
|
||||
* Notice name and filename shouldn't be trusted, as they are passed from
|
||||
* HTTP provided by the client.
|
||||
*/
|
||||
typedef int (*lws_spa_fileupload_cb)(void *data, const char *name,
|
||||
const char *filename, char *buf, int len,
|
||||
enum lws_spa_fileupload_states state);
|
||||
|
||||
/** struct lws_spa - opaque urldecode parser capable of handling multipart
|
||||
* and file uploads */
|
||||
struct lws_spa;
|
||||
|
||||
/**
|
||||
* lws_spa_create() - create urldecode parser
|
||||
*
|
||||
* \param wsi: lws connection (used to find Content Type)
|
||||
* \param param_names: array of form parameter names, like "username"
|
||||
* \param count_params: count of param_names
|
||||
* \param max_storage: total amount of form parameter values we can store
|
||||
* \param opt_cb: NULL, or callback to receive file upload data.
|
||||
* \param opt_data: NULL, or user pointer provided to opt_cb.
|
||||
*
|
||||
* Creates a urldecode parser and initializes it.
|
||||
*
|
||||
* It's recommended to use the newer api, lws_spa_create_via_info()
|
||||
* instead.
|
||||
*
|
||||
* opt_cb can be NULL if you just want normal name=value parsing, however
|
||||
* if one or more entries in your form are bulk data (file transfer), you
|
||||
* can provide this callback and filter on the name callback parameter to
|
||||
* treat that urldecoded data separately. The callback should return -1
|
||||
* in case of fatal error, and 0 if OK.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN struct lws_spa *
|
||||
lws_spa_create(struct lws *wsi, const char * const *param_names,
|
||||
int count_params, int max_storage, lws_spa_fileupload_cb opt_cb,
|
||||
void *opt_data);
|
||||
|
||||
typedef struct lws_spa_create_info {
|
||||
const char * const *param_names; /**< array of form parameter names, like "username"
|
||||
These may be NULL, to make space for arbitrary POST items */
|
||||
int count_params; /* count of param_names */
|
||||
int max_storage; /* total amount of form parameter values we can store */
|
||||
lws_spa_fileupload_cb opt_cb; /* NULL, or callback to receive file upload data. */
|
||||
void *opt_data; /* NULL, or user pointer provided to opt_cb. */
|
||||
size_t param_names_stride; /* 0 if param_names is an array of char *.
|
||||
Else stride to next char * */
|
||||
struct lwsac **ac; /* NULL, or pointer to lwsac * to contain all
|
||||
related heap allocations */
|
||||
size_t ac_chunk_size; /* 0 for default, or ac chunk size */
|
||||
} lws_spa_create_info_t;
|
||||
|
||||
/**
|
||||
* lws_spa_create_via_info() - create urldecode parser
|
||||
*
|
||||
* \param wsi: lws connection (used to find Content Type)
|
||||
* \param info: pointer to struct defining the arguments
|
||||
*
|
||||
* Creates a urldecode parser and initializes it.
|
||||
*
|
||||
* opt_cb can be NULL if you just want normal name=value parsing, however
|
||||
* if one or more entries in your form are bulk data (file transfer), you
|
||||
* can provide this callback and filter on the name callback parameter to
|
||||
* treat that urldecoded data separately. The callback should return -1
|
||||
* in case of fatal error, and 0 if OK.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN struct lws_spa *
|
||||
lws_spa_create_via_info(struct lws *wsi, const lws_spa_create_info_t *info);
|
||||
|
||||
/**
|
||||
* lws_spa_process() - parses a chunk of input data
|
||||
*
|
||||
* \param spa: the parser object previously created
|
||||
* \param in: incoming urlencoded data
|
||||
* \param len: count of bytes valid at \p in
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_spa_process(struct lws_spa *spa, const char *in, int len);
|
||||
|
||||
/**
|
||||
* lws_spa_finalize() - indicate incoming data completed
|
||||
*
|
||||
* \param spa: the parser object previously created
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_spa_finalize(struct lws_spa *spa);
|
||||
|
||||
/**
|
||||
* lws_spa_get_length() - return length of parameter value
|
||||
*
|
||||
* \param spa: the parser object previously created
|
||||
* \param n: parameter ordinal to return length of value for
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_spa_get_length(struct lws_spa *spa, int n);
|
||||
|
||||
/**
|
||||
* lws_spa_get_string() - return pointer to parameter value
|
||||
* \param spa: the parser object previously created
|
||||
* \param n: parameter ordinal to return pointer to value for
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN const char *
|
||||
lws_spa_get_string(struct lws_spa *spa, int n);
|
||||
|
||||
/**
|
||||
* lws_spa_destroy() - destroy parser object
|
||||
*
|
||||
* \param spa: the parser object previously created
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_spa_destroy(struct lws_spa *spa);
|
||||
///@}
|
||||
@ -0,0 +1,55 @@
|
||||
/*
|
||||
* lws abstract display implementation for epd-acep on spi
|
||||
*
|
||||
* Copyright (C) 2019 - 2022 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#if !defined(__LWS_DISPLAY_SPD1656_SPI_H__)
|
||||
#define __LWS_DISPLAY_SPD1656_SPI_H__
|
||||
|
||||
typedef struct lws_display_spd1656_spi {
|
||||
|
||||
lws_display_t disp; /* use lws_display_spd1656_ops to set */
|
||||
const lws_spi_ops_t *spi; /* spi ops */
|
||||
|
||||
lws_display_completion_t cb;
|
||||
|
||||
const lws_gpio_ops_t *gpio; /* NULL or gpio ops */
|
||||
_lws_plat_gpio_t reset_gpio; /* if gpio ops, nReset gpio # */
|
||||
_lws_plat_gpio_t busy_gpio; /* if gpio ops, busy gpio # */
|
||||
|
||||
uint8_t spi_index; /* cs index starting from 0 */
|
||||
|
||||
} lws_display_spd1656_spi_t;
|
||||
|
||||
int
|
||||
lws_display_spd1656_spi_init(lws_display_state_t *lds);
|
||||
int
|
||||
lws_display_spd1656_spi_blit(lws_display_state_t *lds, const uint8_t *src,
|
||||
lws_box_t *box, lws_dll2_owner_t *ids);
|
||||
int
|
||||
lws_display_spd1656_spi_power(lws_display_state_t *lds, int state);
|
||||
|
||||
#define lws_display_spd1656_ops \
|
||||
.init = lws_display_spd1656_spi_init, \
|
||||
.blit = lws_display_spd1656_spi_blit, \
|
||||
.power = lws_display_spd1656_spi_power
|
||||
#endif
|
||||
93
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-spi.h
Normal file
93
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-spi.h
Normal file
@ -0,0 +1,93 @@
|
||||
/*
|
||||
* Generic I2C ops
|
||||
*
|
||||
* Copyright (C) 2019 - 2020 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*
|
||||
* This is like an abstract class for spi, a real implementation provides
|
||||
* functions for the ops that use the underlying OS arrangements.
|
||||
*
|
||||
* It uses descriptor / queuing semantics but eg the GPIO BB implementantion is
|
||||
* synchronous.
|
||||
*/
|
||||
|
||||
#if !defined(__LWS_SPI_H__)
|
||||
#define __LWS_SPI_H__
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stddef.h>
|
||||
|
||||
typedef int (*lws_spi_cb_t)(void *opaque);
|
||||
|
||||
enum {
|
||||
LWSSPIMODE_CPOL = (1 << 0),
|
||||
LWSSPIMODE_CPHA = (1 << 1),
|
||||
|
||||
LWS_SPI_BUSMODE_CLK_IDLE_LOW_SAMP_RISING = 0,
|
||||
LWS_SPI_BUSMODE_CLK_IDLE_HIGH_SAMP_RISING = LWSSPIMODE_CPOL,
|
||||
LWS_SPI_BUSMODE_CLK_IDLE_LOW_SAMP_FALLING = LWSSPIMODE_CPHA,
|
||||
LWS_SPI_BUSMODE_CLK_IDLE_HIGH_SAMP_FALLING = LWSSPIMODE_CPHA |
|
||||
LWSSPIMODE_CPOL,
|
||||
|
||||
LWS_SPI_TXN_HALF_DUPLEX_DISCRETE = 0,
|
||||
/**< separate MISO and MOSI, but only either MISO or MOSI has data at
|
||||
* one time... i2c style in SPI */
|
||||
|
||||
LWS_SPI_FLAG_DATA_CONTINUE = (1 << 0),
|
||||
/**< leave without finalizing the SPI transaction */
|
||||
LWS_SPI_FLAG_DC_CMD_IS_HIGH = (1 << 1),
|
||||
/**< It's normally 0 for cmd phase, invert with this flag */
|
||||
LWS_SPI_FLAG_DMA_BOUNCE_NOT_NEEDED = (1 << 2),
|
||||
/**< It's normally 0 for cmd phase, invert with this flag */
|
||||
};
|
||||
|
||||
typedef struct lws_spi_desc {
|
||||
const uint8_t *src;
|
||||
const uint8_t *data;
|
||||
uint8_t *dest;
|
||||
void *opaque;
|
||||
lws_spi_cb_t completion_cb;
|
||||
uint16_t count_cmd;
|
||||
uint16_t count_write;
|
||||
uint16_t count_read;
|
||||
uint8_t txn_type;
|
||||
uint8_t channel;
|
||||
|
||||
uint8_t flags;
|
||||
} lws_spi_desc_t;
|
||||
|
||||
typedef struct lws_spi_ops {
|
||||
int (*init)(const struct lws_spi_ops *ctx);
|
||||
int (*queue)(const struct lws_spi_ops *ctx, const lws_spi_desc_t *desc);
|
||||
void * (*alloc_dma)(const struct lws_spi_ops *ctx, size_t size);
|
||||
void (*free_dma)(const struct lws_spi_ops *ctx, void **p);
|
||||
int (*in_flight)(const struct lws_spi_ops *ctx);
|
||||
uint32_t spi_clk_hz;
|
||||
uint8_t bus_mode;
|
||||
} lws_spi_ops_t;
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_spi_table_issue(const lws_spi_ops_t *spi_ops, uint32_t flags, const uint8_t *p, size_t len);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_spi_readback(const lws_spi_ops_t *spi_ops, uint32_t flags,
|
||||
const uint8_t *p, size_t len, uint8_t *rb, size_t rb_len);
|
||||
|
||||
#endif
|
||||
@ -0,0 +1,64 @@
|
||||
/*
|
||||
* lws abstract display implementation for ssd1306 on i2c
|
||||
*
|
||||
* Copyright (C) 2019 - 2022 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#if !defined(__LWS_DISPLAY_SSD1306_I2C_H__)
|
||||
#define __LWS_DISPLAY_SSD1306_I2C_H__
|
||||
|
||||
/*
|
||||
* D/C# pin on SSD1306 sets the I2C device ads
|
||||
* from these two options (7-bit address)
|
||||
*/
|
||||
|
||||
#define SSD1306_I2C7_ADS1 0x3c
|
||||
#define SSD1306_I2C7_ADS2 0x3d
|
||||
|
||||
typedef struct lws_display_ssd1306 {
|
||||
|
||||
lws_display_t disp; /* use lws_display_ssd1306_ops to set ops */
|
||||
const lws_i2c_ops_t *i2c; /* i2c ops */
|
||||
|
||||
lws_display_completion_t cb;
|
||||
const lws_gpio_ops_t *gpio; /* NULL or gpio ops */
|
||||
_lws_plat_gpio_t reset_gpio; /* if gpio ops, nReset gpio # */
|
||||
|
||||
uint8_t i2c7_address; /* one of SSD1306_I2C7_ADS... */
|
||||
|
||||
} lws_display_ssd1306_t;
|
||||
|
||||
int
|
||||
lws_display_ssd1306_i2c_init(lws_display_state_t *lds);
|
||||
int
|
||||
lws_display_ssd1306_i2c_contrast(lws_display_state_t *lds, uint8_t b);
|
||||
int
|
||||
lws_display_ssd1306_i2c_blit(lws_display_state_t *lds, const uint8_t *src,
|
||||
lws_box_t *box, lws_dll2_owner_t *ids);
|
||||
int
|
||||
lws_display_ssd1306_i2c_power(lws_display_state_t *lds, int state);
|
||||
|
||||
#define lws_display_ssd1306_ops \
|
||||
.init = lws_display_ssd1306_i2c_init, \
|
||||
.contrast = lws_display_ssd1306_i2c_contrast, \
|
||||
.blit = lws_display_ssd1306_i2c_blit, \
|
||||
.power = lws_display_ssd1306_i2c_power
|
||||
#endif
|
||||
@ -0,0 +1,55 @@
|
||||
/*
|
||||
* lws abstract display implementation for SSD1675B on spi
|
||||
*
|
||||
* Copyright (C) 2019 - 2022 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#if !defined(__LWS_DISPLAY_SSD1675B_SPI_H__)
|
||||
#define __LWS_DISPLAY_SSD1675B_SPI_H__
|
||||
|
||||
typedef struct lws_display_ssd1675b_spi {
|
||||
|
||||
lws_display_t disp; /* use lws_display_ssd1675b_ops to set */
|
||||
const lws_spi_ops_t *spi; /* spi ops */
|
||||
|
||||
lws_display_completion_t cb;
|
||||
|
||||
const lws_gpio_ops_t *gpio; /* NULL or gpio ops */
|
||||
_lws_plat_gpio_t reset_gpio; /* if gpio ops, nReset gpio # */
|
||||
_lws_plat_gpio_t busy_gpio; /* if gpio ops, busy gpio # */
|
||||
|
||||
uint8_t spi_index; /* cs index starting from 0 */
|
||||
|
||||
} lws_display_ssd1675b_spi_t;
|
||||
|
||||
int
|
||||
lws_display_ssd1675b_spi_init(lws_display_state_t *lds);
|
||||
int
|
||||
lws_display_ssd1675b_spi_blit(lws_display_state_t *lds, const uint8_t *src,
|
||||
lws_box_t *box);
|
||||
int
|
||||
lws_display_ssd1675b_spi_power(lws_display_state_t *lds, int state);
|
||||
|
||||
#define lws_display_ssd1675b_ops \
|
||||
.init = lws_display_ssd1675b_spi_init, \
|
||||
.blit = lws_display_ssd1675b_spi_blit, \
|
||||
.power = lws_display_ssd1675b_spi_power
|
||||
#endif
|
||||
119
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-state.h
Normal file
119
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-state.h
Normal file
@ -0,0 +1,119 @@
|
||||
/*
|
||||
* libwebsockets - small server side websockets and web server implementation
|
||||
*
|
||||
* Copyright (C) 2010 - 2019 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
struct lws_state_notify_link;
|
||||
struct lws_state_manager;
|
||||
|
||||
#if defined(LWS_WITH_SYS_STATE)
|
||||
|
||||
typedef int (*lws_state_notify_t)(struct lws_state_manager *mgr,
|
||||
struct lws_state_notify_link *link,
|
||||
int current, int target);
|
||||
|
||||
typedef struct lws_state_notify_link {
|
||||
lws_dll2_t list;
|
||||
lws_state_notify_t notify_cb;
|
||||
const char *name;
|
||||
} lws_state_notify_link_t;
|
||||
|
||||
typedef struct lws_state_manager {
|
||||
lws_dll2_owner_t notify_list;
|
||||
struct lws_context *context;
|
||||
void *parent;
|
||||
#if defined(LWS_WITH_SYS_SMD)
|
||||
lws_smd_class_t smd_class;
|
||||
#endif
|
||||
/**< optional opaque pointer to owning object... useful to make such
|
||||
* a pointer available to a notification callback. Ignored by lws */
|
||||
const char **state_names;
|
||||
const char *name;
|
||||
int state;
|
||||
} lws_state_manager_t;
|
||||
|
||||
/**
|
||||
* lws_state_reg_notifier() - add dep handler for state notifications
|
||||
*
|
||||
* \param context: the lws_context
|
||||
* \param nl: the handler to add to the notifier linked-list
|
||||
*
|
||||
* Add \p notify_link to the context's list of notification handlers for system
|
||||
* state changes. The handlers can defeat or take over responsibility for
|
||||
* retrying the change after they have initiated some dependency.
|
||||
*/
|
||||
|
||||
LWS_EXTERN LWS_VISIBLE void
|
||||
lws_state_reg_notifier(lws_state_manager_t *mgr, lws_state_notify_link_t *nl);
|
||||
|
||||
/**
|
||||
* lws_state_reg_deregister() - deregister a notifier
|
||||
*
|
||||
* \param nl: notification hardler to deregister
|
||||
*
|
||||
* Remove a notification handler from its state manager
|
||||
*/
|
||||
|
||||
LWS_EXTERN LWS_VISIBLE void
|
||||
lws_state_reg_deregister(lws_state_notify_link_t *nl);
|
||||
|
||||
/**
|
||||
* lws_state_reg_notifier_list() - add dep handlers for state notifications
|
||||
*
|
||||
* \param context: the lws_context
|
||||
* \param nl: list of notification handlers
|
||||
*
|
||||
* Add a NULL-terminated list of notification handler pointers to a notification
|
||||
* manager object
|
||||
*/
|
||||
|
||||
LWS_EXTERN LWS_VISIBLE void
|
||||
lws_state_reg_notifier_list(lws_state_manager_t *mgr,
|
||||
lws_state_notify_link_t * const *nl);
|
||||
|
||||
/**
|
||||
* lws_state_transition_steps() - move to state via starting any deps
|
||||
*
|
||||
* \param mgr: the state manager object
|
||||
* \param target: the state we wish to move to
|
||||
*
|
||||
* Advance state by state towards state \p target. At each state, notifiers
|
||||
* may veto the change and be triggered to perform dependencies, stopping the
|
||||
* advance towards the target state.
|
||||
*/
|
||||
LWS_EXTERN LWS_VISIBLE int
|
||||
lws_state_transition_steps(lws_state_manager_t *mgr, int target);
|
||||
|
||||
/**
|
||||
* lws_state_transition() - move to state via starting any deps
|
||||
*
|
||||
* \param mgr: the state manager object
|
||||
* \param target: the state we wish to move to
|
||||
*
|
||||
* Jump to state target atomically. Notifiers may veto it.
|
||||
*/
|
||||
LWS_EXTERN LWS_VISIBLE int
|
||||
lws_state_transition(lws_state_manager_t *mgr, int target);
|
||||
|
||||
#else
|
||||
|
||||
#endif
|
||||
284
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-struct.h
Normal file
284
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-struct.h
Normal file
@ -0,0 +1,284 @@
|
||||
/*
|
||||
* libwebsockets - small server side websockets and web server implementation
|
||||
*
|
||||
* Copyright (C) 2010 - 2020 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#if defined(LWS_WITH_STRUCT_SQLITE3)
|
||||
#include <sqlite3.h>
|
||||
#endif
|
||||
|
||||
typedef enum {
|
||||
LSMT_SIGNED,
|
||||
LSMT_UNSIGNED,
|
||||
LSMT_BOOLEAN,
|
||||
LSMT_STRING_CHAR_ARRAY,
|
||||
LSMT_STRING_PTR,
|
||||
LSMT_LIST,
|
||||
LSMT_CHILD_PTR,
|
||||
LSMT_SCHEMA,
|
||||
LSMT_BLOB_PTR,
|
||||
|
||||
} lws_struct_map_type_eum;
|
||||
|
||||
typedef struct lejp_collation {
|
||||
struct lws_dll2 chunks;
|
||||
int len;
|
||||
char buf[LEJP_STRING_CHUNK + 1];
|
||||
} lejp_collation_t;
|
||||
|
||||
typedef struct lws_struct_map {
|
||||
const char *colname;
|
||||
const struct lws_struct_map *child_map;
|
||||
lejp_callback lejp_cb;
|
||||
size_t ofs; /* child dll2; points to dll2_owner */
|
||||
size_t aux;
|
||||
size_t ofs_clist;
|
||||
size_t child_map_size;
|
||||
lws_struct_map_type_eum type;
|
||||
} lws_struct_map_t;
|
||||
|
||||
typedef int (*lws_struct_args_cb)(void *obj, void *cb_arg);
|
||||
|
||||
typedef struct lws_struct_args {
|
||||
const lws_struct_map_t *map_st[LEJP_MAX_PARSING_STACK_DEPTH];
|
||||
lws_struct_args_cb cb;
|
||||
struct lwsac *ac;
|
||||
void *cb_arg;
|
||||
void *dest;
|
||||
|
||||
size_t dest_len;
|
||||
size_t toplevel_dll2_ofs;
|
||||
size_t map_entries_st[LEJP_MAX_PARSING_STACK_DEPTH];
|
||||
size_t ac_block_size;
|
||||
int subtype;
|
||||
|
||||
int top_schema_index;
|
||||
|
||||
/*
|
||||
* temp ac used to collate unknown possibly huge strings before final
|
||||
* allocation and copy
|
||||
*/
|
||||
struct lwsac *ac_chunks;
|
||||
struct lws_dll2_owner chunks_owner;
|
||||
size_t chunks_length;
|
||||
} lws_struct_args_t;
|
||||
|
||||
#define LSM_SIGNED(type, name, qname) \
|
||||
{ \
|
||||
qname, \
|
||||
NULL, \
|
||||
NULL, \
|
||||
offsetof(type, name), \
|
||||
sizeof ((type *)0)->name, \
|
||||
0, \
|
||||
0, \
|
||||
LSMT_SIGNED \
|
||||
}
|
||||
|
||||
#define LSM_UNSIGNED(type, name, qname) \
|
||||
{ \
|
||||
qname, \
|
||||
NULL, \
|
||||
NULL, \
|
||||
offsetof(type, name), \
|
||||
sizeof ((type *)0)->name, \
|
||||
0, \
|
||||
0, \
|
||||
LSMT_UNSIGNED \
|
||||
}
|
||||
|
||||
#define LSM_BOOLEAN(type, name, qname) \
|
||||
{ \
|
||||
qname, \
|
||||
NULL, \
|
||||
NULL, \
|
||||
offsetof(type, name), \
|
||||
sizeof ((type *)0)->name, \
|
||||
0, \
|
||||
0, \
|
||||
LSMT_BOOLEAN \
|
||||
}
|
||||
|
||||
#define LSM_CARRAY(type, name, qname) \
|
||||
{ \
|
||||
qname, \
|
||||
NULL, \
|
||||
NULL, \
|
||||
offsetof(type, name), \
|
||||
sizeof (((type *)0)->name), \
|
||||
0, \
|
||||
0, \
|
||||
LSMT_STRING_CHAR_ARRAY \
|
||||
}
|
||||
|
||||
#define LSM_STRING_PTR(type, name, qname) \
|
||||
{ \
|
||||
qname, \
|
||||
NULL, \
|
||||
NULL, \
|
||||
offsetof(type, name), \
|
||||
sizeof (((type *)0)->name), \
|
||||
0, \
|
||||
0, \
|
||||
LSMT_STRING_PTR \
|
||||
}
|
||||
|
||||
#define LSM_LIST(ptype, pname, ctype, cname, lejp_cb, cmap, qname) \
|
||||
{ \
|
||||
qname, \
|
||||
cmap, \
|
||||
lejp_cb, \
|
||||
offsetof(ptype, pname), \
|
||||
sizeof (ctype), \
|
||||
offsetof(ctype, cname), \
|
||||
LWS_ARRAY_SIZE(cmap), \
|
||||
LSMT_LIST \
|
||||
}
|
||||
|
||||
#define LSM_CHILD_PTR(ptype, pname, ctype, lejp_cb, cmap, qname) \
|
||||
{ \
|
||||
qname, \
|
||||
cmap, \
|
||||
lejp_cb, \
|
||||
offsetof(ptype, pname), \
|
||||
sizeof (ctype), \
|
||||
0, \
|
||||
LWS_ARRAY_SIZE(cmap), \
|
||||
LSMT_CHILD_PTR \
|
||||
}
|
||||
|
||||
#define LSM_SCHEMA(ctype, lejp_cb, map, schema_name) \
|
||||
{ \
|
||||
schema_name, \
|
||||
map, \
|
||||
lejp_cb, \
|
||||
0, \
|
||||
sizeof (ctype), \
|
||||
0, \
|
||||
LWS_ARRAY_SIZE(map), \
|
||||
LSMT_SCHEMA \
|
||||
}
|
||||
|
||||
#define LSM_SCHEMA_DLL2(ctype, cdll2mem, lejp_cb, map, schema_name) \
|
||||
{ \
|
||||
schema_name, \
|
||||
map, \
|
||||
lejp_cb, \
|
||||
offsetof(ctype, cdll2mem), \
|
||||
sizeof (ctype), \
|
||||
0, \
|
||||
LWS_ARRAY_SIZE(map), \
|
||||
LSMT_SCHEMA \
|
||||
}
|
||||
|
||||
/*
|
||||
* This is just used to create the table schema, it is not part of serialization
|
||||
* and deserialization. Blobs should be accessed separately.
|
||||
*/
|
||||
|
||||
#define LSM_BLOB_PTR(type, blobptr_name, qname) \
|
||||
{ \
|
||||
qname, /* JSON item, or sqlite3 column name */ \
|
||||
NULL, \
|
||||
NULL, \
|
||||
offsetof(type, blobptr_name), /* member that points to blob */ \
|
||||
sizeof (((type *)0)->blobptr_name), /* size of blob pointer */ \
|
||||
0, /* member holding blob len */ \
|
||||
0, /* size of blob length member */ \
|
||||
LSMT_BLOB_PTR \
|
||||
}
|
||||
|
||||
typedef struct lws_struct_serialize_st {
|
||||
const struct lws_dll2 *dllpos;
|
||||
const lws_struct_map_t *map;
|
||||
const char *obj;
|
||||
size_t map_entries;
|
||||
size_t map_entry;
|
||||
size_t size;
|
||||
char subsequent;
|
||||
char idt;
|
||||
} lws_struct_serialize_st_t;
|
||||
|
||||
enum {
|
||||
LSSERJ_FLAG_PRETTY = (1 << 0),
|
||||
LSSERJ_FLAG_OMIT_SCHEMA = (1 << 1)
|
||||
};
|
||||
|
||||
typedef struct lws_struct_serialize {
|
||||
lws_struct_serialize_st_t st[LEJP_MAX_PARSING_STACK_DEPTH];
|
||||
|
||||
size_t offset;
|
||||
size_t remaining;
|
||||
|
||||
int sp;
|
||||
int flags;
|
||||
} lws_struct_serialize_t;
|
||||
|
||||
typedef enum {
|
||||
LSJS_RESULT_CONTINUE,
|
||||
LSJS_RESULT_FINISH,
|
||||
LSJS_RESULT_ERROR
|
||||
} lws_struct_json_serialize_result_t;
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_struct_json_init_parse(struct lejp_ctx *ctx, lejp_callback cb,
|
||||
void *user);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN signed char
|
||||
lws_struct_schema_only_lejp_cb(struct lejp_ctx *ctx, char reason);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN signed char
|
||||
lws_struct_default_lejp_cb(struct lejp_ctx *ctx, char reason);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN lws_struct_serialize_t *
|
||||
lws_struct_json_serialize_create(const lws_struct_map_t *map,
|
||||
size_t map_entries, int flags,
|
||||
const void *ptoplevel);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_struct_json_serialize_destroy(lws_struct_serialize_t **pjs);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN lws_struct_json_serialize_result_t
|
||||
lws_struct_json_serialize(lws_struct_serialize_t *js, uint8_t *buf,
|
||||
size_t len, size_t *written);
|
||||
|
||||
typedef struct sqlite3 sqlite3;
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_struct_sq3_serialize(sqlite3 *pdb, const lws_struct_map_t *schema,
|
||||
lws_dll2_owner_t *owner, uint32_t manual_idx);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_struct_sq3_deserialize(sqlite3 *pdb, const char *filter, const char *order,
|
||||
const lws_struct_map_t *schema, lws_dll2_owner_t *o,
|
||||
struct lwsac **ac, int start, int limit);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_struct_sq3_create_table(sqlite3 *pdb, const lws_struct_map_t *schema);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_struct_sq3_open(struct lws_context *context, const char *sqlite3_path,
|
||||
char create_if_missing, sqlite3 **pdb);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_struct_sq3_close(sqlite3 **pdb);
|
||||
|
||||
417
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-system.h
Normal file
417
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-system.h
Normal file
@ -0,0 +1,417 @@
|
||||
/*
|
||||
* libwebsockets - small server side websockets and web server implementation
|
||||
*
|
||||
* Copyright (C) 2010 - 2021 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*
|
||||
* This provides a clean way to interface lws user code to be able to
|
||||
* work unchanged on different systems for fetching common system information,
|
||||
* and performing common system operations like reboot.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Types of system blob that can be set and retreived
|
||||
*/
|
||||
|
||||
typedef enum {
|
||||
LWS_SYSBLOB_TYPE_AUTH,
|
||||
LWS_SYSBLOB_TYPE_CLIENT_CERT_DER = LWS_SYSBLOB_TYPE_AUTH + 2,
|
||||
LWS_SYSBLOB_TYPE_CLIENT_KEY_DER,
|
||||
LWS_SYSBLOB_TYPE_DEVICE_SERIAL,
|
||||
LWS_SYSBLOB_TYPE_DEVICE_FW_VERSION,
|
||||
LWS_SYSBLOB_TYPE_DEVICE_TYPE,
|
||||
LWS_SYSBLOB_TYPE_NTP_SERVER,
|
||||
LWS_SYSBLOB_TYPE_MQTT_CLIENT_ID,
|
||||
LWS_SYSBLOB_TYPE_MQTT_USERNAME,
|
||||
LWS_SYSBLOB_TYPE_MQTT_PASSWORD,
|
||||
|
||||
#if defined(LWS_WITH_SECURE_STREAMS_AUTH_SIGV4)
|
||||
/* extend 4 more auth blobs, each has 2 slots */
|
||||
LWS_SYSBLOB_TYPE_EXT_AUTH1,
|
||||
LWS_SYSBLOB_TYPE_EXT_AUTH2 = LWS_SYSBLOB_TYPE_EXT_AUTH1 + 2,
|
||||
LWS_SYSBLOB_TYPE_EXT_AUTH3 = LWS_SYSBLOB_TYPE_EXT_AUTH2 + 2,
|
||||
LWS_SYSBLOB_TYPE_EXT_AUTH4 = LWS_SYSBLOB_TYPE_EXT_AUTH3 + 2,
|
||||
LWS_SYSBLOB_TYPE_EXT_AUTH4_1,
|
||||
#endif
|
||||
|
||||
LWS_SYSBLOB_TYPE_COUNT /* ... always last */
|
||||
} lws_system_blob_item_t;
|
||||
|
||||
/* opaque generic blob whose content may be on-the-heap or pointed-to
|
||||
* directly case by case. When it's on the heap, it can be produced by
|
||||
* appending (it's a buflist underneath). Either way, it can be consumed by
|
||||
* copying out a given length from a given offset.
|
||||
*/
|
||||
|
||||
typedef struct lws_system_blob lws_system_blob_t;
|
||||
|
||||
LWS_EXTERN LWS_VISIBLE void
|
||||
lws_system_blob_direct_set(lws_system_blob_t *b, const uint8_t *ptr, size_t len);
|
||||
|
||||
LWS_EXTERN LWS_VISIBLE void
|
||||
lws_system_blob_heap_empty(lws_system_blob_t *b);
|
||||
|
||||
LWS_EXTERN LWS_VISIBLE int
|
||||
lws_system_blob_heap_append(lws_system_blob_t *b, const uint8_t *ptr, size_t len);
|
||||
|
||||
LWS_EXTERN LWS_VISIBLE size_t
|
||||
lws_system_blob_get_size(lws_system_blob_t *b);
|
||||
|
||||
/* return 0 and sets *ptr to point to blob data if possible, nonzero = fail */
|
||||
LWS_EXTERN LWS_VISIBLE int
|
||||
lws_system_blob_get_single_ptr(lws_system_blob_t *b, const uint8_t **ptr);
|
||||
|
||||
LWS_EXTERN LWS_VISIBLE int
|
||||
lws_system_blob_get(lws_system_blob_t *b, uint8_t *ptr, size_t *len, size_t ofs);
|
||||
|
||||
LWS_EXTERN LWS_VISIBLE void
|
||||
lws_system_blob_destroy(lws_system_blob_t *b);
|
||||
|
||||
/*
|
||||
* Get the opaque blob for index idx of various system blobs. Returns 0 if
|
||||
* *b was set otherwise nonzero means out of range
|
||||
*/
|
||||
|
||||
LWS_EXTERN LWS_VISIBLE lws_system_blob_t *
|
||||
lws_system_get_blob(struct lws_context *context, lws_system_blob_item_t type,
|
||||
int idx);
|
||||
|
||||
/*
|
||||
* Lws view of system state... normal operation from user code perspective is
|
||||
* dependent on implicit (eg, knowing the date for cert validation) and
|
||||
* explicit dependencies.
|
||||
*
|
||||
* Bit of lws and user code can register notification handlers that can enforce
|
||||
* dependent operations before state transitions can complete.
|
||||
*/
|
||||
|
||||
typedef enum { /* keep system_state_names[] in sync in context.c */
|
||||
LWS_SYSTATE_UNKNOWN,
|
||||
|
||||
LWS_SYSTATE_CONTEXT_CREATED, /* context was just created */
|
||||
LWS_SYSTATE_INITIALIZED, /* protocols initialized. Lws itself
|
||||
* can operate normally */
|
||||
LWS_SYSTATE_IFACE_COLDPLUG, /* existing net ifaces iterated */
|
||||
LWS_SYSTATE_DHCP, /* at least one net iface configured */
|
||||
LWS_SYSTATE_CPD_PRE_TIME, /* Captive portal detect without valid
|
||||
* time, good for non-https tests... if
|
||||
* you care about it, implement and
|
||||
* call lws_system_ops_t
|
||||
* .captive_portal_detect_request()
|
||||
* and move the state forward according
|
||||
* to the result. */
|
||||
LWS_SYSTATE_TIME_VALID, /* ntpclient ran, or hw time valid...
|
||||
* tls cannot work until we reach here
|
||||
*/
|
||||
LWS_SYSTATE_CPD_POST_TIME, /* Captive portal detect after time was
|
||||
* time, good for https tests... if
|
||||
* you care about it, implement and
|
||||
* call lws_system_ops_t
|
||||
* .captive_portal_detect_request()
|
||||
* and move the state forward according
|
||||
* to the result. */
|
||||
|
||||
LWS_SYSTATE_POLICY_VALID, /* user code knows how to operate... */
|
||||
LWS_SYSTATE_REGISTERED, /* device has an identity... */
|
||||
LWS_SYSTATE_AUTH1, /* identity used for main auth token */
|
||||
LWS_SYSTATE_AUTH2, /* identity used for optional auth */
|
||||
|
||||
LWS_SYSTATE_ONE_TIME_UPDATES, /* pre-OPERATIONAL one-time updates,
|
||||
* when a firmware needs to perform
|
||||
* one-time upgrades to state before
|
||||
* OPERATIONAL */
|
||||
|
||||
LWS_SYSTATE_OPERATIONAL, /* user code can operate normally */
|
||||
|
||||
LWS_SYSTATE_POLICY_INVALID, /* user code is changing its policies
|
||||
* drop everything done with old
|
||||
* policy, switch to new then enter
|
||||
* LWS_SYSTATE_POLICY_VALID */
|
||||
LWS_SYSTATE_CONTEXT_DESTROYING, /* Context is being destroyed */
|
||||
LWS_SYSTATE_AWAITING_MODAL_UPDATING, /* We're negotiating with the
|
||||
* user code for update mode */
|
||||
LWS_SYSTATE_MODAL_UPDATING, /* We're updating the firmware */
|
||||
} lws_system_states_t;
|
||||
|
||||
/* Captive Portal Detect -related */
|
||||
|
||||
typedef enum {
|
||||
LWS_CPD_UNKNOWN = 0, /* test didn't happen ince last DHCP acq yet */
|
||||
LWS_CPD_INTERNET_OK, /* no captive portal: our CPD test passed OK,
|
||||
* we can go out on the internet */
|
||||
LWS_CPD_CAPTIVE_PORTAL, /* we inferred we're behind a captive portal */
|
||||
LWS_CPD_NO_INTERNET, /* we couldn't touch anything */
|
||||
} lws_cpd_result_t;
|
||||
|
||||
typedef void (*lws_attach_cb_t)(struct lws_context *context, int tsi, void *opaque);
|
||||
struct lws_attach_item;
|
||||
|
||||
LWS_EXTERN LWS_VISIBLE int
|
||||
lws_tls_jit_trust_got_cert_cb(struct lws_context *cx, void *got_opaque,
|
||||
const uint8_t *skid, size_t skid_len,
|
||||
const uint8_t *der, size_t der_len);
|
||||
|
||||
typedef struct lws_system_ops {
|
||||
int (*reboot)(void);
|
||||
int (*set_clock)(lws_usec_t us);
|
||||
int (*attach)(struct lws_context *context, int tsi, lws_attach_cb_t cb,
|
||||
lws_system_states_t state, void *opaque,
|
||||
struct lws_attach_item **get);
|
||||
/**< if \p get is NULL, add an attach callback request to the pt for
|
||||
* \p cb with arg \p opaque, that should be called when we're at or past
|
||||
* system state \p state.
|
||||
*
|
||||
* If \p get is non-NULL, look for the first listed item on the pt whose
|
||||
* state situation is ready, and set *get to point to it. If no items,
|
||||
* or none where the system state is right, set *get to NULL.
|
||||
*
|
||||
* It's done like this so (*attach) can perform system-specific
|
||||
* locking outside of lws core, for both getting and adding items the
|
||||
* same so it is thread-safe. A non-threadsafe helper
|
||||
* __lws_system_attach() is provided to do the actual work inside the
|
||||
* system-specific locking.
|
||||
*/
|
||||
int (*captive_portal_detect_request)(struct lws_context *context);
|
||||
/**< Check if we can go out on the internet cleanly, or if we are being
|
||||
* redirected or intercepted by a captive portal.
|
||||
* Start the check that proceeds asynchronously, and report the results
|
||||
* by calling lws_captive_portal_detect_result() api
|
||||
*/
|
||||
|
||||
#if defined(LWS_WITH_NETWORK)
|
||||
int (*metric_report)(lws_metric_pub_t *mdata);
|
||||
/**< metric \p item is reporting an event of kind \p rpt,
|
||||
* held in \p mdata... return 0 to leave the metric object as it is,
|
||||
* or nonzero to reset it. */
|
||||
#endif
|
||||
int (*jit_trust_query)(struct lws_context *cx, const uint8_t *skid,
|
||||
size_t skid_len, void *got_opaque);
|
||||
/**< user defined trust store search, if we do trust a cert with SKID
|
||||
* matching skid / skid_len, then it should get hold of the DER for the
|
||||
* matching root CA and call
|
||||
* lws_tls_jit_trust_got_cert_cb(..., got_opaque) before cleaning up and
|
||||
* returning. The DER should be destroyed if in heap before returning.
|
||||
*/
|
||||
|
||||
#if defined(LWS_WITH_OTA)
|
||||
lws_ota_ops_t ota_ops;
|
||||
/**< Platform OTA interface to lws_ota, see lws-ota.h */
|
||||
#endif
|
||||
|
||||
uint32_t wake_latency_us;
|
||||
/**< time taken for this device to wake from suspend, in us
|
||||
*/
|
||||
} lws_system_ops_t;
|
||||
|
||||
#if defined(LWS_WITH_SYS_STATE)
|
||||
|
||||
/**
|
||||
* lws_system_get_state_manager() - return the state mgr object for system state
|
||||
*
|
||||
* \param context: the lws_context
|
||||
*
|
||||
* The returned pointer can be used with the lws_state_ apis
|
||||
*/
|
||||
|
||||
LWS_EXTERN LWS_VISIBLE lws_state_manager_t *
|
||||
lws_system_get_state_manager(struct lws_context *context);
|
||||
|
||||
#endif
|
||||
|
||||
/* wrappers handle NULL members or no ops struct set at all cleanly */
|
||||
|
||||
#define LWSSYSGAUTH_HEX (1 << 0)
|
||||
|
||||
/**
|
||||
* lws_system_get_ops() - get ahold of the system ops struct from the context
|
||||
*
|
||||
* \param context: the lws_context
|
||||
*
|
||||
* Returns the system ops struct. It may return NULL and if not, anything in
|
||||
* there may be NULL.
|
||||
*/
|
||||
LWS_EXTERN LWS_VISIBLE const lws_system_ops_t *
|
||||
lws_system_get_ops(struct lws_context *context);
|
||||
|
||||
#if defined(LWS_WITH_SYS_STATE)
|
||||
|
||||
/**
|
||||
* lws_system_context_from_system_mgr() - return context from system state mgr
|
||||
*
|
||||
* \param mgr: pointer to specifically the system state mgr
|
||||
*
|
||||
* Returns the context from the system state mgr. Helper since the lws_context
|
||||
* is opaque.
|
||||
*/
|
||||
LWS_EXTERN LWS_VISIBLE struct lws_context *
|
||||
lws_system_context_from_system_mgr(lws_state_manager_t *mgr);
|
||||
|
||||
#endif
|
||||
|
||||
/**
|
||||
* __lws_system_attach() - get and set items on context attach list
|
||||
*
|
||||
* \param context: context to get or set attach items to
|
||||
* \param tsi: thread service index (normally 0)
|
||||
* \param cb: callback to call from context event loop thread
|
||||
* \param state: the lws_system state we have to be in or have passed through
|
||||
* \param opaque: optional pointer to user specific info given to callback
|
||||
* \param get: NULL, or pointer to pointer to take detached tail item on exit
|
||||
*
|
||||
* This allows other threads to enqueue callback requests to happen from a pt's
|
||||
* event loop thread safely. The callback gets the context pointer and a user
|
||||
* opaque pointer that can be optionally given when the item is added to the
|
||||
* attach list.
|
||||
*
|
||||
* This api is the no-locking core function for getting and setting items on the
|
||||
* pt's attach list. The lws_system operation (*attach) is the actual
|
||||
* api that user and internal code calls for this feature, it should perform
|
||||
* system-specific locking, call this helper, release the locking and then
|
||||
* return the result. This api is public only so it can be used in the locked
|
||||
* implementation of (*attach).
|
||||
*
|
||||
* If get is NULL, then the call adds to the head of the pt attach list using
|
||||
* cb, state, and opaque; if get is non-NULL, then *get is set to the first
|
||||
* waiting attached item that meets the state criteria and that item is removed
|
||||
* from the list.
|
||||
*
|
||||
* This is a non-threadsafe helper only designed to be called from
|
||||
* implementations of struct lws_system's (*attach) operation where system-
|
||||
* specific locking has been applied around it, making it threadsafe.
|
||||
*/
|
||||
LWS_EXTERN LWS_VISIBLE int
|
||||
__lws_system_attach(struct lws_context *context, int tsi, lws_attach_cb_t cb,
|
||||
lws_system_states_t state, void *opaque,
|
||||
struct lws_attach_item **get);
|
||||
|
||||
|
||||
enum {
|
||||
LWSDH_IPV4_SUBNET_MASK = 0,
|
||||
LWSDH_IPV4_BROADCAST,
|
||||
LWSDH_LEASE_SECS,
|
||||
LWSDH_REBINDING_SECS,
|
||||
LWSDH_RENEWAL_SECS,
|
||||
|
||||
_LWSDH_NUMS_COUNT,
|
||||
|
||||
LWSDH_SA46_IP = 0,
|
||||
LWSDH_SA46_DNS_SRV_1,
|
||||
LWSDH_SA46_DNS_SRV_2,
|
||||
LWSDH_SA46_DNS_SRV_3,
|
||||
LWSDH_SA46_DNS_SRV_4,
|
||||
LWSDH_SA46_IPV4_ROUTER,
|
||||
LWSDH_SA46_NTP_SERVER,
|
||||
LWSDH_SA46_DHCP_SERVER,
|
||||
|
||||
_LWSDH_SA46_COUNT,
|
||||
};
|
||||
|
||||
#if defined(LWS_WITH_NETWORK)
|
||||
typedef struct lws_dhcpc_ifstate {
|
||||
char ifname[16];
|
||||
char domain[64];
|
||||
uint8_t mac[6];
|
||||
uint32_t nums[_LWSDH_NUMS_COUNT];
|
||||
lws_sockaddr46 sa46[_LWSDH_SA46_COUNT];
|
||||
} lws_dhcpc_ifstate_t;
|
||||
|
||||
typedef int (*dhcpc_cb_t)(void *opaque, lws_dhcpc_ifstate_t *is);
|
||||
|
||||
/**
|
||||
* lws_dhcpc_request() - add a network interface to dhcpc management
|
||||
*
|
||||
* \param c: the lws_context
|
||||
* \param i: the interface name, like "eth0"
|
||||
* \param af: address family
|
||||
* \param cb: the change callback
|
||||
* \param opaque: opaque pointer given to the callback
|
||||
*
|
||||
* Register a network interface as being managed by DHCP. lws will proceed to
|
||||
* try to acquire an IP. Requires LWS_WITH_SYS_DHCP_CLIENT at cmake.
|
||||
*/
|
||||
LWS_EXTERN LWS_VISIBLE int
|
||||
lws_dhcpc_request(struct lws_context *c, const char *i, int af, dhcpc_cb_t cb,
|
||||
void *opaque);
|
||||
|
||||
/**
|
||||
* lws_dhcpc_remove() - remove a network interface to dhcpc management
|
||||
*
|
||||
* \param context: the lws_context
|
||||
* \param iface: the interface name, like "eth0"
|
||||
*
|
||||
* Remove handling of the network interface from dhcp.
|
||||
*/
|
||||
LWS_EXTERN LWS_VISIBLE int
|
||||
lws_dhcpc_remove(struct lws_context *context, const char *iface);
|
||||
|
||||
/**
|
||||
* lws_dhcpc_status() - has any interface reached BOUND state
|
||||
*
|
||||
* \param context: the lws_context
|
||||
* \param sa46: set to a DNS server from a bound interface, or NULL
|
||||
*
|
||||
* Returns 1 if any network interface managed by dhcpc has reached the BOUND
|
||||
* state (has acquired an IP, gateway and DNS server), otherwise 0.
|
||||
*/
|
||||
LWS_EXTERN LWS_VISIBLE int
|
||||
lws_dhcpc_status(struct lws_context *context, lws_sockaddr46 *sa46);
|
||||
|
||||
/**
|
||||
* lws_system_cpd_start() - helper to initiate captive portal detection
|
||||
*
|
||||
* \param context: the lws_context
|
||||
*
|
||||
* Resets the context's captive portal state to LWS_CPD_UNKNOWN and calls the
|
||||
* lws_system_ops_t captive_portal_detect_request() implementation to begin
|
||||
* testing the captive portal state.
|
||||
*/
|
||||
LWS_EXTERN LWS_VISIBLE int
|
||||
lws_system_cpd_start(struct lws_context *context);
|
||||
|
||||
LWS_EXTERN LWS_VISIBLE void
|
||||
lws_system_cpd_start_defer(struct lws_context *cx, lws_usec_t defer_us);
|
||||
|
||||
|
||||
/**
|
||||
* lws_system_cpd_set() - report the result of the captive portal detection
|
||||
*
|
||||
* \param context: the lws_context
|
||||
* \param result: one of the LWS_CPD_ constants representing captive portal state
|
||||
*
|
||||
* Sets the context's captive portal detection state to result. User captive
|
||||
* portal detection code would call this once it had a result from its test.
|
||||
*/
|
||||
LWS_EXTERN LWS_VISIBLE void
|
||||
lws_system_cpd_set(struct lws_context *context, lws_cpd_result_t result);
|
||||
|
||||
|
||||
/**
|
||||
* lws_system_cpd_state_get() - returns the last tested captive portal state
|
||||
*
|
||||
* \param context: the lws_context
|
||||
*
|
||||
* Returns one of the LWS_CPD_ constants indicating the system's understanding
|
||||
* of the current captive portal situation.
|
||||
*/
|
||||
LWS_EXTERN LWS_VISIBLE lws_cpd_result_t
|
||||
lws_system_cpd_state_get(struct lws_context *context);
|
||||
|
||||
#endif
|
||||
|
||||
@ -0,0 +1,61 @@
|
||||
/*
|
||||
* libwebsockets - small server side websockets and web server implementation
|
||||
*
|
||||
* Copyright (C) 2010 - 2019 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*
|
||||
* lws_test_sequencer manages running an array of unit tests.
|
||||
*/
|
||||
|
||||
typedef void (*lws_test_sequence_cb)(const void *cb_user);
|
||||
|
||||
typedef struct lws_test_sequencer_args {
|
||||
lws_abs_t *abs; /* abstract protocol + unit test txport */
|
||||
lws_unit_test_t *tests; /* array of lws_unit_test_t */
|
||||
int *results; /* takes result dispositions */
|
||||
int results_max; /* max space usable in results */
|
||||
int *count_tests; /* count of done tests */
|
||||
int *count_passes; /* count of passed tests */
|
||||
lws_test_sequence_cb cb; /* completion callback */
|
||||
void *cb_user; /* opaque user ptr given to cb */
|
||||
} lws_test_sequencer_args_t;
|
||||
|
||||
/**
|
||||
* lws_abs_unit_test_sequencer() - helper to sequence multiple unit tests
|
||||
*
|
||||
* \param args: lws_test_sequencer_args_t prepared with arguments for the tests
|
||||
*
|
||||
* This helper sequences one or more unit tests to run and collects the results.
|
||||
*
|
||||
* The incoming abs should be set up for the abstract protocol you want to test
|
||||
* and the lws unit-test transport.
|
||||
*
|
||||
* Results are one of
|
||||
*
|
||||
* LPE_SUCCEEDED
|
||||
* LPE_FAILED
|
||||
* LPE_FAILED_UNEXPECTED_TIMEOUT
|
||||
* LPE_FAILED_UNEXPECTED_PASS
|
||||
* LPE_FAILED_UNEXPECTED_CLOSE
|
||||
*
|
||||
* The callback args->cb is called when the tests have been done.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_abs_unit_test_sequencer(const lws_test_sequencer_args_t *args);
|
||||
@ -0,0 +1,280 @@
|
||||
/*
|
||||
* libwebsockets - small server side websockets and web server implementation
|
||||
*
|
||||
* Copyright (C) 2010 - 2020 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
/** \defgroup threadpool Threadpool related functions
|
||||
* ##Threadpool
|
||||
* \ingroup lwsapi
|
||||
*
|
||||
* This allows you to create one or more pool of threads which can run tasks
|
||||
* associated with a wsi. If the pool is busy, tasks wait on a queue.
|
||||
*
|
||||
* Tasks don't have to be atomic, if they will take more than a few tens of ms
|
||||
* they should return back to the threadpool worker with a return of 0. This
|
||||
* will allow them to abort cleanly.
|
||||
*/
|
||||
//@{
|
||||
|
||||
struct lws_threadpool;
|
||||
struct lws_threadpool_task;
|
||||
|
||||
enum lws_threadpool_task_status {
|
||||
LWS_TP_STATUS_QUEUED,
|
||||
LWS_TP_STATUS_RUNNING,
|
||||
LWS_TP_STATUS_SYNCING,
|
||||
LWS_TP_STATUS_STOPPING,
|
||||
LWS_TP_STATUS_FINISHED, /* lws_threadpool_task_status() frees task */
|
||||
LWS_TP_STATUS_STOPPED, /* lws_threadpool_task_status() frees task */
|
||||
};
|
||||
|
||||
enum lws_threadpool_task_return {
|
||||
/** Still work to do, just confirming not being stopped */
|
||||
LWS_TP_RETURN_CHECKING_IN,
|
||||
/** Still work to do, enter cond_wait until service thread syncs. This
|
||||
* is used if you have filled your buffer(s) of data to the service
|
||||
* thread and are blocked until the service thread completes sending at
|
||||
* least one.
|
||||
*/
|
||||
LWS_TP_RETURN_SYNC,
|
||||
/** No more work to do... */
|
||||
LWS_TP_RETURN_FINISHED,
|
||||
/** Responding to request to stop */
|
||||
LWS_TP_RETURN_STOPPED,
|
||||
|
||||
/* OR on to indicate this task wishes to outlive its wsi */
|
||||
LWS_TP_RETURN_FLAG_OUTLIVE = 64
|
||||
};
|
||||
|
||||
struct lws_threadpool_create_args {
|
||||
int threads;
|
||||
int max_queue_depth;
|
||||
};
|
||||
|
||||
struct lws_threadpool_task_args {
|
||||
#if defined(LWS_WITH_SECURE_STREAMS)
|
||||
struct lws_ss_handle *ss; /**< either wsi or ss must be set */
|
||||
#endif
|
||||
struct lws *wsi; /**< either wsi or ss must be set */
|
||||
|
||||
void *user; /**< user may set (user-private pointer) */
|
||||
const char *name; /**< user may set to describe task */
|
||||
char async_task; /**< set to allow the task to shrug off the loss
|
||||
of the associated wsi and continue to
|
||||
completion */
|
||||
enum lws_threadpool_task_return (*task)(void *user,
|
||||
enum lws_threadpool_task_status s);
|
||||
/**< user must set to actual task function */
|
||||
void (*cleanup)(struct lws *wsi, void *user);
|
||||
/**< socket lifecycle may end while task is not stoppable, so the task
|
||||
* must be able to detach from any wsi and clean itself up when it does
|
||||
* stop. If NULL, no cleanup necessary, otherwise point to a user-
|
||||
* supplied function that destroys the stuff in \p user.
|
||||
*
|
||||
* wsi may be NULL on entry, indicating the task got detached due to the
|
||||
* wsi closing before.
|
||||
*/
|
||||
};
|
||||
|
||||
/**
|
||||
* lws_threadpool_create() - create a pool of worker threads
|
||||
*
|
||||
* \param context: the lws_context the threadpool will exist inside
|
||||
* \param args: argument struct prepared by caller
|
||||
* \param format: printf-type format for the task name
|
||||
* \param ...: printf type args for the task name format
|
||||
*
|
||||
* Creates a pool of worker threads with \p threads and a queue of up to
|
||||
* \p max_queue_depth waiting tasks if all the threads are busy.
|
||||
*
|
||||
* Returns NULL if OOM, or a struct lws_threadpool pointer that must be
|
||||
* destroyed by lws_threadpool_destroy().
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN struct lws_threadpool *
|
||||
lws_threadpool_create(struct lws_context *context,
|
||||
const struct lws_threadpool_create_args *args,
|
||||
const char *format, ...) LWS_FORMAT(3);
|
||||
|
||||
/**
|
||||
* lws_threadpool_finish() - Stop all pending and running tasks
|
||||
*
|
||||
* \param tp: the threadpool object
|
||||
*
|
||||
* Marks the threadpool as under destruction. Removes everything from the
|
||||
* pending queue and completes those tasks as LWS_TP_STATUS_STOPPED.
|
||||
*
|
||||
* Running tasks will also get LWS_TP_STATUS_STOPPED as soon as they
|
||||
* "resurface".
|
||||
*
|
||||
* This doesn't reap tasks or free the threadpool, the reaping is done by the
|
||||
* lws_threadpool_task_status() on the done task.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_threadpool_finish(struct lws_threadpool *tp);
|
||||
|
||||
/**
|
||||
* lws_threadpool_destroy() - Destroy a threadpool
|
||||
*
|
||||
* \param tp: the threadpool object
|
||||
*
|
||||
* Waits for all worker threads to stop, ends the threads and frees the tp.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_threadpool_destroy(struct lws_threadpool *tp);
|
||||
|
||||
/**
|
||||
* lws_threadpool_enqueue() - Queue the task and run it on a worker thread when possible
|
||||
*
|
||||
* \param tp: the threadpool to queue / run on
|
||||
* \param args: information about what to run
|
||||
* \param format: printf-type format for the task name
|
||||
* \param ...: printf type args for the task name format
|
||||
*
|
||||
* This asks for a task to run ASAP on a worker thread in threadpool \p tp.
|
||||
*
|
||||
* The args defines the wsi, a user-private pointer, a timeout in secs and
|
||||
* a pointer to the task function.
|
||||
*
|
||||
* Returns NULL or an opaque pointer to the queued (or running, or completed)
|
||||
* task.
|
||||
*
|
||||
* Once a task is created and enqueued, it can only be destroyed by calling
|
||||
* lws_threadpool_task_status() on it after it has reached the state
|
||||
* LWS_TP_STATUS_FINISHED or LWS_TP_STATUS_STOPPED.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN struct lws_threadpool_task *
|
||||
lws_threadpool_enqueue(struct lws_threadpool *tp,
|
||||
const struct lws_threadpool_task_args *args,
|
||||
const char *format, ...) LWS_FORMAT(3);
|
||||
|
||||
/**
|
||||
* lws_threadpool_dequeue() - Dequeue or try to stop a running task
|
||||
*
|
||||
* \param wsi: the wsi whose current task we want to eliminate
|
||||
*
|
||||
* Returns 0 is the task was dequeued or already compeleted, or 1 if the task
|
||||
* has been asked to stop asynchronously.
|
||||
*
|
||||
* This doesn't free the task. It only shortcuts it to state
|
||||
* LWS_TP_STATUS_STOPPED. lws_threadpool_task_status() must be performed on
|
||||
* the task separately once it is in LWS_TP_STATUS_STOPPED to free the task.
|
||||
*
|
||||
* DEPRECATED: You should use lws_threadpool_dequeue_task() with
|
||||
* lws_threadpool_get_task_wsi() / _ss() if you know there can only be one task
|
||||
* per connection, or call it via lws_threadpool_foreach_task_wsi() / _ss() to
|
||||
* get the tasks bound to the connection.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_threadpool_dequeue(struct lws *wsi) LWS_WARN_DEPRECATED;
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_threadpool_dequeue_task(struct lws_threadpool_task *task);
|
||||
|
||||
|
||||
/**
|
||||
* lws_threadpool_task_status() - reap completed tasks
|
||||
*
|
||||
* \param wsi: the wsi to query the current task of
|
||||
* \param task: receives a pointer to the opaque task
|
||||
* \param user: receives a void * pointer to the task user data
|
||||
*
|
||||
* This is the equivalent of posix waitpid()... it returns the status of the
|
||||
* task, and if the task is in state LWS_TP_STATUS_FINISHED or
|
||||
* LWS_TP_STATUS_STOPPED, frees \p task. If in another state, the task
|
||||
* continues to exist.
|
||||
*
|
||||
* This is designed to be called from the service thread.
|
||||
*
|
||||
* Its use is to make sure the service thread has seen the state of the task
|
||||
* before deleting it.
|
||||
*
|
||||
* DEPRECATED... use lws_threadpool_task_status() instead and get the task
|
||||
* pointer from lws_threadpool_get_task_wsi() / _ss() if you know there can only
|
||||
* be one, else call it via lws_threadpool_foreach_task_wsi() / _ss()
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN enum lws_threadpool_task_status
|
||||
lws_threadpool_task_status_wsi(struct lws *wsi,
|
||||
struct lws_threadpool_task **task, void **user)
|
||||
LWS_WARN_DEPRECATED;
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN enum lws_threadpool_task_status
|
||||
lws_threadpool_task_status(struct lws_threadpool_task *task, void **user);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN enum lws_threadpool_task_status
|
||||
lws_threadpool_task_status_noreap(struct lws_threadpool_task *task);
|
||||
|
||||
/**
|
||||
* lws_threadpool_task_sync() - Indicate to a stalled task it may continue
|
||||
*
|
||||
* \param task: the task to unblock
|
||||
* \param stop: 0 = run after unblock, 1 = when he unblocks, stop him
|
||||
*
|
||||
* Inform the task that the service thread has finished with the shared data
|
||||
* and that the task, if blocked in LWS_TP_RETURN_SYNC, may continue.
|
||||
*
|
||||
* If the lws service context determined that the task must be aborted, it
|
||||
* should still call this but with stop = 1, causing the task to finish.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_threadpool_task_sync(struct lws_threadpool_task *task, int stop);
|
||||
|
||||
/**
|
||||
* lws_threadpool_dump() - dump the state of a threadpool to the log
|
||||
*
|
||||
* \param tp: The threadpool to dump
|
||||
*
|
||||
* This locks the threadpool and then dumps the pending queue, the worker
|
||||
* threads and the done queue, together with time information for how long
|
||||
* the tasks have been in their current state, how long they have occupied a
|
||||
* thread, etc.
|
||||
*
|
||||
* This only does anything on lws builds with CMAKE_BUILD_TYPE=DEBUG, otherwise
|
||||
* while it still exists, it's a NOP.
|
||||
*/
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_threadpool_dump(struct lws_threadpool *tp);
|
||||
|
||||
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN struct lws_threadpool_task *
|
||||
lws_threadpool_get_task_wsi(struct lws *wsi);
|
||||
|
||||
#if defined(LWS_WITH_SECURE_STREAMS)
|
||||
LWS_VISIBLE LWS_EXTERN struct lws_threadpool_task *
|
||||
lws_threadpool_get_task_ss(struct lws_ss_handle *ss);
|
||||
#endif
|
||||
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_threadpool_foreach_task_wsi(struct lws *wsi, void *user,
|
||||
int (*cb)(struct lws_threadpool_task *task,
|
||||
void *user));
|
||||
|
||||
#if defined(LWS_WITH_SECURE_STREAMS)
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_threadpool_foreach_task_ss(struct lws_ss_handle *ss, void *user,
|
||||
int (*cb)(struct lws_threadpool_task *task, void *user));
|
||||
#endif
|
||||
|
||||
|
||||
//@}
|
||||
@ -0,0 +1,313 @@
|
||||
/*
|
||||
* libwebsockets - small server side websockets and web server implementation
|
||||
*
|
||||
* Copyright (C) 2010 - 2019 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
/*! \defgroup timeout Connection timeouts
|
||||
|
||||
APIs related to setting connection timeouts
|
||||
*/
|
||||
//@{
|
||||
|
||||
#if defined(STANDALONE)
|
||||
struct lws_context_standalone;
|
||||
#define lws_context lws_context_standalone
|
||||
#endif
|
||||
|
||||
/*
|
||||
* NOTE: These public enums are part of the abi. If you want to add one,
|
||||
* add it at where specified so existing users are unaffected.
|
||||
*/
|
||||
enum pending_timeout {
|
||||
NO_PENDING_TIMEOUT = 0,
|
||||
PENDING_TIMEOUT_AWAITING_PROXY_RESPONSE = 1,
|
||||
PENDING_TIMEOUT_AWAITING_CONNECT_RESPONSE = 2,
|
||||
PENDING_TIMEOUT_ESTABLISH_WITH_SERVER = 3,
|
||||
PENDING_TIMEOUT_AWAITING_SERVER_RESPONSE = 4,
|
||||
PENDING_TIMEOUT_AWAITING_PING = 5,
|
||||
PENDING_TIMEOUT_CLOSE_ACK = 6,
|
||||
PENDING_TIMEOUT_UNUSED1 = 7,
|
||||
PENDING_TIMEOUT_SENT_CLIENT_HANDSHAKE = 8,
|
||||
PENDING_TIMEOUT_SSL_ACCEPT = 9,
|
||||
PENDING_TIMEOUT_HTTP_CONTENT = 10,
|
||||
PENDING_TIMEOUT_AWAITING_CLIENT_HS_SEND = 11,
|
||||
PENDING_FLUSH_STORED_SEND_BEFORE_CLOSE = 12,
|
||||
PENDING_TIMEOUT_SHUTDOWN_FLUSH = 13,
|
||||
PENDING_TIMEOUT_CGI = 14,
|
||||
PENDING_TIMEOUT_HTTP_KEEPALIVE_IDLE = 15,
|
||||
PENDING_TIMEOUT_WS_PONG_CHECK_SEND_PING = 16,
|
||||
PENDING_TIMEOUT_WS_PONG_CHECK_GET_PONG = 17,
|
||||
PENDING_TIMEOUT_CLIENT_ISSUE_PAYLOAD = 18,
|
||||
PENDING_TIMEOUT_AWAITING_SOCKS_GREETING_REPLY = 19,
|
||||
PENDING_TIMEOUT_AWAITING_SOCKS_CONNECT_REPLY = 20,
|
||||
PENDING_TIMEOUT_AWAITING_SOCKS_AUTH_REPLY = 21,
|
||||
PENDING_TIMEOUT_KILLED_BY_SSL_INFO = 22,
|
||||
PENDING_TIMEOUT_KILLED_BY_PARENT = 23,
|
||||
PENDING_TIMEOUT_CLOSE_SEND = 24,
|
||||
PENDING_TIMEOUT_HOLDING_AH = 25,
|
||||
PENDING_TIMEOUT_UDP_IDLE = 26,
|
||||
PENDING_TIMEOUT_CLIENT_CONN_IDLE = 27,
|
||||
PENDING_TIMEOUT_LAGGING = 28,
|
||||
PENDING_TIMEOUT_THREADPOOL = 29,
|
||||
PENDING_TIMEOUT_THREADPOOL_TASK = 30,
|
||||
PENDING_TIMEOUT_KILLED_BY_PROXY_CLIENT_CLOSE = 31,
|
||||
PENDING_TIMEOUT_USER_OK = 32,
|
||||
|
||||
/****** add new things just above ---^ ******/
|
||||
|
||||
PENDING_TIMEOUT_USER_REASON_BASE = 1000
|
||||
};
|
||||
|
||||
#define lws_time_in_microseconds lws_now_usecs
|
||||
|
||||
#define LWS_TO_KILL_ASYNC -1
|
||||
/**< If LWS_TO_KILL_ASYNC is given as the timeout sec in a lws_set_timeout()
|
||||
* call, then the connection is marked to be killed at the next timeout
|
||||
* check. This is how you should force-close the wsi being serviced if
|
||||
* you are doing it outside the callback (where you should close by nonzero
|
||||
* return).
|
||||
*/
|
||||
#define LWS_TO_KILL_SYNC -2
|
||||
/**< If LWS_TO_KILL_SYNC is given as the timeout sec in a lws_set_timeout()
|
||||
* call, then the connection is closed before returning (which may delete
|
||||
* the wsi). This should only be used where the wsi being closed is not the
|
||||
* wsi currently being serviced.
|
||||
*/
|
||||
/**
|
||||
* lws_set_timeout() - marks the wsi as subject to a timeout some seconds hence
|
||||
*
|
||||
* \param wsi: Websocket connection instance
|
||||
* \param reason: timeout reason
|
||||
* \param secs: how many seconds. You may set to LWS_TO_KILL_ASYNC to
|
||||
* force the connection to timeout at the next opportunity, or
|
||||
* LWS_TO_KILL_SYNC to close it synchronously if you know the
|
||||
* wsi is not the one currently being serviced.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_set_timeout(struct lws *wsi, enum pending_timeout reason, int secs);
|
||||
|
||||
/**
|
||||
* lws_set_timeout_us() - marks the wsi as subject to a timeout some us hence
|
||||
*
|
||||
* \param wsi: Websocket connection instance
|
||||
* \param reason: timeout reason
|
||||
* \param us: 0 removes the timeout, otherwise number of us to wait
|
||||
*
|
||||
* Higher-resolution version of lws_set_timeout(). Actual resolution depends
|
||||
* on platform and load, usually ms.
|
||||
*/
|
||||
void
|
||||
lws_set_timeout_us(struct lws *wsi, enum pending_timeout reason, lws_usec_t us);
|
||||
|
||||
/* helper for clearer LWS_TO_KILL_ASYNC / LWS_TO_KILL_SYNC usage */
|
||||
#define lws_wsi_close(w, to_kill) lws_set_timeout(w, 1, to_kill)
|
||||
|
||||
|
||||
#define LWS_SET_TIMER_USEC_CANCEL ((lws_usec_t)-1ll)
|
||||
#define LWS_USEC_PER_SEC ((lws_usec_t)1000000)
|
||||
|
||||
/**
|
||||
* lws_set_timer_usecs() - schedules a callback on the wsi in the future
|
||||
*
|
||||
* \param wsi: Websocket connection instance
|
||||
* \param usecs: LWS_SET_TIMER_USEC_CANCEL removes any existing scheduled
|
||||
* callback, otherwise number of microseconds in the future
|
||||
* the callback will occur at.
|
||||
*
|
||||
* NOTE: event loop support for this:
|
||||
*
|
||||
* default poll() loop: yes
|
||||
* libuv event loop: yes
|
||||
* libev: not implemented (patch welcome)
|
||||
* libevent: not implemented (patch welcome)
|
||||
*
|
||||
* After the deadline expires, the wsi will get a callback of type
|
||||
* LWS_CALLBACK_TIMER and the timer is exhausted. The deadline may be
|
||||
* continuously deferred by further calls to lws_set_timer_usecs() with a later
|
||||
* deadline, or cancelled by lws_set_timer_usecs(wsi, -1).
|
||||
*
|
||||
* If the timer should repeat, lws_set_timer_usecs() must be called again from
|
||||
* LWS_CALLBACK_TIMER.
|
||||
*
|
||||
* Accuracy depends on the platform and the load on the event loop or system...
|
||||
* all that's guaranteed is the callback will come after the requested wait
|
||||
* period.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_set_timer_usecs(struct lws *wsi, lws_usec_t usecs);
|
||||
|
||||
struct lws_sorted_usec_list;
|
||||
|
||||
typedef void (*sul_cb_t)(struct lws_sorted_usec_list *sul);
|
||||
|
||||
typedef struct lws_sorted_usec_list {
|
||||
struct lws_dll2 list; /* simplify the code by keeping this at start */
|
||||
lws_usec_t us;
|
||||
sul_cb_t cb;
|
||||
uint32_t latency_us; /* us it may safely be delayed */
|
||||
} lws_sorted_usec_list_t;
|
||||
|
||||
/*
|
||||
* There are multiple sul owners to allow accounting for, a) events that must
|
||||
* wake from suspend, and b) events that can be missued due to suspend
|
||||
*/
|
||||
#define LWS_COUNT_PT_SUL_OWNERS 2
|
||||
|
||||
#define LWSSULLI_MISS_IF_SUSPENDED 0
|
||||
#define LWSSULLI_WAKE_IF_SUSPENDED 1
|
||||
|
||||
/*
|
||||
* lws_sul2_schedule() - schedule a callback
|
||||
*
|
||||
* \param context: the lws_context
|
||||
* \param tsi: the thread service index (usually 0)
|
||||
* \param flags: LWSSULLI_...
|
||||
* \param sul: pointer to the sul element
|
||||
*
|
||||
* Generic callback-at-a-later time function. The callback happens on the
|
||||
* event loop thread context.
|
||||
*
|
||||
* Although the api has us resultion, the actual resolution depends on the
|
||||
* platform and may be, eg, 1ms.
|
||||
*
|
||||
* This doesn't allocate and doesn't fail.
|
||||
*
|
||||
* If flags contains LWSSULLI_WAKE_IF_SUSPENDED, the scheduled event is placed
|
||||
* on a sul owner list that, if the system has entered low power suspend mode,
|
||||
* tries to arrange that the system should wake from platform suspend just
|
||||
* before the event is due. Scheduled events without this flag will be missed
|
||||
* in the case the system is in suspend and nothing else happens to have woken
|
||||
* it.
|
||||
*
|
||||
* You can call it again with another us value to change the delay or move the
|
||||
* event to a different owner (ie, wake or miss on suspend).
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_sul2_schedule(struct lws_context *context, int tsi, int flags,
|
||||
lws_sorted_usec_list_t *sul);
|
||||
|
||||
/*
|
||||
* lws_sul_cancel() - cancel scheduled callback
|
||||
*
|
||||
* \param sul: pointer to the sul element
|
||||
*
|
||||
* If it's scheduled, remove the sul from its owning sorted list.
|
||||
* If not scheduled, it's a NOP.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_sul_cancel(lws_sorted_usec_list_t *sul);
|
||||
|
||||
/*
|
||||
* lws_sul_earliest_wakeable_event() - get earliest wake-from-suspend event
|
||||
*
|
||||
* \param ctx: the lws context
|
||||
* \param pearliest: pointer to lws_usec_t to take the result
|
||||
*
|
||||
* Either returns 1 if no pending event, or 0 and sets *pearliest to the
|
||||
* MONOTONIC time of the current earliest next expected event.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_sul_earliest_wakeable_event(struct lws_context *ctx, lws_usec_t *pearliest);
|
||||
|
||||
/*
|
||||
* For backwards compatibility
|
||||
*
|
||||
* If us is LWS_SET_TIMER_USEC_CANCEL, the sul is removed from the scheduler.
|
||||
* New code can use lws_sul_cancel()
|
||||
*/
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_sul_schedule(struct lws_context *ctx, int tsi, lws_sorted_usec_list_t *sul,
|
||||
sul_cb_t _cb, lws_usec_t _us);
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_sul_schedule_wakesuspend(struct lws_context *ctx, int tsi,
|
||||
lws_sorted_usec_list_t *sul, sul_cb_t _cb,
|
||||
lws_usec_t _us);
|
||||
|
||||
#if defined(LWS_WITH_SUL_DEBUGGING)
|
||||
/**
|
||||
* lws_sul_debug_zombies() - assert there are no scheduled sul in a given object
|
||||
*
|
||||
* \param ctx: lws_context
|
||||
* \param po: pointer to the object that is about to be destroyed
|
||||
* \param len: length of the object that is about to be destroyed
|
||||
* \param destroy_description: string clue what any failure is related to
|
||||
*
|
||||
* This is an optional debugging helper that walks the sul scheduler lists
|
||||
* confirming that there are no suls scheduled that live inside the object
|
||||
* footprint described by po and len. When internal objects are about to be
|
||||
* destroyed, like wsi / user_data or secure stream handles, if
|
||||
* LWS_WITH_SUL_DEBUGGING is enabled the scheduler is checked for anything
|
||||
* in the object being destroyed. If something found, an error is printed and
|
||||
* an assert fired.
|
||||
*
|
||||
* Internal sul like timeouts should always be cleaned up correctly, but user
|
||||
* suls in, eg, wsi user_data area, or in secure stream user allocation, may be
|
||||
* the cause of difficult to find bugs if valgrind not available and the user
|
||||
* code left a sul in the scheduler after destroying the object the sul was
|
||||
* living in.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_sul_debug_zombies(struct lws_context *ctx, void *po, size_t len,
|
||||
const char *destroy_description);
|
||||
#else
|
||||
#define lws_sul_debug_zombies(_a, _b, _c, _d)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* lws_validity_confirmed() - reset the validity timer for a network connection
|
||||
*
|
||||
* \param wsi: the connection that saw traffic proving the connection valid
|
||||
*
|
||||
* Network connections are subject to intervals defined by the context, the
|
||||
* vhost if server connections, or the client connect info if a client
|
||||
* connection. If the connection goes longer than the specified time since
|
||||
* last observing traffic that can only happen if traffic is passing in both
|
||||
* directions, then lws will try to create a PING transaction on the network
|
||||
* connection.
|
||||
*
|
||||
* If the connection reaches the specified `.secs_since_valid_hangup` time
|
||||
* still without any proof of validity, the connection will be closed.
|
||||
*
|
||||
* If the PONG comes, or user code observes traffic that satisfies the proof
|
||||
* that both directions are passing traffic to the peer and calls this api,
|
||||
* the connection validity timer is reset and the scheme repeats.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_validity_confirmed(struct lws *wsi);
|
||||
|
||||
/*
|
||||
* These are not normally needed, they're exported for the case there's code
|
||||
* using lws_sul for which lws is an optional link dependency.
|
||||
*/
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
__lws_sul_insert(lws_dll2_owner_t *own, lws_sorted_usec_list_t *sul);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN lws_usec_t
|
||||
__lws_sul_service_ripe(lws_dll2_owner_t *own, int own_len, lws_usec_t usnow);
|
||||
|
||||
#if defined(STANDALONE)
|
||||
#undef lws_context
|
||||
#endif
|
||||
|
||||
///@}
|
||||
@ -0,0 +1,81 @@
|
||||
/*
|
||||
* libwebsockets - small server side websockets and web server implementation
|
||||
*
|
||||
* Copyright (C) 2010 - 2021 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
/*! \defgroup tls_sessions TLS Session Management
|
||||
|
||||
APIs related to managing TLS Sessions
|
||||
*/
|
||||
//@{
|
||||
|
||||
|
||||
#define LWS_SESSION_TAG_LEN 96
|
||||
|
||||
struct lws_tls_session_dump
|
||||
{
|
||||
char tag[LWS_SESSION_TAG_LEN];
|
||||
void *blob;
|
||||
void *opaque;
|
||||
size_t blob_len;
|
||||
};
|
||||
|
||||
typedef int (*lws_tls_sess_cb_t)(struct lws_context *cx,
|
||||
struct lws_tls_session_dump *info);
|
||||
|
||||
/**
|
||||
* lws_tls_session_dump_save() - serialize a tls session via a callback
|
||||
*
|
||||
* \param vh: the vhost to load into the session cache
|
||||
* \param host: the name of the host the session relates to
|
||||
* \param port: the port the session connects to on the host
|
||||
* \param cb_save: the callback to perform the saving of the session blob
|
||||
* \param opq: an opaque pointer passed into the callback
|
||||
*
|
||||
* If a session matching the vhost/host/port exists in the vhost's session
|
||||
* cache, serialize it via the provided callback.
|
||||
*
|
||||
* \p opq is passed to the callback without being used by lws at all.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_tls_session_dump_save(struct lws_vhost *vh, const char *host, uint16_t port,
|
||||
lws_tls_sess_cb_t cb_save, void *opq);
|
||||
|
||||
/**
|
||||
* lws_tls_session_dump_load() - deserialize a tls session via a callback
|
||||
*
|
||||
* \param vh: the vhost to load into the session cache
|
||||
* \param host: the name of the host the session relates to
|
||||
* \param port: the port the session connects to on the host
|
||||
* \param cb_load: the callback to retreive the session blob from
|
||||
* \param opq: an opaque pointer passed into the callback
|
||||
*
|
||||
* Try to preload a session described by the first three parameters into the
|
||||
* client session cache, from the given callback.
|
||||
*
|
||||
* \p opq is passed to the callback without being used by lws at all.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_tls_session_dump_load(struct lws_vhost *vh, const char *host, uint16_t port,
|
||||
lws_tls_sess_cb_t cb_load, void *opq);
|
||||
|
||||
///@}
|
||||
295
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-tokenize.h
Normal file
295
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-tokenize.h
Normal file
@ -0,0 +1,295 @@
|
||||
/*
|
||||
* libwebsockets - small server side websockets and web server implementation
|
||||
*
|
||||
* Copyright (C) 2010 - 2019 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
/* Do not treat - as a terminal character, so "my-token" is one token */
|
||||
#define LWS_TOKENIZE_F_MINUS_NONTERM (1 << 0)
|
||||
/* Separately report aggregate colon-delimited tokens */
|
||||
#define LWS_TOKENIZE_F_AGG_COLON (1 << 1)
|
||||
/* Enforce sequencing for a simple token , token , token ... list */
|
||||
#define LWS_TOKENIZE_F_COMMA_SEP_LIST (1 << 2)
|
||||
/* Allow more characters in the tokens and less delimiters... default is
|
||||
* only alphanumeric + underscore in tokens */
|
||||
#define LWS_TOKENIZE_F_RFC7230_DELIMS (1 << 3)
|
||||
/* Do not treat . as a terminal character, so "warmcat.com" is one token */
|
||||
#define LWS_TOKENIZE_F_DOT_NONTERM (1 << 4)
|
||||
/* If something starts looking like a float, like 1.2, force to be string token.
|
||||
* This lets you receive dotted-quads like 192.168.0.1 as string tokens, and
|
||||
* avoids illegal float format detection like 1.myserver.com */
|
||||
#define LWS_TOKENIZE_F_NO_FLOATS (1 << 5)
|
||||
/* Instead of LWS_TOKZE_INTEGER, report integers as any other string token */
|
||||
#define LWS_TOKENIZE_F_NO_INTEGERS (1 << 6)
|
||||
/* # makes the rest of the line a comment */
|
||||
#define LWS_TOKENIZE_F_HASH_COMMENT (1 << 7)
|
||||
/* Do not treat / as a terminal character, so "multipart/related" is one token */
|
||||
#define LWS_TOKENIZE_F_SLASH_NONTERM (1 << 8)
|
||||
/* Do not treat * as a terminal character, so "myfile*" is one token */
|
||||
#define LWS_TOKENIZE_F_ASTERISK_NONTERM (1 << 9)
|
||||
/* Do not treat = as a terminal character, so "x=y" is one token */
|
||||
#define LWS_TOKENIZE_F_EQUALS_NONTERM (1 << 10)
|
||||
/* Do not treat : as a terminal character, so ::1 is one token */
|
||||
#define LWS_TOKENIZE_F_COLON_NONTERM (1 << 11)
|
||||
|
||||
/* We're just tokenizing a chunk, don't treat running out of input as final */
|
||||
#define LWS_TOKENIZE_F_EXPECT_MORE (1 << 12)
|
||||
|
||||
typedef enum {
|
||||
|
||||
LWS_TOKZE_ERRS = 7, /* the number of errors defined */
|
||||
|
||||
LWS_TOKZE_TOO_LONG = -7, /* token too long */
|
||||
LWS_TOKZE_WANT_READ = -6, /* need more input */
|
||||
LWS_TOKZE_ERR_BROKEN_UTF8 = -5, /* malformed or partial utf8 */
|
||||
LWS_TOKZE_ERR_UNTERM_STRING = -4, /* ended while we were in "" */
|
||||
LWS_TOKZE_ERR_MALFORMED_FLOAT = -3, /* like 0..1 or 0.1.1 */
|
||||
LWS_TOKZE_ERR_NUM_ON_LHS = -2, /* like 123= or 0.1= */
|
||||
LWS_TOKZE_ERR_COMMA_LIST = -1, /* like ",tok", or, "tok,," */
|
||||
|
||||
LWS_TOKZE_ENDED = 0, /* no more content */
|
||||
|
||||
/* Note: results have ordinal 1+, EOT is 0 and errors are < 0 */
|
||||
|
||||
LWS_TOKZE_DELIMITER, /* a delimiter appeared */
|
||||
LWS_TOKZE_TOKEN, /* a token appeared */
|
||||
LWS_TOKZE_INTEGER, /* an integer appeared */
|
||||
LWS_TOKZE_FLOAT, /* a float appeared */
|
||||
LWS_TOKZE_TOKEN_NAME_EQUALS, /* token [whitespace] = */
|
||||
LWS_TOKZE_TOKEN_NAME_COLON, /* token [whitespace] : (only with
|
||||
LWS_TOKENIZE_F_AGG_COLON flag) */
|
||||
LWS_TOKZE_QUOTED_STRING, /* "*", where * may have any char */
|
||||
|
||||
} lws_tokenize_elem;
|
||||
|
||||
/*
|
||||
* helper enums to allow caller to enforce legal delimiter sequencing, eg
|
||||
* disallow "token,,token", "token,", and ",token"
|
||||
*/
|
||||
|
||||
enum lws_tokenize_delimiter_tracking {
|
||||
LWSTZ_DT_NEED_FIRST_CONTENT,
|
||||
LWSTZ_DT_NEED_DELIM,
|
||||
LWSTZ_DT_NEED_NEXT_CONTENT,
|
||||
};
|
||||
|
||||
typedef enum {
|
||||
LWS_TOKZS_LEADING_WHITESPACE,
|
||||
LWS_TOKZS_QUOTED_STRING,
|
||||
LWS_TOKZS_TOKEN,
|
||||
LWS_TOKZS_TOKEN_POST_TERMINAL
|
||||
} lws_tokenize_state;
|
||||
|
||||
typedef struct lws_tokenize {
|
||||
char collect[256]; /* token length limit */
|
||||
const char *start; /**< set to the start of the string to tokenize */
|
||||
const char *token; /**< the start of an identified token or delimiter */
|
||||
size_t len; /**< set to the length of the string to tokenize */
|
||||
size_t token_len; /**< the length of the identied token or delimiter */
|
||||
|
||||
lws_tokenize_state state;
|
||||
|
||||
int line;
|
||||
int effline;
|
||||
|
||||
uint16_t flags; /**< optional LWS_TOKENIZE_F_ flags, or 0 */
|
||||
uint8_t delim;
|
||||
|
||||
int8_t e; /**< convenient for storing lws_tokenize return */
|
||||
uint8_t reset_token:1;
|
||||
uint8_t crlf:1;
|
||||
uint8_t dry:1;
|
||||
} lws_tokenize_t;
|
||||
|
||||
/**
|
||||
* lws_tokenize() - breaks down a string into tokens and delimiters in-place
|
||||
*
|
||||
* \param ts: the lws_tokenize struct to init
|
||||
* \param start: the string to tokenize
|
||||
* \param flags: LWS_TOKENIZE_F_ option flags
|
||||
*
|
||||
* This initializes the tokenize struct to point to the given string, and
|
||||
* sets the length to 2GiB - 1 (so there must be a terminating NUL)... you can
|
||||
* override this requirement by setting ts.len yourself before using it.
|
||||
*
|
||||
* .delim is also initialized to LWSTZ_DT_NEED_FIRST_CONTENT.
|
||||
*/
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_tokenize_init(struct lws_tokenize *ts, const char *start, int flags);
|
||||
|
||||
/**
|
||||
* lws_tokenize() - breaks down a string into tokens and delimiters in-place
|
||||
*
|
||||
* \param ts: the lws_tokenize struct with information and state on what to do
|
||||
*
|
||||
* The \p ts struct should have its start, len and flags members initialized to
|
||||
* reflect the string to be tokenized and any options.
|
||||
*
|
||||
* Then `lws_tokenize()` may be called repeatedly on the struct, returning one
|
||||
* of `lws_tokenize_elem` each time, and with the struct's `token` and
|
||||
* `token_len` members set to describe the content of the delimiter or token
|
||||
* payload each time.
|
||||
*
|
||||
* There are no allocations during the process.
|
||||
*
|
||||
* returns lws_tokenize_elem that was identified (LWS_TOKZE_ENDED means reached
|
||||
* the end of the string).
|
||||
*/
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN lws_tokenize_elem
|
||||
lws_tokenize(struct lws_tokenize *ts);
|
||||
|
||||
/**
|
||||
* lws_tokenize_cstr() - copy token string to NUL-terminated buffer
|
||||
*
|
||||
* \param ts: pointer to lws_tokenize struct to operate on
|
||||
* \param str: destination buffer
|
||||
* \pparam max: bytes in destination buffer
|
||||
*
|
||||
* returns 0 if OK or nonzero if the string + NUL won't fit.
|
||||
*/
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_tokenize_cstr(struct lws_tokenize *ts, char *str, size_t max);
|
||||
|
||||
|
||||
/*
|
||||
* lws_strexp: flexible string expansion helper api
|
||||
*
|
||||
* This stateful helper can handle multiple separate input chunks and multiple
|
||||
* output buffer loads with arbitrary boundaries between literals and expanded
|
||||
* symbols. This allows it to handle fragmented input as well as arbitrarily
|
||||
* long symbol expansions that are bigger than the output buffer itself.
|
||||
*
|
||||
* A user callback is used to convert symbol names to the symbol value.
|
||||
*
|
||||
* A single byte buffer for input and another for output can process any
|
||||
* length substitution then. The state object is around 64 bytes on a 64-bit
|
||||
* system and it only uses 8 bytes stack.
|
||||
*/
|
||||
|
||||
|
||||
typedef int (*lws_strexp_expand_cb)(void *priv, const char *name, char *out,
|
||||
size_t *pos, size_t olen, size_t *exp_ofs);
|
||||
|
||||
typedef struct lws_strexp {
|
||||
char name[32];
|
||||
lws_strexp_expand_cb cb;
|
||||
void *priv;
|
||||
char *out;
|
||||
size_t olen;
|
||||
size_t pos;
|
||||
|
||||
size_t exp_ofs;
|
||||
|
||||
uint8_t name_pos;
|
||||
char state;
|
||||
} lws_strexp_t;
|
||||
|
||||
enum {
|
||||
LSTRX_DONE, /* it completed OK */
|
||||
LSTRX_FILLED_OUT, /* out buf filled and needs resetting */
|
||||
LSTRX_FATAL_NAME_TOO_LONG = -1, /* fatal */
|
||||
LSTRX_FATAL_NAME_UNKNOWN = -2,
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* lws_strexp_init() - initialize an lws_strexp_t for use
|
||||
*
|
||||
* \p exp: the exp object to init
|
||||
* \p priv: the user's object pointer to pass to callback
|
||||
* \p cb: the callback to expand named objects
|
||||
* \p out: the start of the output buffer, or NULL just to get the length
|
||||
* \p olen: the length of the output buffer in bytes
|
||||
*
|
||||
* Prepares an lws_strexp_t for use and sets the initial output buffer
|
||||
*
|
||||
* If \p out is NULL, substitution proceeds normally, but no output is produced,
|
||||
* only the length is returned. olen should be set to the largest feasible
|
||||
* overall length. To use this mode, the substitution callback must also check
|
||||
* for NULL \p out and avoid producing the output.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_strexp_init(lws_strexp_t *exp, void *priv, lws_strexp_expand_cb cb,
|
||||
char *out, size_t olen);
|
||||
|
||||
/**
|
||||
* lws_strexp_reset_out() - reset the output buffer on an existing strexp
|
||||
*
|
||||
* \p exp: the exp object to init
|
||||
* \p out: the start of the output buffer, or NULL to just get length
|
||||
* \p olen: the length of the output buffer in bytes
|
||||
*
|
||||
* Provides a new output buffer for lws_strexp_expand() to continue to write
|
||||
* into. It can be the same as the old one if it has been copied out or used.
|
||||
* The position of the next write will be reset to the start of the given buf.
|
||||
*
|
||||
* If \p out is NULL, substitution proceeds normally, but no output is produced,
|
||||
* only the length is returned. \p olen should be set to the largest feasible
|
||||
* overall length. To use this mode, the substitution callback must also check
|
||||
* for NULL \p out and avoid producing the output.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_strexp_reset_out(lws_strexp_t *exp, char *out, size_t olen);
|
||||
|
||||
/**
|
||||
* lws_strexp_expand() - copy / expand a string into the output buffer
|
||||
*
|
||||
* \p exp: the exp object for the copy / expansion
|
||||
* \p in: the start of the next input data
|
||||
* \p len: the length of the input data
|
||||
* \p pused_in: pointer to write the amount of input used
|
||||
* \p pused_out: pointer to write the amount of output used
|
||||
*
|
||||
* Copies in to the output buffer set in exp, expanding any ${name} tokens using
|
||||
* the callback. \p *pused_in is set to the number of input chars used and
|
||||
* \p *pused_out the number of output characters used
|
||||
*
|
||||
* May return LSTRX_FILLED_OUT early with *pused < len if the output buffer is
|
||||
* filled. Handle the output buffer and reset it with lws_strexp_reset_out()
|
||||
* before calling again with adjusted in / len to continue.
|
||||
*
|
||||
* In the case of large expansions, the expansion itself may fill the output
|
||||
* buffer, in which case the expansion callback returns the LSTRX_FILLED_OUT
|
||||
* and will be called again to continue with its *exp_ofs parameter set
|
||||
* appropriately.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_strexp_expand(lws_strexp_t *exp, const char *in, size_t len,
|
||||
size_t *pused_in, size_t *pused_out);
|
||||
|
||||
/**
|
||||
* lws_strcmp_wildcard() - strcmp but the first arg can have wildcards
|
||||
*
|
||||
* \p wildcard: a string that may contain zero to three *, and may lack a NUL
|
||||
* \p wlen: length of the wildcard string
|
||||
* \p check: string to test to see if it matches wildcard
|
||||
* \p clen: length of check string
|
||||
*
|
||||
* Like strcmp, but supports patterns like "a*", "a*b", "a*b*" etc
|
||||
* where a and b are arbitrary substrings. Both the wc and check strings need
|
||||
* not be NUL terminated, but are specified by lengths.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_strcmp_wildcard(const char *wildcard, size_t wlen, const char *check,
|
||||
size_t clen);
|
||||
@ -0,0 +1,55 @@
|
||||
/*
|
||||
* lws abstract display implementation for epd-acep on spi
|
||||
*
|
||||
* Copyright (C) 2019 - 2022 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#if !defined(__LWS_DISPLAY_UC8176_SPI_H__)
|
||||
#define __LWS_DISPLAY_UC8176_SPI_H__
|
||||
|
||||
typedef struct lws_display_uc8176_spi {
|
||||
|
||||
lws_display_t disp; /* use lws_display_uc8176_ops to set */
|
||||
const lws_spi_ops_t *spi; /* spi ops */
|
||||
|
||||
lws_display_completion_t cb;
|
||||
|
||||
const lws_gpio_ops_t *gpio; /* NULL or gpio ops */
|
||||
_lws_plat_gpio_t reset_gpio; /* if gpio ops, nReset gpio # */
|
||||
_lws_plat_gpio_t busy_gpio; /* if gpio ops, busy gpio # */
|
||||
|
||||
uint8_t spi_index; /* cs index starting from 0 */
|
||||
|
||||
} lws_display_uc8176_spi_t;
|
||||
|
||||
int
|
||||
lws_display_uc8176_spi_init(lws_display_state_t *lds);
|
||||
int
|
||||
lws_display_uc8176_spi_blit(lws_display_state_t *lds, const uint8_t *src,
|
||||
lws_box_t *box, lws_dll2_owner_t *ids);
|
||||
int
|
||||
lws_display_uc8176_spi_power(lws_display_state_t *lds, int state);
|
||||
|
||||
#define lws_display_uc8176_ops \
|
||||
.init = lws_display_uc8176_spi_init, \
|
||||
.blit = lws_display_uc8176_spi_blit, \
|
||||
.power = lws_display_uc8176_spi_power
|
||||
#endif
|
||||
160
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-upng.h
Normal file
160
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-upng.h
Normal file
@ -0,0 +1,160 @@
|
||||
/*
|
||||
* uPNG -- derived from LodePNG version 20100808
|
||||
*
|
||||
* Copyright (c) 2005-2010 Lode Vandevenne
|
||||
* Copyright (c) 2010 Sean Middleditch
|
||||
* Copyright (c) 2021-2022 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
* arising from the use of this software.
|
||||
|
||||
* Permission is granted to anyone to use this software for any purpose,
|
||||
* including commercial applications, and to alter it and redistribute it
|
||||
* freely, subject to the following restrictions:
|
||||
*
|
||||
* 1. The origin of this software must not be misrepresented; you must not
|
||||
* claim that you wrote the original software. If you use this software
|
||||
* in a product, an acknowledgment in the product documentation would be
|
||||
* appreciated but is not required.
|
||||
*
|
||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||
* misrepresented as being the original software.
|
||||
*
|
||||
* 3. This notice may not be removed or altered from any source
|
||||
* distribution.
|
||||
*
|
||||
* The above notice is the ZLIB license, libpng also uses it.
|
||||
*
|
||||
* This version is based on upng project's fork of lodepng and rewritten for
|
||||
* lws, changing the whole approach to decode on demand to issue a line of
|
||||
* output at a time, statefully.
|
||||
*/
|
||||
|
||||
typedef enum lws_upng_format_t {
|
||||
LWS_UPNG_BADFORMAT,
|
||||
LWS_UPNG_RGB8,
|
||||
LWS_UPNG_RGB16,
|
||||
LWS_UPNG_RGBA8,
|
||||
LWS_UPNG_RGBA16,
|
||||
LWS_UPNG_LUMINANCE1,
|
||||
LWS_UPNG_LUMINANCE2,
|
||||
LWS_UPNG_LUMINANCE4,
|
||||
LWS_UPNG_LUMINANCE8,
|
||||
LWS_UPNG_LUMINANCE_ALPHA1,
|
||||
LWS_UPNG_LUMINANCE_ALPHA2,
|
||||
LWS_UPNG_LUMINANCE_ALPHA4,
|
||||
LWS_UPNG_LUMINANCE_ALPHA8
|
||||
} lws_upng_format_t;
|
||||
|
||||
struct inflator_ctx;
|
||||
typedef struct lws_upng_t lws_upng_t;
|
||||
|
||||
/**
|
||||
* lws_upng_new() - Create new UPNG decode object
|
||||
*
|
||||
* Returns a new PNG decoding object, which should be destroyed with
|
||||
* lws_upng_free() when done with, or NULL if OOM.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN lws_upng_t *
|
||||
lws_upng_new(void);
|
||||
|
||||
/**
|
||||
* lws_upng_free() - Destroy a PNG decode object
|
||||
*
|
||||
* \param upng: Pointer to the decode object to destroy and set to NULL
|
||||
*
|
||||
* This also frees any sub-allocations in the object.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_upng_free(lws_upng_t **upng);
|
||||
|
||||
/**
|
||||
* lws_upng_emit_next_line() - deocde the next line
|
||||
*
|
||||
* \param upng: the decode object
|
||||
* \param ppix: pointer to a pointer set to the line's decoded pixel data
|
||||
* \param buf: pointer to a const uint8_t array of PNG input
|
||||
* \param size: pointer to the count of bytes available at *buf
|
||||
* \param hold_at_metadata: true if we should not advance to decode
|
||||
*
|
||||
* Make PNG input available to the decoder so it can issue the next line's
|
||||
* worth of pixels. If the call consumed any input, *buf and *size are
|
||||
* adjusted accordingly.
|
||||
*
|
||||
* The decoder is stateful so it is not sensitive to the chunk size for the
|
||||
* input.
|
||||
*
|
||||
* If \p hold_at_metadata is set, then the decoder will only go as far as
|
||||
* picking out the metadata like image dimensions, but not start the decode,
|
||||
* which requires the >30KB heap allocation. This lets you put off for as long
|
||||
* as possible committing to the decode allocation... this only helps overall
|
||||
* if you have flow controlled the incoming PNG data.
|
||||
*
|
||||
* Return will be one of LWS_SRET_WANT_INPUT is the decoder is stalled waiting
|
||||
* for more input to be provided, LWS_SRET_WANT_OUTPUT is the decoder stopped
|
||||
* because it had produced a whole line of output pixels (which can be found
|
||||
* starting at *ppix), LWS_SRET_OK is it completed and LWS_SRET_FATAL or larger
|
||||
* if the decode failed.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN lws_stateful_ret_t
|
||||
lws_upng_emit_next_line(lws_upng_t *upng, const uint8_t **ppix,
|
||||
const uint8_t **buf, size_t *size,
|
||||
char hold_at_metadata);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN unsigned int
|
||||
lws_upng_get_width(const lws_upng_t *upng);
|
||||
LWS_VISIBLE LWS_EXTERN unsigned int
|
||||
lws_upng_get_height(const lws_upng_t *upng);
|
||||
LWS_VISIBLE LWS_EXTERN unsigned int
|
||||
lws_upng_get_bpp(const lws_upng_t *upng);
|
||||
LWS_VISIBLE LWS_EXTERN unsigned int
|
||||
lws_upng_get_bitdepth(const lws_upng_t *upng);
|
||||
LWS_VISIBLE LWS_EXTERN unsigned int
|
||||
lws_upng_get_components(const lws_upng_t *upng);
|
||||
LWS_VISIBLE LWS_EXTERN unsigned int
|
||||
lws_upng_get_pixelsize(const lws_upng_t *upng);
|
||||
LWS_VISIBLE LWS_EXTERN lws_upng_format_t
|
||||
lws_upng_get_format(const lws_upng_t *upng);
|
||||
|
||||
/**
|
||||
* lws_upng_inflator_create() - create a gzip inflator context
|
||||
*
|
||||
* \param outring: pointer set to the output ringbuffer on exit
|
||||
* \param outringlen: size of the output ringbuffer set on exit
|
||||
* \param opl: pointer to set to point to ctx outpos_linear
|
||||
* \param cl: pointer to set to point to ctx consumed_linear
|
||||
*
|
||||
* Creates an opaque gzip inflator object.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN struct inflator_ctx *
|
||||
lws_upng_inflator_create(const uint8_t **outring, size_t *outringlen,
|
||||
size_t **opl, size_t **cl);
|
||||
|
||||
/**
|
||||
* lws_upng_inflate_data() - inflate compressed data statefully
|
||||
*
|
||||
* \param inf: inflator context created with lws_upng_inflator_create()
|
||||
* \param buf: NULL to continue consumption of existing input, or new input
|
||||
* \param len: ignored if \p buf is NULL, else amount of new input at \p buf
|
||||
*
|
||||
* Tries to progress the inflation. If output is available, \p *opl will be
|
||||
* further along than before it was called. \p *cl should be set to \p opl
|
||||
* to consume the available output data.
|
||||
*
|
||||
* Output is into a ringfuffer, typically sized at 32KB. \p opl and \p cl
|
||||
* are "linear", that is extend beyond the ringbuffer. They should be modulo
|
||||
* outringlen (given when the inflator was created) when accessing outring.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN lws_stateful_ret_t
|
||||
lws_upng_inflate_data(struct inflator_ctx *inf, const void *buf, size_t len);
|
||||
|
||||
/**
|
||||
* lws_upng_inflator_destroy() - destroys the inflation context and ringbuffer
|
||||
*
|
||||
* \p inf: pointer to pointer to inflation context
|
||||
*
|
||||
* Frees the inflation context and its allocations, and sets \p *inf to NULL.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_upng_inflator_destroy(struct inflator_ctx **inf);
|
||||
284
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-vfs.h
Normal file
284
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-vfs.h
Normal file
@ -0,0 +1,284 @@
|
||||
/*
|
||||
* libwebsockets - small server side websockets and web server implementation
|
||||
*
|
||||
* Copyright (C) 2010 - 2019 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
/*! \defgroup fops file operation wrapping
|
||||
*
|
||||
* ##File operation wrapping
|
||||
*
|
||||
* Use these helper functions if you want to access a file from the perspective
|
||||
* of a specific wsi, which is usually the case. If you just want contextless
|
||||
* file access, use the fops callbacks directly with NULL wsi instead of these
|
||||
* helpers.
|
||||
*
|
||||
* If so, then it calls the platform handler or user overrides where present
|
||||
* (as defined in info->fops)
|
||||
*
|
||||
* The advantage from all this is user code can be portable for file operations
|
||||
* without having to deal with differences between platforms.
|
||||
*/
|
||||
//@{
|
||||
|
||||
/** struct lws_plat_file_ops - Platform-specific file operations
|
||||
*
|
||||
* These provide platform-agnostic ways to deal with filesystem access in the
|
||||
* library and in the user code.
|
||||
*/
|
||||
|
||||
#if defined(LWS_PLAT_FREERTOS)
|
||||
/* sdk preprocessor defs? compiler issue? gets confused with member names */
|
||||
#define LWS_FOP_OPEN _open
|
||||
#define LWS_FOP_CLOSE _close
|
||||
#define LWS_FOP_SEEK_CUR _seek_cur
|
||||
#define LWS_FOP_READ _read
|
||||
#define LWS_FOP_WRITE _write
|
||||
#else
|
||||
#define LWS_FOP_OPEN open
|
||||
#define LWS_FOP_CLOSE close
|
||||
#define LWS_FOP_SEEK_CUR seek_cur
|
||||
#define LWS_FOP_READ read
|
||||
#define LWS_FOP_WRITE write
|
||||
#endif
|
||||
|
||||
#define LWS_FOP_FLAGS_MASK ((1 << 23) - 1)
|
||||
#define LWS_FOP_FLAG_COMPR_ACCEPTABLE_GZIP (1 << 24)
|
||||
#define LWS_FOP_FLAG_COMPR_IS_GZIP (1 << 25)
|
||||
#define LWS_FOP_FLAG_MOD_TIME_VALID (1 << 26)
|
||||
#define LWS_FOP_FLAG_VIRTUAL (1 << 27)
|
||||
|
||||
struct lws_plat_file_ops;
|
||||
|
||||
struct lws_fop_fd {
|
||||
lws_filefd_type fd;
|
||||
/**< real file descriptor related to the file... */
|
||||
const struct lws_plat_file_ops *fops;
|
||||
/**< fops that apply to this fop_fd */
|
||||
void *filesystem_priv;
|
||||
/**< ignored by lws; owned by the fops handlers */
|
||||
lws_filepos_t pos;
|
||||
/**< generic "position in file" */
|
||||
lws_filepos_t len;
|
||||
/**< generic "length of file" */
|
||||
lws_fop_flags_t flags;
|
||||
/**< copy of the returned flags */
|
||||
uint32_t mod_time;
|
||||
/**< optional "modification time of file", only valid if .open()
|
||||
* set the LWS_FOP_FLAG_MOD_TIME_VALID flag */
|
||||
};
|
||||
typedef struct lws_fop_fd *lws_fop_fd_t;
|
||||
|
||||
struct lws_fops_index {
|
||||
const char *sig; /* NULL or vfs signature, eg, ".zip/" */
|
||||
uint8_t len; /* length of above string */
|
||||
};
|
||||
|
||||
struct lws_plat_file_ops {
|
||||
lws_fop_fd_t (*LWS_FOP_OPEN)(const struct lws_plat_file_ops *fops_own,
|
||||
const struct lws_plat_file_ops *fops,
|
||||
const char *filename, const char *vpath,
|
||||
lws_fop_flags_t *flags);
|
||||
/**< Open file (always binary access if plat supports it)
|
||||
* fops_own is the fops this was called through. fops is the base
|
||||
* fops the open can use to find files to process as present as its own,
|
||||
* like the zip fops does.
|
||||
*
|
||||
* vpath may be NULL, or if the fops understands it, the point at which
|
||||
* the filename's virtual part starts.
|
||||
* *flags & LWS_FOP_FLAGS_MASK should be set to O_RDONLY or O_RDWR.
|
||||
* If the file may be gzip-compressed,
|
||||
* LWS_FOP_FLAG_COMPR_ACCEPTABLE_GZIP is set. If it actually is
|
||||
* gzip-compressed, then the open handler should OR
|
||||
* LWS_FOP_FLAG_COMPR_IS_GZIP on to *flags before returning.
|
||||
*/
|
||||
int (*LWS_FOP_CLOSE)(lws_fop_fd_t *fop_fd);
|
||||
/**< close file AND set the pointer to NULL */
|
||||
lws_fileofs_t (*LWS_FOP_SEEK_CUR)(lws_fop_fd_t fop_fd,
|
||||
lws_fileofs_t offset_from_cur_pos);
|
||||
/**< seek from current position */
|
||||
int (*LWS_FOP_READ)(lws_fop_fd_t fop_fd, lws_filepos_t *amount,
|
||||
uint8_t *buf, lws_filepos_t len);
|
||||
/**< Read from file, on exit *amount is set to amount actually read */
|
||||
int (*LWS_FOP_WRITE)(lws_fop_fd_t fop_fd, lws_filepos_t *amount,
|
||||
uint8_t *buf, lws_filepos_t len);
|
||||
/**< Write to file, on exit *amount is set to amount actually written */
|
||||
|
||||
struct lws_fops_index fi[3];
|
||||
/**< vfs path signatures implying use of this fops */
|
||||
|
||||
const struct lws_plat_file_ops *next;
|
||||
/**< NULL or next fops in list... eg copy static fops def to heap
|
||||
* and modify copy at runtime */
|
||||
|
||||
struct lws_context *cx;
|
||||
/**< the lws_context... eg copy static fops def to heap
|
||||
* and modify copy at runtime */
|
||||
|
||||
/* Add new things just above here ---^
|
||||
* This is part of the ABI, don't needlessly break compatibility */
|
||||
};
|
||||
|
||||
/**
|
||||
* lws_get_fops() - get current file ops
|
||||
*
|
||||
* \param context: context
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN struct lws_plat_file_ops * LWS_WARN_UNUSED_RESULT
|
||||
lws_get_fops(struct lws_context *context);
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_set_fops(struct lws_context *context, const struct lws_plat_file_ops *fops);
|
||||
/**
|
||||
* lws_vfs_tell() - get current file position
|
||||
*
|
||||
* \param fop_fd: fop_fd we are asking about
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN lws_filepos_t LWS_WARN_UNUSED_RESULT
|
||||
lws_vfs_tell(lws_fop_fd_t fop_fd);
|
||||
/**
|
||||
* lws_vfs_get_length() - get current file total length in bytes
|
||||
*
|
||||
* \param fop_fd: fop_fd we are asking about
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN lws_filepos_t LWS_WARN_UNUSED_RESULT
|
||||
lws_vfs_get_length(lws_fop_fd_t fop_fd);
|
||||
/**
|
||||
* lws_vfs_get_mod_time() - get time file last modified
|
||||
*
|
||||
* \param fop_fd: fop_fd we are asking about
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN uint32_t LWS_WARN_UNUSED_RESULT
|
||||
lws_vfs_get_mod_time(lws_fop_fd_t fop_fd);
|
||||
/**
|
||||
* lws_vfs_file_seek_set() - seek relative to start of file
|
||||
*
|
||||
* \param fop_fd: fop_fd we are seeking in
|
||||
* \param offset: offset from start of file
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN lws_fileofs_t
|
||||
lws_vfs_file_seek_set(lws_fop_fd_t fop_fd, lws_fileofs_t offset);
|
||||
/**
|
||||
* lws_vfs_file_seek_end() - seek relative to end of file
|
||||
*
|
||||
* \param fop_fd: fop_fd we are seeking in
|
||||
* \param offset: offset from start of file
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN lws_fileofs_t
|
||||
lws_vfs_file_seek_end(lws_fop_fd_t fop_fd, lws_fileofs_t offset);
|
||||
|
||||
extern struct lws_plat_file_ops fops_zip;
|
||||
|
||||
/**
|
||||
* lws_plat_file_open() - open vfs filepath
|
||||
*
|
||||
* \param fops: file ops struct that applies to this descriptor
|
||||
* \param vfs_path: filename to open
|
||||
* \param flags: pointer to open flags
|
||||
*
|
||||
* The vfs_path is scanned for known fops signatures, and the open directed
|
||||
* to any matching fops open.
|
||||
*
|
||||
* User code should use this api to perform vfs opens.
|
||||
*
|
||||
* returns semi-opaque handle
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN lws_fop_fd_t LWS_WARN_UNUSED_RESULT
|
||||
lws_vfs_file_open(const struct lws_plat_file_ops *fops, const char *vfs_path,
|
||||
lws_fop_flags_t *flags);
|
||||
|
||||
/**
|
||||
* lws_plat_file_close() - close file
|
||||
*
|
||||
* \param fop_fd: file handle to close
|
||||
*/
|
||||
static LWS_INLINE int
|
||||
lws_vfs_file_close(lws_fop_fd_t *fop_fd)
|
||||
{
|
||||
if (*fop_fd && (*fop_fd)->fops)
|
||||
return (*fop_fd)->fops->LWS_FOP_CLOSE(fop_fd);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* lws_plat_file_seek_cur() - close file
|
||||
*
|
||||
*
|
||||
* \param fop_fd: file handle
|
||||
* \param offset: position to seek to
|
||||
*/
|
||||
static LWS_INLINE lws_fileofs_t
|
||||
lws_vfs_file_seek_cur(lws_fop_fd_t fop_fd, lws_fileofs_t offset)
|
||||
{
|
||||
return fop_fd->fops->LWS_FOP_SEEK_CUR(fop_fd, offset);
|
||||
}
|
||||
/**
|
||||
* lws_plat_file_read() - read from file
|
||||
*
|
||||
* \param fop_fd: file handle
|
||||
* \param amount: how much to read (rewritten by call)
|
||||
* \param buf: buffer to write to
|
||||
* \param len: max length
|
||||
*/
|
||||
static LWS_INLINE int LWS_WARN_UNUSED_RESULT
|
||||
lws_vfs_file_read(lws_fop_fd_t fop_fd, lws_filepos_t *amount,
|
||||
uint8_t *buf, lws_filepos_t len)
|
||||
{
|
||||
return fop_fd->fops->LWS_FOP_READ(fop_fd, amount, buf, len);
|
||||
}
|
||||
/**
|
||||
* lws_plat_file_write() - write from file
|
||||
*
|
||||
* \param fop_fd: file handle
|
||||
* \param amount: how much to write (rewritten by call)
|
||||
* \param buf: buffer to read from
|
||||
* \param len: max length
|
||||
*/
|
||||
static LWS_INLINE int LWS_WARN_UNUSED_RESULT
|
||||
lws_vfs_file_write(lws_fop_fd_t fop_fd, lws_filepos_t *amount,
|
||||
uint8_t *buf, lws_filepos_t len)
|
||||
{
|
||||
return fop_fd->fops->LWS_FOP_WRITE(fop_fd, amount, buf, len);
|
||||
}
|
||||
|
||||
/* these are the platform file operations implementations... they can
|
||||
* be called directly and used in fops arrays
|
||||
*/
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN lws_fop_fd_t
|
||||
_lws_plat_file_open(const struct lws_plat_file_ops *fops_own,
|
||||
const struct lws_plat_file_ops *fops, const char *filename,
|
||||
const char *vpath, lws_fop_flags_t *flags);
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
_lws_plat_file_close(lws_fop_fd_t *fop_fd);
|
||||
LWS_VISIBLE LWS_EXTERN lws_fileofs_t
|
||||
_lws_plat_file_seek_cur(lws_fop_fd_t fop_fd, lws_fileofs_t offset);
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
_lws_plat_file_read(lws_fop_fd_t fop_fd, lws_filepos_t *amount,
|
||||
uint8_t *buf, lws_filepos_t len);
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
_lws_plat_file_write(lws_fop_fd_t fop_fd, lws_filepos_t *amount,
|
||||
uint8_t *buf, lws_filepos_t len);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_alloc_vfs_file(struct lws_context *context, const char *filename,
|
||||
uint8_t **buf, lws_filepos_t *amount);
|
||||
//@}
|
||||
259
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-write.h
Normal file
259
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-write.h
Normal file
@ -0,0 +1,259 @@
|
||||
/*
|
||||
* libwebsockets - small server side websockets and web server implementation
|
||||
*
|
||||
* Copyright (C) 2010 - 2019 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
/*! \defgroup sending-data Sending data
|
||||
|
||||
APIs related to writing data on a connection
|
||||
*/
|
||||
//@{
|
||||
#define LWS_WRITE_RAW LWS_WRITE_HTTP
|
||||
|
||||
/*
|
||||
* NOTE: These public enums are part of the abi. If you want to add one,
|
||||
* add it at where specified so existing users are unaffected.
|
||||
*/
|
||||
enum lws_write_protocol {
|
||||
LWS_WRITE_TEXT = 0,
|
||||
/**< Send a ws TEXT message,the pointer must have LWS_PRE valid
|
||||
* memory behind it.
|
||||
*
|
||||
* The receiver expects only valid utf-8 in the payload */
|
||||
LWS_WRITE_BINARY = 1,
|
||||
/**< Send a ws BINARY message, the pointer must have LWS_PRE valid
|
||||
* memory behind it.
|
||||
*
|
||||
* Any sequence of bytes is valid */
|
||||
LWS_WRITE_CONTINUATION = 2,
|
||||
/**< Continue a previous ws message, the pointer must have LWS_PRE valid
|
||||
* memory behind it */
|
||||
LWS_WRITE_HTTP = 3,
|
||||
/**< Send HTTP content */
|
||||
|
||||
/* LWS_WRITE_CLOSE is handled by lws_close_reason() */
|
||||
LWS_WRITE_PING = 5,
|
||||
LWS_WRITE_PONG = 6,
|
||||
|
||||
/* Same as write_http but we know this write ends the transaction */
|
||||
LWS_WRITE_HTTP_FINAL = 7,
|
||||
|
||||
/* HTTP2 */
|
||||
|
||||
LWS_WRITE_HTTP_HEADERS = 8,
|
||||
/**< Send http headers (http2 encodes this payload and LWS_WRITE_HTTP
|
||||
* payload differently, http 1.x links also handle this correctly. so
|
||||
* to be compatible with both in the future,header response part should
|
||||
* be sent using this regardless of http version expected)
|
||||
*/
|
||||
LWS_WRITE_HTTP_HEADERS_CONTINUATION = 9,
|
||||
/**< Continuation of http/2 headers
|
||||
*/
|
||||
|
||||
/****** add new things just above ---^ ******/
|
||||
|
||||
/* flags */
|
||||
|
||||
LWS_WRITE_BUFLIST = 0x20,
|
||||
/**< Don't actually write it... stick it on the output buflist and
|
||||
* write it as soon as possible. Useful if you learn you have to
|
||||
* write something, have the data to write to hand but the timing is
|
||||
* unrelated as to whether the connection is writable or not, and were
|
||||
* otherwise going to have to allocate a temp buffer and write it
|
||||
* later anyway */
|
||||
|
||||
LWS_WRITE_NO_FIN = 0x40,
|
||||
/**< This part of the message is not the end of the message */
|
||||
|
||||
LWS_WRITE_H2_STREAM_END = 0x80,
|
||||
/**< Flag indicates this packet should go out with STREAM_END if h2
|
||||
* STREAM_END is allowed on DATA or HEADERS.
|
||||
*/
|
||||
|
||||
LWS_WRITE_CLIENT_IGNORE_XOR_MASK = 0x80
|
||||
/**< client packet payload goes out on wire unmunged
|
||||
* only useful for security tests since normal servers cannot
|
||||
* decode the content if used */
|
||||
};
|
||||
|
||||
/* used with LWS_CALLBACK_CHILD_WRITE_VIA_PARENT */
|
||||
|
||||
struct lws_write_passthru {
|
||||
struct lws *wsi;
|
||||
unsigned char *buf;
|
||||
size_t len;
|
||||
enum lws_write_protocol wp;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* lws_write() - Apply protocol then write data to client
|
||||
*
|
||||
* \param wsi: Websocket instance (available from user callback)
|
||||
* \param buf: The data to send. For data being sent on a websocket
|
||||
* connection (ie, not default http), this buffer MUST have
|
||||
* LWS_PRE bytes valid BEFORE the pointer.
|
||||
* This is so the protocol header data can be added in-situ.
|
||||
* \param len: Count of the data bytes in the payload starting from buf
|
||||
* \param protocol: Use LWS_WRITE_HTTP to reply to an http connection, and one
|
||||
* of LWS_WRITE_BINARY or LWS_WRITE_TEXT to send appropriate
|
||||
* data on a websockets connection. Remember to allow the extra
|
||||
* bytes before and after buf if LWS_WRITE_BINARY or LWS_WRITE_TEXT
|
||||
* are used.
|
||||
*
|
||||
* This function provides the way to issue data back to the client, for any
|
||||
* role (h1, h2, ws, raw, etc). It can only be called from the WRITEABLE
|
||||
* callback.
|
||||
*
|
||||
* IMPORTANT NOTICE!
|
||||
*
|
||||
* When sending with ws protocol
|
||||
*
|
||||
* LWS_WRITE_TEXT,
|
||||
* LWS_WRITE_BINARY,
|
||||
* LWS_WRITE_CONTINUATION,
|
||||
* LWS_WRITE_PING,
|
||||
* LWS_WRITE_PONG,
|
||||
*
|
||||
* or sending on http/2... the send buffer has to have LWS_PRE bytes valid
|
||||
* BEFORE the buffer pointer you pass to lws_write(). Since you'll probably
|
||||
* want to use http/2 before too long, it's wise to just always do this with
|
||||
* lws_write buffers... LWS_PRE is typically 16 bytes it's not going to hurt
|
||||
* usually.
|
||||
*
|
||||
* start of alloc ptr passed to lws_write end of allocation
|
||||
* | | |
|
||||
* v <-- LWS_PRE bytes --> v v
|
||||
* [---------------- allocated memory ---------------]
|
||||
* (for lws use) [====== user buffer ======]
|
||||
*
|
||||
* This allows us to add protocol info before the data, and send as one packet
|
||||
* on the network without payload copying, for maximum efficiency.
|
||||
*
|
||||
* So for example you need this kind of code to use lws_write with a
|
||||
* 128-byte payload
|
||||
*
|
||||
* char buf[LWS_PRE + 128];
|
||||
*
|
||||
* // fill your part of the buffer... for example here it's all zeros
|
||||
* memset(&buf[LWS_PRE], 0, 128);
|
||||
*
|
||||
* if (lws_write(wsi, &buf[LWS_PRE], 128, LWS_WRITE_TEXT) < 128) {
|
||||
* ... the connection is dead ...
|
||||
* return -1;
|
||||
* }
|
||||
*
|
||||
* LWS_PRE is currently 16, which covers ws and h2 frame headers, and is
|
||||
* compatible with 32 and 64-bit alignment requirements.
|
||||
*
|
||||
* (LWS_SEND_BUFFER_POST_PADDING is deprecated, it's now 0 and can be left off.)
|
||||
*
|
||||
* Return may be -1 is the write failed in a way indicating that the connection
|
||||
* has ended already, in which case you can close your side, or a positive
|
||||
* number that is at least the number of bytes requested to send (under some
|
||||
* encapsulation scenarios, it can indicate more than you asked was sent).
|
||||
*
|
||||
* The recommended test of the return is less than what you asked indicates
|
||||
* the connection has failed.
|
||||
*
|
||||
* Truncated Writes
|
||||
* ================
|
||||
*
|
||||
* The OS may not accept everything you asked to write on the connection.
|
||||
*
|
||||
* Posix defines POLLOUT indication from poll() to show that the connection
|
||||
* will accept more write data, but it doesn't specifiy how much. It may just
|
||||
* accept one byte of whatever you wanted to send.
|
||||
*
|
||||
* LWS will buffer the remainder automatically, and send it out autonomously.
|
||||
*
|
||||
* During that time, WRITABLE callbacks to user code will be suppressed and
|
||||
* instead used internally. After it completes, it will send an extra WRITEABLE
|
||||
* callback to the user code, in case any request was missed. So it is possible
|
||||
* to receive unasked-for WRITEABLE callbacks, the user code should have enough
|
||||
* state to know if it wants to write anything and just return if not.
|
||||
*
|
||||
* This is to handle corner cases where unexpectedly the OS refuses what we
|
||||
* usually expect it to accept. It's not recommended as the way to randomly
|
||||
* send huge payloads, since it is being copied on to heap and is inefficient.
|
||||
*
|
||||
* Huge payloads should instead be sent in fragments that are around 2 x mtu,
|
||||
* which is almost always directly accepted by the OS. To simplify this for
|
||||
* ws fragments, there is a helper lws_write_ws_flags() below that simplifies
|
||||
* selecting the correct flags to give lws_write() for each fragment.
|
||||
*
|
||||
* In the case of RFC8441 ws-over-h2, you cannot send ws fragments larger than
|
||||
* the max h2 frame size, typically 16KB, but should further restrict it to
|
||||
* the same ~2 x mtu limit mentioned above.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_write(struct lws *wsi, unsigned char *buf, size_t len,
|
||||
enum lws_write_protocol protocol);
|
||||
|
||||
/* helper for case where buffer may be const */
|
||||
#define lws_write_http(wsi, buf, len) \
|
||||
lws_write(wsi, (unsigned char *)(buf), len, LWS_WRITE_HTTP)
|
||||
|
||||
/**
|
||||
* lws_write_ws_flags() - Helper for multi-frame ws message flags
|
||||
*
|
||||
* \param initial: the lws_write flag to use for the start fragment, eg,
|
||||
* LWS_WRITE_TEXT
|
||||
* \param is_start: nonzero if this is the first fragment of the message
|
||||
* \param is_end: nonzero if this is the last fragment of the message
|
||||
*
|
||||
* Returns the correct LWS_WRITE_ flag to use for each fragment of a message
|
||||
* in turn.
|
||||
*/
|
||||
static LWS_INLINE int
|
||||
lws_write_ws_flags(int initial, int is_start, int is_end)
|
||||
{
|
||||
int r;
|
||||
|
||||
if (is_start)
|
||||
r = initial;
|
||||
else
|
||||
r = LWS_WRITE_CONTINUATION;
|
||||
|
||||
if (!is_end)
|
||||
r |= LWS_WRITE_NO_FIN;
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
/**
|
||||
* lws_raw_transaction_completed() - Helper for flushing before close
|
||||
*
|
||||
* \param wsi: the struct lws to operate on
|
||||
*
|
||||
* Returns -1 if the wsi can close now. However if there is buffered, unsent
|
||||
* data, the wsi is marked as to be closed when the output buffer data is
|
||||
* drained, and it returns 0.
|
||||
*
|
||||
* For raw cases where the transaction completed without failure,
|
||||
* `return lws_raw_transaction_completed(wsi)` should better be used than
|
||||
* return -1.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
|
||||
lws_raw_transaction_completed(struct lws *wsi);
|
||||
|
||||
///@}
|
||||
@ -0,0 +1,246 @@
|
||||
/*
|
||||
* libwebsockets - small server side websockets and web server implementation
|
||||
*
|
||||
* Copyright (C) 2010 - 2019 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
/** \defgroup callback-when-writeable Callback when writeable
|
||||
*
|
||||
* ##Callback When Writeable
|
||||
*
|
||||
* lws can only write data on a connection when it is able to accept more
|
||||
* data without blocking.
|
||||
*
|
||||
* So a basic requirement is we should only use the lws_write() apis when the
|
||||
* connection we want to write on says that he can accept more data.
|
||||
*
|
||||
* When lws cannot complete your send at the time, it will buffer the data
|
||||
* and send it in the background, suppressing any further WRITEABLE callbacks
|
||||
* on that connection until it completes. So it is important to write new
|
||||
* things in a new writeable callback.
|
||||
*
|
||||
* These apis reflect the various ways we can indicate we would like to be
|
||||
* called back when one or more connections is writeable.
|
||||
*/
|
||||
///@{
|
||||
|
||||
/**
|
||||
* lws_callback_on_writable() - Request a callback when this socket
|
||||
* becomes able to be written to without
|
||||
* blocking
|
||||
*
|
||||
* \param wsi: Websocket connection instance to get callback for
|
||||
*
|
||||
* - Which: only this wsi
|
||||
* - When: when the individual connection becomes writeable
|
||||
* - What: LWS_CALLBACK_*_WRITEABLE
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_callback_on_writable(struct lws *wsi);
|
||||
|
||||
/**
|
||||
* lws_callback_on_writable_all_protocol() - Request a callback for all
|
||||
* connections using the given protocol when it
|
||||
* becomes possible to write to each socket without
|
||||
* blocking in turn.
|
||||
*
|
||||
* \param context: lws_context
|
||||
* \param protocol: Protocol whose connections will get callbacks
|
||||
*
|
||||
* - Which: connections using this protocol on ANY VHOST
|
||||
* - When: when the individual connection becomes writeable
|
||||
* - What: LWS_CALLBACK_*_WRITEABLE
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_callback_on_writable_all_protocol(const struct lws_context *context,
|
||||
const struct lws_protocols *protocol);
|
||||
|
||||
/**
|
||||
* lws_callback_on_writable_all_protocol_vhost() - Request a callback for
|
||||
* all connections on same vhost using the given protocol
|
||||
* when it becomes possible to write to each socket without
|
||||
* blocking in turn.
|
||||
*
|
||||
* \param vhost: Only consider connections on this lws_vhost
|
||||
* \param protocol: Protocol whose connections will get callbacks
|
||||
*
|
||||
* - Which: connections using this protocol on GIVEN VHOST ONLY
|
||||
* - When: when the individual connection becomes writeable
|
||||
* - What: LWS_CALLBACK_*_WRITEABLE
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_callback_on_writable_all_protocol_vhost(const struct lws_vhost *vhost,
|
||||
const struct lws_protocols *protocol);
|
||||
|
||||
/**
|
||||
* lws_callback_all_protocol() - Callback all connections using
|
||||
* the given protocol with the given reason
|
||||
*
|
||||
* \param context: lws_context
|
||||
* \param protocol: Protocol whose connections will get callbacks
|
||||
* \param reason: Callback reason index
|
||||
*
|
||||
* - Which: connections using this protocol on ALL VHOSTS
|
||||
* - When: before returning
|
||||
* - What: reason
|
||||
*
|
||||
* This isn't normally what you want... normally any update of connection-
|
||||
* specific information can wait until a network-related callback like rx,
|
||||
* writable, or close.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_callback_all_protocol(struct lws_context *context,
|
||||
const struct lws_protocols *protocol, int reason);
|
||||
|
||||
/**
|
||||
* lws_callback_all_protocol_vhost() - Callback all connections using
|
||||
* the given protocol with the given reason. This is
|
||||
* deprecated since v2.4: use lws_callback_all_protocol_vhost_args
|
||||
*
|
||||
* \param vh: Vhost whose connections will get callbacks
|
||||
* \param protocol: Which protocol to match. NULL means all.
|
||||
* \param reason: Callback reason index
|
||||
*
|
||||
* - Which: connections using this protocol on GIVEN VHOST ONLY
|
||||
* - When: now
|
||||
* - What: reason
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_callback_all_protocol_vhost(struct lws_vhost *vh,
|
||||
const struct lws_protocols *protocol,
|
||||
int reason)
|
||||
LWS_WARN_DEPRECATED;
|
||||
|
||||
/**
|
||||
* lws_callback_all_protocol_vhost_args() - Callback all connections using
|
||||
* the given protocol with the given reason and args
|
||||
*
|
||||
* \param vh: Vhost whose connections will get callbacks
|
||||
* \param protocol: Which protocol to match. NULL means all.
|
||||
* \param reason: Callback reason index
|
||||
* \param argp: Callback "in" parameter
|
||||
* \param len: Callback "len" parameter
|
||||
*
|
||||
* - Which: connections using this protocol on GIVEN VHOST ONLY
|
||||
* - When: now
|
||||
* - What: reason
|
||||
*/
|
||||
LWS_VISIBLE int
|
||||
lws_callback_all_protocol_vhost_args(struct lws_vhost *vh,
|
||||
const struct lws_protocols *protocol,
|
||||
int reason, void *argp, size_t len);
|
||||
|
||||
/**
|
||||
* lws_callback_vhost_protocols() - Callback all protocols enabled on a vhost
|
||||
* with the given reason
|
||||
*
|
||||
* \param wsi: wsi whose vhost will get callbacks
|
||||
* \param reason: Callback reason index
|
||||
* \param in: in argument to callback
|
||||
* \param len: len argument to callback
|
||||
*
|
||||
* - Which: connections using this protocol on same VHOST as wsi ONLY
|
||||
* - When: now
|
||||
* - What: reason
|
||||
*
|
||||
* This is deprecated since v2.5, use lws_callback_vhost_protocols_vhost()
|
||||
* which takes the pointer to the vhost directly without using or needing the
|
||||
* wsi.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_callback_vhost_protocols(struct lws *wsi, int reason, void *in, size_t len)
|
||||
LWS_WARN_DEPRECATED;
|
||||
|
||||
/**
|
||||
* lws_callback_vhost_protocols_vhost() - Callback all protocols enabled on a vhost
|
||||
* with the given reason
|
||||
*
|
||||
* \param vh: vhost that will get callbacks
|
||||
* \param reason: Callback reason index
|
||||
* \param in: in argument to callback
|
||||
* \param len: len argument to callback
|
||||
*
|
||||
* - Which: connections using this protocol on same VHOST as wsi ONLY
|
||||
* - When: now
|
||||
* - What: reason
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_callback_vhost_protocols_vhost(struct lws_vhost *vh, int reason, void *in,
|
||||
size_t len);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_callback_http_dummy(struct lws *wsi, enum lws_callback_reasons reason,
|
||||
void *user, void *in, size_t len);
|
||||
|
||||
/**
|
||||
* lws_get_socket_fd() - returns the socket file descriptor
|
||||
*
|
||||
* This is needed to use sendto() on UDP raw sockets
|
||||
*
|
||||
* \param wsi: Websocket connection instance
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN lws_sockfd_type
|
||||
lws_get_socket_fd(struct lws *wsi);
|
||||
|
||||
/**
|
||||
* lws_get_peer_write_allowance() - get the amount of data writeable to peer
|
||||
* if known
|
||||
*
|
||||
* \param wsi: Websocket connection instance
|
||||
*
|
||||
* if the protocol does not have any guidance, returns -1. Currently only
|
||||
* http2 connections get send window information from this API. But your code
|
||||
* should use it so it can work properly with any protocol.
|
||||
*
|
||||
* If nonzero return is the amount of payload data the peer or intermediary has
|
||||
* reported it has buffer space for. That has NO relationship with the amount
|
||||
* of buffer space your OS can accept on this connection for a write action.
|
||||
*
|
||||
* This number represents the maximum you could send to the peer or intermediary
|
||||
* on this connection right now without the protocol complaining.
|
||||
*
|
||||
* lws manages accounting for send window updates and payload writes
|
||||
* automatically, so this number reflects the situation at the peer or
|
||||
* intermediary dynamically.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN lws_fileofs_t
|
||||
lws_get_peer_write_allowance(struct lws *wsi);
|
||||
|
||||
/**
|
||||
* lws_wsi_tx_credit() - get / set generic tx credit if role supports it
|
||||
*
|
||||
* \param wsi: connection to set / get tx credit on
|
||||
* \param peer_to_us: 0 = set / get us-to-peer direction, else peer-to-us
|
||||
* \param add: amount of credit to add
|
||||
*
|
||||
* If the wsi does not support tx credit, returns 0.
|
||||
*
|
||||
* If add is zero, returns one of the wsi tx credit values for the wsi.
|
||||
* If add is nonzero, \p add is added to the selected tx credit value
|
||||
* for the wsi.
|
||||
*/
|
||||
#define LWSTXCR_US_TO_PEER 0
|
||||
#define LWSTXCR_PEER_TO_US 1
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_wsi_tx_credit(struct lws *wsi, char peer_to_us, int add);
|
||||
|
||||
///@}
|
||||
125
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-ws-close.h
Normal file
125
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-ws-close.h
Normal file
@ -0,0 +1,125 @@
|
||||
/*
|
||||
* libwebsockets - small server side websockets and web server implementation
|
||||
*
|
||||
* Copyright (C) 2010 - 2019 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
/*! \defgroup wsclose Websocket Close
|
||||
*
|
||||
* ##Websocket close frame control
|
||||
*
|
||||
* When we close a ws connection, we can send a reason code and a short
|
||||
* UTF-8 description back with the close packet.
|
||||
*/
|
||||
///@{
|
||||
|
||||
/*
|
||||
* NOTE: These public enums are part of the abi. If you want to add one,
|
||||
* add it at where specified so existing users are unaffected.
|
||||
*/
|
||||
/** enum lws_close_status - RFC6455 close status codes */
|
||||
enum lws_close_status {
|
||||
LWS_CLOSE_STATUS_NOSTATUS = 0,
|
||||
LWS_CLOSE_STATUS_NORMAL = 1000,
|
||||
/**< 1000 indicates a normal closure, meaning that the purpose for
|
||||
which the connection was established has been fulfilled. */
|
||||
LWS_CLOSE_STATUS_GOINGAWAY = 1001,
|
||||
/**< 1001 indicates that an endpoint is "going away", such as a server
|
||||
going down or a browser having navigated away from a page. */
|
||||
LWS_CLOSE_STATUS_PROTOCOL_ERR = 1002,
|
||||
/**< 1002 indicates that an endpoint is terminating the connection due
|
||||
to a protocol error. */
|
||||
LWS_CLOSE_STATUS_UNACCEPTABLE_OPCODE = 1003,
|
||||
/**< 1003 indicates that an endpoint is terminating the connection
|
||||
because it has received a type of data it cannot accept (e.g., an
|
||||
endpoint that understands only text data MAY send this if it
|
||||
receives a binary message). */
|
||||
LWS_CLOSE_STATUS_RESERVED = 1004,
|
||||
/**< Reserved. The specific meaning might be defined in the future. */
|
||||
LWS_CLOSE_STATUS_NO_STATUS = 1005,
|
||||
/**< 1005 is a reserved value and MUST NOT be set as a status code in a
|
||||
Close control frame by an endpoint. It is designated for use in
|
||||
applications expecting a status code to indicate that no status
|
||||
code was actually present. */
|
||||
LWS_CLOSE_STATUS_ABNORMAL_CLOSE = 1006,
|
||||
/**< 1006 is a reserved value and MUST NOT be set as a status code in a
|
||||
Close control frame by an endpoint. It is designated for use in
|
||||
applications expecting a status code to indicate that the
|
||||
connection was closed abnormally, e.g., without sending or
|
||||
receiving a Close control frame. */
|
||||
LWS_CLOSE_STATUS_INVALID_PAYLOAD = 1007,
|
||||
/**< 1007 indicates that an endpoint is terminating the connection
|
||||
because it has received data within a message that was not
|
||||
consistent with the type of the message (e.g., non-UTF-8 [RFC3629]
|
||||
data within a text message). */
|
||||
LWS_CLOSE_STATUS_POLICY_VIOLATION = 1008,
|
||||
/**< 1008 indicates that an endpoint is terminating the connection
|
||||
because it has received a message that violates its policy. This
|
||||
is a generic status code that can be returned when there is no
|
||||
other more suitable status code (e.g., 1003 or 1009) or if there
|
||||
is a need to hide specific details about the policy. */
|
||||
LWS_CLOSE_STATUS_MESSAGE_TOO_LARGE = 1009,
|
||||
/**< 1009 indicates that an endpoint is terminating the connection
|
||||
because it has received a message that is too big for it to
|
||||
process. */
|
||||
LWS_CLOSE_STATUS_EXTENSION_REQUIRED = 1010,
|
||||
/**< 1010 indicates that an endpoint (client) is terminating the
|
||||
connection because it has expected the server to negotiate one or
|
||||
more extension, but the server didn't return them in the response
|
||||
message of the WebSocket handshake. The list of extensions that
|
||||
are needed SHOULD appear in the /reason/ part of the Close frame.
|
||||
Note that this status code is not used by the server, because it
|
||||
can fail the WebSocket handshake instead */
|
||||
LWS_CLOSE_STATUS_UNEXPECTED_CONDITION = 1011,
|
||||
/**< 1011 indicates that a server is terminating the connection because
|
||||
it encountered an unexpected condition that prevented it from
|
||||
fulfilling the request. */
|
||||
LWS_CLOSE_STATUS_TLS_FAILURE = 1015,
|
||||
/**< 1015 is a reserved value and MUST NOT be set as a status code in a
|
||||
Close control frame by an endpoint. It is designated for use in
|
||||
applications expecting a status code to indicate that the
|
||||
connection was closed due to a failure to perform a TLS handshake
|
||||
(e.g., the server certificate can't be verified). */
|
||||
|
||||
LWS_CLOSE_STATUS_CLIENT_TRANSACTION_DONE = 2000,
|
||||
|
||||
/****** add new things just above ---^ ******/
|
||||
|
||||
LWS_CLOSE_STATUS_NOSTATUS_CONTEXT_DESTROY = 9999,
|
||||
};
|
||||
|
||||
/**
|
||||
* lws_close_reason - Set reason and aux data to send with Close packet
|
||||
* If you are going to return nonzero from the callback
|
||||
* requesting the connection to close, you can optionally
|
||||
* call this to set the reason the peer will be told if
|
||||
* possible.
|
||||
*
|
||||
* \param wsi: The websocket connection to set the close reason on
|
||||
* \param status: A valid close status from websocket standard
|
||||
* \param buf: NULL or buffer containing up to 124 bytes of auxiliary data
|
||||
* \param len: Length of data in \p buf to send
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_close_reason(struct lws *wsi, enum lws_close_status status,
|
||||
unsigned char *buf, size_t len);
|
||||
|
||||
///@}
|
||||
198
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-ws-ext.h
Normal file
198
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-ws-ext.h
Normal file
@ -0,0 +1,198 @@
|
||||
/*
|
||||
* libwebsockets - small server side websockets and web server implementation
|
||||
*
|
||||
* Copyright (C) 2010 - 2019 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
/*! \defgroup extensions Extension related functions
|
||||
* ##Extension releated functions
|
||||
*
|
||||
* Ws defines optional extensions, lws provides the ability to implement these
|
||||
* in user code if so desired.
|
||||
*
|
||||
* We provide one extensions permessage-deflate.
|
||||
*/
|
||||
///@{
|
||||
|
||||
/*
|
||||
* NOTE: These public enums are part of the abi. If you want to add one,
|
||||
* add it at where specified so existing users are unaffected.
|
||||
*/
|
||||
enum lws_extension_callback_reasons {
|
||||
LWS_EXT_CB_CONSTRUCT = 4,
|
||||
LWS_EXT_CB_CLIENT_CONSTRUCT = 5,
|
||||
LWS_EXT_CB_DESTROY = 8,
|
||||
LWS_EXT_CB_PACKET_TX_PRESEND = 12,
|
||||
LWS_EXT_CB_PAYLOAD_TX = 21,
|
||||
LWS_EXT_CB_PAYLOAD_RX = 22,
|
||||
LWS_EXT_CB_OPTION_DEFAULT = 23,
|
||||
LWS_EXT_CB_OPTION_SET = 24,
|
||||
LWS_EXT_CB_OPTION_CONFIRM = 25,
|
||||
LWS_EXT_CB_NAMED_OPTION_SET = 26,
|
||||
|
||||
/****** add new things just above ---^ ******/
|
||||
};
|
||||
|
||||
/** enum lws_ext_options_types */
|
||||
enum lws_ext_options_types {
|
||||
EXTARG_NONE, /**< does not take an argument */
|
||||
EXTARG_DEC, /**< requires a decimal argument */
|
||||
EXTARG_OPT_DEC /**< may have an optional decimal argument */
|
||||
|
||||
/* Add new things just above here ---^
|
||||
* This is part of the ABI, don't needlessly break compatibility */
|
||||
};
|
||||
|
||||
/** struct lws_ext_options - Option arguments to the extension. These are
|
||||
* used in the negotiation at ws upgrade time.
|
||||
* The helper function lws_ext_parse_options()
|
||||
* uses these to generate callbacks */
|
||||
struct lws_ext_options {
|
||||
const char *name; /**< Option name, eg, "server_no_context_takeover" */
|
||||
enum lws_ext_options_types type; /**< What kind of args the option can take */
|
||||
|
||||
/* Add new things just above here ---^
|
||||
* This is part of the ABI, don't needlessly break compatibility */
|
||||
};
|
||||
|
||||
/** struct lws_ext_option_arg */
|
||||
struct lws_ext_option_arg {
|
||||
const char *option_name; /**< may be NULL, option_index used then */
|
||||
int option_index; /**< argument ordinal to use if option_name missing */
|
||||
const char *start; /**< value */
|
||||
int len; /**< length of value */
|
||||
};
|
||||
|
||||
/**
|
||||
* typedef lws_extension_callback_function() - Hooks to allow extensions to operate
|
||||
* \param context: Websockets context
|
||||
* \param ext: This extension
|
||||
* \param wsi: Opaque websocket instance pointer
|
||||
* \param reason: The reason for the call
|
||||
* \param user: Pointer to ptr to per-session user data allocated by library
|
||||
* \param in: Pointer used for some callback reasons
|
||||
* \param len: Length set for some callback reasons
|
||||
*
|
||||
* Each extension that is active on a particular connection receives
|
||||
* callbacks during the connection lifetime to allow the extension to
|
||||
* operate on websocket data and manage itself.
|
||||
*
|
||||
* Libwebsockets takes care of allocating and freeing "user" memory for
|
||||
* each active extension on each connection. That is what is pointed to
|
||||
* by the user parameter.
|
||||
*
|
||||
* LWS_EXT_CB_CONSTRUCT: called when the server has decided to
|
||||
* select this extension from the list provided by the client,
|
||||
* just before the server will send back the handshake accepting
|
||||
* the connection with this extension active. This gives the
|
||||
* extension a chance to initialize its connection context found
|
||||
* in user.
|
||||
*
|
||||
* LWS_EXT_CB_CLIENT_CONSTRUCT: same as LWS_EXT_CB_CONSTRUCT
|
||||
* but called when client is instantiating this extension. Some
|
||||
* extensions will work the same on client and server side and then
|
||||
* you can just merge handlers for both CONSTRUCTS.
|
||||
*
|
||||
* LWS_EXT_CB_DESTROY: called when the connection the extension was
|
||||
* being used on is about to be closed and deallocated. It's the
|
||||
* last chance for the extension to deallocate anything it has
|
||||
* allocated in the user data (pointed to by user) before the
|
||||
* user data is deleted. This same callback is used whether you
|
||||
* are in client or server instantiation context.
|
||||
*
|
||||
* LWS_EXT_CB_PACKET_TX_PRESEND: this works the same way as
|
||||
* LWS_EXT_CB_PACKET_RX_PREPARSE above, except it gives the
|
||||
* extension a chance to change websocket data just before it will
|
||||
* be sent out. Using the same lws_token pointer scheme in in,
|
||||
* the extension can change the buffer and the length to be
|
||||
* transmitted how it likes. Again if it wants to grow the
|
||||
* buffer safely, it should copy the data into its own buffer and
|
||||
* set the lws_tokens token pointer to it.
|
||||
*
|
||||
* LWS_EXT_CB_ARGS_VALIDATE:
|
||||
*/
|
||||
typedef int
|
||||
lws_extension_callback_function(struct lws_context *context,
|
||||
const struct lws_extension *ext, struct lws *wsi,
|
||||
enum lws_extension_callback_reasons reason,
|
||||
void *user, void *in, size_t len);
|
||||
|
||||
/** struct lws_extension - An extension we support */
|
||||
struct lws_extension {
|
||||
const char *name; /**< Formal extension name, eg, "permessage-deflate" */
|
||||
lws_extension_callback_function *callback; /**< Service callback */
|
||||
const char *client_offer; /**< String containing exts and options client offers */
|
||||
|
||||
/* Add new things just above here ---^
|
||||
* This is part of the ABI, don't needlessly break compatibility */
|
||||
};
|
||||
|
||||
/**
|
||||
* lws_set_extension_option(): set extension option if possible
|
||||
*
|
||||
* \param wsi: websocket connection
|
||||
* \param ext_name: name of ext, like "permessage-deflate"
|
||||
* \param opt_name: name of option, like "rx_buf_size"
|
||||
* \param opt_val: value to set option to
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_set_extension_option(struct lws *wsi, const char *ext_name,
|
||||
const char *opt_name, const char *opt_val);
|
||||
|
||||
/**
|
||||
* lws_ext_parse_options() - deal with parsing negotiated extension options
|
||||
*
|
||||
* \param ext: related extension struct
|
||||
* \param wsi: websocket connection
|
||||
* \param ext_user: per-connection extension private data
|
||||
* \param opts: list of supported options
|
||||
* \param o: option string to parse
|
||||
* \param len: length
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
|
||||
lws_ext_parse_options(const struct lws_extension *ext, struct lws *wsi,
|
||||
void *ext_user, const struct lws_ext_options *opts,
|
||||
const char *o, int len);
|
||||
|
||||
/** lws_extension_callback_pm_deflate() - extension for RFC7692
|
||||
*
|
||||
* \param context: lws context
|
||||
* \param ext: related lws_extension struct
|
||||
* \param wsi: websocket connection
|
||||
* \param reason: incoming callback reason
|
||||
* \param user: per-connection extension private data
|
||||
* \param in: pointer parameter
|
||||
* \param len: length parameter
|
||||
*
|
||||
* Built-in callback implementing RFC7692 permessage-deflate
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_extension_callback_pm_deflate(struct lws_context *context,
|
||||
const struct lws_extension *ext,
|
||||
struct lws *wsi,
|
||||
enum lws_extension_callback_reasons reason,
|
||||
void *user, void *in, size_t len);
|
||||
|
||||
/*
|
||||
* The internal exts are part of the public abi
|
||||
* If we add more extensions, publish the callback here ------v
|
||||
*/
|
||||
///@}
|
||||
100
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-ws-state.h
Normal file
100
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-ws-state.h
Normal file
@ -0,0 +1,100 @@
|
||||
/*
|
||||
* libwebsockets - small server side websockets and web server implementation
|
||||
*
|
||||
* Copyright (C) 2010 - 2019 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
/** \defgroup wsstatus Websocket status APIs
|
||||
* ##Websocket connection status APIs
|
||||
*
|
||||
* These provide information about ws connection or message status
|
||||
*/
|
||||
///@{
|
||||
/**
|
||||
* lws_send_pipe_choked() - tests if socket is writable or not
|
||||
* \param wsi: lws connection
|
||||
*
|
||||
* Allows you to check if you can write more on the socket
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
|
||||
lws_send_pipe_choked(struct lws *wsi);
|
||||
|
||||
/**
|
||||
* lws_is_final_fragment() - tests if last part of ws message
|
||||
*
|
||||
* \param wsi: lws connection
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_is_final_fragment(struct lws *wsi);
|
||||
|
||||
/**
|
||||
* lws_is_first_fragment() - tests if first part of ws message
|
||||
*
|
||||
* \param wsi: lws connection
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_is_first_fragment(struct lws *wsi);
|
||||
|
||||
/**
|
||||
* lws_get_reserved_bits() - access reserved bits of ws frame
|
||||
* \param wsi: lws connection
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN unsigned char
|
||||
lws_get_reserved_bits(struct lws *wsi);
|
||||
|
||||
/**
|
||||
* lws_get_opcode() - access opcode of ws frame
|
||||
* \param wsi: lws connection
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN uint8_t
|
||||
lws_get_opcode(struct lws *wsi);
|
||||
|
||||
/**
|
||||
* lws_partial_buffered() - find out if lws buffered the last write
|
||||
* \param wsi: websocket connection to check
|
||||
*
|
||||
* Returns 1 if you cannot use lws_write because the last
|
||||
* write on this connection is still buffered, and can't be cleared without
|
||||
* returning to the service loop and waiting for the connection to be
|
||||
* writeable again.
|
||||
*
|
||||
* If you will try to do >1 lws_write call inside a single
|
||||
* WRITEABLE callback, you must check this after every write and bail if
|
||||
* set, ask for a new writeable callback and continue writing from there.
|
||||
*
|
||||
* This is never set at the start of a writeable callback, but any write
|
||||
* may set it.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
|
||||
lws_partial_buffered(struct lws *wsi);
|
||||
|
||||
/**
|
||||
* lws_frame_is_binary(): true if the current frame was sent in binary mode
|
||||
*
|
||||
* \param wsi: the connection we are inquiring about
|
||||
*
|
||||
* This is intended to be called from the LWS_CALLBACK_RECEIVE callback if
|
||||
* it's interested to see if the frame it's dealing with was sent in binary
|
||||
* mode.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
|
||||
lws_frame_is_binary(struct lws *wsi);
|
||||
///@}
|
||||
293
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-x509.h
Normal file
293
Kinc/Sources/kinc/libs/core/include/libwebsockets/lws-x509.h
Normal file
@ -0,0 +1,293 @@
|
||||
/*
|
||||
* libwebsockets - small server side websockets and web server implementation
|
||||
*
|
||||
* Copyright (C) 2010 - 2019 Andy Green <andy@warmcat.com>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to
|
||||
* deal in the Software without restriction, including without limitation the
|
||||
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
* IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
enum lws_tls_cert_info {
|
||||
LWS_TLS_CERT_INFO_VALIDITY_FROM,
|
||||
/**< fills .time with the time_t the cert validity started from */
|
||||
LWS_TLS_CERT_INFO_VALIDITY_TO,
|
||||
/**< fills .time with the time_t the cert validity ends at */
|
||||
LWS_TLS_CERT_INFO_COMMON_NAME,
|
||||
/**< fills up to len bytes of .ns.name with the cert common name */
|
||||
LWS_TLS_CERT_INFO_ISSUER_NAME,
|
||||
/**< fills up to len bytes of .ns.name with the cert issuer name */
|
||||
LWS_TLS_CERT_INFO_USAGE,
|
||||
/**< fills verified with a bitfield asserting the valid uses */
|
||||
LWS_TLS_CERT_INFO_VERIFIED,
|
||||
/**< fills .verified with a bool representing peer cert validity,
|
||||
* call returns -1 if no cert */
|
||||
LWS_TLS_CERT_INFO_OPAQUE_PUBLIC_KEY,
|
||||
/**< the certificate's public key, as an opaque bytestream. These
|
||||
* opaque bytestreams can only be compared with each other using the
|
||||
* same tls backend, ie, OpenSSL or mbedTLS. The different backends
|
||||
* produce different, incompatible representations for the same cert.
|
||||
*/
|
||||
LWS_TLS_CERT_INFO_DER_RAW,
|
||||
/**< the certificate's raw DER representation. If it's too big,
|
||||
* -1 is returned and the size will be returned in buf->ns.len.
|
||||
* If the certificate cannot be found -1 is returned and 0 in
|
||||
* buf->ns.len. */
|
||||
LWS_TLS_CERT_INFO_AUTHORITY_KEY_ID,
|
||||
/**< If the cert has one, the key ID responsible for the signature */
|
||||
LWS_TLS_CERT_INFO_AUTHORITY_KEY_ID_ISSUER,
|
||||
/**< If the cert has one, the issuer responsible for the signature */
|
||||
LWS_TLS_CERT_INFO_AUTHORITY_KEY_ID_SERIAL,
|
||||
/**< If the cert has one, serial number responsible for the signature */
|
||||
LWS_TLS_CERT_INFO_SUBJECT_KEY_ID,
|
||||
/**< If the cert has one, the cert's subject key ID */
|
||||
};
|
||||
|
||||
union lws_tls_cert_info_results {
|
||||
unsigned int verified;
|
||||
time_t time;
|
||||
unsigned int usage;
|
||||
struct {
|
||||
int len;
|
||||
/* KEEP LAST... notice the [64] is only there because
|
||||
* name[] is not allowed in a union. The actual length of
|
||||
* name[] is arbitrary and is passed into the api using the
|
||||
* len parameter. Eg
|
||||
*
|
||||
* char big[1024];
|
||||
* union lws_tls_cert_info_results *buf =
|
||||
* (union lws_tls_cert_info_results *)big;
|
||||
*
|
||||
* lws_tls_peer_cert_info(wsi, type, buf, sizeof(big) -
|
||||
* sizeof(*buf) + sizeof(buf->ns.name));
|
||||
*/
|
||||
char name[64];
|
||||
} ns;
|
||||
};
|
||||
|
||||
struct lws_x509_cert;
|
||||
struct lws_jwk;
|
||||
|
||||
/**
|
||||
* lws_x509_create() - Allocate an lws_x509_cert object
|
||||
*
|
||||
* \param x509: pointer to lws_x509_cert pointer to be set to allocated object
|
||||
*
|
||||
* Allocates an lws_x509_cert object and set *x509 to point to it.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_x509_create(struct lws_x509_cert **x509);
|
||||
|
||||
/**
|
||||
* lws_x509_parse_from_pem() - Read one or more x509 certs in PEM format from memory
|
||||
*
|
||||
* \param x509: pointer to lws_x509_cert object
|
||||
* \param pem: pointer to PEM format content
|
||||
* \param len: length of PEM format content
|
||||
*
|
||||
* Parses PEM certificates in memory into a native x509 representation for the
|
||||
* TLS library. If there are multiple PEM certs concatenated, they are all
|
||||
* read into the same object and exist as a "chain".
|
||||
*
|
||||
* IMPORTANT for compatibility with mbedtls, the last used byte of \p pem
|
||||
* must be '\0' and the \p len must include it.
|
||||
*
|
||||
* Returns 0 if all went OK, or nonzero for failure.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_x509_parse_from_pem(struct lws_x509_cert *x509, const void *pem, size_t len);
|
||||
|
||||
/**
|
||||
* lws_x509_verify() - Validate signing relationship between one or more certs
|
||||
* and a trusted CA cert
|
||||
*
|
||||
* \param x509: pointer to lws_x509_cert object, may contain multiple
|
||||
* \param trusted: a single, trusted cert object that we are checking for
|
||||
* \param common_name: NULL, or required CN (Common Name) of \p x509
|
||||
*
|
||||
* Returns 0 if the cert or certs in \p x509 represent a complete chain that is
|
||||
* ultimately signed by the cert in \p trusted. Returns nonzero if that's not
|
||||
* the case.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_x509_verify(struct lws_x509_cert *x509, struct lws_x509_cert *trusted,
|
||||
const char *common_name);
|
||||
|
||||
/**
|
||||
* lws_x509_public_to_jwk() - Copy the public key out of a cert and into a JWK
|
||||
*
|
||||
* \param jwk: pointer to the jwk to initialize and set to the public key
|
||||
* \param x509: pointer to lws_x509_cert object that has the public key
|
||||
* \param curves: NULL to disallow EC, else a comma-separated list of valid
|
||||
* curves using the JWA naming, eg, "P-256,P-384,P-521".
|
||||
* \param rsabits: minimum number of RSA bits required in the cert if RSA
|
||||
*
|
||||
* Returns 0 if JWK was set to the certificate public key correctly and the
|
||||
* curve / the RSA key size was acceptable. Automatically produces an RSA or
|
||||
* EC JWK depending on what the cert had.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_x509_public_to_jwk(struct lws_jwk *jwk, struct lws_x509_cert *x509,
|
||||
const char *curves, int rsabits);
|
||||
|
||||
/**
|
||||
* lws_x509_jwk_privkey_pem() - Copy a private key PEM into a jwk that has the
|
||||
* public part already
|
||||
*
|
||||
* \param cx: lws_context (for random)
|
||||
* \param jwk: pointer to the jwk to initialize and set to the public key
|
||||
* \param pem: pointer to PEM private key in memory
|
||||
* \param len: length of PEM private key in memory
|
||||
* \param passphrase: NULL or passphrase needed to decrypt private key
|
||||
*
|
||||
* IMPORTANT for compatibility with mbedtls, the last used byte of \p pem
|
||||
* must be '\0' and the \p len must include it.
|
||||
*
|
||||
* Returns 0 if the private key was successfully added to the JWK, else
|
||||
* nonzero if failed.
|
||||
*
|
||||
* The PEM image in memory is zeroed down on both successful and failed exits.
|
||||
* The caller should take care to zero down passphrase if used.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_x509_jwk_privkey_pem(struct lws_context *cx, struct lws_jwk *jwk,
|
||||
void *pem, size_t len, const char *passphrase);
|
||||
|
||||
/**
|
||||
* lws_x509_destroy() - Destroy a previously allocated lws_x509_cert object
|
||||
*
|
||||
* \param x509: pointer to lws_x509_cert pointer
|
||||
*
|
||||
* Deallocates an lws_x509_cert object and sets its pointer to NULL.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN void
|
||||
lws_x509_destroy(struct lws_x509_cert **x509);
|
||||
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_x509_info(struct lws_x509_cert *x509, enum lws_tls_cert_info type,
|
||||
union lws_tls_cert_info_results *buf, size_t len);
|
||||
|
||||
/**
|
||||
* lws_tls_peer_cert_info() - get information from the peer's TLS cert
|
||||
*
|
||||
* \param wsi: the connection to query
|
||||
* \param type: one of LWS_TLS_CERT_INFO_
|
||||
* \param buf: pointer to union to take result
|
||||
* \param len: when result is a string, the true length of buf->ns.name[]
|
||||
*
|
||||
* lws_tls_peer_cert_info() lets you get hold of information from the peer
|
||||
* certificate.
|
||||
*
|
||||
* Return 0 if there is a result in \p buf, or nonzero indicating there was no
|
||||
* cert, or another problem.
|
||||
*
|
||||
* This function works the same no matter if the TLS backend is OpenSSL or
|
||||
* mbedTLS.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_tls_peer_cert_info(struct lws *wsi, enum lws_tls_cert_info type,
|
||||
union lws_tls_cert_info_results *buf, size_t len);
|
||||
|
||||
/**
|
||||
* lws_tls_vhost_cert_info() - get information from the vhost's own TLS cert
|
||||
*
|
||||
* \param vhost: the vhost to query
|
||||
* \param type: one of LWS_TLS_CERT_INFO_
|
||||
* \param buf: pointer to union to take result
|
||||
* \param len: when result is a string, the true length of buf->ns.name[]
|
||||
*
|
||||
* lws_tls_vhost_cert_info() lets you get hold of information from the vhost
|
||||
* certificate.
|
||||
*
|
||||
* Return 0 if there is a result in \p buf, or nonzero indicating there was no
|
||||
* cert, or another problem.
|
||||
*
|
||||
* This function works the same no matter if the TLS backend is OpenSSL or
|
||||
* mbedTLS.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_tls_vhost_cert_info(struct lws_vhost *vhost, enum lws_tls_cert_info type,
|
||||
union lws_tls_cert_info_results *buf, size_t len);
|
||||
|
||||
/**
|
||||
* lws_tls_acme_sni_cert_create() - creates a temp selfsigned cert
|
||||
* and attaches to a vhost
|
||||
*
|
||||
* \param vhost: the vhost to acquire the selfsigned cert
|
||||
* \param san_a: SAN written into the certificate
|
||||
* \param san_b: second SAN written into the certificate
|
||||
*
|
||||
*
|
||||
* Returns 0 if created and attached to the vhost. Returns nonzero if problems,
|
||||
* and frees all allocations before returning.
|
||||
*
|
||||
* On success, any allocations are destroyed at vhost destruction automatically.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_tls_acme_sni_cert_create(struct lws_vhost *vhost, const char *san_a,
|
||||
const char *san_b);
|
||||
|
||||
/**
|
||||
* lws_tls_acme_sni_csr_create() - creates a CSR and related private key PEM
|
||||
*
|
||||
* \param context: lws_context used for random
|
||||
* \param elements: array of LWS_TLS_REQ_ELEMENT_COUNT const char *
|
||||
* \param csr: buffer that will get the b64URL(ASN-1 CSR)
|
||||
* \param csr_len: max length of the csr buffer
|
||||
* \param privkey_pem: pointer to pointer allocated to hold the privkey_pem
|
||||
* \param privkey_len: pointer to size_t set to the length of the privkey_pem
|
||||
*
|
||||
* Creates a CSR according to the information in \p elements, and a private
|
||||
* RSA key used to sign the CSR.
|
||||
*
|
||||
* The outputs are the b64URL(ASN-1 CSR) into csr, and the PEM private key into
|
||||
* privkey_pem.
|
||||
*
|
||||
* Notice that \p elements points to an array of const char *s pointing to the
|
||||
* information listed in the enum above. If an entry is NULL or an empty
|
||||
* string, the element is set to "none" in the CSR.
|
||||
*
|
||||
* Returns 0 on success or nonzero for failure.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_tls_acme_sni_csr_create(struct lws_context *context, const char *elements[],
|
||||
uint8_t *csr, size_t csr_len, char **privkey_pem,
|
||||
size_t *privkey_len);
|
||||
|
||||
/**
|
||||
* lws_tls_cert_updated() - update every vhost using the given cert path
|
||||
*
|
||||
* \param context: our lws_context
|
||||
* \param certpath: the filepath to the certificate
|
||||
* \param keypath: the filepath to the private key of the certificate
|
||||
* \param mem_cert: copy of the cert in memory
|
||||
* \param len_mem_cert: length of the copy of the cert in memory
|
||||
* \param mem_privkey: copy of the private key in memory
|
||||
* \param len_mem_privkey: length of the copy of the private key in memory
|
||||
*
|
||||
* Checks every vhost to see if it is the using certificate described by the
|
||||
* the given filepaths. If so, it attempts to update the vhost ssl_ctx to use
|
||||
* the new certificate.
|
||||
*
|
||||
* Returns 0 on success or nonzero for failure.
|
||||
*/
|
||||
LWS_VISIBLE LWS_EXTERN int
|
||||
lws_tls_cert_updated(struct lws_context *context, const char *certpath,
|
||||
const char *keypath,
|
||||
const char *mem_cert, size_t len_mem_cert,
|
||||
const char *mem_privkey, size_t len_mem_privkey);
|
||||
|
||||
266
Kinc/Sources/kinc/libs/core/include/lws_config.h
Normal file
266
Kinc/Sources/kinc/libs/core/include/lws_config.h
Normal file
@ -0,0 +1,266 @@
|
||||
/* lws_config.h Generated from lws_config.h.in */
|
||||
|
||||
#ifndef NDEBUG
|
||||
#ifndef _DEBUG
|
||||
#define _DEBUG
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#define LWS_INSTALL_DATADIR "/usr/local/share"
|
||||
#define LWS_INSTALL_LIBDIR "/usr/local/lib"
|
||||
#define LWS_LIBRARY_VERSION_MAJOR 4
|
||||
#define LWS_LIBRARY_VERSION_MINOR 3
|
||||
#define LWS_LIBRARY_VERSION_PATCH_ELABORATED 99-v4.3.0-424-ga74362ff
|
||||
#define LWS_LIBRARY_VERSION_PATCH 99
|
||||
|
||||
/* LWS_LIBRARY_VERSION_NUMBER looks like 1005001 for e.g. version 1.5.1 */
|
||||
#define LWS_LIBRARY_VERSION_NUMBER (LWS_LIBRARY_VERSION_MAJOR * 1000000) + \
|
||||
(LWS_LIBRARY_VERSION_MINOR * 1000) + \
|
||||
LWS_LIBRARY_VERSION_PATCH
|
||||
#define LWS_MAX_SMP 1
|
||||
|
||||
/* #undef LWS_ESP_PLATFORM */
|
||||
/* #undef LWS_LIBRARY_VERSION_NUMBER */
|
||||
|
||||
/* #undef LWS_EXT_PTHREAD_LIBRARIES */
|
||||
|
||||
/* #undef LWS_AVOID_SIGPIPE_IGN */
|
||||
#define LWS_BUILD_HASH "v4.3.0-424-ga74362ff"
|
||||
/* #undef LWS_BUILTIN_GETIFADDRS */
|
||||
/* #undef LWS_BUILTIN_PLUGIN_NAMES */
|
||||
#define LWS_CLIENT_HTTP_PROXYING
|
||||
/* #undef LWS_DETECTED_PLAT_IOS */
|
||||
/* #undef LWS_FALLBACK_GETHOSTBYNAME */
|
||||
#define LWS_HAS_INTPTR_T
|
||||
#define LWS_HAS_GETOPT_LONG
|
||||
/* #undef LWS_HAVE__ATOI64 */
|
||||
#define LWS_HAVE_ATOLL
|
||||
#define LWS_HAVE_BN_bn2binpad
|
||||
#define LWS_HAVE_CLOCK_GETTIME
|
||||
#define LWS_HAVE_EC_POINT_get_affine_coordinates
|
||||
#define LWS_HAVE_EC_KEY_new_by_curve_name
|
||||
#define LWS_HAVE_ECDSA_SIG_set0
|
||||
#define LWS_HAVE_EVP_MD_CTX_free
|
||||
#define LWS_HAVE_EVP_aes_128_wrap
|
||||
#define LWS_HAVE_EVP_aes_128_cfb8
|
||||
#define LWS_HAVE_EVP_aes_128_cfb128
|
||||
#define LWS_HAVE_EVP_aes_192_cfb8
|
||||
#define LWS_HAVE_EVP_aes_192_cfb128
|
||||
#define LWS_HAVE_EVP_aes_256_cfb8
|
||||
#define LWS_HAVE_EVP_aes_256_cfb128
|
||||
#define LWS_HAVE_EVP_aes_128_ofb
|
||||
#define LWS_HAVE_EVP_aes_128_xts
|
||||
#define LWS_HAVE_EVP_aes_128_ctr
|
||||
#define LWS_HAVE_EVP_aes_128_ecb
|
||||
#define LWS_HAVE_EVP_PKEY_new_raw_private_key
|
||||
#define LWS_HAVE_EXECVPE
|
||||
#define LWS_HAVE_LOCALTIME_R
|
||||
#define LWS_HAVE_GMTIME_R
|
||||
#define LWS_HAVE_CTIME_R
|
||||
#define LWS_HAVE_GETGRGID_R
|
||||
#define LWS_HAVE_GETGRNAM_R
|
||||
#define LWS_HAVE_GETPWUID_R
|
||||
#define LWS_HAVE_GETPWNAM_R
|
||||
#define LWS_HAVE_LIBCAP
|
||||
#define LWS_HAVE_HMAC_CTX_new
|
||||
#define LWS_HAVE_MALLOC_H
|
||||
#define LWS_HAVE_MALLOC_TRIM
|
||||
#define LWS_HAVE_MALLOC_USABLE_SIZE
|
||||
/* #undef LWS_HAVE_mbedtls_md_setup */
|
||||
/* #undef LWS_HAVE_mbedtls_net_init */
|
||||
/* #undef LWS_HAVE_mbedtls_rsa_complete */
|
||||
/* #undef LWS_HAVE_mbedtls_internal_aes_encrypt */
|
||||
/* #undef LWS_HAVE_mbedtls_ssl_conf_alpn_protocols */
|
||||
/* #undef LWS_HAVE_mbedtls_ssl_get_alpn_protocol */
|
||||
/* #undef LWS_HAVE_mbedtls_ssl_conf_sni */
|
||||
/* #undef LWS_HAVE_mbedtls_ssl_set_hs_ca_chain */
|
||||
/* #undef LWS_HAVE_mbedtls_ssl_set_hs_own_cert */
|
||||
/* #undef LWS_HAVE_mbedtls_ssl_set_hs_authmode */
|
||||
/* #undef LWS_HAVE_mbedtls_ssl_set_verify */
|
||||
/* #undef LWS_HAVE_mbedtls_x509_crt_parse_file */
|
||||
/* #undef LWS_HAVE_MBEDTLS_NET_SOCKETS */
|
||||
/* #undef LWS_HAVE_MBEDTLS_SSL_NEW_SESSION_TICKET */
|
||||
/* #undef LWS_HAVE_MBEDTLS_AUTH_KEY_ID */
|
||||
/* #undef LWS_HAVE_NEW_UV_VERSION_H */
|
||||
#define LWS_HAVE_OPENSSL_ECDH_H
|
||||
#define LWS_HAVE_OPENSSL_STACK
|
||||
#define LWS_HAVE_PIPE2
|
||||
#define LWS_HAVE_EVENTFD
|
||||
#define LWS_HAVE_PTHREAD_H
|
||||
#define LWS_HAVE_RSA_SET0_KEY
|
||||
/* #undef LWS_HAVE_RSA_verify_pss_mgf1 */
|
||||
#define LWS_HAVE_SSL_CTX_get0_certificate
|
||||
/* #undef LWS_HAVE_SSL_CTX_load_verify_file */
|
||||
/* #undef LWS_HAVE_SSL_CTX_load_verify_dir */
|
||||
#define LWS_HAVE_SSL_CTX_set1_param
|
||||
/* #undef LWS_HAVE_SSL_CTX_set_ciphersuites */
|
||||
#define LWS_HAVE_SSL_CTX_set_keylog_callback
|
||||
#define LWS_HAVE_SSL_EXTRA_CHAIN_CERTS
|
||||
#define LWS_HAVE_SSL_get0_alpn_selected
|
||||
/* #undef LWS_HAVE_SSL_CTX_EVP_PKEY_new_raw_private_key */
|
||||
#define LWS_HAVE_SSL_set_alpn_protos
|
||||
#define LWS_HAVE_SSL_SET_INFO_CALLBACK
|
||||
#define LWS_HAVE_SSL_SESSION_set_time
|
||||
/* #undef LWS_HAVE_SSL_SESSION_up_ref */
|
||||
/* #undef LWS_HAVE__STAT32I64 */
|
||||
#define LWS_HAVE_STDINT_H
|
||||
#define LWS_HAVE_SYS_TYPES_H
|
||||
#define LWS_HAVE_SYS_CAPABILITY_H
|
||||
#define LWS_HAVE_TIMEGM
|
||||
#define LWS_HAVE_TLS_CLIENT_METHOD
|
||||
#define LWS_HAVE_TLSV1_2_CLIENT_METHOD
|
||||
#define LWS_HAVE_SUSECONDS_T
|
||||
/* #undef LWS_HAVE_UV_VERSION_H */
|
||||
#define LWS_HAVE_VFORK
|
||||
#define LWS_HAVE_X509_get_key_usage
|
||||
#define LWS_HAVE_X509_VERIFY_PARAM_set1_host
|
||||
#define LWS_LIBRARY_VERSION "4.3.99-v4.3.0-424-ga74362ff"
|
||||
#define LWS_LOGGING_BITFIELD_CLEAR 0
|
||||
#define LWS_LOGGING_BITFIELD_SET 0
|
||||
#define LWS_LOG_TAG_LIFECYCLE
|
||||
/* #undef LWS_MINGW_SUPPORT */
|
||||
/* #undef LWS_NO_CLIENT */
|
||||
#define LWS_NO_DAEMONIZE
|
||||
/* #undef LWS_ONLY_SSPC */
|
||||
#define LWS_OPENSSL_CLIENT_CERTS "../share"
|
||||
#define LWS_OPENSSL_SUPPORT
|
||||
/* #undef LWS_OTA_PUBLIC_JWK */
|
||||
#define LWS_OTA_VARIANT "set-LWS_OTA_VARIANT"
|
||||
/* #undef LWS_PLAT_OPTEE */
|
||||
#define LWS_PLAT_UNIX
|
||||
/* #undef LWS_PLAT_FREERTOS */
|
||||
/* #undef LWS_PLAT_BAREMETAL */
|
||||
/* #undef LWS_ROLE_CGI */
|
||||
/* #undef LWS_ROLE_DBUS */
|
||||
#define LWS_ROLE_H1
|
||||
#define LWS_ROLE_H2
|
||||
#define LWS_ROLE_RAW
|
||||
#define LWS_ROLE_RAW_FILE
|
||||
/* #undef LWS_ROLE_RAW_PROXY */
|
||||
#define LWS_ROLE_WS
|
||||
/* #undef LWS_ROLE_MQTT */
|
||||
/* #undef LWS_SHA1_USE_OPENSSL_NAME */
|
||||
#define LWS_SSL_CLIENT_USE_OS_CA_CERTS
|
||||
/* #undef LWS_SSL_SERVER_WITH_ECDH_CERT */
|
||||
#define LWS_SUPPRESS_DEPRECATED_API_WARNINGS
|
||||
/* #undef LWS_TLS_LOG_PLAINTEXT_RX */
|
||||
/* #undef LWS_TLS_LOG_PLAINTEXT_TX */
|
||||
/* #undef LWS_WITH_ABSTRACT */
|
||||
/* #undef LWS_WITH_ACCESS_LOG */
|
||||
/* #undef LWS_WITH_ACME */
|
||||
/* #undef LWS_WITH_ALLOC_METADATA_LWS */
|
||||
/* #undef LWS_WITH_ALSA */
|
||||
/* #undef LWS_WITH_SYS_ASYNC_DNS */
|
||||
/* #undef LWS_WITH_BORINGSSL */
|
||||
/* #undef LWS_WITH_CGI */
|
||||
/* #undef LWS_WITH_COMPRESSED_BACKTRACES */
|
||||
#define LWS_COMPRESSED_BACKTRACES_SNIP_PRE 2
|
||||
#define LWS_COMPRESSED_BACKTRACES_SNIP_POST 1
|
||||
#define LWS_WITH_CONMON
|
||||
/* #undef LWS_WITH_COSE */
|
||||
#define LWS_WITH_CUSTOM_HEADERS
|
||||
/* #undef LWS_WITH_DEPRECATED_LWS_DLL */
|
||||
/* #undef LWS_WITH_DETAILED_LATENCY */
|
||||
#define LWS_WITH_DIR
|
||||
#define LWS_WITH_DLO
|
||||
/* #undef LWS_WITH_DRIVERS */
|
||||
/* #undef LWS_WITH_ESP32 */
|
||||
#define LWS_HAVE_NET_ETHERNET_H
|
||||
/* #undef LWS_HAVE_EVBACKEND_LINUXAIO */
|
||||
/* #undef LWS_HAVE_EVBACKEND_IOURING */
|
||||
/* #undef LWS_WITH_EXTERNAL_POLL */
|
||||
#define LWS_WITH_FILE_OPS
|
||||
/* #undef LWS_WITH_FSMOUNT */
|
||||
/* #undef LWS_WITH_FTS */
|
||||
#define LWS_WITH_GENCRYPTO
|
||||
/* #undef LWS_WITH_GENERIC_SESSIONS */
|
||||
/* #undef LWS_WITH_GLIB */
|
||||
/* #undef LWS_WITH_GTK */
|
||||
#define LWS_WITH_GZINFLATE
|
||||
#define LWS_WITH_HTTP2
|
||||
#define LWS_WITH_HTTP_BASIC_AUTH
|
||||
#define LWS_WITH_HTTP_DIGEST_AUTH
|
||||
/* #undef LWS_WITH_HTTP_BROTLI */
|
||||
/* #undef LWS_HTTP_HEADERS_ALL */
|
||||
/* #undef LWS_WITH_HTTP_PROXY */
|
||||
/* #undef LWS_WITH_HTTP_STREAM_COMPRESSION */
|
||||
#define LWS_WITH_HTTP_UNCOMMON_HEADERS
|
||||
/* #undef LWS_WITH_IPV6 */
|
||||
/* #undef LWS_WITH_JOSE */
|
||||
/* #undef LWS_WITH_CBOR */
|
||||
#define LWS_WITH_CBOR_FLOAT
|
||||
#define LWS_WITH_JSONRPC
|
||||
#define LWS_WITH_LEJP
|
||||
#define LWS_WITH_LHP
|
||||
/* #undef LWS_WITH_LIBEV */
|
||||
/* #undef LWS_WITH_LIBEVENT */
|
||||
/* #undef LWS_WITH_LIBUV */
|
||||
/* #undef LWS_WITH_SDEVENT */
|
||||
#define LWS_WITH_LWSAC
|
||||
#define LWS_LOGS_TIMESTAMP
|
||||
/* #undef LWS_WITH_MBEDTLS */
|
||||
/* #undef LWS_WITH_MINIZ */
|
||||
#define LWS_WITH_NETLINK
|
||||
#define LWS_WITH_BINDTODEVICE
|
||||
#define LWS_WITH_NETWORK
|
||||
/* #undef LWS_WITH_NO_LOGS */
|
||||
/* #undef LWS_WITH_OTA */
|
||||
#define LWS_WITH_CACHE_NSCOOKIEJAR
|
||||
#define LWS_WITH_CLIENT
|
||||
#define LWS_WITHOUT_EXTENSIONS
|
||||
#define LWS_WITH_SERVER
|
||||
/* #undef LWS_WITH_SPAWN */
|
||||
/* #undef LWS_WITH_PEER_LIMITS */
|
||||
#define LWS_WITH_JPEG
|
||||
/* #undef LWS_WITH_PLUGINS */
|
||||
/* #undef LWS_WITH_PLUGINS_BUILTIN */
|
||||
/* #undef LWS_WITH_POLARSSL */
|
||||
#define LWS_WITH_POLL
|
||||
/* #undef LWS_WITH_RANGES */
|
||||
/* #undef LWS_WITH_RFC6724 */
|
||||
#define LWS_WITH_SECURE_STREAMS
|
||||
/* #undef LWS_WITH_SECURE_STREAMS_CPP */
|
||||
#define LWS_WITH_SECURE_STREAMS_SYS_AUTH_API_AMAZON_COM
|
||||
/* #undef LWS_WITH_SECURE_STREAMS_PROXY_API */
|
||||
/* #undef LWS_WITH_SECURE_STREAMS_STATIC_POLICY_ONLY */
|
||||
/* #undef LWS_WITH_SECURE_STREAMS_AUTH_SIGV4 */
|
||||
/* #undef LWS_WITH_SECURE_STREAMS_BUFFER_DUMP */
|
||||
/* #undef LWS_WITH_SS_DIRECT_PROTOCOL_STR */
|
||||
/* #undef LWS_WITH_SELFTESTS */
|
||||
/* #undef LWS_WITH_SEQUENCER */
|
||||
/* #undef LWS_WITH_SERVER_STATUS */
|
||||
#define LWS_WITH_SYS_SMD
|
||||
/* #undef LWS_WITH_SMTP */
|
||||
/* #undef LWS_WITH_SOCKS5 */
|
||||
/* #undef LWS_WITH_STATEFUL_URLDECODE */
|
||||
/* #undef LWS_WITH_STATS */
|
||||
/* #undef LWS_WITH_STRUCT_SQLITE3 */
|
||||
/* #undef LWS_WITH_STRUCT_JSON */
|
||||
/* #undef LWS_WITH_SUL_DEBUGGING */
|
||||
/* #undef LWS_WITH_SQLITE3 */
|
||||
/* #undef LWS_WITH_SYS_DHCP_CLIENT */
|
||||
/* #undef LWS_WITH_SYS_FAULT_INJECTION */
|
||||
/* #undef LWS_WITH_SYS_METRICS */
|
||||
/* #undef LWS_WITH_SYS_NTPCLIENT */
|
||||
#define LWS_WITH_SYS_STATE
|
||||
/* #undef LWS_HAVE_SYSTEMD_H */
|
||||
/* #undef LWS_WITHOUT_TEST_SERVER */
|
||||
/* #undef LWS_WITHOUT_TESTAPPS */
|
||||
/* #undef LWS_WITH_THREADPOOL */
|
||||
#define LWS_WITH_TLS
|
||||
/* #undef LWS_WITH_TLS_JIT_TRUST */
|
||||
#define LWS_WITH_TLS_SESSIONS
|
||||
#define LWS_WITH_UDP
|
||||
/* #undef LWS_WITH_ULOOP */
|
||||
#define LWS_WITH_UNIX_SOCK
|
||||
#define LWS_WITH_UPNG
|
||||
/* #undef LWS_WITH_ZIP_FOPS */
|
||||
/* #undef USE_OLD_CYASSL */
|
||||
/* #undef USE_WOLFSSL */
|
||||
/* #undef LWS_WITH_EVENT_LIBS */
|
||||
#define LWS_WITH_EVLIB_PLUGINS
|
||||
/* #undef LWS_WITH_LIBUV_INTERNAL */
|
||||
/* #undef LWS_WITH_PLUGINS_API */
|
||||
#define LWS_HAVE_RTA_PREF
|
||||
/* #undef PICO_SDK_PATH */
|
||||
#define LWS_HAVE_LINUX_IPV6_H
|
||||
Reference in New Issue
Block a user