#include "sd-bus.h"
#include "util.h"
+#include "set.h"
typedef struct DnsQuery DnsQuery;
typedef struct DnsQueryTransaction DnsQueryTransaction;
#include "resolved-dns-scope.h"
#include "resolved-dns-rr.h"
#include "resolved-dns-packet.h"
+#include "resolved-dns-question.h"
+#include "resolved-dns-answer.h"
typedef enum DnsQueryState {
DNS_QUERY_NULL,
- DNS_QUERY_SENT,
+ DNS_QUERY_PENDING,
DNS_QUERY_FAILURE,
DNS_QUERY_SUCCESS,
DNS_QUERY_NO_SERVERS,
DNS_QUERY_ATTEMPTS_MAX,
DNS_QUERY_INVALID_REPLY,
DNS_QUERY_RESOURCES,
+ DNS_QUERY_ABORTED,
} DnsQueryState;
struct DnsQueryTransaction {
- DnsQuery *query;
DnsScope *scope;
+ DnsQuestion *question;
+
DnsQueryState state;
uint16_t id;
+ DnsPacket *sent, *received;
+ DnsAnswer *cached;
+
sd_event_source *timeout_event_source;
unsigned n_attempts;
- DnsPacket *sent, *received;
-
/* TCP connection logic */
int tcp_fd;
sd_event_source *tcp_event_source;
size_t tcp_written, tcp_read;
be16_t tcp_read_size;
- LIST_FIELDS(DnsQueryTransaction, transactions_by_query);
+ /* Queries this transaction is referenced by and that shall by
+ * notified about this specific transaction completing. */
+ Set *queries;
+
+ unsigned block_gc;
+
LIST_FIELDS(DnsQueryTransaction, transactions_by_scope);
};
struct DnsQuery {
Manager *manager;
-
- DnsResourceKey *keys;
- unsigned n_keys;
+ DnsQuestion *question;
DnsQueryState state;
+ unsigned n_cname_redirects;
sd_event_source *timeout_event_source;
+ /* Discovered data */
DnsPacket *received;
+ DnsAnswer *answer;
+ int answer_ifindex;
+ int answer_rcode;
+ /* Bus client information */
sd_bus_message *request;
- unsigned char request_family;
+ int request_family;
const char *request_hostname;
union in_addr_union request_address;
+ /* Completion callback */
void (*complete)(DnsQuery* q);
+ unsigned block_ready;
+
+ Set *transactions;
- LIST_HEAD(DnsQueryTransaction, transactions);
LIST_FIELDS(DnsQuery, queries);
};
-int dns_query_new(Manager *m, DnsQuery **q, DnsResourceKey *keys, unsigned n_keys);
+DnsQueryTransaction* dns_query_transaction_free(DnsQueryTransaction *t);
+void dns_query_transaction_complete(DnsQueryTransaction *t, DnsQueryState state);
+
+void dns_query_transaction_process_reply(DnsQueryTransaction *t, DnsPacket *p);
+
+int dns_query_new(Manager *m, DnsQuery **q, DnsQuestion *question);
DnsQuery *dns_query_free(DnsQuery *q);
-int dns_query_start(DnsQuery *q);
-void dns_query_finish(DnsQuery *q);
-DnsQueryTransaction* dns_query_transaction_free(DnsQueryTransaction *t);
-int dns_query_transaction_start(DnsQueryTransaction *t);
-void dns_query_transaction_reply(DnsQueryTransaction *t, DnsPacket *p);
+int dns_query_go(DnsQuery *q);
+void dns_query_ready(DnsQuery *q);
+
+int dns_query_cname_redirect(DnsQuery *q, const char *name);
DEFINE_TRIVIAL_CLEANUP_FUNC(DnsQuery*, dns_query_free);