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 typedef struct lws_retry_bo { 26*1c60b9acSAndroid Build Coastguard Worker const uint32_t *retry_ms_table; /* base delay in ms */ 27*1c60b9acSAndroid Build Coastguard Worker uint16_t retry_ms_table_count; /* entries in table */ 28*1c60b9acSAndroid Build Coastguard Worker uint16_t conceal_count; /* max retries to conceal */ 29*1c60b9acSAndroid Build Coastguard Worker uint16_t secs_since_valid_ping; /* idle before PING issued */ 30*1c60b9acSAndroid Build Coastguard Worker uint16_t secs_since_valid_hangup; /* idle before hangup conn */ 31*1c60b9acSAndroid Build Coastguard Worker uint8_t jitter_percent; /* % additional random jitter */ 32*1c60b9acSAndroid Build Coastguard Worker } lws_retry_bo_t; 33*1c60b9acSAndroid Build Coastguard Worker 34*1c60b9acSAndroid Build Coastguard Worker #define LWS_RETRY_CONCEAL_ALWAYS (0xffff) 35*1c60b9acSAndroid Build Coastguard Worker 36*1c60b9acSAndroid Build Coastguard Worker /** 37*1c60b9acSAndroid Build Coastguard Worker * lws_retry_get_delay_ms() - get next delay from backoff table 38*1c60b9acSAndroid Build Coastguard Worker * 39*1c60b9acSAndroid Build Coastguard Worker * \param lws_context: the lws context (used for getting random) 40*1c60b9acSAndroid Build Coastguard Worker * \param retry: the retry backoff table we are using, or NULL for default 41*1c60b9acSAndroid Build Coastguard Worker * \param ctry: pointer to the try counter 42*1c60b9acSAndroid Build Coastguard Worker * \param conceal: pointer to flag set to nonzero if the try should be concealed 43*1c60b9acSAndroid Build Coastguard Worker * in terms of creating an error 44*1c60b9acSAndroid Build Coastguard Worker * 45*1c60b9acSAndroid Build Coastguard Worker * Increments *\p try and retruns the number of ms that should elapse before the 46*1c60b9acSAndroid Build Coastguard Worker * next connection retry, according to the backoff table \p retry. *\p conceal is 47*1c60b9acSAndroid Build Coastguard Worker * set if the number of tries is less than the backoff table conceal_count, or 48*1c60b9acSAndroid Build Coastguard Worker * is zero if it exceeded it. This lets you conceal a certain number of retries 49*1c60b9acSAndroid Build Coastguard Worker * before alerting the caller there is a problem. 50*1c60b9acSAndroid Build Coastguard Worker * 51*1c60b9acSAndroid Build Coastguard Worker * If \p retry is NULL, a default of 3s + (0..300ms jitter) is used. If it's 52*1c60b9acSAndroid Build Coastguard Worker * non-NULL but jitter_percent is 0, the default of 30% jitter is retained. 53*1c60b9acSAndroid Build Coastguard Worker */ 54*1c60b9acSAndroid Build Coastguard Worker 55*1c60b9acSAndroid Build Coastguard Worker LWS_VISIBLE LWS_EXTERN unsigned int 56*1c60b9acSAndroid Build Coastguard Worker lws_retry_get_delay_ms(struct lws_context *context, const lws_retry_bo_t *retry, 57*1c60b9acSAndroid Build Coastguard Worker uint16_t *ctry, char *conceal); 58*1c60b9acSAndroid Build Coastguard Worker 59*1c60b9acSAndroid Build Coastguard Worker /** 60*1c60b9acSAndroid Build Coastguard Worker * lws_retry_sul_schedule() - schedule a sul according to the backoff table 61*1c60b9acSAndroid Build Coastguard Worker * 62*1c60b9acSAndroid Build Coastguard Worker * \param lws_context: the lws context (used for getting random) 63*1c60b9acSAndroid Build Coastguard Worker * \param sul: pointer to the sul to schedule 64*1c60b9acSAndroid Build Coastguard Worker * \param retry: the retry backoff table we are using, or NULL for default 65*1c60b9acSAndroid Build Coastguard Worker * \param cb: the callback for when the sul schedule time arrives 66*1c60b9acSAndroid Build Coastguard Worker * \param ctry: pointer to the try counter 67*1c60b9acSAndroid Build Coastguard Worker * 68*1c60b9acSAndroid Build Coastguard Worker * Helper that combines interpreting the retry table with scheduling a sul to 69*1c60b9acSAndroid Build Coastguard Worker * the computed delay. If conceal is not set, it will not schedule the sul 70*1c60b9acSAndroid Build Coastguard Worker * and just return 1. Otherwise the sul is scheduled and it returns 0. 71*1c60b9acSAndroid Build Coastguard Worker */ 72*1c60b9acSAndroid Build Coastguard Worker LWS_VISIBLE LWS_EXTERN int 73*1c60b9acSAndroid Build Coastguard Worker lws_retry_sul_schedule(struct lws_context *context, int tid, 74*1c60b9acSAndroid Build Coastguard Worker lws_sorted_usec_list_t *sul, const lws_retry_bo_t *retry, 75*1c60b9acSAndroid Build Coastguard Worker sul_cb_t cb, uint16_t *ctry); 76*1c60b9acSAndroid Build Coastguard Worker 77*1c60b9acSAndroid Build Coastguard Worker /** 78*1c60b9acSAndroid Build Coastguard Worker * lws_retry_sul_schedule_retry_wsi() - retry sul schedule helper using wsi 79*1c60b9acSAndroid Build Coastguard Worker * 80*1c60b9acSAndroid Build Coastguard Worker * \param wsi: the wsi to set the hrtimer sul on to the next retry interval 81*1c60b9acSAndroid Build Coastguard Worker * \param sul: pointer to the sul to schedule 82*1c60b9acSAndroid Build Coastguard Worker * \param cb: the callback for when the sul schedule time arrives 83*1c60b9acSAndroid Build Coastguard Worker * \param ctry: pointer to the try counter 84*1c60b9acSAndroid Build Coastguard Worker * 85*1c60b9acSAndroid Build Coastguard Worker * Helper that uses context, tid and retry policy from a wsi to call 86*1c60b9acSAndroid Build Coastguard Worker * lws_retry_sul_schedule. 87*1c60b9acSAndroid Build Coastguard Worker * 88*1c60b9acSAndroid Build Coastguard Worker * Since a udp connection can have many writes in flight, the retry count and 89*1c60b9acSAndroid Build Coastguard Worker * the sul used to track each thing that wants to be written have to be handled 90*1c60b9acSAndroid Build Coastguard Worker * individually, not the wsi. But the retry policy and the other things can 91*1c60b9acSAndroid Build Coastguard Worker * be filled in from the wsi conveniently. 92*1c60b9acSAndroid Build Coastguard Worker */ 93*1c60b9acSAndroid Build Coastguard Worker LWS_VISIBLE LWS_EXTERN int 94*1c60b9acSAndroid Build Coastguard Worker lws_retry_sul_schedule_retry_wsi(struct lws *wsi, lws_sorted_usec_list_t *sul, 95*1c60b9acSAndroid Build Coastguard Worker sul_cb_t cb, uint16_t *ctry); 96