diff --git a/llarp/router/systemd_resolved.cpp b/llarp/router/systemd_resolved.cpp index d0ee535c2..5f1e40813 100644 --- a/llarp/router/systemd_resolved.cpp +++ b/llarp/router/systemd_resolved.cpp @@ -87,46 +87,84 @@ namespace llarp { // This passing address by bytes and using two separate calls for ipv4/ipv6 is gross, but the // alternative is to build up a bunch of crap with va_args, which is slightly more gross. + const bool isStandardDNSPort = dns.getPort() == 53; if (dns.isIPv6()) { auto ipv6 = dns.getIPv6(); static_assert(sizeof(ipv6) == 16); auto* a = reinterpret_cast(&ipv6); - resolved_call( - bus, - "SetLinkDNSEx", - "ia(iayqs)", - (int32_t)if_ndx, - (int)1, // number of "iayqs"s we are passing - (int32_t)AF_INET6, // network address type - (int)16, // network addr byte size - // clang-format off - a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], - a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15], // yuck - // clang-format on - (uint16_t)dns.getPort(), - nullptr // dns server name (for TLS SNI which we don't care about) - ); + if (isStandardDNSPort) + { + resolved_call( + bus, + "SetLinkDNS", + "ia(iay)", + (int32_t)if_ndx, + (int)1, // number of "iayqs"s we are passing + (int32_t)AF_INET6, // network address type + (int)16, // network addr byte size + // clang-format off + a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], + a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15] // yuck + // clang-format on + ); + } + else + { + resolved_call( + bus, + "SetLinkDNSEx", + "ia(iayqs)", + (int32_t)if_ndx, + (int)1, // number of "iayqs"s we are passing + (int32_t)AF_INET6, // network address type + (int)16, // network addr byte size + // clang-format off + a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], + a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15], // yuck + // clang-format on + (uint16_t)dns.getPort(), + nullptr // dns server name (for TLS SNI which we don't care about) + ); + } } else { auto ipv4 = dns.getIPv4(); static_assert(sizeof(ipv4) == 4); auto* a = reinterpret_cast(&ipv4); - resolved_call( - bus, - "SetLinkDNSEx", - "ia(iayqs)", - (int32_t)if_ndx, - (int)1, // number of "iayqs"s we are passing - (int32_t)AF_INET, // network address type - (int)4, // network addr byte size - // clang-format off - a[0], a[1], a[2], a[3], // yuck - // clang-format on - (uint16_t)dns.getPort(), - nullptr // dns server name (for TLS SNI which we don't care about) - ); + if (isStandardDNSPort) + { + resolved_call( + bus, + "SetLinkDNS", + "ia(iay)", + (int32_t)if_ndx, + (int)1, // number of "iayqs"s we are passing + (int32_t)AF_INET, // network address type + (int)4, // network addr byte size + // clang-format off + a[0], a[1], a[2], a[3] // yuck + // clang-format on + ); + } + else + { + resolved_call( + bus, + "SetLinkDNSEx", + "ia(iayqs)", + (int32_t)if_ndx, + (int)1, // number of "iayqs"s we are passing + (int32_t)AF_INET, // network address type + (int)4, // network addr byte size + // clang-format off + a[0], a[1], a[2], a[3], // yuck + // clang-format on + (uint16_t)dns.getPort(), + nullptr // dns server name (for TLS SNI which we don't care about) + ); + } } if (global)