NetlinkHandler.cpp revision c79bcc491f01b4d7956d7bd01f0e912e22307f41
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 170b454ea4abdc8a563af6da58fa37835729220acfLorenzo Colitti#include <stdarg.h> 18d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <stdio.h> 19d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <stdlib.h> 20ff2c0d8c13457e43f0d4bf06d3177271aac104c1Olivier Bailly#include <string.h> 21d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <errno.h> 22d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 23d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#define LOG_TAG "Netd" 24d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 25d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <cutils/log.h> 26d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 27d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <sysutils/NetlinkEvent.h> 28d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include "NetlinkHandler.h" 2967c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt#include "NetlinkManager.h" 3067c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt#include "ResponseCode.h" 31d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 32564df4efc87f3d04c3570836d38134fd949c4cafMike J. ChenNetlinkHandler::NetlinkHandler(NetlinkManager *nm, int listenerSocket, 33564df4efc87f3d04c3570836d38134fd949c4cafMike J. Chen int format) : 34564df4efc87f3d04c3570836d38134fd949c4cafMike J. Chen NetlinkListener(listenerSocket, format) { 3567c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt mNm = nm; 36d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 37d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 38d18304287dbabc7835be771400b85d4ae8b63de6San MehatNetlinkHandler::~NetlinkHandler() { 39d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 40d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 41d18304287dbabc7835be771400b85d4ae8b63de6San Mehatint NetlinkHandler::start() { 42d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return this->startListener(); 43d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 44d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 45d18304287dbabc7835be771400b85d4ae8b63de6San Mehatint NetlinkHandler::stop() { 46d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return this->stopListener(); 47d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 48d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 49d18304287dbabc7835be771400b85d4ae8b63de6San Mehatvoid NetlinkHandler::onEvent(NetlinkEvent *evt) { 50d18304287dbabc7835be771400b85d4ae8b63de6San Mehat const char *subsys = evt->getSubsystem(); 51d18304287dbabc7835be771400b85d4ae8b63de6San Mehat if (!subsys) { 520e76b761a1514d5182675dd7b7d33725f62d6bc5Steve Block ALOGW("No subsystem found in netlink event"); 53d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return; 54d18304287dbabc7835be771400b85d4ae8b63de6San Mehat } 55564df4efc87f3d04c3570836d38134fd949c4cafMike J. Chen 564da12db25b4a2947b1a98b0322e4be56a30c5e17Lorenzo Colitti if (!strcmp(subsys, "net")) { 5767c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt int action = evt->getAction(); 58564df4efc87f3d04c3570836d38134fd949c4cafMike J. Chen const char *iface = evt->findParam("INTERFACE"); 59564df4efc87f3d04c3570836d38134fd949c4cafMike J. Chen 6067c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt if (action == evt->NlActionAdd) { 6167c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt notifyInterfaceAdded(iface); 6267c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt } else if (action == evt->NlActionRemove) { 6367c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt notifyInterfaceRemoved(iface); 6467c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt } else if (action == evt->NlActionChange) { 6567c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt evt->dump(); 6667c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt notifyInterfaceChanged("nana", true); 67564df4efc87f3d04c3570836d38134fd949c4cafMike J. Chen } else if (action == evt->NlActionLinkUp) { 68564df4efc87f3d04c3570836d38134fd949c4cafMike J. Chen notifyInterfaceLinkChanged(iface, true); 69564df4efc87f3d04c3570836d38134fd949c4cafMike J. Chen } else if (action == evt->NlActionLinkDown) { 70564df4efc87f3d04c3570836d38134fd949c4cafMike J. Chen notifyInterfaceLinkChanged(iface, false); 714da12db25b4a2947b1a98b0322e4be56a30c5e17Lorenzo Colitti } else if (action == evt->NlActionAddressUpdated || 724da12db25b4a2947b1a98b0322e4be56a30c5e17Lorenzo Colitti action == evt->NlActionAddressRemoved) { 734da12db25b4a2947b1a98b0322e4be56a30c5e17Lorenzo Colitti const char *address = evt->findParam("ADDRESS"); 744da12db25b4a2947b1a98b0322e4be56a30c5e17Lorenzo Colitti const char *flags = evt->findParam("FLAGS"); 754da12db25b4a2947b1a98b0322e4be56a30c5e17Lorenzo Colitti const char *scope = evt->findParam("SCOPE"); 764da12db25b4a2947b1a98b0322e4be56a30c5e17Lorenzo Colitti if (iface && flags && scope) { 774da12db25b4a2947b1a98b0322e4be56a30c5e17Lorenzo Colitti notifyAddressChanged(action, address, iface, flags, scope); 784da12db25b4a2947b1a98b0322e4be56a30c5e17Lorenzo Colitti } 7912acae8db9dee865a41f0fd11dacf01112115920Lorenzo Colitti } else if (action == evt->NlActionRdnss) { 8012acae8db9dee865a41f0fd11dacf01112115920Lorenzo Colitti const char *lifetime = evt->findParam("LIFETIME"); 8112acae8db9dee865a41f0fd11dacf01112115920Lorenzo Colitti const char *servers = evt->findParam("SERVERS"); 8212acae8db9dee865a41f0fd11dacf01112115920Lorenzo Colitti if (lifetime && servers) { 8312acae8db9dee865a41f0fd11dacf01112115920Lorenzo Colitti notifyInterfaceDnsServers(iface, lifetime, servers); 8412acae8db9dee865a41f0fd11dacf01112115920Lorenzo Colitti } 859b3cd7635caf5948d7d4b11f8f588c9d2811d58eLorenzo Colitti } 869b3cd7635caf5948d7d4b11f8f588c9d2811d58eLorenzo Colitti 87e0ebc46c0aa38ce4f35bd3b60c0fcb9204d4c35eJP Abgrall } else if (!strcmp(subsys, "qlog")) { 88e0ebc46c0aa38ce4f35bd3b60c0fcb9204d4c35eJP Abgrall const char *alertName = evt->findParam("ALERT_NAME"); 89e0ebc46c0aa38ce4f35bd3b60c0fcb9204d4c35eJP Abgrall const char *iface = evt->findParam("INTERFACE"); 90e0ebc46c0aa38ce4f35bd3b60c0fcb9204d4c35eJP Abgrall notifyQuotaLimitReached(alertName, iface); 91e07effe6f8e9340dbee9428b29672adfb647c413JP Abgrall 92e07effe6f8e9340dbee9428b29672adfb647c413JP Abgrall } else if (!strcmp(subsys, "xt_idletimer")) { 936337b88ce4438d224819e9b381ddaf2873bbfddaAshish Sharma int action = evt->getAction(); 94c79bcc491f01b4d7956d7bd01f0e912e22307f41Ashish Sharma const char *label = evt->findParam("INTERFACE"); 95e07effe6f8e9340dbee9428b29672adfb647c413JP Abgrall const char *state = evt->findParam("STATE"); 96e07effe6f8e9340dbee9428b29672adfb647c413JP Abgrall if (state) 9798f65d32b1530b4da6050e38d52f955710577efbHaoyu Bai notifyInterfaceClassActivity(label, !strcmp("active", state)); 98e0ebc46c0aa38ce4f35bd3b60c0fcb9204d4c35eJP Abgrall 9940baed83f89e8d8f834cdfa94d0615076463c04bJP Abgrall#if !LOG_NDEBUG 10040baed83f89e8d8f834cdfa94d0615076463c04bJP Abgrall } else if (strcmp(subsys, "platform") && strcmp(subsys, "backlight")) { 10140baed83f89e8d8f834cdfa94d0615076463c04bJP Abgrall /* It is not a VSYNC or a backlight event */ 10240baed83f89e8d8f834cdfa94d0615076463c04bJP Abgrall ALOGV("unexpected event from subsystem %s", subsys); 10340baed83f89e8d8f834cdfa94d0615076463c04bJP Abgrall#endif 1046337b88ce4438d224819e9b381ddaf2873bbfddaAshish Sharma } 105d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 10667c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt 1070b454ea4abdc8a563af6da58fa37835729220acfLorenzo Colittivoid NetlinkHandler::notify(int code, const char *format, ...) { 1080b454ea4abdc8a563af6da58fa37835729220acfLorenzo Colitti char *msg; 1090b454ea4abdc8a563af6da58fa37835729220acfLorenzo Colitti va_list args; 1100b454ea4abdc8a563af6da58fa37835729220acfLorenzo Colitti va_start(args, format); 1110b454ea4abdc8a563af6da58fa37835729220acfLorenzo Colitti if (vasprintf(&msg, format, args) >= 0) { 1120b454ea4abdc8a563af6da58fa37835729220acfLorenzo Colitti mNm->getBroadcaster()->sendBroadcast(code, msg, false); 1130b454ea4abdc8a563af6da58fa37835729220acfLorenzo Colitti free(msg); 1140b454ea4abdc8a563af6da58fa37835729220acfLorenzo Colitti } else { 1150b454ea4abdc8a563af6da58fa37835729220acfLorenzo Colitti SLOGE("Failed to send notification: vasprintf: %s", strerror(errno)); 1160b454ea4abdc8a563af6da58fa37835729220acfLorenzo Colitti } 1170b454ea4abdc8a563af6da58fa37835729220acfLorenzo Colitti va_end(args); 1180b454ea4abdc8a563af6da58fa37835729220acfLorenzo Colitti} 11967c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt 1200b454ea4abdc8a563af6da58fa37835729220acfLorenzo Colittivoid NetlinkHandler::notifyInterfaceAdded(const char *name) { 1210b454ea4abdc8a563af6da58fa37835729220acfLorenzo Colitti notify(ResponseCode::InterfaceChange, "Iface added %s", name); 12267c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt} 12367c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt 12467c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwaltvoid NetlinkHandler::notifyInterfaceRemoved(const char *name) { 1250b454ea4abdc8a563af6da58fa37835729220acfLorenzo Colitti notify(ResponseCode::InterfaceChange, "Iface removed %s", name); 12667c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt} 12767c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt 12867c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwaltvoid NetlinkHandler::notifyInterfaceChanged(const char *name, bool isUp) { 1290b454ea4abdc8a563af6da58fa37835729220acfLorenzo Colitti notify(ResponseCode::InterfaceChange, 1300b454ea4abdc8a563af6da58fa37835729220acfLorenzo Colitti "Iface changed %s %s", name, (isUp ? "up" : "down")); 131564df4efc87f3d04c3570836d38134fd949c4cafMike J. Chen} 132564df4efc87f3d04c3570836d38134fd949c4cafMike J. Chen 133564df4efc87f3d04c3570836d38134fd949c4cafMike J. Chenvoid NetlinkHandler::notifyInterfaceLinkChanged(const char *name, bool isUp) { 1340b454ea4abdc8a563af6da58fa37835729220acfLorenzo Colitti notify(ResponseCode::InterfaceChange, 1350b454ea4abdc8a563af6da58fa37835729220acfLorenzo Colitti "Iface linkstate %s %s", name, (isUp ? "up" : "down")); 13667c5753274ee828b56f96b5e9cdae64c8562ad52Robert Greenwalt} 137e0ebc46c0aa38ce4f35bd3b60c0fcb9204d4c35eJP Abgrall 138e0ebc46c0aa38ce4f35bd3b60c0fcb9204d4c35eJP Abgrallvoid NetlinkHandler::notifyQuotaLimitReached(const char *name, const char *iface) { 1390b454ea4abdc8a563af6da58fa37835729220acfLorenzo Colitti notify(ResponseCode::BandwidthControl, "limit alert %s %s", name, iface); 140e0ebc46c0aa38ce4f35bd3b60c0fcb9204d4c35eJP Abgrall} 1416337b88ce4438d224819e9b381ddaf2873bbfddaAshish Sharma 14298f65d32b1530b4da6050e38d52f955710577efbHaoyu Baivoid NetlinkHandler::notifyInterfaceClassActivity(const char *name, 14398f65d32b1530b4da6050e38d52f955710577efbHaoyu Bai bool isActive) { 1440b454ea4abdc8a563af6da58fa37835729220acfLorenzo Colitti notify(ResponseCode::InterfaceClassActivity, 1450b454ea4abdc8a563af6da58fa37835729220acfLorenzo Colitti "IfaceClass %s %s", isActive ? "active" : "idle", name); 1466337b88ce4438d224819e9b381ddaf2873bbfddaAshish Sharma} 1479b3cd7635caf5948d7d4b11f8f588c9d2811d58eLorenzo Colitti 1489b3cd7635caf5948d7d4b11f8f588c9d2811d58eLorenzo Colittivoid NetlinkHandler::notifyAddressChanged(int action, const char *addr, 1499b3cd7635caf5948d7d4b11f8f588c9d2811d58eLorenzo Colitti const char *iface, const char *flags, 1509b3cd7635caf5948d7d4b11f8f588c9d2811d58eLorenzo Colitti const char *scope) { 1510b454ea4abdc8a563af6da58fa37835729220acfLorenzo Colitti notify(ResponseCode::InterfaceAddressChange, 1520b454ea4abdc8a563af6da58fa37835729220acfLorenzo Colitti "Address %s %s %s %s %s", 1530b454ea4abdc8a563af6da58fa37835729220acfLorenzo Colitti (action == NetlinkEvent::NlActionAddressUpdated) ? 1540b454ea4abdc8a563af6da58fa37835729220acfLorenzo Colitti "updated" : "removed", addr, iface, flags, scope); 1559b3cd7635caf5948d7d4b11f8f588c9d2811d58eLorenzo Colitti} 15612acae8db9dee865a41f0fd11dacf01112115920Lorenzo Colitti 15712acae8db9dee865a41f0fd11dacf01112115920Lorenzo Colittivoid NetlinkHandler::notifyInterfaceDnsServers(const char *iface, 15812acae8db9dee865a41f0fd11dacf01112115920Lorenzo Colitti const char *lifetime, 15912acae8db9dee865a41f0fd11dacf01112115920Lorenzo Colitti const char *servers) { 16012acae8db9dee865a41f0fd11dacf01112115920Lorenzo Colitti notify(ResponseCode::InterfaceDnsInfo, "DnsInfo servers %s %s %s", 16112acae8db9dee865a41f0fd11dacf01112115920Lorenzo Colitti iface, lifetime, servers); 16212acae8db9dee865a41f0fd11dacf01112115920Lorenzo Colitti} 163