summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJP Abgrall <jpa@google.com>2011-07-25 10:15:46 -0700
committerAndroid (Google) Code Review <android-gerrit@google.com>2011-07-25 10:15:46 -0700
commited4401d0ff90fbb9e43e506ef768439d1f81cae2 (patch)
treee20cc67495f36367e947ba7d733ccfe9dbd8ee99
parent000aaef4483752c988ea236938e4c8e45b547f22 (diff)
parente0ebc46c0aa38ce4f35bd3b60c0fcb9204d4c35e (diff)
downloadnetd-ed4401d0ff90fbb9e43e506ef768439d1f81cae2.tar.gz
Merge "netd: NetlinkManager: add support receiving quota2 log messages"
-rw-r--r--NetlinkHandler.cpp13
-rw-r--r--NetlinkHandler.h1
-rw-r--r--NetlinkManager.cpp23
-rw-r--r--NetlinkManager.h8
-rw-r--r--ResponseCode.h1
5 files changed, 43 insertions, 3 deletions
diff --git a/NetlinkHandler.cpp b/NetlinkHandler.cpp
index 874e03fb..8331ae0d 100644
--- a/NetlinkHandler.cpp
+++ b/NetlinkHandler.cpp
@@ -68,7 +68,12 @@ void NetlinkHandler::onEvent(NetlinkEvent *evt) {
} else if (action == evt->NlActionLinkDown) {
notifyInterfaceLinkChanged(iface, false);
}
+ } else if (!strcmp(subsys, "qlog")) {
+ const char *alertName = evt->findParam("ALERT_NAME");
+ const char *iface = evt->findParam("INTERFACE");
+ notifyQuotaLimitReached(alertName, iface);
}
+
}
void NetlinkHandler::notifyInterfaceAdded(const char *name) {
@@ -104,3 +109,11 @@ void NetlinkHandler::notifyInterfaceLinkChanged(const char *name, bool isUp) {
mNm->getBroadcaster()->sendBroadcast(ResponseCode::InterfaceChange,
msg, false);
}
+
+void NetlinkHandler::notifyQuotaLimitReached(const char *name, const char *iface) {
+ char msg[255];
+ snprintf(msg, sizeof(msg), "limit alert %s %s", name, iface);
+
+ mNm->getBroadcaster()->sendBroadcast(ResponseCode::BandwidthControl,
+ msg, false);
+}
diff --git a/NetlinkHandler.h b/NetlinkHandler.h
index 492d6b19..9466ca6c 100644
--- a/NetlinkHandler.h
+++ b/NetlinkHandler.h
@@ -37,5 +37,6 @@ protected:
void notifyInterfaceRemoved(const char *name);
void notifyInterfaceChanged(const char *name, bool isUp);
void notifyInterfaceLinkChanged(const char *name, bool isUp);
+ void notifyQuotaLimitReached(const char *name, const char *iface);
};
#endif
diff --git a/NetlinkManager.cpp b/NetlinkManager.cpp
index 3e7a0a12..9af43b5e 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() {
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 @@ NetlinkHandler *NetlinkManager::setupSocket(int *sock, int socketType,
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 @@ int NetlinkManager::start() {
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 @@ int NetlinkManager::stop() {
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;
}
diff --git a/NetlinkManager.h b/NetlinkManager.h
index ff646f48..c8f55070 100644
--- a/NetlinkManager.h
+++ b/NetlinkManager.h
@@ -20,6 +20,7 @@
#include <sysutils/SocketListener.h>
#include <sysutils/NetlinkListener.h>
+
class NetlinkHandler;
class NetlinkManager {
@@ -30,8 +31,10 @@ private:
SocketListener *mBroadcaster;
NetlinkHandler *mUeventHandler;
NetlinkHandler *mRouteHandler;
+ NetlinkHandler *mQuotaHandler;
int mUeventSock;
int mRouteSock;
+ int mQuotaSock;
public:
virtual ~NetlinkManager();
@@ -44,9 +47,12 @@ public:
static NetlinkManager *Instance();
+ /* This is the nflog group arg that the xt_quota2 neftiler will use. */
+ static const int NFLOG_QUOTA_GROUP;
+
private:
NetlinkManager();
- NetlinkHandler* setupSocket(int *sock, int socketType, int groups,
+ NetlinkHandler* setupSocket(int *sock, int netlinkFamily, int groups,
int format);
};
#endif
diff --git a/ResponseCode.h b/ResponseCode.h
index be60eda5..9d0ccb59 100644
--- a/ResponseCode.h
+++ b/ResponseCode.h
@@ -55,5 +55,6 @@ public:
// 600 series - Unsolicited broadcasts
static const int InterfaceChange = 600;
+ static const int BandwidthControl = 601;
};
#endif