summaryrefslogtreecommitdiffstats
path: root/include/sysutils/NetlinkEvent.h
diff options
context:
space:
mode:
authorLorenzo Colitti <lorenzo@google.com>2014-06-19 13:16:04 +0900
committerLorenzo Colitti <lorenzo@google.com>2014-06-21 10:54:43 +0900
commit9b34293566833ead1d7bac7518e5ccad0d92d61c (patch)
tree187484e4b26c2ed4675af0d8ece2d67650a50507 /include/sysutils/NetlinkEvent.h
parentbb8aec417531010eadc27bdfed0c19fc5f669fbc (diff)
downloadsystem_core-9b34293566833ead1d7bac7518e5ccad0d92d61c.zip
system_core-9b34293566833ead1d7bac7518e5ccad0d92d61c.tar.gz
system_core-9b34293566833ead1d7bac7518e5ccad0d92d61c.tar.bz2
Improvements to netlink event parsing.
1. Accept that parseNetlinkMessage can only parse one netlink message, because its way of returning output is to modify its member variables (mAction, mParams, etc.). Currently, it loops through all the messages it finds, updating its member variables as it goes along, and always returns true at the end of the buffer. This has the following problems: 1. Since the function always returns true even when no messages were parsed, the caller has no way to know if parsing succeeded, and we get lots of "No subsystem found in netlink event" logs if the buffer did not contain any valid messages we were interested in. 2. If there are multiple messages in the buffer, all but the last message will be silently ignored. 3. If there are multiple messages and previous messages have more parameters than the last one, the resulting event will have a mixture of parameters from multiple messages. Instead of doing all this, change the contract to "parse the first valid message of interest in the buffer and return true, or return false if there were no such messages", and update the code and the comments accordingly. 2. Modify the caller (NetlinkListener) so it doesn't log an error when parseBinaryNetlinkMessage returns false, because this can now simply mean that we weren't interested in that particular message. parseBinaryNetlinkMessage already logs more informative errors. 3. Provide utility functions to check received message lengths and to convert message types to message names. 4. Simplify logging duplicate attributes. 5. Use the appropriate IFLA_xxx macros instead of rolling our own code to parse link state messages. 6. Move all the parsing code out to per-message-type parsing functions to order to simplify parseBinaryNetlinkMessage. Bug: 9180552 Change-Id: I6bbc2f7a104f618674dde2369c1fd5e93ea49430
Diffstat (limited to 'include/sysutils/NetlinkEvent.h')
-rw-r--r--include/sysutils/NetlinkEvent.h6
1 files changed, 4 insertions, 2 deletions
diff --git a/include/sysutils/NetlinkEvent.h b/include/sysutils/NetlinkEvent.h
index c0a9418..a247a74 100644
--- a/include/sysutils/NetlinkEvent.h
+++ b/include/sysutils/NetlinkEvent.h
@@ -52,8 +52,10 @@ public:
protected:
bool parseBinaryNetlinkMessage(char *buffer, int size);
bool parseAsciiNetlinkMessage(char *buffer, int size);
- bool parseIfAddrMessage(int type, struct ifaddrmsg *ifaddr, int rtasize);
- bool parseNdUserOptMessage(struct nduseroptmsg *msg, int optsize);
+ bool parseIfInfoMessage(const struct nlmsghdr *nh);
+ bool parseIfAddrMessage(const struct nlmsghdr *nh);
+ bool parseUlogPacketMessage(const struct nlmsghdr *nh);
+ bool parseNdUserOptMessage(const struct nlmsghdr *nh);
};
#endif