Lines Matching defs:pxdns

76 struct pxdns {
117 * pxdns::generation used for this request
122 * Current index into pxdns::resolvers
141 * Chaining for pxdns::request_hash
147 * Chaining for pxdns::timeout_list
153 * Slot in pxdns::timeout_list
177 static void pxdns_create_resolver_sockaddrs(struct pxdns *pxdns,
184 static void pxdns_query(struct pxdns *pxdns, struct udp_pcb *pcb, struct pbuf *p,
187 static int pxdns_rexmit(struct pxdns *pxdns, struct request *req);
188 static int pxdns_forward_outbound(struct pxdns *pxdns, struct request *req);
193 static void pxdns_request_register(struct pxdns *pxdns, struct request *req);
194 static void pxdns_request_deregister(struct pxdns *pxdns, struct request *req);
195 static struct request *pxdns_request_find(struct pxdns *pxdns, u16_t id);
197 static void pxdns_hash_add(struct pxdns *pxdns, struct request *req);
198 static void pxdns_hash_del(struct pxdns *pxdns, struct request *req);
199 static void pxdns_timeout_add(struct pxdns *pxdns, struct request *req);
200 static void pxdns_timeout_del(struct pxdns *pxdns, struct request *req);
208 struct pxdns *pxdns = &g_pxdns;
213 pxdns->pmhdl4.callback = pxdns_pmgr_pump;
214 pxdns->pmhdl4.data = (void *)pxdns;
215 pxdns->pmhdl4.slot = -1;
217 pxdns->pmhdl6.callback = pxdns_pmgr_pump;
218 pxdns->pmhdl6.data = (void *)pxdns;
219 pxdns->pmhdl6.slot = -1;
221 pxdns->pcb4 = udp_new();
222 if (pxdns->pcb4 == NULL) {
227 pxdns->pcb6 = udp_new_ip6();
228 if (pxdns->pcb6 == NULL) {
233 error = udp_bind(pxdns->pcb4, IP_ADDR_ANY, 53);
238 error = udp_bind_ip6(pxdns->pcb6, IP6_ADDR_ANY, 53);
243 udp_recv(pxdns->pcb4, pxdns_recv4, pxdns);
244 udp_recv_ip6(pxdns->pcb6, pxdns_recv6, pxdns);
246 pxdns->sock4 = socket(AF_INET, SOCK_DGRAM, 0);
247 if (pxdns->sock4 == INVALID_SOCKET) {
251 pxdns->sock6 = socket(AF_INET6, SOCK_DGRAM, 0);
252 if (pxdns->sock6 == INVALID_SOCKET) {
257 pxdns->generation = 0;
258 pxdns->nresolvers = 0;
259 pxdns->resolvers = NULL;
260 pxdns_create_resolver_sockaddrs(pxdns, g_proxy_options->nameservers);
262 sys_mutex_new(&pxdns->lock);
264 pxdns->timeout_slot = 0;
265 pxdns->timeout_mask = 0;
268 pollmgr_add(&pxdns->pmhdl4, pxdns->sock4, POLLIN);
269 if (pxdns->sock6 != INVALID_SOCKET) {
270 pollmgr_add(&pxdns->pmhdl6, pxdns->sock6, POLLIN);
276 if (pxdns->pcb4 != NULL) {
277 udp_remove(pxdns->pcb4);
278 pxdns->pcb4 = NULL;
280 if (pxdns->pcb6 != NULL) {
281 udp_remove(pxdns->pcb6);
282 pxdns->pcb4 = NULL;
313 pxdns_create_resolver_sockaddrs(struct pxdns *pxdns, const char **nameservers)
369 if (ai->ai_family == AF_INET6 && pxdns->sock6 == INVALID_SOCKET) {
388 ++pxdns->generation;
389 if (pxdns->resolvers != NULL) {
390 free(pxdns->resolvers);
392 pxdns->resolvers = resolvers;
393 pxdns->nresolvers = nresolvers;
411 pxdns_hash_add(struct pxdns *pxdns, struct request *req)
416 chain = &pxdns->request_hash[HASH(req->id)];
419 ++pxdns->hash_collisions;
427 pxdns_timeout_add(struct pxdns *pxdns, struct request *req)
434 req->timeout_slot = pxdns->timeout_slot;
435 chain = &pxdns->timeout_list[req->timeout_slot];
442 omask = pxdns->timeout_mask;
443 pxdns->timeout_mask |= 1U << req->timeout_slot;
445 sys_timeout(1 * 1000, pxdns_timer, pxdns);
451 pxdns_hash_del(struct pxdns *pxdns, struct request *req)
454 --pxdns->active_queries;
466 pxdns_timeout_del(struct pxdns *pxdns, struct request *req)
478 if (pxdns->timeout_list[req->timeout_slot] == NULL) {
479 pxdns->timeout_mask &= ~(1U << req->timeout_slot);
490 pxdns_request_register(struct pxdns *pxdns, struct request *req)
492 sys_mutex_lock(&pxdns->lock);
494 pxdns_hash_add(pxdns, req);
495 pxdns_timeout_add(pxdns, req);
496 ++pxdns->active_queries;
498 sys_mutex_unlock(&pxdns->lock);
503 pxdns_request_deregister(struct pxdns *pxdns, struct request *req)
505 sys_mutex_lock(&pxdns->lock);
507 pxdns_hash_del(pxdns, req);
508 pxdns_timeout_del(pxdns, req);
509 --pxdns->active_queries;
511 sys_mutex_unlock(&pxdns->lock);
521 pxdns_request_find(struct pxdns *pxdns, u16_t id)
525 sys_mutex_lock(&pxdns->lock);
528 for (req = pxdns->request_hash[HASH(id)]; req != NULL; req = req->next_hash) {
535 pxdns_hash_del(pxdns, req);
536 pxdns_timeout_del(pxdns, req);
537 --pxdns->active_queries;
540 sys_mutex_unlock(&pxdns->lock);
551 struct pxdns *pxdns = (struct pxdns *)arg;
555 sys_mutex_lock(&pxdns->lock);
563 LWIP_ASSERT1(pxdns->timeout_slot < TIMEOUT);
564 if (++pxdns->timeout_slot == TIMEOUT) {
565 pxdns->timeout_slot = 0;
568 chain = &pxdns->timeout_list[pxdns->timeout_slot];
574 if (pxdns_rexmit(pxdns, expired)) {
578 pxdns_hash_del(pxdns, expired);
579 pxdns_timeout_del(pxdns, expired);
580 ++pxdns->expired_queries;
585 if (pxdns->timeout_list[pxdns->timeout_slot] == NULL) {
586 pxdns->timeout_mask &= ~(1U << pxdns->timeout_slot);
589 pxdns->timeout_mask |= 1U << pxdns->timeout_slot;
591 mask = pxdns->timeout_mask;
593 sys_mutex_unlock(&pxdns->lock);
596 sys_timeout(1 * 1000, pxdns_timer, pxdns);
605 struct pxdns *pxdns = (struct pxdns *)arg;
606 pxdns_query(pxdns, pcb, p, ip_2_ipX(addr), port);
613 struct pxdns *pxdns = (struct pxdns *)arg;
614 pxdns_query(pxdns, pcb, p, ip6_2_ipX(addr), port);
619 pxdns_query(struct pxdns *pxdns, struct udp_pcb *pcb, struct pbuf *p,
625 if (pxdns->nresolvers == 0) {
648 req->id = pxdns->id++;
652 req->generation = pxdns->generation;
664 pxdns_request_register(pxdns, req);
666 sent = pxdns_forward_outbound(pxdns, req);
668 sent = pxdns_rexmit(pxdns, req);
671 pxdns_request_deregister(pxdns, req);
678 * Forward request to the req::residx resolver in the pxdns::resolvers
684 pxdns_forward_outbound(struct pxdns *pxdns, struct request *req)
692 LWIP_ASSERT1(req->generation == pxdns->generation);
693 LWIP_ASSERT1(req->residx < pxdns->nresolvers);
694 resolver = &pxdns->resolvers[req->residx];
697 nsent = sendto(pxdns->sock4, req->data, req->size, 0,
702 if (pxdns->sock6 != INVALID_SOCKET) {
703 nsent = sendto(pxdns->sock6, req->data, req->size, 0,
732 * Forward request to the next resolver in the pxdns::resolvers array
736 pxdns_rexmit(struct pxdns *pxdns, struct request *req)
740 if (/* __predict_false */ req->generation != pxdns->generation) {
741 DPRINTF2(("%s: req %p: generation %lu != pxdns generation %lu\n",
744 (unsigned long)pxdns->generation));
748 LWIP_ASSERT1(req->residx < pxdns->nresolvers);
750 if (++req->residx == pxdns->nresolvers) {
754 sent = pxdns_forward_outbound(pxdns, req);
764 struct pxdns *pxdns;
770 pxdns = (struct pxdns *)handler->data;
771 LWIP_ASSERT1(handler == &pxdns->pmhdl4 || handler == &pxdns->pmhdl6);
772 LWIP_ASSERT1(fd == (handler == &pxdns->pmhdl4 ? pxdns->sock4 : pxdns->sock6));
817 req = pxdns_request_find(pxdns, id);
820 ++pxdns->late_answers;