CommandListener.cpp revision 7e9eb7b48345af69283afa7ca58d3be0a329931b
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 171fb02dfc26e06b83e756ab3538b7ebc2136f535dJP Abgrall// #define LOG_NDEBUG 0 18db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 19d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <stdlib.h> 20d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <sys/socket.h> 21d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <sys/types.h> 22d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <netinet/in.h> 23d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <arpa/inet.h> 24d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <dirent.h> 25d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <errno.h> 26ff2c0d8c13457e43f0d4bf06d3177271aac104c1Olivier Bailly#include <string.h> 2732a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff#include <fcntl.h> 285c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat#include <linux/if.h> 295c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 30d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#define LOG_TAG "CommandListener" 31d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 321ed47c4a016e420a855ee46922e512150245ff61Lorenzo Colitti#include <cutils/log.h> 331ed47c4a016e420a855ee46922e512150245ff61Lorenzo Colitti#include <netutils/ifc.h> 34d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <sysutils/SocketClient.h> 35d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 36d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include "CommandListener.h" 37d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include "ResponseCode.h" 38a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat#include "ThrottleController.h" 394a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall#include "BandwidthController.h" 400031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall#include "IdletimerController.h" 41fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt#include "SecondaryTableController.h" 420031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall#include "oem_iptables_hook.h" 43d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 445c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 459d10b341a0ba46f108cb96e46691197d778cbc06San MehatTetherController *CommandListener::sTetherCtrl = NULL; 469ff78fb7da7158f5bd7c86d89a842691820259cfSan MehatNatController *CommandListener::sNatCtrl = NULL; 47d5573d34c8fac49e16b20cf144486125bf940086San MehatPppController *CommandListener::sPppCtrl = NULL; 481bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San MehatPanController *CommandListener::sPanCtrl = NULL; 495af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry ShmidtSoftapController *CommandListener::sSoftapCtrl = NULL; 504a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP AbgrallBandwidthController * CommandListener::sBandwidthCtrl = NULL; 510031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP AbgrallIdletimerController * CommandListener::sIdletimerCtrl = NULL; 5289c1e975f0c03997808d35c7be10b244c5309f9fMattias FalkResolverController *CommandListener::sResolverCtrl = NULL; 53fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert GreenwaltSecondaryTableController *CommandListener::sSecondaryTableCtrl = NULL; 549d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 55d18304287dbabc7835be771400b85d4ae8b63de6San MehatCommandListener::CommandListener() : 56a8e59f8c50aed3f91dead377b8ae21646978506cRobert Greenwalt FrameworkListener("netd", true) { 575c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat registerCmd(new InterfaceCmd()); 58d18304287dbabc7835be771400b85d4ae8b63de6San Mehat registerCmd(new IpFwdCmd()); 59d18304287dbabc7835be771400b85d4ae8b63de6San Mehat registerCmd(new TetherCmd()); 60d18304287dbabc7835be771400b85d4ae8b63de6San Mehat registerCmd(new NatCmd()); 61d5573d34c8fac49e16b20cf144486125bf940086San Mehat registerCmd(new ListTtysCmd()); 62d5573d34c8fac49e16b20cf144486125bf940086San Mehat registerCmd(new PppdCmd()); 631bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat registerCmd(new PanCmd()); 645af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt registerCmd(new SoftapCmd()); 654a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall registerCmd(new BandwidthControlCmd()); 660031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall registerCmd(new IdletimerControlCmd()); 6789c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk registerCmd(new ResolverCmd()); 689d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 69fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt if (!sSecondaryTableCtrl) 70fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt sSecondaryTableCtrl = new SecondaryTableController(); 719d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!sTetherCtrl) 729d10b341a0ba46f108cb96e46691197d778cbc06San Mehat sTetherCtrl = new TetherController(); 739ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat if (!sNatCtrl) 74fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt sNatCtrl = new NatController(sSecondaryTableCtrl); 75d5573d34c8fac49e16b20cf144486125bf940086San Mehat if (!sPppCtrl) 76d5573d34c8fac49e16b20cf144486125bf940086San Mehat sPppCtrl = new PppController(); 771bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat if (!sPanCtrl) 781bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat sPanCtrl = new PanController(); 795af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt if (!sSoftapCtrl) 805af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt sSoftapCtrl = new SoftapController(); 814a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall if (!sBandwidthCtrl) 824a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall sBandwidthCtrl = new BandwidthController(); 830031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall if (!sIdletimerCtrl) 840031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall sIdletimerCtrl = new IdletimerController(); 8589c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk if (!sResolverCtrl) 8689c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk sResolverCtrl = new ResolverController(); 870031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall 880031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall /* 890031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall * This is the only time controllers are allowed to touch 900031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall * top-level chains in iptables. 910031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall * Each controller should setup custom chains and hook them into 920031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall * the top-level ones. 930031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall * THE ORDER IS IMPORTANT. TRIPPLE CHECK EACH setup function. 940031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall */ 950031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall /* Does DROP in nat: PREROUTING, FORWARD, OUTPUT */ 960031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall setupOemIptablesHook(); 970031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall /* Does DROPs in FORWARD by default */ 980031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall sNatCtrl->setupIptablesHooks(); 990031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall /* 1000031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall * Does REJECT in INPUT, OUTPUT. Does counting also. 1010031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall * No DROP/REJECT allowed later in netfilter-flow hook order. 1020031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall */ 1030031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall sBandwidthCtrl->setupIptablesHooks(); 1040031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall /* 1050031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall * Counts in nat: PREROUTING, POSTROUTING. 1060031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall * No DROP/REJECT allowed later in netfilter-flow hook order. 1070031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall */ 1080031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall sIdletimerCtrl->setupIptablesHooks(); 1090031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall 1100031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall sBandwidthCtrl->enableBandwidthControl(false); 111d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 112d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 1135c1b8af16dbbc20c89aaca2f93e725e12b16d055San MehatCommandListener::InterfaceCmd::InterfaceCmd() : 1145c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat NetdCommand("interface") { 115d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 116d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 117c1b3870147acd0dd42e2e767df08b4d64d5d2423repo syncint CommandListener::writeFile(const char *path, const char *value, int size) { 118c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync int fd = open(path, O_WRONLY); 119c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync if (fd < 0) { 1205ea0c05a1e7d8e664b808aa1bb1efd08fdb2fb13Steve Block ALOGE("Failed to open %s: %s", path, strerror(errno)); 121c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync return -1; 122c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync } 123c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync 124c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync if (write(fd, value, size) != size) { 1255ea0c05a1e7d8e664b808aa1bb1efd08fdb2fb13Steve Block ALOGE("Failed to write %s: %s", path, strerror(errno)); 126c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync close(fd); 127c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync return -1; 128c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync } 129c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync close(fd); 130c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync return 0; 131c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync} 132c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync 1335c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehatint CommandListener::InterfaceCmd::runCommand(SocketClient *cli, 134d18304287dbabc7835be771400b85d4ae8b63de6San Mehat int argc, char **argv) { 1355c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (argc < 2) { 1365c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 1375c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 1385c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 1395c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 1405c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (!strcmp(argv[1], "list")) { 1415c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat DIR *d; 1425c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat struct dirent *de; 1435c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 1445c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (!(d = opendir("/sys/class/net"))) { 1455c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to open sysfs dir", true); 1465c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 1475c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 1485c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 1495c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat while((de = readdir(d))) { 1505c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (de->d_name[0] == '.') 1515c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat continue; 1525c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::InterfaceListResult, de->d_name, false); 1535c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 1545c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat closedir(d); 1555c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Interface list completed", false); 1565c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 1578e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } else if (!strcmp(argv[1], "readrxcounter")) { 1588e46896b4c4be5deaef651a12b17314f63ae9070San Mehat if (argc != 3) { 1598e46896b4c4be5deaef651a12b17314f63ae9070San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, 1608e46896b4c4be5deaef651a12b17314f63ae9070San Mehat "Usage: interface readrxcounter <interface>", false); 1618e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 1628e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 1638e46896b4c4be5deaef651a12b17314f63ae9070San Mehat unsigned long rx = 0, tx = 0; 1648e46896b4c4be5deaef651a12b17314f63ae9070San Mehat if (readInterfaceCounters(argv[2], &rx, &tx)) { 1658e46896b4c4be5deaef651a12b17314f63ae9070San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to read counters", true); 1668e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 1678e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 1688e46896b4c4be5deaef651a12b17314f63ae9070San Mehat 1698e46896b4c4be5deaef651a12b17314f63ae9070San Mehat char *msg; 1708e46896b4c4be5deaef651a12b17314f63ae9070San Mehat asprintf(&msg, "%lu", rx); 1718e46896b4c4be5deaef651a12b17314f63ae9070San Mehat cli->sendMsg(ResponseCode::InterfaceRxCounterResult, msg, false); 1728e46896b4c4be5deaef651a12b17314f63ae9070San Mehat free(msg); 1738e46896b4c4be5deaef651a12b17314f63ae9070San Mehat 1748e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 1758e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } else if (!strcmp(argv[1], "readtxcounter")) { 1768e46896b4c4be5deaef651a12b17314f63ae9070San Mehat if (argc != 3) { 1778e46896b4c4be5deaef651a12b17314f63ae9070San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, 1788e46896b4c4be5deaef651a12b17314f63ae9070San Mehat "Usage: interface readtxcounter <interface>", false); 1798e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 1808e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 1818e46896b4c4be5deaef651a12b17314f63ae9070San Mehat unsigned long rx = 0, tx = 0; 1828e46896b4c4be5deaef651a12b17314f63ae9070San Mehat if (readInterfaceCounters(argv[2], &rx, &tx)) { 1838e46896b4c4be5deaef651a12b17314f63ae9070San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to read counters", true); 1848e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 1858e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 1868e46896b4c4be5deaef651a12b17314f63ae9070San Mehat 1878e46896b4c4be5deaef651a12b17314f63ae9070San Mehat char *msg = NULL; 1888e46896b4c4be5deaef651a12b17314f63ae9070San Mehat asprintf(&msg, "%lu", tx); 1898e46896b4c4be5deaef651a12b17314f63ae9070San Mehat cli->sendMsg(ResponseCode::InterfaceTxCounterResult, msg, false); 1908e46896b4c4be5deaef651a12b17314f63ae9070San Mehat free(msg); 1918e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 1928e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } else if (!strcmp(argv[1], "getthrottle")) { 193a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat if (argc != 4 || (argc == 4 && (strcmp(argv[3], "rx") && (strcmp(argv[3], "tx"))))) { 1948e46896b4c4be5deaef651a12b17314f63ae9070San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, 1958e46896b4c4be5deaef651a12b17314f63ae9070San Mehat "Usage: interface getthrottle <interface> <rx|tx>", false); 1968e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 1978e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 198a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat int val = 0; 199a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat int rc = 0; 200a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat int voldRc = ResponseCode::InterfaceRxThrottleResult; 201a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat 202a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat if (!strcmp(argv[3], "rx")) { 203a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat rc = ThrottleController::getInterfaceRxThrottle(argv[2], &val); 204a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat } else { 205a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat rc = ThrottleController::getInterfaceTxThrottle(argv[2], &val); 206a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat voldRc = ResponseCode::InterfaceTxThrottleResult; 207a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat } 208a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat if (rc) { 209a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to get throttle", true); 210a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat } else { 211a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat char *msg = NULL; 212a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat asprintf(&msg, "%u", val); 213a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat cli->sendMsg(voldRc, msg, false); 214a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat free(msg); 215a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat return 0; 216a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat } 2178e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 2188e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } else if (!strcmp(argv[1], "setthrottle")) { 2198e46896b4c4be5deaef651a12b17314f63ae9070San Mehat if (argc != 5) { 2208e46896b4c4be5deaef651a12b17314f63ae9070San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, 221a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat "Usage: interface setthrottle <interface> <rx_kbps> <tx_kbps>", false); 2228e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 2238e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 224a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat if (ThrottleController::setInterfaceThrottle(argv[2], atoi(argv[3]), atoi(argv[4]))) { 225a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to set throttle", true); 226a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat } else { 227a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Interface throttling set", false); 228a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat } 2298e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 2305c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } else { 2315c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat /* 2325c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat * These commands take a minimum of 3 arguments 2335c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat */ 2345c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (argc < 3) { 2355c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 2365c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 2375c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 238e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt 239fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt // 0 1 2 3 4 5 6 7 240fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt // interface route add/remove iface default/secondary dest prefix gateway 241e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt if (!strcmp(argv[1], "route")) { 242e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt int prefix_length = 0; 243fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt if (argc < 8) { 244e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 245e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt return 0; 246e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } 247fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt if (sscanf(argv[6], "%d", &prefix_length) != 1) { 248e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt cli->sendMsg(ResponseCode::CommandParameterError, "Invalid route prefix", false); 249e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt return 0; 250e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } 251e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt if (!strcmp(argv[2], "add")) { 252fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt if (!strcmp(argv[4], "default")) { 253fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt if (ifc_add_route(argv[3], argv[5], prefix_length, argv[7])) { 254fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt cli->sendMsg(ResponseCode::OperationFailed, 255fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt "Failed to add route to default table", true); 256fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt } else { 257fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt cli->sendMsg(ResponseCode::CommandOkay, 258fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt "Route added to default table", false); 259fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt } 260fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt } else if (!strcmp(argv[4], "secondary")) { 261fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt return sSecondaryTableCtrl->addRoute(cli, argv[3], argv[5], 262fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt prefix_length, argv[7]); 263e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } else { 264fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt cli->sendMsg(ResponseCode::CommandParameterError, 265fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt "Invalid route type, expecting 'default' or 'secondary'", false); 266fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt return 0; 267e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } 268e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } else if (!strcmp(argv[2], "remove")) { 269fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt if (!strcmp(argv[4], "default")) { 270fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt if (ifc_remove_route(argv[3], argv[5], prefix_length, argv[7])) { 271fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt cli->sendMsg(ResponseCode::OperationFailed, 272fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt "Failed to remove route from default table", true); 273fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt } else { 274fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt cli->sendMsg(ResponseCode::CommandOkay, 275fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt "Route removed from default table", false); 276fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt } 277fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt } else if (!strcmp(argv[4], "secondary")) { 278fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt return sSecondaryTableCtrl->removeRoute(cli, argv[3], argv[5], 279fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt prefix_length, argv[7]); 280e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } else { 281fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt cli->sendMsg(ResponseCode::CommandParameterError, 282fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt "Invalid route type, expecting 'default' or 'secondary'", false); 283fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt return 0; 284e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } 285e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } else { 286e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown interface cmd", false); 287e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } 288e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt return 0; 289e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } 290e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt 2915c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (!strcmp(argv[1], "getcfg")) { 2921d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwalt struct in_addr addr; 2931d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwalt int prefixLength; 2945c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat unsigned char hwaddr[6]; 2955c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat unsigned flags = 0; 2965c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 2975c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat ifc_init(); 2985c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat memset(hwaddr, 0, sizeof(hwaddr)); 2995c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 3001d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwalt if (ifc_get_info(argv[2], &addr.s_addr, &prefixLength, &flags)) { 3015c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Interface not found", true); 302e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff ifc_close(); 3035c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 3045c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 3055c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 3065c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (ifc_get_hwaddr(argv[2], (void *) hwaddr)) { 3070e76b761a1514d5182675dd7b7d33725f62d6bc5Steve Block ALOGW("Failed to retrieve HW addr for %s (%s)", argv[2], strerror(errno)); 3085c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 3095c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 3105c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat char *addr_s = strdup(inet_ntoa(addr)); 3115c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat const char *updown, *brdcst, *loopbk, *ppp, *running, *multi; 3125c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 3135c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat updown = (flags & IFF_UP) ? "up" : "down"; 3145c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat brdcst = (flags & IFF_BROADCAST) ? " broadcast" : ""; 3155c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat loopbk = (flags & IFF_LOOPBACK) ? " loopback" : ""; 3165c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat ppp = (flags & IFF_POINTOPOINT) ? " point-to-point" : ""; 3175c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat running = (flags & IFF_RUNNING) ? " running" : ""; 3185c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat multi = (flags & IFF_MULTICAST) ? " multicast" : ""; 3195c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 3205c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat char *flag_s; 3215c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 32231ea0b03afeedd17f703b7a6d1e5c9feb2d6000dJeff Sharkey asprintf(&flag_s, "%s%s%s%s%s%s", updown, brdcst, loopbk, ppp, running, multi); 3235c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 3245c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat char *msg = NULL; 3251d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwalt asprintf(&msg, "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x %s %d %s", 3265c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat hwaddr[0], hwaddr[1], hwaddr[2], hwaddr[3], hwaddr[4], hwaddr[5], 3271d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwalt addr_s, prefixLength, flag_s); 3285c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 32901fed783828b592cda3b774deea4099a9e690e3dSan Mehat cli->sendMsg(ResponseCode::InterfaceGetCfgResult, msg, false); 3305c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 3315c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat free(addr_s); 3325c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat free(flag_s); 3335c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat free(msg); 334e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff 335e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff ifc_close(); 3365c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 3375c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } else if (!strcmp(argv[1], "setcfg")) { 33831ea0b03afeedd17f703b7a6d1e5c9feb2d6000dJeff Sharkey // arglist: iface addr prefixLength flags 3395c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (argc < 5) { 3405c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 3415c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 3425c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 3437b984e3f7e724f8a3547a707210319f3d479f261Steve Block ALOGD("Setting iface cfg"); 3445c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 3451d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwalt struct in_addr addr; 3465c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat unsigned flags = 0; 3475c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 3485c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (!inet_aton(argv[3], &addr)) { 3495c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandParameterError, "Invalid address", false); 3505c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 3515c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 3525c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 3535c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat ifc_init(); 3545c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (ifc_set_addr(argv[2], addr.s_addr)) { 3555c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to set address", true); 356e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff ifc_close(); 3575c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 3585c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 3595c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 360ab374f426a0d1d8598f3eb4b0339440dcb313a1aIrfan Sheriff //Set prefix length on a non zero address 361ab374f426a0d1d8598f3eb4b0339440dcb313a1aIrfan Sheriff if (addr.s_addr != 0 && ifc_set_prefixLength(argv[2], atoi(argv[4]))) { 3621d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwalt cli->sendMsg(ResponseCode::OperationFailed, "Failed to set prefixLength", true); 363e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff ifc_close(); 3645c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 3655c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 3665c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 3675c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat /* Process flags */ 3685c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat for (int i = 5; i < argc; i++) { 369e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt char *flag = argv[i]; 370e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt if (!strcmp(flag, "up")) { 3717b984e3f7e724f8a3547a707210319f3d479f261Steve Block ALOGD("Trying to bring up %s", argv[2]); 3725c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (ifc_up(argv[2])) { 3735ea0c05a1e7d8e664b808aa1bb1efd08fdb2fb13Steve Block ALOGE("Error upping interface"); 3745c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to up interface", true); 375e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff ifc_close(); 3765c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 3775c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 378e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt } else if (!strcmp(flag, "down")) { 3797b984e3f7e724f8a3547a707210319f3d479f261Steve Block ALOGD("Trying to bring down %s", argv[2]); 3805c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (ifc_down(argv[2])) { 3815ea0c05a1e7d8e664b808aa1bb1efd08fdb2fb13Steve Block ALOGE("Error downing interface"); 3825c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to down interface", true); 383e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff ifc_close(); 3845c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 3855c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 386e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt } else if (!strcmp(flag, "broadcast")) { 3877c2ddd84ec501aaedb806a3ecec5de00d618a036Jeff Sharkey // currently ignored 388e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt } else if (!strcmp(flag, "multicast")) { 3897c2ddd84ec501aaedb806a3ecec5de00d618a036Jeff Sharkey // currently ignored 3907c2ddd84ec501aaedb806a3ecec5de00d618a036Jeff Sharkey } else if (!strcmp(flag, "running")) { 3917c2ddd84ec501aaedb806a3ecec5de00d618a036Jeff Sharkey // currently ignored 3927c2ddd84ec501aaedb806a3ecec5de00d618a036Jeff Sharkey } else if (!strcmp(flag, "loopback")) { 3937c2ddd84ec501aaedb806a3ecec5de00d618a036Jeff Sharkey // currently ignored 3947c2ddd84ec501aaedb806a3ecec5de00d618a036Jeff Sharkey } else if (!strcmp(flag, "point-to-point")) { 3957c2ddd84ec501aaedb806a3ecec5de00d618a036Jeff Sharkey // currently ignored 3965c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } else { 3975c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandParameterError, "Flag unsupported", false); 398e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff ifc_close(); 3995c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 4005c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 4015c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 402e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff 4035c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Interface configuration set", false); 404e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff ifc_close(); 405e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff return 0; 406e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff } else if (!strcmp(argv[1], "clearaddrs")) { 407e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff // arglist: iface 4087b984e3f7e724f8a3547a707210319f3d479f261Steve Block ALOGD("Clearing all IP addresses on %s", argv[2]); 409e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff 4101ed47c4a016e420a855ee46922e512150245ff61Lorenzo Colitti ifc_clear_addresses(argv[2]); 4111ed47c4a016e420a855ee46922e512150245ff61Lorenzo Colitti 412e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff cli->sendMsg(ResponseCode::CommandOkay, "Interface IP addresses cleared", false); 4135c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 41432a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff } else if (!strcmp(argv[1], "ipv6privacyextensions")) { 41532a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff if (argc != 4) { 41632a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff cli->sendMsg(ResponseCode::CommandSyntaxError, 41732a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff "Usage: interface ipv6privacyextensions <interface> <enable|disable>", 41832a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff false); 41932a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff return 0; 42032a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff } 42132a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff 422c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync char *tmp; 42332a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff asprintf(&tmp, "/proc/sys/net/ipv6/conf/%s/use_tempaddr", argv[2]); 424c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync 425c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync if (writeFile(tmp, !strncmp(argv[3], "enable", 7) ? "2" : "0", 1) < 0) { 42632a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff free(tmp); 42732a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff cli->sendMsg(ResponseCode::OperationFailed, 42832a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff "Failed to set ipv6 privacy extensions", true); 42932a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff return 0; 43032a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff } 43132a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff 432c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync free(tmp); 433c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync cli->sendMsg(ResponseCode::CommandOkay, "IPv6 privacy extensions changed", false); 434c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync return 0; 435c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync } else if (!strcmp(argv[1], "ipv6")) { 436c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync if (argc != 4) { 437c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync cli->sendMsg(ResponseCode::CommandSyntaxError, 438c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync "Usage: interface ipv6 <interface> <enable|disable>", 439c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync false); 440c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync return 0; 441c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync } 442c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync 443c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync char *tmp; 444c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync asprintf(&tmp, "/proc/sys/net/ipv6/conf/%s/disable_ipv6", argv[2]); 445c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync 446c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync if (writeFile(tmp, !strncmp(argv[3], "enable", 7) ? "0" : "1", 1) < 0) { 44732a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff free(tmp); 44832a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff cli->sendMsg(ResponseCode::OperationFailed, 449c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync "Failed to change IPv6 state", true); 45032a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff return 0; 45132a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff } 452c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync 45332a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff free(tmp); 454c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync cli->sendMsg(ResponseCode::CommandOkay, "IPv6 state changed", false); 45532a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff return 0; 4565c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } else { 4575c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown interface cmd", false); 4585c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 4595c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 4605c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 461d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return 0; 462d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 463d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 4644a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall 465d5573d34c8fac49e16b20cf144486125bf940086San MehatCommandListener::ListTtysCmd::ListTtysCmd() : 466d5573d34c8fac49e16b20cf144486125bf940086San Mehat NetdCommand("list_ttys") { 467d5573d34c8fac49e16b20cf144486125bf940086San Mehat} 468d5573d34c8fac49e16b20cf144486125bf940086San Mehat 469d5573d34c8fac49e16b20cf144486125bf940086San Mehatint CommandListener::ListTtysCmd::runCommand(SocketClient *cli, 470d5573d34c8fac49e16b20cf144486125bf940086San Mehat int argc, char **argv) { 471d5573d34c8fac49e16b20cf144486125bf940086San Mehat TtyCollection *tlist = sPppCtrl->getTtyList(); 472d5573d34c8fac49e16b20cf144486125bf940086San Mehat TtyCollection::iterator it; 473d5573d34c8fac49e16b20cf144486125bf940086San Mehat 474d5573d34c8fac49e16b20cf144486125bf940086San Mehat for (it = tlist->begin(); it != tlist->end(); ++it) { 475d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::TtyListResult, *it, false); 476d5573d34c8fac49e16b20cf144486125bf940086San Mehat } 477d5573d34c8fac49e16b20cf144486125bf940086San Mehat 478d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Ttys listed.", false); 479d5573d34c8fac49e16b20cf144486125bf940086San Mehat return 0; 480d5573d34c8fac49e16b20cf144486125bf940086San Mehat} 481d5573d34c8fac49e16b20cf144486125bf940086San Mehat 482d18304287dbabc7835be771400b85d4ae8b63de6San MehatCommandListener::IpFwdCmd::IpFwdCmd() : 483d18304287dbabc7835be771400b85d4ae8b63de6San Mehat NetdCommand("ipfwd") { 484d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 485d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 486d18304287dbabc7835be771400b85d4ae8b63de6San Mehatint CommandListener::IpFwdCmd::runCommand(SocketClient *cli, 487d18304287dbabc7835be771400b85d4ae8b63de6San Mehat int argc, char **argv) { 4889d10b341a0ba46f108cb96e46691197d778cbc06San Mehat int rc = 0; 4899d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 4909d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (argc < 2) { 4919d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 4929d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 4939d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 4949d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 4959d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!strcmp(argv[1], "status")) { 4969d10b341a0ba46f108cb96e46691197d778cbc06San Mehat char *tmp = NULL; 4979d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 4989d10b341a0ba46f108cb96e46691197d778cbc06San Mehat asprintf(&tmp, "Forwarding %s", (sTetherCtrl->getIpFwdEnabled() ? "enabled" : "disabled")); 4999d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::IpFwdStatusResult, tmp, false); 5009d10b341a0ba46f108cb96e46691197d778cbc06San Mehat free(tmp); 5019d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 5029d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[1], "enable")) { 5039d10b341a0ba46f108cb96e46691197d778cbc06San Mehat rc = sTetherCtrl->setIpFwdEnabled(true); 5049d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[1], "disable")) { 5059d10b341a0ba46f108cb96e46691197d778cbc06San Mehat rc = sTetherCtrl->setIpFwdEnabled(false); 5069d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 5079d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown ipfwd cmd", false); 5089d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 5099d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 5109d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 5119d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!rc) { 5129d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandOkay, "ipfwd operation succeeded", false); 5139d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 5149d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::OperationFailed, "ipfwd operation failed", true); 5159d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 516d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 517d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return 0; 518d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 519d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 520d18304287dbabc7835be771400b85d4ae8b63de6San MehatCommandListener::TetherCmd::TetherCmd() : 521d18304287dbabc7835be771400b85d4ae8b63de6San Mehat NetdCommand("tether") { 522d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 523d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 524d18304287dbabc7835be771400b85d4ae8b63de6San Mehatint CommandListener::TetherCmd::runCommand(SocketClient *cli, 525d18304287dbabc7835be771400b85d4ae8b63de6San Mehat int argc, char **argv) { 5269d10b341a0ba46f108cb96e46691197d778cbc06San Mehat int rc = 0; 5279d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 528d18304287dbabc7835be771400b85d4ae8b63de6San Mehat if (argc < 2) { 529d18304287dbabc7835be771400b85d4ae8b63de6San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 530d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return 0; 531d18304287dbabc7835be771400b85d4ae8b63de6San Mehat } 532d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 5339d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!strcmp(argv[1], "stop")) { 5349d10b341a0ba46f108cb96e46691197d778cbc06San Mehat rc = sTetherCtrl->stopTethering(); 535d18304287dbabc7835be771400b85d4ae8b63de6San Mehat } else if (!strcmp(argv[1], "status")) { 5369d10b341a0ba46f108cb96e46691197d778cbc06San Mehat char *tmp = NULL; 5379d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 5389d10b341a0ba46f108cb96e46691197d778cbc06San Mehat asprintf(&tmp, "Tethering services %s", 5399d10b341a0ba46f108cb96e46691197d778cbc06San Mehat (sTetherCtrl->isTetheringStarted() ? "started" : "stopped")); 5409d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::TetherStatusResult, tmp, false); 5419d10b341a0ba46f108cb96e46691197d778cbc06San Mehat free(tmp); 542d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return 0; 5439d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 5449d10b341a0ba46f108cb96e46691197d778cbc06San Mehat /* 5459d10b341a0ba46f108cb96e46691197d778cbc06San Mehat * These commands take a minimum of 4 arguments 5469d10b341a0ba46f108cb96e46691197d778cbc06San Mehat */ 5479d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (argc < 4) { 5489d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 5499d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 5509d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 5519d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 5529d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!strcmp(argv[1], "start")) { 5533208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt if (argc % 2 == 1) { 5543208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt cli->sendMsg(ResponseCode::CommandSyntaxError, "Bad number of arguments", false); 5559d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 5569d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 5573208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt 5583208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt int num_addrs = argc - 2; 5593208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt int arg_index = 2; 5603208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt int array_index = 0; 5613208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt in_addr *addrs = (in_addr *)malloc(sizeof(in_addr) * num_addrs); 5623208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt while (array_index < num_addrs) { 5633208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt if (!inet_aton(argv[arg_index++], &(addrs[array_index++]))) { 5643208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt cli->sendMsg(ResponseCode::CommandParameterError, "Invalid address", false); 5653208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt free(addrs); 5663208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt return 0; 5673208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt } 5689d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 5693208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt rc = sTetherCtrl->startTethering(num_addrs, addrs); 5703208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt free(addrs); 5719d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[1], "interface")) { 5729d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!strcmp(argv[2], "add")) { 5739d10b341a0ba46f108cb96e46691197d778cbc06San Mehat rc = sTetherCtrl->tetherInterface(argv[3]); 5749d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[2], "remove")) { 5759d10b341a0ba46f108cb96e46691197d778cbc06San Mehat rc = sTetherCtrl->untetherInterface(argv[3]); 5769d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[2], "list")) { 5779d10b341a0ba46f108cb96e46691197d778cbc06San Mehat InterfaceCollection *ilist = sTetherCtrl->getTetheredInterfaceList(); 5789d10b341a0ba46f108cb96e46691197d778cbc06San Mehat InterfaceCollection::iterator it; 5799d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 5809d10b341a0ba46f108cb96e46691197d778cbc06San Mehat for (it = ilist->begin(); it != ilist->end(); ++it) { 5819d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::TetherInterfaceListResult, *it, false); 5829d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 5839d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 5849d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandParameterError, 5859d10b341a0ba46f108cb96e46691197d778cbc06San Mehat "Unknown tether interface operation", false); 5869d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 5879d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 5889d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[1], "dns")) { 5899d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!strcmp(argv[2], "set")) { 5909d10b341a0ba46f108cb96e46691197d778cbc06San Mehat rc = sTetherCtrl->setDnsForwarders(&argv[3], argc - 3); 5919d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[2], "list")) { 5929d10b341a0ba46f108cb96e46691197d778cbc06San Mehat NetAddressCollection *dlist = sTetherCtrl->getDnsForwarders(); 5939d10b341a0ba46f108cb96e46691197d778cbc06San Mehat NetAddressCollection::iterator it; 5949d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 5959d10b341a0ba46f108cb96e46691197d778cbc06San Mehat for (it = dlist->begin(); it != dlist->end(); ++it) { 5969d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::TetherDnsFwdTgtListResult, inet_ntoa(*it), false); 5979d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 5989d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 5999d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandParameterError, 6009d10b341a0ba46f108cb96e46691197d778cbc06San Mehat "Unknown tether interface operation", false); 6019d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 6029d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 6039d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 6049d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown tether cmd", false); 6059d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 6069d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 6079d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 6089d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 6099d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!rc) { 6109d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Tether operation succeeded", false); 6119d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 6129d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Tether operation failed", true); 613d18304287dbabc7835be771400b85d4ae8b63de6San Mehat } 614d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 615d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return 0; 616d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 617d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 618d18304287dbabc7835be771400b85d4ae8b63de6San MehatCommandListener::NatCmd::NatCmd() : 619d18304287dbabc7835be771400b85d4ae8b63de6San Mehat NetdCommand("nat") { 620d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 621d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 622d18304287dbabc7835be771400b85d4ae8b63de6San Mehatint CommandListener::NatCmd::runCommand(SocketClient *cli, 623d18304287dbabc7835be771400b85d4ae8b63de6San Mehat int argc, char **argv) { 6249d10b341a0ba46f108cb96e46691197d778cbc06San Mehat int rc = 0; 6259d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 626fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt if (argc < 5) { 6279d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 6289d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 6299d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 6309d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 6319ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat if (!strcmp(argv[1], "enable")) { 632fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt rc = sNatCtrl->enableNat(argc, argv); 633c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall if(!rc) { 634c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall /* Ignore ifaces for now. */ 635c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall rc = sBandwidthCtrl->setGlobalAlertInForwardChain(); 636c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall } 6379ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat } else if (!strcmp(argv[1], "disable")) { 638f7bf29c8a37d65e132a4dceb7c5a4200ed5c3d79Robert Greenwalt /* Ignore ifaces for now. */ 639fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt rc = sBandwidthCtrl->removeGlobalAlertInForwardChain(); 640fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt rc |= sNatCtrl->disableNat(argc, argv); 6419d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 6429d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown nat cmd", false); 6439d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 6449d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 6459d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 6469d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!rc) { 6479d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Nat operation succeeded", false); 6489d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 6499d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Nat operation failed", true); 6509d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 651d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 652d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return 0; 653d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 654d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 655d5573d34c8fac49e16b20cf144486125bf940086San MehatCommandListener::PppdCmd::PppdCmd() : 656d5573d34c8fac49e16b20cf144486125bf940086San Mehat NetdCommand("pppd") { 657d5573d34c8fac49e16b20cf144486125bf940086San Mehat} 658d5573d34c8fac49e16b20cf144486125bf940086San Mehat 659d5573d34c8fac49e16b20cf144486125bf940086San Mehatint CommandListener::PppdCmd::runCommand(SocketClient *cli, 660d5573d34c8fac49e16b20cf144486125bf940086San Mehat int argc, char **argv) { 661d5573d34c8fac49e16b20cf144486125bf940086San Mehat int rc = 0; 662d5573d34c8fac49e16b20cf144486125bf940086San Mehat 663d5573d34c8fac49e16b20cf144486125bf940086San Mehat if (argc < 3) { 664d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 665d5573d34c8fac49e16b20cf144486125bf940086San Mehat return 0; 666d5573d34c8fac49e16b20cf144486125bf940086San Mehat } 667d5573d34c8fac49e16b20cf144486125bf940086San Mehat 668d5573d34c8fac49e16b20cf144486125bf940086San Mehat if (!strcmp(argv[1], "attach")) { 66974d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt struct in_addr l, r, dns1, dns2; 67074d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt 67174d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt memset(&dns1, sizeof(struct in_addr), 0); 67274d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt memset(&dns2, sizeof(struct in_addr), 0); 673d5573d34c8fac49e16b20cf144486125bf940086San Mehat 674d5573d34c8fac49e16b20cf144486125bf940086San Mehat if (!inet_aton(argv[3], &l)) { 675d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::CommandParameterError, "Invalid local address", false); 676d5573d34c8fac49e16b20cf144486125bf940086San Mehat return 0; 677d5573d34c8fac49e16b20cf144486125bf940086San Mehat } 678d5573d34c8fac49e16b20cf144486125bf940086San Mehat if (!inet_aton(argv[4], &r)) { 679d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::CommandParameterError, "Invalid remote address", false); 680d5573d34c8fac49e16b20cf144486125bf940086San Mehat return 0; 681d5573d34c8fac49e16b20cf144486125bf940086San Mehat } 68274d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt if ((argc > 3) && (!inet_aton(argv[5], &dns1))) { 68374d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt cli->sendMsg(ResponseCode::CommandParameterError, "Invalid dns1 address", false); 68474d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt return 0; 68574d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt } 68674d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt if ((argc > 4) && (!inet_aton(argv[6], &dns2))) { 68774d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt cli->sendMsg(ResponseCode::CommandParameterError, "Invalid dns2 address", false); 68874d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt return 0; 68974d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt } 69074d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt rc = sPppCtrl->attachPppd(argv[2], l, r, dns1, dns2); 691d5573d34c8fac49e16b20cf144486125bf940086San Mehat } else if (!strcmp(argv[1], "detach")) { 692d5573d34c8fac49e16b20cf144486125bf940086San Mehat rc = sPppCtrl->detachPppd(argv[2]); 693d5573d34c8fac49e16b20cf144486125bf940086San Mehat } else { 694d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown pppd cmd", false); 695d5573d34c8fac49e16b20cf144486125bf940086San Mehat return 0; 696d5573d34c8fac49e16b20cf144486125bf940086San Mehat } 697d5573d34c8fac49e16b20cf144486125bf940086San Mehat 698d5573d34c8fac49e16b20cf144486125bf940086San Mehat if (!rc) { 699d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Pppd operation succeeded", false); 700d5573d34c8fac49e16b20cf144486125bf940086San Mehat } else { 701d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Pppd operation failed", true); 702d5573d34c8fac49e16b20cf144486125bf940086San Mehat } 703d5573d34c8fac49e16b20cf144486125bf940086San Mehat 704d5573d34c8fac49e16b20cf144486125bf940086San Mehat return 0; 705d5573d34c8fac49e16b20cf144486125bf940086San Mehat} 7061bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat 7071bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San MehatCommandListener::PanCmd::PanCmd() : 7081bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat NetdCommand("pan") { 7091bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat} 7101bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat 7111bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehatint CommandListener::PanCmd::runCommand(SocketClient *cli, 7121bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat int argc, char **argv) { 7131bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat int rc = 0; 7141bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat 7151bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat if (argc < 2) { 7161bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 7171bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat return 0; 7181bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat } 7191bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat 7201bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat if (!strcmp(argv[1], "start")) { 7211bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat rc = sPanCtrl->startPan(); 7221bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat } else if (!strcmp(argv[1], "stop")) { 7231bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat rc = sPanCtrl->stopPan(); 7241bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat } else if (!strcmp(argv[1], "status")) { 7251bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat char *tmp = NULL; 7261bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat 7271bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat asprintf(&tmp, "Pan services %s", 7281bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat (sPanCtrl->isPanStarted() ? "started" : "stopped")); 7291bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat cli->sendMsg(ResponseCode::PanStatusResult, tmp, false); 7301bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat free(tmp); 7311bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat return 0; 7321bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat } else { 7331bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown pan cmd", false); 7341bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat return 0; 7351bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat } 7361bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat 7371bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat if (!rc) { 7381bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Pan operation succeeded", false); 7391bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat } else { 7401bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Pan operation failed", true); 7411bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat } 7421bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat 7431bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat return 0; 7441bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat} 7455af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 7465af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry ShmidtCommandListener::SoftapCmd::SoftapCmd() : 7475af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt NetdCommand("softap") { 7485af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt} 7495af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 7505af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidtint CommandListener::SoftapCmd::runCommand(SocketClient *cli, 7515af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt int argc, char **argv) { 75231fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt int rc = 0, flag = 0; 753666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt char *retbuf = NULL; 7545af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 7555af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt if (argc < 2) { 7565af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt cli->sendMsg(ResponseCode::CommandSyntaxError, "Softap Missing argument", false); 7575af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt return 0; 7585af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } 7595af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 7607e9eb7b48345af69283afa7ca58d3be0a329931bIrfan Sheriff if (!strcmp(argv[1], "startap")) { 761c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt rc = sSoftapCtrl->startSoftap(); 762c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt } else if (!strcmp(argv[1], "stopap")) { 7635af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt rc = sSoftapCtrl->stopSoftap(); 76431fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt } else if (!strcmp(argv[1], "fwreload")) { 76531fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt rc = sSoftapCtrl->fwReloadSoftap(argc, argv); 766666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt } else if (!strcmp(argv[1], "clients")) { 767666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt rc = sSoftapCtrl->clientsSoftap(&retbuf); 768666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt if (!rc) { 769666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt cli->sendMsg(ResponseCode::CommandOkay, retbuf, false); 770666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt free(retbuf); 771666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt return 0; 772666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt } 7735af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } else if (!strcmp(argv[1], "status")) { 774666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt asprintf(&retbuf, "Softap service %s", 7755af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt (sSoftapCtrl->isSoftapStarted() ? "started" : "stopped")); 776666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt cli->sendMsg(ResponseCode::SoftapStatusResult, retbuf, false); 777666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt free(retbuf); 7785af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt return 0; 7795af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } else if (!strcmp(argv[1], "set")) { 7805af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt rc = sSoftapCtrl->setSoftap(argc, argv); 7815af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } else { 7825af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt cli->sendMsg(ResponseCode::CommandSyntaxError, "Softap Unknown cmd", false); 7835af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt return 0; 7845af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } 7855af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 7865af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt if (!rc) { 7875af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt cli->sendMsg(ResponseCode::CommandOkay, "Softap operation succeeded", false); 7885af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } else { 7895af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt cli->sendMsg(ResponseCode::OperationFailed, "Softap operation failed", true); 7905af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } 7915af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 7925af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt return 0; 7935af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt} 7943e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt 79589c1e975f0c03997808d35c7be10b244c5309f9fMattias FalkCommandListener::ResolverCmd::ResolverCmd() : 79689c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk NetdCommand("resolver") { 79789c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk} 79889c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk 79989c1e975f0c03997808d35c7be10b244c5309f9fMattias Falkint CommandListener::ResolverCmd::runCommand(SocketClient *cli, int argc, char **argv) { 80089c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk int rc = 0; 80189c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk struct in_addr addr; 80289c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk 80389c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk if (argc < 2) { 80489c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk cli->sendMsg(ResponseCode::CommandSyntaxError, "Resolver missing arguments", false); 80589c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk return 0; 80689c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } 80789c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk 80889c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk if (!strcmp(argv[1], "setdefaultif")) { // "resolver setdefaultif <iface>" 80989c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk if (argc == 3) { 81089c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk rc = sResolverCtrl->setDefaultInterface(argv[2]); 81189c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } else { 81289c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk cli->sendMsg(ResponseCode::CommandSyntaxError, 81389c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk "Wrong number of arguments to resolver setdefaultif", false); 81489c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk return 0; 81589c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } 81689c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } else if (!strcmp(argv[1], "setifdns")) { // "resolver setifdns <iface> <dns1> <dns2> ..." 81789c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk if (argc >= 4) { 81889c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk rc = sResolverCtrl->setInterfaceDnsServers(argv[2], &argv[3], argc - 3); 81989c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } else { 82089c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk cli->sendMsg(ResponseCode::CommandSyntaxError, 82189c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk "Wrong number of arguments to resolver setifdns", false); 82289c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk return 0; 82389c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } 82489c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk 82589c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk // set the address of the interface to which the name servers 82689c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk // are bound. Required in order to bind to right interface when 82789c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk // doing the dns query. 82889c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk if (!rc) { 82989c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk ifc_init(); 83089c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk ifc_get_info(argv[2], &addr.s_addr, NULL, 0); 83189c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk 83289c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk rc = sResolverCtrl->setInterfaceAddress(argv[2], &addr); 83389c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } 83489c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } else if (!strcmp(argv[1], "flushdefaultif")) { // "resolver flushdefaultif" 83589c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk if (argc == 2) { 83689c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk rc = sResolverCtrl->flushDefaultDnsCache(); 83789c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } else { 83889c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk cli->sendMsg(ResponseCode::CommandSyntaxError, 83989c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk "Wrong number of arguments to resolver flushdefaultif", false); 84089c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk return 0; 84189c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } 84289c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } else if (!strcmp(argv[1], "flushif")) { // "resolver flushif <iface>" 84389c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk if (argc == 3) { 84489c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk rc = sResolverCtrl->flushInterfaceDnsCache(argv[2]); 84589c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } else { 84689c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk cli->sendMsg(ResponseCode::CommandSyntaxError, 84789c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk "Wrong number of arguments to resolver setdefaultif", false); 84889c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk return 0; 84989c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } 85089c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } else { 85189c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk cli->sendMsg(ResponseCode::CommandSyntaxError,"Resolver unknown command", false); 85289c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk return 0; 85389c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } 85489c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk 85589c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk if (!rc) { 85689c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk cli->sendMsg(ResponseCode::CommandOkay, "Resolver command succeeded", false); 85789c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } else { 85889c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk cli->sendMsg(ResponseCode::OperationFailed, "Resolver command failed", true); 85989c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } 86089c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk 86189c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk return 0; 86289c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk} 86389c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk 8648e46896b4c4be5deaef651a12b17314f63ae9070San Mehatint CommandListener::readInterfaceCounters(const char *iface, unsigned long *rx, unsigned long *tx) { 8658e46896b4c4be5deaef651a12b17314f63ae9070San Mehat FILE *fp = fopen("/proc/net/dev", "r"); 8668e46896b4c4be5deaef651a12b17314f63ae9070San Mehat if (!fp) { 8675ea0c05a1e7d8e664b808aa1bb1efd08fdb2fb13Steve Block ALOGE("Failed to open /proc/net/dev (%s)", strerror(errno)); 8688e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return -1; 8698e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 8708e46896b4c4be5deaef651a12b17314f63ae9070San Mehat 8718e46896b4c4be5deaef651a12b17314f63ae9070San Mehat char buffer[512]; 8728e46896b4c4be5deaef651a12b17314f63ae9070San Mehat 8738e46896b4c4be5deaef651a12b17314f63ae9070San Mehat fgets(buffer, sizeof(buffer), fp); // Header 1 8748e46896b4c4be5deaef651a12b17314f63ae9070San Mehat fgets(buffer, sizeof(buffer), fp); // Header 2 8758e46896b4c4be5deaef651a12b17314f63ae9070San Mehat while(fgets(buffer, sizeof(buffer), fp)) { 8768e46896b4c4be5deaef651a12b17314f63ae9070San Mehat buffer[strlen(buffer)-1] = '\0'; 8778e46896b4c4be5deaef651a12b17314f63ae9070San Mehat 878651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt char name[31]; 8798e46896b4c4be5deaef651a12b17314f63ae9070San Mehat unsigned long d; 880651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt sscanf(buffer, "%30s %lu %lu %lu %lu %lu %lu %lu %lu %lu", 8818e46896b4c4be5deaef651a12b17314f63ae9070San Mehat name, rx, &d, &d, &d, &d, &d, &d, &d, tx); 882651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt char *rxString = strchr(name, ':'); 883651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt *rxString = '\0'; 884651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt rxString++; 885651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt // when the rx count gets too big it changes from "name: 999" to "name:1000" 886651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt // and the sscanf munge the two together. Detect that and fix 887651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt // note that all the %lu will be off by one and the real tx value will be in d 888651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt if (*rxString != '\0') { 889651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt *tx = d; 890651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt sscanf(rxString, "%20lu", rx); 891651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt } 8928e46896b4c4be5deaef651a12b17314f63ae9070San Mehat if (strcmp(name, iface)) { 8938e46896b4c4be5deaef651a12b17314f63ae9070San Mehat continue; 8948e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 8958e46896b4c4be5deaef651a12b17314f63ae9070San Mehat fclose(fp); 8968e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 8978e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 8988e46896b4c4be5deaef651a12b17314f63ae9070San Mehat 8998e46896b4c4be5deaef651a12b17314f63ae9070San Mehat fclose(fp); 90031c61c80a013bd1a050f0f4103e13fba62bf1717Robert Greenwalt *rx = 0; 90131c61c80a013bd1a050f0f4103e13fba62bf1717Robert Greenwalt *tx = 0; 90231c61c80a013bd1a050f0f4103e13fba62bf1717Robert Greenwalt return 0; 9038e46896b4c4be5deaef651a12b17314f63ae9070San Mehat} 9044a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall 9054a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP AbgrallCommandListener::BandwidthControlCmd::BandwidthControlCmd() : 9060dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall NetdCommand("bandwidth") { 9074a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall} 9084a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall 909db7da58e8d2aa021060098057f944ef754be06e3JP Abgrallvoid CommandListener::BandwidthControlCmd::sendGenericSyntaxError(SocketClient *cli, const char *usageMsg) { 910db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall char *msg; 911db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall asprintf(&msg, "Usage: bandwidth %s", usageMsg); 912db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, msg, false); 913db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall free(msg); 914db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall} 915db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 916db7da58e8d2aa021060098057f944ef754be06e3JP Abgrallvoid CommandListener::BandwidthControlCmd::sendGenericOkFail(SocketClient *cli, int cond) { 917db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!cond) { 918db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall cli->sendMsg(ResponseCode::CommandOkay, "Bandwidth command succeeeded", false); 919db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } else { 920db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall cli->sendMsg(ResponseCode::OperationFailed, "Bandwidth command failed", false); 921db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 922db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall} 923db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 924db7da58e8d2aa021060098057f944ef754be06e3JP Abgrallvoid CommandListener::BandwidthControlCmd::sendGenericOpFailed(SocketClient *cli, const char *errMsg) { 925db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall cli->sendMsg(ResponseCode::OperationFailed, errMsg, false); 926db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall} 927db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 928fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrallint CommandListener::BandwidthControlCmd::runCommand(SocketClient *cli, int argc, char **argv) { 9294a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall if (argc < 2) { 930db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "<cmds> <args...>"); 9314a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall return 0; 9324a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall } 9334a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall 9343fb42e026ffebab2c8f282e42501040121e32d83Steve Block ALOGV("bwctrlcmd: argc=%d %s %s ...", argc, argv[0], argv[1]); 935db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 9364a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall if (!strcmp(argv[1], "enable")) { 9370031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall int rc = sBandwidthCtrl->enableBandwidthControl(true); 938db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 939db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 940db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 941db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 942db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "disable")) { 943db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->disableBandwidthControl(); 944db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 945db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 9460dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall 947db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 948db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "removequota") || !strcmp(argv[1], "rq")) { 949fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall if (argc != 3) { 950db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "removequota <interface>"); 951fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall return 0; 952fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall } 953db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->removeInterfaceSharedQuota(argv[2]); 954db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 955db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 956fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall 957db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 958db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "getquota") || !strcmp(argv[1], "gq")) { 9598a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall int64_t bytes; 9608a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (argc != 2) { 961db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "getquota"); 9628a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 9638a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 964db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->getInterfaceSharedQuota(&bytes); 9658a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (rc) { 966db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOpFailed(cli, "Failed to get quota"); 9678a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 9688a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 969db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 9708a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall char *msg; 9718a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall asprintf(&msg, "%lld", bytes); 9728a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall cli->sendMsg(ResponseCode::QuotaCounterResult, msg, false); 9738a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall free(msg); 974db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 9758a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall 976db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 977db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "getiquota") || !strcmp(argv[1], "giq")) { 9788a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall int64_t bytes; 9798a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (argc != 3) { 980db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "getiquota <iface>"); 9818a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 9828a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 983db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 984db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->getInterfaceQuota(argv[2], &bytes); 9858a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (rc) { 986db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOpFailed(cli, "Failed to get quota"); 9878a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 9888a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 9898a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall char *msg; 9908a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall asprintf(&msg, "%lld", bytes); 9918a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall cli->sendMsg(ResponseCode::QuotaCounterResult, msg, false); 9928a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall free(msg); 993db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 9948a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall 995db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 996db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "setquota") || !strcmp(argv[1], "sq")) { 997fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall if (argc != 4) { 998db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "setquota <interface> <bytes>"); 999fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall return 0; 1000fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall } 1001db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->setInterfaceSharedQuota(argv[2], atoll(argv[3])); 1002db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1003db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 1004db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1005db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "setquotas") || !strcmp(argv[1], "sqs")) { 1006db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc; 1007fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall if (argc < 4) { 1008db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "setquotas <bytes> <interface> ..."); 1009fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall return 0; 1010fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall } 1011db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 10128a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall for (int q = 3; argc >= 4; q++, argc--) { 10130dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall rc = sBandwidthCtrl->setInterfaceSharedQuota(argv[q], atoll(argv[2])); 10140dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall if (rc) { 10150dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall char *msg; 10160dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall asprintf(&msg, "bandwidth setquotas %s %s failed", argv[2], argv[q]); 10170dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall cli->sendMsg(ResponseCode::OperationFailed, 10180dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall msg, false); 10190dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall free(msg); 1020db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 10210dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall } 10220dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall } 1023db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1024db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 10250dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall 1026db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1027db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "removequotas") || !strcmp(argv[1], "rqs")) { 1028db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc; 10290dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall if (argc < 3) { 1030db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "removequotas <interface> ..."); 10310dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall return 0; 10320dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall } 1033db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 10348a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall for (int q = 2; argc >= 3; q++, argc--) { 10350dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall rc = sBandwidthCtrl->removeInterfaceSharedQuota(argv[q]); 10360dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall if (rc) { 10370dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall char *msg; 10380dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall asprintf(&msg, "bandwidth removequotas %s failed", argv[q]); 10390dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall cli->sendMsg(ResponseCode::OperationFailed, 10400dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall msg, false); 10410dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall free(msg); 1042db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 10430dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall } 10440dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall } 1045db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1046db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 10470dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall 1048db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1049db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "removeiquota") || !strcmp(argv[1], "riq")) { 10500dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall if (argc != 3) { 1051db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "removeiquota <interface>"); 10520dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall return 0; 10530dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall } 1054db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->removeInterfaceQuota(argv[2]); 1055db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1056db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 10570dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall 1058db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1059db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "setiquota") || !strcmp(argv[1], "siq")) { 10600dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall if (argc != 4) { 1061db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "setiquota <interface> <bytes>"); 10620dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall return 0; 10630dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall } 1064db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->setInterfaceQuota(argv[2], atoll(argv[3])); 1065db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1066db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 1067fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall 1068db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1069db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "addnaughtyapps") || !strcmp(argv[1], "ana")) { 1070fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall if (argc < 3) { 1071db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "addnaughtyapps <appUid> ..."); 10724a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall return 0; 1073fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall } 1074db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->addNaughtyApps(argc - 2, argv + 2); 1075db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1076db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 1077db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 1078fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall 1079db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1080db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "removenaughtyapps") || !strcmp(argv[1], "rna")) { 1081fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall if (argc < 3) { 1082db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "removenaughtyapps <appUid> ..."); 1083fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall return 0; 1084fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall } 1085db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->removeNaughtyApps(argc - 2, argv + 2); 1086db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1087db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 1088fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall 1089db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1090db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "setglobalalert") || !strcmp(argv[1], "sga")) { 10918a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (argc != 3) { 1092db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "setglobalalert <bytes>"); 10938a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 10948a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 1095db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->setGlobalAlert(atoll(argv[2])); 1096db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1097db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 10988a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall 1099db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1100c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall if (!strcmp(argv[1], "debugsettetherglobalalert") || !strcmp(argv[1], "dstga")) { 1101c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall if (argc != 4) { 1102c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall sendGenericSyntaxError(cli, "debugsettetherglobalalert <interface0> <interface1>"); 1103c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall return 0; 1104c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall } 1105c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall /* We ignore the interfaces for now. */ 1106c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall int rc = sBandwidthCtrl->setGlobalAlertInForwardChain(); 1107c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall sendGenericOkFail(cli, rc); 1108c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall return 0; 1109c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall 1110c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall } 1111db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "removeglobalalert") || !strcmp(argv[1], "rga")) { 11128a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (argc != 2) { 1113db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "removeglobalalert"); 11148a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 11158a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 1116db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->removeGlobalAlert(); 1117db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1118db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 11198a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall 1120db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1121c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall if (!strcmp(argv[1], "debugremovetetherglobalalert") || !strcmp(argv[1], "drtga")) { 1122c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall if (argc != 4) { 1123c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall sendGenericSyntaxError(cli, "debugremovetetherglobalalert <interface0> <interface1>"); 1124c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall return 0; 1125c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall } 1126c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall /* We ignore the interfaces for now. */ 1127c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall int rc = sBandwidthCtrl->removeGlobalAlertInForwardChain(); 1128c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall sendGenericOkFail(cli, rc); 1129c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall return 0; 1130c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall 1131c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall } 1132db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "setsharedalert") || !strcmp(argv[1], "ssa")) { 11338a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (argc != 3) { 1134db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "setsharedalert <bytes>"); 11358a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 11368a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 1137db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->setSharedAlert(atoll(argv[2])); 1138db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1139db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 11408a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall 1141db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1142db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "removesharedalert") || !strcmp(argv[1], "rsa")) { 11438a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (argc != 2) { 1144db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "removesharedalert"); 11458a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 11468a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 1147db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->removeSharedAlert(); 1148db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1149db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 11508a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall 1151db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1152db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "setinterfacealert") || !strcmp(argv[1], "sia")) { 11538a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (argc != 4) { 1154db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "setinterfacealert <interface> <bytes>"); 11558a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 11568a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 1157db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->setInterfaceAlert(argv[2], atoll(argv[3])); 1158db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1159db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 11608a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall 1161db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1162db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "removeinterfacealert") || !strcmp(argv[1], "ria")) { 11638a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (argc != 3) { 1164db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "removeinterfacealert <interface>"); 11658a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 11668a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 1167db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->removeInterfaceAlert(argv[2]); 1168db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1169fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall return 0; 1170db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 11714a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall } 1172db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "gettetherstats") || !strcmp(argv[1], "gts")) { 1173db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall BandwidthController::TetherStats tetherStats; 1174a2a64f004f1677daf16b0b03d589d6572ec547c2JP Abgrall std::string extraProcessingInfo = ""; 1175db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (argc != 4) { 1176db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "gettetherstats <interface0> <interface1>"); 1177db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 1178db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1179db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 1180db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall tetherStats.ifaceIn = argv[2]; 1181db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall tetherStats.ifaceOut = argv[3]; 1182a2a64f004f1677daf16b0b03d589d6572ec547c2JP Abgrall int rc = sBandwidthCtrl->getTetherStats(tetherStats, extraProcessingInfo); 1183db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (rc) { 1184a2a64f004f1677daf16b0b03d589d6572ec547c2JP Abgrall extraProcessingInfo.insert(0, "Failed to get tethering stats.\n"); 1185a2a64f004f1677daf16b0b03d589d6572ec547c2JP Abgrall sendGenericOpFailed(cli, extraProcessingInfo.c_str()); 1186db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 1187db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1188db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 1189db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall char *msg = tetherStats.getStatsLine(); 1190db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall cli->sendMsg(ResponseCode::TetheringStatsResult, msg, false); 1191db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall free(msg); 1192db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 11934a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall 11944a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall } 1195db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 1196db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown bandwidth cmd", false); 11974a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall return 0; 11984a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall} 11990031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall 12000031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP AbgrallCommandListener::IdletimerControlCmd::IdletimerControlCmd() : 12010031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall NetdCommand("idletimer") { 12020031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall} 12030031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall 12040031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrallint CommandListener::IdletimerControlCmd::runCommand(SocketClient *cli, int argc, char **argv) { 12050031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall // TODO(ashish): Change the error statements 12060031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall if (argc < 2) { 12070031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 12080031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall return 0; 12090031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall } 12100031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall 12110031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall ALOGV("idletimerctrlcmd: argc=%d %s %s ...", argc, argv[0], argv[1]); 12120031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall 12130031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall if (!strcmp(argv[1], "enable")) { 12140031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall if (0 != sIdletimerCtrl->enableIdletimerControl()) { 12150031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 12160031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall } else { 12170031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall cli->sendMsg(ResponseCode::CommandOkay, "Enable success", false); 12180031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall } 12190031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall return 0; 12200031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall 12210031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall } 12220031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall if (!strcmp(argv[1], "disable")) { 12230031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall if (0 != sIdletimerCtrl->disableIdletimerControl()) { 12240031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 12250031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall } else { 12260031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall cli->sendMsg(ResponseCode::CommandOkay, "Disable success", false); 12270031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall } 12280031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall return 0; 12290031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall } 12300031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall if (!strcmp(argv[1], "add")) { 12310031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall if (argc != 4) { 12320031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 12330031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall return 0; 12340031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall } 12350031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall if(0 != sIdletimerCtrl->addInterfaceIdletimer(argv[2], atoi(argv[3]))) { 12360031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall cli->sendMsg(ResponseCode::OperationFailed, "Failed to add interface", false); 12370031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall } else { 12380031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall cli->sendMsg(ResponseCode::CommandOkay, "Add success", false); 12390031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall } 12400031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall return 0; 12410031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall } 12420031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall if (!strcmp(argv[1], "remove")) { 12430031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall if (argc != 4) { 12440031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 12450031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall return 0; 12460031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall } 12470031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall // ashish: fixme timeout 12480031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall if (0 != sIdletimerCtrl->removeInterfaceIdletimer(argv[2], atoi(argv[3]))) { 12490031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall cli->sendMsg(ResponseCode::OperationFailed, "Failed to remove interface", false); 12500031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall } else { 12510031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall cli->sendMsg(ResponseCode::CommandOkay, "Remove success", false); 12520031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall } 12530031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall return 0; 12540031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall } 12550031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall 12560031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown idletimer cmd", false); 12570031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall return 0; 12580031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall} 1259