1*1c60b9acSAndroid Build Coastguard Worker /* 2*1c60b9acSAndroid Build Coastguard Worker * libwebsockets - small server side websockets and web server implementation 3*1c60b9acSAndroid Build Coastguard Worker * 4*1c60b9acSAndroid Build Coastguard Worker * Copyright (C) 2010 - 2019 Andy Green <[email protected]> 5*1c60b9acSAndroid Build Coastguard Worker * 6*1c60b9acSAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a copy 7*1c60b9acSAndroid Build Coastguard Worker * of this software and associated documentation files (the "Software"), to 8*1c60b9acSAndroid Build Coastguard Worker * deal in the Software without restriction, including without limitation the 9*1c60b9acSAndroid Build Coastguard Worker * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 10*1c60b9acSAndroid Build Coastguard Worker * sell copies of the Software, and to permit persons to whom the Software is 11*1c60b9acSAndroid Build Coastguard Worker * furnished to do so, subject to the following conditions: 12*1c60b9acSAndroid Build Coastguard Worker * 13*1c60b9acSAndroid Build Coastguard Worker * The above copyright notice and this permission notice shall be included in 14*1c60b9acSAndroid Build Coastguard Worker * all copies or substantial portions of the Software. 15*1c60b9acSAndroid Build Coastguard Worker * 16*1c60b9acSAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17*1c60b9acSAndroid Build Coastguard Worker * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18*1c60b9acSAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19*1c60b9acSAndroid Build Coastguard Worker * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20*1c60b9acSAndroid Build Coastguard Worker * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21*1c60b9acSAndroid Build Coastguard Worker * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 22*1c60b9acSAndroid Build Coastguard Worker * IN THE SOFTWARE. 23*1c60b9acSAndroid Build Coastguard Worker */ 24*1c60b9acSAndroid Build Coastguard Worker 25*1c60b9acSAndroid Build Coastguard Worker extern const struct lws_role_ops role_ops_h2; 26*1c60b9acSAndroid Build Coastguard Worker #define lwsi_role_h2(wsi) (wsi->role_ops == &role_ops_h2) 27*1c60b9acSAndroid Build Coastguard Worker 28*1c60b9acSAndroid Build Coastguard Worker struct http2_settings { 29*1c60b9acSAndroid Build Coastguard Worker uint32_t s[H2SET_COUNT]; 30*1c60b9acSAndroid Build Coastguard Worker }; 31*1c60b9acSAndroid Build Coastguard Worker 32*1c60b9acSAndroid Build Coastguard Worker struct lws_vhost_role_h2 { 33*1c60b9acSAndroid Build Coastguard Worker struct http2_settings set; 34*1c60b9acSAndroid Build Coastguard Worker }; 35*1c60b9acSAndroid Build Coastguard Worker 36*1c60b9acSAndroid Build Coastguard Worker enum lws_h2_wellknown_frame_types { 37*1c60b9acSAndroid Build Coastguard Worker LWS_H2_FRAME_TYPE_DATA, 38*1c60b9acSAndroid Build Coastguard Worker LWS_H2_FRAME_TYPE_HEADERS, 39*1c60b9acSAndroid Build Coastguard Worker LWS_H2_FRAME_TYPE_PRIORITY, 40*1c60b9acSAndroid Build Coastguard Worker LWS_H2_FRAME_TYPE_RST_STREAM, 41*1c60b9acSAndroid Build Coastguard Worker LWS_H2_FRAME_TYPE_SETTINGS, 42*1c60b9acSAndroid Build Coastguard Worker LWS_H2_FRAME_TYPE_PUSH_PROMISE, 43*1c60b9acSAndroid Build Coastguard Worker LWS_H2_FRAME_TYPE_PING, 44*1c60b9acSAndroid Build Coastguard Worker LWS_H2_FRAME_TYPE_GOAWAY, 45*1c60b9acSAndroid Build Coastguard Worker LWS_H2_FRAME_TYPE_WINDOW_UPDATE, 46*1c60b9acSAndroid Build Coastguard Worker LWS_H2_FRAME_TYPE_CONTINUATION, 47*1c60b9acSAndroid Build Coastguard Worker 48*1c60b9acSAndroid Build Coastguard Worker LWS_H2_FRAME_TYPE_COUNT /* always last */ 49*1c60b9acSAndroid Build Coastguard Worker }; 50*1c60b9acSAndroid Build Coastguard Worker 51*1c60b9acSAndroid Build Coastguard Worker enum lws_h2_flags { 52*1c60b9acSAndroid Build Coastguard Worker LWS_H2_FLAG_END_STREAM = 1, 53*1c60b9acSAndroid Build Coastguard Worker LWS_H2_FLAG_END_HEADERS = 4, 54*1c60b9acSAndroid Build Coastguard Worker LWS_H2_FLAG_PADDED = 8, 55*1c60b9acSAndroid Build Coastguard Worker LWS_H2_FLAG_PRIORITY = 0x20, 56*1c60b9acSAndroid Build Coastguard Worker 57*1c60b9acSAndroid Build Coastguard Worker LWS_H2_FLAG_SETTINGS_ACK = 1, 58*1c60b9acSAndroid Build Coastguard Worker }; 59*1c60b9acSAndroid Build Coastguard Worker 60*1c60b9acSAndroid Build Coastguard Worker enum lws_h2_errors { 61*1c60b9acSAndroid Build Coastguard Worker H2_ERR_NO_ERROR, /* Graceful shutdown */ 62*1c60b9acSAndroid Build Coastguard Worker H2_ERR_PROTOCOL_ERROR, /* Protocol error detected */ 63*1c60b9acSAndroid Build Coastguard Worker H2_ERR_INTERNAL_ERROR, /* Implementation fault */ 64*1c60b9acSAndroid Build Coastguard Worker H2_ERR_FLOW_CONTROL_ERROR, /* Flow-control limits exceeded */ 65*1c60b9acSAndroid Build Coastguard Worker H2_ERR_SETTINGS_TIMEOUT, /* Settings not acknowledged */ 66*1c60b9acSAndroid Build Coastguard Worker H2_ERR_STREAM_CLOSED, /* Frame received for closed stream */ 67*1c60b9acSAndroid Build Coastguard Worker H2_ERR_FRAME_SIZE_ERROR, /* Frame size incorrect */ 68*1c60b9acSAndroid Build Coastguard Worker H2_ERR_REFUSED_STREAM, /* Stream not processed */ 69*1c60b9acSAndroid Build Coastguard Worker H2_ERR_CANCEL, /* Stream cancelled */ 70*1c60b9acSAndroid Build Coastguard Worker H2_ERR_COMPRESSION_ERROR, /* Compression state not updated */ 71*1c60b9acSAndroid Build Coastguard Worker H2_ERR_CONNECT_ERROR, /* TCP connection error for CONNECT method */ 72*1c60b9acSAndroid Build Coastguard Worker H2_ERR_ENHANCE_YOUR_CALM, /* Processing capacity exceeded */ 73*1c60b9acSAndroid Build Coastguard Worker H2_ERR_INADEQUATE_SECURITY, /* Negotiated TLS parameters not acceptable */ 74*1c60b9acSAndroid Build Coastguard Worker H2_ERR_HTTP_1_1_REQUIRED, /* Use HTTP/1.1 for the request */ 75*1c60b9acSAndroid Build Coastguard Worker }; 76*1c60b9acSAndroid Build Coastguard Worker 77*1c60b9acSAndroid Build Coastguard Worker enum lws_h2_states { 78*1c60b9acSAndroid Build Coastguard Worker LWS_H2_STATE_IDLE, 79*1c60b9acSAndroid Build Coastguard Worker /* 80*1c60b9acSAndroid Build Coastguard Worker * Send PUSH_PROMISE -> LWS_H2_STATE_RESERVED_LOCAL 81*1c60b9acSAndroid Build Coastguard Worker * Recv PUSH_PROMISE -> LWS_H2_STATE_RESERVED_REMOTE 82*1c60b9acSAndroid Build Coastguard Worker * Send HEADERS -> LWS_H2_STATE_OPEN 83*1c60b9acSAndroid Build Coastguard Worker * Recv HEADERS -> LWS_H2_STATE_OPEN 84*1c60b9acSAndroid Build Coastguard Worker * 85*1c60b9acSAndroid Build Coastguard Worker * - Only PUSH_PROMISE + HEADERS valid to send 86*1c60b9acSAndroid Build Coastguard Worker * - Only HEADERS or PRIORITY valid to receive 87*1c60b9acSAndroid Build Coastguard Worker */ 88*1c60b9acSAndroid Build Coastguard Worker LWS_H2_STATE_RESERVED_LOCAL, 89*1c60b9acSAndroid Build Coastguard Worker /* 90*1c60b9acSAndroid Build Coastguard Worker * Send RST_STREAM -> LWS_H2_STATE_CLOSED 91*1c60b9acSAndroid Build Coastguard Worker * Recv RST_STREAM -> LWS_H2_STATE_CLOSED 92*1c60b9acSAndroid Build Coastguard Worker * Send HEADERS -> LWS_H2_STATE_HALF_CLOSED_REMOTE 93*1c60b9acSAndroid Build Coastguard Worker * 94*1c60b9acSAndroid Build Coastguard Worker * - Only HEADERS, RST_STREAM, or PRIORITY valid to send 95*1c60b9acSAndroid Build Coastguard Worker * - Only RST_STREAM, PRIORITY, or WINDOW_UPDATE valid to receive 96*1c60b9acSAndroid Build Coastguard Worker */ 97*1c60b9acSAndroid Build Coastguard Worker LWS_H2_STATE_RESERVED_REMOTE, 98*1c60b9acSAndroid Build Coastguard Worker /* 99*1c60b9acSAndroid Build Coastguard Worker * Send RST_STREAM -> LWS_H2_STATE_CLOSED 100*1c60b9acSAndroid Build Coastguard Worker * Recv RST_STREAM -> LWS_H2_STATE_CLOSED 101*1c60b9acSAndroid Build Coastguard Worker * Recv HEADERS -> LWS_H2_STATE_HALF_CLOSED_LOCAL 102*1c60b9acSAndroid Build Coastguard Worker * 103*1c60b9acSAndroid Build Coastguard Worker * - Only RST_STREAM, WINDOW_UPDATE, or PRIORITY valid to send 104*1c60b9acSAndroid Build Coastguard Worker * - Only HEADERS, RST_STREAM, or PRIORITY valid to receive 105*1c60b9acSAndroid Build Coastguard Worker */ 106*1c60b9acSAndroid Build Coastguard Worker LWS_H2_STATE_OPEN, 107*1c60b9acSAndroid Build Coastguard Worker /* 108*1c60b9acSAndroid Build Coastguard Worker * Send RST_STREAM -> LWS_H2_STATE_CLOSED 109*1c60b9acSAndroid Build Coastguard Worker * Recv RST_STREAM -> LWS_H2_STATE_CLOSED 110*1c60b9acSAndroid Build Coastguard Worker * Send END_STREAM flag -> LWS_H2_STATE_HALF_CLOSED_LOCAL 111*1c60b9acSAndroid Build Coastguard Worker * Recv END_STREAM flag -> LWS_H2_STATE_HALF_CLOSED_REMOTE 112*1c60b9acSAndroid Build Coastguard Worker */ 113*1c60b9acSAndroid Build Coastguard Worker LWS_H2_STATE_HALF_CLOSED_REMOTE, 114*1c60b9acSAndroid Build Coastguard Worker /* 115*1c60b9acSAndroid Build Coastguard Worker * Send RST_STREAM -> LWS_H2_STATE_CLOSED 116*1c60b9acSAndroid Build Coastguard Worker * Recv RST_STREAM -> LWS_H2_STATE_CLOSED 117*1c60b9acSAndroid Build Coastguard Worker * Send END_STREAM flag -> LWS_H2_STATE_CLOSED 118*1c60b9acSAndroid Build Coastguard Worker * 119*1c60b9acSAndroid Build Coastguard Worker * - Any frame valid to send 120*1c60b9acSAndroid Build Coastguard Worker * - Only WINDOW_UPDATE, PRIORITY, or RST_STREAM valid to receive 121*1c60b9acSAndroid Build Coastguard Worker */ 122*1c60b9acSAndroid Build Coastguard Worker LWS_H2_STATE_HALF_CLOSED_LOCAL, 123*1c60b9acSAndroid Build Coastguard Worker /* 124*1c60b9acSAndroid Build Coastguard Worker * Send RST_STREAM -> LWS_H2_STATE_CLOSED 125*1c60b9acSAndroid Build Coastguard Worker * Recv RST_STREAM -> LWS_H2_STATE_CLOSED 126*1c60b9acSAndroid Build Coastguard Worker * Recv END_STREAM flag -> LWS_H2_STATE_CLOSED 127*1c60b9acSAndroid Build Coastguard Worker * 128*1c60b9acSAndroid Build Coastguard Worker * - Only WINDOW_UPDATE, PRIORITY, and RST_STREAM valid to send 129*1c60b9acSAndroid Build Coastguard Worker * - Any frame valid to receive 130*1c60b9acSAndroid Build Coastguard Worker */ 131*1c60b9acSAndroid Build Coastguard Worker LWS_H2_STATE_CLOSED, 132*1c60b9acSAndroid Build Coastguard Worker /* 133*1c60b9acSAndroid Build Coastguard Worker * - Only PRIORITY, WINDOW_UPDATE (IGNORE) and RST_STREAM (IGNORE) 134*1c60b9acSAndroid Build Coastguard Worker * may be received 135*1c60b9acSAndroid Build Coastguard Worker * 136*1c60b9acSAndroid Build Coastguard Worker * - Only PRIORITY valid to send 137*1c60b9acSAndroid Build Coastguard Worker */ 138*1c60b9acSAndroid Build Coastguard Worker }; 139*1c60b9acSAndroid Build Coastguard Worker 140*1c60b9acSAndroid Build Coastguard Worker void 141*1c60b9acSAndroid Build Coastguard Worker lws_h2_state(struct lws *wsi, enum lws_h2_states s); 142*1c60b9acSAndroid Build Coastguard Worker 143*1c60b9acSAndroid Build Coastguard Worker #define LWS_H2_STREAM_ID_MASTER 0 144*1c60b9acSAndroid Build Coastguard Worker #define LWS_H2_SETTINGS_LEN 6 145*1c60b9acSAndroid Build Coastguard Worker #define LWS_H2_FLAG_SETTINGS_ACK 1 146*1c60b9acSAndroid Build Coastguard Worker 147*1c60b9acSAndroid Build Coastguard Worker enum http2_hpack_state { 148*1c60b9acSAndroid Build Coastguard Worker HPKS_TYPE, 149*1c60b9acSAndroid Build Coastguard Worker 150*1c60b9acSAndroid Build Coastguard Worker HPKS_IDX_EXT, 151*1c60b9acSAndroid Build Coastguard Worker 152*1c60b9acSAndroid Build Coastguard Worker HPKS_HLEN, 153*1c60b9acSAndroid Build Coastguard Worker HPKS_HLEN_EXT, 154*1c60b9acSAndroid Build Coastguard Worker 155*1c60b9acSAndroid Build Coastguard Worker HPKS_DATA, 156*1c60b9acSAndroid Build Coastguard Worker }; 157*1c60b9acSAndroid Build Coastguard Worker 158*1c60b9acSAndroid Build Coastguard Worker /* 159*1c60b9acSAndroid Build Coastguard Worker * lws general parsimonious header strategy is only store values from known 160*1c60b9acSAndroid Build Coastguard Worker * headers, and refer to them by index. 161*1c60b9acSAndroid Build Coastguard Worker * 162*1c60b9acSAndroid Build Coastguard Worker * That means if we can't map the peer header name to one that lws knows, we 163*1c60b9acSAndroid Build Coastguard Worker * will drop the content but track the indexing with associated_lws_hdr_idx = 164*1c60b9acSAndroid Build Coastguard Worker * LWS_HPACK_IGNORE_ENTRY. 165*1c60b9acSAndroid Build Coastguard Worker */ 166*1c60b9acSAndroid Build Coastguard Worker 167*1c60b9acSAndroid Build Coastguard Worker enum http2_hpack_type { 168*1c60b9acSAndroid Build Coastguard Worker HPKT_INDEXED_HDR_7, /* 1xxxxxxx: just "header field" */ 169*1c60b9acSAndroid Build Coastguard Worker HPKT_INDEXED_HDR_6_VALUE_INCR, /* 01xxxxxx: NEW indexed hdr with value */ 170*1c60b9acSAndroid Build Coastguard Worker HPKT_LITERAL_HDR_VALUE_INCR, /* 01000000: NEW literal hdr with value */ 171*1c60b9acSAndroid Build Coastguard Worker HPKT_INDEXED_HDR_4_VALUE, /* 0000xxxx: indexed hdr with value */ 172*1c60b9acSAndroid Build Coastguard Worker HPKT_INDEXED_HDR_4_VALUE_NEVER, /* 0001xxxx: indexed hdr with value NEVER NEW */ 173*1c60b9acSAndroid Build Coastguard Worker HPKT_LITERAL_HDR_VALUE, /* 00000000: literal hdr with value */ 174*1c60b9acSAndroid Build Coastguard Worker HPKT_LITERAL_HDR_VALUE_NEVER, /* 00010000: literal hdr with value NEVER NEW */ 175*1c60b9acSAndroid Build Coastguard Worker HPKT_SIZE_5 176*1c60b9acSAndroid Build Coastguard Worker }; 177*1c60b9acSAndroid Build Coastguard Worker 178*1c60b9acSAndroid Build Coastguard Worker #define LWS_HPACK_IGNORE_ENTRY 0xffff 179*1c60b9acSAndroid Build Coastguard Worker 180*1c60b9acSAndroid Build Coastguard Worker 181*1c60b9acSAndroid Build Coastguard Worker struct hpack_dt_entry { 182*1c60b9acSAndroid Build Coastguard Worker char *value; /* malloc'd */ 183*1c60b9acSAndroid Build Coastguard Worker uint16_t value_len; 184*1c60b9acSAndroid Build Coastguard Worker uint16_t hdr_len; /* virtual, for accounting */ 185*1c60b9acSAndroid Build Coastguard Worker uint16_t lws_hdr_idx; /* LWS_HPACK_IGNORE_ENTRY = IGNORE */ 186*1c60b9acSAndroid Build Coastguard Worker }; 187*1c60b9acSAndroid Build Coastguard Worker 188*1c60b9acSAndroid Build Coastguard Worker struct hpack_dynamic_table { 189*1c60b9acSAndroid Build Coastguard Worker struct hpack_dt_entry *entries; /* malloc'd */ 190*1c60b9acSAndroid Build Coastguard Worker uint32_t virtual_payload_usage; 191*1c60b9acSAndroid Build Coastguard Worker uint32_t virtual_payload_max; 192*1c60b9acSAndroid Build Coastguard Worker uint16_t pos; 193*1c60b9acSAndroid Build Coastguard Worker uint16_t used_entries; 194*1c60b9acSAndroid Build Coastguard Worker uint16_t num_entries; 195*1c60b9acSAndroid Build Coastguard Worker }; 196*1c60b9acSAndroid Build Coastguard Worker 197*1c60b9acSAndroid Build Coastguard Worker enum lws_h2_protocol_send_type { 198*1c60b9acSAndroid Build Coastguard Worker LWS_PPS_NONE, 199*1c60b9acSAndroid Build Coastguard Worker LWS_H2_PPS_MY_SETTINGS, 200*1c60b9acSAndroid Build Coastguard Worker LWS_H2_PPS_ACK_SETTINGS, 201*1c60b9acSAndroid Build Coastguard Worker LWS_H2_PPS_PING, 202*1c60b9acSAndroid Build Coastguard Worker LWS_H2_PPS_PONG, 203*1c60b9acSAndroid Build Coastguard Worker LWS_H2_PPS_GOAWAY, 204*1c60b9acSAndroid Build Coastguard Worker LWS_H2_PPS_RST_STREAM, 205*1c60b9acSAndroid Build Coastguard Worker LWS_H2_PPS_UPDATE_WINDOW, 206*1c60b9acSAndroid Build Coastguard Worker LWS_H2_PPS_SETTINGS_INITIAL_UPDATE_WINDOW 207*1c60b9acSAndroid Build Coastguard Worker }; 208*1c60b9acSAndroid Build Coastguard Worker 209*1c60b9acSAndroid Build Coastguard Worker struct lws_h2_protocol_send { 210*1c60b9acSAndroid Build Coastguard Worker struct lws_h2_protocol_send *next; /* linked list */ 211*1c60b9acSAndroid Build Coastguard Worker enum lws_h2_protocol_send_type type; 212*1c60b9acSAndroid Build Coastguard Worker 213*1c60b9acSAndroid Build Coastguard Worker union uu { 214*1c60b9acSAndroid Build Coastguard Worker struct { 215*1c60b9acSAndroid Build Coastguard Worker char str[32]; 216*1c60b9acSAndroid Build Coastguard Worker uint32_t highest_sid; 217*1c60b9acSAndroid Build Coastguard Worker uint32_t err; 218*1c60b9acSAndroid Build Coastguard Worker } ga; 219*1c60b9acSAndroid Build Coastguard Worker struct { 220*1c60b9acSAndroid Build Coastguard Worker uint32_t sid; 221*1c60b9acSAndroid Build Coastguard Worker uint32_t err; 222*1c60b9acSAndroid Build Coastguard Worker } rs; 223*1c60b9acSAndroid Build Coastguard Worker struct { 224*1c60b9acSAndroid Build Coastguard Worker uint8_t ping_payload[8]; 225*1c60b9acSAndroid Build Coastguard Worker } ping; 226*1c60b9acSAndroid Build Coastguard Worker struct { 227*1c60b9acSAndroid Build Coastguard Worker uint32_t sid; 228*1c60b9acSAndroid Build Coastguard Worker uint32_t credit; 229*1c60b9acSAndroid Build Coastguard Worker } update_window; 230*1c60b9acSAndroid Build Coastguard Worker } u; 231*1c60b9acSAndroid Build Coastguard Worker }; 232*1c60b9acSAndroid Build Coastguard Worker 233*1c60b9acSAndroid Build Coastguard Worker struct lws_h2_ghost_sid { 234*1c60b9acSAndroid Build Coastguard Worker struct lws_h2_ghost_sid *next; 235*1c60b9acSAndroid Build Coastguard Worker uint32_t sid; 236*1c60b9acSAndroid Build Coastguard Worker }; 237*1c60b9acSAndroid Build Coastguard Worker 238*1c60b9acSAndroid Build Coastguard Worker /* 239*1c60b9acSAndroid Build Coastguard Worker * http/2 connection info that is only used by the root connection that has 240*1c60b9acSAndroid Build Coastguard Worker * the network connection. 241*1c60b9acSAndroid Build Coastguard Worker * 242*1c60b9acSAndroid Build Coastguard Worker * h2 tends to spawn many child connections from one network connection, so 243*1c60b9acSAndroid Build Coastguard Worker * it's necessary to make members only needed by the network connection 244*1c60b9acSAndroid Build Coastguard Worker * distinct and only malloc'd on network connections. 245*1c60b9acSAndroid Build Coastguard Worker * 246*1c60b9acSAndroid Build Coastguard Worker * There's only one HPACK parser per network connection. 247*1c60b9acSAndroid Build Coastguard Worker * 248*1c60b9acSAndroid Build Coastguard Worker * But there is an ah per logical child connection... the network connection 249*1c60b9acSAndroid Build Coastguard Worker * fills it but it belongs to the logical child. 250*1c60b9acSAndroid Build Coastguard Worker */ 251*1c60b9acSAndroid Build Coastguard Worker struct lws_h2_netconn { 252*1c60b9acSAndroid Build Coastguard Worker struct http2_settings our_set; 253*1c60b9acSAndroid Build Coastguard Worker struct http2_settings peer_set; 254*1c60b9acSAndroid Build Coastguard Worker struct hpack_dynamic_table hpack_dyn_table; 255*1c60b9acSAndroid Build Coastguard Worker uint8_t ping_payload[8]; 256*1c60b9acSAndroid Build Coastguard Worker uint8_t one_setting[LWS_H2_SETTINGS_LEN]; 257*1c60b9acSAndroid Build Coastguard Worker char goaway_str[32]; /* for rx */ 258*1c60b9acSAndroid Build Coastguard Worker struct lws *swsi; 259*1c60b9acSAndroid Build Coastguard Worker struct lws_h2_protocol_send *pps; /* linked list */ 260*1c60b9acSAndroid Build Coastguard Worker 261*1c60b9acSAndroid Build Coastguard Worker enum http2_hpack_state hpack; 262*1c60b9acSAndroid Build Coastguard Worker enum http2_hpack_type hpack_type; 263*1c60b9acSAndroid Build Coastguard Worker 264*1c60b9acSAndroid Build Coastguard Worker unsigned int huff:1; 265*1c60b9acSAndroid Build Coastguard Worker unsigned int value:1; 266*1c60b9acSAndroid Build Coastguard Worker unsigned int unknown_header:1; 267*1c60b9acSAndroid Build Coastguard Worker unsigned int cont_exp:1; 268*1c60b9acSAndroid Build Coastguard Worker unsigned int cont_exp_headers:1; 269*1c60b9acSAndroid Build Coastguard Worker unsigned int we_told_goaway:1; 270*1c60b9acSAndroid Build Coastguard Worker unsigned int pad_length:1; 271*1c60b9acSAndroid Build Coastguard Worker unsigned int collected_priority:1; 272*1c60b9acSAndroid Build Coastguard Worker unsigned int is_first_header_char:1; 273*1c60b9acSAndroid Build Coastguard Worker unsigned int zero_huff_padding:1; 274*1c60b9acSAndroid Build Coastguard Worker unsigned int last_action_dyntable_resize:1; 275*1c60b9acSAndroid Build Coastguard Worker unsigned int sent_preface:1; 276*1c60b9acSAndroid Build Coastguard Worker 277*1c60b9acSAndroid Build Coastguard Worker uint32_t hdr_idx; 278*1c60b9acSAndroid Build Coastguard Worker uint32_t hpack_len; 279*1c60b9acSAndroid Build Coastguard Worker uint32_t hpack_e_dep; 280*1c60b9acSAndroid Build Coastguard Worker uint32_t count; 281*1c60b9acSAndroid Build Coastguard Worker uint32_t preamble; 282*1c60b9acSAndroid Build Coastguard Worker uint32_t length; 283*1c60b9acSAndroid Build Coastguard Worker uint32_t sid; 284*1c60b9acSAndroid Build Coastguard Worker uint32_t inside; 285*1c60b9acSAndroid Build Coastguard Worker uint32_t highest_sid; 286*1c60b9acSAndroid Build Coastguard Worker uint32_t highest_sid_opened; 287*1c60b9acSAndroid Build Coastguard Worker uint32_t cont_exp_sid; 288*1c60b9acSAndroid Build Coastguard Worker uint32_t dep; 289*1c60b9acSAndroid Build Coastguard Worker uint32_t goaway_last_sid; 290*1c60b9acSAndroid Build Coastguard Worker uint32_t goaway_err; 291*1c60b9acSAndroid Build Coastguard Worker uint32_t hpack_hdr_len; 292*1c60b9acSAndroid Build Coastguard Worker 293*1c60b9acSAndroid Build Coastguard Worker uint16_t hpack_pos; 294*1c60b9acSAndroid Build Coastguard Worker 295*1c60b9acSAndroid Build Coastguard Worker uint8_t frame_state; 296*1c60b9acSAndroid Build Coastguard Worker uint8_t type; 297*1c60b9acSAndroid Build Coastguard Worker uint8_t flags; 298*1c60b9acSAndroid Build Coastguard Worker uint8_t padding; 299*1c60b9acSAndroid Build Coastguard Worker uint8_t weight_temp; 300*1c60b9acSAndroid Build Coastguard Worker uint8_t huff_pad; 301*1c60b9acSAndroid Build Coastguard Worker char first_hdr_char; 302*1c60b9acSAndroid Build Coastguard Worker uint8_t hpack_m; 303*1c60b9acSAndroid Build Coastguard Worker uint8_t ext_count; 304*1c60b9acSAndroid Build Coastguard Worker }; 305*1c60b9acSAndroid Build Coastguard Worker 306*1c60b9acSAndroid Build Coastguard Worker struct _lws_h2_related { 307*1c60b9acSAndroid Build Coastguard Worker 308*1c60b9acSAndroid Build Coastguard Worker struct lws_h2_netconn *h2n; /* malloc'd for root net conn */ 309*1c60b9acSAndroid Build Coastguard Worker 310*1c60b9acSAndroid Build Coastguard Worker char *pending_status_body; 311*1c60b9acSAndroid Build Coastguard Worker 312*1c60b9acSAndroid Build Coastguard Worker uint8_t h2_state; /* RFC7540 state of the connection */ 313*1c60b9acSAndroid Build Coastguard Worker 314*1c60b9acSAndroid Build Coastguard Worker uint8_t END_STREAM:1; 315*1c60b9acSAndroid Build Coastguard Worker uint8_t END_HEADERS:1; 316*1c60b9acSAndroid Build Coastguard Worker uint8_t send_END_STREAM:1; 317*1c60b9acSAndroid Build Coastguard Worker uint8_t long_poll:1; 318*1c60b9acSAndroid Build Coastguard Worker uint8_t initialized:1; 319*1c60b9acSAndroid Build Coastguard Worker }; 320*1c60b9acSAndroid Build Coastguard Worker 321*1c60b9acSAndroid Build Coastguard Worker #define HTTP2_IS_TOPLEVEL_WSI(wsi) (!wsi->mux.parent_wsi) 322*1c60b9acSAndroid Build Coastguard Worker 323*1c60b9acSAndroid Build Coastguard Worker int 324*1c60b9acSAndroid Build Coastguard Worker lws_h2_rst_stream(struct lws *wsi, uint32_t err, const char *reason); 325*1c60b9acSAndroid Build Coastguard Worker struct lws * lws_h2_get_nth_child(struct lws *wsi, int n); 326*1c60b9acSAndroid Build Coastguard Worker void lws_h2_init(struct lws *wsi); 327*1c60b9acSAndroid Build Coastguard Worker int 328*1c60b9acSAndroid Build Coastguard Worker lws_h2_settings(struct lws *nwsi, struct http2_settings *settings, 329*1c60b9acSAndroid Build Coastguard Worker unsigned char *buf, int len); 330*1c60b9acSAndroid Build Coastguard Worker int 331*1c60b9acSAndroid Build Coastguard Worker lws_h2_parser(struct lws *wsi, unsigned char *in, lws_filepos_t inlen, 332*1c60b9acSAndroid Build Coastguard Worker lws_filepos_t *inused); 333*1c60b9acSAndroid Build Coastguard Worker int 334*1c60b9acSAndroid Build Coastguard Worker lws_h2_do_pps_send(struct lws *wsi); 335*1c60b9acSAndroid Build Coastguard Worker int 336*1c60b9acSAndroid Build Coastguard Worker lws_h2_frame_write(struct lws *wsi, int type, int flags, unsigned int sid, 337*1c60b9acSAndroid Build Coastguard Worker unsigned int len, unsigned char *buf); 338*1c60b9acSAndroid Build Coastguard Worker struct lws * 339*1c60b9acSAndroid Build Coastguard Worker lws_wsi_mux_from_id(struct lws *wsi, unsigned int sid); 340*1c60b9acSAndroid Build Coastguard Worker int 341*1c60b9acSAndroid Build Coastguard Worker lws_hpack_interpret(struct lws *wsi, unsigned char c); 342*1c60b9acSAndroid Build Coastguard Worker int 343*1c60b9acSAndroid Build Coastguard Worker lws_add_http2_header_by_name(struct lws *wsi, 344*1c60b9acSAndroid Build Coastguard Worker const unsigned char *name, 345*1c60b9acSAndroid Build Coastguard Worker const unsigned char *value, int length, 346*1c60b9acSAndroid Build Coastguard Worker unsigned char **p, unsigned char *end); 347*1c60b9acSAndroid Build Coastguard Worker int 348*1c60b9acSAndroid Build Coastguard Worker lws_add_http2_header_by_token(struct lws *wsi, 349*1c60b9acSAndroid Build Coastguard Worker enum lws_token_indexes token, 350*1c60b9acSAndroid Build Coastguard Worker const unsigned char *value, int length, 351*1c60b9acSAndroid Build Coastguard Worker unsigned char **p, unsigned char *end); 352*1c60b9acSAndroid Build Coastguard Worker int 353*1c60b9acSAndroid Build Coastguard Worker lws_add_http2_header_status(struct lws *wsi, 354*1c60b9acSAndroid Build Coastguard Worker unsigned int code, unsigned char **p, 355*1c60b9acSAndroid Build Coastguard Worker unsigned char *end); 356*1c60b9acSAndroid Build Coastguard Worker void 357*1c60b9acSAndroid Build Coastguard Worker lws_hpack_destroy_dynamic_header(struct lws *wsi); 358*1c60b9acSAndroid Build Coastguard Worker int 359*1c60b9acSAndroid Build Coastguard Worker lws_hpack_dynamic_size(struct lws *wsi, int size); 360*1c60b9acSAndroid Build Coastguard Worker int 361*1c60b9acSAndroid Build Coastguard Worker lws_h2_goaway(struct lws *wsi, uint32_t err, const char *reason); 362*1c60b9acSAndroid Build Coastguard Worker int 363*1c60b9acSAndroid Build Coastguard Worker lws_h2_tx_cr_get(struct lws *wsi); 364*1c60b9acSAndroid Build Coastguard Worker void 365*1c60b9acSAndroid Build Coastguard Worker lws_h2_tx_cr_consume(struct lws *wsi, int consumed); 366*1c60b9acSAndroid Build Coastguard Worker int 367*1c60b9acSAndroid Build Coastguard Worker lws_hdr_extant(struct lws *wsi, enum lws_token_indexes h); 368*1c60b9acSAndroid Build Coastguard Worker void 369*1c60b9acSAndroid Build Coastguard Worker lws_pps_schedule(struct lws *wsi, struct lws_h2_protocol_send *pss); 370*1c60b9acSAndroid Build Coastguard Worker 371*1c60b9acSAndroid Build Coastguard Worker extern const struct http2_settings lws_h2_defaults; 372*1c60b9acSAndroid Build Coastguard Worker int 373*1c60b9acSAndroid Build Coastguard Worker lws_h2_ws_handshake(struct lws *wsi); 374*1c60b9acSAndroid Build Coastguard Worker int lws_h2_issue_preface(struct lws *wsi); 375*1c60b9acSAndroid Build Coastguard Worker int 376*1c60b9acSAndroid Build Coastguard Worker lws_h2_client_handshake(struct lws *wsi); 377*1c60b9acSAndroid Build Coastguard Worker struct lws * 378*1c60b9acSAndroid Build Coastguard Worker lws_wsi_h2_adopt(struct lws *parent_wsi, struct lws *wsi); 379*1c60b9acSAndroid Build Coastguard Worker int 380*1c60b9acSAndroid Build Coastguard Worker lws_handle_POLLOUT_event_h2(struct lws *wsi); 381*1c60b9acSAndroid Build Coastguard Worker int 382*1c60b9acSAndroid Build Coastguard Worker lws_read_h2(struct lws *wsi, unsigned char *buf, lws_filepos_t len); 383*1c60b9acSAndroid Build Coastguard Worker struct lws_h2_protocol_send * 384*1c60b9acSAndroid Build Coastguard Worker lws_h2_new_pps(enum lws_h2_protocol_send_type type); 385