From: Robert Greenwalt Date: Thu, 18 Feb 2010 01:42:37 +0000 (-0800) Subject: Hook netlink interface notification up to fwk. X-Git-Tag: android-x86-7.1-r1~578 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=67c5753274ee828b56f96b5e9cdae64c8562ad52;p=android-x86%2Fsystem-netd.git Hook netlink interface notification up to fwk. 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. --- diff --git a/NetlinkHandler.cpp b/NetlinkHandler.cpp index 53f297c..028729a 100644 --- a/NetlinkHandler.cpp +++ b/NetlinkHandler.cpp @@ -24,9 +24,12 @@ #include #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); +} diff --git a/NetlinkHandler.h b/NetlinkHandler.h index 00a31c8..8b2498f 100644 --- a/NetlinkHandler.h +++ b/NetlinkHandler.h @@ -18,11 +18,13 @@ #define _NETLINKHANDLER_H #include +#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 diff --git a/NetlinkManager.cpp b/NetlinkManager.cpp index e031dc5..634fd4d 100644 --- a/NetlinkManager.cpp +++ b/NetlinkManager.cpp @@ -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; diff --git a/ResponseCode.h b/ResponseCode.h index f622254..9e52cec 100644 --- a/ResponseCode.h +++ b/ResponseCode.h @@ -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