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;
 }