diff options
author | Patrik Flykt <patrik.flykt@linux.intel.com> | 2012-08-16 12:21:34 +0300 |
---|---|---|
committer | Patrik Flykt <patrik.flykt@linux.intel.com> | 2012-08-17 16:13:13 +0300 |
commit | 9b0851196880a79fbcca76616c27bb9d16ba94c7 (patch) | |
tree | ddcead0cc16a12b9f98b005fdc4f9f9c3b231b9c /src | |
parent | 4d33afaed53d7ca3fcc7522be526a09a5bef3a0a (diff) | |
download | connman-9b0851196880a79fbcca76616c27bb9d16ba94c7.tar.gz connman-9b0851196880a79fbcca76616c27bb9d16ba94c7.tar.bz2 connman-9b0851196880a79fbcca76616c27bb9d16ba94c7.zip |
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')
-rw-r--r-- | src/inet.c | 10 |
1 files changed, 8 insertions, 2 deletions
@@ -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; |