Loading include/sysutils/NetlinkEvent.h +1 −7 Original line number Diff line number Diff line Loading @@ -30,23 +30,17 @@ public: const static int NlActionAdd; const static int NlActionRemove; const static int NlActionChange; const static int NlActionLinkDown; const static int NlActionLinkUp; NetlinkEvent(); virtual ~NetlinkEvent(); bool decode(char *buffer, int size, int format); bool decode(char *buffer, int size); const char *findParam(const char *paramName); const char *getSubsystem() { return mSubsystem; } int getAction() { return mAction; } void dump(); protected: bool parseBinaryNetlinkMessage(char *buffer, int size); bool parseAsciiNetlinkMessage(char *buffer, int size); }; #endif include/sysutils/NetlinkListener.h +1 −5 Original line number Diff line number Diff line Loading @@ -22,13 +22,9 @@ class NetlinkEvent; class NetlinkListener : public SocketListener { char mBuffer[64 * 1024]; int mFormat; public: static const int NETLINK_FORMAT_ASCII = 0; static const int NETLINK_FORMAT_BINARY = 1; NetlinkListener(int socket, int format); NetlinkListener(int socket); virtual ~NetlinkListener() {} protected: Loading libsysutils/src/NetlinkEvent.cpp +1 −66 Original line number Diff line number Diff line Loading @@ -19,20 +19,12 @@ #define LOG_TAG "NetlinkEvent" #include <cutils/log.h> #include <sysutils/NetlinkListener.h> #include <sysutils/NetlinkEvent.h> #include <sys/types.h> #include <sys/socket.h> #include <linux/rtnetlink.h> #include <linux/if.h> const int NetlinkEvent::NlActionUnknown = 0; const int NetlinkEvent::NlActionAdd = 1; const int NetlinkEvent::NlActionRemove = 2; const int NetlinkEvent::NlActionChange = 3; const int NetlinkEvent::NlActionLinkUp = 4; const int NetlinkEvent::NlActionLinkDown = 5; NetlinkEvent::NetlinkEvent() { mAction = NlActionUnknown; Loading Loading @@ -64,56 +56,7 @@ void NetlinkEvent::dump() { } } /* * Parse an binary message from a NETLINK_ROUTE netlink socket. */ bool NetlinkEvent::parseBinaryNetlinkMessage(char *buffer, int size) { size_t sz = size; struct nlmsghdr *nh = (struct nlmsghdr *) buffer; while (NLMSG_OK(nh, sz) && (nh->nlmsg_type != NLMSG_DONE)) { if (nh->nlmsg_type == RTM_NEWLINK) { int len = nh->nlmsg_len - sizeof(*nh); struct ifinfomsg *ifi; if (sizeof(*ifi) <= (size_t) len) { ifi = (ifinfomsg *)NLMSG_DATA(nh); if ((ifi->ifi_flags & IFF_LOOPBACK) == 0) { struct rtattr *rta = (struct rtattr *) ((char *) ifi + NLMSG_ALIGN(sizeof(*ifi))); len = NLMSG_PAYLOAD(nh, sizeof(*ifi)); while(RTA_OK(rta, len)) { switch(rta->rta_type) { case IFLA_IFNAME: char buffer[16 + IFNAMSIZ]; snprintf(buffer, sizeof(buffer), "INTERFACE=%s", (char *) RTA_DATA(rta)); mParams[0] = strdup(buffer); mAction = (ifi->ifi_flags & IFF_LOWER_UP) ? NlActionLinkUp : NlActionLinkDown; mSubsystem = strdup("net"); break; } rta = RTA_NEXT(rta, len); } } } } nh = NLMSG_NEXT(nh, size); } return true; } /* * Parse an ASCII-formatted message from a NETLINK_KOBJECT_UEVENT * netlink socket. */ bool NetlinkEvent::parseAsciiNetlinkMessage(char *buffer, int size) { bool NetlinkEvent::decode(char *buffer, int size) { char *s = buffer; char *end; int param_idx = 0; Loading Loading @@ -149,14 +92,6 @@ bool NetlinkEvent::parseAsciiNetlinkMessage(char *buffer, int size) { return true; } bool NetlinkEvent::decode(char *buffer, int size, int format) { if (format == NetlinkListener::NETLINK_FORMAT_BINARY) { return parseBinaryNetlinkMessage(buffer, size); } else { return parseAsciiNetlinkMessage(buffer, size); } } const char *NetlinkEvent::findParam(const char *paramName) { size_t len = strlen(paramName); for (int i = 0; mParams[i] && i < NL_PARAMS_MAX; ++i) { Loading libsysutils/src/NetlinkListener.cpp +5 −7 Original line number Diff line number Diff line Loading @@ -25,9 +25,8 @@ #include <sysutils/NetlinkListener.h> #include <sysutils/NetlinkEvent.h> NetlinkListener::NetlinkListener(int socket, int format) : NetlinkListener::NetlinkListener(int socket) : SocketListener(socket, false) { mFormat = format; } bool NetlinkListener::onDataAvailable(SocketClient *cli) Loading @@ -41,14 +40,13 @@ bool NetlinkListener::onDataAvailable(SocketClient *cli) } NetlinkEvent *evt = new NetlinkEvent(); int err = evt->decode(mBuffer, count, mFormat); if (!err) { if (!evt->decode(mBuffer, count)) { SLOGE("Error decoding NetlinkEvent"); } else { onEvent(evt); goto out; } onEvent(evt); out: delete evt; return true; } Loading
include/sysutils/NetlinkEvent.h +1 −7 Original line number Diff line number Diff line Loading @@ -30,23 +30,17 @@ public: const static int NlActionAdd; const static int NlActionRemove; const static int NlActionChange; const static int NlActionLinkDown; const static int NlActionLinkUp; NetlinkEvent(); virtual ~NetlinkEvent(); bool decode(char *buffer, int size, int format); bool decode(char *buffer, int size); const char *findParam(const char *paramName); const char *getSubsystem() { return mSubsystem; } int getAction() { return mAction; } void dump(); protected: bool parseBinaryNetlinkMessage(char *buffer, int size); bool parseAsciiNetlinkMessage(char *buffer, int size); }; #endif
include/sysutils/NetlinkListener.h +1 −5 Original line number Diff line number Diff line Loading @@ -22,13 +22,9 @@ class NetlinkEvent; class NetlinkListener : public SocketListener { char mBuffer[64 * 1024]; int mFormat; public: static const int NETLINK_FORMAT_ASCII = 0; static const int NETLINK_FORMAT_BINARY = 1; NetlinkListener(int socket, int format); NetlinkListener(int socket); virtual ~NetlinkListener() {} protected: Loading
libsysutils/src/NetlinkEvent.cpp +1 −66 Original line number Diff line number Diff line Loading @@ -19,20 +19,12 @@ #define LOG_TAG "NetlinkEvent" #include <cutils/log.h> #include <sysutils/NetlinkListener.h> #include <sysutils/NetlinkEvent.h> #include <sys/types.h> #include <sys/socket.h> #include <linux/rtnetlink.h> #include <linux/if.h> const int NetlinkEvent::NlActionUnknown = 0; const int NetlinkEvent::NlActionAdd = 1; const int NetlinkEvent::NlActionRemove = 2; const int NetlinkEvent::NlActionChange = 3; const int NetlinkEvent::NlActionLinkUp = 4; const int NetlinkEvent::NlActionLinkDown = 5; NetlinkEvent::NetlinkEvent() { mAction = NlActionUnknown; Loading Loading @@ -64,56 +56,7 @@ void NetlinkEvent::dump() { } } /* * Parse an binary message from a NETLINK_ROUTE netlink socket. */ bool NetlinkEvent::parseBinaryNetlinkMessage(char *buffer, int size) { size_t sz = size; struct nlmsghdr *nh = (struct nlmsghdr *) buffer; while (NLMSG_OK(nh, sz) && (nh->nlmsg_type != NLMSG_DONE)) { if (nh->nlmsg_type == RTM_NEWLINK) { int len = nh->nlmsg_len - sizeof(*nh); struct ifinfomsg *ifi; if (sizeof(*ifi) <= (size_t) len) { ifi = (ifinfomsg *)NLMSG_DATA(nh); if ((ifi->ifi_flags & IFF_LOOPBACK) == 0) { struct rtattr *rta = (struct rtattr *) ((char *) ifi + NLMSG_ALIGN(sizeof(*ifi))); len = NLMSG_PAYLOAD(nh, sizeof(*ifi)); while(RTA_OK(rta, len)) { switch(rta->rta_type) { case IFLA_IFNAME: char buffer[16 + IFNAMSIZ]; snprintf(buffer, sizeof(buffer), "INTERFACE=%s", (char *) RTA_DATA(rta)); mParams[0] = strdup(buffer); mAction = (ifi->ifi_flags & IFF_LOWER_UP) ? NlActionLinkUp : NlActionLinkDown; mSubsystem = strdup("net"); break; } rta = RTA_NEXT(rta, len); } } } } nh = NLMSG_NEXT(nh, size); } return true; } /* * Parse an ASCII-formatted message from a NETLINK_KOBJECT_UEVENT * netlink socket. */ bool NetlinkEvent::parseAsciiNetlinkMessage(char *buffer, int size) { bool NetlinkEvent::decode(char *buffer, int size) { char *s = buffer; char *end; int param_idx = 0; Loading Loading @@ -149,14 +92,6 @@ bool NetlinkEvent::parseAsciiNetlinkMessage(char *buffer, int size) { return true; } bool NetlinkEvent::decode(char *buffer, int size, int format) { if (format == NetlinkListener::NETLINK_FORMAT_BINARY) { return parseBinaryNetlinkMessage(buffer, size); } else { return parseAsciiNetlinkMessage(buffer, size); } } const char *NetlinkEvent::findParam(const char *paramName) { size_t len = strlen(paramName); for (int i = 0; mParams[i] && i < NL_PARAMS_MAX; ++i) { Loading
libsysutils/src/NetlinkListener.cpp +5 −7 Original line number Diff line number Diff line Loading @@ -25,9 +25,8 @@ #include <sysutils/NetlinkListener.h> #include <sysutils/NetlinkEvent.h> NetlinkListener::NetlinkListener(int socket, int format) : NetlinkListener::NetlinkListener(int socket) : SocketListener(socket, false) { mFormat = format; } bool NetlinkListener::onDataAvailable(SocketClient *cli) Loading @@ -41,14 +40,13 @@ bool NetlinkListener::onDataAvailable(SocketClient *cli) } NetlinkEvent *evt = new NetlinkEvent(); int err = evt->decode(mBuffer, count, mFormat); if (!err) { if (!evt->decode(mBuffer, count)) { SLOGE("Error decoding NetlinkEvent"); } else { onEvent(evt); goto out; } onEvent(evt); out: delete evt; return true; }