mirror of
https://github.com/systemd/systemd.git
synced 2024-11-08 11:27:32 +03:00
resolved: transaction - introduce dns_transaction_emit()
This function emits the UDP packet via the scope, but first it will determine the current server (and connect to it) and store the server in the transaction. This should not change the behavior, but simplifies the code.
This commit is contained in:
parent
c19ffd9fbf
commit
471d40d92f
@ -125,18 +125,17 @@ void dns_scope_next_dns_server(DnsScope *s) {
|
||||
manager_next_dns_server(s->manager);
|
||||
}
|
||||
|
||||
int dns_scope_emit(DnsScope *s, DnsTransaction *t, DnsPacket *p, DnsServer **server) {
|
||||
DnsServer *srv = NULL;
|
||||
int dns_scope_emit(DnsScope *s, int fd, DnsPacket *p) {
|
||||
union in_addr_union addr;
|
||||
int ifindex = 0, r;
|
||||
int family;
|
||||
uint16_t port;
|
||||
uint32_t mtu;
|
||||
int fd;
|
||||
|
||||
assert(s);
|
||||
assert(p);
|
||||
assert(p->protocol == s->protocol);
|
||||
assert((s->protocol == DNS_PROTOCOL_DNS) != (fd < 0));
|
||||
|
||||
if (s->link) {
|
||||
mtu = s->link->mtu;
|
||||
@ -154,14 +153,6 @@ int dns_scope_emit(DnsScope *s, DnsTransaction *t, DnsPacket *p, DnsServer **ser
|
||||
if (p->size + UDP_PACKET_HEADER_SIZE > mtu)
|
||||
return -EMSGSIZE;
|
||||
|
||||
fd = transaction_dns_fd(t, &srv);
|
||||
if (fd < 0)
|
||||
return fd;
|
||||
|
||||
family = srv->family;
|
||||
addr = srv->address;
|
||||
port = 53;
|
||||
|
||||
} else if (s->protocol == DNS_PROTOCOL_LLMNR) {
|
||||
|
||||
if (DNS_PACKET_QDCOUNT(p) > 1)
|
||||
@ -190,9 +181,6 @@ int dns_scope_emit(DnsScope *s, DnsTransaction *t, DnsPacket *p, DnsServer **ser
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
if (server)
|
||||
*server = srv;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -688,7 +676,7 @@ static int on_conflict_dispatch(sd_event_source *es, usec_t usec, void *userdata
|
||||
return 0;
|
||||
}
|
||||
|
||||
r = dns_scope_emit(scope, NULL, p, NULL);
|
||||
r = dns_scope_emit(scope, -1, p);
|
||||
if (r < 0)
|
||||
log_debug_errno(r, "Failed to send conflict packet: %m");
|
||||
}
|
||||
|
@ -65,7 +65,7 @@ struct DnsScope {
|
||||
int dns_scope_new(Manager *m, DnsScope **ret, Link *l, DnsProtocol p, int family);
|
||||
DnsScope* dns_scope_free(DnsScope *s);
|
||||
|
||||
int dns_scope_emit(DnsScope *s, DnsTransaction *t, DnsPacket *p, DnsServer **server);
|
||||
int dns_scope_emit(DnsScope *s, int fd, DnsPacket *p);
|
||||
int dns_scope_tcp_socket(DnsScope *s, int family, const union in_addr_union *address, uint16_t port, DnsServer **server);
|
||||
int dns_scope_udp_dns_socket(DnsScope *s, DnsServer **server);
|
||||
|
||||
|
@ -460,33 +460,33 @@ static int on_dns_packet(sd_event_source *s, int fd, uint32_t revents, void *use
|
||||
return 0;
|
||||
}
|
||||
|
||||
int transaction_dns_fd(DnsTransaction *t, DnsServer **_server) {
|
||||
DnsServer *server;
|
||||
static int dns_transaction_emit(DnsTransaction *t) {
|
||||
int r;
|
||||
|
||||
assert(t);
|
||||
assert(t->scope);
|
||||
assert(t->scope->manager);
|
||||
|
||||
if (t->dns_fd >= 0)
|
||||
return t->dns_fd;
|
||||
if (t->scope->protocol == DNS_PROTOCOL_DNS && !t->server) {
|
||||
DnsServer *server = NULL;
|
||||
_cleanup_close_ int fd = -1;
|
||||
|
||||
t->dns_fd = dns_scope_udp_dns_socket(t->scope, &server);
|
||||
if (t->dns_fd < 0)
|
||||
return t->dns_fd;
|
||||
fd = dns_scope_udp_dns_socket(t->scope, &server);
|
||||
if (fd < 0)
|
||||
return fd;
|
||||
|
||||
r = sd_event_add_io(t->scope->manager->event, &t->dns_event_source, t->dns_fd, EPOLLIN, on_dns_packet, t);
|
||||
r = sd_event_add_io(t->scope->manager->event, &t->dns_event_source, fd, EPOLLIN, on_dns_packet, t);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
t->dns_fd = fd;
|
||||
fd = -1;
|
||||
t->server = dns_server_ref(server);
|
||||
}
|
||||
|
||||
r = dns_scope_emit(t->scope, t->dns_fd, t->sent);
|
||||
if (r < 0)
|
||||
goto fail;
|
||||
return r;
|
||||
|
||||
if (_server)
|
||||
*_server = server;
|
||||
|
||||
return t->dns_fd;
|
||||
|
||||
fail:
|
||||
t->dns_fd = safe_close(t->dns_fd);
|
||||
return r;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int on_transaction_timeout(sd_event_source *s, usec_t usec, void *userdata) {
|
||||
@ -574,7 +574,6 @@ int dns_transaction_go(DnsTransaction *t) {
|
||||
}
|
||||
|
||||
t->n_attempts++;
|
||||
t->server = dns_server_unref(t->server);
|
||||
t->received = dns_packet_unref(t->received);
|
||||
t->cached = dns_answer_unref(t->cached);
|
||||
t->cached_rcode = 0;
|
||||
@ -654,13 +653,9 @@ int dns_transaction_go(DnsTransaction *t) {
|
||||
* always be made via TCP on LLMNR */
|
||||
r = dns_transaction_open_tcp(t);
|
||||
} else {
|
||||
DnsServer *server;
|
||||
|
||||
/* Try via UDP, and if that fails due to large size try via TCP */
|
||||
r = dns_scope_emit(t->scope, t, t->sent, &server);
|
||||
if (r >= 0)
|
||||
t->server = dns_server_ref(server);
|
||||
else if (r == -EMSGSIZE)
|
||||
r = dns_transaction_emit(t);
|
||||
if (r == -EMSGSIZE)
|
||||
r = dns_transaction_open_tcp(t);
|
||||
}
|
||||
if (r == -ESRCH) {
|
||||
|
@ -92,8 +92,6 @@ int dns_transaction_go(DnsTransaction *t);
|
||||
void dns_transaction_process_reply(DnsTransaction *t, DnsPacket *p);
|
||||
void dns_transaction_complete(DnsTransaction *t, DnsTransactionState state);
|
||||
|
||||
int transaction_dns_fd(DnsTransaction *t, DnsServer **server);
|
||||
|
||||
const char* dns_transaction_state_to_string(DnsTransactionState p) _const_;
|
||||
DnsTransactionState dns_transaction_state_from_string(const char *s) _pure_;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user