diff --git a/app/src/main/java/com/emanuelef/remote_capture/CaptureService.java b/app/src/main/java/com/emanuelef/remote_capture/CaptureService.java index 1e376c5e..4fbd6b6f 100644 --- a/app/src/main/java/com/emanuelef/remote_capture/CaptureService.java +++ b/app/src/main/java/com/emanuelef/remote_capture/CaptureService.java @@ -375,16 +375,19 @@ public class CaptureService extends VpnService implements Runnable { /* In order to see the DNS packets into the VPN we must set an internal address as the DNS * server. */ Builder builder = new Builder() - .addAddress(vpn_ipv4, 30) // using a random IP as an address is needed - .addRoute("0.0.0.0", 1) - .addRoute("128.0.0.0", 1) - .setMtu(VPN_MTU) - .addDnsServer(vpn_dns); + .setMtu(VPN_MTU); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) builder.setMetered(false); - if (mSettings.ipv6_enabled) { + if (getIPv4Enabled() == 1) { + builder.addAddress(vpn_ipv4, 30) + .addRoute("0.0.0.0", 1) + .addRoute("128.0.0.0", 1) + .addDnsServer(vpn_dns); + } + + if (getIPv6Enabled() == 1) { builder.addAddress(VPN_IP6_ADDRESS, 128); // Route unicast IPv6 addresses @@ -1105,7 +1108,9 @@ public class CaptureService extends VpnService implements Runnable { public String getSocks5ProxyAuth() { return(mSocks5Auth); } - public int getIPv6Enabled() { return(mSettings.ipv6_enabled ? 1 : 0); } + public int getIPv4Enabled() { return((mSettings.ip_mode != Prefs.IpMode.IPV6_ONLY) ? 1 : 0); } + + public int getIPv6Enabled() { return((mSettings.ip_mode != Prefs.IpMode.IPV4_ONLY) ? 1 : 0); } public int isRootCapture() { return(mSettings.root_capture ? 1 : 0); } diff --git a/app/src/main/java/com/emanuelef/remote_capture/activities/SettingsActivity.java b/app/src/main/java/com/emanuelef/remote_capture/activities/SettingsActivity.java index bcf66e00..b7cefa9f 100644 --- a/app/src/main/java/com/emanuelef/remote_capture/activities/SettingsActivity.java +++ b/app/src/main/java/com/emanuelef/remote_capture/activities/SettingsActivity.java @@ -128,7 +128,7 @@ public class SettingsActivity extends BaseActivity implements PreferenceFragment private SwitchPreference mAutoBlockPrivateDNS; private EditTextPreference mSocks5ProxyIp; private EditTextPreference mSocks5ProxyPort; - private Preference mIpv6Enabled; + private DropDownPreference mIpMode; private DropDownPreference mCapInterface; private SwitchPreference mMalwareDetectionEnabled; private Billing mIab; @@ -359,7 +359,7 @@ public class SettingsActivity extends BaseActivity implements PreferenceFragment } else mRootCaptureEnabled.setVisible(false); - mIpv6Enabled = requirePreference(Prefs.PREF_IPV6_ENABLED); + mIpMode = requirePreference(Prefs.PREF_IP_MODE); Preference ctrlPerm = requirePreference("control_permissions"); if(!PCAPdroid.getInstance().getCtrlPermissions().hasRules()) @@ -389,7 +389,7 @@ public class SettingsActivity extends BaseActivity implements PreferenceFragment socks5ProxyHideShow(mTlsDecryption.isChecked(), mSocks5Enabled.isChecked()); } - mIpv6Enabled.setVisible(!enabled); + mIpMode.setVisible(!enabled); mCapInterface.setVisible(enabled); } } diff --git a/app/src/main/java/com/emanuelef/remote_capture/model/CaptureSettings.java b/app/src/main/java/com/emanuelef/remote_capture/model/CaptureSettings.java index 3f8fe3a8..8543fb74 100644 --- a/app/src/main/java/com/emanuelef/remote_capture/model/CaptureSettings.java +++ b/app/src/main/java/com/emanuelef/remote_capture/model/CaptureSettings.java @@ -16,7 +16,7 @@ public class CaptureSettings implements Serializable { public boolean tls_decryption; public String socks5_proxy_address; public int socks5_proxy_port; - public boolean ipv6_enabled; + public Prefs.IpMode ip_mode; public boolean root_capture; public boolean pcapdroid_trailer; public boolean full_payload; @@ -37,7 +37,7 @@ public class CaptureSettings implements Serializable { socks5_enabled = Prefs.getSocks5Enabled(prefs); socks5_proxy_address = Prefs.getSocks5ProxyAddress(prefs); socks5_proxy_port = Prefs.getSocks5ProxyPort(prefs); - ipv6_enabled = Prefs.getIPv6Enabled(prefs); + ip_mode = Prefs.getIPMode(prefs); root_capture = Prefs.isRootCaptureEnabled(prefs); pcapdroid_trailer = Prefs.isPcapdroidTrailerEnabled(prefs); capture_interface = Prefs.getCaptureInterface(prefs); @@ -57,7 +57,7 @@ public class CaptureSettings implements Serializable { socks5_enabled = getBool(intent, Prefs.PREF_SOCKS5_ENABLED_KEY, false); socks5_proxy_address = getString(intent, Prefs.PREF_SOCKS5_PROXY_IP_KEY, "0.0.0.0"); socks5_proxy_port = getInt(intent, Prefs.PREF_SOCKS5_PROXY_PORT_KEY, 8080); - ipv6_enabled = getBool(intent, Prefs.PREF_IPV6_ENABLED, false); + ip_mode = Prefs.getIPMode(getString(intent, Prefs.PREF_IP_MODE, Prefs.IP_MODE_DEFAULT)); root_capture = getBool(intent, Prefs.PREF_ROOT_CAPTURE, false); pcapdroid_trailer = getBool(intent, Prefs.PREF_PCAPDROID_TRAILER, false); capture_interface = getString(intent, Prefs.PREF_CAPTURE_INTERFACE, "@inet"); diff --git a/app/src/main/java/com/emanuelef/remote_capture/model/Prefs.java b/app/src/main/java/com/emanuelef/remote_capture/model/Prefs.java index 11b9ddb7..e00732f1 100644 --- a/app/src/main/java/com/emanuelef/remote_capture/model/Prefs.java +++ b/app/src/main/java/com/emanuelef/remote_capture/model/Prefs.java @@ -33,6 +33,11 @@ public class Prefs { public static final String DUMP_PCAP_FILE = "pcap_file"; public static final String DEFAULT_DUMP_MODE = DUMP_NONE; + public static final String IP_MODE_IPV4_ONLY = "ipv4"; + public static final String IP_MODE_IPV6_ONLY = "ipv6"; + public static final String IP_MODE_BOTH = "both"; + public static final String IP_MODE_DEFAULT = IP_MODE_IPV4_ONLY; + public static final String PAYLOAD_MODE_NONE = "none"; public static final String PAYLOAD_MODE_MINIMAL = "minimal"; public static final String PAYLOAD_MODE_FULL = "full"; @@ -50,7 +55,7 @@ public class Prefs { public static final String PREF_HTTP_SERVER_PORT = "http_server_port"; public static final String PREF_PCAP_DUMP_MODE = "pcap_dump_mode_v2"; public static final String PREF_PCAP_URI = "pcap_uri"; - public static final String PREF_IPV6_ENABLED = "ipv6_enabled"; + public static final String PREF_IP_MODE = "ip_mode"; public static final String PREF_APP_LANGUAGE = "app_language"; public static final String PREF_APP_THEME = "app_theme"; public static final String PREF_ROOT_CAPTURE = "root_capture"; @@ -77,6 +82,12 @@ public class Prefs { UDP_EXPORTER } + public enum IpMode { + IPV4_ONLY, + IPV6_ONLY, + BOTH, + } + public enum PayloadMode { NONE, MINIMAL, @@ -92,6 +103,14 @@ public class Prefs { } } + public static IpMode getIPMode(String pref) { + switch (pref) { + case IP_MODE_IPV6_ONLY: return IpMode.IPV6_ONLY; + case IP_MODE_BOTH: return IpMode.BOTH; + default: return IpMode.IPV4_ONLY; + } + } + public static PayloadMode getPayloadMode(String pref) { switch (pref) { case PAYLOAD_MODE_MINIMAL: return PayloadMode.MINIMAL; @@ -122,7 +141,7 @@ public class Prefs { public static String getSocks5ProxyAddress(SharedPreferences p) { return(p.getString(PREF_SOCKS5_PROXY_IP_KEY, "0.0.0.0")); } public static int getSocks5ProxyPort(SharedPreferences p) { return(Integer.parseInt(p.getString(Prefs.PREF_SOCKS5_PROXY_PORT_KEY, "8080"))); } public static String getAppFilter(SharedPreferences p) { return(p.getString(PREF_APP_FILTER, "")); } - public static boolean getIPv6Enabled(SharedPreferences p) { return(p.getBoolean(PREF_IPV6_ENABLED, false)); } + public static IpMode getIPMode(SharedPreferences p) { return(getIPMode(p.getString(PREF_IP_MODE, IP_MODE_DEFAULT))); } public static boolean useEnglishLanguage(SharedPreferences p){ return("english".equals(p.getString(PREF_APP_LANGUAGE, "system")));} public static boolean isRootCaptureEnabled(SharedPreferences p) { return(Utils.isRootAvailable() && p.getBoolean(PREF_ROOT_CAPTURE, false)); } public static boolean isPcapdroidTrailerEnabled(SharedPreferences p) { return(p.getBoolean(PREF_PCAPDROID_TRAILER, false)); } diff --git a/app/src/main/jni/core/capture_vpn.c b/app/src/main/jni/core/capture_vpn.c index 10018a2e..f6056790 100644 --- a/app/src/main/jni/core/capture_vpn.c +++ b/app/src/main/jni/core/capture_vpn.c @@ -147,11 +147,11 @@ static bool check_dns_req_allowed(pcapdroid_t *pd, zdtun_conn_t *conn, pkt_conte if(new_dns_server != 0) { // Reload DNS server - pd->vpn.dns_server = new_dns_server; + pd->vpn.ipv4.dns_server = new_dns_server; new_dns_server = 0; zdtun_ip_t ip = {0}; - ip.ip4 = pd->vpn.dns_server; + ip.ip4 = pd->vpn.ipv4.dns_server; zdtun_set_dnat_info(pd->zdt, &ip, htons(53), 4); log_d("Using new DNS server"); @@ -160,9 +160,9 @@ static bool check_dns_req_allowed(pcapdroid_t *pd, zdtun_conn_t *conn, pkt_conte if(pctx->tuple->ipproto == IPPROTO_ICMP) return true; - bool is_internal_dns = (tuple->ipver == 4) && (tuple->dst_ip.ip4 == pd->vpn.internal_dns); + bool is_internal_dns = pd->vpn.ipv4.enabled && (tuple->ipver == 4) && (tuple->dst_ip.ip4 == pd->vpn.ipv4.internal_dns); bool is_dns_server = is_internal_dns - || ((tuple->ipver == 6) && (memcmp(&tuple->dst_ip.ip6, &pd->ipv6.dns_server, 16) == 0)); + || (pd->vpn.ipv6.enabled && (tuple->ipver == 6) && (memcmp(&tuple->dst_ip.ip6, &pd->vpn.ipv6.dns_server, 16) == 0)); if(!is_dns_server) { // try with known DNS servers @@ -421,12 +421,16 @@ int run_vpn(pcapdroid_t *pd) { } #if ANDROID - pd->vpn.internal_ipv4 = getIPv4Pref(pd->env, pd->capture_service, "getVpnIPv4"); - pd->vpn.internal_dns = getIPv4Pref(pd->env, pd->capture_service, "getVpnDns"); - pd->vpn.dns_server = getIPv4Pref(pd->env, pd->capture_service, "getDnsServer"); pd->vpn.resolver = init_uid_resolver(pd->sdk_ver, pd->env, pd->capture_service); pd->vpn.known_dns_servers = blacklist_init(); pd->vpn.block_quic = getIntPref(pd->env, pd->capture_service, "blockQuick"); + + pd->vpn.ipv4.enabled = (bool) getIntPref(pd->env, pd->capture_service, "getIPv4Enabled"); + pd->vpn.ipv4.dns_server = getIPv4Pref(pd->env, pd->capture_service, "getDnsServer"); + pd->vpn.ipv4.internal_dns = getIPv4Pref(pd->env, pd->capture_service, "getVpnDns"); + + pd->vpn.ipv6.enabled = (bool) getIntPref(pd->env, pd->capture_service, "getIPv6Enabled"); + pd->vpn.ipv6.dns_server = getIPv6Pref(pd->env, pd->capture_service, "getIpv6DnsServer"); #endif zdtun_callbacks_t callbacks = { @@ -461,9 +465,11 @@ int run_vpn(pcapdroid_t *pd) { zdtun_set_socks5_userpass(zdt, pd->socks5.proxy_user, pd->socks5.proxy_pass); } - zdtun_ip_t ip = {0}; - ip.ip4 = pd->vpn.dns_server; - zdtun_set_dnat_info(zdt, &ip, ntohs(53), 4); + if(pd->vpn.ipv4.enabled) { + zdtun_ip_t ip = {0}; + ip.ip4 = pd->vpn.ipv4.dns_server; + zdtun_set_dnat_info(zdt, &ip, ntohs(53), 4); + } pd_refresh_time(pd); next_purge_ms = pd->now_ms + PERIODIC_PURGE_TIMEOUT_MS; @@ -508,10 +514,11 @@ int run_vpn(pcapdroid_t *pd) { goto housekeeping; } - if((pkt.tuple.ipver == 6) && (!pd->ipv6.enabled)) { + if(((pkt.tuple.ipver == 6) && !pd->vpn.ipv6.enabled) || + ((pkt.tuple.ipver == 4) && !pd->vpn.ipv4.enabled)) { char buf[512]; - log_d("ignoring IPv6 packet: %s", + log_d("ignoring IPv%d packet: %s", pkt.tuple.ipver, zdtun_5tuple2str(&pkt.tuple, buf, sizeof(buf))); goto housekeeping; } diff --git a/app/src/main/jni/core/jni_impl.c b/app/src/main/jni/core/jni_impl.c index c260a185..8d334622 100644 --- a/app/src/main/jni/core/jni_impl.c +++ b/app/src/main/jni/core/jni_impl.c @@ -567,10 +567,6 @@ Java_com_emanuelef_remote_1capture_CaptureService_runPacketLoop(JNIEnv *env, jcl .proxy_ip = getIPv4Pref(env, vpn, "getSocks5ProxyAddress"), .proxy_port = htons(getIntPref(env, vpn, "getSocks5ProxyPort")), }, - .ipv6 = { - .enabled = (bool) getIntPref(env, vpn, "getIPv6Enabled"), - .dns_server = getIPv6Pref(env, vpn, "getIpv6DnsServer"), - }, .malware_detection = { .enabled = (bool) getIntPref(env, vpn, "malwareDetectionEnabled"), }, diff --git a/app/src/main/jni/core/pcapdroid.h b/app/src/main/jni/core/pcapdroid.h index 02ae7bae..9cf50d96 100644 --- a/app/src/main/jni/core/pcapdroid.h +++ b/app/src/main/jni/core/pcapdroid.h @@ -204,11 +204,18 @@ typedef struct pcapdroid { struct { int tunfd; bool block_quic; - uint32_t dns_server; - uint32_t internal_dns; - uint32_t internal_ipv4; blacklist_t *known_dns_servers; uid_resolver_t *resolver; + + struct { + bool enabled; + uint32_t dns_server; + uint32_t internal_dns; + } ipv4; + struct { + bool enabled; + struct in6_addr dns_server; + } ipv6; } vpn; struct { struct pcap_conn_t *connections; @@ -239,11 +246,6 @@ typedef struct pcapdroid { char proxy_pass[32]; } socks5; - struct { - bool enabled; - struct in6_addr dns_server; - } ipv6; - struct { bool enabled; blacklist_t *bl; // blacklist diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 514289fe..1246ac2b 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -92,7 +92,6 @@ Speichern unter %1$d älter Verbindungen werden nicht angezeigt Unbekannt - IPv6-Verbindungen zum Internet zulassen. Verwende dies nur in Netzwerken mit einem IPv6-Gateway Fehler Unerreichbar Andere diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 733144f4..3332d7f4 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -71,8 +71,6 @@ PCAPdroid es una herramienta de captura y monitorización de red de código abierto que funciona sin privilegios root Obténgalo: Desconocido - IPv6 - Permite las conexiones IPv6 a Internet. Utilízalo solo en redes con una puerta de enlace IPv6 Error Inalcanzable Otros diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 6bd04f57..d7966aca 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -96,7 +96,6 @@ Chercher des applis Fichier PCAP Déconnecter l\'application RPV active et continuer \? - Activer IPv6 Version Chargement des applis… Fermer le menu @@ -109,7 +108,6 @@ Adresse IP du collecteur Port du collecteur Créer une fichier PCAP dans l\'espace de stockage - Autoriser les connexions internet IPv6. À n\'utiliser que sur les réseaux connecté en IPv6 L\'obtenir : PCAPdroid est un outil open-source de capture et de suivi de réseau qui fonctionne sans un compte administrateur Port de proxy diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index 1d2cec69..07f0eab4 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -211,7 +211,6 @@ Simpan ke file Tidak diketahui Log root - Izinkan koneksi IPv6 ke Internet. Hanya gunakan ini di jaringan dengan gateway IPv6 Sistem Tidak terjangkau Alamat IP proxy @@ -260,7 +259,6 @@ Pembuangan lalu lintas Aktif Telepon - IPv6 SOCKS5 Proksi SOCKS5: %1$s:%2$d Layanan telepon diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index a36c6c50..2a9ba07a 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -71,8 +71,6 @@ PCAPdroid è un software libero per la cattura e il monitoraggio di rete che funziona senza privilegi di root Scaricala: Sconosciuta - Abilita IPv6 - Permetti connessioni internet IPv6. Da abilitare soltanto in reti con gateway IPv6 Errore Non raggiungibile Altro diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 75ea7059..5402b209 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -71,8 +71,6 @@ PCAPdroid はルート権限なしで動作するオープン ソースのネットワーク キャプチャ、モニタリング ツールです 入手: 不明 - IPv6 を有効にする - IPv6 インターネット接続を許可します。IPv6 ゲートウェイを搭載したネットワークでのみ有効にする必要があります エラー 到達不能 その他 diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index 955b20d8..4facfa9f 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -58,7 +58,6 @@ Kopier til utklippstavle Lagre som fil Ukjent - Skru på IPv6 Feil %1$d eldre tilkoblinger vises ikke PCAPdroid er et fritt verktøy for nettverksovervåkning og lagring, som fungerer uten rot-tilgang @@ -177,7 +176,6 @@ Opprett en PCAP-fil i enhetslagring Alle tilkoblinger Fangst kjører - Tillat IPv6-tilkoblinger til Internett. Kun bruk dette på nettverk med en IPv6-portner. Pakker som ikke kom fram Installert Trafikkfangst diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 73dfb6e0..cb183f3c 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -72,8 +72,6 @@ PCAPdroid é uma ferramenta de software livre de captura e monitoramento de rede que funciona sem acesso root Baixar: Desconhecido - IPv6 - Permitir conexões IPv6. Deveria usar apenas em redes com um gateway IPv6 Erro Inacessível Outro diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index c5dda931..0be5b6fb 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -71,8 +71,6 @@ PCAPdroid это свободный инструмент захвата и отслеживания сетевого трафика, который работает без привилегий суперпользователя Получить его: Неизвестное - Включить IPv6 - Разрешить IPv6 соединения с интернетом. Это следует включать только в сетях с IPv6 шлюзом Ошибка Недоступен Другое diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 766d17cc..80e8daa5 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -57,7 +57,6 @@ Kapalı %1$d eski bağlantı gösterilmiyor Bilinmeyen - İnternete IPv6 bağlantıları yapmaya izin verin. Bunu yalnızca IPv6 ağ geçidi olan ağlarda kullanın Diğer Uygulama dili İngilizce @@ -266,7 +265,6 @@ Telefon SOCKS5 Telefon hizmetleri - IPv6 Yapılandır \"VPN ve uygulamalar\" seçeneğini seçerek PCAPdroid CA sertifikasını kurun. Android, kilit ekranınızı veya parolanızı soracak Ortadaki adam gerçekleştirerek SSL/TLS trafiğinin şifresini çöz. Bu artık bazı uygulamalarla çalışabilir, kullanım kılavuzuna bakın diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 4e2f2699..50d5d996 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -97,8 +97,6 @@ PCAPdroid 是一款无需获取根权限便可进行网络捕获和监视的开源工具 获取应用: 未知 - 启用 IPv6 - 允许 IPv6 网络连接。仅在带有 IPv6 网关的网络中使用 错误 不可达 其他 diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index e05091ff..122ce756 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -28,6 +28,17 @@ @string/lang_english + + ipv4 + ipv6 + both + + + @string/ipv4_only + @string/ipv6_only + @string/ip_both + + system light diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 391d6c20..82b7558b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -104,8 +104,6 @@ Get it: Unknown Phone - IPv6 - Allow IPv6 connections to the Internet. Only use this on networks with an IPv6 gateway Error Unreachable Other @@ -369,4 +367,8 @@ Heap usage Memory usage To prevent apps from accessing the Internet when PCAPdroid is not running (e.g. after a reboot) you can set PCAPdroid as an always-on VPN in lockdown mode.\n\nDo you want to open the VPN settings now? + VPN IP addresses + IPv4 only + IPv6 only + IPv4 and IPv6 diff --git a/app/src/main/res/xml/root_preferences.xml b/app/src/main/res/xml/root_preferences.xml index 71a4ac43..d1a730a5 100644 --- a/app/src/main/res/xml/root_preferences.xml +++ b/app/src/main/res/xml/root_preferences.xml @@ -176,12 +176,14 @@ app:defaultValue="system" app:useSimpleSummaryProvider="true"/> - + app:defaultValue="ipv4" + app:useSimpleSummaryProvider="true" />