OSDN Git Service

Hook netlink interface notification up to fwk.
authorRobert Greenwalt <robdroid@android.com>
Thu, 18 Feb 2010 01:42:37 +0000 (17:42 -0800)
committerRobert Greenwalt <robdroid@android.com>
Thu, 18 Feb 2010 01:42:37 +0000 (17:42 -0800)
The java api was there to get callbacks but the middle piece was missing.
Also has one const defined for USB control that is part of a seperate change, but no harm.

NetlinkHandler.cpp
NetlinkHandler.h
NetlinkManager.cpp
ResponseCode.h

index 53f297c..028729a 100644 (file)
 
 #include <sysutils/NetlinkEvent.h>
 #include "NetlinkHandler.h"
+#include "NetlinkManager.h"
+#include "ResponseCode.h"
 
-NetlinkHandler::NetlinkHandler(int listenerSocket) :
+NetlinkHandler::NetlinkHandler(NetlinkManager *nm, int listenerSocket) :
                 NetlinkListener(listenerSocket) {
+    mNm = nm;
 }
 
 NetlinkHandler::~NetlinkHandler() {
@@ -42,15 +45,46 @@ int NetlinkHandler::stop() {
 
 void NetlinkHandler::onEvent(NetlinkEvent *evt) {
     const char *subsys = evt->getSubsystem();
-
     if (!subsys) {
         LOGW("No subsystem found in netlink event");
         return;
     }
-
-    if (!strcmp(subsys, "block")) {
-    } else if (!strcmp(subsys, "switch")) {
-    } else if (!strcmp(subsys, "battery")) {
-    } else if (!strcmp(subsys, "power_supply")) {
+    if (!strcmp(subsys, "net")) {
+        int action = evt->getAction();
+        if (action == evt->NlActionAdd) {
+            const char *iface = evt->findParam("INTERFACE");
+            notifyInterfaceAdded(iface);
+        } else if (action == evt->NlActionRemove) {
+            const char *iface = evt->findParam("INTERFACE");
+            notifyInterfaceRemoved(iface);
+        } else if (action == evt->NlActionChange) {
+            evt->dump();
+            const char *iface = evt->findParam("INTERFACE");
+            notifyInterfaceChanged("nana", true);
+        }
     }
 }
+
+void NetlinkHandler::notifyInterfaceAdded(const char *name) {
+    char msg[255];
+    snprintf(msg, sizeof(msg), "Iface added %s", name);
+
+    mNm->getBroadcaster()->sendBroadcast(ResponseCode::InterfaceChange,
+            msg, false);
+}
+
+void NetlinkHandler::notifyInterfaceRemoved(const char *name) {
+    char msg[255];
+    snprintf(msg, sizeof(msg), "Iface removed %s", name);
+
+    mNm->getBroadcaster()->sendBroadcast(ResponseCode::InterfaceChange,
+            msg, false);
+}
+
+void NetlinkHandler::notifyInterfaceChanged(const char *name, bool isUp) {
+    char msg[255];
+    snprintf(msg, sizeof(msg), "Iface is %s %s", (isUp ? "up" : "down"), name);
+
+    mNm->getBroadcaster()->sendBroadcast(ResponseCode::InterfaceChange,
+            msg, false);
+}
index 00a31c8..8b2498f 100644 (file)
 #define _NETLINKHANDLER_H
 
 #include <sysutils/NetlinkListener.h>
+#include "NetlinkManager.h"
 
 class NetlinkHandler: public NetlinkListener {
+    NetlinkManager *mNm;
 
 public:
-    NetlinkHandler(int listenerSocket);
+    NetlinkHandler(NetlinkManager *nm, int listenerSocket);
     virtual ~NetlinkHandler();
 
     int start(void);
@@ -30,5 +32,9 @@ public:
 
 protected:
     virtual void onEvent(NetlinkEvent *evt);
+
+    void notifyInterfaceAdded(const char *name);
+    void notifyInterfaceRemoved(const char *name);
+    void notifyInterfaceChanged(const char *name, bool isUp);
 };
 #endif
index e031dc5..634fd4d 100644 (file)
@@ -72,7 +72,7 @@ int NetlinkManager::start() {
         return -1;
     }
 
-    mHandler = new NetlinkHandler(mSock);
+    mHandler = new NetlinkHandler(this, mSock);
     if (mHandler->start()) {
         LOGE("Unable to start NetlinkHandler: %s", strerror(errno));
         return -1;
index f622254..9e52cec 100644 (file)
@@ -35,6 +35,7 @@ public:
     static const int PanStatusResult          = 212;
     static const int InterfaceGetCfgResult    = 213;
     static const int SoftapStatusResult       = 214;
+    static const int UsbRNDISStatusResult     = 215;
 
     // 400 series - The command was accepted but the requested action
     // did not take place.
@@ -46,5 +47,6 @@ public:
     static const int CommandParameterError = 501;
 
     // 600 series - Unsolicited broadcasts
+    static const int InterfaceChange        = 600;
 };
 #endif