diff options
author | Lorenzo Colitti <lorenzo@google.com> | 2011-03-30 17:36:37 -0700 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2011-03-30 17:36:37 -0700 |
commit | 7b43eb122414676f4a86d5fd546dc60e51bf322a (patch) | |
tree | 20a1995872e8f6efa968d48f4af2a1f5aba241e2 /libnetutils | |
parent | a8bf8324623e42f388042da58b62ebf653346044 (diff) | |
parent | e9fa47ca664577e4ca7ed270f1f72a2d43fb3423 (diff) | |
download | system_core-7b43eb122414676f4a86d5fd546dc60e51bf322a.tar.gz system_core-7b43eb122414676f4a86d5fd546dc60e51bf322a.tar.bz2 system_core-7b43eb122414676f4a86d5fd546dc60e51bf322a.zip |
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.c | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/libnetutils/ifc_utils.c b/libnetutils/ifc_utils.c index e5c58b9b..946c39de 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; |