]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
resolve: support port specifier in DNS= setting
authorYu Watanabe <watanabe.yu+github@gmail.com>
Sun, 12 Jul 2020 23:58:02 +0000 (08:58 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 20 Jul 2020 19:04:42 +0000 (04:04 +0900)
src/resolve/resolved-conf.c
src/resolve/resolved-dns-scope.c
src/resolve/resolved-dns-scope.h
src/resolve/resolved-dns-server.c
src/resolve/resolved-dns-server.h
src/resolve/resolved-dns-transaction.c
src/resolve/resolved-link-bus.c
src/resolve/resolved-link.c

index 9a6b1e88e17d29c86c0d08e022cffbeb0e218e7e..5df39b1b89e530be35ebcd0b7a81cdc635b9b0cd 100644 (file)
@@ -28,15 +28,16 @@ static const char* const dns_stub_listener_mode_table[_DNS_STUB_LISTENER_MODE_MA
 DEFINE_STRING_TABLE_LOOKUP_WITH_BOOLEAN(dns_stub_listener_mode, DnsStubListenerMode, DNS_STUB_LISTENER_YES);
 
 static int manager_add_dns_server_by_string(Manager *m, DnsServerType type, const char *word) {
+        _cleanup_free_ char *server_name = NULL;
         union in_addr_union address;
         int family, r, ifindex = 0;
+        uint16_t port;
         DnsServer *s;
-        _cleanup_free_ char *server_name = NULL;
 
         assert(m);
         assert(word);
 
-        r = in_addr_ifindex_name_from_string_auto(word, &family, &address, &ifindex, &server_name);
+        r = in_addr_port_ifindex_name_from_string_auto(word, &family, &address, &port, &ifindex, &server_name);
         if (r < 0)
                 return r;
 
@@ -44,6 +45,11 @@ static int manager_add_dns_server_by_string(Manager *m, DnsServerType type, cons
         if (!dns_server_address_valid(family, &address))
                 return 0;
 
+        /* By default, the port number is determined with the transaction feature level.
+         * See dns_transaction_port() and dns_server_port(). */
+        if (IN_SET(port, 53, 853))
+                port = 0;
+
         /* Filter out duplicates */
         s = dns_server_find(manager_get_first_dns_server(m, type), family, &address, ifindex);
         if (s) {
@@ -57,7 +63,7 @@ static int manager_add_dns_server_by_string(Manager *m, DnsServerType type, cons
                 return 0;
         }
 
-        return dns_server_new(m, NULL, type, NULL, family, &address, ifindex, server_name);
+        return dns_server_new(m, NULL, type, NULL, family, &address, port, ifindex, server_name);
 }
 
 int manager_parse_dns_server_string_and_warn(Manager *m, DnsServerType type, const char *string) {
index 764ccee0e0ef523137135eb3f135845aac717e9c..bd4b59ea8e18ee6afd415054bd56d18aaceef324 100644 (file)
@@ -447,8 +447,8 @@ static int dns_scope_socket(
         return TAKE_FD(fd);
 }
 
-int dns_scope_socket_udp(DnsScope *s, DnsServer *server, uint16_t port) {
-        return dns_scope_socket(s, SOCK_DGRAM, AF_UNSPEC, NULL, server, port, NULL);
+int dns_scope_socket_udp(DnsScope *s, DnsServer *server) {
+        return dns_scope_socket(s, SOCK_DGRAM, AF_UNSPEC, NULL, server, dns_server_port(server), NULL);
 }
 
 int dns_scope_socket_tcp(DnsScope *s, int family, const union in_addr_union *address, DnsServer *server, uint16_t port, union sockaddr_union *ret_socket_address) {
index b356b92120546eeda2358d79973d849d788ff07b..8b1a958551c2f47b161797d601628d96b54be51d 100644 (file)
@@ -75,7 +75,7 @@ void dns_scope_packet_lost(DnsScope *s, usec_t usec);
 
 int dns_scope_emit_udp(DnsScope *s, int fd, DnsPacket *p);
 int dns_scope_socket_tcp(DnsScope *s, int family, const union in_addr_union *address, DnsServer *server, uint16_t port, union sockaddr_union *ret_socket_address);
-int dns_scope_socket_udp(DnsScope *s, DnsServer *server, uint16_t port);
+int dns_scope_socket_udp(DnsScope *s, DnsServer *server);
 
 DnsScopeMatch dns_scope_good_domain(DnsScope *s, int ifindex, uint64_t flags, const char *domain);
 bool dns_scope_good_key(DnsScope *s, const DnsResourceKey *key);
index ee2ae1ae1b079c24aca9d6f84d98f8904f5bbdef..b4f2a8c97f4f3a9d4739d48142bf500ceda7ea88 100644 (file)
@@ -26,6 +26,7 @@ int dns_server_new(
                 Link *l,
                 int family,
                 const union in_addr_union *in_addr,
+                uint16_t port,
                 int ifindex,
                 const char *server_name) {
 
@@ -63,6 +64,7 @@ int dns_server_new(
                 .type = type,
                 .family = family,
                 .address = *in_addr,
+                .port = port,
                 .ifindex = ifindex,
                 .server_name = TAKE_PTR(name),
         };
@@ -548,6 +550,15 @@ int dns_server_ifindex(const DnsServer *s) {
         return 0;
 }
 
+uint16_t dns_server_port(const DnsServer *s) {
+        assert(s);
+
+        if (s->port > 0)
+                return s->port;
+
+        return 53;
+}
+
 const char *dns_server_string(DnsServer *server) {
         assert(server);
 
index 792f966121b0eef5a1412108a52b9ae0dee78851..126a52ae6f36a96743307d08b3b1dcecc3656650 100644 (file)
@@ -56,11 +56,11 @@ struct DnsServer {
         int family;
         union in_addr_union address;
         int ifindex; /* for IPv6 link-local DNS servers */
+        uint16_t port;
+        char *server_name;
 
         char *server_string;
 
-        char *server_name;
-
         /* The long-lived stream towards this server. */
         DnsStream *stream;
 
@@ -102,6 +102,7 @@ int dns_server_new(
                 Link *link,
                 int family,
                 const union in_addr_union *address,
+                uint16_t port,
                 int ifindex,
                 const char *server_string);
 
@@ -124,6 +125,7 @@ int dns_server_adjust_opt(DnsServer *server, DnsPacket *packet, DnsServerFeature
 
 const char *dns_server_string(DnsServer *server);
 int dns_server_ifindex(const DnsServer *s);
+uint16_t dns_server_port(const DnsServer *s);
 
 bool dns_server_dnssec_supported(DnsServer *server);
 
index cd5a0e3dd91b769c5a51d77360ff80ac03de2d03..b798e031024e2ec08f2d770ee25b38f88c5ca5c8 100644 (file)
@@ -544,8 +544,10 @@ static int on_stream_packet(DnsStream *s) {
         return 0;
 }
 
-static uint16_t dns_port_for_feature_level(DnsServerFeatureLevel level) {
-        return DNS_SERVER_FEATURE_LEVEL_IS_TLS(level) ? 853 : 53;
+static uint16_t dns_transaction_port(DnsTransaction *t) {
+        if (t->server->port > 0)
+                return t->server->port;
+        return DNS_SERVER_FEATURE_LEVEL_IS_TLS(t->current_feature_level) ? 853 : 53;
 }
 
 static int dns_transaction_emit_tcp(DnsTransaction *t) {
@@ -576,7 +578,7 @@ static int dns_transaction_emit_tcp(DnsTransaction *t) {
                 if (t->server->stream && (DNS_SERVER_FEATURE_LEVEL_IS_TLS(t->current_feature_level) == t->server->stream->encrypted))
                         s = dns_stream_ref(t->server->stream);
                 else
-                        fd = dns_scope_socket_tcp(t->scope, AF_UNSPEC, NULL, t->server, dns_port_for_feature_level(t->current_feature_level), &sa);
+                        fd = dns_scope_socket_tcp(t->scope, AF_UNSPEC, NULL, t->server, dns_transaction_port(t), &sa);
 
                 type = DNS_STREAM_LOOKUP;
                 break;
@@ -1243,7 +1245,7 @@ static int dns_transaction_emit_udp(DnsTransaction *t) {
 
                         dns_transaction_close_connection(t);
 
-                        fd = dns_scope_socket_udp(t->scope, t->server, 53);
+                        fd = dns_scope_socket_udp(t->scope, t->server);
                         if (fd < 0)
                                 return fd;
 
index 0fa62208c30a2e2c71f556e6244ff337ece21b2e..62afe698c6eab0d10c6a451b08e6477f2c878609 100644 (file)
@@ -285,7 +285,7 @@ int bus_link_method_set_dns_servers(sd_bus_message *message, void *userdata, sd_
                 if (s)
                         dns_server_move_back_and_unmark(s);
                 else {
-                        r = dns_server_new(l->manager, NULL, DNS_SERVER_LINK, l, dns[i].family, &dns[i].address, 0, NULL);
+                        r = dns_server_new(l->manager, NULL, DNS_SERVER_LINK, l, dns[i].family, &dns[i].address, 0, 0, NULL);
                         if (r < 0)
                                 goto clear;
                 }
index 2b8df7777c93f9a95defb2353a4f907be508b9f6..95f64700b6e9b1aa2d8f5ab3952f8e6ea0f0e27a 100644 (file)
@@ -269,7 +269,7 @@ static int link_update_dns_server_one(Link *l, const char *name) {
                 return 0;
         }
 
-        return dns_server_new(l->manager, NULL, DNS_SERVER_LINK, l, family, &a, 0, NULL);
+        return dns_server_new(l->manager, NULL, DNS_SERVER_LINK, l, family, &a, 0, 0, NULL);
 }
 
 static int link_update_dns_servers(Link *l) {