summaryrefslogtreecommitdiffstats
path: root/libnetutils
diff options
context:
space:
mode:
authorWink Saville <wink@google.com>2011-07-07 12:16:12 -0700
committerWink Saville <wink@google.com>2011-07-07 12:16:12 -0700
commit979203ee34084327bf4f20ad1f878450de94826e (patch)
tree67400c3406436e317dba0c0c98612880332b8331 /libnetutils
parent04cf629be5e99a3a920aecc0b059444bd07e9d84 (diff)
downloadsystem_core-979203ee34084327bf4f20ad1f878450de94826e.zip
system_core-979203ee34084327bf4f20ad1f878450de94826e.tar.gz
system_core-979203ee34084327bf4f20ad1f878450de94826e.tar.bz2
Add reset_mask as parameter to ifc_reset_connections
The reset_mask allows either IPv4 and or IPv6 connections of an interface to be reset. Bug: 4981919 Change-Id: Id2d9ab90e30091d3d0764c66d4b01b73c0edbfcc
Diffstat (limited to 'libnetutils')
-rw-r--r--libnetutils/ifc_utils.c54
1 files changed, 32 insertions, 22 deletions
diff --git a/libnetutils/ifc_utils.c b/libnetutils/ifc_utils.c
index e7a7130..c9d6ed2 100644
--- a/libnetutils/ifc_utils.c
+++ b/libnetutils/ifc_utils.c
@@ -353,7 +353,11 @@ int ifc_disable(const char *ifname)
return result;
}
-int ifc_reset_connections(const char *ifname)
+#define RESET_IPV4_ADDRESSES 0x01
+#define RESET_IPV6_ADDRESSES 0x02
+#define RESET_ALL_ADDRESSES (RESET_IPV4_ADDRESSES | RESET_IPV6_ADDRESSES)
+
+int ifc_reset_connections(const char *ifname, const int reset_mask)
{
#ifdef HAVE_ANDROID_OS
int result, success;
@@ -361,28 +365,34 @@ int ifc_reset_connections(const char *ifname)
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);
- init_sockaddr_in(&ifr.ifr_addr, myaddr);
- 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;
+ if (reset_mask & RESET_IPV4_ADDRESSES) {
+ /* IPv4. Clear connections on the IP address. */
+ ifc_init();
+ ifc_get_info(ifname, &myaddr, NULL, NULL);
+ ifc_init_ifr(ifname, &ifr);
+ init_sockaddr_in(&ifr.ifr_addr, myaddr);
+ result = ioctl(ifc_ctl_sock, SIOCKILLADDR, &ifr);
+ ifc_close();
+ } else {
+ result = 0;
+ }
+
+ if (reset_mask & RESET_IPV6_ADDRESSES) {
+ /*
+ * 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();
}
- ifc_close6();
return result;
#else