summaryrefslogtreecommitdiffstats
path: root/libnetutils
diff options
context:
space:
mode:
authorLorenzo Colitti <lorenzo@google.com>2011-03-30 17:36:37 -0700
committerAndroid Git Automerger <android-git-automerger@android.com>2011-03-30 17:36:37 -0700
commit7b43eb122414676f4a86d5fd546dc60e51bf322a (patch)
tree20a1995872e8f6efa968d48f4af2a1f5aba241e2 /libnetutils
parenta8bf8324623e42f388042da58b62ebf653346044 (diff)
parente9fa47ca664577e4ca7ed270f1f72a2d43fb3423 (diff)
downloadsystem_core-7b43eb122414676f4a86d5fd546dc60e51bf322a.zip
system_core-7b43eb122414676f4a86d5fd546dc60e51bf322a.tar.gz
system_core-7b43eb122414676f4a86d5fd546dc60e51bf322a.tar.bz2
am e9fa47ca: am 0dd572a5: Merge "Kill IPv6 sockets as well as IPv4 sockets." into honeycomb-LTE
* commit 'e9fa47ca664577e4ca7ed270f1f72a2d43fb3423': Kill IPv6 sockets as well as IPv4 sockets.
Diffstat (limited to 'libnetutils')
-rw-r--r--libnetutils/ifc_utils.c19
1 files changed, 18 insertions, 1 deletions
diff --git a/libnetutils/ifc_utils.c b/libnetutils/ifc_utils.c
index e5c58b9..946c39d 100644
--- a/libnetutils/ifc_utils.c
+++ b/libnetutils/ifc_utils.c
@@ -366,10 +366,12 @@ int ifc_disable(const char *ifname)
int ifc_reset_connections(const char *ifname)
{
#ifdef HAVE_ANDROID_OS
- int result;
+ int result, success;
in_addr_t myaddr;
struct ifreq ifr;
+ struct in6_ifreq ifr6;
+ /* IPv4. Clear connections on the IP address. */
ifc_init();
ifc_get_info(ifname, &myaddr, NULL, NULL);
ifc_init_ifr(ifname, &ifr);
@@ -377,6 +379,21 @@ int ifc_reset_connections(const char *ifname)
result = ioctl(ifc_ctl_sock, SIOCKILLADDR, &ifr);
ifc_close();
+ /*
+ * IPv6. On Linux, when an interface goes down it loses all its IPv6
+ * addresses, so we don't know which connections belonged to that interface
+ * So we clear all unused IPv6 connections on the device by specifying an
+ * empty IPv6 address.
+ */
+ ifc_init6();
+ // This implicitly specifies an address of ::, i.e., kill all IPv6 sockets.
+ memset(&ifr6, 0, sizeof(ifr6));
+ success = ioctl(ifc_ctl_sock6, SIOCKILLADDR, &ifr6);
+ if (result == 0) {
+ result = success;
+ }
+ ifc_close6();
+
return result;
#else
return 0;