netd: NetlinkManager: add support receiving quota2 log messages
NetlinkManager, NetlinkHandler
. added support for netlink's NETLINK_NFLOG family used by the updated xt_quota2.
. it pushes the event all the wait to NetworkManagementService.java
"linit alert <alert_name> <iface_name>"
This needs:
- new kernel with quota2 changes that support logging via NETLINK's
NETLINK_NFLOG family.
- BandwidthController changes that setup the alerts.
- system core NetlinkEvent that recognizes the NFLOG messages.
- java land NetworkManagementService changes.
Change-Id: Id5b1026c6002803b5a1c0c7623cf7b1961de9802
diff --git a/NetlinkManager.cpp b/NetlinkManager.cpp
index 3e7a0a1..9af43b5 100644
--- a/NetlinkManager.cpp
+++ b/NetlinkManager.cpp
@@ -33,6 +33,8 @@
#include "NetlinkManager.h"
#include "NetlinkHandler.h"
+const int NetlinkManager::NFLOG_QUOTA_GROUP = 1;
+
NetlinkManager *NetlinkManager::sInstance = NULL;
NetlinkManager *NetlinkManager::Instance() {
@@ -48,7 +50,7 @@
NetlinkManager::~NetlinkManager() {
}
-NetlinkHandler *NetlinkManager::setupSocket(int *sock, int socketType,
+NetlinkHandler *NetlinkManager::setupSocket(int *sock, int netlinkFamily,
int groups, int format) {
struct sockaddr_nl nladdr;
@@ -60,7 +62,7 @@
nladdr.nl_pid = getpid();
nladdr.nl_groups = groups;
- if ((*sock = socket(PF_NETLINK, SOCK_DGRAM, socketType)) < 0) {
+ if ((*sock = socket(PF_NETLINK, SOCK_DGRAM, netlinkFamily)) < 0) {
LOGE("Unable to create netlink socket: %s", strerror(errno));
return NULL;
}
@@ -103,6 +105,12 @@
NetlinkListener::NETLINK_FORMAT_BINARY)) == NULL) {
return -1;
}
+
+ if ((mQuotaHandler = setupSocket(&mQuotaSock, NETLINK_NFLOG,
+ NFLOG_QUOTA_GROUP, NetlinkListener::NETLINK_FORMAT_BINARY)) == NULL) {
+ LOGE("Unable to open quota2 logging socket");
+ return -1;
+ }
return 0;
}
@@ -131,5 +139,16 @@
close(mRouteSock);
mRouteSock = -1;
+ if (mQuotaHandler->stop()) {
+ LOGE("Unable to stop quota NetlinkHandler: %s", strerror(errno));
+ status = -1;
+ }
+
+ delete mQuotaHandler;
+ mQuotaHandler = NULL;
+
+ close(mQuotaSock);
+ mQuotaSock = -1;
+
return status;
}