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) 2019 - 2021 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 /* current SS Serialization protocol version */ 26*1c60b9acSAndroid Build Coastguard Worker #define LWS_SSS_CLIENT_PROTOCOL_VERSION 1 27*1c60b9acSAndroid Build Coastguard Worker 28*1c60b9acSAndroid Build Coastguard Worker /* 29*1c60b9acSAndroid Build Coastguard Worker * Secure Stream state 30*1c60b9acSAndroid Build Coastguard Worker */ 31*1c60b9acSAndroid Build Coastguard Worker 32*1c60b9acSAndroid Build Coastguard Worker typedef enum { 33*1c60b9acSAndroid Build Coastguard Worker SSSEQ_IDLE, 34*1c60b9acSAndroid Build Coastguard Worker SSSEQ_TRY_CONNECT, 35*1c60b9acSAndroid Build Coastguard Worker SSSEQ_TRY_CONNECT_NAUTH, 36*1c60b9acSAndroid Build Coastguard Worker SSSEQ_TRY_CONNECT_SAUTH, 37*1c60b9acSAndroid Build Coastguard Worker SSSEQ_RECONNECT_WAIT, 38*1c60b9acSAndroid Build Coastguard Worker SSSEQ_DO_RETRY, 39*1c60b9acSAndroid Build Coastguard Worker SSSEQ_CONNECTED, 40*1c60b9acSAndroid Build Coastguard Worker } lws_ss_seq_state_t; 41*1c60b9acSAndroid Build Coastguard Worker 42*1c60b9acSAndroid Build Coastguard Worker struct conn; 43*1c60b9acSAndroid Build Coastguard Worker 44*1c60b9acSAndroid Build Coastguard Worker /** 45*1c60b9acSAndroid Build Coastguard Worker * lws_ss_handle_t: publicly-opaque secure stream object implementation 46*1c60b9acSAndroid Build Coastguard Worker */ 47*1c60b9acSAndroid Build Coastguard Worker 48*1c60b9acSAndroid Build Coastguard Worker typedef struct lws_ss_handle { 49*1c60b9acSAndroid Build Coastguard Worker lws_ss_info_t info; /**< copy of stream creation info */ 50*1c60b9acSAndroid Build Coastguard Worker 51*1c60b9acSAndroid Build Coastguard Worker lws_lifecycle_t lc; 52*1c60b9acSAndroid Build Coastguard Worker 53*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_WITH_SYS_METRICS) 54*1c60b9acSAndroid Build Coastguard Worker lws_metrics_caliper_compose(cal_txn) 55*1c60b9acSAndroid Build Coastguard Worker #endif 56*1c60b9acSAndroid Build Coastguard Worker 57*1c60b9acSAndroid Build Coastguard Worker struct lws_dll2 list; /**< pt lists active ss */ 58*1c60b9acSAndroid Build Coastguard Worker struct lws_dll2 to_list; /**< pt lists ss with pending to-s */ 59*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_WITH_SERVER) 60*1c60b9acSAndroid Build Coastguard Worker struct lws_dll2 cli_list; /**< same server clients list */ 61*1c60b9acSAndroid Build Coastguard Worker #endif 62*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_WITH_SYS_FAULT_INJECTION) 63*1c60b9acSAndroid Build Coastguard Worker lws_fi_ctx_t fic; /**< Fault Injection context */ 64*1c60b9acSAndroid Build Coastguard Worker #endif 65*1c60b9acSAndroid Build Coastguard Worker 66*1c60b9acSAndroid Build Coastguard Worker struct lws_dll2_owner src_list; /**< sink's list of bound sources */ 67*1c60b9acSAndroid Build Coastguard Worker 68*1c60b9acSAndroid Build Coastguard Worker struct lws_context *context; /**< lws context we are created on */ 69*1c60b9acSAndroid Build Coastguard Worker const lws_ss_policy_t *policy; /**< system policy for stream */ 70*1c60b9acSAndroid Build Coastguard Worker 71*1c60b9acSAndroid Build Coastguard Worker struct lws_sequencer *seq; /**< owning sequencer if any */ 72*1c60b9acSAndroid Build Coastguard Worker struct lws *wsi; /**< the stream wsi if any */ 73*1c60b9acSAndroid Build Coastguard Worker 74*1c60b9acSAndroid Build Coastguard Worker struct conn *conn_if_sspc_onw; 75*1c60b9acSAndroid Build Coastguard Worker 76*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_WITH_SSPLUGINS) 77*1c60b9acSAndroid Build Coastguard Worker void *nauthi; /**< the nauth plugin instance data */ 78*1c60b9acSAndroid Build Coastguard Worker void *sauthi; /**< the sauth plugin instance data */ 79*1c60b9acSAndroid Build Coastguard Worker #endif 80*1c60b9acSAndroid Build Coastguard Worker 81*1c60b9acSAndroid Build Coastguard Worker lws_ss_metadata_t *metadata; 82*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_WITH_SS_DIRECT_PROTOCOL_STR) 83*1c60b9acSAndroid Build Coastguard Worker lws_ss_metadata_t *instant_metadata; /**< for set instant metadata */ 84*1c60b9acSAndroid Build Coastguard Worker struct lwsac *imd_ac; /**< for get custom header */ 85*1c60b9acSAndroid Build Coastguard Worker #endif 86*1c60b9acSAndroid Build Coastguard Worker const lws_ss_policy_t *rideshare; 87*1c60b9acSAndroid Build Coastguard Worker struct lws_ss_handle *h_in_svc; 88*1c60b9acSAndroid Build Coastguard Worker 89*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_WITH_CONMON) 90*1c60b9acSAndroid Build Coastguard Worker char *conmon_json; 91*1c60b9acSAndroid Build Coastguard Worker #endif 92*1c60b9acSAndroid Build Coastguard Worker 93*1c60b9acSAndroid Build Coastguard Worker //struct lws_ss_handle *h_sink; /**< sink we are bound to, or NULL */ 94*1c60b9acSAndroid Build Coastguard Worker //void *sink_obj;/**< sink's private object representing us */ 95*1c60b9acSAndroid Build Coastguard Worker 96*1c60b9acSAndroid Build Coastguard Worker lws_sorted_usec_list_t sul_timeout; 97*1c60b9acSAndroid Build Coastguard Worker lws_sorted_usec_list_t sul; 98*1c60b9acSAndroid Build Coastguard Worker lws_ss_tx_ordinal_t txord; 99*1c60b9acSAndroid Build Coastguard Worker 100*1c60b9acSAndroid Build Coastguard Worker /* protocol-specific connection helpers */ 101*1c60b9acSAndroid Build Coastguard Worker 102*1c60b9acSAndroid Build Coastguard Worker union { 103*1c60b9acSAndroid Build Coastguard Worker 104*1c60b9acSAndroid Build Coastguard Worker /* ...for http-related protocols... */ 105*1c60b9acSAndroid Build Coastguard Worker 106*1c60b9acSAndroid Build Coastguard Worker struct { 107*1c60b9acSAndroid Build Coastguard Worker 108*1c60b9acSAndroid Build Coastguard Worker /* common to all http-related protocols */ 109*1c60b9acSAndroid Build Coastguard Worker 110*1c60b9acSAndroid Build Coastguard Worker /* incoming multipart parsing */ 111*1c60b9acSAndroid Build Coastguard Worker 112*1c60b9acSAndroid Build Coastguard Worker char boundary[24]; /* --boundary from headers */ 113*1c60b9acSAndroid Build Coastguard Worker uint8_t boundary_len; /* length of --boundary */ 114*1c60b9acSAndroid Build Coastguard Worker uint8_t boundary_seq; /* current match amount */ 115*1c60b9acSAndroid Build Coastguard Worker uint8_t boundary_dashes; /* check for -- after */ 116*1c60b9acSAndroid Build Coastguard Worker uint8_t boundary_post; /* swallow post CRLF */ 117*1c60b9acSAndroid Build Coastguard Worker 118*1c60b9acSAndroid Build Coastguard Worker uint8_t som:1; /* SOM has been sent */ 119*1c60b9acSAndroid Build Coastguard Worker uint8_t eom:1; /* EOM has been sent */ 120*1c60b9acSAndroid Build Coastguard Worker uint8_t any:1; /* any content has been sent */ 121*1c60b9acSAndroid Build Coastguard Worker 122*1c60b9acSAndroid Build Coastguard Worker 123*1c60b9acSAndroid Build Coastguard Worker uint8_t good_respcode:1; /* 200 type response code */ 124*1c60b9acSAndroid Build Coastguard Worker 125*1c60b9acSAndroid Build Coastguard Worker union { 126*1c60b9acSAndroid Build Coastguard Worker struct { /* LWSSSP_H1 */ 127*1c60b9acSAndroid Build Coastguard Worker #if defined(WIN32) 128*1c60b9acSAndroid Build Coastguard Worker uint8_t dummy; 129*1c60b9acSAndroid Build Coastguard Worker #endif 130*1c60b9acSAndroid Build Coastguard Worker } h1; 131*1c60b9acSAndroid Build Coastguard Worker struct { /* LWSSSP_H2 */ 132*1c60b9acSAndroid Build Coastguard Worker #if defined(WIN32) 133*1c60b9acSAndroid Build Coastguard Worker uint8_t dummy; 134*1c60b9acSAndroid Build Coastguard Worker #endif 135*1c60b9acSAndroid Build Coastguard Worker } h2; 136*1c60b9acSAndroid Build Coastguard Worker struct { /* LWSSSP_WS */ 137*1c60b9acSAndroid Build Coastguard Worker #if defined(WIN32) 138*1c60b9acSAndroid Build Coastguard Worker uint8_t dummy; 139*1c60b9acSAndroid Build Coastguard Worker #endif 140*1c60b9acSAndroid Build Coastguard Worker } ws; 141*1c60b9acSAndroid Build Coastguard Worker } u; 142*1c60b9acSAndroid Build Coastguard Worker } http; 143*1c60b9acSAndroid Build Coastguard Worker 144*1c60b9acSAndroid Build Coastguard Worker /* details for non-http related protocols... */ 145*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_ROLE_MQTT) 146*1c60b9acSAndroid Build Coastguard Worker struct { 147*1c60b9acSAndroid Build Coastguard Worker lws_mqtt_topic_elem_t topic_qos; 148*1c60b9acSAndroid Build Coastguard Worker lws_mqtt_topic_elem_t sub_top; 149*1c60b9acSAndroid Build Coastguard Worker lws_mqtt_subscribe_param_t sub_info; 150*1c60b9acSAndroid Build Coastguard Worker /* allocation that must be destroyed with conn */ 151*1c60b9acSAndroid Build Coastguard Worker void *heap_baggage; 152*1c60b9acSAndroid Build Coastguard Worker const char *subscribe_to; 153*1c60b9acSAndroid Build Coastguard Worker size_t subscribe_to_len; 154*1c60b9acSAndroid Build Coastguard Worker } mqtt; 155*1c60b9acSAndroid Build Coastguard Worker #endif 156*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_WITH_SYS_SMD) 157*1c60b9acSAndroid Build Coastguard Worker struct { 158*1c60b9acSAndroid Build Coastguard Worker struct lws_smd_peer *smd_peer; 159*1c60b9acSAndroid Build Coastguard Worker lws_sorted_usec_list_t sul_write; 160*1c60b9acSAndroid Build Coastguard Worker } smd; 161*1c60b9acSAndroid Build Coastguard Worker #endif 162*1c60b9acSAndroid Build Coastguard Worker } u; 163*1c60b9acSAndroid Build Coastguard Worker 164*1c60b9acSAndroid Build Coastguard Worker unsigned long writeable_len; 165*1c60b9acSAndroid Build Coastguard Worker 166*1c60b9acSAndroid Build Coastguard Worker lws_ss_constate_t connstate;/**< public connection state */ 167*1c60b9acSAndroid Build Coastguard Worker lws_ss_seq_state_t seqstate; /**< private connection state */ 168*1c60b9acSAndroid Build Coastguard Worker lws_ss_state_return_t pending_ret; /**< holds desired disposition 169*1c60b9acSAndroid Build Coastguard Worker * for ss during CCE */ 170*1c60b9acSAndroid Build Coastguard Worker 171*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_WITH_SERVER) 172*1c60b9acSAndroid Build Coastguard Worker int txn_resp; 173*1c60b9acSAndroid Build Coastguard Worker #endif 174*1c60b9acSAndroid Build Coastguard Worker 175*1c60b9acSAndroid Build Coastguard Worker uint16_t retry; /**< retry / backoff tracking */ 176*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_WITH_CONMON) 177*1c60b9acSAndroid Build Coastguard Worker uint16_t conmon_len; 178*1c60b9acSAndroid Build Coastguard Worker #endif 179*1c60b9acSAndroid Build Coastguard Worker int16_t temp16; 180*1c60b9acSAndroid Build Coastguard Worker 181*1c60b9acSAndroid Build Coastguard Worker uint8_t tsi; /**< service thread idx, usually 0 */ 182*1c60b9acSAndroid Build Coastguard Worker uint8_t subseq; /**< emulate SOM tracking */ 183*1c60b9acSAndroid Build Coastguard Worker uint8_t txn_ok; /**< 1 = transaction was OK */ 184*1c60b9acSAndroid Build Coastguard Worker uint8_t prev_ss_state; 185*1c60b9acSAndroid Build Coastguard Worker 186*1c60b9acSAndroid Build Coastguard Worker uint8_t txn_resp_set:1; /**< user code set one */ 187*1c60b9acSAndroid Build Coastguard Worker uint8_t txn_resp_pending:1; /**< we have yet to send */ 188*1c60b9acSAndroid Build Coastguard Worker uint8_t hanging_som:1; 189*1c60b9acSAndroid Build Coastguard Worker uint8_t inside_msg:1; 190*1c60b9acSAndroid Build Coastguard Worker uint8_t being_serialized:1; /* we are not the consumer */ 191*1c60b9acSAndroid Build Coastguard Worker uint8_t destroying:1; 192*1c60b9acSAndroid Build Coastguard Worker uint8_t ss_dangling_connected:1; 193*1c60b9acSAndroid Build Coastguard Worker uint8_t proxy_onward:1; /* opaque is conn */ 194*1c60b9acSAndroid Build Coastguard Worker uint8_t inside_connect:1; /* set if we are currently 195*1c60b9acSAndroid Build Coastguard Worker * creating the onward 196*1c60b9acSAndroid Build Coastguard Worker * connect */ 197*1c60b9acSAndroid Build Coastguard Worker } lws_ss_handle_t; 198*1c60b9acSAndroid Build Coastguard Worker 199*1c60b9acSAndroid Build Coastguard Worker /* connection helper that doesn't need to hang around after connection starts */ 200*1c60b9acSAndroid Build Coastguard Worker 201*1c60b9acSAndroid Build Coastguard Worker union lws_ss_contemp { 202*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_ROLE_MQTT) 203*1c60b9acSAndroid Build Coastguard Worker lws_mqtt_client_connect_param_t ccp; 204*1c60b9acSAndroid Build Coastguard Worker #else 205*1c60b9acSAndroid Build Coastguard Worker #if defined(WIN32) 206*1c60b9acSAndroid Build Coastguard Worker uint8_t dummy; 207*1c60b9acSAndroid Build Coastguard Worker #endif 208*1c60b9acSAndroid Build Coastguard Worker #endif 209*1c60b9acSAndroid Build Coastguard Worker }; 210*1c60b9acSAndroid Build Coastguard Worker 211*1c60b9acSAndroid Build Coastguard Worker /* 212*1c60b9acSAndroid Build Coastguard Worker * When allocating the opaque handle, we overallocate for: 213*1c60b9acSAndroid Build Coastguard Worker * 214*1c60b9acSAndroid Build Coastguard Worker * 1) policy->nauth_plugin->alloc (.nauthi) if any 215*1c60b9acSAndroid Build Coastguard Worker * 2) policy->sauth_plugin->alloc (.sauthi) if any 216*1c60b9acSAndroid Build Coastguard Worker * 3) copy of creation info stream type pointed to by info.streamtype... this 217*1c60b9acSAndroid Build Coastguard Worker * may be arbitrarily long and since it may be coming from socket ipc and be 218*1c60b9acSAndroid Build Coastguard Worker * temporary at creation time, we need a place for the copy to stay in scope 219*1c60b9acSAndroid Build Coastguard Worker * 4) copy of info->streamtype contents 220*1c60b9acSAndroid Build Coastguard Worker */ 221*1c60b9acSAndroid Build Coastguard Worker 222*1c60b9acSAndroid Build Coastguard Worker 223*1c60b9acSAndroid Build Coastguard Worker /* the user object allocation is immediately after the ss object allocation */ 224*1c60b9acSAndroid Build Coastguard Worker #define ss_to_userobj(ss) ((void *)&(ss)[1]) 225*1c60b9acSAndroid Build Coastguard Worker 226*1c60b9acSAndroid Build Coastguard Worker /* 227*1c60b9acSAndroid Build Coastguard Worker * serialization parser state 228*1c60b9acSAndroid Build Coastguard Worker */ 229*1c60b9acSAndroid Build Coastguard Worker 230*1c60b9acSAndroid Build Coastguard Worker enum { 231*1c60b9acSAndroid Build Coastguard Worker KIND_C_TO_P, 232*1c60b9acSAndroid Build Coastguard Worker KIND_SS_TO_P, 233*1c60b9acSAndroid Build Coastguard Worker }; 234*1c60b9acSAndroid Build Coastguard Worker 235*1c60b9acSAndroid Build Coastguard Worker struct lws_ss_serialization_parser { 236*1c60b9acSAndroid Build Coastguard Worker char streamtype[32]; 237*1c60b9acSAndroid Build Coastguard Worker char rideshare[32]; 238*1c60b9acSAndroid Build Coastguard Worker char metadata_name[32]; 239*1c60b9acSAndroid Build Coastguard Worker 240*1c60b9acSAndroid Build Coastguard Worker uint64_t ust_pwait; 241*1c60b9acSAndroid Build Coastguard Worker 242*1c60b9acSAndroid Build Coastguard Worker lws_ss_metadata_t *ssmd; 243*1c60b9acSAndroid Build Coastguard Worker uint8_t *rxmetaval; 244*1c60b9acSAndroid Build Coastguard Worker 245*1c60b9acSAndroid Build Coastguard Worker int ps; 246*1c60b9acSAndroid Build Coastguard Worker int ctr; 247*1c60b9acSAndroid Build Coastguard Worker 248*1c60b9acSAndroid Build Coastguard Worker uint32_t usd_phandling; 249*1c60b9acSAndroid Build Coastguard Worker uint32_t flags; 250*1c60b9acSAndroid Build Coastguard Worker uint32_t client_pid; 251*1c60b9acSAndroid Build Coastguard Worker int32_t temp32; 252*1c60b9acSAndroid Build Coastguard Worker 253*1c60b9acSAndroid Build Coastguard Worker int32_t txcr_out; 254*1c60b9acSAndroid Build Coastguard Worker int32_t txcr_in; 255*1c60b9acSAndroid Build Coastguard Worker uint16_t rem; 256*1c60b9acSAndroid Build Coastguard Worker 257*1c60b9acSAndroid Build Coastguard Worker uint8_t type; 258*1c60b9acSAndroid Build Coastguard Worker uint8_t frag1; 259*1c60b9acSAndroid Build Coastguard Worker uint8_t slen; 260*1c60b9acSAndroid Build Coastguard Worker uint8_t rsl_pos; 261*1c60b9acSAndroid Build Coastguard Worker uint8_t rsl_idx; 262*1c60b9acSAndroid Build Coastguard Worker uint8_t protocol_version; 263*1c60b9acSAndroid Build Coastguard Worker }; 264*1c60b9acSAndroid Build Coastguard Worker 265*1c60b9acSAndroid Build Coastguard Worker /* 266*1c60b9acSAndroid Build Coastguard Worker * Unlike locally-fulfilled SS, SSS doesn't have to hold metadata on client side 267*1c60b9acSAndroid Build Coastguard Worker * but pass it through to the proxy. The client side doesn't know the real 268*1c60b9acSAndroid Build Coastguard Worker * metadata names that are available in the policy (since it's hardcoded in code 269*1c60b9acSAndroid Build Coastguard Worker * no point passing them back to the client from the policy). Because of that, 270*1c60b9acSAndroid Build Coastguard Worker * it doesn't know how many to allocate when we create the sspc_handle either. 271*1c60b9acSAndroid Build Coastguard Worker * 272*1c60b9acSAndroid Build Coastguard Worker * So we use a linked-list of changed-but-not-yet-proxied metadata allocated 273*1c60b9acSAndroid Build Coastguard Worker * on the heap and items removed as they are proxied out. Anything on the list 274*1c60b9acSAndroid Build Coastguard Worker * is sent to the proxy before any requested tx is handled. 275*1c60b9acSAndroid Build Coastguard Worker * 276*1c60b9acSAndroid Build Coastguard Worker * This is also used to queue tx credit changes 277*1c60b9acSAndroid Build Coastguard Worker */ 278*1c60b9acSAndroid Build Coastguard Worker 279*1c60b9acSAndroid Build Coastguard Worker typedef struct lws_sspc_metadata { 280*1c60b9acSAndroid Build Coastguard Worker lws_dll2_t list; 281*1c60b9acSAndroid Build Coastguard Worker char name[32]; /* empty string, then actually TCXR */ 282*1c60b9acSAndroid Build Coastguard Worker size_t len; 283*1c60b9acSAndroid Build Coastguard Worker int tx_cr_adjust; 284*1c60b9acSAndroid Build Coastguard Worker 285*1c60b9acSAndroid Build Coastguard Worker /* the value of length .len is overallocated after this */ 286*1c60b9acSAndroid Build Coastguard Worker } lws_sspc_metadata_t; 287*1c60b9acSAndroid Build Coastguard Worker 288*1c60b9acSAndroid Build Coastguard Worker /* state of the upstream proxy onward connection */ 289*1c60b9acSAndroid Build Coastguard Worker 290*1c60b9acSAndroid Build Coastguard Worker enum { 291*1c60b9acSAndroid Build Coastguard Worker LWSSSPC_ONW_NONE, 292*1c60b9acSAndroid Build Coastguard Worker LWSSSPC_ONW_REQ, 293*1c60b9acSAndroid Build Coastguard Worker LWSSSPC_ONW_ONGOING, 294*1c60b9acSAndroid Build Coastguard Worker LWSSSPC_ONW_CONN, 295*1c60b9acSAndroid Build Coastguard Worker }; 296*1c60b9acSAndroid Build Coastguard Worker 297*1c60b9acSAndroid Build Coastguard Worker typedef struct lws_sspc_handle { 298*1c60b9acSAndroid Build Coastguard Worker char rideshare_list[128]; 299*1c60b9acSAndroid Build Coastguard Worker 300*1c60b9acSAndroid Build Coastguard Worker lws_lifecycle_t lc; 301*1c60b9acSAndroid Build Coastguard Worker 302*1c60b9acSAndroid Build Coastguard Worker lws_ss_info_t ssi; 303*1c60b9acSAndroid Build Coastguard Worker lws_sorted_usec_list_t sul_retry; 304*1c60b9acSAndroid Build Coastguard Worker 305*1c60b9acSAndroid Build Coastguard Worker struct lws_ss_serialization_parser parser; 306*1c60b9acSAndroid Build Coastguard Worker 307*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_WITH_SYS_FAULT_INJECTION) 308*1c60b9acSAndroid Build Coastguard Worker lws_fi_ctx_t fic; /**< Fault Injection context */ 309*1c60b9acSAndroid Build Coastguard Worker #endif 310*1c60b9acSAndroid Build Coastguard Worker 311*1c60b9acSAndroid Build Coastguard Worker lws_dll2_owner_t metadata_owner; 312*1c60b9acSAndroid Build Coastguard Worker lws_dll2_owner_t metadata_owner_rx; 313*1c60b9acSAndroid Build Coastguard Worker 314*1c60b9acSAndroid Build Coastguard Worker struct lws_dll2 client_list; 315*1c60b9acSAndroid Build Coastguard Worker struct lws_tx_credit txc; 316*1c60b9acSAndroid Build Coastguard Worker 317*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_WITH_SYS_METRICS) 318*1c60b9acSAndroid Build Coastguard Worker lws_metrics_caliper_compose(cal_txn) 319*1c60b9acSAndroid Build Coastguard Worker #endif 320*1c60b9acSAndroid Build Coastguard Worker 321*1c60b9acSAndroid Build Coastguard Worker struct lws *cwsi; 322*1c60b9acSAndroid Build Coastguard Worker 323*1c60b9acSAndroid Build Coastguard Worker struct lws_dsh *dsh; 324*1c60b9acSAndroid Build Coastguard Worker struct lws_context *context; 325*1c60b9acSAndroid Build Coastguard Worker 326*1c60b9acSAndroid Build Coastguard Worker struct lws_sspc_handle *h_in_svc; 327*1c60b9acSAndroid Build Coastguard Worker /* 328*1c60b9acSAndroid Build Coastguard Worker * Used to detect illegal lws_sspc_destroy() calls while still 329*1c60b9acSAndroid Build Coastguard Worker * being serviced 330*1c60b9acSAndroid Build Coastguard Worker */ 331*1c60b9acSAndroid Build Coastguard Worker 332*1c60b9acSAndroid Build Coastguard Worker lws_usec_t us_earliest_write_req; 333*1c60b9acSAndroid Build Coastguard Worker lws_usec_t us_start_upstream; 334*1c60b9acSAndroid Build Coastguard Worker 335*1c60b9acSAndroid Build Coastguard Worker unsigned long writeable_len; 336*1c60b9acSAndroid Build Coastguard Worker 337*1c60b9acSAndroid Build Coastguard Worker lws_ss_conn_states_t state; 338*1c60b9acSAndroid Build Coastguard Worker 339*1c60b9acSAndroid Build Coastguard Worker uint32_t timeout_ms; 340*1c60b9acSAndroid Build Coastguard Worker uint32_t ord; 341*1c60b9acSAndroid Build Coastguard Worker 342*1c60b9acSAndroid Build Coastguard Worker int16_t temp16; 343*1c60b9acSAndroid Build Coastguard Worker 344*1c60b9acSAndroid Build Coastguard Worker uint8_t rideshare_ofs[4]; 345*1c60b9acSAndroid Build Coastguard Worker uint8_t rsidx; 346*1c60b9acSAndroid Build Coastguard Worker 347*1c60b9acSAndroid Build Coastguard Worker uint8_t prev_ss_state; 348*1c60b9acSAndroid Build Coastguard Worker 349*1c60b9acSAndroid Build Coastguard Worker uint8_t conn_req_state:2; 350*1c60b9acSAndroid Build Coastguard Worker uint8_t destroying:1; 351*1c60b9acSAndroid Build Coastguard Worker uint8_t non_wsi:1; 352*1c60b9acSAndroid Build Coastguard Worker uint8_t ignore_txc:1; 353*1c60b9acSAndroid Build Coastguard Worker uint8_t pending_timeout_update:1; 354*1c60b9acSAndroid Build Coastguard Worker uint8_t pending_writeable_len:1; 355*1c60b9acSAndroid Build Coastguard Worker uint8_t creating_cb_done:1; 356*1c60b9acSAndroid Build Coastguard Worker uint8_t ss_dangling_connected:1; 357*1c60b9acSAndroid Build Coastguard Worker } lws_sspc_handle_t; 358*1c60b9acSAndroid Build Coastguard Worker 359*1c60b9acSAndroid Build Coastguard Worker typedef struct backoffs { 360*1c60b9acSAndroid Build Coastguard Worker struct backoffs *next; 361*1c60b9acSAndroid Build Coastguard Worker const char *name; 362*1c60b9acSAndroid Build Coastguard Worker lws_retry_bo_t r; 363*1c60b9acSAndroid Build Coastguard Worker } backoff_t; 364*1c60b9acSAndroid Build Coastguard Worker 365*1c60b9acSAndroid Build Coastguard Worker union u { 366*1c60b9acSAndroid Build Coastguard Worker backoff_t *b; 367*1c60b9acSAndroid Build Coastguard Worker lws_ss_x509_t *x; 368*1c60b9acSAndroid Build Coastguard Worker lws_ss_trust_store_t *t; 369*1c60b9acSAndroid Build Coastguard Worker lws_ss_policy_t *p; 370*1c60b9acSAndroid Build Coastguard Worker lws_ss_auth_t *a; 371*1c60b9acSAndroid Build Coastguard Worker lws_metric_policy_t *m; 372*1c60b9acSAndroid Build Coastguard Worker }; 373*1c60b9acSAndroid Build Coastguard Worker 374*1c60b9acSAndroid Build Coastguard Worker enum { 375*1c60b9acSAndroid Build Coastguard Worker LTY_BACKOFF, 376*1c60b9acSAndroid Build Coastguard Worker LTY_X509, 377*1c60b9acSAndroid Build Coastguard Worker LTY_TRUSTSTORE, 378*1c60b9acSAndroid Build Coastguard Worker LTY_POLICY, 379*1c60b9acSAndroid Build Coastguard Worker LTY_AUTH, 380*1c60b9acSAndroid Build Coastguard Worker LTY_METRICS, 381*1c60b9acSAndroid Build Coastguard Worker 382*1c60b9acSAndroid Build Coastguard Worker _LTY_COUNT /* always last */ 383*1c60b9acSAndroid Build Coastguard Worker }; 384*1c60b9acSAndroid Build Coastguard Worker 385*1c60b9acSAndroid Build Coastguard Worker 386*1c60b9acSAndroid Build Coastguard Worker struct policy_cb_args { 387*1c60b9acSAndroid Build Coastguard Worker struct lejp_ctx jctx; 388*1c60b9acSAndroid Build Coastguard Worker struct lws_context *context; 389*1c60b9acSAndroid Build Coastguard Worker struct lwsac *ac; 390*1c60b9acSAndroid Build Coastguard Worker 391*1c60b9acSAndroid Build Coastguard Worker const char *socks5_proxy; 392*1c60b9acSAndroid Build Coastguard Worker 393*1c60b9acSAndroid Build Coastguard Worker struct lws_b64state b64; 394*1c60b9acSAndroid Build Coastguard Worker 395*1c60b9acSAndroid Build Coastguard Worker lws_ss_http_respmap_t respmap[16]; 396*1c60b9acSAndroid Build Coastguard Worker 397*1c60b9acSAndroid Build Coastguard Worker union u heads[_LTY_COUNT]; 398*1c60b9acSAndroid Build Coastguard Worker union u curr[_LTY_COUNT]; 399*1c60b9acSAndroid Build Coastguard Worker 400*1c60b9acSAndroid Build Coastguard Worker uint8_t *p; 401*1c60b9acSAndroid Build Coastguard Worker 402*1c60b9acSAndroid Build Coastguard Worker int count; 403*1c60b9acSAndroid Build Coastguard Worker char pending_respmap; 404*1c60b9acSAndroid Build Coastguard Worker 405*1c60b9acSAndroid Build Coastguard Worker uint8_t parse_data:1; 406*1c60b9acSAndroid Build Coastguard Worker }; 407*1c60b9acSAndroid Build Coastguard Worker 408*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_WITH_SYS_SMD) 409*1c60b9acSAndroid Build Coastguard Worker extern const lws_ss_policy_t pol_smd; 410*1c60b9acSAndroid Build Coastguard Worker #endif 411*1c60b9acSAndroid Build Coastguard Worker 412*1c60b9acSAndroid Build Coastguard Worker 413*1c60b9acSAndroid Build Coastguard Worker /* 414*1c60b9acSAndroid Build Coastguard Worker * returns one of 415*1c60b9acSAndroid Build Coastguard Worker * 416*1c60b9acSAndroid Build Coastguard Worker * LWSSSSRET_OK 417*1c60b9acSAndroid Build Coastguard Worker * LWSSSSRET_DISCONNECT_ME 418*1c60b9acSAndroid Build Coastguard Worker * LWSSSSRET_DESTROY_ME 419*1c60b9acSAndroid Build Coastguard Worker */ 420*1c60b9acSAndroid Build Coastguard Worker int 421*1c60b9acSAndroid Build Coastguard Worker lws_ss_deserialize_parse(struct lws_ss_serialization_parser *par, 422*1c60b9acSAndroid Build Coastguard Worker struct lws_context *context, 423*1c60b9acSAndroid Build Coastguard Worker struct lws_dsh *dsh, const uint8_t *cp, size_t len, 424*1c60b9acSAndroid Build Coastguard Worker lws_ss_conn_states_t *state, void *parconn, 425*1c60b9acSAndroid Build Coastguard Worker lws_ss_handle_t **pss, lws_ss_info_t *ssi, char client); 426*1c60b9acSAndroid Build Coastguard Worker int 427*1c60b9acSAndroid Build Coastguard Worker lws_ss_serialize_rx_payload(struct lws_dsh *dsh, const uint8_t *buf, 428*1c60b9acSAndroid Build Coastguard Worker size_t len, int flags, const char *rsp); 429*1c60b9acSAndroid Build Coastguard Worker int 430*1c60b9acSAndroid Build Coastguard Worker lws_ss_deserialize_tx_payload(struct lws_dsh *dsh, struct lws *wsi, 431*1c60b9acSAndroid Build Coastguard Worker lws_ss_tx_ordinal_t ord, uint8_t *buf, 432*1c60b9acSAndroid Build Coastguard Worker size_t *len, int *flags); 433*1c60b9acSAndroid Build Coastguard Worker int 434*1c60b9acSAndroid Build Coastguard Worker lws_ss_serialize_state(struct lws *wsi, struct lws_dsh *dsh, lws_ss_constate_t state, 435*1c60b9acSAndroid Build Coastguard Worker lws_ss_tx_ordinal_t ack); 436*1c60b9acSAndroid Build Coastguard Worker 437*1c60b9acSAndroid Build Coastguard Worker const lws_ss_policy_t * 438*1c60b9acSAndroid Build Coastguard Worker lws_ss_policy_lookup(const struct lws_context *context, const char *streamtype); 439*1c60b9acSAndroid Build Coastguard Worker 440*1c60b9acSAndroid Build Coastguard Worker /* can be used as a cb from lws_dll2_foreach_safe() to destroy ss */ 441*1c60b9acSAndroid Build Coastguard Worker int 442*1c60b9acSAndroid Build Coastguard Worker lws_ss_destroy_dll(struct lws_dll2 *d, void *user); 443*1c60b9acSAndroid Build Coastguard Worker 444*1c60b9acSAndroid Build Coastguard Worker int 445*1c60b9acSAndroid Build Coastguard Worker lws_sspc_destroy_dll(struct lws_dll2 *d, void *user); 446*1c60b9acSAndroid Build Coastguard Worker 447*1c60b9acSAndroid Build Coastguard Worker void 448*1c60b9acSAndroid Build Coastguard Worker lws_sspc_rxmetadata_destroy(lws_sspc_handle_t *h); 449*1c60b9acSAndroid Build Coastguard Worker 450*1c60b9acSAndroid Build Coastguard Worker int 451*1c60b9acSAndroid Build Coastguard Worker lws_ss_policy_set(struct lws_context *context, const char *name); 452*1c60b9acSAndroid Build Coastguard Worker 453*1c60b9acSAndroid Build Coastguard Worker int 454*1c60b9acSAndroid Build Coastguard Worker lws_ss_sys_fetch_policy(struct lws_context *context); 455*1c60b9acSAndroid Build Coastguard Worker 456*1c60b9acSAndroid Build Coastguard Worker lws_ss_state_return_t 457*1c60b9acSAndroid Build Coastguard Worker lws_ss_event_helper(lws_ss_handle_t *h, lws_ss_constate_t cs); 458*1c60b9acSAndroid Build Coastguard Worker 459*1c60b9acSAndroid Build Coastguard Worker lws_ss_state_return_t 460*1c60b9acSAndroid Build Coastguard Worker _lws_ss_backoff(lws_ss_handle_t *h, lws_usec_t us_override); 461*1c60b9acSAndroid Build Coastguard Worker 462*1c60b9acSAndroid Build Coastguard Worker lws_ss_state_return_t 463*1c60b9acSAndroid Build Coastguard Worker lws_ss_backoff(lws_ss_handle_t *h); 464*1c60b9acSAndroid Build Coastguard Worker 465*1c60b9acSAndroid Build Coastguard Worker int 466*1c60b9acSAndroid Build Coastguard Worker _lws_ss_handle_state_ret_CAN_DESTROY_HANDLE(lws_ss_state_return_t r, struct lws *wsi, 467*1c60b9acSAndroid Build Coastguard Worker lws_ss_handle_t **ph); 468*1c60b9acSAndroid Build Coastguard Worker 469*1c60b9acSAndroid Build Coastguard Worker int 470*1c60b9acSAndroid Build Coastguard Worker lws_ss_set_timeout_us(lws_ss_handle_t *h, lws_usec_t us); 471*1c60b9acSAndroid Build Coastguard Worker 472*1c60b9acSAndroid Build Coastguard Worker void 473*1c60b9acSAndroid Build Coastguard Worker ss_proxy_onward_txcr(void *userobj, int bump); 474*1c60b9acSAndroid Build Coastguard Worker 475*1c60b9acSAndroid Build Coastguard Worker int 476*1c60b9acSAndroid Build Coastguard Worker lws_ss_serialize_txcr(struct lws_dsh *dsh, int txcr); 477*1c60b9acSAndroid Build Coastguard Worker 478*1c60b9acSAndroid Build Coastguard Worker int 479*1c60b9acSAndroid Build Coastguard Worker lws_ss_sys_auth_api_amazon_com(struct lws_context *context); 480*1c60b9acSAndroid Build Coastguard Worker 481*1c60b9acSAndroid Build Coastguard Worker lws_ss_metadata_t * 482*1c60b9acSAndroid Build Coastguard Worker lws_ss_get_handle_metadata(struct lws_ss_handle *h, const char *name); 483*1c60b9acSAndroid Build Coastguard Worker lws_ss_metadata_t * 484*1c60b9acSAndroid Build Coastguard Worker lws_ss_policy_metadata_index(const lws_ss_policy_t *p, size_t index); 485*1c60b9acSAndroid Build Coastguard Worker 486*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_WITH_SS_DIRECT_PROTOCOL_STR) 487*1c60b9acSAndroid Build Coastguard Worker lws_ss_metadata_t * 488*1c60b9acSAndroid Build Coastguard Worker lws_ss_get_handle_instant_metadata(struct lws_ss_handle *h, const char *name); 489*1c60b9acSAndroid Build Coastguard Worker #endif 490*1c60b9acSAndroid Build Coastguard Worker 491*1c60b9acSAndroid Build Coastguard Worker lws_ss_metadata_t * 492*1c60b9acSAndroid Build Coastguard Worker lws_ss_policy_metadata(const lws_ss_policy_t *p, const char *name); 493*1c60b9acSAndroid Build Coastguard Worker 494*1c60b9acSAndroid Build Coastguard Worker int 495*1c60b9acSAndroid Build Coastguard Worker lws_ss_exp_cb_metadata(void *priv, const char *name, char *out, size_t *pos, 496*1c60b9acSAndroid Build Coastguard Worker size_t olen, size_t *exp_ofs); 497*1c60b9acSAndroid Build Coastguard Worker 498*1c60b9acSAndroid Build Coastguard Worker int 499*1c60b9acSAndroid Build Coastguard Worker _lws_ss_set_metadata(lws_ss_metadata_t *omd, const char *name, 500*1c60b9acSAndroid Build Coastguard Worker const void *value, size_t len); 501*1c60b9acSAndroid Build Coastguard Worker 502*1c60b9acSAndroid Build Coastguard Worker int 503*1c60b9acSAndroid Build Coastguard Worker _lws_ss_alloc_set_metadata(lws_ss_metadata_t *omd, const char *name, 504*1c60b9acSAndroid Build Coastguard Worker const void *value, size_t len); 505*1c60b9acSAndroid Build Coastguard Worker 506*1c60b9acSAndroid Build Coastguard Worker lws_ss_state_return_t 507*1c60b9acSAndroid Build Coastguard Worker _lws_ss_client_connect(lws_ss_handle_t *h, int is_retry, void *conn_if_sspc_onw); 508*1c60b9acSAndroid Build Coastguard Worker 509*1c60b9acSAndroid Build Coastguard Worker lws_ss_state_return_t 510*1c60b9acSAndroid Build Coastguard Worker _lws_ss_request_tx(lws_ss_handle_t *h); 511*1c60b9acSAndroid Build Coastguard Worker 512*1c60b9acSAndroid Build Coastguard Worker int 513*1c60b9acSAndroid Build Coastguard Worker __lws_ss_proxy_bind_ss_to_conn_wsi(void *parconn, size_t dsh_size); 514*1c60b9acSAndroid Build Coastguard Worker 515*1c60b9acSAndroid Build Coastguard Worker struct lws_vhost * 516*1c60b9acSAndroid Build Coastguard Worker lws_ss_policy_ref_trust_store(struct lws_context *context, 517*1c60b9acSAndroid Build Coastguard Worker const lws_ss_policy_t *pol, char doref); 518*1c60b9acSAndroid Build Coastguard Worker 519*1c60b9acSAndroid Build Coastguard Worker lws_ss_state_return_t 520*1c60b9acSAndroid Build Coastguard Worker lws_sspc_event_helper(lws_sspc_handle_t *h, lws_ss_constate_t cs, 521*1c60b9acSAndroid Build Coastguard Worker lws_ss_tx_ordinal_t flags); 522*1c60b9acSAndroid Build Coastguard Worker 523*1c60b9acSAndroid Build Coastguard Worker int 524*1c60b9acSAndroid Build Coastguard Worker lws_ss_check_next_state(lws_lifecycle_t *lc, uint8_t *prevstate, 525*1c60b9acSAndroid Build Coastguard Worker lws_ss_constate_t cs); 526*1c60b9acSAndroid Build Coastguard Worker 527*1c60b9acSAndroid Build Coastguard Worker int 528*1c60b9acSAndroid Build Coastguard Worker lws_ss_check_next_state_ss(lws_ss_handle_t *ss, uint8_t *prevstate, 529*1c60b9acSAndroid Build Coastguard Worker lws_ss_constate_t cs); 530*1c60b9acSAndroid Build Coastguard Worker 531*1c60b9acSAndroid Build Coastguard Worker int 532*1c60b9acSAndroid Build Coastguard Worker lws_ss_check_next_state_sspc(lws_sspc_handle_t *ss, uint8_t *prevstate, 533*1c60b9acSAndroid Build Coastguard Worker lws_ss_constate_t cs); 534*1c60b9acSAndroid Build Coastguard Worker 535*1c60b9acSAndroid Build Coastguard Worker void 536*1c60b9acSAndroid Build Coastguard Worker lws_proxy_clean_conn_ss(struct lws *wsi); 537*1c60b9acSAndroid Build Coastguard Worker 538*1c60b9acSAndroid Build Coastguard Worker int 539*1c60b9acSAndroid Build Coastguard Worker lws_ss_cancel_notify_dll(struct lws_dll2 *d, void *user); 540*1c60b9acSAndroid Build Coastguard Worker 541*1c60b9acSAndroid Build Coastguard Worker int 542*1c60b9acSAndroid Build Coastguard Worker lws_sspc_cancel_notify_dll(struct lws_dll2 *d, void *user); 543*1c60b9acSAndroid Build Coastguard Worker 544*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_WITH_SECURE_STREAMS_STATIC_POLICY_ONLY) || defined(LWS_WITH_SECURE_STREAMS_CPP) 545*1c60b9acSAndroid Build Coastguard Worker int 546*1c60b9acSAndroid Build Coastguard Worker lws_ss_policy_unref_trust_store(struct lws_context *context, 547*1c60b9acSAndroid Build Coastguard Worker const lws_ss_policy_t *pol); 548*1c60b9acSAndroid Build Coastguard Worker #endif 549*1c60b9acSAndroid Build Coastguard Worker 550*1c60b9acSAndroid Build Coastguard Worker int 551*1c60b9acSAndroid Build Coastguard Worker lws_ss_sys_cpd(struct lws_context *cx); 552*1c60b9acSAndroid Build Coastguard Worker 553*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_WITH_SECURE_STREAMS_AUTH_SIGV4) 554*1c60b9acSAndroid Build Coastguard Worker int lws_ss_apply_sigv4(struct lws *wsi, struct lws_ss_handle *h, 555*1c60b9acSAndroid Build Coastguard Worker unsigned char **p, unsigned char *end); 556*1c60b9acSAndroid Build Coastguard Worker #endif 557*1c60b9acSAndroid Build Coastguard Worker 558*1c60b9acSAndroid Build Coastguard Worker #if defined(_DEBUG) 559*1c60b9acSAndroid Build Coastguard Worker void 560*1c60b9acSAndroid Build Coastguard Worker lws_ss_assert_extant(struct lws_context *cx, int tsi, struct lws_ss_handle *h); 561*1c60b9acSAndroid Build Coastguard Worker #else 562*1c60b9acSAndroid Build Coastguard Worker #define lws_ss_assert_extant(_a, _b, _c) 563*1c60b9acSAndroid Build Coastguard Worker #endif 564*1c60b9acSAndroid Build Coastguard Worker 565*1c60b9acSAndroid Build Coastguard Worker typedef int (* const secstream_protocol_connect_munge_t)(lws_ss_handle_t *h, 566*1c60b9acSAndroid Build Coastguard Worker char *buf, size_t len, struct lws_client_connect_info *i, 567*1c60b9acSAndroid Build Coastguard Worker union lws_ss_contemp *ct); 568*1c60b9acSAndroid Build Coastguard Worker 569*1c60b9acSAndroid Build Coastguard Worker typedef int (* const secstream_protocol_add_txcr_t)(lws_ss_handle_t *h, int add); 570*1c60b9acSAndroid Build Coastguard Worker 571*1c60b9acSAndroid Build Coastguard Worker typedef int (* const secstream_protocol_get_txcr_t)(lws_ss_handle_t *h); 572*1c60b9acSAndroid Build Coastguard Worker 573*1c60b9acSAndroid Build Coastguard Worker struct ss_pcols { 574*1c60b9acSAndroid Build Coastguard Worker const char *name; 575*1c60b9acSAndroid Build Coastguard Worker const char *alpn; 576*1c60b9acSAndroid Build Coastguard Worker const struct lws_protocols *protocol; 577*1c60b9acSAndroid Build Coastguard Worker secstream_protocol_connect_munge_t munge; 578*1c60b9acSAndroid Build Coastguard Worker secstream_protocol_add_txcr_t tx_cr_add; 579*1c60b9acSAndroid Build Coastguard Worker secstream_protocol_get_txcr_t tx_cr_est; 580*1c60b9acSAndroid Build Coastguard Worker }; 581*1c60b9acSAndroid Build Coastguard Worker 582*1c60b9acSAndroid Build Coastguard Worker /* 583*1c60b9acSAndroid Build Coastguard Worker * Because both sides of the connection share the conn, we allocate it 584*1c60b9acSAndroid Build Coastguard Worker * during accepted adoption, and both sides point to it. 585*1c60b9acSAndroid Build Coastguard Worker * 586*1c60b9acSAndroid Build Coastguard Worker * When .ss or .wsi close, they must NULL their entry here so no dangling 587*1c60b9acSAndroid Build Coastguard Worker * refereneces. 588*1c60b9acSAndroid Build Coastguard Worker * 589*1c60b9acSAndroid Build Coastguard Worker * The last one of the accepted side and the onward side to close frees it. 590*1c60b9acSAndroid Build Coastguard Worker */ 591*1c60b9acSAndroid Build Coastguard Worker 592*1c60b9acSAndroid Build Coastguard Worker lws_ss_state_return_t 593*1c60b9acSAndroid Build Coastguard Worker lws_conmon_ss_json(lws_ss_handle_t *h); 594*1c60b9acSAndroid Build Coastguard Worker 595*1c60b9acSAndroid Build Coastguard Worker void 596*1c60b9acSAndroid Build Coastguard Worker ss_proxy_onward_link_req_writeable(lws_ss_handle_t *h_onward); 597*1c60b9acSAndroid Build Coastguard Worker 598*1c60b9acSAndroid Build Coastguard Worker struct conn { 599*1c60b9acSAndroid Build Coastguard Worker struct lws_ss_serialization_parser parser; 600*1c60b9acSAndroid Build Coastguard Worker 601*1c60b9acSAndroid Build Coastguard Worker lws_dsh_t *dsh; /* unified buffer for both sides */ 602*1c60b9acSAndroid Build Coastguard Worker struct lws *wsi; /* the proxy's client side */ 603*1c60b9acSAndroid Build Coastguard Worker lws_ss_handle_t *ss; /* the onward, ss side */ 604*1c60b9acSAndroid Build Coastguard Worker 605*1c60b9acSAndroid Build Coastguard Worker lws_ss_conn_states_t state; 606*1c60b9acSAndroid Build Coastguard Worker 607*1c60b9acSAndroid Build Coastguard Worker char onward_in_flow_control; 608*1c60b9acSAndroid Build Coastguard Worker }; 609*1c60b9acSAndroid Build Coastguard Worker 610*1c60b9acSAndroid Build Coastguard Worker extern const struct ss_pcols ss_pcol_h1; 611*1c60b9acSAndroid Build Coastguard Worker extern const struct ss_pcols ss_pcol_h2; 612*1c60b9acSAndroid Build Coastguard Worker extern const struct ss_pcols ss_pcol_ws; 613*1c60b9acSAndroid Build Coastguard Worker extern const struct ss_pcols ss_pcol_mqtt; 614*1c60b9acSAndroid Build Coastguard Worker extern const struct ss_pcols ss_pcol_raw; 615*1c60b9acSAndroid Build Coastguard Worker 616*1c60b9acSAndroid Build Coastguard Worker extern const struct lws_protocols protocol_secstream_h1; 617*1c60b9acSAndroid Build Coastguard Worker extern const struct lws_protocols protocol_secstream_h2; 618*1c60b9acSAndroid Build Coastguard Worker extern const struct lws_protocols protocol_secstream_ws; 619*1c60b9acSAndroid Build Coastguard Worker extern const struct lws_protocols protocol_secstream_mqtt; 620*1c60b9acSAndroid Build Coastguard Worker extern const struct lws_protocols protocol_secstream_raw; 621*1c60b9acSAndroid Build Coastguard Worker 622