Skip to content

Commit 8aa5afd

Browse files
committed
resolve: read/save port number and SNI from/into link state file
1 parent b6af282 commit 8aa5afd

File tree

4 files changed

+48
-19
lines changed

4 files changed

+48
-19
lines changed

src/resolve/resolved-dns-server.c

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ static DnsServer* dns_server_free(DnsServer *s) {
119119
#endif
120120

121121
free(s->server_string);
122+
free(s->server_string_full);
122123
free(s->server_name);
123124
return mfree(s);
124125
}
@@ -225,7 +226,7 @@ static void dns_server_verified(DnsServer *s, DnsServerFeatureLevel level) {
225226
if (s->verified_feature_level != level) {
226227
log_debug("Verified we get a response at feature level %s from DNS server %s.",
227228
dns_server_feature_level_to_string(level),
228-
dns_server_string(s));
229+
strna(dns_server_string_full(s)));
229230
s->verified_feature_level = level;
230231
}
231232

@@ -362,7 +363,7 @@ void dns_server_packet_rcode_downgrade(DnsServer *s, DnsServerFeatureLevel level
362363
dns_server_reset_counters(s);
363364
}
364365

365-
log_debug("Downgrading transaction feature level fixed an RCODE error, downgrading server %s too.", dns_server_string(s));
366+
log_debug("Downgrading transaction feature level fixed an RCODE error, downgrading server %s too.", strna(dns_server_string_full(s)));
366367
}
367368

368369
static bool dns_server_grace_period_expired(DnsServer *s) {
@@ -416,7 +417,7 @@ DnsServerFeatureLevel dns_server_possible_feature_level(DnsServer *s) {
416417

417418
log_info("Grace period over, resuming full feature set (%s) for DNS server %s.",
418419
dns_server_feature_level_to_string(s->possible_feature_level),
419-
dns_server_string(s));
420+
strna(dns_server_string_full(s)));
420421

421422
dns_server_flush_cache(s);
422423

@@ -502,7 +503,7 @@ DnsServerFeatureLevel dns_server_possible_feature_level(DnsServer *s) {
502503

503504
log_full(log_level, "Using degraded feature set %s instead of %s for DNS server %s.",
504505
dns_server_feature_level_to_string(s->possible_feature_level),
505-
dns_server_feature_level_to_string(p), dns_server_string(s));
506+
dns_server_feature_level_to_string(p), strna(dns_server_string_full(s)));
506507
}
507508
}
508509

@@ -565,7 +566,22 @@ const char *dns_server_string(DnsServer *server) {
565566
if (!server->server_string)
566567
(void) in_addr_ifindex_to_string(server->family, &server->address, dns_server_ifindex(server), &server->server_string);
567568

568-
return strna(server->server_string);
569+
return server->server_string;
570+
}
571+
572+
const char *dns_server_string_full(DnsServer *server) {
573+
assert(server);
574+
575+
if (!server->server_string_full)
576+
(void) in_addr_port_ifindex_name_to_string(
577+
server->family,
578+
&server->address,
579+
server->port,
580+
dns_server_ifindex(server),
581+
server->server_name,
582+
&server->server_string_full);
583+
584+
return server->server_string_full;
569585
}
570586

571587
bool dns_server_dnssec_supported(DnsServer *server) {
@@ -597,8 +613,8 @@ void dns_server_warn_downgrade(DnsServer *server) {
597613

598614
log_struct(LOG_NOTICE,
599615
"MESSAGE_ID=" SD_MESSAGE_DNSSEC_DOWNGRADE_STR,
600-
LOG_MESSAGE("Server %s does not support DNSSEC, downgrading to non-DNSSEC mode.", dns_server_string(server)),
601-
"DNS_SERVER=%s", dns_server_string(server),
616+
LOG_MESSAGE("Server %s does not support DNSSEC, downgrading to non-DNSSEC mode.", strna(dns_server_string_full(server))),
617+
"DNS_SERVER=%s", strna(dns_server_string_full(server)),
602618
"DNS_SERVER_FEATURE_LEVEL=%s", dns_server_feature_level_to_string(server->possible_feature_level));
603619

604620
server->warned_downgrade = true;
@@ -712,7 +728,7 @@ DnsServer *manager_set_dns_server(Manager *m, DnsServer *s) {
712728
if (s)
713729
log_debug("Switching to %s DNS server %s.",
714730
dns_server_type_to_string(s->type),
715-
dns_server_string(s));
731+
strna(dns_server_string_full(s)));
716732

717733
dns_server_unref(m->current_dns_server);
718734
m->current_dns_server = dns_server_ref(s);
@@ -852,7 +868,7 @@ void dns_server_dump(DnsServer *s, FILE *f) {
852868
f = stdout;
853869

854870
fputs("[Server ", f);
855-
fputs(dns_server_string(s), f);
871+
fputs(strna(dns_server_string_full(s)), f);
856872
fputs(" type=", f);
857873
fputs(dns_server_type_to_string(s->type), f);
858874

src/resolve/resolved-dns-server.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ struct DnsServer {
6060
char *server_name;
6161

6262
char *server_string;
63+
char *server_string_full;
6364

6465
/* The long-lived stream towards this server. */
6566
DnsStream *stream;
@@ -124,6 +125,7 @@ DnsServerFeatureLevel dns_server_possible_feature_level(DnsServer *s);
124125
int dns_server_adjust_opt(DnsServer *server, DnsPacket *packet, DnsServerFeatureLevel level);
125126

126127
const char *dns_server_string(DnsServer *server);
128+
const char *dns_server_string_full(DnsServer *server);
127129
int dns_server_ifindex(const DnsServer *s);
128130
uint16_t dns_server_port(const DnsServer *s);
129131

src/resolve/resolved-dns-transaction.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -314,7 +314,7 @@ void dns_transaction_complete(DnsTransaction *t, DnsTransactionState state) {
314314
"DNS_TRANSACTION=%" PRIu16, t->id,
315315
"DNS_QUESTION=%s", key_str,
316316
"DNSSEC_RESULT=%s", dnssec_result_to_string(t->answer_dnssec_result),
317-
"DNS_SERVER=%s", dns_server_string(t->server),
317+
"DNS_SERVER=%s", strna(dns_server_string_full(t->server)),
318318
"DNS_SERVER_FEATURE_LEVEL=%s", dns_server_feature_level_to_string(t->server->possible_feature_level));
319319
}
320320

@@ -398,7 +398,7 @@ static int dns_transaction_pick_server(DnsTransaction *t) {
398398

399399
t->n_picked_servers ++;
400400

401-
log_debug("Using DNS server %s for transaction %u.", dns_server_string(t->server), t->id);
401+
log_debug("Using DNS server %s for transaction %u.", strna(dns_server_string_full(t->server)), t->id);
402402

403403
return 1;
404404
}

src/resolve/resolved-link.c

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include "resolved-link.h"
1616
#include "resolved-llmnr.h"
1717
#include "resolved-mdns.h"
18+
#include "socket-netlink.h"
1819
#include "string-util.h"
1920
#include "strv.h"
2021
#include "tmpfile-util.h"
@@ -251,25 +252,35 @@ int link_process_rtnl(Link *l, sd_netlink_message *m) {
251252
return 0;
252253
}
253254

254-
static int link_update_dns_server_one(Link *l, const char *name) {
255+
static int link_update_dns_server_one(Link *l, const char *str) {
256+
_cleanup_free_ char *name = NULL;
257+
int family, ifindex, r;
255258
union in_addr_union a;
256259
DnsServer *s;
257-
int family, r;
260+
uint16_t port;
258261

259262
assert(l);
260-
assert(name);
263+
assert(str);
261264

262-
r = in_addr_from_string_auto(name, &family, &a);
265+
r = in_addr_port_ifindex_name_from_string_auto(str, &family, &a, &port, &ifindex, &name);
263266
if (r < 0)
264267
return r;
265268

266-
s = dns_server_find(l->dns_servers, family, &a, 0, 0, NULL);
269+
if (ifindex != 0 && ifindex != l->ifindex)
270+
return -EINVAL;
271+
272+
/* By default, the port number is determined with the transaction feature level.
273+
* See dns_transaction_port() and dns_server_port(). */
274+
if (IN_SET(port, 53, 853))
275+
port = 0;
276+
277+
s = dns_server_find(l->dns_servers, family, &a, port, 0, name);
267278
if (s) {
268279
dns_server_move_back_and_unmark(s);
269280
return 0;
270281
}
271282

272-
return dns_server_new(l->manager, NULL, DNS_SERVER_LINK, l, family, &a, 0, 0, NULL);
283+
return dns_server_new(l->manager, NULL, DNS_SERVER_LINK, l, family, &a, port, 0, name);
273284
}
274285

275286
static int link_update_dns_servers(Link *l) {
@@ -732,7 +743,7 @@ DnsServer* link_set_dns_server(Link *l, DnsServer *s) {
732743
return s;
733744

734745
if (s)
735-
log_debug("Switching to DNS server %s for interface %s.", dns_server_string(s), l->ifname);
746+
log_debug("Switching to DNS server %s for interface %s.", strna(dns_server_string_full(s)), l->ifname);
736747

737748
dns_server_unref(l->current_dns_server);
738749
l->current_dns_server = dns_server_ref(s);
@@ -1209,7 +1220,7 @@ int link_save_user(Link *l) {
12091220
if (server != l->dns_servers)
12101221
fputc(' ', f);
12111222

1212-
v = dns_server_string(server);
1223+
v = dns_server_string_full(server);
12131224
if (!v) {
12141225
r = -ENOMEM;
12151226
goto fail;

0 commit comments

Comments
 (0)