diff options
author | JP Abgrall <jpa@google.com> | 2011-07-25 10:15:46 -0700 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2011-07-25 10:15:46 -0700 |
commit | ed4401d0ff90fbb9e43e506ef768439d1f81cae2 (patch) | |
tree | e20cc67495f36367e947ba7d733ccfe9dbd8ee99 | |
parent | 000aaef4483752c988ea236938e4c8e45b547f22 (diff) | |
parent | e0ebc46c0aa38ce4f35bd3b60c0fcb9204d4c35e (diff) | |
download | netd-ed4401d0ff90fbb9e43e506ef768439d1f81cae2.tar.gz |
Merge "netd: NetlinkManager: add support receiving quota2 log messages"
-rw-r--r-- | NetlinkHandler.cpp | 13 | ||||
-rw-r--r-- | NetlinkHandler.h | 1 | ||||
-rw-r--r-- | NetlinkManager.cpp | 23 | ||||
-rw-r--r-- | NetlinkManager.h | 8 | ||||
-rw-r--r-- | ResponseCode.h | 1 |
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 |