]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
resolved: transaction - move DNS UDP socket creation to the scope
authorTom Gundersen <teg@jklm.no>
Wed, 15 Jul 2015 17:22:29 +0000 (19:22 +0200)
committerTom Gundersen <teg@jklm.no>
Mon, 27 Jul 2015 18:13:11 +0000 (20:13 +0200)
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.

src/resolve/resolved-dns-scope.c
src/resolve/resolved-dns-scope.h
src/resolve/resolved-dns-transaction.c
src/resolve/resolved-dns-transaction.h

index ce419f1a0414c7191b1d4d2673d3f7bccf3f130f..5129412604eb304752796451811620d6f8480e0e 100644 (file)
@@ -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;
 
index 21a160ea392950c4b444a18ec6233958bd505a2d..9d08bc325962f92a49d62aa47e1ecef5adfcb2aa 100644 (file)
@@ -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);
index 5540cd386e2e4b131ca681dbf33501ab37b8c722..5580e376c073f0961d3a80b1ba7f193fec43d319 100644 (file)
@@ -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:
index 1c8f82352afaeb79200348bb41e6a1edda9cd756..ab4db0612fd1e34eee46c68650d4196de6fe1d49 100644 (file)
@@ -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_;