1 | /* |
2 | * libwebsockets - small server side websockets and web server implementation |
3 | * |
4 | * Copyright (C) 2010 - 2019 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 | /** \defgroup callback-when-writeable Callback when writeable |
26 | * |
27 | * ##Callback When Writeable |
28 | * |
29 | * lws can only write data on a connection when it is able to accept more |
30 | * data without blocking. |
31 | * |
32 | * So a basic requirement is we should only use the lws_write() apis when the |
33 | * connection we want to write on says that he can accept more data. |
34 | * |
35 | * When lws cannot complete your send at the time, it will buffer the data |
36 | * and send it in the background, suppressing any further WRITEABLE callbacks |
37 | * on that connection until it completes. So it is important to write new |
38 | * things in a new writeable callback. |
39 | * |
40 | * These apis reflect the various ways we can indicate we would like to be |
41 | * called back when one or more connections is writeable. |
42 | */ |
43 | ///@{ |
44 | |
45 | /** |
46 | * lws_callback_on_writable() - Request a callback when this socket |
47 | * becomes able to be written to without |
48 | * blocking |
49 | * |
50 | * \param wsi: Websocket connection instance to get callback for |
51 | * |
52 | * - Which: only this wsi |
53 | * - When: when the individual connection becomes writeable |
54 | * - What: LWS_CALLBACK_*_WRITEABLE |
55 | */ |
56 | LWS_VISIBLE LWS_EXTERN int |
57 | lws_callback_on_writable(struct lws *wsi); |
58 | |
59 | /** |
60 | * lws_callback_on_writable_all_protocol() - Request a callback for all |
61 | * connections using the given protocol when it |
62 | * becomes possible to write to each socket without |
63 | * blocking in turn. |
64 | * |
65 | * \param context: lws_context |
66 | * \param protocol: Protocol whose connections will get callbacks |
67 | * |
68 | * - Which: connections using this protocol on ANY VHOST |
69 | * - When: when the individual connection becomes writeable |
70 | * - What: LWS_CALLBACK_*_WRITEABLE |
71 | */ |
72 | LWS_VISIBLE LWS_EXTERN int |
73 | lws_callback_on_writable_all_protocol(const struct lws_context *context, |
74 | const struct lws_protocols *protocol); |
75 | |
76 | /** |
77 | * lws_callback_on_writable_all_protocol_vhost() - Request a callback for |
78 | * all connections on same vhost using the given protocol |
79 | * when it becomes possible to write to each socket without |
80 | * blocking in turn. |
81 | * |
82 | * \param vhost: Only consider connections on this lws_vhost |
83 | * \param protocol: Protocol whose connections will get callbacks |
84 | * |
85 | * - Which: connections using this protocol on GIVEN VHOST ONLY |
86 | * - When: when the individual connection becomes writeable |
87 | * - What: LWS_CALLBACK_*_WRITEABLE |
88 | */ |
89 | LWS_VISIBLE LWS_EXTERN int |
90 | lws_callback_on_writable_all_protocol_vhost(const struct lws_vhost *vhost, |
91 | const struct lws_protocols *protocol); |
92 | |
93 | /** |
94 | * lws_callback_all_protocol() - Callback all connections using |
95 | * the given protocol with the given reason |
96 | * |
97 | * \param context: lws_context |
98 | * \param protocol: Protocol whose connections will get callbacks |
99 | * \param reason: Callback reason index |
100 | * |
101 | * - Which: connections using this protocol on ALL VHOSTS |
102 | * - When: before returning |
103 | * - What: reason |
104 | * |
105 | * This isn't normally what you want... normally any update of connection- |
106 | * specific information can wait until a network-related callback like rx, |
107 | * writable, or close. |
108 | */ |
109 | LWS_VISIBLE LWS_EXTERN int |
110 | lws_callback_all_protocol(struct lws_context *context, |
111 | const struct lws_protocols *protocol, int reason); |
112 | |
113 | /** |
114 | * lws_callback_all_protocol_vhost() - Callback all connections using |
115 | * the given protocol with the given reason. This is |
116 | * deprecated since v2.4: use lws_callback_all_protocol_vhost_args |
117 | * |
118 | * \param vh: Vhost whose connections will get callbacks |
119 | * \param protocol: Which protocol to match. NULL means all. |
120 | * \param reason: Callback reason index |
121 | * |
122 | * - Which: connections using this protocol on GIVEN VHOST ONLY |
123 | * - When: now |
124 | * - What: reason |
125 | */ |
126 | LWS_VISIBLE LWS_EXTERN int |
127 | lws_callback_all_protocol_vhost(struct lws_vhost *vh, |
128 | const struct lws_protocols *protocol, |
129 | int reason) |
130 | LWS_WARN_DEPRECATED; |
131 | |
132 | /** |
133 | * lws_callback_all_protocol_vhost_args() - Callback all connections using |
134 | * the given protocol with the given reason and args |
135 | * |
136 | * \param vh: Vhost whose connections will get callbacks |
137 | * \param protocol: Which protocol to match. NULL means all. |
138 | * \param reason: Callback reason index |
139 | * \param argp: Callback "in" parameter |
140 | * \param len: Callback "len" parameter |
141 | * |
142 | * - Which: connections using this protocol on GIVEN VHOST ONLY |
143 | * - When: now |
144 | * - What: reason |
145 | */ |
146 | LWS_VISIBLE int |
147 | lws_callback_all_protocol_vhost_args(struct lws_vhost *vh, |
148 | const struct lws_protocols *protocol, |
149 | int reason, void *argp, size_t len); |
150 | |
151 | /** |
152 | * lws_callback_vhost_protocols() - Callback all protocols enabled on a vhost |
153 | * with the given reason |
154 | * |
155 | * \param wsi: wsi whose vhost will get callbacks |
156 | * \param reason: Callback reason index |
157 | * \param in: in argument to callback |
158 | * \param len: len argument to callback |
159 | * |
160 | * - Which: connections using this protocol on same VHOST as wsi ONLY |
161 | * - When: now |
162 | * - What: reason |
163 | * |
164 | * This is deprecated since v2.5, use lws_callback_vhost_protocols_vhost() |
165 | * which takes the pointer to the vhost directly without using or needing the |
166 | * wsi. |
167 | */ |
168 | LWS_VISIBLE LWS_EXTERN int |
169 | lws_callback_vhost_protocols(struct lws *wsi, int reason, void *in, size_t len) |
170 | LWS_WARN_DEPRECATED; |
171 | |
172 | /** |
173 | * lws_callback_vhost_protocols_vhost() - Callback all protocols enabled on a vhost |
174 | * with the given reason |
175 | * |
176 | * \param vh: vhost that will get callbacks |
177 | * \param reason: Callback reason index |
178 | * \param in: in argument to callback |
179 | * \param len: len argument to callback |
180 | * |
181 | * - Which: connections using this protocol on same VHOST as wsi ONLY |
182 | * - When: now |
183 | * - What: reason |
184 | */ |
185 | LWS_VISIBLE LWS_EXTERN int |
186 | lws_callback_vhost_protocols_vhost(struct lws_vhost *vh, int reason, void *in, |
187 | size_t len); |
188 | |
189 | LWS_VISIBLE LWS_EXTERN int |
190 | lws_callback_http_dummy(struct lws *wsi, enum lws_callback_reasons reason, |
191 | void *user, void *in, size_t len); |
192 | |
193 | /** |
194 | * lws_get_socket_fd() - returns the socket file descriptor |
195 | * |
196 | * This is needed to use sendto() on UDP raw sockets |
197 | * |
198 | * \param wsi: Websocket connection instance |
199 | */ |
200 | LWS_VISIBLE LWS_EXTERN lws_sockfd_type |
201 | lws_get_socket_fd(struct lws *wsi); |
202 | |
203 | /** |
204 | * lws_get_peer_write_allowance() - get the amount of data writeable to peer |
205 | * if known |
206 | * |
207 | * \param wsi: Websocket connection instance |
208 | * |
209 | * if the protocol does not have any guidance, returns -1. Currently only |
210 | * http2 connections get send window information from this API. But your code |
211 | * should use it so it can work properly with any protocol. |
212 | * |
213 | * If nonzero return is the amount of payload data the peer or intermediary has |
214 | * reported it has buffer space for. That has NO relationship with the amount |
215 | * of buffer space your OS can accept on this connection for a write action. |
216 | * |
217 | * This number represents the maximum you could send to the peer or intermediary |
218 | * on this connection right now without the protocol complaining. |
219 | * |
220 | * lws manages accounting for send window updates and payload writes |
221 | * automatically, so this number reflects the situation at the peer or |
222 | * intermediary dynamically. |
223 | */ |
224 | LWS_VISIBLE LWS_EXTERN lws_fileofs_t |
225 | lws_get_peer_write_allowance(struct lws *wsi); |
226 | |
227 | /** |
228 | * lws_wsi_tx_credit() - get / set generic tx credit if role supports it |
229 | * |
230 | * \param wsi: connection to set / get tx credit on |
231 | * \param peer_to_us: 0 = set / get us-to-peer direction, else peer-to-us |
232 | * \param add: amount of credit to add |
233 | * |
234 | * If the wsi does not support tx credit, returns 0. |
235 | * |
236 | * If add is zero, returns one of the wsi tx credit values for the wsi. |
237 | * If add is nonzero, \p add is added to the selected tx credit value |
238 | * for the wsi. |
239 | */ |
240 | #define LWSTXCR_US_TO_PEER 0 |
241 | #define LWSTXCR_PEER_TO_US 1 |
242 | |
243 | LWS_VISIBLE LWS_EXTERN int |
244 | lws_wsi_tx_credit(struct lws *wsi, char peer_to_us, int add); |
245 | |
246 | ///@} |
247 | |