diff options
author | Lorenzo Colitti <lorenzo@google.com> | 2014-10-21 12:37:48 +0900 |
---|---|---|
committer | Lorenzo Colitti <lorenzo@google.com> | 2014-10-29 11:53:05 +0900 |
commit | 8a41a5d140b3cf56a54bdeef234e89ee12cba0dc (patch) | |
tree | 0c9d8647d776b79d18cc169425a347aed38a5d87 /clatd.c | |
parent | 1352a3a26c4d7c32b38b7fadb837799a23014aa6 (diff) | |
download | platform_external_android-clat-8a41a5d140b3cf56a54bdeef234e89ee12cba0dc.tar.gz platform_external_android-clat-8a41a5d140b3cf56a54bdeef234e89ee12cba0dc.tar.bz2 platform_external_android-clat-8a41a5d140b3cf56a54bdeef234e89ee12cba0dc.zip |
Support 464xlat on broadcast interfaces such as wifi.
This works by generating a random IID and then using the
IPV6_JOIN_ANYCAST socket option on the write-only raw socket to
configure an address on the interface.
Change-Id: Ieb885b7c54454988e2e4254a14b4213cba3bd791
Diffstat (limited to 'clatd.c')
-rw-r--r-- | clatd.c | 4 |
1 files changed, 4 insertions, 0 deletions
@@ -275,10 +275,12 @@ int update_clat_ipv6_address(const struct tun_data *tunnel, const char *interfac char from_addr[INET6_ADDRSTRLEN]; inet_ntop(AF_INET6, &Global_Clatd_Config.ipv6_local_subnet, from_addr, sizeof(from_addr)); logmsg(ANDROID_LOG_INFO, "clat IPv6 address changed from %s to %s", from_addr, addrstr); + del_anycast_address(tunnel->write_fd6, &Global_Clatd_Config.ipv6_local_subnet); } // Start translating packets to the new prefix. Global_Clatd_Config.ipv6_local_subnet = interface_ip->ip6; + add_anycast_address(tunnel->write_fd6, &Global_Clatd_Config.ipv6_local_subnet, interface); free(interface_ip); // Update our packet socket filter to reflect the new 464xlat IP address. @@ -534,9 +536,11 @@ int main(int argc, char **argv) { logmsg(ANDROID_LOG_FATAL, "sigterm handler failed: %s", strerror(errno)); exit(1); } + event_loop(&tunnel); logmsg(ANDROID_LOG_INFO,"Shutting down clat on %s", uplink_interface); + del_anycast_address(tunnel.write_fd6, &Global_Clatd_Config.ipv6_local_subnet); return 0; } |