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 | |
parent | 798f9934fca523dfb57136bd185cf6e9460323ad (diff) | |
download | platform_external_android-clat-lollipop-mr1-dev.tar.gz platform_external_android-clat-lollipop-mr1-dev.tar.bz2 platform_external_android-clat-lollipop-mr1-dev.zip |
Never use a statically-configured IID on wifi.android-cts-5.1_r9android-cts-5.1_r8android-cts-5.1_r7android-cts-5.1_r6android-cts-5.1_r5android-cts-5.1_r4android-cts-5.1_r3android-cts-5.1_r28android-cts-5.1_r27android-cts-5.1_r26android-cts-5.1_r25android-cts-5.1_r24android-cts-5.1_r23android-cts-5.1_r22android-cts-5.1_r21android-cts-5.1_r20android-cts-5.1_r2android-cts-5.1_r19android-cts-5.1_r18android-cts-5.1_r17android-cts-5.1_r16android-cts-5.1_r15android-cts-5.1_r14android-cts-5.1_r13android-cts-5.1_r10android-cts-5.1_r1android-5.1.1_r9android-5.1.1_r8android-5.1.1_r7android-5.1.1_r6android-5.1.1_r5android-5.1.1_r4android-5.1.1_r38android-5.1.1_r37android-5.1.1_r36android-5.1.1_r35android-5.1.1_r34android-5.1.1_r33android-5.1.1_r30android-5.1.1_r3android-5.1.1_r29android-5.1.1_r28android-5.1.1_r26android-5.1.1_r25android-5.1.1_r24android-5.1.1_r23android-5.1.1_r22android-5.1.1_r20android-5.1.1_r2android-5.1.1_r19android-5.1.1_r18android-5.1.1_r17android-5.1.1_r16android-5.1.1_r15android-5.1.1_r14android-5.1.1_r13android-5.1.1_r12android-5.1.1_r10android-5.1.1_r1android-5.1.0_r5android-5.1.0_r4android-5.1.0_r3android-5.1.0_r1lollipop-mr1-wfc-releaselollipop-mr1-releaselollipop-mr1-fi-releaselollipop-mr1-devlollipop-mr1-cts-release
Bug: 12111730
Change-Id: I062d81f2b65e6e89baae0f840cbd673f8051d523
-rw-r--r-- | Android.mk | 2 | ||||
-rw-r--r-- | clatd_test.cpp | 6 | ||||
-rw-r--r-- | config.c | 15 | ||||
-rw-r--r-- | config.h | 1 |
4 files changed, 22 insertions, 2 deletions
@@ -6,7 +6,7 @@ LOCAL_SRC_FILES:=clatd.c dump.c checksum.c translate.c icmp.c ipv4.c ipv6.c conf LOCAL_CFLAGS := -Wall -Werror -Wunused-parameter LOCAL_C_INCLUDES := external/libnl/include bionic/libc/dns/include LOCAL_STATIC_LIBRARIES := libnl -LOCAL_SHARED_LIBRARIES := libcutils liblog +LOCAL_SHARED_LIBRARIES := libcutils liblog libnetutils # The clat daemon. LOCAL_MODULE := clatd diff --git a/clatd_test.cpp b/clatd_test.cpp index 085a9b7..fe52c21 100644 --- a/clatd_test.cpp +++ b/clatd_test.cpp @@ -565,6 +565,7 @@ class ClatdTest : public ::testing::Test { inet_pton(AF_INET6, kIPv6PlatSubnet, &Global_Clatd_Config.plat_subnet); inet_pton(AF_INET6, kIPv6LocalAddr, &Global_Clatd_Config.ipv6_local_subnet); Global_Clatd_Config.ipv6_host_id = in6addr_any; + Global_Clatd_Config.use_dynamic_iid = 1; } }; @@ -621,11 +622,16 @@ TEST_F(ClatdTest, TestCountOnebits) { TEST_F(ClatdTest, TestGenIIDConfigured) { struct in6_addr myaddr, expected; + Global_Clatd_Config.use_dynamic_iid = 0; ASSERT_TRUE(inet_pton(AF_INET6, "::bad:ace:d00d", &Global_Clatd_Config.ipv6_host_id)); ASSERT_TRUE(inet_pton(AF_INET6, "2001:db8:1:2:0:bad:ace:d00d", &expected)); ASSERT_TRUE(inet_pton(AF_INET6, "2001:db8:1:2:f076:ae99:124e:aa54", &myaddr)); config_generate_local_ipv6_subnet(&myaddr); expect_ipv6_addr_equal(&expected, &myaddr); + + Global_Clatd_Config.use_dynamic_iid = 1; + config_generate_local_ipv6_subnet(&myaddr); + EXPECT_FALSE(IN6_ARE_ADDR_EQUAL(&expected, &myaddr)); } TEST_F(ClatdTest, TestGenIIDRandom) { @@ -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: @@ -33,6 +33,7 @@ struct clat_config { struct in6_addr plat_subnet; char *default_pdp_interface; char *plat_from_dns64_hostname; + int use_dynamic_iid; }; extern struct clat_config Global_Clatd_Config; |