CommandListener.cpp revision 32a9dc6f484deb3462d11084caca21e3f1f662b2
1d18304287dbabc7835be771400b85d4ae8b63de6San Mehat/* 2d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * Copyright (C) 2008 The Android Open Source Project 3d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * 4d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * Licensed under the Apache License, Version 2.0 (the "License"); 5d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * you may not use this file except in compliance with the License. 6d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * You may obtain a copy of the License at 7d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * 8d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * http://www.apache.org/licenses/LICENSE-2.0 9d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * 10d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * Unless required by applicable law or agreed to in writing, software 11d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * distributed under the License is distributed on an "AS IS" BASIS, 12d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * See the License for the specific language governing permissions and 14d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * limitations under the License. 15d18304287dbabc7835be771400b85d4ae8b63de6San Mehat */ 16d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 17d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <stdlib.h> 18d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <sys/socket.h> 19d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <sys/types.h> 20d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <netinet/in.h> 21d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <arpa/inet.h> 22d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <dirent.h> 23d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <errno.h> 24ff2c0d8c13457e43f0d4bf06d3177271aac104c1Olivier Bailly#include <string.h> 2532a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff#include <fcntl.h> 26d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 275c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat#include <linux/if.h> 285c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 29d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#define LOG_TAG "CommandListener" 30d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <cutils/log.h> 31d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 32d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <sysutils/SocketClient.h> 33d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 34d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include "CommandListener.h" 35d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include "ResponseCode.h" 36a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat#include "ThrottleController.h" 374a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall#include "BandwidthController.h" 38a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat 39d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 405c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehatextern "C" int ifc_init(void); 41e734edd35d8d02da96330d77420650c044a12527Irfan Sheriffextern "C" int ifc_close(void); 425c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehatextern "C" int ifc_get_hwaddr(const char *name, void *ptr); 431d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwaltextern "C" int ifc_get_info(const char *name, in_addr_t *addr, int *prefixLength, unsigned *flags); 44e734edd35d8d02da96330d77420650c044a12527Irfan Sheriffextern "C" int ifc_get_addr(const char *name, in_addr_t *addr); 455c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehatextern "C" int ifc_set_addr(const char *name, in_addr_t addr); 461d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwaltextern "C" int ifc_set_prefixLength(const char *name, int prefixLength); 475c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehatextern "C" int ifc_up(const char *name); 485c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehatextern "C" int ifc_down(const char *name); 49e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwaltextern "C" int ifc_add_route(const char *name, const char *dst, int prefix_length, const char *gw); 50e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwaltextern "C" int ifc_remove_route(const char *name, const char *dst, int p_length, const char *gw); 515c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 529d10b341a0ba46f108cb96e46691197d778cbc06San MehatTetherController *CommandListener::sTetherCtrl = NULL; 539ff78fb7da7158f5bd7c86d89a842691820259cfSan MehatNatController *CommandListener::sNatCtrl = NULL; 54d5573d34c8fac49e16b20cf144486125bf940086San MehatPppController *CommandListener::sPppCtrl = NULL; 551bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San MehatPanController *CommandListener::sPanCtrl = NULL; 565af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry ShmidtSoftapController *CommandListener::sSoftapCtrl = NULL; 574a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP AbgrallBandwidthController * CommandListener::sBandwidthCtrl = NULL; 5889c1e975f0c03997808d35c7be10b244c5309f9fMattias FalkResolverController *CommandListener::sResolverCtrl = NULL; 599d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 60d18304287dbabc7835be771400b85d4ae8b63de6San MehatCommandListener::CommandListener() : 61d18304287dbabc7835be771400b85d4ae8b63de6San Mehat FrameworkListener("netd") { 625c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat registerCmd(new InterfaceCmd()); 63d18304287dbabc7835be771400b85d4ae8b63de6San Mehat registerCmd(new IpFwdCmd()); 64d18304287dbabc7835be771400b85d4ae8b63de6San Mehat registerCmd(new TetherCmd()); 65d18304287dbabc7835be771400b85d4ae8b63de6San Mehat registerCmd(new NatCmd()); 66d5573d34c8fac49e16b20cf144486125bf940086San Mehat registerCmd(new ListTtysCmd()); 67d5573d34c8fac49e16b20cf144486125bf940086San Mehat registerCmd(new PppdCmd()); 681bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat registerCmd(new PanCmd()); 695af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt registerCmd(new SoftapCmd()); 704a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall registerCmd(new BandwidthControlCmd()); 7189c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk registerCmd(new ResolverCmd()); 729d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 739d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!sTetherCtrl) 749d10b341a0ba46f108cb96e46691197d778cbc06San Mehat sTetherCtrl = new TetherController(); 759ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat if (!sNatCtrl) 769ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat sNatCtrl = new NatController(); 77d5573d34c8fac49e16b20cf144486125bf940086San Mehat if (!sPppCtrl) 78d5573d34c8fac49e16b20cf144486125bf940086San Mehat sPppCtrl = new PppController(); 791bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat if (!sPanCtrl) 801bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat sPanCtrl = new PanController(); 815af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt if (!sSoftapCtrl) 825af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt sSoftapCtrl = new SoftapController(); 834a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall if (!sBandwidthCtrl) 844a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall sBandwidthCtrl = new BandwidthController(); 8589c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk if (!sResolverCtrl) 8689c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk sResolverCtrl = new ResolverController(); 87d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 88d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 895c1b8af16dbbc20c89aaca2f93e725e12b16d055San MehatCommandListener::InterfaceCmd::InterfaceCmd() : 905c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat NetdCommand("interface") { 91d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 92d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 935c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehatint CommandListener::InterfaceCmd::runCommand(SocketClient *cli, 94d18304287dbabc7835be771400b85d4ae8b63de6San Mehat int argc, char **argv) { 955c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (argc < 2) { 965c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 975c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 985c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 995c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 1005c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (!strcmp(argv[1], "list")) { 1015c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat DIR *d; 1025c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat struct dirent *de; 1035c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 1045c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (!(d = opendir("/sys/class/net"))) { 1055c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to open sysfs dir", true); 1065c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 1075c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 1085c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 1095c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat while((de = readdir(d))) { 1105c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (de->d_name[0] == '.') 1115c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat continue; 1125c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::InterfaceListResult, de->d_name, false); 1135c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 1145c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat closedir(d); 1155c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Interface list completed", false); 1165c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 1178e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } else if (!strcmp(argv[1], "readrxcounter")) { 1188e46896b4c4be5deaef651a12b17314f63ae9070San Mehat if (argc != 3) { 1198e46896b4c4be5deaef651a12b17314f63ae9070San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, 1208e46896b4c4be5deaef651a12b17314f63ae9070San Mehat "Usage: interface readrxcounter <interface>", false); 1218e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 1228e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 1238e46896b4c4be5deaef651a12b17314f63ae9070San Mehat unsigned long rx = 0, tx = 0; 1248e46896b4c4be5deaef651a12b17314f63ae9070San Mehat if (readInterfaceCounters(argv[2], &rx, &tx)) { 1258e46896b4c4be5deaef651a12b17314f63ae9070San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to read counters", true); 1268e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 1278e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 1288e46896b4c4be5deaef651a12b17314f63ae9070San Mehat 1298e46896b4c4be5deaef651a12b17314f63ae9070San Mehat char *msg; 1308e46896b4c4be5deaef651a12b17314f63ae9070San Mehat asprintf(&msg, "%lu", rx); 1318e46896b4c4be5deaef651a12b17314f63ae9070San Mehat cli->sendMsg(ResponseCode::InterfaceRxCounterResult, msg, false); 1328e46896b4c4be5deaef651a12b17314f63ae9070San Mehat free(msg); 1338e46896b4c4be5deaef651a12b17314f63ae9070San Mehat 1348e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 1358e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } else if (!strcmp(argv[1], "readtxcounter")) { 1368e46896b4c4be5deaef651a12b17314f63ae9070San Mehat if (argc != 3) { 1378e46896b4c4be5deaef651a12b17314f63ae9070San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, 1388e46896b4c4be5deaef651a12b17314f63ae9070San Mehat "Usage: interface readtxcounter <interface>", false); 1398e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 1408e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 1418e46896b4c4be5deaef651a12b17314f63ae9070San Mehat unsigned long rx = 0, tx = 0; 1428e46896b4c4be5deaef651a12b17314f63ae9070San Mehat if (readInterfaceCounters(argv[2], &rx, &tx)) { 1438e46896b4c4be5deaef651a12b17314f63ae9070San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to read counters", true); 1448e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 1458e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 1468e46896b4c4be5deaef651a12b17314f63ae9070San Mehat 1478e46896b4c4be5deaef651a12b17314f63ae9070San Mehat char *msg = NULL; 1488e46896b4c4be5deaef651a12b17314f63ae9070San Mehat asprintf(&msg, "%lu", tx); 1498e46896b4c4be5deaef651a12b17314f63ae9070San Mehat cli->sendMsg(ResponseCode::InterfaceTxCounterResult, msg, false); 1508e46896b4c4be5deaef651a12b17314f63ae9070San Mehat free(msg); 1518e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 1528e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } else if (!strcmp(argv[1], "getthrottle")) { 153a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat if (argc != 4 || (argc == 4 && (strcmp(argv[3], "rx") && (strcmp(argv[3], "tx"))))) { 1548e46896b4c4be5deaef651a12b17314f63ae9070San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, 1558e46896b4c4be5deaef651a12b17314f63ae9070San Mehat "Usage: interface getthrottle <interface> <rx|tx>", false); 1568e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 1578e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 158a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat int val = 0; 159a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat int rc = 0; 160a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat int voldRc = ResponseCode::InterfaceRxThrottleResult; 161a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat 162a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat if (!strcmp(argv[3], "rx")) { 163a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat rc = ThrottleController::getInterfaceRxThrottle(argv[2], &val); 164a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat } else { 165a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat rc = ThrottleController::getInterfaceTxThrottle(argv[2], &val); 166a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat voldRc = ResponseCode::InterfaceTxThrottleResult; 167a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat } 168a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat if (rc) { 169a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to get throttle", true); 170a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat } else { 171a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat char *msg = NULL; 172a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat asprintf(&msg, "%u", val); 173a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat cli->sendMsg(voldRc, msg, false); 174a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat free(msg); 175a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat return 0; 176a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat } 1778e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 1788e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } else if (!strcmp(argv[1], "setthrottle")) { 1798e46896b4c4be5deaef651a12b17314f63ae9070San Mehat if (argc != 5) { 1808e46896b4c4be5deaef651a12b17314f63ae9070San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, 181a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat "Usage: interface setthrottle <interface> <rx_kbps> <tx_kbps>", false); 1828e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 1838e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 184a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat if (ThrottleController::setInterfaceThrottle(argv[2], atoi(argv[3]), atoi(argv[4]))) { 185a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to set throttle", true); 186a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat } else { 187a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Interface throttling set", false); 188a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat } 1898e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 1905c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } else { 1915c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat /* 1925c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat * These commands take a minimum of 3 arguments 1935c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat */ 1945c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (argc < 3) { 1955c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 1965c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 1975c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 198e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt 199e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt if (!strcmp(argv[1], "route")) { 200e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt int prefix_length = 0; 201e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt if (argc < 7) { 202e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 203e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt return 0; 204e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } 205e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt if (sscanf(argv[5], "%d", &prefix_length) != 1) { 206e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt cli->sendMsg(ResponseCode::CommandParameterError, "Invalid route prefix", false); 207e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt return 0; 208e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } 209e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt if (!strcmp(argv[2], "add")) { 210e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt if (ifc_add_route(argv[3], argv[4], prefix_length, argv[6])) { 211e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt cli->sendMsg(ResponseCode::OperationFailed, "Failed to add route", true); 212e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } else { 213e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt cli->sendMsg(ResponseCode::CommandOkay, "Route added", false); 214e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } 215e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } else if (!strcmp(argv[2], "remove")) { 216e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt if (ifc_remove_route(argv[3], argv[4], prefix_length, argv[6])) { 217e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt cli->sendMsg(ResponseCode::OperationFailed, "Failed to remove route", true); 218e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } else { 219e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt cli->sendMsg(ResponseCode::CommandOkay, "Route removed", false); 220e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } 221e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } else { 222e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown interface cmd", false); 223e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } 224e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt return 0; 225e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } 226e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt 2275c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (!strcmp(argv[1], "getcfg")) { 2281d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwalt struct in_addr addr; 2291d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwalt int prefixLength; 2305c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat unsigned char hwaddr[6]; 2315c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat unsigned flags = 0; 2325c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 2335c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat ifc_init(); 2345c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat memset(hwaddr, 0, sizeof(hwaddr)); 2355c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 2361d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwalt if (ifc_get_info(argv[2], &addr.s_addr, &prefixLength, &flags)) { 2375c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Interface not found", true); 238e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff ifc_close(); 2395c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 2405c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 2415c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 2425c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (ifc_get_hwaddr(argv[2], (void *) hwaddr)) { 2435c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat LOGW("Failed to retrieve HW addr for %s (%s)", argv[2], strerror(errno)); 2445c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 2455c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 2465c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat char *addr_s = strdup(inet_ntoa(addr)); 2475c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat const char *updown, *brdcst, *loopbk, *ppp, *running, *multi; 2485c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 2495c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat updown = (flags & IFF_UP) ? "up" : "down"; 2505c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat brdcst = (flags & IFF_BROADCAST) ? " broadcast" : ""; 2515c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat loopbk = (flags & IFF_LOOPBACK) ? " loopback" : ""; 2525c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat ppp = (flags & IFF_POINTOPOINT) ? " point-to-point" : ""; 2535c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat running = (flags & IFF_RUNNING) ? " running" : ""; 2545c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat multi = (flags & IFF_MULTICAST) ? " multicast" : ""; 2555c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 2565c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat char *flag_s; 2575c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 258e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt asprintf(&flag_s, "[%s%s%s%s%s%s]", updown, brdcst, loopbk, ppp, running, multi); 2595c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 2605c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat char *msg = NULL; 2611d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwalt asprintf(&msg, "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x %s %d %s", 2625c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat hwaddr[0], hwaddr[1], hwaddr[2], hwaddr[3], hwaddr[4], hwaddr[5], 2631d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwalt addr_s, prefixLength, flag_s); 2645c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 26501fed783828b592cda3b774deea4099a9e690e3dSan Mehat cli->sendMsg(ResponseCode::InterfaceGetCfgResult, msg, false); 2665c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 2675c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat free(addr_s); 2685c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat free(flag_s); 2695c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat free(msg); 270e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff 271e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff ifc_close(); 2725c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 2735c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } else if (!strcmp(argv[1], "setcfg")) { 2741d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwalt // arglist: iface addr prefixLength [flags] 2755c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (argc < 5) { 2765c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 2775c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 2785c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 279e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt LOGD("Setting iface cfg"); 2805c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 2811d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwalt struct in_addr addr; 2825c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat unsigned flags = 0; 2835c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 2845c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (!inet_aton(argv[3], &addr)) { 2855c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandParameterError, "Invalid address", false); 2865c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 2875c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 2885c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 2895c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat ifc_init(); 2905c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (ifc_set_addr(argv[2], addr.s_addr)) { 2915c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to set address", true); 292e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff ifc_close(); 2935c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 2945c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 2955c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 296ab374f426a0d1d8598f3eb4b0339440dcb313a1aIrfan Sheriff //Set prefix length on a non zero address 297ab374f426a0d1d8598f3eb4b0339440dcb313a1aIrfan Sheriff if (addr.s_addr != 0 && ifc_set_prefixLength(argv[2], atoi(argv[4]))) { 2981d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwalt cli->sendMsg(ResponseCode::OperationFailed, "Failed to set prefixLength", true); 299e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff ifc_close(); 3005c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 3015c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 3025c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 3035c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat /* Process flags */ 304e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt /* read from "[XX" arg to "YY]" arg */ 305e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt bool bStarted = false; 3065c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat for (int i = 5; i < argc; i++) { 307e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt char *flag = argv[i]; 308e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt if (!bStarted) { 309e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt if (*flag == '[') { 310e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt flag++; 311e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt bStarted = true; 312e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt } else { 313e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt continue; 314e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt } 315e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt } 316e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt int len = strlen(flag); 317e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt if (flag[len-1] == ']') { 318e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt i = argc; // stop after this loop 319e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt flag[len-1] = 0; 320e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt } 321e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt if (!strcmp(flag, "up")) { 322e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt LOGD("Trying to bring up %s", argv[2]); 3235c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (ifc_up(argv[2])) { 3245c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat LOGE("Error upping interface"); 3255c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to up interface", true); 326e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff ifc_close(); 3275c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 3285c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 329e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt } else if (!strcmp(flag, "down")) { 330e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt LOGD("Trying to bring down %s", argv[2]); 3315c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (ifc_down(argv[2])) { 3325c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat LOGE("Error downing interface"); 3335c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to down interface", true); 334e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff ifc_close(); 3355c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 3365c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 337e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt } else if (!strcmp(flag, "broadcast")) { 338e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt LOGD("broadcast flag ignored"); 339e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt } else if (!strcmp(flag, "multicast")) { 340e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt LOGD("multicast flag ignored"); 3415c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } else { 3425c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandParameterError, "Flag unsupported", false); 343e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff ifc_close(); 3445c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 3455c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 3465c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 347e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff 3485c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Interface configuration set", false); 349e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff ifc_close(); 350e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff return 0; 351e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff } else if (!strcmp(argv[1], "clearaddrs")) { 352e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff // arglist: iface 353e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff unsigned count, addr; 354e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff 355e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff //IPv4 only right now 356e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff LOGD("Clearing all IP addresses on %s", argv[2]); 357e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff 358e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff ifc_init(); 359e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff for (count=0, addr=1;((addr != 0) && (count < 255)); count++) { 360e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff if (ifc_get_addr(argv[2], &addr) < 0) 361e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff break; 362e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff if (addr) 363e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff ifc_set_addr(argv[2], 0); 364e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff } 365e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff ifc_close(); 366e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff cli->sendMsg(ResponseCode::CommandOkay, "Interface IP addresses cleared", false); 3675c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 36832a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff } else if (!strcmp(argv[1], "ipv6privacyextensions")) { 36932a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff if (argc != 4) { 37032a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff cli->sendMsg(ResponseCode::CommandSyntaxError, 37132a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff "Usage: interface ipv6privacyextensions <interface> <enable|disable>", 37232a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff false); 37332a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff return 0; 37432a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff } 37532a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff 37632a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff char *tmp = NULL; 37732a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff asprintf(&tmp, "/proc/sys/net/ipv6/conf/%s/use_tempaddr", argv[2]); 37832a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff int fd = open(tmp, O_WRONLY); 37932a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff if (fd < 0) { 38032a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff LOGE("Failed to open %s (%s)", tmp, strerror(errno)); 38132a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff free(tmp); 38232a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff cli->sendMsg(ResponseCode::OperationFailed, 38332a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff "Failed to set ipv6 privacy extensions", true); 38432a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff return 0; 38532a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff } 38632a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff 38732a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff if (write(fd, (!strncmp(argv[3], "enable", 6) ? "2" : "0"), 1) != 1) { 38832a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff LOGE("Failed to write %s (%s)", tmp, strerror(errno)); 38932a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff close(fd); 39032a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff free(tmp); 39132a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff cli->sendMsg(ResponseCode::OperationFailed, 39232a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff "Failed to set ipv6 privacy extensions", true); 39332a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff return 0; 39432a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff } 39532a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff close(fd); 39632a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff free(tmp); 39732a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff cli->sendMsg(ResponseCode::CommandOkay, "IPv6 privacy extensions changed", false); 39832a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff return 0; 3995c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } else { 4005c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown interface cmd", false); 4015c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 4025c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 4035c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 404d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return 0; 405d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 406d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 4074a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall 408d5573d34c8fac49e16b20cf144486125bf940086San MehatCommandListener::ListTtysCmd::ListTtysCmd() : 409d5573d34c8fac49e16b20cf144486125bf940086San Mehat NetdCommand("list_ttys") { 410d5573d34c8fac49e16b20cf144486125bf940086San Mehat} 411d5573d34c8fac49e16b20cf144486125bf940086San Mehat 412d5573d34c8fac49e16b20cf144486125bf940086San Mehatint CommandListener::ListTtysCmd::runCommand(SocketClient *cli, 413d5573d34c8fac49e16b20cf144486125bf940086San Mehat int argc, char **argv) { 414d5573d34c8fac49e16b20cf144486125bf940086San Mehat TtyCollection *tlist = sPppCtrl->getTtyList(); 415d5573d34c8fac49e16b20cf144486125bf940086San Mehat TtyCollection::iterator it; 416d5573d34c8fac49e16b20cf144486125bf940086San Mehat 417d5573d34c8fac49e16b20cf144486125bf940086San Mehat for (it = tlist->begin(); it != tlist->end(); ++it) { 418d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::TtyListResult, *it, false); 419d5573d34c8fac49e16b20cf144486125bf940086San Mehat } 420d5573d34c8fac49e16b20cf144486125bf940086San Mehat 421d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Ttys listed.", false); 422d5573d34c8fac49e16b20cf144486125bf940086San Mehat return 0; 423d5573d34c8fac49e16b20cf144486125bf940086San Mehat} 424d5573d34c8fac49e16b20cf144486125bf940086San Mehat 425d18304287dbabc7835be771400b85d4ae8b63de6San MehatCommandListener::IpFwdCmd::IpFwdCmd() : 426d18304287dbabc7835be771400b85d4ae8b63de6San Mehat NetdCommand("ipfwd") { 427d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 428d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 429d18304287dbabc7835be771400b85d4ae8b63de6San Mehatint CommandListener::IpFwdCmd::runCommand(SocketClient *cli, 430d18304287dbabc7835be771400b85d4ae8b63de6San Mehat int argc, char **argv) { 4319d10b341a0ba46f108cb96e46691197d778cbc06San Mehat int rc = 0; 4329d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 4339d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (argc < 2) { 4349d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 4359d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 4369d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 4379d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 4389d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!strcmp(argv[1], "status")) { 4399d10b341a0ba46f108cb96e46691197d778cbc06San Mehat char *tmp = NULL; 4409d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 4419d10b341a0ba46f108cb96e46691197d778cbc06San Mehat asprintf(&tmp, "Forwarding %s", (sTetherCtrl->getIpFwdEnabled() ? "enabled" : "disabled")); 4429d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::IpFwdStatusResult, tmp, false); 4439d10b341a0ba46f108cb96e46691197d778cbc06San Mehat free(tmp); 4449d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 4459d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[1], "enable")) { 4469d10b341a0ba46f108cb96e46691197d778cbc06San Mehat rc = sTetherCtrl->setIpFwdEnabled(true); 4479d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[1], "disable")) { 4489d10b341a0ba46f108cb96e46691197d778cbc06San Mehat rc = sTetherCtrl->setIpFwdEnabled(false); 4499d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 4509d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown ipfwd cmd", false); 4519d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 4529d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 4539d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 4549d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!rc) { 4559d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandOkay, "ipfwd operation succeeded", false); 4569d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 4579d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::OperationFailed, "ipfwd operation failed", true); 4589d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 459d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 460d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return 0; 461d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 462d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 463d18304287dbabc7835be771400b85d4ae8b63de6San MehatCommandListener::TetherCmd::TetherCmd() : 464d18304287dbabc7835be771400b85d4ae8b63de6San Mehat NetdCommand("tether") { 465d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 466d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 467d18304287dbabc7835be771400b85d4ae8b63de6San Mehatint CommandListener::TetherCmd::runCommand(SocketClient *cli, 468d18304287dbabc7835be771400b85d4ae8b63de6San Mehat int argc, char **argv) { 4699d10b341a0ba46f108cb96e46691197d778cbc06San Mehat int rc = 0; 4709d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 471d18304287dbabc7835be771400b85d4ae8b63de6San Mehat if (argc < 2) { 472d18304287dbabc7835be771400b85d4ae8b63de6San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 473d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return 0; 474d18304287dbabc7835be771400b85d4ae8b63de6San Mehat } 475d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 4769d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!strcmp(argv[1], "stop")) { 4779d10b341a0ba46f108cb96e46691197d778cbc06San Mehat rc = sTetherCtrl->stopTethering(); 478d18304287dbabc7835be771400b85d4ae8b63de6San Mehat } else if (!strcmp(argv[1], "status")) { 4799d10b341a0ba46f108cb96e46691197d778cbc06San Mehat char *tmp = NULL; 4809d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 4819d10b341a0ba46f108cb96e46691197d778cbc06San Mehat asprintf(&tmp, "Tethering services %s", 4829d10b341a0ba46f108cb96e46691197d778cbc06San Mehat (sTetherCtrl->isTetheringStarted() ? "started" : "stopped")); 4839d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::TetherStatusResult, tmp, false); 4849d10b341a0ba46f108cb96e46691197d778cbc06San Mehat free(tmp); 485d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return 0; 4869d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 4879d10b341a0ba46f108cb96e46691197d778cbc06San Mehat /* 4889d10b341a0ba46f108cb96e46691197d778cbc06San Mehat * These commands take a minimum of 4 arguments 4899d10b341a0ba46f108cb96e46691197d778cbc06San Mehat */ 4909d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (argc < 4) { 4919d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 4929d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 4939d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 4949d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 4959d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!strcmp(argv[1], "start")) { 4963208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt if (argc % 2 == 1) { 4973208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt cli->sendMsg(ResponseCode::CommandSyntaxError, "Bad number of arguments", false); 4989d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 4999d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 5003208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt 5013208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt int num_addrs = argc - 2; 5023208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt int arg_index = 2; 5033208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt int array_index = 0; 5043208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt in_addr *addrs = (in_addr *)malloc(sizeof(in_addr) * num_addrs); 5053208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt while (array_index < num_addrs) { 5063208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt if (!inet_aton(argv[arg_index++], &(addrs[array_index++]))) { 5073208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt cli->sendMsg(ResponseCode::CommandParameterError, "Invalid address", false); 5083208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt free(addrs); 5093208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt return 0; 5103208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt } 5119d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 5123208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt rc = sTetherCtrl->startTethering(num_addrs, addrs); 5133208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt free(addrs); 5149d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[1], "interface")) { 5159d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!strcmp(argv[2], "add")) { 5169d10b341a0ba46f108cb96e46691197d778cbc06San Mehat rc = sTetherCtrl->tetherInterface(argv[3]); 5179d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[2], "remove")) { 5189d10b341a0ba46f108cb96e46691197d778cbc06San Mehat rc = sTetherCtrl->untetherInterface(argv[3]); 5199d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[2], "list")) { 5209d10b341a0ba46f108cb96e46691197d778cbc06San Mehat InterfaceCollection *ilist = sTetherCtrl->getTetheredInterfaceList(); 5219d10b341a0ba46f108cb96e46691197d778cbc06San Mehat InterfaceCollection::iterator it; 5229d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 5239d10b341a0ba46f108cb96e46691197d778cbc06San Mehat for (it = ilist->begin(); it != ilist->end(); ++it) { 5249d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::TetherInterfaceListResult, *it, false); 5259d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 5269d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 5279d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandParameterError, 5289d10b341a0ba46f108cb96e46691197d778cbc06San Mehat "Unknown tether interface operation", false); 5299d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 5309d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 5319d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[1], "dns")) { 5329d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!strcmp(argv[2], "set")) { 5339d10b341a0ba46f108cb96e46691197d778cbc06San Mehat rc = sTetherCtrl->setDnsForwarders(&argv[3], argc - 3); 5349d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[2], "list")) { 5359d10b341a0ba46f108cb96e46691197d778cbc06San Mehat NetAddressCollection *dlist = sTetherCtrl->getDnsForwarders(); 5369d10b341a0ba46f108cb96e46691197d778cbc06San Mehat NetAddressCollection::iterator it; 5379d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 5389d10b341a0ba46f108cb96e46691197d778cbc06San Mehat for (it = dlist->begin(); it != dlist->end(); ++it) { 5399d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::TetherDnsFwdTgtListResult, inet_ntoa(*it), false); 5409d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 5419d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 5429d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandParameterError, 5439d10b341a0ba46f108cb96e46691197d778cbc06San Mehat "Unknown tether interface operation", false); 5449d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 5459d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 5469d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 5479d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown tether cmd", false); 5489d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 5499d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 5509d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 5519d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 5529d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!rc) { 5539d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Tether operation succeeded", false); 5549d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 5559d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Tether operation failed", true); 556d18304287dbabc7835be771400b85d4ae8b63de6San Mehat } 557d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 558d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return 0; 559d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 560d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 561d18304287dbabc7835be771400b85d4ae8b63de6San MehatCommandListener::NatCmd::NatCmd() : 562d18304287dbabc7835be771400b85d4ae8b63de6San Mehat NetdCommand("nat") { 563d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 564d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 565d18304287dbabc7835be771400b85d4ae8b63de6San Mehatint CommandListener::NatCmd::runCommand(SocketClient *cli, 566d18304287dbabc7835be771400b85d4ae8b63de6San Mehat int argc, char **argv) { 5679d10b341a0ba46f108cb96e46691197d778cbc06San Mehat int rc = 0; 5689d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 5699d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (argc < 3) { 5709d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 5719d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 5729d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 5739d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 5749ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat if (!strcmp(argv[1], "enable")) { 5759ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat rc = sNatCtrl->enableNat(argv[2], argv[3]); 5769ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat } else if (!strcmp(argv[1], "disable")) { 5779ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat rc = sNatCtrl->disableNat(argv[2], argv[3]); 5789d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 5799d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown nat cmd", false); 5809d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 5819d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 5829d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 5839d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!rc) { 5849d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Nat operation succeeded", false); 5859d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 5869d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Nat operation failed", true); 5879d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 588d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 589d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return 0; 590d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 591d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 592d5573d34c8fac49e16b20cf144486125bf940086San MehatCommandListener::PppdCmd::PppdCmd() : 593d5573d34c8fac49e16b20cf144486125bf940086San Mehat NetdCommand("pppd") { 594d5573d34c8fac49e16b20cf144486125bf940086San Mehat} 595d5573d34c8fac49e16b20cf144486125bf940086San Mehat 596d5573d34c8fac49e16b20cf144486125bf940086San Mehatint CommandListener::PppdCmd::runCommand(SocketClient *cli, 597d5573d34c8fac49e16b20cf144486125bf940086San Mehat int argc, char **argv) { 598d5573d34c8fac49e16b20cf144486125bf940086San Mehat int rc = 0; 599d5573d34c8fac49e16b20cf144486125bf940086San Mehat 600d5573d34c8fac49e16b20cf144486125bf940086San Mehat if (argc < 3) { 601d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 602d5573d34c8fac49e16b20cf144486125bf940086San Mehat return 0; 603d5573d34c8fac49e16b20cf144486125bf940086San Mehat } 604d5573d34c8fac49e16b20cf144486125bf940086San Mehat 605d5573d34c8fac49e16b20cf144486125bf940086San Mehat if (!strcmp(argv[1], "attach")) { 60674d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt struct in_addr l, r, dns1, dns2; 60774d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt 60874d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt memset(&dns1, sizeof(struct in_addr), 0); 60974d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt memset(&dns2, sizeof(struct in_addr), 0); 610d5573d34c8fac49e16b20cf144486125bf940086San Mehat 611d5573d34c8fac49e16b20cf144486125bf940086San Mehat if (!inet_aton(argv[3], &l)) { 612d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::CommandParameterError, "Invalid local address", false); 613d5573d34c8fac49e16b20cf144486125bf940086San Mehat return 0; 614d5573d34c8fac49e16b20cf144486125bf940086San Mehat } 615d5573d34c8fac49e16b20cf144486125bf940086San Mehat if (!inet_aton(argv[4], &r)) { 616d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::CommandParameterError, "Invalid remote address", false); 617d5573d34c8fac49e16b20cf144486125bf940086San Mehat return 0; 618d5573d34c8fac49e16b20cf144486125bf940086San Mehat } 61974d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt if ((argc > 3) && (!inet_aton(argv[5], &dns1))) { 62074d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt cli->sendMsg(ResponseCode::CommandParameterError, "Invalid dns1 address", false); 62174d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt return 0; 62274d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt } 62374d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt if ((argc > 4) && (!inet_aton(argv[6], &dns2))) { 62474d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt cli->sendMsg(ResponseCode::CommandParameterError, "Invalid dns2 address", false); 62574d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt return 0; 62674d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt } 62774d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt rc = sPppCtrl->attachPppd(argv[2], l, r, dns1, dns2); 628d5573d34c8fac49e16b20cf144486125bf940086San Mehat } else if (!strcmp(argv[1], "detach")) { 629d5573d34c8fac49e16b20cf144486125bf940086San Mehat rc = sPppCtrl->detachPppd(argv[2]); 630d5573d34c8fac49e16b20cf144486125bf940086San Mehat } else { 631d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown pppd cmd", false); 632d5573d34c8fac49e16b20cf144486125bf940086San Mehat return 0; 633d5573d34c8fac49e16b20cf144486125bf940086San Mehat } 634d5573d34c8fac49e16b20cf144486125bf940086San Mehat 635d5573d34c8fac49e16b20cf144486125bf940086San Mehat if (!rc) { 636d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Pppd operation succeeded", false); 637d5573d34c8fac49e16b20cf144486125bf940086San Mehat } else { 638d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Pppd operation failed", true); 639d5573d34c8fac49e16b20cf144486125bf940086San Mehat } 640d5573d34c8fac49e16b20cf144486125bf940086San Mehat 641d5573d34c8fac49e16b20cf144486125bf940086San Mehat return 0; 642d5573d34c8fac49e16b20cf144486125bf940086San Mehat} 6431bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat 6441bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San MehatCommandListener::PanCmd::PanCmd() : 6451bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat NetdCommand("pan") { 6461bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat} 6471bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat 6481bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehatint CommandListener::PanCmd::runCommand(SocketClient *cli, 6491bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat int argc, char **argv) { 6501bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat int rc = 0; 6511bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat 6521bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat if (argc < 2) { 6531bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 6541bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat return 0; 6551bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat } 6561bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat 6571bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat if (!strcmp(argv[1], "start")) { 6581bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat rc = sPanCtrl->startPan(); 6591bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat } else if (!strcmp(argv[1], "stop")) { 6601bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat rc = sPanCtrl->stopPan(); 6611bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat } else if (!strcmp(argv[1], "status")) { 6621bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat char *tmp = NULL; 6631bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat 6641bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat asprintf(&tmp, "Pan services %s", 6651bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat (sPanCtrl->isPanStarted() ? "started" : "stopped")); 6661bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat cli->sendMsg(ResponseCode::PanStatusResult, tmp, false); 6671bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat free(tmp); 6681bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat return 0; 6691bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat } else { 6701bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown pan cmd", false); 6711bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat return 0; 6721bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat } 6731bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat 6741bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat if (!rc) { 6751bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Pan operation succeeded", false); 6761bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat } else { 6771bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Pan operation failed", true); 6781bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat } 6791bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat 6801bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat return 0; 6811bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat} 6825af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 6835af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry ShmidtCommandListener::SoftapCmd::SoftapCmd() : 6845af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt NetdCommand("softap") { 6855af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt} 6865af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 6875af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidtint CommandListener::SoftapCmd::runCommand(SocketClient *cli, 6885af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt int argc, char **argv) { 68931fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt int rc = 0, flag = 0; 690666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt char *retbuf = NULL; 6915af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 6925af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt if (argc < 2) { 6935af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt cli->sendMsg(ResponseCode::CommandSyntaxError, "Softap Missing argument", false); 6945af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt return 0; 6955af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } 6965af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 6975af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt if (!strcmp(argv[1], "start")) { 698c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt rc = sSoftapCtrl->startDriver(argv[2]); 6995af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } else if (!strcmp(argv[1], "stop")) { 700c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt rc = sSoftapCtrl->stopDriver(argv[2]); 701c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt } else if (!strcmp(argv[1], "startap")) { 702c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt rc = sSoftapCtrl->startSoftap(); 703c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt } else if (!strcmp(argv[1], "stopap")) { 7045af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt rc = sSoftapCtrl->stopSoftap(); 70531fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt } else if (!strcmp(argv[1], "fwreload")) { 70631fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt rc = sSoftapCtrl->fwReloadSoftap(argc, argv); 707666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt } else if (!strcmp(argv[1], "clients")) { 708666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt rc = sSoftapCtrl->clientsSoftap(&retbuf); 709666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt if (!rc) { 710666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt cli->sendMsg(ResponseCode::CommandOkay, retbuf, false); 711666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt free(retbuf); 712666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt return 0; 713666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt } 7145af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } else if (!strcmp(argv[1], "status")) { 715666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt asprintf(&retbuf, "Softap service %s", 7165af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt (sSoftapCtrl->isSoftapStarted() ? "started" : "stopped")); 717666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt cli->sendMsg(ResponseCode::SoftapStatusResult, retbuf, false); 718666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt free(retbuf); 7195af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt return 0; 7205af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } else if (!strcmp(argv[1], "set")) { 7215af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt rc = sSoftapCtrl->setSoftap(argc, argv); 7225af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } else { 7235af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt cli->sendMsg(ResponseCode::CommandSyntaxError, "Softap Unknown cmd", false); 7245af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt return 0; 7255af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } 7265af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 7275af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt if (!rc) { 7285af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt cli->sendMsg(ResponseCode::CommandOkay, "Softap operation succeeded", false); 7295af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } else { 7305af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt cli->sendMsg(ResponseCode::OperationFailed, "Softap operation failed", true); 7315af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } 7325af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 7335af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt return 0; 7345af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt} 7353e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt 73689c1e975f0c03997808d35c7be10b244c5309f9fMattias FalkCommandListener::ResolverCmd::ResolverCmd() : 73789c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk NetdCommand("resolver") { 73889c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk} 73989c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk 74089c1e975f0c03997808d35c7be10b244c5309f9fMattias Falkint CommandListener::ResolverCmd::runCommand(SocketClient *cli, int argc, char **argv) { 74189c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk int rc = 0; 74289c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk struct in_addr addr; 74389c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk 74489c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk if (argc < 2) { 74589c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk cli->sendMsg(ResponseCode::CommandSyntaxError, "Resolver missing arguments", false); 74689c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk return 0; 74789c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } 74889c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk 74989c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk if (!strcmp(argv[1], "setdefaultif")) { // "resolver setdefaultif <iface>" 75089c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk if (argc == 3) { 75189c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk rc = sResolverCtrl->setDefaultInterface(argv[2]); 75289c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } else { 75389c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk cli->sendMsg(ResponseCode::CommandSyntaxError, 75489c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk "Wrong number of arguments to resolver setdefaultif", false); 75589c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk return 0; 75689c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } 75789c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } else if (!strcmp(argv[1], "setifdns")) { // "resolver setifdns <iface> <dns1> <dns2> ..." 75889c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk if (argc >= 4) { 75989c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk rc = sResolverCtrl->setInterfaceDnsServers(argv[2], &argv[3], argc - 3); 76089c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } else { 76189c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk cli->sendMsg(ResponseCode::CommandSyntaxError, 76289c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk "Wrong number of arguments to resolver setifdns", false); 76389c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk return 0; 76489c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } 76589c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk 76689c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk // set the address of the interface to which the name servers 76789c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk // are bound. Required in order to bind to right interface when 76889c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk // doing the dns query. 76989c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk if (!rc) { 77089c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk ifc_init(); 77189c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk ifc_get_info(argv[2], &addr.s_addr, NULL, 0); 77289c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk 77389c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk rc = sResolverCtrl->setInterfaceAddress(argv[2], &addr); 77489c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } 77589c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } else if (!strcmp(argv[1], "flushdefaultif")) { // "resolver flushdefaultif" 77689c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk if (argc == 2) { 77789c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk rc = sResolverCtrl->flushDefaultDnsCache(); 77889c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } else { 77989c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk cli->sendMsg(ResponseCode::CommandSyntaxError, 78089c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk "Wrong number of arguments to resolver flushdefaultif", false); 78189c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk return 0; 78289c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } 78389c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } else if (!strcmp(argv[1], "flushif")) { // "resolver flushif <iface>" 78489c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk if (argc == 3) { 78589c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk rc = sResolverCtrl->flushInterfaceDnsCache(argv[2]); 78689c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } else { 78789c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk cli->sendMsg(ResponseCode::CommandSyntaxError, 78889c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk "Wrong number of arguments to resolver setdefaultif", false); 78989c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk return 0; 79089c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } 79189c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } else { 79289c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk cli->sendMsg(ResponseCode::CommandSyntaxError,"Resolver unknown command", false); 79389c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk return 0; 79489c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } 79589c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk 79689c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk if (!rc) { 79789c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk cli->sendMsg(ResponseCode::CommandOkay, "Resolver command succeeded", false); 79889c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } else { 79989c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk cli->sendMsg(ResponseCode::OperationFailed, "Resolver command failed", true); 80089c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } 80189c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk 80289c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk return 0; 80389c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk} 80489c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk 8058e46896b4c4be5deaef651a12b17314f63ae9070San Mehatint CommandListener::readInterfaceCounters(const char *iface, unsigned long *rx, unsigned long *tx) { 8068e46896b4c4be5deaef651a12b17314f63ae9070San Mehat FILE *fp = fopen("/proc/net/dev", "r"); 8078e46896b4c4be5deaef651a12b17314f63ae9070San Mehat if (!fp) { 8088e46896b4c4be5deaef651a12b17314f63ae9070San Mehat LOGE("Failed to open /proc/net/dev (%s)", strerror(errno)); 8098e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return -1; 8108e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 8118e46896b4c4be5deaef651a12b17314f63ae9070San Mehat 8128e46896b4c4be5deaef651a12b17314f63ae9070San Mehat char buffer[512]; 8138e46896b4c4be5deaef651a12b17314f63ae9070San Mehat 8148e46896b4c4be5deaef651a12b17314f63ae9070San Mehat fgets(buffer, sizeof(buffer), fp); // Header 1 8158e46896b4c4be5deaef651a12b17314f63ae9070San Mehat fgets(buffer, sizeof(buffer), fp); // Header 2 8168e46896b4c4be5deaef651a12b17314f63ae9070San Mehat while(fgets(buffer, sizeof(buffer), fp)) { 8178e46896b4c4be5deaef651a12b17314f63ae9070San Mehat buffer[strlen(buffer)-1] = '\0'; 8188e46896b4c4be5deaef651a12b17314f63ae9070San Mehat 819651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt char name[31]; 8208e46896b4c4be5deaef651a12b17314f63ae9070San Mehat unsigned long d; 821651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt sscanf(buffer, "%30s %lu %lu %lu %lu %lu %lu %lu %lu %lu", 8228e46896b4c4be5deaef651a12b17314f63ae9070San Mehat name, rx, &d, &d, &d, &d, &d, &d, &d, tx); 823651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt char *rxString = strchr(name, ':'); 824651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt *rxString = '\0'; 825651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt rxString++; 826651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt // when the rx count gets too big it changes from "name: 999" to "name:1000" 827651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt // and the sscanf munge the two together. Detect that and fix 828651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt // note that all the %lu will be off by one and the real tx value will be in d 829651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt if (*rxString != '\0') { 830651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt *tx = d; 831651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt sscanf(rxString, "%20lu", rx); 832651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt } 8338e46896b4c4be5deaef651a12b17314f63ae9070San Mehat if (strcmp(name, iface)) { 8348e46896b4c4be5deaef651a12b17314f63ae9070San Mehat continue; 8358e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 8368e46896b4c4be5deaef651a12b17314f63ae9070San Mehat fclose(fp); 8378e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 8388e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 8398e46896b4c4be5deaef651a12b17314f63ae9070San Mehat 8408e46896b4c4be5deaef651a12b17314f63ae9070San Mehat fclose(fp); 84131c61c80a013bd1a050f0f4103e13fba62bf1717Robert Greenwalt *rx = 0; 84231c61c80a013bd1a050f0f4103e13fba62bf1717Robert Greenwalt *tx = 0; 84331c61c80a013bd1a050f0f4103e13fba62bf1717Robert Greenwalt return 0; 8448e46896b4c4be5deaef651a12b17314f63ae9070San Mehat} 8454a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall 8464a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP AbgrallCommandListener::BandwidthControlCmd::BandwidthControlCmd() : 8470dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall NetdCommand("bandwidth") { 8484a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall} 8494a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall 850fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrallint CommandListener::BandwidthControlCmd::runCommand(SocketClient *cli, int argc, char **argv) { 8514a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall int rc = 0; 852fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall LOGD("bwctrlcmd: argc=%d argv[0]=%s", argc, argv[0]); 8534a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall if (argc < 2) { 854fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 8554a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall return 0; 8564a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall } 8574a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall 8584a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall if (!strcmp(argv[1], "enable")) { 8594a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall rc = sBandwidthCtrl->enableBandwidthControl(); 8604a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall } else if (!strcmp(argv[1], "disable")) { 8614a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall rc = sBandwidthCtrl->disableBandwidthControl(); 8620dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall 863fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall } else if (!strcmp(argv[1], "removequota") || !strcmp(argv[1], "rq")) { 864fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall if (argc != 3) { 865fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, 866fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall "Usage: bandwidth removequota <interface>", false); 867fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall return 0; 868fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall } 869fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall rc = sBandwidthCtrl->removeInterfaceSharedQuota(argv[2]); 870fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall 8718a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } else if (!strcmp(argv[1], "getquota") || !strcmp(argv[1], "gq")) { 8728a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall int64_t bytes; 8738a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (argc != 2) { 8748a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, 8758a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall "Usage: bandwidth getquota", false); 8768a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 8778a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 8788a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall rc = sBandwidthCtrl->getInterfaceSharedQuota(&bytes); 8798a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (rc) { 8808a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall cli->sendMsg(ResponseCode::OperationFailed, "Failed to get quota", true); 8818a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 8828a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 8838a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall char *msg; 8848a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall asprintf(&msg, "%lld", bytes); 8858a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall cli->sendMsg(ResponseCode::QuotaCounterResult, msg, false); 8868a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall free(msg); 8878a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall 8888a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } else if (!strcmp(argv[1], "getiquota") || !strcmp(argv[1], "giq")) { 8898a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall int64_t bytes; 8908a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (argc != 3) { 8918a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, 8928a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall "Usage: bandwidth getiquota <iface>", false); 8938a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 8948a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 8958a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall rc = sBandwidthCtrl->getInterfaceQuota(argv[2], &bytes); 8968a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (rc) { 8978a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall cli->sendMsg(ResponseCode::OperationFailed, "Failed to get quota", true); 8988a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 8998a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 9008a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall char *msg; 9018a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall asprintf(&msg, "%lld", bytes); 9028a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall cli->sendMsg(ResponseCode::QuotaCounterResult, msg, false); 9038a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall free(msg); 9048a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall 905fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall } else if (!strcmp(argv[1], "setquota") || !strcmp(argv[1], "sq")) { 906fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall if (argc != 4) { 907fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, 908fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall "Usage: bandwidth setquota <interface> <bytes>", false); 909fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall return 0; 910fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall } 9110dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall rc = sBandwidthCtrl->setInterfaceSharedQuota(argv[2], atoll(argv[3])); 912fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall 913fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall } else if (!strcmp(argv[1], "setquotas") || !strcmp(argv[1], "sqs")) { 914fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall if (argc < 4) { 915fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, 916fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall "Usage: bandwidth setquotas <bytes> <interface> ...", false); 917fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall return 0; 918fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall } 9198a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall for (int q = 3; argc >= 4; q++, argc--) { 9200dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall rc = sBandwidthCtrl->setInterfaceSharedQuota(argv[q], atoll(argv[2])); 9210dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall if (rc) { 9220dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall char *msg; 9230dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall asprintf(&msg, "bandwidth setquotas %s %s failed", argv[2], argv[q]); 9240dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall cli->sendMsg(ResponseCode::OperationFailed, 9250dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall msg, false); 9260dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall free(msg); 9270dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall break; 9280dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall } 9290dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall } 9300dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall 9310dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall } else if (!strcmp(argv[1], "removequotas") || !strcmp(argv[1], "rqs")) { 9320dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall if (argc < 3) { 9330dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, 9340dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall "Usage: bandwidth removequotas <interface> ...", false); 9350dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall return 0; 9360dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall } 9378a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall for (int q = 2; argc >= 3; q++, argc--) { 9380dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall rc = sBandwidthCtrl->removeInterfaceSharedQuota(argv[q]); 9390dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall if (rc) { 9400dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall char *msg; 9410dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall asprintf(&msg, "bandwidth removequotas %s failed", argv[q]); 9420dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall cli->sendMsg(ResponseCode::OperationFailed, 9430dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall msg, false); 9440dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall free(msg); 9450dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall break; 9460dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall } 9470dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall } 9480dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall 9490dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall } else if (!strcmp(argv[1], "removeiquota") || !strcmp(argv[1], "riq")) { 9500dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall if (argc != 3) { 9510dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, 9520dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall "Usage: bandwidth removeiquota <interface>", false); 9530dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall return 0; 9540dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall } 9550dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall rc = sBandwidthCtrl->removeInterfaceQuota(argv[2]); 9560dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall 9570dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall } else if (!strcmp(argv[1], "setiquota") || !strcmp(argv[1], "siq")) { 9580dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall if (argc != 4) { 9590dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, 9600dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall "Usage: bandwidth setiquota <interface> <bytes>", false); 9610dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall return 0; 9620dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall } 9630dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall rc = sBandwidthCtrl->setInterfaceQuota(argv[2], atoll(argv[3])); 964fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall 965fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall } else if (!strcmp(argv[1], "addnaughtyapps") || !strcmp(argv[1], "ana")) { 966fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall if (argc < 3) { 967fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, 968fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall "Usage: bandwidth addnaughtyapps <appUid> ...", false); 9694a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall return 0; 970fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall } 971fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall rc = sBandwidthCtrl->addNaughtyApps(argc - 2, argv + 2); 972fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall 973fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall } else if (!strcmp(argv[1], "removenaughtyapps") || !strcmp(argv[1], "rna")) { 974fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall if (argc < 3) { 975fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, 9768a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall "Usage: bandwidth removenaughtyapps <appUid> ...", false); 977fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall return 0; 978fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall } 979fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall rc = sBandwidthCtrl->removeNaughtyApps(argc - 2, argv + 2); 980fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall 9818a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } else if (!strcmp(argv[1], "setglobalalert") || !strcmp(argv[1], "sga")) { 9828a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (argc != 3) { 9838a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, 9848a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall "Usage: bandwidth setglobalalert <bytes>", false); 9858a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 9868a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 9878a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall rc = sBandwidthCtrl->setGlobalAlert(atoll(argv[2])); 9888a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall 9898a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } else if (!strcmp(argv[1], "removeglobalalert") || !strcmp(argv[1], "rga")) { 9908a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (argc != 2) { 9918a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, 9928a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall "Usage: bandwidth removeglobalalert", false); 9938a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 9948a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 9958a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall rc = sBandwidthCtrl->removeGlobalAlert(); 9968a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall 9978a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } else if (!strcmp(argv[1], "setsharedalert") || !strcmp(argv[1], "ssa")) { 9988a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (argc != 3) { 9998a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, 10008a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall "Usage: bandwidth setsharedalert <bytes>", false); 10018a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 10028a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 10038a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall rc = sBandwidthCtrl->setSharedAlert(atoll(argv[2])); 10048a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall 10058a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } else if (!strcmp(argv[1], "removesharedalert") || !strcmp(argv[1], "rsa")) { 10068a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (argc != 2) { 10078a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, 10088a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall "Usage: bandwidth removesharedalert", false); 10098a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 10108a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 10118a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall rc = sBandwidthCtrl->removeSharedAlert(); 10128a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall 10138a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } else if (!strcmp(argv[1], "setinterfacealert") || !strcmp(argv[1], "sia")) { 10148a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (argc != 4) { 10158a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, 10168a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall "Usage: bandwidth setinterfacealert <interface> <bytes>", false); 10178a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 10188a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 10198a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall rc = sBandwidthCtrl->setInterfaceAlert(argv[2], atoll(argv[3])); 10208a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall 10218a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } else if (!strcmp(argv[1], "removeinterfacealert") || !strcmp(argv[1], "ria")) { 10228a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (argc != 3) { 10238a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, 10248a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall "Usage: bandwidth removeinterfacealert <interface>", false); 10258a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 10268a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 10278a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall rc = sBandwidthCtrl->removeInterfaceAlert(argv[2]); 10288a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall 1029fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall } else { 1030fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown bandwidth cmd", false); 1031fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall return 0; 10324a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall } 10334a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall 10344a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall if (!rc) { 10354a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall cli->sendMsg(ResponseCode::CommandOkay, "Bandwidth command succeeeded", false); 10364a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall } else { 10374a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall cli->sendMsg(ResponseCode::OperationFailed, "Bandwidth command failed", true); 10384a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall } 10394a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall return 0; 10404a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall} 1041