diff --git a/app/src/main/cpp/baresip.c b/app/src/main/cpp/baresip.c index 59c994e4..68d663e6 100644 --- a/app/src/main/cpp/baresip.c +++ b/app/src/main/cpp/baresip.c @@ -423,9 +423,10 @@ Java_com_tutpro_baresip_BaresipService_baresipStart(JNIEnv *env, jobject instanc } if (strlen(ipv6_addr) > 0) { - LOGW("setting ipv6 net address (%s)\n", ipv6_addr); sa_set_str(&temp_sa, ipv6_addr, 0); - net_set_address(baresip_network(), &temp_sa, (bool)(javaPreferIpV6 == JNI_TRUE)); + net_set_address(baresip_network(), &temp_sa); + if ((bool)(javaPreferIpV6 == JNI_TRUE)) + net_set_af(baresip_network(), AF_INET6); } play_set_path(baresip_player(), path); @@ -1399,14 +1400,15 @@ Java_com_tutpro_baresip_Api_net_1use_1nameserver(JNIEnv *env, jobject thiz, jstr } JNIEXPORT jint JNICALL -Java_com_tutpro_baresip_Api_net_1set_1address(JNIEnv *env, jobject thiz, - jstring javaIp, jboolean javaPrefer) { +Java_com_tutpro_baresip_Api_net_1set_1address(JNIEnv *env, jobject thiz, jstring javaIp) { const char *native_ip = (*env)->GetStringUTFChars(env, javaIp, 0); int res = 0; struct sa temp_sa; - LOGD("using address '%s'\n", native_ip); + char buf[256]; + LOGD("setting address '%s'\n", native_ip); if (0 == sa_set_str(&temp_sa, native_ip, 0)) { - net_set_address(baresip_network(), &temp_sa, (bool)(javaPrefer == JNI_TRUE)); + sa_ntop(&temp_sa, buf, 256); + net_set_address(baresip_network(), &temp_sa); } else { LOGE("invalid ip address %s\n", native_ip); res = EAFNOSUPPORT; @@ -1415,6 +1417,24 @@ Java_com_tutpro_baresip_Api_net_1set_1address(JNIEnv *env, jobject thiz, return res; } +JNIEXPORT jboolean JNICALL +Java_com_tutpro_baresip_Api_net_1set_1af(JNIEnv *env, jobject thiz, jboolean javaIpV6) { + int af = javaIpV6 == JNI_TRUE ? AF_INET6 : AF_INET; + int res = 0; + LOGD("setting af '%d'\n", af); + if (net_af(baresip_network()) != af) { + net_set_af(baresip_network(), af); + return true; + } + return false; +} + +JNIEXPORT void JNICALL +Java_com_tutpro_baresip_Api_net_1force_1change(JNIEnv *env, jobject thiz) { + LOGD("forcing net change\n"); + net_force_change(baresip_network()); +} + JNIEXPORT void JNICALL Java_com_tutpro_baresip_Api_net_1debug(JNIEnv *env, jobject thiz) { net_debug_log(); diff --git a/app/src/main/kotlin/com/tutpro/baresip/Api.kt b/app/src/main/kotlin/com/tutpro/baresip/Api.kt index 00a3eb9c..8516333c 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/Api.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/Api.kt @@ -32,7 +32,9 @@ object Api { external fun contacts_remove() external fun log_level_set(level: Int) external fun net_use_nameserver(servers: String): Int - external fun net_set_address(ip_addr: String, preferIpV6: Boolean): Int + external fun net_set_address(ip_addr: String): Int + external fun net_set_af(ipv6: Boolean): Boolean + external fun net_force_change() external fun net_debug() external fun net_dns_debug() external fun module_load(module: String): Int diff --git a/app/src/main/kotlin/com/tutpro/baresip/BaresipService.kt b/app/src/main/kotlin/com/tutpro/baresip/BaresipService.kt index 9fc7f182..3e6ddac4 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/BaresipService.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/BaresipService.kt @@ -50,8 +50,6 @@ class BaresipService: Service() { internal var audioFocused = false internal var origCallVolume = -1 internal val btAdapter = BluetoothAdapter.getDefaultAdapter() - internal var dnsServers = listOf() - internal var linkAddresses = listOf() override fun onCreate() { @@ -93,27 +91,37 @@ class BaresipService: Service() { override fun onLinkPropertiesChanged(network: Network, linkProperties: LinkProperties) { super.onLinkPropertiesChanged(network, linkProperties) - Log.d(LOG_TAG, "Network link properties changed: $linkProperties") + Log.e(LOG_TAG, "Network link properties changed: $linkProperties") + if (!isServiceRunning) + return if (dynDns) { - val dnsServers = linkProperties.dnsServers + dnsServers = linkProperties.dnsServers if (Config.updateDnsServers(dnsServers) != 0) Log.w(LOG_TAG, "Failed to update DNS servers '$dnsServers'") } - if (preferIpV6) { - val ipV6Addr = Utils.findIpV6Address(linkProperties.linkAddresses) - if (ipV6Addr != "") { - if (Config.updateNetAddress(ipV6Addr, preferIpV6) != 0) - Log.w(LOG_TAG, "Failed to update net address '$ipV6Addr'") - + val ipV6Addr = Utils.findIpV6Address(linkProperties.linkAddresses) + if (ipV6Addr != "") { + Log.w(LOG_TAG, "Found IPv6 address '$ipV6Addr'") + if (Api.net_set_address(ipV6Addr) != 0) { + Log.w(LOG_TAG, "Failed to update net address '$ipV6Addr'") } else { - val ipV4Addr = Utils.findIpV4Address(linkProperties.linkAddresses) - if (ipV4Addr != "") - if (Config.updateNetAddress(ipV4Addr, !preferIpV6) != 0) - Log.w(LOG_TAG, "Failed to update net address '$ipV4Addr'") + if (preferIpV6) + Api.net_set_af(true) } } + val ipV4Addr = Utils.findIpV4Address(linkProperties.linkAddresses) + if (ipV4Addr != "") { + Log.w(LOG_TAG, "Found IPv4 address '$ipV4Addr'") + if (Api.net_set_address(ipV4Addr) != 0) { + Log.w(LOG_TAG, "Failed to update net address '$ipV4Addr'") + } else { + if (!preferIpV6 || (ipV6Addr == "")) + Api.net_set_af(false) + } + } + Api.net_force_change() Api.net_debug() - UserAgent.register() + // UserAgent.register() } } ) @@ -248,7 +256,7 @@ class BaresipService: Service() { Log.d(LOG_TAG, "Asset '$a' already copied") } if (a == "config") - Config.initialize(dnsServers) + Config.initialize() } if (File(filesDir, "history").exists()) @@ -266,6 +274,9 @@ class BaresipService: Service() { showStatusNotification() + if (Config.variable("dyn_dns")[0] == "yes") + Config.removeVariable("dns_server") + if (bindAddress != "") { Config.removeVariable("net_interface") Config.save() @@ -1057,6 +1068,8 @@ class BaresipService: Service() { val contacts = ArrayList() val chatTexts: MutableMap = mutableMapOf() val activities = mutableListOf() + var dnsServers = listOf() + var linkAddresses = listOf() } diff --git a/app/src/main/kotlin/com/tutpro/baresip/Config.kt b/app/src/main/kotlin/com/tutpro/baresip/Config.kt index 26f4e797..c2eb0f59 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/Config.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/Config.kt @@ -10,7 +10,7 @@ object Config { private val configPath = BaresipService.filesPath + "/config" private var config = String(Utils.getFileContents(configPath)!!, StandardCharsets.ISO_8859_1) - fun initialize(dnsServers: List) { + fun initialize() { Log.d("Baresip", "Config is '$config'") @@ -57,6 +57,7 @@ object Config { Log.logLevelSet(ll) } + removeVariable("net_prefer_ipv6") val preferIpV6 = variable("prefer_ipv6") if (preferIpV6.size == 0) { BaresipService.preferIpV6 = false @@ -74,8 +75,13 @@ object Config { config = "${config}dyn_dns no\n" } else { if (config.contains(Regex("dyn_dns[ ]+yes"))) { - for (dnsServer in dnsServers) - config = "${config}dns_server ${dnsServer.hostAddress}:53\n" + removeVariable("dns_server") + Log.d("Baresip", "DNS servers ${BaresipService.dnsServers}") + for (dnsServer in BaresipService.dnsServers) + if (Utils.checkIpV4(dnsServer.hostAddress)) + config = "${config}dns_server ${dnsServer.hostAddress}:53\n" + else + config = "${config}dns_server [${dnsServer.hostAddress}]:53\n" BaresipService.dynDns = true } } @@ -143,9 +149,4 @@ object Config { return Api.net_use_nameserver(servers) } - - fun updateNetAddress(ipAddress: String, prefer: Boolean): Int { - return Api.net_set_address(ipAddress, prefer) - } - } diff --git a/app/src/main/kotlin/com/tutpro/baresip/ConfigActivity.kt b/app/src/main/kotlin/com/tutpro/baresip/ConfigActivity.kt index 1ce6e7db..c0afa82d 100644 --- a/app/src/main/kotlin/com/tutpro/baresip/ConfigActivity.kt +++ b/app/src/main/kotlin/com/tutpro/baresip/ConfigActivity.kt @@ -74,7 +74,7 @@ class ConfigActivity : AppCompatActivity() { bindAddr.setText(oldBindAddr) preferIPv6 = findViewById(R.id.PreferIPv6) as CheckBox - val piCv = Config.variable("net_prefer_ipv6") + val piCv = Config.variable("prefer_ipv6") oldPreferIPv6 = if (piCv.size == 0) "no" else piCv[0] preferIPv6.isChecked = oldPreferIPv6 == "yes" @@ -238,9 +238,31 @@ class ConfigActivity : AppCompatActivity() { var preferIPv6String = "no" if (preferIPv6.isChecked) preferIPv6String = "yes" if (oldPreferIPv6 != preferIPv6String) { - Config.replaceVariable("net_prefer_ipv6", preferIPv6String) + Config.replaceVariable("prefer_ipv6", preferIPv6String) + BaresipService.preferIpV6 = preferIPv6String == "yes" + if (preferIPv6String == "yes") { + val ipV6Addr = Utils.findIpV6Address(BaresipService.linkAddresses) + if (ipV6Addr != "") { + if (Api.net_set_address(ipV6Addr) != 0) { + Log.w("Baresip", "Failed to update net address '$ipV6Addr'") + } else { + Api.net_set_af(true) + Api.net_force_change() + } + } + } else { + val ipV4Addr = Utils.findIpV4Address(BaresipService.linkAddresses) + if (ipV4Addr != "") { + if (Api.net_set_address(ipV4Addr) != 0) { + Log.w("Baresip", "Failed to update net address '$ipV4Addr'") + } else { + Api.net_set_af(false) + Api.net_force_change() + } + } + } + Api.net_debug() save = true - restart = true } val dnsServers = addMissingPorts(dnsServers.text.toString().trim().toLowerCase()) @@ -263,12 +285,7 @@ class ConfigActivity : AppCompatActivity() { } } else { Config.addLine("dyn_dns yes") - if (Build.VERSION.SDK_INT >= 23) { - val cm = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager - Config.updateDnsServers(cm.getLinkProperties(cm.activeNetwork).getDnsServers()) - } else { - restart = true - } + Config.updateDnsServers(BaresipService.dnsServers) } Api.net_debug() save = true