summaryrefslogtreecommitdiffstats
path: root/clatd.c
diff options
context:
space:
mode:
authorLorenzo Colitti <lorenzo@google.com>2014-10-21 12:37:48 +0900
committerLorenzo Colitti <lorenzo@google.com>2014-10-29 11:53:05 +0900
commit8a41a5d140b3cf56a54bdeef234e89ee12cba0dc (patch)
tree0c9d8647d776b79d18cc169425a347aed38a5d87 /clatd.c
parent1352a3a26c4d7c32b38b7fadb837799a23014aa6 (diff)
downloadplatform_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.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/clatd.c b/clatd.c
index 78ccccc..41e961e 100644
--- a/clatd.c
+++ b/clatd.c
@@ -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;
}