NetlinkHandler.cpp revision e0ebc46c0aa38ce4f35bd3b60c0fcb9204d4c35e
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> 19ff2c0d8c13457e43f0d4bf06d3177271aac104c1Olivier Bailly#include <string.h> 20d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <errno.h> 21d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 22d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#define LOG_TAG "Netd" 23d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 24d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <cutils/log.h> 25d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 26d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <sysutils/NetlinkEvent.h> 27d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include "NetlinkHandler.h" 2867c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt#include "NetlinkManager.h" 2967c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt#include "ResponseCode.h" 30d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 31564df4efc87f3d04c3570836d38134fd949c4cafMike J. ChenNetlinkHandler::NetlinkHandler(NetlinkManager *nm, int listenerSocket, 32564df4efc87f3d04c3570836d38134fd949c4cafMike J. Chen int format) : 33564df4efc87f3d04c3570836d38134fd949c4cafMike J. Chen NetlinkListener(listenerSocket, format) { 3467c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt mNm = nm; 35d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 36d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 37d18304287dbabc7835be771400b85d4ae8b63de6San MehatNetlinkHandler::~NetlinkHandler() { 38d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 39d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 40d18304287dbabc7835be771400b85d4ae8b63de6San Mehatint NetlinkHandler::start() { 41d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return this->startListener(); 42d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 43d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 44d18304287dbabc7835be771400b85d4ae8b63de6San Mehatint NetlinkHandler::stop() { 45d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return this->stopListener(); 46d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 47d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 48d18304287dbabc7835be771400b85d4ae8b63de6San Mehatvoid NetlinkHandler::onEvent(NetlinkEvent *evt) { 49d18304287dbabc7835be771400b85d4ae8b63de6San Mehat const char *subsys = evt->getSubsystem(); 50d18304287dbabc7835be771400b85d4ae8b63de6San Mehat if (!subsys) { 51d18304287dbabc7835be771400b85d4ae8b63de6San Mehat LOGW("No subsystem found in netlink event"); 52d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return; 53d18304287dbabc7835be771400b85d4ae8b63de6San Mehat } 54564df4efc87f3d04c3570836d38134fd949c4cafMike J. Chen 5567c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt if (!strcmp(subsys, "net")) { 5667c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt int action = evt->getAction(); 57564df4efc87f3d04c3570836d38134fd949c4cafMike J. Chen const char *iface = evt->findParam("INTERFACE"); 58564df4efc87f3d04c3570836d38134fd949c4cafMike J. Chen 5967c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt if (action == evt->NlActionAdd) { 6067c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt notifyInterfaceAdded(iface); 6167c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt } else if (action == evt->NlActionRemove) { 6267c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt notifyInterfaceRemoved(iface); 6367c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt } else if (action == evt->NlActionChange) { 6467c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt evt->dump(); 6567c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt notifyInterfaceChanged("nana", true); 66564df4efc87f3d04c3570836d38134fd949c4cafMike J. Chen } else if (action == evt->NlActionLinkUp) { 67564df4efc87f3d04c3570836d38134fd949c4cafMike J. Chen notifyInterfaceLinkChanged(iface, true); 68564df4efc87f3d04c3570836d38134fd949c4cafMike J. Chen } else if (action == evt->NlActionLinkDown) { 69564df4efc87f3d04c3570836d38134fd949c4cafMike J. Chen notifyInterfaceLinkChanged(iface, false); 7067c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt } 71e0ebc46c0aa38ce4f35bd3b60c0fcb9204d4c35eJP Abgrall } else if (!strcmp(subsys, "qlog")) { 72e0ebc46c0aa38ce4f35bd3b60c0fcb9204d4c35eJP Abgrall const char *alertName = evt->findParam("ALERT_NAME"); 73e0ebc46c0aa38ce4f35bd3b60c0fcb9204d4c35eJP Abgrall const char *iface = evt->findParam("INTERFACE"); 74e0ebc46c0aa38ce4f35bd3b60c0fcb9204d4c35eJP Abgrall notifyQuotaLimitReached(alertName, iface); 75d18304287dbabc7835be771400b85d4ae8b63de6San Mehat } 76e0ebc46c0aa38ce4f35bd3b60c0fcb9204d4c35eJP Abgrall 77d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 7867c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt 7967c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwaltvoid NetlinkHandler::notifyInterfaceAdded(const char *name) { 8067c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt char msg[255]; 8167c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt snprintf(msg, sizeof(msg), "Iface added %s", name); 8267c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt 8367c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt mNm->getBroadcaster()->sendBroadcast(ResponseCode::InterfaceChange, 8467c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt msg, false); 8567c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt} 8667c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt 8767c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwaltvoid NetlinkHandler::notifyInterfaceRemoved(const char *name) { 8867c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt char msg[255]; 8967c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt snprintf(msg, sizeof(msg), "Iface removed %s", name); 9067c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt 9167c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt mNm->getBroadcaster()->sendBroadcast(ResponseCode::InterfaceChange, 9267c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt msg, false); 9367c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt} 9467c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt 9567c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwaltvoid NetlinkHandler::notifyInterfaceChanged(const char *name, bool isUp) { 9667c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt char msg[255]; 97564df4efc87f3d04c3570836d38134fd949c4cafMike J. Chen snprintf(msg, sizeof(msg), "Iface changed %s %s", name, 98564df4efc87f3d04c3570836d38134fd949c4cafMike J. Chen (isUp ? "up" : "down")); 99564df4efc87f3d04c3570836d38134fd949c4cafMike J. Chen 100564df4efc87f3d04c3570836d38134fd949c4cafMike J. Chen mNm->getBroadcaster()->sendBroadcast(ResponseCode::InterfaceChange, 101564df4efc87f3d04c3570836d38134fd949c4cafMike J. Chen msg, false); 102564df4efc87f3d04c3570836d38134fd949c4cafMike J. Chen} 103564df4efc87f3d04c3570836d38134fd949c4cafMike J. Chen 104564df4efc87f3d04c3570836d38134fd949c4cafMike J. Chenvoid NetlinkHandler::notifyInterfaceLinkChanged(const char *name, bool isUp) { 105564df4efc87f3d04c3570836d38134fd949c4cafMike J. Chen char msg[255]; 106a583f8be6126d3116311e96c6fd8bafcbaf2b431Mike J. Chen snprintf(msg, sizeof(msg), "Iface linkstate %s %s", name, 107564df4efc87f3d04c3570836d38134fd949c4cafMike J. Chen (isUp ? "up" : "down")); 10867c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt 10967c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt mNm->getBroadcaster()->sendBroadcast(ResponseCode::InterfaceChange, 11067c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt msg, false); 11167c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt} 112e0ebc46c0aa38ce4f35bd3b60c0fcb9204d4c35eJP Abgrall 113e0ebc46c0aa38ce4f35bd3b60c0fcb9204d4c35eJP Abgrallvoid NetlinkHandler::notifyQuotaLimitReached(const char *name, const char *iface) { 114e0ebc46c0aa38ce4f35bd3b60c0fcb9204d4c35eJP Abgrall char msg[255]; 115e0ebc46c0aa38ce4f35bd3b60c0fcb9204d4c35eJP Abgrall snprintf(msg, sizeof(msg), "limit alert %s %s", name, iface); 116e0ebc46c0aa38ce4f35bd3b60c0fcb9204d4c35eJP Abgrall 117e0ebc46c0aa38ce4f35bd3b60c0fcb9204d4c35eJP Abgrall mNm->getBroadcaster()->sendBroadcast(ResponseCode::BandwidthControl, 118e0ebc46c0aa38ce4f35bd3b60c0fcb9204d4c35eJP Abgrall msg, false); 119e0ebc46c0aa38ce4f35bd3b60c0fcb9204d4c35eJP Abgrall} 120