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 26*1c60b9acSAndroid Build Coastguard Worker #define DNS_MAX 96 /* Maximum host name */ 27*1c60b9acSAndroid Build Coastguard Worker #define DNS_RECURSION_LIMIT 3 28*1c60b9acSAndroid Build Coastguard Worker #define DNS_PACKET_LEN 1400 /* Buffer size for DNS packet */ 29*1c60b9acSAndroid Build Coastguard Worker #define MAX_CACHE_ENTRIES 10 /* Dont cache more than that */ 30*1c60b9acSAndroid Build Coastguard Worker #define DNS_QUERY_TIMEOUT 30 /* Query timeout, seconds */ 31*1c60b9acSAndroid Build Coastguard Worker 32*1c60b9acSAndroid Build Coastguard Worker /* 33*1c60b9acSAndroid Build Coastguard Worker * ... when we completed a query then the query object is destroyed and a 34*1c60b9acSAndroid Build Coastguard Worker * cache object below is created with the results in getaddrinfo format 35*1c60b9acSAndroid Build Coastguard Worker * appended to the allocation 36*1c60b9acSAndroid Build Coastguard Worker */ 37*1c60b9acSAndroid Build Coastguard Worker 38*1c60b9acSAndroid Build Coastguard Worker typedef struct lws_adns_cache { 39*1c60b9acSAndroid Build Coastguard Worker lws_sorted_usec_list_t sul; /* for cache TTL management */ 40*1c60b9acSAndroid Build Coastguard Worker lws_dll2_t list; 41*1c60b9acSAndroid Build Coastguard Worker 42*1c60b9acSAndroid Build Coastguard Worker struct lws_adns_cache *firstcache; 43*1c60b9acSAndroid Build Coastguard Worker struct lws_adns_cache *chain; 44*1c60b9acSAndroid Build Coastguard Worker struct addrinfo *results; 45*1c60b9acSAndroid Build Coastguard Worker const char *name; 46*1c60b9acSAndroid Build Coastguard Worker uint8_t flags; /* b0 = has ipv4, b1 = has ipv6 */ 47*1c60b9acSAndroid Build Coastguard Worker char refcount; 48*1c60b9acSAndroid Build Coastguard Worker char incomplete; 49*1c60b9acSAndroid Build Coastguard Worker /* addrinfo, lws_sa46, then name overallocated here */ 50*1c60b9acSAndroid Build Coastguard Worker } lws_adns_cache_t; 51*1c60b9acSAndroid Build Coastguard Worker 52*1c60b9acSAndroid Build Coastguard Worker /* 53*1c60b9acSAndroid Build Coastguard Worker * these objects are used while a query is ongoing... 54*1c60b9acSAndroid Build Coastguard Worker */ 55*1c60b9acSAndroid Build Coastguard Worker 56*1c60b9acSAndroid Build Coastguard Worker typedef struct { 57*1c60b9acSAndroid Build Coastguard Worker lws_sorted_usec_list_t sul; /* per-query write retry timer */ 58*1c60b9acSAndroid Build Coastguard Worker lws_sorted_usec_list_t write_sul; /* fail if unable to write by this time */ 59*1c60b9acSAndroid Build Coastguard Worker lws_dll2_t list; 60*1c60b9acSAndroid Build Coastguard Worker 61*1c60b9acSAndroid Build Coastguard Worker lws_metrics_caliper_compose(metcal) 62*1c60b9acSAndroid Build Coastguard Worker 63*1c60b9acSAndroid Build Coastguard Worker lws_dll2_owner_t wsi_adns; 64*1c60b9acSAndroid Build Coastguard Worker lws_async_dns_cb_t standalone_cb; /* if not associated to wsi */ 65*1c60b9acSAndroid Build Coastguard Worker struct lws_context *context; 66*1c60b9acSAndroid Build Coastguard Worker void *opaque; 67*1c60b9acSAndroid Build Coastguard Worker struct addrinfo **last; 68*1c60b9acSAndroid Build Coastguard Worker lws_async_dns_t *dns; 69*1c60b9acSAndroid Build Coastguard Worker 70*1c60b9acSAndroid Build Coastguard Worker lws_adns_cache_t *firstcache; 71*1c60b9acSAndroid Build Coastguard Worker 72*1c60b9acSAndroid Build Coastguard Worker lws_async_dns_retcode_t ret; 73*1c60b9acSAndroid Build Coastguard Worker uint16_t tid[3]; /* last 3 sent tid */ 74*1c60b9acSAndroid Build Coastguard Worker uint16_t qtype; 75*1c60b9acSAndroid Build Coastguard Worker uint16_t retry; 76*1c60b9acSAndroid Build Coastguard Worker uint8_t tsi; 77*1c60b9acSAndroid Build Coastguard Worker 78*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_WITH_IPV6) 79*1c60b9acSAndroid Build Coastguard Worker uint8_t sent[2]; 80*1c60b9acSAndroid Build Coastguard Worker #else 81*1c60b9acSAndroid Build Coastguard Worker uint8_t sent[1]; 82*1c60b9acSAndroid Build Coastguard Worker #endif 83*1c60b9acSAndroid Build Coastguard Worker uint8_t asked; 84*1c60b9acSAndroid Build Coastguard Worker uint8_t responded; 85*1c60b9acSAndroid Build Coastguard Worker 86*1c60b9acSAndroid Build Coastguard Worker uint8_t recursion; 87*1c60b9acSAndroid Build Coastguard Worker uint8_t tids; 88*1c60b9acSAndroid Build Coastguard Worker uint8_t go_nogo; 89*1c60b9acSAndroid Build Coastguard Worker 90*1c60b9acSAndroid Build Coastguard Worker uint8_t is_retry:1; 91*1c60b9acSAndroid Build Coastguard Worker 92*1c60b9acSAndroid Build Coastguard Worker /* name overallocated here */ 93*1c60b9acSAndroid Build Coastguard Worker } lws_adns_q_t; 94*1c60b9acSAndroid Build Coastguard Worker 95*1c60b9acSAndroid Build Coastguard Worker #define LADNS_MOST_RECENT_TID(_q) \ 96*1c60b9acSAndroid Build Coastguard Worker q->tid[(int)(_q->tids - 1) % (int)LWS_ARRAY_SIZE(q->tid)] 97*1c60b9acSAndroid Build Coastguard Worker 98*1c60b9acSAndroid Build Coastguard Worker enum { 99*1c60b9acSAndroid Build Coastguard Worker DHO_TID, 100*1c60b9acSAndroid Build Coastguard Worker DHO_FLAGS = 2, 101*1c60b9acSAndroid Build Coastguard Worker DHO_NQUERIES = 4, 102*1c60b9acSAndroid Build Coastguard Worker DHO_NANSWERS = 6, 103*1c60b9acSAndroid Build Coastguard Worker DHO_NAUTH = 8, 104*1c60b9acSAndroid Build Coastguard Worker DHO_NOTHER = 10, 105*1c60b9acSAndroid Build Coastguard Worker 106*1c60b9acSAndroid Build Coastguard Worker DHO_SIZEOF = 12 /* last */ 107*1c60b9acSAndroid Build Coastguard Worker }; 108*1c60b9acSAndroid Build Coastguard Worker 109*1c60b9acSAndroid Build Coastguard Worker void 110*1c60b9acSAndroid Build Coastguard Worker lws_adns_q_destroy(lws_adns_q_t *q); 111*1c60b9acSAndroid Build Coastguard Worker 112*1c60b9acSAndroid Build Coastguard Worker void 113*1c60b9acSAndroid Build Coastguard Worker sul_cb_expire(struct lws_sorted_usec_list *sul); 114*1c60b9acSAndroid Build Coastguard Worker 115*1c60b9acSAndroid Build Coastguard Worker void 116*1c60b9acSAndroid Build Coastguard Worker lws_adns_cache_destroy(lws_adns_cache_t *c); 117*1c60b9acSAndroid Build Coastguard Worker 118*1c60b9acSAndroid Build Coastguard Worker int 119*1c60b9acSAndroid Build Coastguard Worker lws_async_dns_complete(lws_adns_q_t *q, lws_adns_cache_t *c); 120*1c60b9acSAndroid Build Coastguard Worker 121*1c60b9acSAndroid Build Coastguard Worker lws_adns_cache_t * 122*1c60b9acSAndroid Build Coastguard Worker lws_adns_get_cache(lws_async_dns_t *dns, const char *name); 123*1c60b9acSAndroid Build Coastguard Worker 124*1c60b9acSAndroid Build Coastguard Worker void 125*1c60b9acSAndroid Build Coastguard Worker lws_adns_parse_udp(lws_async_dns_t *dns, const uint8_t *pkt, size_t len); 126*1c60b9acSAndroid Build Coastguard Worker 127*1c60b9acSAndroid Build Coastguard Worker lws_adns_q_t * 128*1c60b9acSAndroid Build Coastguard Worker lws_adns_get_query(lws_async_dns_t *dns, adns_query_type_t qtype, 129*1c60b9acSAndroid Build Coastguard Worker lws_dll2_owner_t *owner, uint16_t tid, const char *name); 130*1c60b9acSAndroid Build Coastguard Worker 131*1c60b9acSAndroid Build Coastguard Worker void 132*1c60b9acSAndroid Build Coastguard Worker lws_async_dns_trim_cache(lws_async_dns_t *dns); 133*1c60b9acSAndroid Build Coastguard Worker 134*1c60b9acSAndroid Build Coastguard Worker int 135*1c60b9acSAndroid Build Coastguard Worker lws_async_dns_get_new_tid(struct lws_context *context, lws_adns_q_t *q); 136*1c60b9acSAndroid Build Coastguard Worker 137*1c60b9acSAndroid Build Coastguard Worker 138*1c60b9acSAndroid Build Coastguard Worker #if defined(_DEBUG) 139*1c60b9acSAndroid Build Coastguard Worker void 140*1c60b9acSAndroid Build Coastguard Worker lws_adns_dump(lws_async_dns_t *dns); 141*1c60b9acSAndroid Build Coastguard Worker #else 142*1c60b9acSAndroid Build Coastguard Worker #define lws_adns_dump(_d) 143*1c60b9acSAndroid Build Coastguard Worker #endif 144