2009-05-07 02:14:21 +08:00
|
|
|
/*
|
|
|
|
* Copyright (C) 2008 The Android Open Source Project
|
|
|
|
*
|
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
* you may not use this file except in compliance with the License.
|
|
|
|
* You may obtain a copy of the License at
|
|
|
|
*
|
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
*
|
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
* See the License for the specific language governing permissions and
|
|
|
|
* limitations under the License.
|
|
|
|
*/
|
|
|
|
#ifndef _NETLINKEVENT_H
|
|
|
|
#define _NETLINKEVENT_H
|
|
|
|
|
2011-06-24 06:00:30 +08:00
|
|
|
#include <sysutils/NetlinkListener.h>
|
|
|
|
|
2009-05-07 02:14:21 +08:00
|
|
|
#define NL_PARAMS_MAX 32
|
|
|
|
|
|
|
|
class NetlinkEvent {
|
2015-03-14 04:27:33 +08:00
|
|
|
public:
|
|
|
|
enum class Action {
|
|
|
|
kUnknown = 0,
|
|
|
|
kAdd = 1,
|
|
|
|
kRemove = 2,
|
|
|
|
kChange = 3,
|
|
|
|
kLinkUp = 4,
|
|
|
|
kLinkDown = 5,
|
|
|
|
kAddressUpdated = 6,
|
|
|
|
kAddressRemoved = 7,
|
|
|
|
kRdnss = 8,
|
|
|
|
kRouteUpdated = 9,
|
|
|
|
kRouteRemoved = 10,
|
|
|
|
};
|
|
|
|
|
|
|
|
private:
|
2009-05-07 02:14:21 +08:00
|
|
|
int mSeq;
|
|
|
|
char *mPath;
|
2015-03-14 04:27:33 +08:00
|
|
|
Action mAction;
|
2009-05-07 02:14:21 +08:00
|
|
|
char *mSubsystem;
|
|
|
|
char *mParams[NL_PARAMS_MAX];
|
|
|
|
|
|
|
|
public:
|
|
|
|
NetlinkEvent();
|
|
|
|
virtual ~NetlinkEvent();
|
|
|
|
|
2011-06-24 06:00:30 +08:00
|
|
|
bool decode(char *buffer, int size, int format = NetlinkListener::NETLINK_FORMAT_ASCII);
|
2009-05-07 02:14:21 +08:00
|
|
|
const char *findParam(const char *paramName);
|
|
|
|
|
|
|
|
const char *getSubsystem() { return mSubsystem; }
|
2015-03-14 04:27:33 +08:00
|
|
|
Action getAction() { return mAction; }
|
2009-12-24 23:17:09 +08:00
|
|
|
|
|
|
|
void dump();
|
2011-06-24 05:55:28 +08:00
|
|
|
|
|
|
|
protected:
|
|
|
|
bool parseBinaryNetlinkMessage(char *buffer, int size);
|
|
|
|
bool parseAsciiNetlinkMessage(char *buffer, int size);
|
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
2014-06-19 12:16:04 +08:00
|
|
|
bool parseIfInfoMessage(const struct nlmsghdr *nh);
|
|
|
|
bool parseIfAddrMessage(const struct nlmsghdr *nh);
|
|
|
|
bool parseUlogPacketMessage(const struct nlmsghdr *nh);
|
2014-10-31 05:51:59 +08:00
|
|
|
bool parseNfPacketMessage(struct nlmsghdr *nh);
|
2014-06-11 16:37:12 +08:00
|
|
|
bool parseRtMessage(const struct nlmsghdr *nh);
|
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
2014-06-19 12:16:04 +08:00
|
|
|
bool parseNdUserOptMessage(const struct nlmsghdr *nh);
|
2009-05-07 02:14:21 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif
|