CommandListener.cpp revision ab374f426a0d1d8598f3eb4b0339440dcb313a1a
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> 25d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 265c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat#include <linux/if.h> 275c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 28d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#define LOG_TAG "CommandListener" 29d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <cutils/log.h> 30d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 31d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <sysutils/SocketClient.h> 32d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 33d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include "CommandListener.h" 34d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include "ResponseCode.h" 35a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat#include "ThrottleController.h" 364a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall#include "BandwidthController.h" 37a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat 38d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 395c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehatextern "C" int ifc_init(void); 40e734edd35d8d02da96330d77420650c044a12527Irfan Sheriffextern "C" int ifc_close(void); 415c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehatextern "C" int ifc_get_hwaddr(const char *name, void *ptr); 421d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwaltextern "C" int ifc_get_info(const char *name, in_addr_t *addr, int *prefixLength, unsigned *flags); 43e734edd35d8d02da96330d77420650c044a12527Irfan Sheriffextern "C" int ifc_get_addr(const char *name, in_addr_t *addr); 445c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehatextern "C" int ifc_set_addr(const char *name, in_addr_t addr); 451d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwaltextern "C" int ifc_set_prefixLength(const char *name, int prefixLength); 465c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehatextern "C" int ifc_up(const char *name); 475c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehatextern "C" int ifc_down(const char *name); 48e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwaltextern "C" int ifc_add_route(const char *name, const char *dst, int prefix_length, const char *gw); 49e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwaltextern "C" int ifc_remove_route(const char *name, const char *dst, int p_length, const char *gw); 505c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 519d10b341a0ba46f108cb96e46691197d778cbc06San MehatTetherController *CommandListener::sTetherCtrl = NULL; 529ff78fb7da7158f5bd7c86d89a842691820259cfSan MehatNatController *CommandListener::sNatCtrl = NULL; 53d5573d34c8fac49e16b20cf144486125bf940086San MehatPppController *CommandListener::sPppCtrl = NULL; 541bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San MehatPanController *CommandListener::sPanCtrl = NULL; 555af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry ShmidtSoftapController *CommandListener::sSoftapCtrl = NULL; 564a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP AbgrallBandwidthController * CommandListener::sBandwidthCtrl = NULL; 5789c1e975f0c03997808d35c7be10b244c5309f9fMattias FalkResolverController *CommandListener::sResolverCtrl = NULL; 589d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 59d18304287dbabc7835be771400b85d4ae8b63de6San MehatCommandListener::CommandListener() : 60d18304287dbabc7835be771400b85d4ae8b63de6San Mehat FrameworkListener("netd") { 615c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat registerCmd(new InterfaceCmd()); 62d18304287dbabc7835be771400b85d4ae8b63de6San Mehat registerCmd(new IpFwdCmd()); 63d18304287dbabc7835be771400b85d4ae8b63de6San Mehat registerCmd(new TetherCmd()); 64d18304287dbabc7835be771400b85d4ae8b63de6San Mehat registerCmd(new NatCmd()); 65d5573d34c8fac49e16b20cf144486125bf940086San Mehat registerCmd(new ListTtysCmd()); 66d5573d34c8fac49e16b20cf144486125bf940086San Mehat registerCmd(new PppdCmd()); 671bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat registerCmd(new PanCmd()); 685af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt registerCmd(new SoftapCmd()); 694a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall registerCmd(new BandwidthControlCmd()); 7089c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk registerCmd(new ResolverCmd()); 719d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 729d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!sTetherCtrl) 739d10b341a0ba46f108cb96e46691197d778cbc06San Mehat sTetherCtrl = new TetherController(); 749ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat if (!sNatCtrl) 759ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat sNatCtrl = new NatController(); 76d5573d34c8fac49e16b20cf144486125bf940086San Mehat if (!sPppCtrl) 77d5573d34c8fac49e16b20cf144486125bf940086San Mehat sPppCtrl = new PppController(); 781bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat if (!sPanCtrl) 791bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat sPanCtrl = new PanController(); 805af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt if (!sSoftapCtrl) 815af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt sSoftapCtrl = new SoftapController(); 824a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall if (!sBandwidthCtrl) 834a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall sBandwidthCtrl = new BandwidthController(); 8489c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk if (!sResolverCtrl) 8589c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk sResolverCtrl = new ResolverController(); 86d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 87d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 885c1b8af16dbbc20c89aaca2f93e725e12b16d055San MehatCommandListener::InterfaceCmd::InterfaceCmd() : 895c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat NetdCommand("interface") { 90d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 91d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 925c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehatint CommandListener::InterfaceCmd::runCommand(SocketClient *cli, 93d18304287dbabc7835be771400b85d4ae8b63de6San Mehat int argc, char **argv) { 945c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (argc < 2) { 955c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 965c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 975c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 985c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 995c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (!strcmp(argv[1], "list")) { 1005c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat DIR *d; 1015c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat struct dirent *de; 1025c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 1035c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (!(d = opendir("/sys/class/net"))) { 1045c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to open sysfs dir", true); 1055c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 1065c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 1075c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 1085c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat while((de = readdir(d))) { 1095c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (de->d_name[0] == '.') 1105c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat continue; 1115c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::InterfaceListResult, de->d_name, false); 1125c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 1135c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat closedir(d); 1145c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Interface list completed", false); 1155c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 1168e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } else if (!strcmp(argv[1], "readrxcounter")) { 1178e46896b4c4be5deaef651a12b17314f63ae9070San Mehat if (argc != 3) { 1188e46896b4c4be5deaef651a12b17314f63ae9070San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, 1198e46896b4c4be5deaef651a12b17314f63ae9070San Mehat "Usage: interface readrxcounter <interface>", false); 1208e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 1218e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 1228e46896b4c4be5deaef651a12b17314f63ae9070San Mehat unsigned long rx = 0, tx = 0; 1238e46896b4c4be5deaef651a12b17314f63ae9070San Mehat if (readInterfaceCounters(argv[2], &rx, &tx)) { 1248e46896b4c4be5deaef651a12b17314f63ae9070San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to read counters", true); 1258e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 1268e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 1278e46896b4c4be5deaef651a12b17314f63ae9070San Mehat 1288e46896b4c4be5deaef651a12b17314f63ae9070San Mehat char *msg; 1298e46896b4c4be5deaef651a12b17314f63ae9070San Mehat asprintf(&msg, "%lu", rx); 1308e46896b4c4be5deaef651a12b17314f63ae9070San Mehat cli->sendMsg(ResponseCode::InterfaceRxCounterResult, msg, false); 1318e46896b4c4be5deaef651a12b17314f63ae9070San Mehat free(msg); 1328e46896b4c4be5deaef651a12b17314f63ae9070San Mehat 1338e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 1348e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } else if (!strcmp(argv[1], "readtxcounter")) { 1358e46896b4c4be5deaef651a12b17314f63ae9070San Mehat if (argc != 3) { 1368e46896b4c4be5deaef651a12b17314f63ae9070San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, 1378e46896b4c4be5deaef651a12b17314f63ae9070San Mehat "Usage: interface readtxcounter <interface>", false); 1388e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 1398e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 1408e46896b4c4be5deaef651a12b17314f63ae9070San Mehat unsigned long rx = 0, tx = 0; 1418e46896b4c4be5deaef651a12b17314f63ae9070San Mehat if (readInterfaceCounters(argv[2], &rx, &tx)) { 1428e46896b4c4be5deaef651a12b17314f63ae9070San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to read counters", true); 1438e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 1448e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 1458e46896b4c4be5deaef651a12b17314f63ae9070San Mehat 1468e46896b4c4be5deaef651a12b17314f63ae9070San Mehat char *msg = NULL; 1478e46896b4c4be5deaef651a12b17314f63ae9070San Mehat asprintf(&msg, "%lu", tx); 1488e46896b4c4be5deaef651a12b17314f63ae9070San Mehat cli->sendMsg(ResponseCode::InterfaceTxCounterResult, msg, false); 1498e46896b4c4be5deaef651a12b17314f63ae9070San Mehat free(msg); 1508e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 1518e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } else if (!strcmp(argv[1], "getthrottle")) { 152a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat if (argc != 4 || (argc == 4 && (strcmp(argv[3], "rx") && (strcmp(argv[3], "tx"))))) { 1538e46896b4c4be5deaef651a12b17314f63ae9070San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, 1548e46896b4c4be5deaef651a12b17314f63ae9070San Mehat "Usage: interface getthrottle <interface> <rx|tx>", false); 1558e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 1568e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 157a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat int val = 0; 158a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat int rc = 0; 159a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat int voldRc = ResponseCode::InterfaceRxThrottleResult; 160a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat 161a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat if (!strcmp(argv[3], "rx")) { 162a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat rc = ThrottleController::getInterfaceRxThrottle(argv[2], &val); 163a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat } else { 164a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat rc = ThrottleController::getInterfaceTxThrottle(argv[2], &val); 165a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat voldRc = ResponseCode::InterfaceTxThrottleResult; 166a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat } 167a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat if (rc) { 168a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to get throttle", true); 169a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat } else { 170a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat char *msg = NULL; 171a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat asprintf(&msg, "%u", val); 172a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat cli->sendMsg(voldRc, msg, false); 173a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat free(msg); 174a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat return 0; 175a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat } 1768e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 1778e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } else if (!strcmp(argv[1], "setthrottle")) { 1788e46896b4c4be5deaef651a12b17314f63ae9070San Mehat if (argc != 5) { 1798e46896b4c4be5deaef651a12b17314f63ae9070San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, 180a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat "Usage: interface setthrottle <interface> <rx_kbps> <tx_kbps>", false); 1818e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 1828e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 183a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat if (ThrottleController::setInterfaceThrottle(argv[2], atoi(argv[3]), atoi(argv[4]))) { 184a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to set throttle", true); 185a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat } else { 186a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Interface throttling set", false); 187a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat } 1888e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 1895c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } else { 1905c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat /* 1915c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat * These commands take a minimum of 3 arguments 1925c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat */ 1935c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (argc < 3) { 1945c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 1955c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 1965c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 197e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt 198e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt if (!strcmp(argv[1], "route")) { 199e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt int prefix_length = 0; 200e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt if (argc < 7) { 201e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 202e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt return 0; 203e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } 204e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt if (sscanf(argv[5], "%d", &prefix_length) != 1) { 205e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt cli->sendMsg(ResponseCode::CommandParameterError, "Invalid route prefix", false); 206e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt return 0; 207e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } 208e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt if (!strcmp(argv[2], "add")) { 209e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt if (ifc_add_route(argv[3], argv[4], prefix_length, argv[6])) { 210e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt cli->sendMsg(ResponseCode::OperationFailed, "Failed to add route", true); 211e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } else { 212e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt cli->sendMsg(ResponseCode::CommandOkay, "Route added", false); 213e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } 214e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } else if (!strcmp(argv[2], "remove")) { 215e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt if (ifc_remove_route(argv[3], argv[4], prefix_length, argv[6])) { 216e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt cli->sendMsg(ResponseCode::OperationFailed, "Failed to remove route", true); 217e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } else { 218e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt cli->sendMsg(ResponseCode::CommandOkay, "Route removed", false); 219e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } 220e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } else { 221e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown interface cmd", false); 222e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } 223e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt return 0; 224e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } 225e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt 2265c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (!strcmp(argv[1], "getcfg")) { 2271d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwalt struct in_addr addr; 2281d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwalt int prefixLength; 2295c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat unsigned char hwaddr[6]; 2305c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat unsigned flags = 0; 2315c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 2325c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat ifc_init(); 2335c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat memset(hwaddr, 0, sizeof(hwaddr)); 2345c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 2351d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwalt if (ifc_get_info(argv[2], &addr.s_addr, &prefixLength, &flags)) { 2365c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Interface not found", true); 237e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff ifc_close(); 2385c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 2395c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 2405c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 2415c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (ifc_get_hwaddr(argv[2], (void *) hwaddr)) { 2425c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat LOGW("Failed to retrieve HW addr for %s (%s)", argv[2], strerror(errno)); 2435c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 2445c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 2455c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat char *addr_s = strdup(inet_ntoa(addr)); 2465c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat const char *updown, *brdcst, *loopbk, *ppp, *running, *multi; 2475c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 2485c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat updown = (flags & IFF_UP) ? "up" : "down"; 2495c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat brdcst = (flags & IFF_BROADCAST) ? " broadcast" : ""; 2505c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat loopbk = (flags & IFF_LOOPBACK) ? " loopback" : ""; 2515c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat ppp = (flags & IFF_POINTOPOINT) ? " point-to-point" : ""; 2525c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat running = (flags & IFF_RUNNING) ? " running" : ""; 2535c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat multi = (flags & IFF_MULTICAST) ? " multicast" : ""; 2545c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 2555c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat char *flag_s; 2565c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 257e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt asprintf(&flag_s, "[%s%s%s%s%s%s]", updown, brdcst, loopbk, ppp, running, multi); 2585c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 2595c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat char *msg = NULL; 2601d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwalt asprintf(&msg, "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x %s %d %s", 2615c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat hwaddr[0], hwaddr[1], hwaddr[2], hwaddr[3], hwaddr[4], hwaddr[5], 2621d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwalt addr_s, prefixLength, flag_s); 2635c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 26401fed783828b592cda3b774deea4099a9e690e3dSan Mehat cli->sendMsg(ResponseCode::InterfaceGetCfgResult, msg, false); 2655c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 2665c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat free(addr_s); 2675c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat free(flag_s); 2685c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat free(msg); 269e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff 270e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff ifc_close(); 2715c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 2725c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } else if (!strcmp(argv[1], "setcfg")) { 2731d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwalt // arglist: iface addr prefixLength [flags] 2745c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (argc < 5) { 2755c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 2765c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 2775c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 278e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt LOGD("Setting iface cfg"); 2795c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 2801d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwalt struct in_addr addr; 2815c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat unsigned flags = 0; 2825c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 2835c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (!inet_aton(argv[3], &addr)) { 2845c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandParameterError, "Invalid address", false); 2855c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 2865c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 2875c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 2885c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat ifc_init(); 2895c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (ifc_set_addr(argv[2], addr.s_addr)) { 2905c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to set address", true); 291e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff ifc_close(); 2925c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 2935c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 2945c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 295ab374f426a0d1d8598f3eb4b0339440dcb313a1aIrfan Sheriff //Set prefix length on a non zero address 296ab374f426a0d1d8598f3eb4b0339440dcb313a1aIrfan Sheriff if (addr.s_addr != 0 && ifc_set_prefixLength(argv[2], atoi(argv[4]))) { 2971d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwalt cli->sendMsg(ResponseCode::OperationFailed, "Failed to set prefixLength", true); 298e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff ifc_close(); 2995c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 3005c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 3015c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 3025c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat /* Process flags */ 303e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt /* read from "[XX" arg to "YY]" arg */ 304e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt bool bStarted = false; 3055c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat for (int i = 5; i < argc; i++) { 306e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt char *flag = argv[i]; 307e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt if (!bStarted) { 308e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt if (*flag == '[') { 309e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt flag++; 310e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt bStarted = true; 311e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt } else { 312e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt continue; 313e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt } 314e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt } 315e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt int len = strlen(flag); 316e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt if (flag[len-1] == ']') { 317e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt i = argc; // stop after this loop 318e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt flag[len-1] = 0; 319e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt } 320e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt if (!strcmp(flag, "up")) { 321e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt LOGD("Trying to bring up %s", argv[2]); 3225c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (ifc_up(argv[2])) { 3235c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat LOGE("Error upping interface"); 3245c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to up interface", true); 325e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff ifc_close(); 3265c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 3275c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 328e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt } else if (!strcmp(flag, "down")) { 329e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt LOGD("Trying to bring down %s", argv[2]); 3305c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (ifc_down(argv[2])) { 3315c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat LOGE("Error downing interface"); 3325c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to down interface", true); 333e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff ifc_close(); 3345c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 3355c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 336e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt } else if (!strcmp(flag, "broadcast")) { 337e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt LOGD("broadcast flag ignored"); 338e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt } else if (!strcmp(flag, "multicast")) { 339e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt LOGD("multicast flag ignored"); 3405c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } else { 3415c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandParameterError, "Flag unsupported", false); 342e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff ifc_close(); 3435c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 3445c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 3455c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 346e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff 3475c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Interface configuration set", false); 348e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff ifc_close(); 349e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff return 0; 350e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff } else if (!strcmp(argv[1], "clearaddrs")) { 351e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff // arglist: iface 352e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff unsigned count, addr; 353e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff 354e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff //IPv4 only right now 355e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff LOGD("Clearing all IP addresses on %s", argv[2]); 356e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff 357e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff ifc_init(); 358e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff for (count=0, addr=1;((addr != 0) && (count < 255)); count++) { 359e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff if (ifc_get_addr(argv[2], &addr) < 0) 360e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff break; 361e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff if (addr) 362e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff ifc_set_addr(argv[2], 0); 363e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff } 364e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff ifc_close(); 365e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff cli->sendMsg(ResponseCode::CommandOkay, "Interface IP addresses cleared", false); 3665c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 3675c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } else { 3685c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown interface cmd", false); 3695c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 3705c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 3715c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 372d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return 0; 373d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 374d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 3754a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall 376d5573d34c8fac49e16b20cf144486125bf940086San MehatCommandListener::ListTtysCmd::ListTtysCmd() : 377d5573d34c8fac49e16b20cf144486125bf940086San Mehat NetdCommand("list_ttys") { 378d5573d34c8fac49e16b20cf144486125bf940086San Mehat} 379d5573d34c8fac49e16b20cf144486125bf940086San Mehat 380d5573d34c8fac49e16b20cf144486125bf940086San Mehatint CommandListener::ListTtysCmd::runCommand(SocketClient *cli, 381d5573d34c8fac49e16b20cf144486125bf940086San Mehat int argc, char **argv) { 382d5573d34c8fac49e16b20cf144486125bf940086San Mehat TtyCollection *tlist = sPppCtrl->getTtyList(); 383d5573d34c8fac49e16b20cf144486125bf940086San Mehat TtyCollection::iterator it; 384d5573d34c8fac49e16b20cf144486125bf940086San Mehat 385d5573d34c8fac49e16b20cf144486125bf940086San Mehat for (it = tlist->begin(); it != tlist->end(); ++it) { 386d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::TtyListResult, *it, false); 387d5573d34c8fac49e16b20cf144486125bf940086San Mehat } 388d5573d34c8fac49e16b20cf144486125bf940086San Mehat 389d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Ttys listed.", false); 390d5573d34c8fac49e16b20cf144486125bf940086San Mehat return 0; 391d5573d34c8fac49e16b20cf144486125bf940086San Mehat} 392d5573d34c8fac49e16b20cf144486125bf940086San Mehat 393d18304287dbabc7835be771400b85d4ae8b63de6San MehatCommandListener::IpFwdCmd::IpFwdCmd() : 394d18304287dbabc7835be771400b85d4ae8b63de6San Mehat NetdCommand("ipfwd") { 395d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 396d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 397d18304287dbabc7835be771400b85d4ae8b63de6San Mehatint CommandListener::IpFwdCmd::runCommand(SocketClient *cli, 398d18304287dbabc7835be771400b85d4ae8b63de6San Mehat int argc, char **argv) { 3999d10b341a0ba46f108cb96e46691197d778cbc06San Mehat int rc = 0; 4009d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 4019d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (argc < 2) { 4029d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 4039d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 4049d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 4059d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 4069d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!strcmp(argv[1], "status")) { 4079d10b341a0ba46f108cb96e46691197d778cbc06San Mehat char *tmp = NULL; 4089d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 4099d10b341a0ba46f108cb96e46691197d778cbc06San Mehat asprintf(&tmp, "Forwarding %s", (sTetherCtrl->getIpFwdEnabled() ? "enabled" : "disabled")); 4109d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::IpFwdStatusResult, tmp, false); 4119d10b341a0ba46f108cb96e46691197d778cbc06San Mehat free(tmp); 4129d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 4139d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[1], "enable")) { 4149d10b341a0ba46f108cb96e46691197d778cbc06San Mehat rc = sTetherCtrl->setIpFwdEnabled(true); 4159d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[1], "disable")) { 4169d10b341a0ba46f108cb96e46691197d778cbc06San Mehat rc = sTetherCtrl->setIpFwdEnabled(false); 4179d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 4189d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown ipfwd cmd", false); 4199d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 4209d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 4219d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 4229d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!rc) { 4239d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandOkay, "ipfwd operation succeeded", false); 4249d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 4259d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::OperationFailed, "ipfwd operation failed", true); 4269d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 427d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 428d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return 0; 429d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 430d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 431d18304287dbabc7835be771400b85d4ae8b63de6San MehatCommandListener::TetherCmd::TetherCmd() : 432d18304287dbabc7835be771400b85d4ae8b63de6San Mehat NetdCommand("tether") { 433d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 434d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 435d18304287dbabc7835be771400b85d4ae8b63de6San Mehatint CommandListener::TetherCmd::runCommand(SocketClient *cli, 436d18304287dbabc7835be771400b85d4ae8b63de6San Mehat int argc, char **argv) { 4379d10b341a0ba46f108cb96e46691197d778cbc06San Mehat int rc = 0; 4389d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 439d18304287dbabc7835be771400b85d4ae8b63de6San Mehat if (argc < 2) { 440d18304287dbabc7835be771400b85d4ae8b63de6San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 441d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return 0; 442d18304287dbabc7835be771400b85d4ae8b63de6San Mehat } 443d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 4449d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!strcmp(argv[1], "stop")) { 4459d10b341a0ba46f108cb96e46691197d778cbc06San Mehat rc = sTetherCtrl->stopTethering(); 446d18304287dbabc7835be771400b85d4ae8b63de6San Mehat } else if (!strcmp(argv[1], "status")) { 4479d10b341a0ba46f108cb96e46691197d778cbc06San Mehat char *tmp = NULL; 4489d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 4499d10b341a0ba46f108cb96e46691197d778cbc06San Mehat asprintf(&tmp, "Tethering services %s", 4509d10b341a0ba46f108cb96e46691197d778cbc06San Mehat (sTetherCtrl->isTetheringStarted() ? "started" : "stopped")); 4519d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::TetherStatusResult, tmp, false); 4529d10b341a0ba46f108cb96e46691197d778cbc06San Mehat free(tmp); 453d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return 0; 4549d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 4559d10b341a0ba46f108cb96e46691197d778cbc06San Mehat /* 4569d10b341a0ba46f108cb96e46691197d778cbc06San Mehat * These commands take a minimum of 4 arguments 4579d10b341a0ba46f108cb96e46691197d778cbc06San Mehat */ 4589d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (argc < 4) { 4599d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 4609d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 4619d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 4629d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 4639d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!strcmp(argv[1], "start")) { 4643208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt if (argc % 2 == 1) { 4653208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt cli->sendMsg(ResponseCode::CommandSyntaxError, "Bad number of arguments", false); 4669d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 4679d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 4683208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt 4693208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt int num_addrs = argc - 2; 4703208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt int arg_index = 2; 4713208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt int array_index = 0; 4723208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt in_addr *addrs = (in_addr *)malloc(sizeof(in_addr) * num_addrs); 4733208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt while (array_index < num_addrs) { 4743208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt if (!inet_aton(argv[arg_index++], &(addrs[array_index++]))) { 4753208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt cli->sendMsg(ResponseCode::CommandParameterError, "Invalid address", false); 4763208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt free(addrs); 4773208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt return 0; 4783208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt } 4799d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 4803208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt rc = sTetherCtrl->startTethering(num_addrs, addrs); 4813208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt free(addrs); 4829d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[1], "interface")) { 4839d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!strcmp(argv[2], "add")) { 4849d10b341a0ba46f108cb96e46691197d778cbc06San Mehat rc = sTetherCtrl->tetherInterface(argv[3]); 4859d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[2], "remove")) { 4869d10b341a0ba46f108cb96e46691197d778cbc06San Mehat rc = sTetherCtrl->untetherInterface(argv[3]); 4879d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[2], "list")) { 4889d10b341a0ba46f108cb96e46691197d778cbc06San Mehat InterfaceCollection *ilist = sTetherCtrl->getTetheredInterfaceList(); 4899d10b341a0ba46f108cb96e46691197d778cbc06San Mehat InterfaceCollection::iterator it; 4909d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 4919d10b341a0ba46f108cb96e46691197d778cbc06San Mehat for (it = ilist->begin(); it != ilist->end(); ++it) { 4929d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::TetherInterfaceListResult, *it, false); 4939d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 4949d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 4959d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandParameterError, 4969d10b341a0ba46f108cb96e46691197d778cbc06San Mehat "Unknown tether interface operation", false); 4979d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 4989d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 4999d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[1], "dns")) { 5009d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!strcmp(argv[2], "set")) { 5019d10b341a0ba46f108cb96e46691197d778cbc06San Mehat rc = sTetherCtrl->setDnsForwarders(&argv[3], argc - 3); 5029d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[2], "list")) { 5039d10b341a0ba46f108cb96e46691197d778cbc06San Mehat NetAddressCollection *dlist = sTetherCtrl->getDnsForwarders(); 5049d10b341a0ba46f108cb96e46691197d778cbc06San Mehat NetAddressCollection::iterator it; 5059d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 5069d10b341a0ba46f108cb96e46691197d778cbc06San Mehat for (it = dlist->begin(); it != dlist->end(); ++it) { 5079d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::TetherDnsFwdTgtListResult, inet_ntoa(*it), false); 5089d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 5099d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 5109d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandParameterError, 5119d10b341a0ba46f108cb96e46691197d778cbc06San Mehat "Unknown tether interface operation", false); 5129d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 5139d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 5149d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 5159d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown tether cmd", false); 5169d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 5179d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 5189d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 5199d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 5209d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!rc) { 5219d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Tether operation succeeded", false); 5229d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 5239d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Tether operation failed", true); 524d18304287dbabc7835be771400b85d4ae8b63de6San Mehat } 525d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 526d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return 0; 527d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 528d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 529d18304287dbabc7835be771400b85d4ae8b63de6San MehatCommandListener::NatCmd::NatCmd() : 530d18304287dbabc7835be771400b85d4ae8b63de6San Mehat NetdCommand("nat") { 531d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 532d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 533d18304287dbabc7835be771400b85d4ae8b63de6San Mehatint CommandListener::NatCmd::runCommand(SocketClient *cli, 534d18304287dbabc7835be771400b85d4ae8b63de6San Mehat int argc, char **argv) { 5359d10b341a0ba46f108cb96e46691197d778cbc06San Mehat int rc = 0; 5369d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 5379d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (argc < 3) { 5389d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 5399d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 5409d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 5419d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 5429ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat if (!strcmp(argv[1], "enable")) { 5439ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat rc = sNatCtrl->enableNat(argv[2], argv[3]); 5449ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat } else if (!strcmp(argv[1], "disable")) { 5459ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat rc = sNatCtrl->disableNat(argv[2], argv[3]); 5469d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 5479d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown nat cmd", false); 5489d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 5499d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 5509d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 5519d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!rc) { 5529d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Nat operation succeeded", false); 5539d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 5549d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Nat operation failed", true); 5559d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 556d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 557d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return 0; 558d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 559d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 560d5573d34c8fac49e16b20cf144486125bf940086San MehatCommandListener::PppdCmd::PppdCmd() : 561d5573d34c8fac49e16b20cf144486125bf940086San Mehat NetdCommand("pppd") { 562d5573d34c8fac49e16b20cf144486125bf940086San Mehat} 563d5573d34c8fac49e16b20cf144486125bf940086San Mehat 564d5573d34c8fac49e16b20cf144486125bf940086San Mehatint CommandListener::PppdCmd::runCommand(SocketClient *cli, 565d5573d34c8fac49e16b20cf144486125bf940086San Mehat int argc, char **argv) { 566d5573d34c8fac49e16b20cf144486125bf940086San Mehat int rc = 0; 567d5573d34c8fac49e16b20cf144486125bf940086San Mehat 568d5573d34c8fac49e16b20cf144486125bf940086San Mehat if (argc < 3) { 569d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 570d5573d34c8fac49e16b20cf144486125bf940086San Mehat return 0; 571d5573d34c8fac49e16b20cf144486125bf940086San Mehat } 572d5573d34c8fac49e16b20cf144486125bf940086San Mehat 573d5573d34c8fac49e16b20cf144486125bf940086San Mehat if (!strcmp(argv[1], "attach")) { 57474d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt struct in_addr l, r, dns1, dns2; 57574d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt 57674d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt memset(&dns1, sizeof(struct in_addr), 0); 57774d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt memset(&dns2, sizeof(struct in_addr), 0); 578d5573d34c8fac49e16b20cf144486125bf940086San Mehat 579d5573d34c8fac49e16b20cf144486125bf940086San Mehat if (!inet_aton(argv[3], &l)) { 580d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::CommandParameterError, "Invalid local address", false); 581d5573d34c8fac49e16b20cf144486125bf940086San Mehat return 0; 582d5573d34c8fac49e16b20cf144486125bf940086San Mehat } 583d5573d34c8fac49e16b20cf144486125bf940086San Mehat if (!inet_aton(argv[4], &r)) { 584d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::CommandParameterError, "Invalid remote address", false); 585d5573d34c8fac49e16b20cf144486125bf940086San Mehat return 0; 586d5573d34c8fac49e16b20cf144486125bf940086San Mehat } 58774d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt if ((argc > 3) && (!inet_aton(argv[5], &dns1))) { 58874d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt cli->sendMsg(ResponseCode::CommandParameterError, "Invalid dns1 address", false); 58974d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt return 0; 59074d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt } 59174d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt if ((argc > 4) && (!inet_aton(argv[6], &dns2))) { 59274d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt cli->sendMsg(ResponseCode::CommandParameterError, "Invalid dns2 address", false); 59374d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt return 0; 59474d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt } 59574d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt rc = sPppCtrl->attachPppd(argv[2], l, r, dns1, dns2); 596d5573d34c8fac49e16b20cf144486125bf940086San Mehat } else if (!strcmp(argv[1], "detach")) { 597d5573d34c8fac49e16b20cf144486125bf940086San Mehat rc = sPppCtrl->detachPppd(argv[2]); 598d5573d34c8fac49e16b20cf144486125bf940086San Mehat } else { 599d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown pppd cmd", false); 600d5573d34c8fac49e16b20cf144486125bf940086San Mehat return 0; 601d5573d34c8fac49e16b20cf144486125bf940086San Mehat } 602d5573d34c8fac49e16b20cf144486125bf940086San Mehat 603d5573d34c8fac49e16b20cf144486125bf940086San Mehat if (!rc) { 604d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Pppd operation succeeded", false); 605d5573d34c8fac49e16b20cf144486125bf940086San Mehat } else { 606d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Pppd operation failed", true); 607d5573d34c8fac49e16b20cf144486125bf940086San Mehat } 608d5573d34c8fac49e16b20cf144486125bf940086San Mehat 609d5573d34c8fac49e16b20cf144486125bf940086San Mehat return 0; 610d5573d34c8fac49e16b20cf144486125bf940086San Mehat} 6111bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat 6121bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San MehatCommandListener::PanCmd::PanCmd() : 6131bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat NetdCommand("pan") { 6141bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat} 6151bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat 6161bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehatint CommandListener::PanCmd::runCommand(SocketClient *cli, 6171bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat int argc, char **argv) { 6181bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat int rc = 0; 6191bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat 6201bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat if (argc < 2) { 6211bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 6221bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat return 0; 6231bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat } 6241bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat 6251bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat if (!strcmp(argv[1], "start")) { 6261bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat rc = sPanCtrl->startPan(); 6271bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat } else if (!strcmp(argv[1], "stop")) { 6281bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat rc = sPanCtrl->stopPan(); 6291bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat } else if (!strcmp(argv[1], "status")) { 6301bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat char *tmp = NULL; 6311bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat 6321bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat asprintf(&tmp, "Pan services %s", 6331bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat (sPanCtrl->isPanStarted() ? "started" : "stopped")); 6341bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat cli->sendMsg(ResponseCode::PanStatusResult, tmp, false); 6351bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat free(tmp); 6361bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat return 0; 6371bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat } else { 6381bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown pan cmd", false); 6391bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat return 0; 6401bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat } 6411bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat 6421bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat if (!rc) { 6431bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Pan operation succeeded", false); 6441bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat } else { 6451bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Pan operation failed", true); 6461bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat } 6471bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat 6481bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat return 0; 6491bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat} 6505af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 6515af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry ShmidtCommandListener::SoftapCmd::SoftapCmd() : 6525af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt NetdCommand("softap") { 6535af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt} 6545af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 6555af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidtint CommandListener::SoftapCmd::runCommand(SocketClient *cli, 6565af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt int argc, char **argv) { 65731fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt int rc = 0, flag = 0; 658666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt char *retbuf = NULL; 6595af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 6605af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt if (argc < 2) { 6615af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt cli->sendMsg(ResponseCode::CommandSyntaxError, "Softap Missing argument", false); 6625af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt return 0; 6635af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } 6645af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 6655af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt if (!strcmp(argv[1], "start")) { 666c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt rc = sSoftapCtrl->startDriver(argv[2]); 6675af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } else if (!strcmp(argv[1], "stop")) { 668c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt rc = sSoftapCtrl->stopDriver(argv[2]); 669c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt } else if (!strcmp(argv[1], "startap")) { 670c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt rc = sSoftapCtrl->startSoftap(); 671c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt } else if (!strcmp(argv[1], "stopap")) { 6725af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt rc = sSoftapCtrl->stopSoftap(); 67331fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt } else if (!strcmp(argv[1], "fwreload")) { 67431fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt rc = sSoftapCtrl->fwReloadSoftap(argc, argv); 675666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt } else if (!strcmp(argv[1], "clients")) { 676666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt rc = sSoftapCtrl->clientsSoftap(&retbuf); 677666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt if (!rc) { 678666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt cli->sendMsg(ResponseCode::CommandOkay, retbuf, false); 679666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt free(retbuf); 680666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt return 0; 681666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt } 6825af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } else if (!strcmp(argv[1], "status")) { 683666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt asprintf(&retbuf, "Softap service %s", 6845af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt (sSoftapCtrl->isSoftapStarted() ? "started" : "stopped")); 685666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt cli->sendMsg(ResponseCode::SoftapStatusResult, retbuf, false); 686666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt free(retbuf); 6875af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt return 0; 6885af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } else if (!strcmp(argv[1], "set")) { 6895af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt rc = sSoftapCtrl->setSoftap(argc, argv); 6905af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } else { 6915af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt cli->sendMsg(ResponseCode::CommandSyntaxError, "Softap Unknown cmd", false); 6925af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt return 0; 6935af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } 6945af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 6955af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt if (!rc) { 6965af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt cli->sendMsg(ResponseCode::CommandOkay, "Softap operation succeeded", false); 6975af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } else { 6985af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt cli->sendMsg(ResponseCode::OperationFailed, "Softap operation failed", true); 6995af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } 7005af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 7015af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt return 0; 7025af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt} 7033e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt 70489c1e975f0c03997808d35c7be10b244c5309f9fMattias FalkCommandListener::ResolverCmd::ResolverCmd() : 70589c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk NetdCommand("resolver") { 70689c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk} 70789c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk 70889c1e975f0c03997808d35c7be10b244c5309f9fMattias Falkint CommandListener::ResolverCmd::runCommand(SocketClient *cli, int argc, char **argv) { 70989c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk int rc = 0; 71089c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk struct in_addr addr; 71189c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk 71289c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk if (argc < 2) { 71389c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk cli->sendMsg(ResponseCode::CommandSyntaxError, "Resolver missing arguments", false); 71489c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk return 0; 71589c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } 71689c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk 71789c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk if (!strcmp(argv[1], "setdefaultif")) { // "resolver setdefaultif <iface>" 71889c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk if (argc == 3) { 71989c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk rc = sResolverCtrl->setDefaultInterface(argv[2]); 72089c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } else { 72189c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk cli->sendMsg(ResponseCode::CommandSyntaxError, 72289c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk "Wrong number of arguments to resolver setdefaultif", false); 72389c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk return 0; 72489c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } 72589c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } else if (!strcmp(argv[1], "setifdns")) { // "resolver setifdns <iface> <dns1> <dns2> ..." 72689c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk if (argc >= 4) { 72789c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk rc = sResolverCtrl->setInterfaceDnsServers(argv[2], &argv[3], argc - 3); 72889c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } else { 72989c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk cli->sendMsg(ResponseCode::CommandSyntaxError, 73089c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk "Wrong number of arguments to resolver setifdns", false); 73189c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk return 0; 73289c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } 73389c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk 73489c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk // set the address of the interface to which the name servers 73589c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk // are bound. Required in order to bind to right interface when 73689c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk // doing the dns query. 73789c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk if (!rc) { 73889c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk ifc_init(); 73989c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk ifc_get_info(argv[2], &addr.s_addr, NULL, 0); 74089c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk 74189c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk rc = sResolverCtrl->setInterfaceAddress(argv[2], &addr); 74289c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } 74389c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } else if (!strcmp(argv[1], "flushdefaultif")) { // "resolver flushdefaultif" 74489c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk if (argc == 2) { 74589c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk rc = sResolverCtrl->flushDefaultDnsCache(); 74689c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } else { 74789c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk cli->sendMsg(ResponseCode::CommandSyntaxError, 74889c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk "Wrong number of arguments to resolver flushdefaultif", false); 74989c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk return 0; 75089c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } 75189c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } else if (!strcmp(argv[1], "flushif")) { // "resolver flushif <iface>" 75289c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk if (argc == 3) { 75389c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk rc = sResolverCtrl->flushInterfaceDnsCache(argv[2]); 75489c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } else { 75589c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk cli->sendMsg(ResponseCode::CommandSyntaxError, 75689c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk "Wrong number of arguments to resolver setdefaultif", false); 75789c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk return 0; 75889c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } 75989c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } else { 76089c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk cli->sendMsg(ResponseCode::CommandSyntaxError,"Resolver unknown command", false); 76189c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk return 0; 76289c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } 76389c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk 76489c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk if (!rc) { 76589c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk cli->sendMsg(ResponseCode::CommandOkay, "Resolver command succeeded", false); 76689c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } else { 76789c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk cli->sendMsg(ResponseCode::OperationFailed, "Resolver command failed", true); 76889c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } 76989c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk 77089c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk return 0; 77189c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk} 77289c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk 7738e46896b4c4be5deaef651a12b17314f63ae9070San Mehatint CommandListener::readInterfaceCounters(const char *iface, unsigned long *rx, unsigned long *tx) { 7748e46896b4c4be5deaef651a12b17314f63ae9070San Mehat FILE *fp = fopen("/proc/net/dev", "r"); 7758e46896b4c4be5deaef651a12b17314f63ae9070San Mehat if (!fp) { 7768e46896b4c4be5deaef651a12b17314f63ae9070San Mehat LOGE("Failed to open /proc/net/dev (%s)", strerror(errno)); 7778e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return -1; 7788e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 7798e46896b4c4be5deaef651a12b17314f63ae9070San Mehat 7808e46896b4c4be5deaef651a12b17314f63ae9070San Mehat char buffer[512]; 7818e46896b4c4be5deaef651a12b17314f63ae9070San Mehat 7828e46896b4c4be5deaef651a12b17314f63ae9070San Mehat fgets(buffer, sizeof(buffer), fp); // Header 1 7838e46896b4c4be5deaef651a12b17314f63ae9070San Mehat fgets(buffer, sizeof(buffer), fp); // Header 2 7848e46896b4c4be5deaef651a12b17314f63ae9070San Mehat while(fgets(buffer, sizeof(buffer), fp)) { 7858e46896b4c4be5deaef651a12b17314f63ae9070San Mehat buffer[strlen(buffer)-1] = '\0'; 7868e46896b4c4be5deaef651a12b17314f63ae9070San Mehat 787651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt char name[31]; 7888e46896b4c4be5deaef651a12b17314f63ae9070San Mehat unsigned long d; 789651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt sscanf(buffer, "%30s %lu %lu %lu %lu %lu %lu %lu %lu %lu", 7908e46896b4c4be5deaef651a12b17314f63ae9070San Mehat name, rx, &d, &d, &d, &d, &d, &d, &d, tx); 791651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt char *rxString = strchr(name, ':'); 792651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt *rxString = '\0'; 793651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt rxString++; 794651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt // when the rx count gets too big it changes from "name: 999" to "name:1000" 795651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt // and the sscanf munge the two together. Detect that and fix 796651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt // note that all the %lu will be off by one and the real tx value will be in d 797651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt if (*rxString != '\0') { 798651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt *tx = d; 799651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt sscanf(rxString, "%20lu", rx); 800651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt } 8018e46896b4c4be5deaef651a12b17314f63ae9070San Mehat if (strcmp(name, iface)) { 8028e46896b4c4be5deaef651a12b17314f63ae9070San Mehat continue; 8038e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 8048e46896b4c4be5deaef651a12b17314f63ae9070San Mehat fclose(fp); 8058e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 8068e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 8078e46896b4c4be5deaef651a12b17314f63ae9070San Mehat 8088e46896b4c4be5deaef651a12b17314f63ae9070San Mehat fclose(fp); 80931c61c80a013bd1a050f0f4103e13fba62bf1717Robert Greenwalt *rx = 0; 81031c61c80a013bd1a050f0f4103e13fba62bf1717Robert Greenwalt *tx = 0; 81131c61c80a013bd1a050f0f4103e13fba62bf1717Robert Greenwalt return 0; 8128e46896b4c4be5deaef651a12b17314f63ae9070San Mehat} 8134a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall 8144a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP AbgrallCommandListener::BandwidthControlCmd::BandwidthControlCmd() : 8150dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall NetdCommand("bandwidth") { 8164a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall} 8174a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall 818fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrallint CommandListener::BandwidthControlCmd::runCommand(SocketClient *cli, int argc, char **argv) { 8194a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall int rc = 0; 820fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall LOGD("bwctrlcmd: argc=%d argv[0]=%s", argc, argv[0]); 8214a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall if (argc < 2) { 822fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 8234a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall return 0; 8244a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall } 8254a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall 8264a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall if (!strcmp(argv[1], "enable")) { 8274a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall rc = sBandwidthCtrl->enableBandwidthControl(); 8284a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall } else if (!strcmp(argv[1], "disable")) { 8294a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall rc = sBandwidthCtrl->disableBandwidthControl(); 8300dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall 831fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall } else if (!strcmp(argv[1], "removequota") || !strcmp(argv[1], "rq")) { 832fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall if (argc != 3) { 833fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, 834fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall "Usage: bandwidth removequota <interface>", false); 835fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall return 0; 836fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall } 837fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall rc = sBandwidthCtrl->removeInterfaceSharedQuota(argv[2]); 838fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall 8398a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } else if (!strcmp(argv[1], "getquota") || !strcmp(argv[1], "gq")) { 8408a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall int64_t bytes; 8418a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (argc != 2) { 8428a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, 8438a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall "Usage: bandwidth getquota", false); 8448a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 8458a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 8468a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall rc = sBandwidthCtrl->getInterfaceSharedQuota(&bytes); 8478a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (rc) { 8488a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall cli->sendMsg(ResponseCode::OperationFailed, "Failed to get quota", true); 8498a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 8508a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 8518a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall char *msg; 8528a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall asprintf(&msg, "%lld", bytes); 8538a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall cli->sendMsg(ResponseCode::QuotaCounterResult, msg, false); 8548a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall free(msg); 8558a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall 8568a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } else if (!strcmp(argv[1], "getiquota") || !strcmp(argv[1], "giq")) { 8578a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall int64_t bytes; 8588a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (argc != 3) { 8598a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, 8608a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall "Usage: bandwidth getiquota <iface>", false); 8618a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 8628a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 8638a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall rc = sBandwidthCtrl->getInterfaceQuota(argv[2], &bytes); 8648a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (rc) { 8658a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall cli->sendMsg(ResponseCode::OperationFailed, "Failed to get quota", true); 8668a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 8678a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 8688a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall char *msg; 8698a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall asprintf(&msg, "%lld", bytes); 8708a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall cli->sendMsg(ResponseCode::QuotaCounterResult, msg, false); 8718a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall free(msg); 8728a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall 873fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall } else if (!strcmp(argv[1], "setquota") || !strcmp(argv[1], "sq")) { 874fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall if (argc != 4) { 875fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, 876fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall "Usage: bandwidth setquota <interface> <bytes>", false); 877fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall return 0; 878fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall } 8790dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall rc = sBandwidthCtrl->setInterfaceSharedQuota(argv[2], atoll(argv[3])); 880fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall 881fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall } else if (!strcmp(argv[1], "setquotas") || !strcmp(argv[1], "sqs")) { 882fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall if (argc < 4) { 883fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, 884fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall "Usage: bandwidth setquotas <bytes> <interface> ...", false); 885fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall return 0; 886fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall } 8878a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall for (int q = 3; argc >= 4; q++, argc--) { 8880dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall rc = sBandwidthCtrl->setInterfaceSharedQuota(argv[q], atoll(argv[2])); 8890dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall if (rc) { 8900dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall char *msg; 8910dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall asprintf(&msg, "bandwidth setquotas %s %s failed", argv[2], argv[q]); 8920dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall cli->sendMsg(ResponseCode::OperationFailed, 8930dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall msg, false); 8940dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall free(msg); 8950dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall break; 8960dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall } 8970dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall } 8980dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall 8990dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall } else if (!strcmp(argv[1], "removequotas") || !strcmp(argv[1], "rqs")) { 9000dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall if (argc < 3) { 9010dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, 9020dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall "Usage: bandwidth removequotas <interface> ...", false); 9030dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall return 0; 9040dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall } 9058a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall for (int q = 2; argc >= 3; q++, argc--) { 9060dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall rc = sBandwidthCtrl->removeInterfaceSharedQuota(argv[q]); 9070dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall if (rc) { 9080dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall char *msg; 9090dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall asprintf(&msg, "bandwidth removequotas %s failed", argv[q]); 9100dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall cli->sendMsg(ResponseCode::OperationFailed, 9110dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall msg, false); 9120dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall free(msg); 9130dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall break; 9140dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall } 9150dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall } 9160dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall 9170dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall } else if (!strcmp(argv[1], "removeiquota") || !strcmp(argv[1], "riq")) { 9180dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall if (argc != 3) { 9190dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, 9200dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall "Usage: bandwidth removeiquota <interface>", false); 9210dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall return 0; 9220dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall } 9230dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall rc = sBandwidthCtrl->removeInterfaceQuota(argv[2]); 9240dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall 9250dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall } else if (!strcmp(argv[1], "setiquota") || !strcmp(argv[1], "siq")) { 9260dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall if (argc != 4) { 9270dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, 9280dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall "Usage: bandwidth setiquota <interface> <bytes>", false); 9290dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall return 0; 9300dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall } 9310dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall rc = sBandwidthCtrl->setInterfaceQuota(argv[2], atoll(argv[3])); 932fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall 933fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall } else if (!strcmp(argv[1], "addnaughtyapps") || !strcmp(argv[1], "ana")) { 934fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall if (argc < 3) { 935fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, 936fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall "Usage: bandwidth addnaughtyapps <appUid> ...", false); 9374a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall return 0; 938fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall } 939fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall rc = sBandwidthCtrl->addNaughtyApps(argc - 2, argv + 2); 940fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall 941fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall } else if (!strcmp(argv[1], "removenaughtyapps") || !strcmp(argv[1], "rna")) { 942fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall if (argc < 3) { 943fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, 9448a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall "Usage: bandwidth removenaughtyapps <appUid> ...", false); 945fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall return 0; 946fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall } 947fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall rc = sBandwidthCtrl->removeNaughtyApps(argc - 2, argv + 2); 948fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall 9498a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } else if (!strcmp(argv[1], "setglobalalert") || !strcmp(argv[1], "sga")) { 9508a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (argc != 3) { 9518a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, 9528a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall "Usage: bandwidth setglobalalert <bytes>", false); 9538a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 9548a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 9558a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall rc = sBandwidthCtrl->setGlobalAlert(atoll(argv[2])); 9568a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall 9578a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } else if (!strcmp(argv[1], "removeglobalalert") || !strcmp(argv[1], "rga")) { 9588a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (argc != 2) { 9598a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, 9608a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall "Usage: bandwidth removeglobalalert", false); 9618a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 9628a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 9638a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall rc = sBandwidthCtrl->removeGlobalAlert(); 9648a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall 9658a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } else if (!strcmp(argv[1], "setsharedalert") || !strcmp(argv[1], "ssa")) { 9668a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (argc != 3) { 9678a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, 9688a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall "Usage: bandwidth setsharedalert <bytes>", false); 9698a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 9708a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 9718a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall rc = sBandwidthCtrl->setSharedAlert(atoll(argv[2])); 9728a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall 9738a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } else if (!strcmp(argv[1], "removesharedalert") || !strcmp(argv[1], "rsa")) { 9748a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (argc != 2) { 9758a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, 9768a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall "Usage: bandwidth removesharedalert", false); 9778a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 9788a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 9798a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall rc = sBandwidthCtrl->removeSharedAlert(); 9808a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall 9818a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } else if (!strcmp(argv[1], "setinterfacealert") || !strcmp(argv[1], "sia")) { 9828a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (argc != 4) { 9838a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, 9848a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall "Usage: bandwidth setinterfacealert <interface> <bytes>", false); 9858a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 9868a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 9878a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall rc = sBandwidthCtrl->setInterfaceAlert(argv[2], atoll(argv[3])); 9888a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall 9898a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } else if (!strcmp(argv[1], "removeinterfacealert") || !strcmp(argv[1], "ria")) { 9908a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (argc != 3) { 9918a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, 9928a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall "Usage: bandwidth removeinterfacealert <interface>", false); 9938a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 9948a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 9958a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall rc = sBandwidthCtrl->removeInterfaceAlert(argv[2]); 9968a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall 997fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall } else { 998fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown bandwidth cmd", false); 999fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall return 0; 10004a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall } 10014a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall 10024a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall if (!rc) { 10034a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall cli->sendMsg(ResponseCode::CommandOkay, "Bandwidth command succeeeded", false); 10044a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall } else { 10054a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall cli->sendMsg(ResponseCode::OperationFailed, "Bandwidth command failed", true); 10064a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall } 10074a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall return 0; 10084a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall} 1009