• Home
  • Raw
  • Download

Lines Matching +full:d3 +full:- +full:force

2  * libwebsockets - small server side websockets and web server implementation
4 * Copyright (C) 2010 - 2020 Andy Green <andy@warmcat.com>
25 #include "private-lib-core.h"
26 #include "private-lib-async-dns.h"
37 lws_metrics_caliper_report(q->metcal, (char)q->go_nogo); in lws_adns_q_destroy()
39 lws_sul_cancel(&q->sul); in lws_adns_q_destroy()
40 lws_sul_cancel(&q->write_sul); in lws_adns_q_destroy()
41 lws_dll2_remove(&q->list); in lws_adns_q_destroy()
52 int n = 0, nmax = q->tids >= LWS_ARRAY_SIZE(q->tid) ? in lws_adns_get_query()
53 LWS_ARRAY_SIZE(q->tid) : q->tids; in lws_adns_get_query()
57 if ((tid & 0xfffe) == (q->tid[n] & 0xfffe)) in lws_adns_get_query()
60 if (name && q->qtype == ((tid & 1) ? LWS_ADNS_RECORD_AAAA : in lws_adns_get_query()
63 if (owner == &dns->cached) { in lws_adns_get_query()
65 lws_dll2_remove(&q->list); in lws_adns_get_query()
66 lws_dll2_add_head(&q->list, &dns->cached); in lws_adns_get_query()
79 context->async_dns.dns_server_set = 0; in lws_async_dns_drop_server()
80 lws_set_timeout(context->async_dns.wsi, 1, LWS_TO_KILL_ASYNC); in lws_async_dns_drop_server()
81 context->async_dns.wsi = NULL; in lws_async_dns_drop_server()
82 context->async_dns.dns_server_connected = 0; in lws_async_dns_drop_server()
90 lws_dll2_get_head(&q->wsi_adns)) { in lws_async_dns_complete()
94 if (c && c->results) { in lws_async_dns_complete()
95 lwsl_wsi_debug(w, "q: %p, c: %p, refcount %d -> %d", in lws_async_dns_complete()
96 q, c, c->refcount, c->refcount + 1); in lws_async_dns_complete()
97 c->refcount++; in lws_async_dns_complete()
103 if (w->adns_cb(w, (const char *)&q[1], c ? c->results : NULL, 0, in lws_async_dns_complete()
104 q->opaque) == NULL) in lws_async_dns_complete()
112 if (q->standalone_cb) { in lws_async_dns_complete()
113 if (c && c->results) { in lws_async_dns_complete()
114 lwsl_wsi_debug(q->dns ? q->dns->wsi : NULL, "q: %p, c: %p, refcount %d -> %d", in lws_async_dns_complete()
115 q, c, c->refcount, c->refcount + 1); in lws_async_dns_complete()
116 c->refcount++; in lws_async_dns_complete()
119 q->standalone_cb(NULL, (const char *)&q[1], in lws_async_dns_complete()
120 c ? c->results : NULL, 0, q->opaque); in lws_async_dns_complete()
123 lws_adns_dump(q->dns); in lws_async_dns_complete()
133 lwsl_wsi_info(q->dns ? q->dns->wsi : NULL, "in"); in lws_async_dns_sul_cb_retry()
134 lws_adns_dump(q->dns); in lws_async_dns_sul_cb_retry()
136 if (q->dns && q->dns->wsi) { in lws_async_dns_sul_cb_retry()
137 q->is_retry = 1; in lws_async_dns_sul_cb_retry()
138 lws_callback_on_writable(q->dns->wsi); in lws_async_dns_sul_cb_retry()
153 lws_sul_cancel(&q->write_sul); in lws_async_dns_writeable()
155 if (!q->is_retry && q->sent[0] in lws_async_dns_writeable()
157 && q->sent[0] == q->sent[1] in lws_async_dns_writeable()
162 q->is_retry = 0; in lws_async_dns_writeable()
176 if (lws_dll2_is_detached(&q->sul.list) && in lws_async_dns_writeable()
177 lws_retry_sul_schedule_retry_wsi(wsi, &q->sul, in lws_async_dns_writeable()
178 lws_async_dns_sul_cb_retry, &q->retry)) { in lws_async_dns_writeable()
182 * our policy is to force reloading the dns server info in lws_async_dns_writeable()
187 lws_async_dns_drop_server(q->context); in lws_async_dns_writeable()
197 if (!q->responded) { in lws_async_dns_writeable()
199 which = q->sent[0] >= q->sent[1]; in lws_async_dns_writeable()
200 q->sent[which]++; in lws_async_dns_writeable()
201 q->asked = 3; /* want results for 4 & 6 before done */ in lws_async_dns_writeable()
203 which = q->responded & 1; in lws_async_dns_writeable()
206 q->asked = 1; in lws_async_dns_writeable()
223 /* start of label-formatted qname */ in lws_async_dns_writeable()
250 assert(p < pkt + sizeof(pkt) - LWS_PRE); in lws_async_dns_writeable()
261 if (!q->responded && q->sent[0] != q->sent[1]) { in lws_async_dns_writeable()
276 if (q->firstcache) { in lws_async_dns_writeable()
278 lws_adns_cache_destroy(q->firstcache); in lws_async_dns_writeable()
279 q->firstcache = NULL; in lws_async_dns_writeable()
289 struct lws_async_dns *dns = &(lws_get_context(wsi)->async_dns); in callback_async_dns()
312 dns->waiting.head) { in callback_async_dns()
316 if (//lws_dll2_is_detached(&q->sul.list) && in callback_async_dns()
317 (!q->asked || q->responded != q->asked)) in callback_async_dns()
330 "lws-async-dns", callback_async_dns, 0, 0, 0, NULL, 0
336 lws_async_dns_t *dns = &context->async_dns; in lws_async_dns_init()
340 if (dns->wsi) in lws_async_dns_init()
343 if (!context->vhost_list) { /* coverity... system vhost always present */ in lws_async_dns_init()
348 memset(&dns->sa46, 0, sizeof(dns->sa46)); in lws_async_dns_init()
351 if (lws_dhcpc_status(context, &dns->sa46)) in lws_async_dns_init()
355 n = lws_plat_asyncdns_init(context, &dns->sa46); in lws_async_dns_init()
368 dns->sa46.sa4.sin_port = htons(53); in lws_async_dns_init()
369 lws_write_numeric_address((uint8_t *)&dns->sa46.sa4.sin_addr.s_addr, 4, in lws_async_dns_init()
372 dns->wsi = lws_create_adopt_udp(context->vhost_list, ads, 53, 0, in lws_async_dns_init()
375 if (!dns->wsi) { in lws_async_dns_init()
380 context->async_dns.wsi->udp->sa46 = dns->sa46; in lws_async_dns_init()
382 dns->dns_server_set = 1; in lws_async_dns_init()
398 lws_dll2_get_head(&dns->cached)) { in lws_adns_get_cache()
401 // lwsl_wsi_notice(dns->wsi, "%s vs %s (inc %d)", name, c->name, c->incomplete); in lws_adns_get_cache()
403 if (!c->incomplete && !strcasecmp(name, c->name)) { in lws_adns_get_cache()
405 lws_dll2_remove(&c->list); in lws_adns_get_cache()
406 lws_dll2_add_head(&c->list, &dns->cached); in lws_adns_get_cache()
424 lwsl_wsi_info(dns->wsi, "ADNS cache %u entries", in lws_adns_dump()
425 (unsigned int)dns->cached.count); in lws_adns_dump()
428 lws_dll2_get_head(&dns->cached)) { in lws_adns_dump()
431 lwsl_wsi_info(dns->wsi, "cache: '%s', exp: %lldus, incomp %d, " in lws_adns_dump()
432 "fl 0x%x, refc %d, res %p\n", c->name, in lws_adns_dump()
433 (long long)(c->sul.us - lws_now_usecs()), in lws_adns_dump()
434 c->incomplete, c->flags, c->refcount, c->results); in lws_adns_dump()
438 lws_dll2_get_head(&dns->waiting)) { in lws_adns_dump()
441 lwsl_wsi_info(dns->wsi, "q: '%s', sent %d, resp %d", in lws_adns_dump()
442 (const char *)&q[1], q->sent[0], in lws_adns_dump()
443 q->responded); in lws_adns_dump()
451 lws_dll2_remove(&c->sul.list); in lws_adns_cache_destroy()
452 lws_dll2_remove(&c->list); in lws_adns_cache_destroy()
453 if (c->chain) in lws_adns_cache_destroy()
454 lws_free(c->chain); in lws_adns_cache_destroy()
485 lwsl_wsi_info(q->dns ? q->dns->wsi : NULL, "failing"); in sul_cb_write()
486 lws_adns_dump(q->dns); in sul_cb_write()
503 * looking backwards from ai, which is c->result, which is the second in lws_async_dns_freeaddrinfo()
509 c = &((lws_adns_cache_t *)(*pai))[-1]; in lws_async_dns_freeaddrinfo()
510 if (c->firstcache) in lws_async_dns_freeaddrinfo()
511 c = c->firstcache; in lws_async_dns_freeaddrinfo()
513 lwsl_debug("%s: c %p, %s, refcount %d -> %d\n", __func__, c, in lws_async_dns_freeaddrinfo()
514 (c->results && c->results->ai_canonname) ? in lws_async_dns_freeaddrinfo()
515 c->results->ai_canonname : "none", in lws_async_dns_freeaddrinfo()
516 c->refcount, c->refcount - 1); in lws_async_dns_freeaddrinfo()
518 assert(c->refcount > 0); in lws_async_dns_freeaddrinfo()
519 c->refcount--; in lws_async_dns_freeaddrinfo()
528 if (dns->cached.count + 1< MAX_CACHE_ENTRIES) in lws_async_dns_trim_cache()
531 c1 = lws_container_of(lws_dll2_get_tail(&dns->cached), in lws_async_dns_trim_cache()
533 if (c1->refcount) in lws_async_dns_trim_cache()
534 lwsl_wsi_info(dns->wsi, "acache %p: refcount %d on purge", in lws_async_dns_trim_cache()
535 c1, c1->refcount); in lws_async_dns_trim_cache()
552 lws_dll2_foreach_safe(&dns->waiting, NULL, clean); in lws_async_dns_deinit()
553 lws_dll2_foreach_safe(&dns->cached, NULL, cache_clean); in lws_async_dns_deinit()
555 if (dns->wsi && !dns->dns_server_connected) { in lws_async_dns_deinit()
556 lwsl_wsi_notice(dns->wsi, "late free of incomplete dns wsi"); in lws_async_dns_deinit()
557 __lws_lc_untag(dns->wsi->a.context, &dns->wsi->lc); in lws_async_dns_deinit()
559 lws_metrics_tags_destroy(&dns->wsi->cal_conn.mtags_owner); in lws_async_dns_deinit()
561 lws_free_set_NULL(dns->wsi->udp); in lws_async_dns_deinit()
562 lws_free_set_NULL(dns->wsi); in lws_async_dns_deinit()
572 lws_start_foreach_dll_safe(struct lws_dll2 *, d3, d4, in cancel()
573 lws_dll2_get_head(&q->wsi_adns)) { in cancel()
574 struct lws *w = lws_container_of(d3, struct lws, adns); in cancel()
577 lws_dll2_remove(d3); in cancel()
578 if (!q->wsi_adns.count) in cancel()
582 } lws_end_foreach_dll_safe(d3, d4); in cancel()
590 lws_async_dns_t *dns = &wsi->a.context->async_dns; in lws_async_dns_cancel()
592 lws_dll2_foreach_safe(&dns->waiting, wsi, cancel); in lws_async_dns_cancel()
600 int n = 0, nmax = q->tids >= LWS_ARRAY_SIZE(q->tid) ? in check_tid()
601 LWS_ARRAY_SIZE(q->tid) : q->tids; in check_tid()
605 if (check == q->tid[n]) in check_tid()
614 lws_async_dns_t *dns = &context->async_dns; in lws_async_dns_get_new_tid()
624 return -1; in lws_async_dns_get_new_tid()
626 if (lws_dll2_foreach_safe(&dns->waiting, in lws_async_dns_get_new_tid()
630 q->tids++; in lws_async_dns_get_new_tid()
635 } while (budget--); in lws_async_dns_get_new_tid()
639 return -1; in lws_async_dns_get_new_tid()
652 lws_async_dns_t *dns = &context->async_dns; in lws_async_dns_query()
673 if (nlen >= DNS_MAX - 1) in lws_async_dns_query()
690 if (!lws_dll2_is_detached(&wsi->adns)) { in lws_async_dns_query()
692 lws_wsi_tag(wsi), wsi->adns.owner); in lws_async_dns_query()
695 wsi->adns_cb = cb; in lws_async_dns_query()
702 lwsl_cx_info(context, "%s: using cached, c->results %p", in lws_async_dns_query()
703 name, c->results); in lws_async_dns_query()
704 m = c->results ? LADNS_RET_FOUND : LADNS_RET_FAILED; in lws_async_dns_query()
705 if (c->results) in lws_async_dns_query()
706 c->refcount++; in lws_async_dns_query()
709 lws_metric_event(context->mt_adns_cache, METRES_GO, 0); in lws_async_dns_query()
712 if (cb(wsi, name, c->results, m, opaque) == NULL) in lws_async_dns_query()
720 lws_metric_event(context->mt_adns_cache, METRES_NOGO, 0); in lws_async_dns_query()
741 sizeof(lws_sockaddr46) + nlen + 1, "adns-numip"); in lws_async_dns_query()
748 ai->ai_socktype = SOCK_STREAM; in lws_async_dns_query()
749 c->name = (const char *)&sa46[1]; in lws_async_dns_query()
750 memcpy((char *)c->name, name, nlen + 1); in lws_async_dns_query()
751 ai->ai_canonname = (char *)&sa46[1]; in lws_async_dns_query()
753 c->results = ai; in lws_async_dns_query()
757 wsi->adns_cb = cb; in lws_async_dns_query()
758 lws_dll2_add_head(&wsi->adns, &tmq.tq.wsi_adns); in lws_async_dns_query()
763 lws_dll2_add_head(&c->list, &dns->cached); in lws_async_dns_query()
764 lws_sul_schedule(context, 0, &c->sul, sul_cb_expire, in lws_async_dns_query()
773 ai->ai_family = sa46->sa4.sin_family = AF_INET; in lws_async_dns_query()
774 ai->ai_addrlen = sizeof(sa46->sa4); in lws_async_dns_query()
775 ai->ai_addr = (struct sockaddr *)&sa46->sa4; in lws_async_dns_query()
776 memcpy(&sa46->sa4.sin_addr, ads, (unsigned int)m); in lws_async_dns_query()
785 ai->ai_family = sa46->sa6.sin6_family = AF_INET6; in lws_async_dns_query()
786 ai->ai_addrlen = sizeof(sa46->sa6); in lws_async_dns_query()
787 ai->ai_addr = (struct sockaddr *)&sa46->sa6; in lws_async_dns_query()
788 memcpy(&sa46->sa6.sin6_addr, ads, (unsigned int)m); in lws_async_dns_query()
800 if (!context->async_dns.dns_server_set && in lws_async_dns_query()
808 q = lws_adns_get_query(dns, qtype, &dns->waiting, 0, name); in lws_async_dns_query()
813 lws_dll2_add_head(&wsi->adns, &q->wsi_adns); in lws_async_dns_query()
845 lws_dll2_add_head(&wsi->adns, &q->wsi_adns); in lws_async_dns_query()
847 q->qtype = (uint16_t)qtype; in lws_async_dns_query()
855 q->context = context; in lws_async_dns_query()
856 q->tsi = (uint8_t)tsi; in lws_async_dns_query()
857 q->opaque = opaque; in lws_async_dns_query()
858 q->dns = dns; in lws_async_dns_query()
861 q->standalone_cb = cb; in lws_async_dns_query()
864 if (lws_retry_sul_schedule_retry_wsi(dns->wsi, &q->sul, in lws_async_dns_query()
865 lws_async_dns_sul_cb_retry, &q->retry)) in lws_async_dns_query()
869 lws_sul_schedule(context, 0, &q->write_sul, sul_cb_write, LWS_US_PER_SEC); in lws_async_dns_query()
878 while (nlen--) { in lws_async_dns_query()
880 p[DNS_MAX - 1] = p[-1]; in lws_async_dns_query()
885 lws_callback_on_writable(dns->wsi); in lws_async_dns_query()
887 lws_dll2_add_head(&q->list, &dns->waiting); in lws_async_dns_query()
889 lws_metrics_caliper_bind(q->metcal, context->mt_conn_dns); in lws_async_dns_query()
890 q->go_nogo = METRES_NOGO; in lws_async_dns_query()