| 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 | |