NetlinkHandler.cpp revision 67c5753274ee828b56f96b5e9cdae64c8562ad52
1932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines/* 2cc366e573e31f43a6101fd6e04b90c6afdc3b7a7Stephen Hines * Copyright (C) 2008 The Android Open Source Project 3932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * 4932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * Licensed under the Apache License, Version 2.0 (the "License"); 5932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * you may not use this file except in compliance with the License. 6932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * You may obtain a copy of the License at 7932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * 8932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * http://www.apache.org/licenses/LICENSE-2.0 9932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * 10932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * Unless required by applicable law or agreed to in writing, software 11932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * distributed under the License is distributed on an "AS IS" BASIS, 12932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * See the License for the specific language governing permissions and 14932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines * limitations under the License. 15932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines */ 16932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 17932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#include <stdio.h> 1804261e0bf97b15033efd697bd0e4cfbae7107f4bStephen Hines#include <stdlib.h> 19932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines#include <errno.h> 20932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 21e126b62760b4bf115cfed162f0234e4e722011dfStephen Hines#define LOG_TAG "Netd" 22e126b62760b4bf115cfed162f0234e4e722011dfStephen Hines 23e126b62760b4bf115cfed162f0234e4e722011dfStephen Hines#include <cutils/log.h> 24e126b62760b4bf115cfed162f0234e4e722011dfStephen Hines 25e126b62760b4bf115cfed162f0234e4e722011dfStephen Hines#include <sysutils/NetlinkEvent.h> 26e126b62760b4bf115cfed162f0234e4e722011dfStephen Hines#include "NetlinkHandler.h" 27e126b62760b4bf115cfed162f0234e4e722011dfStephen Hines#include "NetlinkManager.h" 28e126b62760b4bf115cfed162f0234e4e722011dfStephen Hines#include "ResponseCode.h" 29e126b62760b4bf115cfed162f0234e4e722011dfStephen Hines 30e126b62760b4bf115cfed162f0234e4e722011dfStephen HinesNetlinkHandler::NetlinkHandler(NetlinkManager *nm, int listenerSocket) : 31932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines NetlinkListener(listenerSocket) { 32932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines mNm = nm; 33932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines} 34932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 35932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen HinesNetlinkHandler::~NetlinkHandler() { 36932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines} 37932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 38932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinesint NetlinkHandler::start() { 39932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return this->startListener(); 40932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines} 41932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 42932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinesint NetlinkHandler::stop() { 43932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return this->stopListener(); 44932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines} 45932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 46e126b62760b4bf115cfed162f0234e4e722011dfStephen Hinesvoid NetlinkHandler::onEvent(NetlinkEvent *evt) { 47932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines const char *subsys = evt->getSubsystem(); 48932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines if (!subsys) { 49932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines LOGW("No subsystem found in netlink event"); 50932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines return; 51932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 52e126b62760b4bf115cfed162f0234e4e722011dfStephen Hines if (!strcmp(subsys, "net")) { 53e126b62760b4bf115cfed162f0234e4e722011dfStephen Hines int action = evt->getAction(); 543ffc8330d765599e357197883f72c01bd43837c8Stephen Hines if (action == evt->NlActionAdd) { 55932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines const char *iface = evt->findParam("INTERFACE"); 56932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines notifyInterfaceAdded(iface); 57932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } else if (action == evt->NlActionRemove) { 58932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines const char *iface = evt->findParam("INTERFACE"); 5904261e0bf97b15033efd697bd0e4cfbae7107f4bStephen Hines notifyInterfaceRemoved(iface); 603ffc8330d765599e357197883f72c01bd43837c8Stephen Hines } else if (action == evt->NlActionChange) { 613ffc8330d765599e357197883f72c01bd43837c8Stephen Hines evt->dump(); 62932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines const char *iface = evt->findParam("INTERFACE"); 63932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines notifyInterfaceChanged("nana", true); 64932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines } 653ffc8330d765599e357197883f72c01bd43837c8Stephen Hines } 66932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines} 67932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 68932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinesvoid NetlinkHandler::notifyInterfaceAdded(const char *name) { 69932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines char msg[255]; 70932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines snprintf(msg, sizeof(msg), "Iface added %s", name); 71932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 72932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines mNm->getBroadcaster()->sendBroadcast(ResponseCode::InterfaceChange, 73932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines msg, false); 7404261e0bf97b15033efd697bd0e4cfbae7107f4bStephen Hines} 75932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 76932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hinesvoid NetlinkHandler::notifyInterfaceRemoved(const char *name) { 773ffc8330d765599e357197883f72c01bd43837c8Stephen Hines char msg[255]; 783ffc8330d765599e357197883f72c01bd43837c8Stephen Hines snprintf(msg, sizeof(msg), "Iface removed %s", name); 793ffc8330d765599e357197883f72c01bd43837c8Stephen Hines 803ffc8330d765599e357197883f72c01bd43837c8Stephen Hines mNm->getBroadcaster()->sendBroadcast(ResponseCode::InterfaceChange, 813ffc8330d765599e357197883f72c01bd43837c8Stephen Hines msg, false); 823ffc8330d765599e357197883f72c01bd43837c8Stephen Hines} 833ffc8330d765599e357197883f72c01bd43837c8Stephen Hines 843ffc8330d765599e357197883f72c01bd43837c8Stephen Hinesvoid NetlinkHandler::notifyInterfaceChanged(const char *name, bool isUp) { 853ffc8330d765599e357197883f72c01bd43837c8Stephen Hines char msg[255]; 863ffc8330d765599e357197883f72c01bd43837c8Stephen Hines snprintf(msg, sizeof(msg), "Iface is %s %s", (isUp ? "up" : "down"), name); 87932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines 88932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines mNm->getBroadcaster()->sendBroadcast(ResponseCode::InterfaceChange, 89932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines msg, false); 90932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines} 91932bc6e35bcef7adff05d890a9dcc7212426fb6aStephen Hines