Merge "Add a class lable parameter to idletimer."
diff --git a/CommandListener.cpp b/CommandListener.cpp
index 195b07e..f562df3 100644
--- a/CommandListener.cpp
+++ b/CommandListener.cpp
@@ -1230,11 +1230,12 @@
       return 0;
     }
     if (!strcmp(argv[1], "add")) {
-        if (argc != 4) {
+        if (argc != 5) {
             cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false);
             return 0;
         }
-        if(0 != sIdletimerCtrl->addInterfaceIdletimer(argv[2], atoi(argv[3]))) {
+        if(0 != sIdletimerCtrl->addInterfaceIdletimer(
+                                        argv[2], atoi(argv[3]), argv[4])) {
           cli->sendMsg(ResponseCode::OperationFailed, "Failed to add interface", false);
         } else {
           cli->sendMsg(ResponseCode::CommandOkay,  "Add success", false);
@@ -1242,12 +1243,13 @@
         return 0;
     }
     if (!strcmp(argv[1], "remove")) {
-        if (argc != 4) {
+        if (argc != 5) {
             cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false);
             return 0;
         }
         // ashish: fixme timeout
-        if (0 != sIdletimerCtrl->removeInterfaceIdletimer(argv[2], atoi(argv[3]))) {
+        if (0 != sIdletimerCtrl->removeInterfaceIdletimer(
+                                        argv[2], atoi(argv[3]), argv[4])) {
           cli->sendMsg(ResponseCode::OperationFailed, "Failed to remove interface", false);
         } else {
           cli->sendMsg(ResponseCode::CommandOkay, "Remove success", false);
diff --git a/IdletimerController.cpp b/IdletimerController.cpp
index efe4f09..2bcb9b7 100644
--- a/IdletimerController.cpp
+++ b/IdletimerController.cpp
@@ -51,8 +51,8 @@
  * ndc command sequence
  * ------------------
  * ndc idletimer enable
- * ndc idletimer add <iface> <timeout>
- * ndc idletimer remove <iface> <timeout>
+ * ndc idletimer add <iface> <timeout> <class label>
+ * ndc idletimer remove <iface> <timeout> <class label>
  *
  * Monitor effect on the iptables chains after each step using:
  *     iptables -nxvL -t nat
@@ -148,28 +148,33 @@
 }
 
 int IdletimerController::modifyInterfaceIdletimer(IptOp op, const char *iface,
-                                                  uint32_t timeout) {
+                                                  uint32_t timeout,
+                                                  const char *classLabel) {
   int res;
   char *buffer;
   asprintf(&buffer, "-t nat -%c idletimer_nat_PREROUTING -i %s -j IDLETIMER"
            " --timeout %u --label %s --send_nl_msg 1",
-           (op == IptOpAdd) ? 'A' : 'D', iface, timeout, iface);
+           (op == IptOpAdd) ? 'A' : 'D', iface, timeout, classLabel);
   res = runIpxtablesCmd(buffer);
   free(buffer);
 
   asprintf(&buffer, "-t nat -%c idletimer_nat_POSTROUTING -o %s -j IDLETIMER"
            " --timeout %u --label %s --send_nl_msg 1",
-           (op == IptOpAdd) ? 'A' : 'D', iface, timeout, iface);
+           (op == IptOpAdd) ? 'A' : 'D', iface, timeout, classLabel);
   res |= runIpxtablesCmd(buffer);
   free(buffer);
 
   return res;
 }
 
-int IdletimerController::addInterfaceIdletimer(const char *iface, uint32_t timeout) {
-  return modifyInterfaceIdletimer(IptOpAdd, iface, timeout);
+int IdletimerController::addInterfaceIdletimer(const char *iface,
+                                               uint32_t timeout,
+                                               const char *classLabel) {
+  return modifyInterfaceIdletimer(IptOpAdd, iface, timeout, classLabel);
 }
 
-int IdletimerController::removeInterfaceIdletimer(const char *iface, uint32_t timeout) {
-  return modifyInterfaceIdletimer(IptOpDelete, iface, timeout);
+int IdletimerController::removeInterfaceIdletimer(const char *iface,
+                                                  uint32_t timeout,
+                                                  const char *classLabel) {
+  return modifyInterfaceIdletimer(IptOpDelete, iface, timeout, classLabel);
 }
diff --git a/IdletimerController.h b/IdletimerController.h
index a55f7af..6167b48 100644
--- a/IdletimerController.h
+++ b/IdletimerController.h
@@ -24,15 +24,18 @@
 
     int enableIdletimerControl();
     int disableIdletimerControl();
-    int addInterfaceIdletimer(const char *iface, uint32_t timeout);
-    int removeInterfaceIdletimer(const char *iface, uint32_t timeout);
+    int addInterfaceIdletimer(const char *iface, uint32_t timeout,
+                              const char *classLabel);
+    int removeInterfaceIdletimer(const char *iface, uint32_t timeout,
+                                 const char *classLabel);
     bool setupIptablesHooks();
 
  private:
     enum IptOp { IptOpAdd, IptOpDelete };
     int setDefaults();
     int runIpxtablesCmd(const char *cmd);
-    int modifyInterfaceIdletimer(IptOp op, const char *iface, uint32_t timeout);
+    int modifyInterfaceIdletimer(IptOp op, const char *iface, uint32_t timeout,
+                                 const char *classLabel);
 };
 
 #endif
diff --git a/NetlinkHandler.cpp b/NetlinkHandler.cpp
index 94e9240..47f9496 100644
--- a/NetlinkHandler.cpp
+++ b/NetlinkHandler.cpp
@@ -76,10 +76,14 @@
 
     } else if (!strcmp(subsys, "xt_idletimer")) {
         int action = evt->getAction();
-        const char *iface = evt->findParam("INTERFACE");
+        const char *label = evt->findParam("LABEL");
         const char *state = evt->findParam("STATE");
+        // if no LABEL, use INTERFACE instead
+        if (label == NULL) {
+            label = evt->findParam("INTERFACE");
+        }
         if (state)
-            notifyInterfaceActivity(iface, !strcmp("active", state));
+            notifyInterfaceClassActivity(label, !strcmp("active", state));
 
 #if !LOG_NDEBUG
     } else if (strcmp(subsys, "platform") && strcmp(subsys, "backlight")) {
@@ -131,12 +135,15 @@
             msg, false);
 }
 
-void NetlinkHandler::notifyInterfaceActivity(const char *name, bool isActive) {
+void NetlinkHandler::notifyInterfaceClassActivity(const char *name,
+                                                  bool isActive) {
     char msg[255];
 
-    snprintf(msg, sizeof(msg), "Iface %s %s", name, isActive ? "active" : "idle");
+    snprintf(msg, sizeof(msg), "Iface %s %s", name, 
+             isActive ? "active" : "idle");
     ALOGV("Broadcasting interface activity msg: %s", msg);
-    mNm->getBroadcaster()->sendBroadcast(isActive ? ResponseCode::InterfaceActive
-            : ResponseCode::InterfaceIdle,
+    mNm->getBroadcaster()->sendBroadcast(
+            isActive ? ResponseCode::InterfaceClassActive
+                     : ResponseCode::InterfaceClassIdle,
             msg, false);
 }
diff --git a/NetlinkHandler.h b/NetlinkHandler.h
index fe82934..50bface 100644
--- a/NetlinkHandler.h
+++ b/NetlinkHandler.h
@@ -38,6 +38,6 @@
     void notifyInterfaceChanged(const char *name, bool isUp);
     void notifyInterfaceLinkChanged(const char *name, bool isUp);
     void notifyQuotaLimitReached(const char *name, const char *iface);
-    void notifyInterfaceActivity(const char *name, bool isActive);
+    void notifyInterfaceClassActivity(const char *name, bool isActive);
 };
 #endif
diff --git a/NetlinkManager.h b/NetlinkManager.h
index 6515ea4..b7f011e 100644
--- a/NetlinkManager.h
+++ b/NetlinkManager.h
@@ -36,7 +36,6 @@
     int                  mUeventSock;
     int                  mRouteSock;
     int                  mQuotaSock;
-    int                  mIfaceIdleTimerSock;
 
 public:
     virtual ~NetlinkManager();
diff --git a/ResponseCode.h b/ResponseCode.h
index 5bebb0f..8ae3d91 100644
--- a/ResponseCode.h
+++ b/ResponseCode.h
@@ -72,7 +72,7 @@
     static const int ServiceSetHostnameSuccess      = 610;
     static const int ServiceGetAddrInfoFailed       = 611;
     static const int ServiceGetAddrInfoSuccess      = 612;
-    static const int InterfaceActive                = 613;
-    static const int InterfaceIdle                  = 614;
+    static const int InterfaceClassActive           = 613;
+    static const int InterfaceClassIdle             = 614;
 };
 #endif