@@ -940,29 +940,36 @@ JNIEXPORT jlong JNICALL Java_org_telegram_messenger_voip_NativeInstance_makeNati
940940 for (int i = 0, size = env->GetArrayLength(endpoints); i < size; i++) {
941941 JavaObject endpointObject(env, env->GetObjectArrayElement(endpoints, i));
942942 bool isRtc = endpointObject.getBooleanField("isRtc");
943− if (isRtc) {
943+ const auto ipv4 = tgvoip::jni::JavaStringToStdString(env, endpointObject.getStringField("ipv4"));
944+ const auto ipv6 = tgvoip::jni::JavaStringToStdString(env, endpointObject.getStringField("ipv6"));
945+ // Push each server for both address families (same id), like tdesktop does,
946+ // so relays stay reachable on IPv6-only networks where IPv4 sockets fail.
947+ const auto pushServer = [&](const std::string &host, bool isTurn, bool isTcp) {
948+ if (host.empty()) {
949+ return;
950+ }
944951 RtcServer rtcServer;
945952 rtcServer.id = static_cast<uint8_t>(endpointObject.getIntField("reflectorId"));
946− rtcServer.host = tgvoip::jni::JavaStringToStdString(env, endpointObject.getStringField("ipv4"));
953+ rtcServer.host = host;
947954 rtcServer.port = static_cast<uint16_t>(endpointObject.getIntField("port"));
948955 rtcServer.login = tgvoip::jni::JavaStringToStdString(env, endpointObject.getStringField("username"));
949956 rtcServer.password = tgvoip::jni::JavaStringToStdString(env, endpointObject.getStringField("password"));
950− rtcServer.isTurn = endpointObject.getBooleanField("turn");
957+ rtcServer.isTurn = isTurn;
958+ rtcServer.isTcp = isTcp;
951959 descriptor.rtcServers.push_back(std::move(rtcServer));
960+ };
961+ if (isRtc) {
962+ const auto isTurn = endpointObject.getBooleanField("turn");
963+ pushServer(ipv4, isTurn, false);
964+ pushServer(ipv6, isTurn, false);
952965 } else {
953− RtcServer rtcServer;
954− rtcServer.id = static_cast<uint8_t>(endpointObject.getIntField("reflectorId"));
955− rtcServer.host = tgvoip::jni::JavaStringToStdString(env, endpointObject.getStringField("ipv4"));
956− rtcServer.port = static_cast<uint16_t>(endpointObject.getIntField("port"));
957− rtcServer.login = tgvoip::jni::JavaStringToStdString(env, endpointObject.getStringField("username"));
958− rtcServer.password = tgvoip::jni::JavaStringToStdString(env, endpointObject.getStringField("password"));
959− rtcServer.isTurn = true;
960− rtcServer.isTcp = endpointObject.getBooleanField("tcp");
961− descriptor.rtcServers.push_back(std::move(rtcServer));
966+ const auto isTcp = endpointObject.getBooleanField("tcp");
967+ pushServer(ipv4, true, isTcp);
968+ pushServer(ipv6, true, isTcp);
962969
963970 Endpoint endpoint;
964971 endpoint.endpointId = endpointObject.getLongField("id");
965− endpoint.host = EndpointHost{tgvoip::jni::JavaStringToStdString(env, endpointObject.getStringField("ipv4")), tgvoip::jni::JavaStringToStdString(env, endpointObject.getStringField("ipv6"))};
972+ endpoint.host = EndpointHost{ipv4, ipv6};
966973 endpoint.port = static_cast<uint16_t>(endpointObject.getIntField("port"));
967974 endpoint.type = parseEndpointType(env, endpointObject.getIntField("type"));
968975 jbyteArray peerTag = endpointObject.getByteArrayField("peerTag");