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
This commit is contained in:
Wink Saville 2011-07-07 12:16:12 -07:00
parent 04cf629be5
commit 979203ee34
2 changed files with 33 additions and 23 deletions

View file

@ -34,7 +34,7 @@ extern int ifc_down(const char *name);
extern int ifc_enable(const char *ifname); extern int ifc_enable(const char *ifname);
extern int ifc_disable(const char *ifname); extern int ifc_disable(const char *ifname);
extern int ifc_reset_connections(const char *ifname); extern int ifc_reset_connections(const char *ifname, const int reset_mask);
extern int ifc_get_addr(const char *name, in_addr_t *addr); extern int ifc_get_addr(const char *name, in_addr_t *addr);
extern int ifc_set_addr(const char *name, in_addr_t addr); extern int ifc_set_addr(const char *name, in_addr_t addr);

View file

@ -353,7 +353,11 @@ int ifc_disable(const char *ifname)
return result; 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 #ifdef HAVE_ANDROID_OS
int result, success; int result, success;
@ -361,6 +365,7 @@ int ifc_reset_connections(const char *ifname)
struct ifreq ifr; struct ifreq ifr;
struct in6_ifreq ifr6; struct in6_ifreq ifr6;
if (reset_mask & RESET_IPV4_ADDRESSES) {
/* IPv4. Clear connections on the IP address. */ /* IPv4. Clear connections on the IP address. */
ifc_init(); ifc_init();
ifc_get_info(ifname, &myaddr, NULL, NULL); ifc_get_info(ifname, &myaddr, NULL, NULL);
@ -368,7 +373,11 @@ int ifc_reset_connections(const char *ifname)
init_sockaddr_in(&ifr.ifr_addr, myaddr); init_sockaddr_in(&ifr.ifr_addr, myaddr);
result = ioctl(ifc_ctl_sock, SIOCKILLADDR, &ifr); result = ioctl(ifc_ctl_sock, SIOCKILLADDR, &ifr);
ifc_close(); ifc_close();
} else {
result = 0;
}
if (reset_mask & RESET_IPV6_ADDRESSES) {
/* /*
* IPv6. On Linux, when an interface goes down it loses all its IPv6 * 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 * addresses, so we don't know which connections belonged to that interface
@ -383,6 +392,7 @@ int ifc_reset_connections(const char *ifname)
result = success; result = success;
} }
ifc_close6(); ifc_close6();
}
return result; return result;
#else #else