summaryrefslogtreecommitdiffstats
path: root/libsysutils
diff options
context:
space:
mode:
authorLorenzo Colitti <lorenzo@google.com>2013-09-03 00:25:14 +0900
committerLorenzo Colitti <lorenzo@google.com>2013-09-03 00:25:14 +0900
commitf34861346d5c207912075fba9874090e4c947869 (patch)
tree83cc2d05800af825a00c7eda6c2c7a83b6d9ab01 /libsysutils
parent5835ac9e31aea910adb6b9d2de1d63df771df45b (diff)
downloadsystem_core-f34861346d5c207912075fba9874090e4c947869.zip
system_core-f34861346d5c207912075fba9874090e4c947869.tar.gz
system_core-f34861346d5c207912075fba9874090e4c947869.tar.bz2
Switch back to subsystem "net" for netlink events.
The change to enable address tracking via netlink incorrectly changed the subsystem of rtnetlink events from "net" to "interface". This broke interface add/delete notifications, which come from the kernel with subsystem "net". Switch back to "net" and deal with address tracking via new action codes instead of a new subsystem. Bug: 10433320 Change-Id: Ibf30efb426949dfd02304cc1d9adb1c005a539a6
Diffstat (limited to 'libsysutils')
-rw-r--r--libsysutils/src/NetlinkEvent.cpp11
1 files changed, 7 insertions, 4 deletions
diff --git a/libsysutils/src/NetlinkEvent.cpp b/libsysutils/src/NetlinkEvent.cpp
index 01bec77..aae2ae7 100644
--- a/libsysutils/src/NetlinkEvent.cpp
+++ b/libsysutils/src/NetlinkEvent.cpp
@@ -42,6 +42,8 @@ const int NetlinkEvent::NlActionRemove = 2;
const int NetlinkEvent::NlActionChange = 3;
const int NetlinkEvent::NlActionLinkUp = 4;
const int NetlinkEvent::NlActionLinkDown = 5;
+const int NetlinkEvent::NlActionAddressUpdated = 6;
+const int NetlinkEvent::NlActionAddressRemoved = 7;
NetlinkEvent::NetlinkEvent() {
mAction = NlActionUnknown;
@@ -131,11 +133,12 @@ bool NetlinkEvent::parseIfAddrMessage(int type, struct ifaddrmsg *ifaddr,
}
// Fill in interface information.
- mAction = (type == RTM_NEWADDR) ? NlActionAdd : NlActionRemove;
- mSubsystem = strdup("address");
+ mAction = (type == RTM_NEWADDR) ? NlActionAddressUpdated :
+ NlActionAddressRemoved;
+ mSubsystem = strdup("net");
asprintf(&mParams[0], "ADDRESS=%s/%d", addrstr,
ifaddr->ifa_prefixlen);
- asprintf(&mParams[1], "IFACE=%s", ifname);
+ asprintf(&mParams[1], "INTERFACE=%s", ifname);
asprintf(&mParams[2], "FLAGS=%u", ifaddr->ifa_flags);
asprintf(&mParams[3], "SCOPE=%u", ifaddr->ifa_scope);
} else if (rta->rta_type == IFA_CACHEINFO) {
@@ -205,7 +208,7 @@ bool NetlinkEvent::parseBinaryNetlinkMessage(char *buffer, int size) {
mParams[0] = strdup(buffer);
mAction = (ifi->ifi_flags & IFF_LOWER_UP) ?
NlActionLinkUp : NlActionLinkDown;
- mSubsystem = strdup("interface");
+ mSubsystem = strdup("net");
break;
}