static void pico_dns_client_retransmission(unsigned long now, void *arg) { struct pico_dns_key *key = (struct pico_dns_key *)arg; struct pico_dns_ns *q_ns = NULL; if (!key->retrans) { dns_dbg("DNS: no retransmission!\n"); pico_free(key->q_hdr); if(pico_tree_delete(&DNSTable,key)) pico_free(key); } else if (key->retrans <= PICO_DNS_CLIENT_MAX_RETRANS) { key->retrans++; dns_dbg("DNS: retransmission! (%u attempts)\n", key->retrans); // ugly hack q_ns = pico_tree_next(pico_tree_findNode(&NSTable,&key->q_ns))->keyValue; if (q_ns) key->q_ns = *q_ns; else key->q_ns = *((struct pico_dns_ns *)pico_tree_first(&NSTable)); pico_dns_client_send(key); pico_timer_add(PICO_DNS_CLIENT_RETRANS, pico_dns_client_retransmission, key); } else { dns_dbg("DNS ERROR: no reply from nameservers! (%u attempts)\n", key->retrans); pico_socket_close(key->s); pico_err = PICO_ERR_EIO; key->callback(NULL, key->arg); pico_free(key->q_hdr); /* RB_REMOVE returns pointer to removed element, NULL to indicate error */ if(pico_tree_delete(&DNSTable,key)) pico_free(key); } }
static struct pico_dns_ns pico_dns_client_next_ns(struct pico_ip4 *ns_addr) { struct pico_dns_ns dns = {{0}}, *nxtdns = NULL; struct pico_tree_node *node = NULL, *nxtnode = NULL; dns.ns = *ns_addr; node = pico_tree_findNode(&NSTable, &dns); if (!node) return dns; /* keep using current NS */ nxtnode = pico_tree_next(node); nxtdns = nxtnode->keyValue; if (!nxtdns) nxtdns = (struct pico_dns_ns *)pico_tree_first(&NSTable); return *nxtdns; }