| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- /*
- * libwebsockets - small server side websockets and web server implementation
- *
- * Copyright (C) 2010 - 2019 Andy Green <[email protected]>
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to
- * deal in the Software without restriction, including without limitation the
- * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- * sell copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
- */
- #define DNS_MAX 96 /* Maximum host name */
- #define DNS_RECURSION_LIMIT 3
- #define DNS_PACKET_LEN 1400 /* Buffer size for DNS packet */
- #define MAX_CACHE_ENTRIES 10 /* Dont cache more than that */
- #define DNS_QUERY_TIMEOUT 30 /* Query timeout, seconds */
- /*
- * ... when we completed a query then the query object is destroyed and a
- * cache object below is created with the results in getaddrinfo format
- * appended to the allocation
- */
- typedef struct lws_adns_cache {
- lws_sorted_usec_list_t sul; /* for cache TTL management */
- lws_dll2_t list;
- struct lws_adns_cache *firstcache;
- struct lws_adns_cache *chain;
- struct addrinfo *results;
- uint8_t flags; /* b0 = has ipv4, b1 = has ipv6 */
- char refcount;
- char incomplete;
- /* name, and then result struct addrinfos overallocated here */
- } lws_adns_cache_t;
- /*
- * these objects are used while a query is ongoing...
- */
- typedef struct {
- lws_sorted_usec_list_t sul; /* per-query write retry timer */
- lws_dll2_t list;
- lws_dll2_owner_t wsi_adns;
- lws_async_dns_cb_t standalone_cb; /* if not associated to wsi */
- struct lws_context *context;
- void *opaque;
- struct addrinfo **last;
- lws_async_dns_t *dns;
- lws_adns_cache_t *firstcache;
- lws_async_dns_retcode_t ret;
- uint16_t tid;
- uint16_t qtype;
- uint16_t retry;
- uint8_t tsi;
- #if defined(LWS_WITH_IPV6)
- uint8_t sent[2];
- #else
- uint8_t sent[1];
- #endif
- uint8_t asked;
- uint8_t responded;
- uint8_t recursion;
- /* name overallocated here */
- } lws_adns_q_t;
- enum {
- DHO_TID,
- DHO_FLAGS = 2,
- DHO_NQUERIES = 4,
- DHO_NANSWERS = 6,
- DHO_NAUTH = 8,
- DHO_NOTHER = 10,
- DHO_SIZEOF = 12 /* last */
- };
- void
- lws_adns_q_destroy(lws_adns_q_t *q);
- void
- sul_cb_expire(struct lws_sorted_usec_list *sul);
- void
- lws_adns_cache_destroy(lws_adns_cache_t *c);
- int
- lws_async_dns_complete(lws_adns_q_t *q, lws_adns_cache_t *c);
- lws_adns_cache_t *
- lws_adns_get_cache(lws_async_dns_t *dns, const char *name);
- void
- lws_adns_parse_udp(lws_async_dns_t *dns, const uint8_t *pkt, size_t len);
- lws_adns_q_t *
- lws_adns_get_query(lws_async_dns_t *dns, adns_query_type_t qtype,
- lws_dll2_owner_t *owner, uint16_t tid, const char *name);
- void
- lws_async_dns_trim_cache(lws_async_dns_t *dns);
- int
- lws_async_dns_get_new_tid(struct lws_context *context, lws_adns_q_t *q);
|