summaryrefslogtreecommitdiff
path: root/src/inet.c
diff options
context:
space:
mode:
authorPatrik Flykt <patrik.flykt@linux.intel.com>2012-08-16 09:21:34 (GMT)
committerPatrik Flykt <patrik.flykt@linux.intel.com>2012-08-17 13:13:13 (GMT)
commit9b0851196880a79fbcca76616c27bb9d16ba94c7 (patch)
treeddcead0cc16a12b9f98b005fdc4f9f9c3b231b9c /src/inet.c
parent4d33afaed53d7ca3fcc7522be526a09a5bef3a0a (diff)
downloadconnman-9b0851196880a79fbcca76616c27bb9d16ba94c7.zip
connman-9b0851196880a79fbcca76616c27bb9d16ba94c7.tar.gz
connman-9b0851196880a79fbcca76616c27bb9d16ba94c7.tar.bz2
inet: Clear IP addresses when interface is set down
Clear interface IPv4 address by setting it to 0.0.0.0. IPv6 addresses are cleared automatically when the IFF_DYNAMIC flag is set at the time the interface is brought down. By removing the IP address and netmask, netlink properly reports new addresses assigned by DHCPv4.
Diffstat (limited to 'src/inet.c')
-rw-r--r--src/inet.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/src/inet.c b/src/inet.c
index 0c3109d..75efc26 100644
--- a/src/inet.c
+++ b/src/inet.c
@@ -294,7 +294,7 @@ int connman_inet_ifup(int index)
goto done;
}
- ifr.ifr_flags |= IFF_UP;
+ ifr.ifr_flags |= (IFF_UP|IFF_DYNAMIC);
if (ioctl(sk, SIOCSIFFLAGS, &ifr) < 0) {
err = -errno;
@@ -312,6 +312,7 @@ done:
int connman_inet_ifdown(int index)
{
struct ifreq ifr;
+ struct sockaddr_in *addr;
int sk, err;
sk = socket(PF_INET, SOCK_DGRAM | SOCK_CLOEXEC, 0);
@@ -331,12 +332,17 @@ int connman_inet_ifdown(int index)
goto done;
}
+ addr = (struct sockaddr_in *)&ifr.ifr_addr;
+ addr->sin_family = AF_INET;
+ if (ioctl(sk, SIOCSIFADDR, &ifr) < 0)
+ connman_warn("Could not clear IPv4 address index %d", index);
+
if (!(ifr.ifr_flags & IFF_UP)) {
err = -EALREADY;
goto done;
}
- ifr.ifr_flags &= ~IFF_UP;
+ ifr.ifr_flags = (ifr.ifr_flags & ~IFF_UP) | IFF_DYNAMIC;
if (ioctl(sk, SIOCSIFFLAGS, &ifr) < 0)
err = -errno;