libwebsockets
Lightweight C library for HTML5 websockets
lws-smd.h
1 /*
2  * lws System Message Distribution
3  *
4  * Copyright (C) 2010 - 2020 Andy Green <andy@warmcat.com>
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a copy
7  * of this software and associated documentation files (the "Software"), to
8  * deal in the Software without restriction, including without limitation the
9  * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10  * sell copies of the Software, and to permit persons to whom the Software is
11  * furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included in
14  * all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
22  * IN THE SOFTWARE.
23  */
24 
25 #define LWS_SMD_MAX_PAYLOAD 384
26 #define LWS_SMD_CLASS_BITFIELD_BYTES 4
27 
28 #define LWS_SMD_STREAMTYPENAME "_lws_smd"
29 #define LWS_SMD_SS_RX_HEADER_LEN 16
30 
31 typedef uint32_t lws_smd_class_t;
32 
33 struct lws_smd_msg; /* opaque */
34 struct lws_smd_peer; /* opaque */
35 
36 /*
37  * Well-known device classes
38  */
39 
40 enum {
41  LWSSMDCL_INTERACTION = (1 << 0),
46  LWSSMDCL_SYSTEM_STATE = (1 << 1),
50  LWSSMDCL_NETWORK = (1 << 2),
55  LWSSMDCL_METRICS = (1 << 3),
61  LWSSMDCL_USER_BASE_BITNUM = 24
62 };
63 
85 LWS_VISIBLE LWS_EXTERN void * /* payload */
86 lws_smd_msg_alloc(struct lws_context *ctx, lws_smd_class_t _class, size_t len);
87 
99 LWS_VISIBLE LWS_EXTERN void
100 lws_smd_msg_free(void **payload);
101 
112 LWS_VISIBLE LWS_EXTERN int
113 lws_smd_msg_send(struct lws_context *ctx, void *payload);
114 
136 LWS_VISIBLE LWS_EXTERN int
137 lws_smd_msg_printf(struct lws_context *ctx, lws_smd_class_t _class,
138  const char *format, ...) LWS_FORMAT(3);
139 
156 struct lws_ss_handle;
157 LWS_VISIBLE LWS_EXTERN int
158 lws_smd_ss_msg_printf(const char *tag, uint8_t *buf, size_t *len,
159  lws_smd_class_t _class, const char *format, ...)
160  LWS_FORMAT(5);
161 
179 LWS_VISIBLE LWS_EXTERN int
180 lws_smd_ss_rx_forward(void *ss_user, const uint8_t *buf, size_t len);
181 
182 LWS_VISIBLE LWS_EXTERN int
183 lws_smd_sspc_rx_forward(void *ss_user, const uint8_t *buf, size_t len);
184 
185 typedef int (*lws_smd_notification_cb_t)(void *opaque, lws_smd_class_t _class,
186  lws_usec_t timestamp, void *buf,
187  size_t len);
188 
189 #define LWSSMDREG_FLAG_PROXIED_SS (1 << 0)
192 /*
193  * lws_smd_register() - register to receive smd messages
194  *
195  * \param ctx: the lws_context
196  * \param opaque: an opaque pointer handed to the callback
197  * \param flags: typically 0
198  * \param _class_filter: bitmap of message classes we care about
199  * \param cb: the callback to receive messages
200  *
201  * Queues an allocated, prepared message for delivery to smd clients.
202  *
203  * Returns NULL on failure, or an opaque handle which may be given to
204  * lws_smd_unregister() to stop participating in the shared message queue.
205  *
206  * This is threadsafe to call from a non-service thread.
207  */
208 
209 LWS_VISIBLE LWS_EXTERN struct lws_smd_peer *
210 lws_smd_register(struct lws_context *ctx, void *opaque, int flags,
211  lws_smd_class_t _class_filter, lws_smd_notification_cb_t cb);
212 
213 /*
214  * lws_smd_unregister() - unregister receiving smd messages
215  *
216  * \param pr: the handle returned from the registration
217  *
218  * Destroys the registration of the callback for messages and ability to send
219  * messages.
220  *
221  * It's not necessary to call this if the registration wants to survive for as
222  * long as the lws_context... lws_context_destroy will also clean up any
223  * registrations still active by then.
224  */
225 
226 LWS_VISIBLE LWS_EXTERN void
227 lws_smd_unregister(struct lws_smd_peer *pr);