resolved-dns-transaction.h revision 801ad6a6a9cd8fbd58b9f9c27f20dbb3c87d47dd
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt#pragma once
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt/***
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt This file is part of systemd.
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt Copyright 2014 Lennart Poettering
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt systemd is free software; you can redistribute it and/or modify it
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt under the terms of the GNU Lesser General Public License as published by
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt the Free Software Foundation; either version 2.1 of the License, or
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt (at your option) any later version.
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt systemd is distributed in the hope that it will be useful, but
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt WITHOUT ANY WARRANTY; without even the implied warranty of
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt Lesser General Public License for more details.
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt You should have received a copy of the GNU Lesser General Public License
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt along with systemd; If not, see <http://www.gnu.org/licenses/>.
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt***/
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykttypedef struct DnsTransaction DnsTransaction;
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykttypedef enum DnsTransactionState DnsTransactionState;
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flyktenum DnsTransactionState {
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt DNS_TRANSACTION_NULL,
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt DNS_TRANSACTION_PENDING,
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt DNS_TRANSACTION_FAILURE,
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt DNS_TRANSACTION_SUCCESS,
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt DNS_TRANSACTION_NO_SERVERS,
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt DNS_TRANSACTION_TIMEOUT,
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt DNS_TRANSACTION_ATTEMPTS_MAX_REACHED,
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt DNS_TRANSACTION_INVALID_REPLY,
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt DNS_TRANSACTION_RESOURCES,
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt DNS_TRANSACTION_ABORTED,
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt _DNS_TRANSACTION_STATE_MAX,
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt _DNS_TRANSACTION_STATE_INVALID = -1
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt};
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt#include "resolved-dns-answer.h"
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt#include "resolved-dns-packet.h"
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt#include "resolved-dns-question.h"
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt#include "resolved-dns-scope.h"
85bd849f09aceb7f972a0697494ea22b2247a5d7Patrik Flykt
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flyktstruct DnsTransaction {
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt DnsScope *scope;
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt DnsResourceKey *key;
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt DnsTransactionState state;
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt uint16_t id;
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt bool initial_jitter;
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt DnsPacket *sent, *received;
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt DnsAnswer *cached;
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt int cached_rcode;
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt usec_t start_usec;
85bd849f09aceb7f972a0697494ea22b2247a5d7Patrik Flykt sd_event_source *timeout_event_source;
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt unsigned n_attempts;
85bd849f09aceb7f972a0697494ea22b2247a5d7Patrik Flykt
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt int dns_udp_fd;
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt sd_event_source *dns_udp_event_source;
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt
85bd849f09aceb7f972a0697494ea22b2247a5d7Patrik Flykt /* The active server */
85bd849f09aceb7f972a0697494ea22b2247a5d7Patrik Flykt DnsServer *server;
85bd849f09aceb7f972a0697494ea22b2247a5d7Patrik Flykt
85bd849f09aceb7f972a0697494ea22b2247a5d7Patrik Flykt /* TCP connection logic, if we need it */
85bd849f09aceb7f972a0697494ea22b2247a5d7Patrik Flykt DnsStream *stream;
85bd849f09aceb7f972a0697494ea22b2247a5d7Patrik Flykt
85bd849f09aceb7f972a0697494ea22b2247a5d7Patrik Flykt /* Query candidates this transaction is referenced by and that
85bd849f09aceb7f972a0697494ea22b2247a5d7Patrik Flykt * shall be notified about this specific transaction
85bd849f09aceb7f972a0697494ea22b2247a5d7Patrik Flykt * completing. */
85bd849f09aceb7f972a0697494ea22b2247a5d7Patrik Flykt Set *query_candidates;
85bd849f09aceb7f972a0697494ea22b2247a5d7Patrik Flykt
85bd849f09aceb7f972a0697494ea22b2247a5d7Patrik Flykt /* Zone items this transaction is referenced by and that shall
85bd849f09aceb7f972a0697494ea22b2247a5d7Patrik Flykt * be notified about completion. */
85bd849f09aceb7f972a0697494ea22b2247a5d7Patrik Flykt Set *zone_items;
85bd849f09aceb7f972a0697494ea22b2247a5d7Patrik Flykt
85bd849f09aceb7f972a0697494ea22b2247a5d7Patrik Flykt unsigned block_gc;
85bd849f09aceb7f972a0697494ea22b2247a5d7Patrik Flykt
85bd849f09aceb7f972a0697494ea22b2247a5d7Patrik Flykt LIST_FIELDS(DnsTransaction, transactions_by_scope);
85bd849f09aceb7f972a0697494ea22b2247a5d7Patrik Flykt};
85bd849f09aceb7f972a0697494ea22b2247a5d7Patrik Flykt
85bd849f09aceb7f972a0697494ea22b2247a5d7Patrik Flyktint dns_transaction_new(DnsTransaction **ret, DnsScope *s, DnsResourceKey *key);
85bd849f09aceb7f972a0697494ea22b2247a5d7Patrik FlyktDnsTransaction* dns_transaction_free(DnsTransaction *t);
85bd849f09aceb7f972a0697494ea22b2247a5d7Patrik Flykt
85bd849f09aceb7f972a0697494ea22b2247a5d7Patrik Flyktvoid dns_transaction_gc(DnsTransaction *t);
85bd849f09aceb7f972a0697494ea22b2247a5d7Patrik Flyktint dns_transaction_go(DnsTransaction *t);
85bd849f09aceb7f972a0697494ea22b2247a5d7Patrik Flykt
85bd849f09aceb7f972a0697494ea22b2247a5d7Patrik Flyktvoid dns_transaction_process_reply(DnsTransaction *t, DnsPacket *p);
85bd849f09aceb7f972a0697494ea22b2247a5d7Patrik Flyktvoid dns_transaction_complete(DnsTransaction *t, DnsTransactionState state);
85bd849f09aceb7f972a0697494ea22b2247a5d7Patrik Flykt
85bd849f09aceb7f972a0697494ea22b2247a5d7Patrik Flyktconst char* dns_transaction_state_to_string(DnsTransactionState p) _const_;
85bd849f09aceb7f972a0697494ea22b2247a5d7Patrik FlyktDnsTransactionState dns_transaction_state_from_string(const char *s) _pure_;
85bd849f09aceb7f972a0697494ea22b2247a5d7Patrik Flykt
85bd849f09aceb7f972a0697494ea22b2247a5d7Patrik Flykt/* LLMNR Jitter interval, see RFC 4795 Section 7 */
85bd849f09aceb7f972a0697494ea22b2247a5d7Patrik Flykt#define LLMNR_JITTER_INTERVAL_USEC (100 * USEC_PER_MSEC)
85bd849f09aceb7f972a0697494ea22b2247a5d7Patrik Flykt
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt/* Maximum attempts to send DNS requests, across all DNS servers */
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt#define DNS_TRANSACTION_ATTEMPTS_MAX 16
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt/* Maximum attempts to send LLMNR requests, see RFC 4795 Section 2.7 */
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt#define LLMNR_TRANSACTION_ATTEMPTS_MAX 3
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt#define TRANSACTION_ATTEMPTS_MAX(p) (p == DNS_PROTOCOL_LLMNR ? LLMNR_TRANSACTION_ATTEMPTS_MAX : DNS_TRANSACTION_ATTEMPTS_MAX)
5c79bd79839f1e50bd3c34a0670037f7965ca5a4Patrik Flykt