NetlinkHandler.cpp revision e07effe6f8e9340dbee9428b29672adfb647c413
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) { 510e76b761a1514d5182675dd7b7d33725f62d6bc5Steve Block ALOGW("No subsystem found in netlink event"); 52d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return; 53d18304287dbabc7835be771400b85d4ae8b63de6San Mehat } 54564df4efc87f3d04c3570836d38134fd949c4cafMike J. Chen 55e07effe6f8e9340dbee9428b29672adfb647c413JP Abgrall ALOGV("subsystem %s", subsys); 56e07effe6f8e9340dbee9428b29672adfb647c413JP Abgrall 5767c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt if (!strcmp(subsys, "net")) { 5867c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt int action = evt->getAction(); 59564df4efc87f3d04c3570836d38134fd949c4cafMike J. Chen const char *iface = evt->findParam("INTERFACE"); 60564df4efc87f3d04c3570836d38134fd949c4cafMike J. Chen 6167c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt if (action == evt->NlActionAdd) { 6267c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt notifyInterfaceAdded(iface); 6367c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt } else if (action == evt->NlActionRemove) { 6467c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt notifyInterfaceRemoved(iface); 6567c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt } else if (action == evt->NlActionChange) { 6667c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt evt->dump(); 6767c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt notifyInterfaceChanged("nana", true); 68564df4efc87f3d04c3570836d38134fd949c4cafMike J. Chen } else if (action == evt->NlActionLinkUp) { 69564df4efc87f3d04c3570836d38134fd949c4cafMike J. Chen notifyInterfaceLinkChanged(iface, true); 70564df4efc87f3d04c3570836d38134fd949c4cafMike J. Chen } else if (action == evt->NlActionLinkDown) { 71564df4efc87f3d04c3570836d38134fd949c4cafMike J. Chen notifyInterfaceLinkChanged(iface, false); 7267c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt } 73e07effe6f8e9340dbee9428b29672adfb647c413JP Abgrall 74e0ebc46c0aa38ce4f35bd3b60c0fcb9204d4c35eJP Abgrall } else if (!strcmp(subsys, "qlog")) { 75e0ebc46c0aa38ce4f35bd3b60c0fcb9204d4c35eJP Abgrall const char *alertName = evt->findParam("ALERT_NAME"); 76e0ebc46c0aa38ce4f35bd3b60c0fcb9204d4c35eJP Abgrall const char *iface = evt->findParam("INTERFACE"); 77e0ebc46c0aa38ce4f35bd3b60c0fcb9204d4c35eJP Abgrall notifyQuotaLimitReached(alertName, iface); 78e07effe6f8e9340dbee9428b29672adfb647c413JP Abgrall 79e07effe6f8e9340dbee9428b29672adfb647c413JP Abgrall } else if (!strcmp(subsys, "xt_idletimer")) { 806337b88ce4438d224819e9b381ddaf2873bbfddaAshish Sharma int action = evt->getAction(); 816337b88ce4438d224819e9b381ddaf2873bbfddaAshish Sharma const char *iface = evt->findParam("INTERFACE"); 82e07effe6f8e9340dbee9428b29672adfb647c413JP Abgrall const char *state = evt->findParam("STATE"); 83e07effe6f8e9340dbee9428b29672adfb647c413JP Abgrall if (state) 84e07effe6f8e9340dbee9428b29672adfb647c413JP Abgrall notifyInterfaceActivity(iface, !strcmp("active", state)); 85e0ebc46c0aa38ce4f35bd3b60c0fcb9204d4c35eJP Abgrall 866337b88ce4438d224819e9b381ddaf2873bbfddaAshish Sharma } 87d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 8867c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt 8967c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwaltvoid NetlinkHandler::notifyInterfaceAdded(const char *name) { 9067c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt char msg[255]; 9167c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt snprintf(msg, sizeof(msg), "Iface added %s", name); 9267c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt 9367c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt mNm->getBroadcaster()->sendBroadcast(ResponseCode::InterfaceChange, 9467c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt msg, false); 9567c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt} 9667c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt 9767c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwaltvoid NetlinkHandler::notifyInterfaceRemoved(const char *name) { 9867c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt char msg[255]; 9967c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt snprintf(msg, sizeof(msg), "Iface removed %s", name); 10067c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt 10167c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt mNm->getBroadcaster()->sendBroadcast(ResponseCode::InterfaceChange, 10267c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt msg, false); 10367c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt} 10467c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt 10567c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwaltvoid NetlinkHandler::notifyInterfaceChanged(const char *name, bool isUp) { 10667c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt char msg[255]; 107564df4efc87f3d04c3570836d38134fd949c4cafMike J. Chen snprintf(msg, sizeof(msg), "Iface changed %s %s", name, 108564df4efc87f3d04c3570836d38134fd949c4cafMike J. Chen (isUp ? "up" : "down")); 109564df4efc87f3d04c3570836d38134fd949c4cafMike J. Chen 110564df4efc87f3d04c3570836d38134fd949c4cafMike J. Chen mNm->getBroadcaster()->sendBroadcast(ResponseCode::InterfaceChange, 111564df4efc87f3d04c3570836d38134fd949c4cafMike J. Chen msg, false); 112564df4efc87f3d04c3570836d38134fd949c4cafMike J. Chen} 113564df4efc87f3d04c3570836d38134fd949c4cafMike J. Chen 114564df4efc87f3d04c3570836d38134fd949c4cafMike J. Chenvoid NetlinkHandler::notifyInterfaceLinkChanged(const char *name, bool isUp) { 115564df4efc87f3d04c3570836d38134fd949c4cafMike J. Chen char msg[255]; 116a583f8be6126d3116311e96c6fd8bafcbaf2b431Mike J. Chen snprintf(msg, sizeof(msg), "Iface linkstate %s %s", name, 117564df4efc87f3d04c3570836d38134fd949c4cafMike J. Chen (isUp ? "up" : "down")); 11867c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt 11967c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt mNm->getBroadcaster()->sendBroadcast(ResponseCode::InterfaceChange, 12067c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt msg, false); 12167c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt} 122e0ebc46c0aa38ce4f35bd3b60c0fcb9204d4c35eJP Abgrall 123e0ebc46c0aa38ce4f35bd3b60c0fcb9204d4c35eJP Abgrallvoid NetlinkHandler::notifyQuotaLimitReached(const char *name, const char *iface) { 124e0ebc46c0aa38ce4f35bd3b60c0fcb9204d4c35eJP Abgrall char msg[255]; 125e0ebc46c0aa38ce4f35bd3b60c0fcb9204d4c35eJP Abgrall snprintf(msg, sizeof(msg), "limit alert %s %s", name, iface); 126e0ebc46c0aa38ce4f35bd3b60c0fcb9204d4c35eJP Abgrall 127e0ebc46c0aa38ce4f35bd3b60c0fcb9204d4c35eJP Abgrall mNm->getBroadcaster()->sendBroadcast(ResponseCode::BandwidthControl, 128e0ebc46c0aa38ce4f35bd3b60c0fcb9204d4c35eJP Abgrall msg, false); 129e0ebc46c0aa38ce4f35bd3b60c0fcb9204d4c35eJP Abgrall} 1306337b88ce4438d224819e9b381ddaf2873bbfddaAshish Sharma 1316337b88ce4438d224819e9b381ddaf2873bbfddaAshish Sharmavoid NetlinkHandler::notifyInterfaceActivity(const char *name, bool isActive) { 1326337b88ce4438d224819e9b381ddaf2873bbfddaAshish Sharma char msg[255]; 1336337b88ce4438d224819e9b381ddaf2873bbfddaAshish Sharma 134e07effe6f8e9340dbee9428b29672adfb647c413JP Abgrall snprintf(msg, sizeof(msg), "Iface %s %s", name, isActive ? "active" : "idle"); 135e07effe6f8e9340dbee9428b29672adfb647c413JP Abgrall ALOGV("Broadcasting interface activity msg: %s", msg); 1366337b88ce4438d224819e9b381ddaf2873bbfddaAshish Sharma mNm->getBroadcaster()->sendBroadcast(isActive ? ResponseCode::InterfaceActive 1376337b88ce4438d224819e9b381ddaf2873bbfddaAshish Sharma : ResponseCode::InterfaceIdle, 1386337b88ce4438d224819e9b381ddaf2873bbfddaAshish Sharma msg, false); 1396337b88ce4438d224819e9b381ddaf2873bbfddaAshish Sharma} 140