1d18304287dbabc7835be771400b85d4ae8b63de6San Mehat/* 2d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * Copyright (C) 2008 The Android Open Source Project 3d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * 4d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * Licensed under the Apache License, Version 2.0 (the "License"); 5d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * you may not use this file except in compliance with the License. 6d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * You may obtain a copy of the License at 7d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * 8d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * http://www.apache.org/licenses/LICENSE-2.0 9d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * 10d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * Unless required by applicable law or agreed to in writing, software 11d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * distributed under the License is distributed on an "AS IS" BASIS, 12d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * See the License for the specific language governing permissions and 14d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * limitations under the License. 15d18304287dbabc7835be771400b85d4ae8b63de6San Mehat */ 16d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 17d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <stdio.h> 18d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <stdlib.h> 19d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <errno.h> 20d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 21d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#define LOG_TAG "Netd" 22d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 23d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <cutils/log.h> 24d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 25d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <sysutils/NetlinkEvent.h> 26d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include "NetlinkHandler.h" 2767c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt#include "NetlinkManager.h" 2867c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt#include "ResponseCode.h" 29d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 3067c5753274ee828b56f96b5e9cdae64c8562ad52Robert GreenwaltNetlinkHandler::NetlinkHandler(NetlinkManager *nm, int listenerSocket) : 31d18304287dbabc7835be771400b85d4ae8b63de6San Mehat NetlinkListener(listenerSocket) { 3267c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt mNm = nm; 33d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 34d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 35d18304287dbabc7835be771400b85d4ae8b63de6San MehatNetlinkHandler::~NetlinkHandler() { 36d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 37d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 38d18304287dbabc7835be771400b85d4ae8b63de6San Mehatint NetlinkHandler::start() { 39d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return this->startListener(); 40d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 41d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 42d18304287dbabc7835be771400b85d4ae8b63de6San Mehatint NetlinkHandler::stop() { 43d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return this->stopListener(); 44d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 45d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 46d18304287dbabc7835be771400b85d4ae8b63de6San Mehatvoid NetlinkHandler::onEvent(NetlinkEvent *evt) { 47d18304287dbabc7835be771400b85d4ae8b63de6San Mehat const char *subsys = evt->getSubsystem(); 48d18304287dbabc7835be771400b85d4ae8b63de6San Mehat if (!subsys) { 49d18304287dbabc7835be771400b85d4ae8b63de6San Mehat LOGW("No subsystem found in netlink event"); 50d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return; 51d18304287dbabc7835be771400b85d4ae8b63de6San Mehat } 5267c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt if (!strcmp(subsys, "net")) { 5367c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt int action = evt->getAction(); 5467c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt if (action == evt->NlActionAdd) { 5567c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt const char *iface = evt->findParam("INTERFACE"); 5667c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt notifyInterfaceAdded(iface); 5767c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt } else if (action == evt->NlActionRemove) { 5867c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt const char *iface = evt->findParam("INTERFACE"); 5967c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt notifyInterfaceRemoved(iface); 6067c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt } else if (action == evt->NlActionChange) { 6167c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt evt->dump(); 6267c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt const char *iface = evt->findParam("INTERFACE"); 6367c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt notifyInterfaceChanged("nana", true); 6467c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt } 65d18304287dbabc7835be771400b85d4ae8b63de6San Mehat } 66d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 6767c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt 6867c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwaltvoid NetlinkHandler::notifyInterfaceAdded(const char *name) { 6967c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt char msg[255]; 7067c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt snprintf(msg, sizeof(msg), "Iface added %s", name); 7167c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt 7267c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt mNm->getBroadcaster()->sendBroadcast(ResponseCode::InterfaceChange, 7367c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt msg, false); 7467c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt} 7567c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt 7667c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwaltvoid NetlinkHandler::notifyInterfaceRemoved(const char *name) { 7767c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt char msg[255]; 7867c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt snprintf(msg, sizeof(msg), "Iface removed %s", name); 7967c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt 8067c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt mNm->getBroadcaster()->sendBroadcast(ResponseCode::InterfaceChange, 8167c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt msg, false); 8267c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt} 8367c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt 8467c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwaltvoid NetlinkHandler::notifyInterfaceChanged(const char *name, bool isUp) { 8567c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt char msg[255]; 8667c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt snprintf(msg, sizeof(msg), "Iface is %s %s", (isUp ? "up" : "down"), name); 8767c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt 8867c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt mNm->getBroadcaster()->sendBroadcast(ResponseCode::InterfaceChange, 8967c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt msg, false); 9067c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt} 91