resolved-dns-transaction.h revision 0d2cd47617b423f37d7425be7a56ae2fca8ff9f6
2b442ac87838be7c326c984d8751c96dee7258abLennart Poettering/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2b442ac87838be7c326c984d8751c96dee7258abLennart Poettering
2b442ac87838be7c326c984d8751c96dee7258abLennart Poettering#pragma once
2b442ac87838be7c326c984d8751c96dee7258abLennart Poettering
2b442ac87838be7c326c984d8751c96dee7258abLennart Poettering/***
2b442ac87838be7c326c984d8751c96dee7258abLennart Poettering This file is part of systemd.
2b442ac87838be7c326c984d8751c96dee7258abLennart Poettering
2b442ac87838be7c326c984d8751c96dee7258abLennart Poettering Copyright 2014 Lennart Poettering
2b442ac87838be7c326c984d8751c96dee7258abLennart Poettering
2b442ac87838be7c326c984d8751c96dee7258abLennart Poettering systemd is free software; you can redistribute it and/or modify it
2b442ac87838be7c326c984d8751c96dee7258abLennart Poettering under the terms of the GNU Lesser General Public License as published by
2b442ac87838be7c326c984d8751c96dee7258abLennart Poettering the Free Software Foundation; either version 2.1 of the License, or
2b442ac87838be7c326c984d8751c96dee7258abLennart Poettering (at your option) any later version.
2b442ac87838be7c326c984d8751c96dee7258abLennart Poettering
2b442ac87838be7c326c984d8751c96dee7258abLennart Poettering systemd is distributed in the hope that it will be useful, but
2b442ac87838be7c326c984d8751c96dee7258abLennart Poettering WITHOUT ANY WARRANTY; without even the implied warranty of
2b442ac87838be7c326c984d8751c96dee7258abLennart Poettering MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
2b442ac87838be7c326c984d8751c96dee7258abLennart Poettering Lesser General Public License for more details.
2b442ac87838be7c326c984d8751c96dee7258abLennart Poettering
2b442ac87838be7c326c984d8751c96dee7258abLennart Poettering You should have received a copy of the GNU Lesser General Public License
2b442ac87838be7c326c984d8751c96dee7258abLennart Poettering along with systemd; If not, see <http://www.gnu.org/licenses/>.
2b442ac87838be7c326c984d8751c96dee7258abLennart Poettering***/
2b442ac87838be7c326c984d8751c96dee7258abLennart Poettering
2b442ac87838be7c326c984d8751c96dee7258abLennart Poetteringtypedef struct DnsTransaction DnsTransaction;
2b442ac87838be7c326c984d8751c96dee7258abLennart Poetteringtypedef enum DnsTransactionState DnsTransactionState;
2b442ac87838be7c326c984d8751c96dee7258abLennart Poetteringtypedef enum DnsTransactionSource DnsTransactionSource;
2b442ac87838be7c326c984d8751c96dee7258abLennart Poettering
2b442ac87838be7c326c984d8751c96dee7258abLennart Poetteringenum DnsTransactionState {
2b442ac87838be7c326c984d8751c96dee7258abLennart Poettering DNS_TRANSACTION_NULL,
72667f0890372a952a7c5b8cc498ec3cf9440973Lennart Poettering DNS_TRANSACTION_PENDING,
2b442ac87838be7c326c984d8751c96dee7258abLennart Poettering DNS_TRANSACTION_FAILURE,
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering DNS_TRANSACTION_SUCCESS,
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering DNS_TRANSACTION_NO_SERVERS,
111befce5514d590e9b334a547559bd0ecf8df8dThomas Hindoe Paaboel Andersen DNS_TRANSACTION_TIMEOUT,
111befce5514d590e9b334a547559bd0ecf8df8dThomas Hindoe Paaboel Andersen DNS_TRANSACTION_ATTEMPTS_MAX_REACHED,
111befce5514d590e9b334a547559bd0ecf8df8dThomas Hindoe Paaboel Andersen DNS_TRANSACTION_INVALID_REPLY,
111befce5514d590e9b334a547559bd0ecf8df8dThomas Hindoe Paaboel Andersen DNS_TRANSACTION_RESOURCES,
111befce5514d590e9b334a547559bd0ecf8df8dThomas Hindoe Paaboel Andersen DNS_TRANSACTION_ABORTED,
111befce5514d590e9b334a547559bd0ecf8df8dThomas Hindoe Paaboel Andersen _DNS_TRANSACTION_STATE_MAX,
111befce5514d590e9b334a547559bd0ecf8df8dThomas Hindoe Paaboel Andersen _DNS_TRANSACTION_STATE_INVALID = -1
111befce5514d590e9b334a547559bd0ecf8df8dThomas Hindoe Paaboel Andersen};
111befce5514d590e9b334a547559bd0ecf8df8dThomas Hindoe Paaboel Andersen
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poetteringenum DnsTransactionSource {
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering DNS_TRANSACTION_NETWORK,
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering DNS_TRANSACTION_CACHE,
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering DNS_TRANSACTION_ZONE,
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering DNS_TRANSACTION_TRUST_ANCHOR,
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering _DNS_TRANSACTION_SOURCE_MAX,
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering _DNS_TRANSACTION_SOURCE_INVALID = -1
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering};
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering#include "resolved-dns-answer.h"
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering#include "resolved-dns-packet.h"
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering#include "resolved-dns-question.h"
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering#include "resolved-dns-scope.h"
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poetteringstruct DnsTransaction {
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering DnsScope *scope;
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering DnsResourceKey *key;
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering DnsTransactionState state;
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering uint16_t id;
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering bool initial_jitter;
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering DnsPacket *sent, *received;
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering DnsAnswer *answer;
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering int answer_rcode;
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering DnsTransactionSource answer_source;
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering usec_t start_usec;
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering sd_event_source *timeout_event_source;
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering unsigned n_attempts;
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering int dns_udp_fd;
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering sd_event_source *dns_udp_event_source;
7b50eb2efa122200e39646c19a29abab302f7d24Lennart Poettering
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering /* The active server */
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering DnsServer *server;
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering /* the features of the DNS server at time of transaction start */
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering DnsServerFeatureLevel current_features;
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering /* TCP connection logic, if we need it */
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering DnsStream *stream;
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering /* Query candidates this transaction is referenced by and that
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering * shall be notified about this specific transaction
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering * completing. */
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering Set *query_candidates;
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering /* Zone items this transaction is referenced by and that shall
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering * be notified about completion. */
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering Set *zone_items;
7b50eb2efa122200e39646c19a29abab302f7d24Lennart Poettering
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering unsigned block_gc;
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering LIST_FIELDS(DnsTransaction, transactions_by_scope);
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering};
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poetteringint dns_transaction_new(DnsTransaction **ret, DnsScope *s, DnsResourceKey *key);
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart PoetteringDnsTransaction* dns_transaction_free(DnsTransaction *t);
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poetteringvoid dns_transaction_gc(DnsTransaction *t);
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poetteringint dns_transaction_go(DnsTransaction *t);
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering
7b50eb2efa122200e39646c19a29abab302f7d24Lennart Poetteringvoid dns_transaction_process_reply(DnsTransaction *t, DnsPacket *p);
0c8570287400ba57d3705a2f62dd26039121ea6fLennart Poetteringvoid dns_transaction_complete(DnsTransaction *t, DnsTransactionState state);
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poetteringconst char* dns_transaction_state_to_string(DnsTransactionState p) _const_;
0c8570287400ba57d3705a2f62dd26039121ea6fLennart PoetteringDnsTransactionState dns_transaction_state_from_string(const char *s) _pure_;
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poetteringconst char* dns_transaction_source_to_string(DnsTransactionSource p) _const_;
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart PoetteringDnsTransactionSource dns_transaction_source_from_string(const char *s) _pure_;
105e151299dc1208855380be2b22d0db2d66ebc6Lennart Poettering
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering/* LLMNR Jitter interval, see RFC 4795 Section 7 */
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering#define LLMNR_JITTER_INTERVAL_USEC (100 * USEC_PER_MSEC)
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering/* Maximum attempts to send DNS requests, across all DNS servers */
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering#define DNS_TRANSACTION_ATTEMPTS_MAX 16
a3db237b8f1b97867395e1419f39b8ba5749b777Lennart Poettering
2b442ac87838be7c326c984d8751c96dee7258abLennart Poettering/* Maximum attempts to send LLMNR requests, see RFC 4795 Section 2.7 */
2b442ac87838be7c326c984d8751c96dee7258abLennart Poettering#define LLMNR_TRANSACTION_ATTEMPTS_MAX 3
2b442ac87838be7c326c984d8751c96dee7258abLennart Poettering
2b442ac87838be7c326c984d8751c96dee7258abLennart Poettering#define TRANSACTION_ATTEMPTS_MAX(p) ((p) == DNS_PROTOCOL_LLMNR ? LLMNR_TRANSACTION_ATTEMPTS_MAX : DNS_TRANSACTION_ATTEMPTS_MAX)
2b442ac87838be7c326c984d8751c96dee7258abLennart Poettering