Merge "Stop depending on libnl."
This commit is contained in:
commit
445674ab7c
3 changed files with 44 additions and 11 deletions
|
|
@ -23,7 +23,6 @@ cc_library_shared {
|
||||||
"libbase",
|
"libbase",
|
||||||
"libcutils",
|
"libcutils",
|
||||||
"liblog",
|
"liblog",
|
||||||
"libnl",
|
|
||||||
],
|
],
|
||||||
|
|
||||||
export_include_dirs: ["include"],
|
export_include_dirs: ["include"],
|
||||||
|
|
|
||||||
|
|
@ -64,6 +64,7 @@ public:
|
||||||
bool parseNfPacketMessage(struct nlmsghdr *nh);
|
bool parseNfPacketMessage(struct nlmsghdr *nh);
|
||||||
bool parseRtMessage(const struct nlmsghdr *nh);
|
bool parseRtMessage(const struct nlmsghdr *nh);
|
||||||
bool parseNdUserOptMessage(const struct nlmsghdr *nh);
|
bool parseNdUserOptMessage(const struct nlmsghdr *nh);
|
||||||
|
struct nlattr* findNlAttr(const nlmsghdr* nl, size_t hdrlen, uint16_t attr);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -17,6 +17,8 @@
|
||||||
#define LOG_TAG "NetlinkEvent"
|
#define LOG_TAG "NetlinkEvent"
|
||||||
|
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#include <linux/genetlink.h>
|
||||||
#include <linux/if.h>
|
#include <linux/if.h>
|
||||||
#include <linux/if_addr.h>
|
#include <linux/if_addr.h>
|
||||||
#include <linux/if_link.h>
|
#include <linux/if_link.h>
|
||||||
|
|
@ -26,12 +28,8 @@
|
||||||
#include <linux/netlink.h>
|
#include <linux/netlink.h>
|
||||||
#include <linux/rtnetlink.h>
|
#include <linux/rtnetlink.h>
|
||||||
#include <net/if.h>
|
#include <net/if.h>
|
||||||
#include <netinet/in.h>
|
|
||||||
#include <netinet/icmp6.h>
|
#include <netinet/icmp6.h>
|
||||||
#include <netlink/attr.h>
|
#include <netinet/in.h>
|
||||||
#include <netlink/genl/genl.h>
|
|
||||||
#include <netlink/handlers.h>
|
|
||||||
#include <netlink/msg.h>
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
|
|
@ -263,6 +261,18 @@ bool NetlinkEvent::parseUlogPacketMessage(const struct nlmsghdr *nh) {
|
||||||
return true;
|
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.
|
* Parse a LOCAL_NFLOG_PACKET message.
|
||||||
*/
|
*/
|
||||||
|
|
@ -271,17 +281,17 @@ bool NetlinkEvent::parseNfPacketMessage(struct nlmsghdr *nh) {
|
||||||
int len = 0;
|
int len = 0;
|
||||||
char* raw = NULL;
|
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) {
|
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) {
|
if (payload) {
|
||||||
/* First 256 bytes is plenty */
|
/* First 256 bytes is plenty */
|
||||||
len = nla_len(payload);
|
len = nlAttrLen(payload);
|
||||||
if (len > 256) len = 256;
|
if (len > 256) len = 256;
|
||||||
raw = (char*) nla_data(payload);
|
raw = (char*)nlAttrData(payload);
|
||||||
}
|
}
|
||||||
|
|
||||||
char* hex = (char*) calloc(1, 5 + (len * 2));
|
char* hex = (char*) calloc(1, 5 + (len * 2));
|
||||||
|
|
@ -646,3 +656,26 @@ const char *NetlinkEvent::findParam(const char *paramName) {
|
||||||
SLOGE("NetlinkEvent::FindParam(): Parameter '%s' not found", paramName);
|
SLOGE("NetlinkEvent::FindParam(): Parameter '%s' not found", paramName);
|
||||||
return NULL;
|
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…
Add table
Reference in a new issue