CommandListener.cpp revision fc97b82e02979f246d56a4bfd60e4aab8686d3f6
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 17db7da58e8d2aa021060098057f944ef754be06e3JP 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" 40fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt#include "SecondaryTableController.h" 41d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 425c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 439d10b341a0ba46f108cb96e46691197d778cbc06San MehatTetherController *CommandListener::sTetherCtrl = NULL; 449ff78fb7da7158f5bd7c86d89a842691820259cfSan MehatNatController *CommandListener::sNatCtrl = NULL; 45d5573d34c8fac49e16b20cf144486125bf940086San MehatPppController *CommandListener::sPppCtrl = NULL; 461bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San MehatPanController *CommandListener::sPanCtrl = NULL; 475af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry ShmidtSoftapController *CommandListener::sSoftapCtrl = NULL; 484a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP AbgrallBandwidthController * CommandListener::sBandwidthCtrl = NULL; 4989c1e975f0c03997808d35c7be10b244c5309f9fMattias FalkResolverController *CommandListener::sResolverCtrl = NULL; 50fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert GreenwaltSecondaryTableController *CommandListener::sSecondaryTableCtrl = NULL; 519d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 52d18304287dbabc7835be771400b85d4ae8b63de6San MehatCommandListener::CommandListener() : 53d18304287dbabc7835be771400b85d4ae8b63de6San Mehat FrameworkListener("netd") { 545c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat registerCmd(new InterfaceCmd()); 55d18304287dbabc7835be771400b85d4ae8b63de6San Mehat registerCmd(new IpFwdCmd()); 56d18304287dbabc7835be771400b85d4ae8b63de6San Mehat registerCmd(new TetherCmd()); 57d18304287dbabc7835be771400b85d4ae8b63de6San Mehat registerCmd(new NatCmd()); 58d5573d34c8fac49e16b20cf144486125bf940086San Mehat registerCmd(new ListTtysCmd()); 59d5573d34c8fac49e16b20cf144486125bf940086San Mehat registerCmd(new PppdCmd()); 601bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat registerCmd(new PanCmd()); 615af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt registerCmd(new SoftapCmd()); 624a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall registerCmd(new BandwidthControlCmd()); 6389c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk registerCmd(new ResolverCmd()); 649d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 65fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt if (!sSecondaryTableCtrl) 66fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt sSecondaryTableCtrl = new SecondaryTableController(); 679d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!sTetherCtrl) 689d10b341a0ba46f108cb96e46691197d778cbc06San Mehat sTetherCtrl = new TetherController(); 699ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat if (!sNatCtrl) 70fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt sNatCtrl = new NatController(sSecondaryTableCtrl); 71d5573d34c8fac49e16b20cf144486125bf940086San Mehat if (!sPppCtrl) 72d5573d34c8fac49e16b20cf144486125bf940086San Mehat sPppCtrl = new PppController(); 731bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat if (!sPanCtrl) 741bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat sPanCtrl = new PanController(); 755af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt if (!sSoftapCtrl) 765af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt sSoftapCtrl = new SoftapController(); 774a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall if (!sBandwidthCtrl) 784a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall sBandwidthCtrl = new BandwidthController(); 7989c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk if (!sResolverCtrl) 8089c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk sResolverCtrl = new ResolverController(); 81d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 82d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 835c1b8af16dbbc20c89aaca2f93e725e12b16d055San MehatCommandListener::InterfaceCmd::InterfaceCmd() : 845c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat NetdCommand("interface") { 85d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 86d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 87c1b3870147acd0dd42e2e767df08b4d64d5d2423repo syncint CommandListener::writeFile(const char *path, const char *value, int size) { 88c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync int fd = open(path, O_WRONLY); 89c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync if (fd < 0) { 90c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync LOGE("Failed to open %s: %s", path, strerror(errno)); 91c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync return -1; 92c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync } 93c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync 94c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync if (write(fd, value, size) != size) { 95c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync LOGE("Failed to write %s: %s", path, strerror(errno)); 96c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync close(fd); 97c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync return -1; 98c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync } 99c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync close(fd); 100c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync return 0; 101c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync} 102c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync 1035c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehatint CommandListener::InterfaceCmd::runCommand(SocketClient *cli, 104d18304287dbabc7835be771400b85d4ae8b63de6San Mehat int argc, char **argv) { 1055c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (argc < 2) { 1065c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 1075c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 1085c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 1095c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 1105c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (!strcmp(argv[1], "list")) { 1115c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat DIR *d; 1125c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat struct dirent *de; 1135c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 1145c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (!(d = opendir("/sys/class/net"))) { 1155c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to open sysfs dir", true); 1165c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 1175c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 1185c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 1195c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat while((de = readdir(d))) { 1205c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (de->d_name[0] == '.') 1215c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat continue; 1225c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::InterfaceListResult, de->d_name, false); 1235c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 1245c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat closedir(d); 1255c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Interface list completed", false); 1265c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 1278e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } else if (!strcmp(argv[1], "readrxcounter")) { 1288e46896b4c4be5deaef651a12b17314f63ae9070San Mehat if (argc != 3) { 1298e46896b4c4be5deaef651a12b17314f63ae9070San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, 1308e46896b4c4be5deaef651a12b17314f63ae9070San Mehat "Usage: interface readrxcounter <interface>", false); 1318e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 1328e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 1338e46896b4c4be5deaef651a12b17314f63ae9070San Mehat unsigned long rx = 0, tx = 0; 1348e46896b4c4be5deaef651a12b17314f63ae9070San Mehat if (readInterfaceCounters(argv[2], &rx, &tx)) { 1358e46896b4c4be5deaef651a12b17314f63ae9070San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to read counters", true); 1368e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 1378e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 1388e46896b4c4be5deaef651a12b17314f63ae9070San Mehat 1398e46896b4c4be5deaef651a12b17314f63ae9070San Mehat char *msg; 1408e46896b4c4be5deaef651a12b17314f63ae9070San Mehat asprintf(&msg, "%lu", rx); 1418e46896b4c4be5deaef651a12b17314f63ae9070San Mehat cli->sendMsg(ResponseCode::InterfaceRxCounterResult, msg, false); 1428e46896b4c4be5deaef651a12b17314f63ae9070San Mehat free(msg); 1438e46896b4c4be5deaef651a12b17314f63ae9070San Mehat 1448e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 1458e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } else if (!strcmp(argv[1], "readtxcounter")) { 1468e46896b4c4be5deaef651a12b17314f63ae9070San Mehat if (argc != 3) { 1478e46896b4c4be5deaef651a12b17314f63ae9070San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, 1488e46896b4c4be5deaef651a12b17314f63ae9070San Mehat "Usage: interface readtxcounter <interface>", false); 1498e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 1508e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 1518e46896b4c4be5deaef651a12b17314f63ae9070San Mehat unsigned long rx = 0, tx = 0; 1528e46896b4c4be5deaef651a12b17314f63ae9070San Mehat if (readInterfaceCounters(argv[2], &rx, &tx)) { 1538e46896b4c4be5deaef651a12b17314f63ae9070San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to read counters", true); 1548e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 1558e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 1568e46896b4c4be5deaef651a12b17314f63ae9070San Mehat 1578e46896b4c4be5deaef651a12b17314f63ae9070San Mehat char *msg = NULL; 1588e46896b4c4be5deaef651a12b17314f63ae9070San Mehat asprintf(&msg, "%lu", tx); 1598e46896b4c4be5deaef651a12b17314f63ae9070San Mehat cli->sendMsg(ResponseCode::InterfaceTxCounterResult, msg, false); 1608e46896b4c4be5deaef651a12b17314f63ae9070San Mehat free(msg); 1618e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 1628e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } else if (!strcmp(argv[1], "getthrottle")) { 163a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat if (argc != 4 || (argc == 4 && (strcmp(argv[3], "rx") && (strcmp(argv[3], "tx"))))) { 1648e46896b4c4be5deaef651a12b17314f63ae9070San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, 1658e46896b4c4be5deaef651a12b17314f63ae9070San Mehat "Usage: interface getthrottle <interface> <rx|tx>", false); 1668e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 1678e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 168a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat int val = 0; 169a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat int rc = 0; 170a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat int voldRc = ResponseCode::InterfaceRxThrottleResult; 171a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat 172a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat if (!strcmp(argv[3], "rx")) { 173a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat rc = ThrottleController::getInterfaceRxThrottle(argv[2], &val); 174a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat } else { 175a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat rc = ThrottleController::getInterfaceTxThrottle(argv[2], &val); 176a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat voldRc = ResponseCode::InterfaceTxThrottleResult; 177a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat } 178a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat if (rc) { 179a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to get throttle", true); 180a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat } else { 181a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat char *msg = NULL; 182a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat asprintf(&msg, "%u", val); 183a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat cli->sendMsg(voldRc, msg, false); 184a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat free(msg); 185a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat return 0; 186a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat } 1878e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 1888e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } else if (!strcmp(argv[1], "setthrottle")) { 1898e46896b4c4be5deaef651a12b17314f63ae9070San Mehat if (argc != 5) { 1908e46896b4c4be5deaef651a12b17314f63ae9070San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, 191a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat "Usage: interface setthrottle <interface> <rx_kbps> <tx_kbps>", false); 1928e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 1938e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 194a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat if (ThrottleController::setInterfaceThrottle(argv[2], atoi(argv[3]), atoi(argv[4]))) { 195a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to set throttle", true); 196a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat } else { 197a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Interface throttling set", false); 198a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat } 1998e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 2005c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } else { 2015c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat /* 2025c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat * These commands take a minimum of 3 arguments 2035c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat */ 2045c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (argc < 3) { 2055c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 2065c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 2075c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 208e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt 209fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt // 0 1 2 3 4 5 6 7 210fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt // interface route add/remove iface default/secondary dest prefix gateway 211e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt if (!strcmp(argv[1], "route")) { 212e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt int prefix_length = 0; 213fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt if (argc < 8) { 214e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 215e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt return 0; 216e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } 217fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt if (sscanf(argv[6], "%d", &prefix_length) != 1) { 218e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt cli->sendMsg(ResponseCode::CommandParameterError, "Invalid route prefix", false); 219e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt return 0; 220e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } 221e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt if (!strcmp(argv[2], "add")) { 222fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt if (!strcmp(argv[4], "default")) { 223fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt if (ifc_add_route(argv[3], argv[5], prefix_length, argv[7])) { 224fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt cli->sendMsg(ResponseCode::OperationFailed, 225fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt "Failed to add route to default table", true); 226fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt } else { 227fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt cli->sendMsg(ResponseCode::CommandOkay, 228fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt "Route added to default table", false); 229fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt } 230fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt } else if (!strcmp(argv[4], "secondary")) { 231fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt return sSecondaryTableCtrl->addRoute(cli, argv[3], argv[5], 232fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt prefix_length, argv[7]); 233e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } else { 234fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt cli->sendMsg(ResponseCode::CommandParameterError, 235fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt "Invalid route type, expecting 'default' or 'secondary'", false); 236fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt return 0; 237e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } 238e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } else if (!strcmp(argv[2], "remove")) { 239fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt if (!strcmp(argv[4], "default")) { 240fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt if (ifc_remove_route(argv[3], argv[5], prefix_length, argv[7])) { 241fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt cli->sendMsg(ResponseCode::OperationFailed, 242fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt "Failed to remove route from default table", true); 243fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt } else { 244fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt cli->sendMsg(ResponseCode::CommandOkay, 245fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt "Route removed from default table", false); 246fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt } 247fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt } else if (!strcmp(argv[4], "secondary")) { 248fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt return sSecondaryTableCtrl->removeRoute(cli, argv[3], argv[5], 249fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt prefix_length, argv[7]); 250e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } else { 251fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt cli->sendMsg(ResponseCode::CommandParameterError, 252fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt "Invalid route type, expecting 'default' or 'secondary'", false); 253fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt return 0; 254e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } 255e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } else { 256e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown interface cmd", false); 257e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } 258e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt return 0; 259e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } 260e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt 2615c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (!strcmp(argv[1], "getcfg")) { 2621d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwalt struct in_addr addr; 2631d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwalt int prefixLength; 2645c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat unsigned char hwaddr[6]; 2655c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat unsigned flags = 0; 2665c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 2675c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat ifc_init(); 2685c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat memset(hwaddr, 0, sizeof(hwaddr)); 2695c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 2701d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwalt if (ifc_get_info(argv[2], &addr.s_addr, &prefixLength, &flags)) { 2715c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Interface not found", true); 272e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff ifc_close(); 2735c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 2745c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 2755c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 2765c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (ifc_get_hwaddr(argv[2], (void *) hwaddr)) { 2775c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat LOGW("Failed to retrieve HW addr for %s (%s)", argv[2], strerror(errno)); 2785c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 2795c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 2805c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat char *addr_s = strdup(inet_ntoa(addr)); 2815c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat const char *updown, *brdcst, *loopbk, *ppp, *running, *multi; 2825c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 2835c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat updown = (flags & IFF_UP) ? "up" : "down"; 2845c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat brdcst = (flags & IFF_BROADCAST) ? " broadcast" : ""; 2855c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat loopbk = (flags & IFF_LOOPBACK) ? " loopback" : ""; 2865c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat ppp = (flags & IFF_POINTOPOINT) ? " point-to-point" : ""; 2875c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat running = (flags & IFF_RUNNING) ? " running" : ""; 2885c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat multi = (flags & IFF_MULTICAST) ? " multicast" : ""; 2895c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 2905c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat char *flag_s; 2915c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 292e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt asprintf(&flag_s, "[%s%s%s%s%s%s]", updown, brdcst, loopbk, ppp, running, multi); 2935c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 2945c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat char *msg = NULL; 2951d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwalt asprintf(&msg, "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x %s %d %s", 2965c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat hwaddr[0], hwaddr[1], hwaddr[2], hwaddr[3], hwaddr[4], hwaddr[5], 2971d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwalt addr_s, prefixLength, flag_s); 2985c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 29901fed783828b592cda3b774deea4099a9e690e3dSan Mehat cli->sendMsg(ResponseCode::InterfaceGetCfgResult, msg, false); 3005c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 3015c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat free(addr_s); 3025c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat free(flag_s); 3035c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat free(msg); 304e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff 305e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff ifc_close(); 3065c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 3075c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } else if (!strcmp(argv[1], "setcfg")) { 3081d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwalt // arglist: iface addr prefixLength [flags] 3095c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (argc < 5) { 3105c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 3115c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 3125c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 313e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt LOGD("Setting iface cfg"); 3145c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 3151d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwalt struct in_addr addr; 3165c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat unsigned flags = 0; 3175c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 3185c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (!inet_aton(argv[3], &addr)) { 3195c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandParameterError, "Invalid address", false); 3205c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 3215c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 3225c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 3235c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat ifc_init(); 3245c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (ifc_set_addr(argv[2], addr.s_addr)) { 3255c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to set address", true); 326e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff ifc_close(); 3275c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 3285c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 3295c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 330ab374f426a0d1d8598f3eb4b0339440dcb313a1aIrfan Sheriff //Set prefix length on a non zero address 331ab374f426a0d1d8598f3eb4b0339440dcb313a1aIrfan Sheriff if (addr.s_addr != 0 && ifc_set_prefixLength(argv[2], atoi(argv[4]))) { 3321d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwalt cli->sendMsg(ResponseCode::OperationFailed, "Failed to set prefixLength", true); 333e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff ifc_close(); 3345c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 3355c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 3365c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 3375c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat /* Process flags */ 338e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt /* read from "[XX" arg to "YY]" arg */ 339e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt bool bStarted = false; 3405c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat for (int i = 5; i < argc; i++) { 341e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt char *flag = argv[i]; 342e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt if (!bStarted) { 343e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt if (*flag == '[') { 344e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt flag++; 345e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt bStarted = true; 346e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt } else { 347e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt continue; 348e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt } 349e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt } 350e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt int len = strlen(flag); 351e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt if (flag[len-1] == ']') { 352e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt i = argc; // stop after this loop 353e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt flag[len-1] = 0; 354e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt } 355e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt if (!strcmp(flag, "up")) { 356e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt LOGD("Trying to bring up %s", argv[2]); 3575c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (ifc_up(argv[2])) { 3585c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat LOGE("Error upping interface"); 3595c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to up interface", true); 360e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff ifc_close(); 3615c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 3625c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 363e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt } else if (!strcmp(flag, "down")) { 364e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt LOGD("Trying to bring down %s", argv[2]); 3655c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (ifc_down(argv[2])) { 3665c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat LOGE("Error downing interface"); 3675c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to down interface", true); 368e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff ifc_close(); 3695c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 3705c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 371e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt } else if (!strcmp(flag, "broadcast")) { 372e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt LOGD("broadcast flag ignored"); 373e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt } else if (!strcmp(flag, "multicast")) { 374e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt LOGD("multicast flag ignored"); 3755c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } else { 3765c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandParameterError, "Flag unsupported", false); 377e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff ifc_close(); 3785c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 3795c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 3805c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 381e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff 3825c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Interface configuration set", false); 383e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff ifc_close(); 384e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff return 0; 385e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff } else if (!strcmp(argv[1], "clearaddrs")) { 386e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff // arglist: iface 387e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff LOGD("Clearing all IP addresses on %s", argv[2]); 388e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff 3891ed47c4a016e420a855ee46922e512150245ff61Lorenzo Colitti ifc_clear_addresses(argv[2]); 3901ed47c4a016e420a855ee46922e512150245ff61Lorenzo Colitti 391e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff cli->sendMsg(ResponseCode::CommandOkay, "Interface IP addresses cleared", false); 3925c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 39332a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff } else if (!strcmp(argv[1], "ipv6privacyextensions")) { 39432a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff if (argc != 4) { 39532a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff cli->sendMsg(ResponseCode::CommandSyntaxError, 39632a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff "Usage: interface ipv6privacyextensions <interface> <enable|disable>", 39732a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff false); 39832a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff return 0; 39932a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff } 40032a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff 401c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync char *tmp; 40232a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff asprintf(&tmp, "/proc/sys/net/ipv6/conf/%s/use_tempaddr", argv[2]); 403c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync 404c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync if (writeFile(tmp, !strncmp(argv[3], "enable", 7) ? "2" : "0", 1) < 0) { 40532a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff free(tmp); 40632a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff cli->sendMsg(ResponseCode::OperationFailed, 40732a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff "Failed to set ipv6 privacy extensions", true); 40832a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff return 0; 40932a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff } 41032a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff 411c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync free(tmp); 412c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync cli->sendMsg(ResponseCode::CommandOkay, "IPv6 privacy extensions changed", false); 413c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync return 0; 414c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync } else if (!strcmp(argv[1], "ipv6")) { 415c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync if (argc != 4) { 416c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync cli->sendMsg(ResponseCode::CommandSyntaxError, 417c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync "Usage: interface ipv6 <interface> <enable|disable>", 418c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync false); 419c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync return 0; 420c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync } 421c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync 422c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync char *tmp; 423c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync asprintf(&tmp, "/proc/sys/net/ipv6/conf/%s/disable_ipv6", argv[2]); 424c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync 425c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync if (writeFile(tmp, !strncmp(argv[3], "enable", 7) ? "0" : "1", 1) < 0) { 42632a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff free(tmp); 42732a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff cli->sendMsg(ResponseCode::OperationFailed, 428c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync "Failed to change IPv6 state", true); 42932a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff return 0; 43032a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff } 431c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync 43232a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff free(tmp); 433c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync cli->sendMsg(ResponseCode::CommandOkay, "IPv6 state changed", false); 43432a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff return 0; 4355c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } else { 4365c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown interface cmd", false); 4375c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 4385c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 4395c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 440d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return 0; 441d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 442d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 4434a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall 444d5573d34c8fac49e16b20cf144486125bf940086San MehatCommandListener::ListTtysCmd::ListTtysCmd() : 445d5573d34c8fac49e16b20cf144486125bf940086San Mehat NetdCommand("list_ttys") { 446d5573d34c8fac49e16b20cf144486125bf940086San Mehat} 447d5573d34c8fac49e16b20cf144486125bf940086San Mehat 448d5573d34c8fac49e16b20cf144486125bf940086San Mehatint CommandListener::ListTtysCmd::runCommand(SocketClient *cli, 449d5573d34c8fac49e16b20cf144486125bf940086San Mehat int argc, char **argv) { 450d5573d34c8fac49e16b20cf144486125bf940086San Mehat TtyCollection *tlist = sPppCtrl->getTtyList(); 451d5573d34c8fac49e16b20cf144486125bf940086San Mehat TtyCollection::iterator it; 452d5573d34c8fac49e16b20cf144486125bf940086San Mehat 453d5573d34c8fac49e16b20cf144486125bf940086San Mehat for (it = tlist->begin(); it != tlist->end(); ++it) { 454d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::TtyListResult, *it, false); 455d5573d34c8fac49e16b20cf144486125bf940086San Mehat } 456d5573d34c8fac49e16b20cf144486125bf940086San Mehat 457d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Ttys listed.", false); 458d5573d34c8fac49e16b20cf144486125bf940086San Mehat return 0; 459d5573d34c8fac49e16b20cf144486125bf940086San Mehat} 460d5573d34c8fac49e16b20cf144486125bf940086San Mehat 461d18304287dbabc7835be771400b85d4ae8b63de6San MehatCommandListener::IpFwdCmd::IpFwdCmd() : 462d18304287dbabc7835be771400b85d4ae8b63de6San Mehat NetdCommand("ipfwd") { 463d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 464d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 465d18304287dbabc7835be771400b85d4ae8b63de6San Mehatint CommandListener::IpFwdCmd::runCommand(SocketClient *cli, 466d18304287dbabc7835be771400b85d4ae8b63de6San Mehat int argc, char **argv) { 4679d10b341a0ba46f108cb96e46691197d778cbc06San Mehat int rc = 0; 4689d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 4699d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (argc < 2) { 4709d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 4719d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 4729d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 4739d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 4749d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!strcmp(argv[1], "status")) { 4759d10b341a0ba46f108cb96e46691197d778cbc06San Mehat char *tmp = NULL; 4769d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 4779d10b341a0ba46f108cb96e46691197d778cbc06San Mehat asprintf(&tmp, "Forwarding %s", (sTetherCtrl->getIpFwdEnabled() ? "enabled" : "disabled")); 4789d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::IpFwdStatusResult, tmp, false); 4799d10b341a0ba46f108cb96e46691197d778cbc06San Mehat free(tmp); 4809d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 4819d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[1], "enable")) { 4829d10b341a0ba46f108cb96e46691197d778cbc06San Mehat rc = sTetherCtrl->setIpFwdEnabled(true); 4839d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[1], "disable")) { 4849d10b341a0ba46f108cb96e46691197d778cbc06San Mehat rc = sTetherCtrl->setIpFwdEnabled(false); 4859d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 4869d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown ipfwd cmd", false); 4879d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 4889d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 4899d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 4909d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!rc) { 4919d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandOkay, "ipfwd operation succeeded", false); 4929d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 4939d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::OperationFailed, "ipfwd operation failed", true); 4949d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 495d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 496d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return 0; 497d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 498d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 499d18304287dbabc7835be771400b85d4ae8b63de6San MehatCommandListener::TetherCmd::TetherCmd() : 500d18304287dbabc7835be771400b85d4ae8b63de6San Mehat NetdCommand("tether") { 501d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 502d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 503d18304287dbabc7835be771400b85d4ae8b63de6San Mehatint CommandListener::TetherCmd::runCommand(SocketClient *cli, 504d18304287dbabc7835be771400b85d4ae8b63de6San Mehat int argc, char **argv) { 5059d10b341a0ba46f108cb96e46691197d778cbc06San Mehat int rc = 0; 5069d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 507d18304287dbabc7835be771400b85d4ae8b63de6San Mehat if (argc < 2) { 508d18304287dbabc7835be771400b85d4ae8b63de6San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 509d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return 0; 510d18304287dbabc7835be771400b85d4ae8b63de6San Mehat } 511d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 5129d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!strcmp(argv[1], "stop")) { 5139d10b341a0ba46f108cb96e46691197d778cbc06San Mehat rc = sTetherCtrl->stopTethering(); 514d18304287dbabc7835be771400b85d4ae8b63de6San Mehat } else if (!strcmp(argv[1], "status")) { 5159d10b341a0ba46f108cb96e46691197d778cbc06San Mehat char *tmp = NULL; 5169d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 5179d10b341a0ba46f108cb96e46691197d778cbc06San Mehat asprintf(&tmp, "Tethering services %s", 5189d10b341a0ba46f108cb96e46691197d778cbc06San Mehat (sTetherCtrl->isTetheringStarted() ? "started" : "stopped")); 5199d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::TetherStatusResult, tmp, false); 5209d10b341a0ba46f108cb96e46691197d778cbc06San Mehat free(tmp); 521d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return 0; 5229d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 5239d10b341a0ba46f108cb96e46691197d778cbc06San Mehat /* 5249d10b341a0ba46f108cb96e46691197d778cbc06San Mehat * These commands take a minimum of 4 arguments 5259d10b341a0ba46f108cb96e46691197d778cbc06San Mehat */ 5269d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (argc < 4) { 5279d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 5289d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 5299d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 5309d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 5319d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!strcmp(argv[1], "start")) { 5323208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt if (argc % 2 == 1) { 5333208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt cli->sendMsg(ResponseCode::CommandSyntaxError, "Bad number of arguments", false); 5349d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 5359d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 5363208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt 5373208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt int num_addrs = argc - 2; 5383208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt int arg_index = 2; 5393208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt int array_index = 0; 5403208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt in_addr *addrs = (in_addr *)malloc(sizeof(in_addr) * num_addrs); 5413208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt while (array_index < num_addrs) { 5423208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt if (!inet_aton(argv[arg_index++], &(addrs[array_index++]))) { 5433208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt cli->sendMsg(ResponseCode::CommandParameterError, "Invalid address", false); 5443208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt free(addrs); 5453208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt return 0; 5463208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt } 5479d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 5483208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt rc = sTetherCtrl->startTethering(num_addrs, addrs); 5493208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt free(addrs); 5509d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[1], "interface")) { 5519d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!strcmp(argv[2], "add")) { 5529d10b341a0ba46f108cb96e46691197d778cbc06San Mehat rc = sTetherCtrl->tetherInterface(argv[3]); 5539d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[2], "remove")) { 5549d10b341a0ba46f108cb96e46691197d778cbc06San Mehat rc = sTetherCtrl->untetherInterface(argv[3]); 5559d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[2], "list")) { 5569d10b341a0ba46f108cb96e46691197d778cbc06San Mehat InterfaceCollection *ilist = sTetherCtrl->getTetheredInterfaceList(); 5579d10b341a0ba46f108cb96e46691197d778cbc06San Mehat InterfaceCollection::iterator it; 5589d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 5599d10b341a0ba46f108cb96e46691197d778cbc06San Mehat for (it = ilist->begin(); it != ilist->end(); ++it) { 5609d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::TetherInterfaceListResult, *it, false); 5619d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 5629d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 5639d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandParameterError, 5649d10b341a0ba46f108cb96e46691197d778cbc06San Mehat "Unknown tether interface operation", false); 5659d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 5669d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 5679d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[1], "dns")) { 5689d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!strcmp(argv[2], "set")) { 5699d10b341a0ba46f108cb96e46691197d778cbc06San Mehat rc = sTetherCtrl->setDnsForwarders(&argv[3], argc - 3); 5709d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[2], "list")) { 5719d10b341a0ba46f108cb96e46691197d778cbc06San Mehat NetAddressCollection *dlist = sTetherCtrl->getDnsForwarders(); 5729d10b341a0ba46f108cb96e46691197d778cbc06San Mehat NetAddressCollection::iterator it; 5739d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 5749d10b341a0ba46f108cb96e46691197d778cbc06San Mehat for (it = dlist->begin(); it != dlist->end(); ++it) { 5759d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::TetherDnsFwdTgtListResult, inet_ntoa(*it), false); 5769d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 5779d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 5789d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandParameterError, 5799d10b341a0ba46f108cb96e46691197d778cbc06San Mehat "Unknown tether interface operation", false); 5809d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 5819d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 5829d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 5839d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown tether cmd", false); 5849d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 5859d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 5869d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 5879d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 5889d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!rc) { 5899d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Tether operation succeeded", false); 5909d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 5919d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Tether operation failed", true); 592d18304287dbabc7835be771400b85d4ae8b63de6San Mehat } 593d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 594d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return 0; 595d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 596d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 597d18304287dbabc7835be771400b85d4ae8b63de6San MehatCommandListener::NatCmd::NatCmd() : 598d18304287dbabc7835be771400b85d4ae8b63de6San Mehat NetdCommand("nat") { 599d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 600d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 601d18304287dbabc7835be771400b85d4ae8b63de6San Mehatint CommandListener::NatCmd::runCommand(SocketClient *cli, 602d18304287dbabc7835be771400b85d4ae8b63de6San Mehat int argc, char **argv) { 6039d10b341a0ba46f108cb96e46691197d778cbc06San Mehat int rc = 0; 6049d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 605fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt if (argc < 5) { 6069d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 6079d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 6089d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 6099d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 6109ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat if (!strcmp(argv[1], "enable")) { 611fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt rc = sNatCtrl->enableNat(argc, argv); 612c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall if(!rc) { 613c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall /* Ignore ifaces for now. */ 614c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall rc = sBandwidthCtrl->setGlobalAlertInForwardChain(); 615c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall } 6169ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat } else if (!strcmp(argv[1], "disable")) { 617f7bf29c8a37d65e132a4dceb7c5a4200ed5c3d79Robert Greenwalt /* Ignore ifaces for now. */ 618fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt rc = sBandwidthCtrl->removeGlobalAlertInForwardChain(); 619fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt rc |= sNatCtrl->disableNat(argc, argv); 6209d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 6219d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown nat cmd", false); 6229d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 6239d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 6249d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 6259d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!rc) { 6269d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Nat operation succeeded", false); 6279d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 6289d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Nat operation failed", true); 6299d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 630d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 631d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return 0; 632d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 633d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 634d5573d34c8fac49e16b20cf144486125bf940086San MehatCommandListener::PppdCmd::PppdCmd() : 635d5573d34c8fac49e16b20cf144486125bf940086San Mehat NetdCommand("pppd") { 636d5573d34c8fac49e16b20cf144486125bf940086San Mehat} 637d5573d34c8fac49e16b20cf144486125bf940086San Mehat 638d5573d34c8fac49e16b20cf144486125bf940086San Mehatint CommandListener::PppdCmd::runCommand(SocketClient *cli, 639d5573d34c8fac49e16b20cf144486125bf940086San Mehat int argc, char **argv) { 640d5573d34c8fac49e16b20cf144486125bf940086San Mehat int rc = 0; 641d5573d34c8fac49e16b20cf144486125bf940086San Mehat 642d5573d34c8fac49e16b20cf144486125bf940086San Mehat if (argc < 3) { 643d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 644d5573d34c8fac49e16b20cf144486125bf940086San Mehat return 0; 645d5573d34c8fac49e16b20cf144486125bf940086San Mehat } 646d5573d34c8fac49e16b20cf144486125bf940086San Mehat 647d5573d34c8fac49e16b20cf144486125bf940086San Mehat if (!strcmp(argv[1], "attach")) { 64874d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt struct in_addr l, r, dns1, dns2; 64974d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt 65074d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt memset(&dns1, sizeof(struct in_addr), 0); 65174d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt memset(&dns2, sizeof(struct in_addr), 0); 652d5573d34c8fac49e16b20cf144486125bf940086San Mehat 653d5573d34c8fac49e16b20cf144486125bf940086San Mehat if (!inet_aton(argv[3], &l)) { 654d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::CommandParameterError, "Invalid local address", false); 655d5573d34c8fac49e16b20cf144486125bf940086San Mehat return 0; 656d5573d34c8fac49e16b20cf144486125bf940086San Mehat } 657d5573d34c8fac49e16b20cf144486125bf940086San Mehat if (!inet_aton(argv[4], &r)) { 658d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::CommandParameterError, "Invalid remote address", false); 659d5573d34c8fac49e16b20cf144486125bf940086San Mehat return 0; 660d5573d34c8fac49e16b20cf144486125bf940086San Mehat } 66174d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt if ((argc > 3) && (!inet_aton(argv[5], &dns1))) { 66274d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt cli->sendMsg(ResponseCode::CommandParameterError, "Invalid dns1 address", false); 66374d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt return 0; 66474d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt } 66574d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt if ((argc > 4) && (!inet_aton(argv[6], &dns2))) { 66674d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt cli->sendMsg(ResponseCode::CommandParameterError, "Invalid dns2 address", false); 66774d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt return 0; 66874d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt } 66974d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt rc = sPppCtrl->attachPppd(argv[2], l, r, dns1, dns2); 670d5573d34c8fac49e16b20cf144486125bf940086San Mehat } else if (!strcmp(argv[1], "detach")) { 671d5573d34c8fac49e16b20cf144486125bf940086San Mehat rc = sPppCtrl->detachPppd(argv[2]); 672d5573d34c8fac49e16b20cf144486125bf940086San Mehat } else { 673d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown pppd cmd", false); 674d5573d34c8fac49e16b20cf144486125bf940086San Mehat return 0; 675d5573d34c8fac49e16b20cf144486125bf940086San Mehat } 676d5573d34c8fac49e16b20cf144486125bf940086San Mehat 677d5573d34c8fac49e16b20cf144486125bf940086San Mehat if (!rc) { 678d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Pppd operation succeeded", false); 679d5573d34c8fac49e16b20cf144486125bf940086San Mehat } else { 680d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Pppd operation failed", true); 681d5573d34c8fac49e16b20cf144486125bf940086San Mehat } 682d5573d34c8fac49e16b20cf144486125bf940086San Mehat 683d5573d34c8fac49e16b20cf144486125bf940086San Mehat return 0; 684d5573d34c8fac49e16b20cf144486125bf940086San Mehat} 6851bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat 6861bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San MehatCommandListener::PanCmd::PanCmd() : 6871bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat NetdCommand("pan") { 6881bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat} 6891bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat 6901bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehatint CommandListener::PanCmd::runCommand(SocketClient *cli, 6911bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat int argc, char **argv) { 6921bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat int rc = 0; 6931bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat 6941bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat if (argc < 2) { 6951bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 6961bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat return 0; 6971bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat } 6981bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat 6991bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat if (!strcmp(argv[1], "start")) { 7001bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat rc = sPanCtrl->startPan(); 7011bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat } else if (!strcmp(argv[1], "stop")) { 7021bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat rc = sPanCtrl->stopPan(); 7031bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat } else if (!strcmp(argv[1], "status")) { 7041bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat char *tmp = NULL; 7051bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat 7061bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat asprintf(&tmp, "Pan services %s", 7071bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat (sPanCtrl->isPanStarted() ? "started" : "stopped")); 7081bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat cli->sendMsg(ResponseCode::PanStatusResult, tmp, false); 7091bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat free(tmp); 7101bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat return 0; 7111bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat } else { 7121bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown pan cmd", false); 7131bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat return 0; 7141bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat } 7151bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat 7161bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat if (!rc) { 7171bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Pan operation succeeded", false); 7181bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat } else { 7191bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Pan operation failed", true); 7201bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat } 7211bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat 7221bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat return 0; 7231bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat} 7245af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 7255af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry ShmidtCommandListener::SoftapCmd::SoftapCmd() : 7265af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt NetdCommand("softap") { 7275af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt} 7285af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 7295af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidtint CommandListener::SoftapCmd::runCommand(SocketClient *cli, 7305af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt int argc, char **argv) { 73131fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt int rc = 0, flag = 0; 732666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt char *retbuf = NULL; 7335af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 7345af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt if (argc < 2) { 7355af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt cli->sendMsg(ResponseCode::CommandSyntaxError, "Softap Missing argument", false); 7365af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt return 0; 7375af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } 7385af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 7395af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt if (!strcmp(argv[1], "start")) { 740c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt rc = sSoftapCtrl->startDriver(argv[2]); 7415af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } else if (!strcmp(argv[1], "stop")) { 742c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt rc = sSoftapCtrl->stopDriver(argv[2]); 743c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt } else if (!strcmp(argv[1], "startap")) { 744c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt rc = sSoftapCtrl->startSoftap(); 745c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt } else if (!strcmp(argv[1], "stopap")) { 7465af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt rc = sSoftapCtrl->stopSoftap(); 74731fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt } else if (!strcmp(argv[1], "fwreload")) { 74831fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt rc = sSoftapCtrl->fwReloadSoftap(argc, argv); 749666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt } else if (!strcmp(argv[1], "clients")) { 750666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt rc = sSoftapCtrl->clientsSoftap(&retbuf); 751666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt if (!rc) { 752666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt cli->sendMsg(ResponseCode::CommandOkay, retbuf, false); 753666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt free(retbuf); 754666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt return 0; 755666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt } 7565af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } else if (!strcmp(argv[1], "status")) { 757666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt asprintf(&retbuf, "Softap service %s", 7585af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt (sSoftapCtrl->isSoftapStarted() ? "started" : "stopped")); 759666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt cli->sendMsg(ResponseCode::SoftapStatusResult, retbuf, false); 760666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt free(retbuf); 7615af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt return 0; 7625af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } else if (!strcmp(argv[1], "set")) { 7635af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt rc = sSoftapCtrl->setSoftap(argc, argv); 7645af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } else { 7655af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt cli->sendMsg(ResponseCode::CommandSyntaxError, "Softap Unknown cmd", false); 7665af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt return 0; 7675af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } 7685af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 7695af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt if (!rc) { 7705af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt cli->sendMsg(ResponseCode::CommandOkay, "Softap operation succeeded", false); 7715af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } else { 7725af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt cli->sendMsg(ResponseCode::OperationFailed, "Softap operation failed", true); 7735af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } 7745af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 7755af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt return 0; 7765af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt} 7773e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt 77889c1e975f0c03997808d35c7be10b244c5309f9fMattias FalkCommandListener::ResolverCmd::ResolverCmd() : 77989c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk NetdCommand("resolver") { 78089c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk} 78189c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk 78289c1e975f0c03997808d35c7be10b244c5309f9fMattias Falkint CommandListener::ResolverCmd::runCommand(SocketClient *cli, int argc, char **argv) { 78389c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk int rc = 0; 78489c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk struct in_addr addr; 78589c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk 78689c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk if (argc < 2) { 78789c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk cli->sendMsg(ResponseCode::CommandSyntaxError, "Resolver missing arguments", false); 78889c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk return 0; 78989c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } 79089c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk 79189c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk if (!strcmp(argv[1], "setdefaultif")) { // "resolver setdefaultif <iface>" 79289c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk if (argc == 3) { 79389c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk rc = sResolverCtrl->setDefaultInterface(argv[2]); 79489c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } else { 79589c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk cli->sendMsg(ResponseCode::CommandSyntaxError, 79689c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk "Wrong number of arguments to resolver setdefaultif", false); 79789c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk return 0; 79889c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } 79989c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } else if (!strcmp(argv[1], "setifdns")) { // "resolver setifdns <iface> <dns1> <dns2> ..." 80089c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk if (argc >= 4) { 80189c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk rc = sResolverCtrl->setInterfaceDnsServers(argv[2], &argv[3], argc - 3); 80289c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } else { 80389c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk cli->sendMsg(ResponseCode::CommandSyntaxError, 80489c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk "Wrong number of arguments to resolver setifdns", false); 80589c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk return 0; 80689c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } 80789c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk 80889c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk // set the address of the interface to which the name servers 80989c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk // are bound. Required in order to bind to right interface when 81089c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk // doing the dns query. 81189c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk if (!rc) { 81289c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk ifc_init(); 81389c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk ifc_get_info(argv[2], &addr.s_addr, NULL, 0); 81489c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk 81589c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk rc = sResolverCtrl->setInterfaceAddress(argv[2], &addr); 81689c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } 81789c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } else if (!strcmp(argv[1], "flushdefaultif")) { // "resolver flushdefaultif" 81889c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk if (argc == 2) { 81989c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk rc = sResolverCtrl->flushDefaultDnsCache(); 82089c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } else { 82189c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk cli->sendMsg(ResponseCode::CommandSyntaxError, 82289c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk "Wrong number of arguments to resolver flushdefaultif", false); 82389c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk return 0; 82489c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } 82589c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } else if (!strcmp(argv[1], "flushif")) { // "resolver flushif <iface>" 82689c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk if (argc == 3) { 82789c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk rc = sResolverCtrl->flushInterfaceDnsCache(argv[2]); 82889c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } else { 82989c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk cli->sendMsg(ResponseCode::CommandSyntaxError, 83089c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk "Wrong number of arguments to resolver setdefaultif", false); 83189c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk return 0; 83289c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } 83389c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } else { 83489c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk cli->sendMsg(ResponseCode::CommandSyntaxError,"Resolver unknown command", false); 83589c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk return 0; 83689c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } 83789c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk 83889c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk if (!rc) { 83989c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk cli->sendMsg(ResponseCode::CommandOkay, "Resolver command succeeded", false); 84089c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } else { 84189c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk cli->sendMsg(ResponseCode::OperationFailed, "Resolver command failed", true); 84289c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } 84389c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk 84489c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk return 0; 84589c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk} 84689c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk 8478e46896b4c4be5deaef651a12b17314f63ae9070San Mehatint CommandListener::readInterfaceCounters(const char *iface, unsigned long *rx, unsigned long *tx) { 8488e46896b4c4be5deaef651a12b17314f63ae9070San Mehat FILE *fp = fopen("/proc/net/dev", "r"); 8498e46896b4c4be5deaef651a12b17314f63ae9070San Mehat if (!fp) { 8508e46896b4c4be5deaef651a12b17314f63ae9070San Mehat LOGE("Failed to open /proc/net/dev (%s)", strerror(errno)); 8518e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return -1; 8528e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 8538e46896b4c4be5deaef651a12b17314f63ae9070San Mehat 8548e46896b4c4be5deaef651a12b17314f63ae9070San Mehat char buffer[512]; 8558e46896b4c4be5deaef651a12b17314f63ae9070San Mehat 8568e46896b4c4be5deaef651a12b17314f63ae9070San Mehat fgets(buffer, sizeof(buffer), fp); // Header 1 8578e46896b4c4be5deaef651a12b17314f63ae9070San Mehat fgets(buffer, sizeof(buffer), fp); // Header 2 8588e46896b4c4be5deaef651a12b17314f63ae9070San Mehat while(fgets(buffer, sizeof(buffer), fp)) { 8598e46896b4c4be5deaef651a12b17314f63ae9070San Mehat buffer[strlen(buffer)-1] = '\0'; 8608e46896b4c4be5deaef651a12b17314f63ae9070San Mehat 861651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt char name[31]; 8628e46896b4c4be5deaef651a12b17314f63ae9070San Mehat unsigned long d; 863651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt sscanf(buffer, "%30s %lu %lu %lu %lu %lu %lu %lu %lu %lu", 8648e46896b4c4be5deaef651a12b17314f63ae9070San Mehat name, rx, &d, &d, &d, &d, &d, &d, &d, tx); 865651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt char *rxString = strchr(name, ':'); 866651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt *rxString = '\0'; 867651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt rxString++; 868651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt // when the rx count gets too big it changes from "name: 999" to "name:1000" 869651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt // and the sscanf munge the two together. Detect that and fix 870651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt // note that all the %lu will be off by one and the real tx value will be in d 871651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt if (*rxString != '\0') { 872651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt *tx = d; 873651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt sscanf(rxString, "%20lu", rx); 874651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt } 8758e46896b4c4be5deaef651a12b17314f63ae9070San Mehat if (strcmp(name, iface)) { 8768e46896b4c4be5deaef651a12b17314f63ae9070San Mehat continue; 8778e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 8788e46896b4c4be5deaef651a12b17314f63ae9070San Mehat fclose(fp); 8798e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 8808e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 8818e46896b4c4be5deaef651a12b17314f63ae9070San Mehat 8828e46896b4c4be5deaef651a12b17314f63ae9070San Mehat fclose(fp); 88331c61c80a013bd1a050f0f4103e13fba62bf1717Robert Greenwalt *rx = 0; 88431c61c80a013bd1a050f0f4103e13fba62bf1717Robert Greenwalt *tx = 0; 88531c61c80a013bd1a050f0f4103e13fba62bf1717Robert Greenwalt return 0; 8868e46896b4c4be5deaef651a12b17314f63ae9070San Mehat} 8874a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall 8884a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP AbgrallCommandListener::BandwidthControlCmd::BandwidthControlCmd() : 8890dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall NetdCommand("bandwidth") { 8904a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall} 8914a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall 892db7da58e8d2aa021060098057f944ef754be06e3JP Abgrallvoid CommandListener::BandwidthControlCmd::sendGenericSyntaxError(SocketClient *cli, const char *usageMsg) { 893db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall char *msg; 894db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall asprintf(&msg, "Usage: bandwidth %s", usageMsg); 895db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, msg, false); 896db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall free(msg); 897db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall} 898db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 899db7da58e8d2aa021060098057f944ef754be06e3JP Abgrallvoid CommandListener::BandwidthControlCmd::sendGenericOkFail(SocketClient *cli, int cond) { 900db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!cond) { 901db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall cli->sendMsg(ResponseCode::CommandOkay, "Bandwidth command succeeeded", false); 902db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } else { 903db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall cli->sendMsg(ResponseCode::OperationFailed, "Bandwidth command failed", false); 904db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 905db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall} 906db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 907db7da58e8d2aa021060098057f944ef754be06e3JP Abgrallvoid CommandListener::BandwidthControlCmd::sendGenericOpFailed(SocketClient *cli, const char *errMsg) { 908db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall cli->sendMsg(ResponseCode::OperationFailed, errMsg, false); 909db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall} 910db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 911fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrallint CommandListener::BandwidthControlCmd::runCommand(SocketClient *cli, int argc, char **argv) { 9124a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall if (argc < 2) { 913db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "<cmds> <args...>"); 9144a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall return 0; 9154a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall } 9164a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall 917db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall LOGV("bwctrlcmd: argc=%d %s %s ...", argc, argv[0], argv[1]); 918db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 9194a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall if (!strcmp(argv[1], "enable")) { 920db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->enableBandwidthControl(); 921db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 922db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 923db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 924db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 925db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "disable")) { 926db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->disableBandwidthControl(); 927db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 928db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 9290dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall 930db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 931db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "removequota") || !strcmp(argv[1], "rq")) { 932fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall if (argc != 3) { 933db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "removequota <interface>"); 934fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall return 0; 935fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall } 936db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->removeInterfaceSharedQuota(argv[2]); 937db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 938db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 939fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall 940db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 941db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "getquota") || !strcmp(argv[1], "gq")) { 9428a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall int64_t bytes; 9438a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (argc != 2) { 944db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "getquota"); 9458a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 9468a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 947db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->getInterfaceSharedQuota(&bytes); 9488a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (rc) { 949db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOpFailed(cli, "Failed to get quota"); 9508a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 9518a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 952db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 9538a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall char *msg; 9548a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall asprintf(&msg, "%lld", bytes); 9558a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall cli->sendMsg(ResponseCode::QuotaCounterResult, msg, false); 9568a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall free(msg); 957db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 9588a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall 959db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 960db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "getiquota") || !strcmp(argv[1], "giq")) { 9618a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall int64_t bytes; 9628a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (argc != 3) { 963db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "getiquota <iface>"); 9648a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 9658a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 966db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 967db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->getInterfaceQuota(argv[2], &bytes); 9688a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (rc) { 969db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOpFailed(cli, "Failed to get quota"); 9708a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 9718a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 9728a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall char *msg; 9738a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall asprintf(&msg, "%lld", bytes); 9748a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall cli->sendMsg(ResponseCode::QuotaCounterResult, msg, false); 9758a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall free(msg); 976db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 9778a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall 978db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 979db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "setquota") || !strcmp(argv[1], "sq")) { 980fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall if (argc != 4) { 981db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "setquota <interface> <bytes>"); 982fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall return 0; 983fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall } 984db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->setInterfaceSharedQuota(argv[2], atoll(argv[3])); 985db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 986db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 987db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 988db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "setquotas") || !strcmp(argv[1], "sqs")) { 989db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc; 990fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall if (argc < 4) { 991db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "setquotas <bytes> <interface> ..."); 992fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall return 0; 993fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall } 994db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 9958a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall for (int q = 3; argc >= 4; q++, argc--) { 9960dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall rc = sBandwidthCtrl->setInterfaceSharedQuota(argv[q], atoll(argv[2])); 9970dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall if (rc) { 9980dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall char *msg; 9990dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall asprintf(&msg, "bandwidth setquotas %s %s failed", argv[2], argv[q]); 10000dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall cli->sendMsg(ResponseCode::OperationFailed, 10010dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall msg, false); 10020dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall free(msg); 1003db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 10040dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall } 10050dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall } 1006db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1007db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 10080dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall 1009db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1010db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "removequotas") || !strcmp(argv[1], "rqs")) { 1011db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc; 10120dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall if (argc < 3) { 1013db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "removequotas <interface> ..."); 10140dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall return 0; 10150dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall } 1016db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 10178a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall for (int q = 2; argc >= 3; q++, argc--) { 10180dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall rc = sBandwidthCtrl->removeInterfaceSharedQuota(argv[q]); 10190dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall if (rc) { 10200dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall char *msg; 10210dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall asprintf(&msg, "bandwidth removequotas %s failed", argv[q]); 10220dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall cli->sendMsg(ResponseCode::OperationFailed, 10230dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall msg, false); 10240dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall free(msg); 1025db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 10260dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall } 10270dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall } 1028db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1029db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 10300dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall 1031db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1032db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "removeiquota") || !strcmp(argv[1], "riq")) { 10330dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall if (argc != 3) { 1034db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "removeiquota <interface>"); 10350dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall return 0; 10360dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall } 1037db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->removeInterfaceQuota(argv[2]); 1038db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1039db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 10400dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall 1041db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1042db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "setiquota") || !strcmp(argv[1], "siq")) { 10430dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall if (argc != 4) { 1044db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "setiquota <interface> <bytes>"); 10450dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall return 0; 10460dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall } 1047db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->setInterfaceQuota(argv[2], atoll(argv[3])); 1048db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1049db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 1050fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall 1051db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1052db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "addnaughtyapps") || !strcmp(argv[1], "ana")) { 1053fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall if (argc < 3) { 1054db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "addnaughtyapps <appUid> ..."); 10554a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall return 0; 1056fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall } 1057db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->addNaughtyApps(argc - 2, argv + 2); 1058db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1059db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 1060db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 1061fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall 1062db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1063db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "removenaughtyapps") || !strcmp(argv[1], "rna")) { 1064fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall if (argc < 3) { 1065db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "removenaughtyapps <appUid> ..."); 1066fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall return 0; 1067fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall } 1068db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->removeNaughtyApps(argc - 2, argv + 2); 1069db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1070db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 1071fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall 1072db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1073db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "setglobalalert") || !strcmp(argv[1], "sga")) { 10748a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (argc != 3) { 1075db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "setglobalalert <bytes>"); 10768a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 10778a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 1078db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->setGlobalAlert(atoll(argv[2])); 1079db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1080db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 10818a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall 1082db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1083c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall if (!strcmp(argv[1], "debugsettetherglobalalert") || !strcmp(argv[1], "dstga")) { 1084c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall if (argc != 4) { 1085c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall sendGenericSyntaxError(cli, "debugsettetherglobalalert <interface0> <interface1>"); 1086c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall return 0; 1087c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall } 1088c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall /* We ignore the interfaces for now. */ 1089c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall int rc = sBandwidthCtrl->setGlobalAlertInForwardChain(); 1090c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall sendGenericOkFail(cli, rc); 1091c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall return 0; 1092c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall 1093c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall } 1094db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "removeglobalalert") || !strcmp(argv[1], "rga")) { 10958a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (argc != 2) { 1096db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "removeglobalalert"); 10978a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 10988a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 1099db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->removeGlobalAlert(); 1100db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1101db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 11028a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall 1103db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1104c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall if (!strcmp(argv[1], "debugremovetetherglobalalert") || !strcmp(argv[1], "drtga")) { 1105c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall if (argc != 4) { 1106c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall sendGenericSyntaxError(cli, "debugremovetetherglobalalert <interface0> <interface1>"); 1107c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall return 0; 1108c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall } 1109c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall /* We ignore the interfaces for now. */ 1110c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall int rc = sBandwidthCtrl->removeGlobalAlertInForwardChain(); 1111c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall sendGenericOkFail(cli, rc); 1112c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall return 0; 1113c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall 1114c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall } 1115db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "setsharedalert") || !strcmp(argv[1], "ssa")) { 11168a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (argc != 3) { 1117db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "setsharedalert <bytes>"); 11188a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 11198a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 1120db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->setSharedAlert(atoll(argv[2])); 1121db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1122db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 11238a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall 1124db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1125db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "removesharedalert") || !strcmp(argv[1], "rsa")) { 11268a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (argc != 2) { 1127db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "removesharedalert"); 11288a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 11298a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 1130db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->removeSharedAlert(); 1131db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1132db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 11338a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall 1134db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1135db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "setinterfacealert") || !strcmp(argv[1], "sia")) { 11368a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (argc != 4) { 1137db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "setinterfacealert <interface> <bytes>"); 11388a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 11398a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 1140db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->setInterfaceAlert(argv[2], atoll(argv[3])); 1141db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1142db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 11438a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall 1144db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1145db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "removeinterfacealert") || !strcmp(argv[1], "ria")) { 11468a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (argc != 3) { 1147db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "removeinterfacealert <interface>"); 11488a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 11498a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 1150db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->removeInterfaceAlert(argv[2]); 1151db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1152fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall return 0; 1153db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 11544a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall } 1155db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "gettetherstats") || !strcmp(argv[1], "gts")) { 1156db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall BandwidthController::TetherStats tetherStats; 1157db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (argc != 4) { 1158db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "gettetherstats <interface0> <interface1>"); 1159db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 1160db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1161db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 1162db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall tetherStats.ifaceIn = argv[2]; 1163db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall tetherStats.ifaceOut = argv[3]; 1164db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->getTetherStats(tetherStats); 1165db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (rc) { 1166db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOpFailed(cli, "Failed to get tethering stats"); 1167db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 1168db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1169db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 1170db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall char *msg = tetherStats.getStatsLine(); 1171db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall cli->sendMsg(ResponseCode::TetheringStatsResult, msg, false); 1172db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall free(msg); 1173db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 11744a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall 11754a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall } 1176db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 1177db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown bandwidth cmd", false); 11784a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall return 0; 11794a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall} 1180