diff options
author | Lorenzo Colitti <lorenzo@google.com> | 2014-11-10 17:00:02 -0800 |
---|---|---|
committer | Lorenzo Colitti <lorenzo@google.com> | 2014-11-10 16:06:44 -1000 |
commit | 2596f42a4f4c42bfb96ccbfc2700dbf70502ec75 (patch) | |
tree | d4c7eacd0499743fef30aa5cc5be6c4c8f531fe5 /config.c | |
parent | 798f9934fca523dfb57136bd185cf6e9460323ad (diff) | |
download | android_external_android-clat-2596f42a4f4c42bfb96ccbfc2700dbf70502ec75.tar.gz android_external_android-clat-2596f42a4f4c42bfb96ccbfc2700dbf70502ec75.tar.bz2 android_external_android-clat-2596f42a4f4c42bfb96ccbfc2700dbf70502ec75.zip |
Never use a statically-configured IID on wifi.
Bug: 12111730
Change-Id: I062d81f2b65e6e89baae0f840cbd673f8051d523
Diffstat (limited to 'config.c')
-rw-r--r-- | config.c | 15 |
1 files changed, 14 insertions, 1 deletions
@@ -25,6 +25,7 @@ #include <unistd.h> #include <cutils/config_utils.h> +#include <netutils/ifc.h> #include "config.h" #include "dns64.h" @@ -276,7 +277,7 @@ in_addr_t config_select_ipv4_address(const struct in_addr *ip, int16_t prefixlen void config_generate_local_ipv6_subnet(struct in6_addr *interface_ip) { int i; - if (IN6_IS_ADDR_UNSPECIFIED(&Global_Clatd_Config.ipv6_host_id)) { + if (Global_Clatd_Config.use_dynamic_iid) { /* Generate a random interface ID. */ gen_random_iid(interface_ip, &Global_Clatd_Config.ipv4_local_subnet, @@ -300,6 +301,7 @@ int read_config(const char *file, const char *uplink_interface, const char *plat unsigned net_id) { cnode *root = config_node("", ""); void *tmp_ptr = NULL; + unsigned flags; if(!root) { logmsg(ANDROID_LOG_FATAL,"out of memory"); @@ -358,6 +360,17 @@ int read_config(const char *file, const char *uplink_interface, const char *plat if (!config_item_ip6(root, "ipv6_host_id", "::", &Global_Clatd_Config.ipv6_host_id)) goto failed; + /* In order to prevent multiple devices attempting to use the same clat address, never use a + statically-configured interface ID on a broadcast interface such as wifi. */ + if (!IN6_IS_ADDR_UNSPECIFIED(&Global_Clatd_Config.ipv6_host_id)) { + ifc_init(); + ifc_get_info(Global_Clatd_Config.default_pdp_interface, NULL, NULL, &flags); + ifc_close(); + Global_Clatd_Config.use_dynamic_iid = (flags & IFF_BROADCAST) != 0; + } else { + Global_Clatd_Config.use_dynamic_iid = 1; + } + return 1; failed: |