- Used new net_set_address and net_set_af API methods for implementing

prefer_ipv6 functionality.
This commit is contained in:
Juha Heinanen
2019-11-06 10:06:33 +02:00
parent 91717628f9
commit 935cd65a10
5 changed files with 93 additions and 40 deletions

View File

@ -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();

View File

@ -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

View File

@ -50,8 +50,6 @@ class BaresipService: Service() {
internal var audioFocused = false
internal var origCallVolume = -1
internal val btAdapter = BluetoothAdapter.getDefaultAdapter()
internal var dnsServers = listOf<InetAddress>()
internal var linkAddresses = listOf<LinkAddress>()
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<Contact>()
val chatTexts: MutableMap<String, String> = mutableMapOf<String, String>()
val activities = mutableListOf<String>()
var dnsServers = listOf<InetAddress>()
var linkAddresses = listOf<LinkAddress>()
}

View File

@ -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<InetAddress>) {
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)
}
}

View File

@ -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