Loading libsysutils/Android.bp +0 −1 Original line number Diff line number Diff line Loading @@ -23,7 +23,6 @@ cc_library_shared { "libbase", "libcutils", "liblog", "libnl", ], export_include_dirs: ["include"], Loading libsysutils/include/sysutils/NetlinkEvent.h +1 −0 Original line number Diff line number Diff line Loading @@ -64,6 +64,7 @@ public: bool parseNfPacketMessage(struct nlmsghdr *nh); bool parseRtMessage(const struct nlmsghdr *nh); bool parseNdUserOptMessage(const struct nlmsghdr *nh); struct nlattr* findNlAttr(const nlmsghdr* nl, size_t hdrlen, uint16_t attr); }; #endif libsysutils/src/NetlinkEvent.cpp +43 −10 Original line number Diff line number Diff line Loading @@ -17,6 +17,8 @@ #define LOG_TAG "NetlinkEvent" #include <arpa/inet.h> #include <limits.h> #include <linux/genetlink.h> #include <linux/if.h> #include <linux/if_addr.h> #include <linux/if_link.h> Loading @@ -26,12 +28,8 @@ #include <linux/netlink.h> #include <linux/rtnetlink.h> #include <net/if.h> #include <netinet/in.h> #include <netinet/icmp6.h> #include <netlink/attr.h> #include <netlink/genl/genl.h> #include <netlink/handlers.h> #include <netlink/msg.h> #include <netinet/in.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> Loading Loading @@ -263,6 +261,18 @@ bool NetlinkEvent::parseUlogPacketMessage(const struct nlmsghdr *nh) { return true; } static size_t nlAttrLen(const nlattr* nla) { return nla->nla_len - NLA_HDRLEN; } static const uint8_t* nlAttrData(const nlattr* nla) { return reinterpret_cast<const uint8_t*>(nla) + NLA_HDRLEN; } static uint32_t nlAttrU32(const nlattr* nla) { return *reinterpret_cast<const uint32_t*>(nlAttrData(nla)); } /* * Parse a LOCAL_NFLOG_PACKET message. */ Loading @@ -271,17 +281,17 @@ bool NetlinkEvent::parseNfPacketMessage(struct nlmsghdr *nh) { int len = 0; char* raw = NULL; struct nlattr *uid_attr = nlmsg_find_attr(nh, sizeof(struct genlmsghdr), NFULA_UID); struct nlattr* uid_attr = findNlAttr(nh, sizeof(struct genlmsghdr), NFULA_UID); if (uid_attr) { uid = ntohl(nla_get_u32(uid_attr)); uid = ntohl(nlAttrU32(uid_attr)); } struct nlattr *payload = nlmsg_find_attr(nh, sizeof(struct genlmsghdr), NFULA_PAYLOAD); struct nlattr* payload = findNlAttr(nh, sizeof(struct genlmsghdr), NFULA_PAYLOAD); if (payload) { /* First 256 bytes is plenty */ len = nla_len(payload); len = nlAttrLen(payload); if (len > 256) len = 256; raw = (char*) nla_data(payload); raw = (char*)nlAttrData(payload); } char* hex = (char*) calloc(1, 5 + (len * 2)); Loading Loading @@ -646,3 +656,26 @@ const char *NetlinkEvent::findParam(const char *paramName) { SLOGE("NetlinkEvent::FindParam(): Parameter '%s' not found", paramName); return NULL; } nlattr* NetlinkEvent::findNlAttr(const nlmsghdr* nh, size_t hdrlen, uint16_t attr) { if (nh == nullptr || NLMSG_HDRLEN + NLMSG_ALIGN(hdrlen) > SSIZE_MAX) { return nullptr; } // Skip header, padding, and family header. const ssize_t NLA_START = NLMSG_HDRLEN + NLMSG_ALIGN(hdrlen); ssize_t left = nh->nlmsg_len - NLA_START; uint8_t* hdr = ((uint8_t*)nh) + NLA_START; while (left >= NLA_HDRLEN) { nlattr* nla = (nlattr*)hdr; if (nla->nla_type == attr) { return nla; } hdr += NLA_ALIGN(nla->nla_len); left -= NLA_ALIGN(nla->nla_len); } return nullptr; } Loading
libsysutils/Android.bp +0 −1 Original line number Diff line number Diff line Loading @@ -23,7 +23,6 @@ cc_library_shared { "libbase", "libcutils", "liblog", "libnl", ], export_include_dirs: ["include"], Loading
libsysutils/include/sysutils/NetlinkEvent.h +1 −0 Original line number Diff line number Diff line Loading @@ -64,6 +64,7 @@ public: bool parseNfPacketMessage(struct nlmsghdr *nh); bool parseRtMessage(const struct nlmsghdr *nh); bool parseNdUserOptMessage(const struct nlmsghdr *nh); struct nlattr* findNlAttr(const nlmsghdr* nl, size_t hdrlen, uint16_t attr); }; #endif
libsysutils/src/NetlinkEvent.cpp +43 −10 Original line number Diff line number Diff line Loading @@ -17,6 +17,8 @@ #define LOG_TAG "NetlinkEvent" #include <arpa/inet.h> #include <limits.h> #include <linux/genetlink.h> #include <linux/if.h> #include <linux/if_addr.h> #include <linux/if_link.h> Loading @@ -26,12 +28,8 @@ #include <linux/netlink.h> #include <linux/rtnetlink.h> #include <net/if.h> #include <netinet/in.h> #include <netinet/icmp6.h> #include <netlink/attr.h> #include <netlink/genl/genl.h> #include <netlink/handlers.h> #include <netlink/msg.h> #include <netinet/in.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> Loading Loading @@ -263,6 +261,18 @@ bool NetlinkEvent::parseUlogPacketMessage(const struct nlmsghdr *nh) { return true; } static size_t nlAttrLen(const nlattr* nla) { return nla->nla_len - NLA_HDRLEN; } static const uint8_t* nlAttrData(const nlattr* nla) { return reinterpret_cast<const uint8_t*>(nla) + NLA_HDRLEN; } static uint32_t nlAttrU32(const nlattr* nla) { return *reinterpret_cast<const uint32_t*>(nlAttrData(nla)); } /* * Parse a LOCAL_NFLOG_PACKET message. */ Loading @@ -271,17 +281,17 @@ bool NetlinkEvent::parseNfPacketMessage(struct nlmsghdr *nh) { int len = 0; char* raw = NULL; struct nlattr *uid_attr = nlmsg_find_attr(nh, sizeof(struct genlmsghdr), NFULA_UID); struct nlattr* uid_attr = findNlAttr(nh, sizeof(struct genlmsghdr), NFULA_UID); if (uid_attr) { uid = ntohl(nla_get_u32(uid_attr)); uid = ntohl(nlAttrU32(uid_attr)); } struct nlattr *payload = nlmsg_find_attr(nh, sizeof(struct genlmsghdr), NFULA_PAYLOAD); struct nlattr* payload = findNlAttr(nh, sizeof(struct genlmsghdr), NFULA_PAYLOAD); if (payload) { /* First 256 bytes is plenty */ len = nla_len(payload); len = nlAttrLen(payload); if (len > 256) len = 256; raw = (char*) nla_data(payload); raw = (char*)nlAttrData(payload); } char* hex = (char*) calloc(1, 5 + (len * 2)); Loading Loading @@ -646,3 +656,26 @@ const char *NetlinkEvent::findParam(const char *paramName) { SLOGE("NetlinkEvent::FindParam(): Parameter '%s' not found", paramName); return NULL; } nlattr* NetlinkEvent::findNlAttr(const nlmsghdr* nh, size_t hdrlen, uint16_t attr) { if (nh == nullptr || NLMSG_HDRLEN + NLMSG_ALIGN(hdrlen) > SSIZE_MAX) { return nullptr; } // Skip header, padding, and family header. const ssize_t NLA_START = NLMSG_HDRLEN + NLMSG_ALIGN(hdrlen); ssize_t left = nh->nlmsg_len - NLA_START; uint8_t* hdr = ((uint8_t*)nh) + NLA_START; while (left >= NLA_HDRLEN) { nlattr* nla = (nlattr*)hdr; if (nla->nla_type == attr) { return nla; } hdr += NLA_ALIGN(nla->nla_len); left -= NLA_ALIGN(nla->nla_len); } return nullptr; }