#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() {
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);
+}
#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);
protected:
virtual void onEvent(NetlinkEvent *evt);
+
+ void notifyInterfaceAdded(const char *name);
+ void notifyInterfaceRemoved(const char *name);
+ void notifyInterfaceChanged(const char *name, bool isUp);
};
#endif
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.
static const int CommandParameterError = 501;
// 600 series - Unsolicited broadcasts
+ static const int InterfaceChange = 600;
};
#endif