mirror of
https://github.com/systemd/systemd.git
synced 2024-11-08 11:27:32 +03:00
resolved: transaction - move DNS UDP socket creation to the scope
With access to the server when creating the socket, we can connect() to the server and hence simplify message sending and receiving in follow-up patches.
This commit is contained in:
parent
647f6aa8fc
commit
0db643664c
@ -148,24 +148,20 @@ int dns_scope_emit(DnsScope *s, DnsTransaction *t, DnsPacket *p, DnsServer **ser
|
||||
if (DNS_PACKET_QDCOUNT(p) > 1)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
srv = dns_scope_get_dns_server(s);
|
||||
if (!srv)
|
||||
return -ESRCH;
|
||||
|
||||
family = srv->family;
|
||||
addr = srv->address;
|
||||
port = 53;
|
||||
|
||||
if (p->size > DNS_PACKET_UNICAST_SIZE_MAX)
|
||||
return -EMSGSIZE;
|
||||
|
||||
if (p->size + UDP_PACKET_HEADER_SIZE > mtu)
|
||||
return -EMSGSIZE;
|
||||
|
||||
fd = transaction_dns_fd(t);
|
||||
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)
|
||||
@ -200,7 +196,7 @@ int dns_scope_emit(DnsScope *s, DnsTransaction *t, DnsPacket *p, DnsServer **ser
|
||||
return 1;
|
||||
}
|
||||
|
||||
int dns_scope_tcp_socket(DnsScope *s, int family, const union in_addr_union *address, uint16_t port, DnsServer **server) {
|
||||
static int dns_scope_socket(DnsScope *s, int type, int family, const union in_addr_union *address, uint16_t port, DnsServer **server) {
|
||||
DnsServer *srv = NULL;
|
||||
_cleanup_close_ int fd = -1;
|
||||
union sockaddr_union sa = {};
|
||||
@ -244,13 +240,15 @@ int dns_scope_tcp_socket(DnsScope *s, int family, const union in_addr_union *add
|
||||
return -EAFNOSUPPORT;
|
||||
}
|
||||
|
||||
fd = socket(sa.sa.sa_family, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
|
||||
fd = socket(sa.sa.sa_family, type|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
|
||||
if (fd < 0)
|
||||
return -errno;
|
||||
|
||||
r = setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &one, sizeof(one));
|
||||
if (r < 0)
|
||||
return -errno;
|
||||
if (type == SOCK_STREAM) {
|
||||
r = setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &one, sizeof(one));
|
||||
if (r < 0)
|
||||
return -errno;
|
||||
}
|
||||
|
||||
if (s->link) {
|
||||
uint32_t ifindex = htobe32(s->link->ifindex);
|
||||
@ -293,6 +291,14 @@ int dns_scope_tcp_socket(DnsScope *s, int family, const union in_addr_union *add
|
||||
return ret;
|
||||
}
|
||||
|
||||
int dns_scope_udp_dns_socket(DnsScope *s, DnsServer **server) {
|
||||
return dns_scope_socket(s, SOCK_DGRAM, AF_UNSPEC, NULL, 53, server);
|
||||
}
|
||||
|
||||
int dns_scope_tcp_socket(DnsScope *s, int family, const union in_addr_union *address, uint16_t port, DnsServer **server) {
|
||||
return dns_scope_socket(s, SOCK_STREAM, family, address, port, server);
|
||||
}
|
||||
|
||||
DnsScopeMatch dns_scope_good_domain(DnsScope *s, int ifindex, uint64_t flags, const char *domain) {
|
||||
char **i;
|
||||
|
||||
|
@ -67,6 +67,7 @@ DnsScope* dns_scope_free(DnsScope *s);
|
||||
|
||||
int dns_scope_emit(DnsScope *s, DnsTransaction *t, DnsPacket *p, DnsServer **server);
|
||||
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);
|
||||
|
||||
DnsScopeMatch dns_scope_good_domain(DnsScope *s, int ifindex, uint64_t flags, const char *domain);
|
||||
int dns_scope_good_key(DnsScope *s, DnsResourceKey *key);
|
||||
|
@ -663,7 +663,8 @@ static int on_dns_packet(sd_event_source *s, int fd, uint32_t revents, void *use
|
||||
return 0;
|
||||
}
|
||||
|
||||
int transaction_dns_fd(DnsTransaction *t) {
|
||||
int transaction_dns_fd(DnsTransaction *t, DnsServer **_server) {
|
||||
DnsServer *server;
|
||||
int r;
|
||||
|
||||
assert(t);
|
||||
@ -673,14 +674,17 @@ int transaction_dns_fd(DnsTransaction *t) {
|
||||
if (t->dns_fd >= 0)
|
||||
return t->dns_fd;
|
||||
|
||||
t->dns_fd = socket(t->scope->family, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
|
||||
t->dns_fd = dns_scope_udp_dns_socket(t->scope, &server);
|
||||
if (t->dns_fd < 0)
|
||||
return -errno;
|
||||
return t->dns_fd;
|
||||
|
||||
r = sd_event_add_io(t->scope->manager->event, &t->dns_event_source, t->dns_fd, EPOLLIN, on_dns_packet, t);
|
||||
if (r < 0)
|
||||
goto fail;
|
||||
|
||||
if (_server)
|
||||
*_server = server;
|
||||
|
||||
return t->dns_fd;
|
||||
|
||||
fail:
|
||||
|
@ -92,7 +92,7 @@ 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);
|
||||
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