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-11-20 10:29:42 +0900
commit526b838c9d647e8767fac957c53133153c3cf909 (patch)
tree3607245eb76bcf88e31cb7b8414caa710aaba49d /libsysutils
parent96834569343f38dc006492fccdf6dad68521b005 (diff)
downloadsystem_core-526b838c9d647e8767fac957c53133153c3cf909.zip
system_core-526b838c9d647e8767fac957c53133153c3cf909.tar.gz
system_core-526b838c9d647e8767fac957c53133153c3cf909.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. [Cherry-pick of f34861346d5c207912075fba9874090e4c947869] 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;
}