CommandListener.cpp revision db7da58e8d2aa021060098057f944ef754be06e3
1d18304287dbabc7835be771400b85d4ae8b63de6San Mehat/* 2d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * Copyright (C) 2008 The Android Open Source Project 3d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * 4d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * Licensed under the Apache License, Version 2.0 (the "License"); 5d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * you may not use this file except in compliance with the License. 6d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * You may obtain a copy of the License at 7d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * 8d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * http://www.apache.org/licenses/LICENSE-2.0 9d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * 10d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * Unless required by applicable law or agreed to in writing, software 11d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * distributed under the License is distributed on an "AS IS" BASIS, 12d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * See the License for the specific language governing permissions and 14d18304287dbabc7835be771400b85d4ae8b63de6San Mehat * limitations under the License. 15d18304287dbabc7835be771400b85d4ae8b63de6San Mehat */ 16d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 17db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall// #define LOG_NDEBUG 0 18db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 19d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <stdlib.h> 20d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <sys/socket.h> 21d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <sys/types.h> 22d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <netinet/in.h> 23d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <arpa/inet.h> 24d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <dirent.h> 25d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <errno.h> 26ff2c0d8c13457e43f0d4bf06d3177271aac104c1Olivier Bailly#include <string.h> 2732a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff#include <fcntl.h> 28d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 295c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat#include <linux/if.h> 305c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 31d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#define LOG_TAG "CommandListener" 32d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <cutils/log.h> 33d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 34d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <sysutils/SocketClient.h> 35d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 36d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include "CommandListener.h" 37d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include "ResponseCode.h" 38a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat#include "ThrottleController.h" 394a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall#include "BandwidthController.h" 40a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat 41d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 425c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehatextern "C" int ifc_init(void); 43e734edd35d8d02da96330d77420650c044a12527Irfan Sheriffextern "C" int ifc_close(void); 445c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehatextern "C" int ifc_get_hwaddr(const char *name, void *ptr); 451d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwaltextern "C" int ifc_get_info(const char *name, in_addr_t *addr, int *prefixLength, unsigned *flags); 46e734edd35d8d02da96330d77420650c044a12527Irfan Sheriffextern "C" int ifc_get_addr(const char *name, in_addr_t *addr); 475c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehatextern "C" int ifc_set_addr(const char *name, in_addr_t addr); 481d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwaltextern "C" int ifc_set_prefixLength(const char *name, int prefixLength); 495c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehatextern "C" int ifc_up(const char *name); 505c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehatextern "C" int ifc_down(const char *name); 51e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwaltextern "C" int ifc_add_route(const char *name, const char *dst, int prefix_length, const char *gw); 52e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwaltextern "C" int ifc_remove_route(const char *name, const char *dst, int p_length, const char *gw); 535c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 549d10b341a0ba46f108cb96e46691197d778cbc06San MehatTetherController *CommandListener::sTetherCtrl = NULL; 559ff78fb7da7158f5bd7c86d89a842691820259cfSan MehatNatController *CommandListener::sNatCtrl = NULL; 56d5573d34c8fac49e16b20cf144486125bf940086San MehatPppController *CommandListener::sPppCtrl = NULL; 571bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San MehatPanController *CommandListener::sPanCtrl = NULL; 585af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry ShmidtSoftapController *CommandListener::sSoftapCtrl = NULL; 594a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP AbgrallBandwidthController * CommandListener::sBandwidthCtrl = NULL; 6089c1e975f0c03997808d35c7be10b244c5309f9fMattias FalkResolverController *CommandListener::sResolverCtrl = NULL; 619d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 62d18304287dbabc7835be771400b85d4ae8b63de6San MehatCommandListener::CommandListener() : 63d18304287dbabc7835be771400b85d4ae8b63de6San Mehat FrameworkListener("netd") { 645c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat registerCmd(new InterfaceCmd()); 65d18304287dbabc7835be771400b85d4ae8b63de6San Mehat registerCmd(new IpFwdCmd()); 66d18304287dbabc7835be771400b85d4ae8b63de6San Mehat registerCmd(new TetherCmd()); 67d18304287dbabc7835be771400b85d4ae8b63de6San Mehat registerCmd(new NatCmd()); 68d5573d34c8fac49e16b20cf144486125bf940086San Mehat registerCmd(new ListTtysCmd()); 69d5573d34c8fac49e16b20cf144486125bf940086San Mehat registerCmd(new PppdCmd()); 701bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat registerCmd(new PanCmd()); 715af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt registerCmd(new SoftapCmd()); 724a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall registerCmd(new BandwidthControlCmd()); 7389c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk registerCmd(new ResolverCmd()); 749d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 759d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!sTetherCtrl) 769d10b341a0ba46f108cb96e46691197d778cbc06San Mehat sTetherCtrl = new TetherController(); 779ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat if (!sNatCtrl) 789ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat sNatCtrl = new NatController(); 79d5573d34c8fac49e16b20cf144486125bf940086San Mehat if (!sPppCtrl) 80d5573d34c8fac49e16b20cf144486125bf940086San Mehat sPppCtrl = new PppController(); 811bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat if (!sPanCtrl) 821bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat sPanCtrl = new PanController(); 835af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt if (!sSoftapCtrl) 845af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt sSoftapCtrl = new SoftapController(); 854a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall if (!sBandwidthCtrl) 864a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall sBandwidthCtrl = new BandwidthController(); 8789c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk if (!sResolverCtrl) 8889c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk sResolverCtrl = new ResolverController(); 89d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 90d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 915c1b8af16dbbc20c89aaca2f93e725e12b16d055San MehatCommandListener::InterfaceCmd::InterfaceCmd() : 925c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat NetdCommand("interface") { 93d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 94d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 955c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehatint CommandListener::InterfaceCmd::runCommand(SocketClient *cli, 96d18304287dbabc7835be771400b85d4ae8b63de6San Mehat int argc, char **argv) { 975c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (argc < 2) { 985c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 995c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 1005c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 1015c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 1025c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (!strcmp(argv[1], "list")) { 1035c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat DIR *d; 1045c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat struct dirent *de; 1055c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 1065c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (!(d = opendir("/sys/class/net"))) { 1075c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to open sysfs dir", true); 1085c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 1095c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 1105c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 1115c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat while((de = readdir(d))) { 1125c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (de->d_name[0] == '.') 1135c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat continue; 1145c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::InterfaceListResult, de->d_name, false); 1155c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 1165c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat closedir(d); 1175c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Interface list completed", false); 1185c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 1198e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } else if (!strcmp(argv[1], "readrxcounter")) { 1208e46896b4c4be5deaef651a12b17314f63ae9070San Mehat if (argc != 3) { 1218e46896b4c4be5deaef651a12b17314f63ae9070San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, 1228e46896b4c4be5deaef651a12b17314f63ae9070San Mehat "Usage: interface readrxcounter <interface>", false); 1238e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 1248e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 1258e46896b4c4be5deaef651a12b17314f63ae9070San Mehat unsigned long rx = 0, tx = 0; 1268e46896b4c4be5deaef651a12b17314f63ae9070San Mehat if (readInterfaceCounters(argv[2], &rx, &tx)) { 1278e46896b4c4be5deaef651a12b17314f63ae9070San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to read counters", true); 1288e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 1298e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 1308e46896b4c4be5deaef651a12b17314f63ae9070San Mehat 1318e46896b4c4be5deaef651a12b17314f63ae9070San Mehat char *msg; 1328e46896b4c4be5deaef651a12b17314f63ae9070San Mehat asprintf(&msg, "%lu", rx); 1338e46896b4c4be5deaef651a12b17314f63ae9070San Mehat cli->sendMsg(ResponseCode::InterfaceRxCounterResult, msg, false); 1348e46896b4c4be5deaef651a12b17314f63ae9070San Mehat free(msg); 1358e46896b4c4be5deaef651a12b17314f63ae9070San Mehat 1368e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 1378e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } else if (!strcmp(argv[1], "readtxcounter")) { 1388e46896b4c4be5deaef651a12b17314f63ae9070San Mehat if (argc != 3) { 1398e46896b4c4be5deaef651a12b17314f63ae9070San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, 1408e46896b4c4be5deaef651a12b17314f63ae9070San Mehat "Usage: interface readtxcounter <interface>", false); 1418e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 1428e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 1438e46896b4c4be5deaef651a12b17314f63ae9070San Mehat unsigned long rx = 0, tx = 0; 1448e46896b4c4be5deaef651a12b17314f63ae9070San Mehat if (readInterfaceCounters(argv[2], &rx, &tx)) { 1458e46896b4c4be5deaef651a12b17314f63ae9070San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to read counters", true); 1468e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 1478e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 1488e46896b4c4be5deaef651a12b17314f63ae9070San Mehat 1498e46896b4c4be5deaef651a12b17314f63ae9070San Mehat char *msg = NULL; 1508e46896b4c4be5deaef651a12b17314f63ae9070San Mehat asprintf(&msg, "%lu", tx); 1518e46896b4c4be5deaef651a12b17314f63ae9070San Mehat cli->sendMsg(ResponseCode::InterfaceTxCounterResult, msg, false); 1528e46896b4c4be5deaef651a12b17314f63ae9070San Mehat free(msg); 1538e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 1548e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } else if (!strcmp(argv[1], "getthrottle")) { 155a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat if (argc != 4 || (argc == 4 && (strcmp(argv[3], "rx") && (strcmp(argv[3], "tx"))))) { 1568e46896b4c4be5deaef651a12b17314f63ae9070San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, 1578e46896b4c4be5deaef651a12b17314f63ae9070San Mehat "Usage: interface getthrottle <interface> <rx|tx>", false); 1588e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 1598e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 160a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat int val = 0; 161a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat int rc = 0; 162a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat int voldRc = ResponseCode::InterfaceRxThrottleResult; 163a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat 164a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat if (!strcmp(argv[3], "rx")) { 165a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat rc = ThrottleController::getInterfaceRxThrottle(argv[2], &val); 166a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat } else { 167a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat rc = ThrottleController::getInterfaceTxThrottle(argv[2], &val); 168a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat voldRc = ResponseCode::InterfaceTxThrottleResult; 169a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat } 170a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat if (rc) { 171a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to get throttle", true); 172a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat } else { 173a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat char *msg = NULL; 174a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat asprintf(&msg, "%u", val); 175a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat cli->sendMsg(voldRc, msg, false); 176a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat free(msg); 177a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat return 0; 178a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat } 1798e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 1808e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } else if (!strcmp(argv[1], "setthrottle")) { 1818e46896b4c4be5deaef651a12b17314f63ae9070San Mehat if (argc != 5) { 1828e46896b4c4be5deaef651a12b17314f63ae9070San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, 183a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat "Usage: interface setthrottle <interface> <rx_kbps> <tx_kbps>", false); 1848e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 1858e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 186a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat if (ThrottleController::setInterfaceThrottle(argv[2], atoi(argv[3]), atoi(argv[4]))) { 187a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to set throttle", true); 188a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat } else { 189a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Interface throttling set", false); 190a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat } 1918e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 1925c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } else { 1935c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat /* 1945c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat * These commands take a minimum of 3 arguments 1955c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat */ 1965c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (argc < 3) { 1975c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 1985c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 1995c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 200e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt 201e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt if (!strcmp(argv[1], "route")) { 202e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt int prefix_length = 0; 203e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt if (argc < 7) { 204e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 205e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt return 0; 206e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } 207e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt if (sscanf(argv[5], "%d", &prefix_length) != 1) { 208e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt cli->sendMsg(ResponseCode::CommandParameterError, "Invalid route prefix", false); 209e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt return 0; 210e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } 211e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt if (!strcmp(argv[2], "add")) { 212e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt if (ifc_add_route(argv[3], argv[4], prefix_length, argv[6])) { 213e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt cli->sendMsg(ResponseCode::OperationFailed, "Failed to add route", true); 214e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } else { 215e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt cli->sendMsg(ResponseCode::CommandOkay, "Route added", false); 216e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } 217e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } else if (!strcmp(argv[2], "remove")) { 218e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt if (ifc_remove_route(argv[3], argv[4], prefix_length, argv[6])) { 219e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt cli->sendMsg(ResponseCode::OperationFailed, "Failed to remove route", true); 220e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } else { 221e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt cli->sendMsg(ResponseCode::CommandOkay, "Route removed", false); 222e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } 223e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } else { 224e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown interface cmd", false); 225e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } 226e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt return 0; 227e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } 228e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt 2295c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (!strcmp(argv[1], "getcfg")) { 2301d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwalt struct in_addr addr; 2311d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwalt int prefixLength; 2325c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat unsigned char hwaddr[6]; 2335c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat unsigned flags = 0; 2345c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 2355c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat ifc_init(); 2365c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat memset(hwaddr, 0, sizeof(hwaddr)); 2375c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 2381d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwalt if (ifc_get_info(argv[2], &addr.s_addr, &prefixLength, &flags)) { 2395c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Interface not found", true); 240e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff ifc_close(); 2415c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 2425c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 2435c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 2445c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (ifc_get_hwaddr(argv[2], (void *) hwaddr)) { 2455c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat LOGW("Failed to retrieve HW addr for %s (%s)", argv[2], strerror(errno)); 2465c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 2475c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 2485c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat char *addr_s = strdup(inet_ntoa(addr)); 2495c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat const char *updown, *brdcst, *loopbk, *ppp, *running, *multi; 2505c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 2515c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat updown = (flags & IFF_UP) ? "up" : "down"; 2525c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat brdcst = (flags & IFF_BROADCAST) ? " broadcast" : ""; 2535c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat loopbk = (flags & IFF_LOOPBACK) ? " loopback" : ""; 2545c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat ppp = (flags & IFF_POINTOPOINT) ? " point-to-point" : ""; 2555c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat running = (flags & IFF_RUNNING) ? " running" : ""; 2565c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat multi = (flags & IFF_MULTICAST) ? " multicast" : ""; 2575c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 2585c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat char *flag_s; 2595c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 260e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt asprintf(&flag_s, "[%s%s%s%s%s%s]", updown, brdcst, loopbk, ppp, running, multi); 2615c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 2625c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat char *msg = NULL; 2631d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwalt asprintf(&msg, "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x %s %d %s", 2645c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat hwaddr[0], hwaddr[1], hwaddr[2], hwaddr[3], hwaddr[4], hwaddr[5], 2651d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwalt addr_s, prefixLength, flag_s); 2665c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 26701fed783828b592cda3b774deea4099a9e690e3dSan Mehat cli->sendMsg(ResponseCode::InterfaceGetCfgResult, msg, false); 2685c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 2695c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat free(addr_s); 2705c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat free(flag_s); 2715c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat free(msg); 272e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff 273e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff ifc_close(); 2745c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 2755c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } else if (!strcmp(argv[1], "setcfg")) { 2761d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwalt // arglist: iface addr prefixLength [flags] 2775c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (argc < 5) { 2785c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 2795c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 2805c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 281e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt LOGD("Setting iface cfg"); 2825c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 2831d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwalt struct in_addr addr; 2845c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat unsigned flags = 0; 2855c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 2865c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (!inet_aton(argv[3], &addr)) { 2875c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandParameterError, "Invalid address", false); 2885c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 2895c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 2905c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 2915c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat ifc_init(); 2925c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (ifc_set_addr(argv[2], addr.s_addr)) { 2935c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to set address", true); 294e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff ifc_close(); 2955c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 2965c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 2975c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 298ab374f426a0d1d8598f3eb4b0339440dcb313a1aIrfan Sheriff //Set prefix length on a non zero address 299ab374f426a0d1d8598f3eb4b0339440dcb313a1aIrfan Sheriff if (addr.s_addr != 0 && ifc_set_prefixLength(argv[2], atoi(argv[4]))) { 3001d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwalt cli->sendMsg(ResponseCode::OperationFailed, "Failed to set prefixLength", true); 301e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff ifc_close(); 3025c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 3035c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 3045c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 3055c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat /* Process flags */ 306e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt /* read from "[XX" arg to "YY]" arg */ 307e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt bool bStarted = false; 3085c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat for (int i = 5; i < argc; i++) { 309e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt char *flag = argv[i]; 310e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt if (!bStarted) { 311e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt if (*flag == '[') { 312e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt flag++; 313e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt bStarted = true; 314e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt } else { 315e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt continue; 316e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt } 317e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt } 318e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt int len = strlen(flag); 319e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt if (flag[len-1] == ']') { 320e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt i = argc; // stop after this loop 321e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt flag[len-1] = 0; 322e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt } 323e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt if (!strcmp(flag, "up")) { 324e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt LOGD("Trying to bring up %s", argv[2]); 3255c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (ifc_up(argv[2])) { 3265c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat LOGE("Error upping interface"); 3275c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to up interface", true); 328e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff ifc_close(); 3295c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 3305c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 331e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt } else if (!strcmp(flag, "down")) { 332e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt LOGD("Trying to bring down %s", argv[2]); 3335c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (ifc_down(argv[2])) { 3345c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat LOGE("Error downing interface"); 3355c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to down interface", true); 336e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff ifc_close(); 3375c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 3385c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 339e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt } else if (!strcmp(flag, "broadcast")) { 340e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt LOGD("broadcast flag ignored"); 341e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt } else if (!strcmp(flag, "multicast")) { 342e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt LOGD("multicast flag ignored"); 3435c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } else { 3445c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandParameterError, "Flag unsupported", false); 345e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff ifc_close(); 3465c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 3475c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 3485c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 349e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff 3505c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Interface configuration set", false); 351e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff ifc_close(); 352e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff return 0; 353e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff } else if (!strcmp(argv[1], "clearaddrs")) { 354e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff // arglist: iface 355e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff unsigned count, addr; 356e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff 357e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff //IPv4 only right now 358e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff LOGD("Clearing all IP addresses on %s", argv[2]); 359e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff 360e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff ifc_init(); 361e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff for (count=0, addr=1;((addr != 0) && (count < 255)); count++) { 362e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff if (ifc_get_addr(argv[2], &addr) < 0) 363e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff break; 364e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff if (addr) 365e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff ifc_set_addr(argv[2], 0); 366e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff } 367e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff ifc_close(); 368e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff cli->sendMsg(ResponseCode::CommandOkay, "Interface IP addresses cleared", false); 3695c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 37032a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff } else if (!strcmp(argv[1], "ipv6privacyextensions")) { 37132a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff if (argc != 4) { 37232a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff cli->sendMsg(ResponseCode::CommandSyntaxError, 37332a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff "Usage: interface ipv6privacyextensions <interface> <enable|disable>", 37432a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff false); 37532a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff return 0; 37632a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff } 37732a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff 37832a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff char *tmp = NULL; 37932a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff asprintf(&tmp, "/proc/sys/net/ipv6/conf/%s/use_tempaddr", argv[2]); 38032a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff int fd = open(tmp, O_WRONLY); 38132a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff if (fd < 0) { 38232a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff LOGE("Failed to open %s (%s)", tmp, strerror(errno)); 38332a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff free(tmp); 38432a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff cli->sendMsg(ResponseCode::OperationFailed, 38532a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff "Failed to set ipv6 privacy extensions", true); 38632a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff return 0; 38732a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff } 38832a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff 38932a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff if (write(fd, (!strncmp(argv[3], "enable", 6) ? "2" : "0"), 1) != 1) { 39032a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff LOGE("Failed to write %s (%s)", tmp, strerror(errno)); 39132a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff close(fd); 39232a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff free(tmp); 39332a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff cli->sendMsg(ResponseCode::OperationFailed, 39432a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff "Failed to set ipv6 privacy extensions", true); 39532a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff return 0; 39632a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff } 39732a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff close(fd); 39832a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff free(tmp); 39932a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff cli->sendMsg(ResponseCode::CommandOkay, "IPv6 privacy extensions changed", false); 40032a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff return 0; 4015c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } else { 4025c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown interface cmd", false); 4035c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 4045c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 4055c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 406d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return 0; 407d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 408d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 4094a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall 410d5573d34c8fac49e16b20cf144486125bf940086San MehatCommandListener::ListTtysCmd::ListTtysCmd() : 411d5573d34c8fac49e16b20cf144486125bf940086San Mehat NetdCommand("list_ttys") { 412d5573d34c8fac49e16b20cf144486125bf940086San Mehat} 413d5573d34c8fac49e16b20cf144486125bf940086San Mehat 414d5573d34c8fac49e16b20cf144486125bf940086San Mehatint CommandListener::ListTtysCmd::runCommand(SocketClient *cli, 415d5573d34c8fac49e16b20cf144486125bf940086San Mehat int argc, char **argv) { 416d5573d34c8fac49e16b20cf144486125bf940086San Mehat TtyCollection *tlist = sPppCtrl->getTtyList(); 417d5573d34c8fac49e16b20cf144486125bf940086San Mehat TtyCollection::iterator it; 418d5573d34c8fac49e16b20cf144486125bf940086San Mehat 419d5573d34c8fac49e16b20cf144486125bf940086San Mehat for (it = tlist->begin(); it != tlist->end(); ++it) { 420d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::TtyListResult, *it, false); 421d5573d34c8fac49e16b20cf144486125bf940086San Mehat } 422d5573d34c8fac49e16b20cf144486125bf940086San Mehat 423d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Ttys listed.", false); 424d5573d34c8fac49e16b20cf144486125bf940086San Mehat return 0; 425d5573d34c8fac49e16b20cf144486125bf940086San Mehat} 426d5573d34c8fac49e16b20cf144486125bf940086San Mehat 427d18304287dbabc7835be771400b85d4ae8b63de6San MehatCommandListener::IpFwdCmd::IpFwdCmd() : 428d18304287dbabc7835be771400b85d4ae8b63de6San Mehat NetdCommand("ipfwd") { 429d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 430d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 431d18304287dbabc7835be771400b85d4ae8b63de6San Mehatint CommandListener::IpFwdCmd::runCommand(SocketClient *cli, 432d18304287dbabc7835be771400b85d4ae8b63de6San Mehat int argc, char **argv) { 4339d10b341a0ba46f108cb96e46691197d778cbc06San Mehat int rc = 0; 4349d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 4359d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (argc < 2) { 4369d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 4379d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 4389d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 4399d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 4409d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!strcmp(argv[1], "status")) { 4419d10b341a0ba46f108cb96e46691197d778cbc06San Mehat char *tmp = NULL; 4429d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 4439d10b341a0ba46f108cb96e46691197d778cbc06San Mehat asprintf(&tmp, "Forwarding %s", (sTetherCtrl->getIpFwdEnabled() ? "enabled" : "disabled")); 4449d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::IpFwdStatusResult, tmp, false); 4459d10b341a0ba46f108cb96e46691197d778cbc06San Mehat free(tmp); 4469d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 4479d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[1], "enable")) { 4489d10b341a0ba46f108cb96e46691197d778cbc06San Mehat rc = sTetherCtrl->setIpFwdEnabled(true); 4499d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[1], "disable")) { 4509d10b341a0ba46f108cb96e46691197d778cbc06San Mehat rc = sTetherCtrl->setIpFwdEnabled(false); 4519d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 4529d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown ipfwd cmd", false); 4539d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 4549d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 4559d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 4569d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!rc) { 4579d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandOkay, "ipfwd operation succeeded", false); 4589d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 4599d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::OperationFailed, "ipfwd operation failed", true); 4609d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 461d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 462d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return 0; 463d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 464d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 465d18304287dbabc7835be771400b85d4ae8b63de6San MehatCommandListener::TetherCmd::TetherCmd() : 466d18304287dbabc7835be771400b85d4ae8b63de6San Mehat NetdCommand("tether") { 467d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 468d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 469d18304287dbabc7835be771400b85d4ae8b63de6San Mehatint CommandListener::TetherCmd::runCommand(SocketClient *cli, 470d18304287dbabc7835be771400b85d4ae8b63de6San Mehat int argc, char **argv) { 4719d10b341a0ba46f108cb96e46691197d778cbc06San Mehat int rc = 0; 4729d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 473d18304287dbabc7835be771400b85d4ae8b63de6San Mehat if (argc < 2) { 474d18304287dbabc7835be771400b85d4ae8b63de6San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 475d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return 0; 476d18304287dbabc7835be771400b85d4ae8b63de6San Mehat } 477d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 4789d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!strcmp(argv[1], "stop")) { 4799d10b341a0ba46f108cb96e46691197d778cbc06San Mehat rc = sTetherCtrl->stopTethering(); 480d18304287dbabc7835be771400b85d4ae8b63de6San Mehat } else if (!strcmp(argv[1], "status")) { 4819d10b341a0ba46f108cb96e46691197d778cbc06San Mehat char *tmp = NULL; 4829d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 4839d10b341a0ba46f108cb96e46691197d778cbc06San Mehat asprintf(&tmp, "Tethering services %s", 4849d10b341a0ba46f108cb96e46691197d778cbc06San Mehat (sTetherCtrl->isTetheringStarted() ? "started" : "stopped")); 4859d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::TetherStatusResult, tmp, false); 4869d10b341a0ba46f108cb96e46691197d778cbc06San Mehat free(tmp); 487d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return 0; 4889d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 4899d10b341a0ba46f108cb96e46691197d778cbc06San Mehat /* 4909d10b341a0ba46f108cb96e46691197d778cbc06San Mehat * These commands take a minimum of 4 arguments 4919d10b341a0ba46f108cb96e46691197d778cbc06San Mehat */ 4929d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (argc < 4) { 4939d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 4949d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 4959d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 4969d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 4979d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!strcmp(argv[1], "start")) { 4983208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt if (argc % 2 == 1) { 4993208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt cli->sendMsg(ResponseCode::CommandSyntaxError, "Bad number of arguments", false); 5009d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 5019d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 5023208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt 5033208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt int num_addrs = argc - 2; 5043208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt int arg_index = 2; 5053208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt int array_index = 0; 5063208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt in_addr *addrs = (in_addr *)malloc(sizeof(in_addr) * num_addrs); 5073208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt while (array_index < num_addrs) { 5083208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt if (!inet_aton(argv[arg_index++], &(addrs[array_index++]))) { 5093208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt cli->sendMsg(ResponseCode::CommandParameterError, "Invalid address", false); 5103208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt free(addrs); 5113208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt return 0; 5123208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt } 5139d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 5143208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt rc = sTetherCtrl->startTethering(num_addrs, addrs); 5153208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt free(addrs); 5169d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[1], "interface")) { 5179d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!strcmp(argv[2], "add")) { 5189d10b341a0ba46f108cb96e46691197d778cbc06San Mehat rc = sTetherCtrl->tetherInterface(argv[3]); 5199d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[2], "remove")) { 5209d10b341a0ba46f108cb96e46691197d778cbc06San Mehat rc = sTetherCtrl->untetherInterface(argv[3]); 5219d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[2], "list")) { 5229d10b341a0ba46f108cb96e46691197d778cbc06San Mehat InterfaceCollection *ilist = sTetherCtrl->getTetheredInterfaceList(); 5239d10b341a0ba46f108cb96e46691197d778cbc06San Mehat InterfaceCollection::iterator it; 5249d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 5259d10b341a0ba46f108cb96e46691197d778cbc06San Mehat for (it = ilist->begin(); it != ilist->end(); ++it) { 5269d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::TetherInterfaceListResult, *it, false); 5279d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 5289d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 5299d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandParameterError, 5309d10b341a0ba46f108cb96e46691197d778cbc06San Mehat "Unknown tether interface operation", false); 5319d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 5329d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 5339d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[1], "dns")) { 5349d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!strcmp(argv[2], "set")) { 5359d10b341a0ba46f108cb96e46691197d778cbc06San Mehat rc = sTetherCtrl->setDnsForwarders(&argv[3], argc - 3); 5369d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[2], "list")) { 5379d10b341a0ba46f108cb96e46691197d778cbc06San Mehat NetAddressCollection *dlist = sTetherCtrl->getDnsForwarders(); 5389d10b341a0ba46f108cb96e46691197d778cbc06San Mehat NetAddressCollection::iterator it; 5399d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 5409d10b341a0ba46f108cb96e46691197d778cbc06San Mehat for (it = dlist->begin(); it != dlist->end(); ++it) { 5419d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::TetherDnsFwdTgtListResult, inet_ntoa(*it), false); 5429d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 5439d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 5449d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandParameterError, 5459d10b341a0ba46f108cb96e46691197d778cbc06San Mehat "Unknown tether interface operation", false); 5469d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 5479d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 5489d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 5499d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown tether cmd", false); 5509d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 5519d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 5529d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 5539d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 5549d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!rc) { 5559d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Tether operation succeeded", false); 5569d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 5579d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Tether operation failed", true); 558d18304287dbabc7835be771400b85d4ae8b63de6San Mehat } 559d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 560d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return 0; 561d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 562d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 563d18304287dbabc7835be771400b85d4ae8b63de6San MehatCommandListener::NatCmd::NatCmd() : 564d18304287dbabc7835be771400b85d4ae8b63de6San Mehat NetdCommand("nat") { 565d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 566d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 567d18304287dbabc7835be771400b85d4ae8b63de6San Mehatint CommandListener::NatCmd::runCommand(SocketClient *cli, 568d18304287dbabc7835be771400b85d4ae8b63de6San Mehat int argc, char **argv) { 5699d10b341a0ba46f108cb96e46691197d778cbc06San Mehat int rc = 0; 5709d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 5719d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (argc < 3) { 5729d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 5739d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 5749d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 5759d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 5769ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat if (!strcmp(argv[1], "enable")) { 5779ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat rc = sNatCtrl->enableNat(argv[2], argv[3]); 5789ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat } else if (!strcmp(argv[1], "disable")) { 5799ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat rc = sNatCtrl->disableNat(argv[2], argv[3]); 5809d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 5819d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown nat cmd", false); 5829d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 5839d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 5849d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 5859d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!rc) { 5869d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Nat operation succeeded", false); 5879d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 5889d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Nat operation failed", true); 5899d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 590d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 591d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return 0; 592d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 593d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 594d5573d34c8fac49e16b20cf144486125bf940086San MehatCommandListener::PppdCmd::PppdCmd() : 595d5573d34c8fac49e16b20cf144486125bf940086San Mehat NetdCommand("pppd") { 596d5573d34c8fac49e16b20cf144486125bf940086San Mehat} 597d5573d34c8fac49e16b20cf144486125bf940086San Mehat 598d5573d34c8fac49e16b20cf144486125bf940086San Mehatint CommandListener::PppdCmd::runCommand(SocketClient *cli, 599d5573d34c8fac49e16b20cf144486125bf940086San Mehat int argc, char **argv) { 600d5573d34c8fac49e16b20cf144486125bf940086San Mehat int rc = 0; 601d5573d34c8fac49e16b20cf144486125bf940086San Mehat 602d5573d34c8fac49e16b20cf144486125bf940086San Mehat if (argc < 3) { 603d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 604d5573d34c8fac49e16b20cf144486125bf940086San Mehat return 0; 605d5573d34c8fac49e16b20cf144486125bf940086San Mehat } 606d5573d34c8fac49e16b20cf144486125bf940086San Mehat 607d5573d34c8fac49e16b20cf144486125bf940086San Mehat if (!strcmp(argv[1], "attach")) { 60874d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt struct in_addr l, r, dns1, dns2; 60974d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt 61074d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt memset(&dns1, sizeof(struct in_addr), 0); 61174d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt memset(&dns2, sizeof(struct in_addr), 0); 612d5573d34c8fac49e16b20cf144486125bf940086San Mehat 613d5573d34c8fac49e16b20cf144486125bf940086San Mehat if (!inet_aton(argv[3], &l)) { 614d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::CommandParameterError, "Invalid local address", false); 615d5573d34c8fac49e16b20cf144486125bf940086San Mehat return 0; 616d5573d34c8fac49e16b20cf144486125bf940086San Mehat } 617d5573d34c8fac49e16b20cf144486125bf940086San Mehat if (!inet_aton(argv[4], &r)) { 618d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::CommandParameterError, "Invalid remote address", false); 619d5573d34c8fac49e16b20cf144486125bf940086San Mehat return 0; 620d5573d34c8fac49e16b20cf144486125bf940086San Mehat } 62174d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt if ((argc > 3) && (!inet_aton(argv[5], &dns1))) { 62274d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt cli->sendMsg(ResponseCode::CommandParameterError, "Invalid dns1 address", false); 62374d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt return 0; 62474d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt } 62574d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt if ((argc > 4) && (!inet_aton(argv[6], &dns2))) { 62674d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt cli->sendMsg(ResponseCode::CommandParameterError, "Invalid dns2 address", false); 62774d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt return 0; 62874d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt } 62974d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt rc = sPppCtrl->attachPppd(argv[2], l, r, dns1, dns2); 630d5573d34c8fac49e16b20cf144486125bf940086San Mehat } else if (!strcmp(argv[1], "detach")) { 631d5573d34c8fac49e16b20cf144486125bf940086San Mehat rc = sPppCtrl->detachPppd(argv[2]); 632d5573d34c8fac49e16b20cf144486125bf940086San Mehat } else { 633d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown pppd cmd", false); 634d5573d34c8fac49e16b20cf144486125bf940086San Mehat return 0; 635d5573d34c8fac49e16b20cf144486125bf940086San Mehat } 636d5573d34c8fac49e16b20cf144486125bf940086San Mehat 637d5573d34c8fac49e16b20cf144486125bf940086San Mehat if (!rc) { 638d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Pppd operation succeeded", false); 639d5573d34c8fac49e16b20cf144486125bf940086San Mehat } else { 640d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Pppd operation failed", true); 641d5573d34c8fac49e16b20cf144486125bf940086San Mehat } 642d5573d34c8fac49e16b20cf144486125bf940086San Mehat 643d5573d34c8fac49e16b20cf144486125bf940086San Mehat return 0; 644d5573d34c8fac49e16b20cf144486125bf940086San Mehat} 6451bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat 6461bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San MehatCommandListener::PanCmd::PanCmd() : 6471bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat NetdCommand("pan") { 6481bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat} 6491bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat 6501bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehatint CommandListener::PanCmd::runCommand(SocketClient *cli, 6511bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat int argc, char **argv) { 6521bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat int rc = 0; 6531bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat 6541bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat if (argc < 2) { 6551bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 6561bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat return 0; 6571bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat } 6581bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat 6591bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat if (!strcmp(argv[1], "start")) { 6601bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat rc = sPanCtrl->startPan(); 6611bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat } else if (!strcmp(argv[1], "stop")) { 6621bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat rc = sPanCtrl->stopPan(); 6631bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat } else if (!strcmp(argv[1], "status")) { 6641bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat char *tmp = NULL; 6651bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat 6661bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat asprintf(&tmp, "Pan services %s", 6671bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat (sPanCtrl->isPanStarted() ? "started" : "stopped")); 6681bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat cli->sendMsg(ResponseCode::PanStatusResult, tmp, false); 6691bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat free(tmp); 6701bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat return 0; 6711bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat } else { 6721bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown pan cmd", false); 6731bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat return 0; 6741bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat } 6751bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat 6761bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat if (!rc) { 6771bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Pan operation succeeded", false); 6781bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat } else { 6791bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Pan operation failed", true); 6801bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat } 6811bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat 6821bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat return 0; 6831bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat} 6845af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 6855af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry ShmidtCommandListener::SoftapCmd::SoftapCmd() : 6865af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt NetdCommand("softap") { 6875af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt} 6885af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 6895af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidtint CommandListener::SoftapCmd::runCommand(SocketClient *cli, 6905af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt int argc, char **argv) { 69131fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt int rc = 0, flag = 0; 692666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt char *retbuf = NULL; 6935af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 6945af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt if (argc < 2) { 6955af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt cli->sendMsg(ResponseCode::CommandSyntaxError, "Softap Missing argument", false); 6965af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt return 0; 6975af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } 6985af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 6995af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt if (!strcmp(argv[1], "start")) { 700c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt rc = sSoftapCtrl->startDriver(argv[2]); 7015af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } else if (!strcmp(argv[1], "stop")) { 702c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt rc = sSoftapCtrl->stopDriver(argv[2]); 703c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt } else if (!strcmp(argv[1], "startap")) { 704c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt rc = sSoftapCtrl->startSoftap(); 705c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt } else if (!strcmp(argv[1], "stopap")) { 7065af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt rc = sSoftapCtrl->stopSoftap(); 70731fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt } else if (!strcmp(argv[1], "fwreload")) { 70831fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt rc = sSoftapCtrl->fwReloadSoftap(argc, argv); 709666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt } else if (!strcmp(argv[1], "clients")) { 710666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt rc = sSoftapCtrl->clientsSoftap(&retbuf); 711666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt if (!rc) { 712666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt cli->sendMsg(ResponseCode::CommandOkay, retbuf, false); 713666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt free(retbuf); 714666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt return 0; 715666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt } 7165af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } else if (!strcmp(argv[1], "status")) { 717666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt asprintf(&retbuf, "Softap service %s", 7185af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt (sSoftapCtrl->isSoftapStarted() ? "started" : "stopped")); 719666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt cli->sendMsg(ResponseCode::SoftapStatusResult, retbuf, false); 720666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt free(retbuf); 7215af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt return 0; 7225af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } else if (!strcmp(argv[1], "set")) { 7235af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt rc = sSoftapCtrl->setSoftap(argc, argv); 7245af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } else { 7255af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt cli->sendMsg(ResponseCode::CommandSyntaxError, "Softap Unknown cmd", false); 7265af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt return 0; 7275af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } 7285af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 7295af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt if (!rc) { 7305af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt cli->sendMsg(ResponseCode::CommandOkay, "Softap operation succeeded", false); 7315af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } else { 7325af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt cli->sendMsg(ResponseCode::OperationFailed, "Softap operation failed", true); 7335af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } 7345af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 7355af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt return 0; 7365af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt} 7373e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt 73889c1e975f0c03997808d35c7be10b244c5309f9fMattias FalkCommandListener::ResolverCmd::ResolverCmd() : 73989c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk NetdCommand("resolver") { 74089c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk} 74189c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk 74289c1e975f0c03997808d35c7be10b244c5309f9fMattias Falkint CommandListener::ResolverCmd::runCommand(SocketClient *cli, int argc, char **argv) { 74389c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk int rc = 0; 74489c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk struct in_addr addr; 74589c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk 74689c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk if (argc < 2) { 74789c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk cli->sendMsg(ResponseCode::CommandSyntaxError, "Resolver missing arguments", false); 74889c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk return 0; 74989c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } 75089c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk 75189c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk if (!strcmp(argv[1], "setdefaultif")) { // "resolver setdefaultif <iface>" 75289c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk if (argc == 3) { 75389c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk rc = sResolverCtrl->setDefaultInterface(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 if (!strcmp(argv[1], "setifdns")) { // "resolver setifdns <iface> <dns1> <dns2> ..." 76089c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk if (argc >= 4) { 76189c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk rc = sResolverCtrl->setInterfaceDnsServers(argv[2], &argv[3], argc - 3); 76289c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } else { 76389c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk cli->sendMsg(ResponseCode::CommandSyntaxError, 76489c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk "Wrong number of arguments to resolver setifdns", false); 76589c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk return 0; 76689c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } 76789c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk 76889c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk // set the address of the interface to which the name servers 76989c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk // are bound. Required in order to bind to right interface when 77089c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk // doing the dns query. 77189c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk if (!rc) { 77289c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk ifc_init(); 77389c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk ifc_get_info(argv[2], &addr.s_addr, NULL, 0); 77489c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk 77589c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk rc = sResolverCtrl->setInterfaceAddress(argv[2], &addr); 77689c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } 77789c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } else if (!strcmp(argv[1], "flushdefaultif")) { // "resolver flushdefaultif" 77889c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk if (argc == 2) { 77989c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk rc = sResolverCtrl->flushDefaultDnsCache(); 78089c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } else { 78189c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk cli->sendMsg(ResponseCode::CommandSyntaxError, 78289c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk "Wrong number of arguments to resolver flushdefaultif", false); 78389c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk return 0; 78489c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } 78589c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } else if (!strcmp(argv[1], "flushif")) { // "resolver flushif <iface>" 78689c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk if (argc == 3) { 78789c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk rc = sResolverCtrl->flushInterfaceDnsCache(argv[2]); 78889c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } else { 78989c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk cli->sendMsg(ResponseCode::CommandSyntaxError, 79089c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk "Wrong number of arguments to resolver setdefaultif", false); 79189c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk return 0; 79289c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } 79389c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } else { 79489c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk cli->sendMsg(ResponseCode::CommandSyntaxError,"Resolver unknown command", false); 79589c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk return 0; 79689c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } 79789c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk 79889c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk if (!rc) { 79989c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk cli->sendMsg(ResponseCode::CommandOkay, "Resolver command succeeded", false); 80089c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } else { 80189c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk cli->sendMsg(ResponseCode::OperationFailed, "Resolver command failed", true); 80289c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } 80389c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk 80489c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk return 0; 80589c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk} 80689c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk 8078e46896b4c4be5deaef651a12b17314f63ae9070San Mehatint CommandListener::readInterfaceCounters(const char *iface, unsigned long *rx, unsigned long *tx) { 8088e46896b4c4be5deaef651a12b17314f63ae9070San Mehat FILE *fp = fopen("/proc/net/dev", "r"); 8098e46896b4c4be5deaef651a12b17314f63ae9070San Mehat if (!fp) { 8108e46896b4c4be5deaef651a12b17314f63ae9070San Mehat LOGE("Failed to open /proc/net/dev (%s)", strerror(errno)); 8118e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return -1; 8128e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 8138e46896b4c4be5deaef651a12b17314f63ae9070San Mehat 8148e46896b4c4be5deaef651a12b17314f63ae9070San Mehat char buffer[512]; 8158e46896b4c4be5deaef651a12b17314f63ae9070San Mehat 8168e46896b4c4be5deaef651a12b17314f63ae9070San Mehat fgets(buffer, sizeof(buffer), fp); // Header 1 8178e46896b4c4be5deaef651a12b17314f63ae9070San Mehat fgets(buffer, sizeof(buffer), fp); // Header 2 8188e46896b4c4be5deaef651a12b17314f63ae9070San Mehat while(fgets(buffer, sizeof(buffer), fp)) { 8198e46896b4c4be5deaef651a12b17314f63ae9070San Mehat buffer[strlen(buffer)-1] = '\0'; 8208e46896b4c4be5deaef651a12b17314f63ae9070San Mehat 821651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt char name[31]; 8228e46896b4c4be5deaef651a12b17314f63ae9070San Mehat unsigned long d; 823651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt sscanf(buffer, "%30s %lu %lu %lu %lu %lu %lu %lu %lu %lu", 8248e46896b4c4be5deaef651a12b17314f63ae9070San Mehat name, rx, &d, &d, &d, &d, &d, &d, &d, tx); 825651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt char *rxString = strchr(name, ':'); 826651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt *rxString = '\0'; 827651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt rxString++; 828651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt // when the rx count gets too big it changes from "name: 999" to "name:1000" 829651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt // and the sscanf munge the two together. Detect that and fix 830651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt // note that all the %lu will be off by one and the real tx value will be in d 831651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt if (*rxString != '\0') { 832651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt *tx = d; 833651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt sscanf(rxString, "%20lu", rx); 834651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt } 8358e46896b4c4be5deaef651a12b17314f63ae9070San Mehat if (strcmp(name, iface)) { 8368e46896b4c4be5deaef651a12b17314f63ae9070San Mehat continue; 8378e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 8388e46896b4c4be5deaef651a12b17314f63ae9070San Mehat fclose(fp); 8398e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 8408e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 8418e46896b4c4be5deaef651a12b17314f63ae9070San Mehat 8428e46896b4c4be5deaef651a12b17314f63ae9070San Mehat fclose(fp); 84331c61c80a013bd1a050f0f4103e13fba62bf1717Robert Greenwalt *rx = 0; 84431c61c80a013bd1a050f0f4103e13fba62bf1717Robert Greenwalt *tx = 0; 84531c61c80a013bd1a050f0f4103e13fba62bf1717Robert Greenwalt return 0; 8468e46896b4c4be5deaef651a12b17314f63ae9070San Mehat} 8474a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall 8484a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP AbgrallCommandListener::BandwidthControlCmd::BandwidthControlCmd() : 8490dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall NetdCommand("bandwidth") { 8504a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall} 8514a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall 852db7da58e8d2aa021060098057f944ef754be06e3JP Abgrallvoid CommandListener::BandwidthControlCmd::sendGenericSyntaxError(SocketClient *cli, const char *usageMsg) { 853db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall char *msg; 854db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall asprintf(&msg, "Usage: bandwidth %s", usageMsg); 855db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, msg, false); 856db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall free(msg); 857db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall} 858db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 859db7da58e8d2aa021060098057f944ef754be06e3JP Abgrallvoid CommandListener::BandwidthControlCmd::sendGenericOkFail(SocketClient *cli, int cond) { 860db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!cond) { 861db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall cli->sendMsg(ResponseCode::CommandOkay, "Bandwidth command succeeeded", false); 862db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } else { 863db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall cli->sendMsg(ResponseCode::OperationFailed, "Bandwidth command failed", false); 864db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 865db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall} 866db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 867db7da58e8d2aa021060098057f944ef754be06e3JP Abgrallvoid CommandListener::BandwidthControlCmd::sendGenericOpFailed(SocketClient *cli, const char *errMsg) { 868db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall cli->sendMsg(ResponseCode::OperationFailed, errMsg, false); 869db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall} 870db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 871fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrallint CommandListener::BandwidthControlCmd::runCommand(SocketClient *cli, int argc, char **argv) { 8724a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall if (argc < 2) { 873db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "<cmds> <args...>"); 8744a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall return 0; 8754a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall } 8764a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall 877db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall LOGV("bwctrlcmd: argc=%d %s %s ...", argc, argv[0], argv[1]); 878db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 8794a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall if (!strcmp(argv[1], "enable")) { 880db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->enableBandwidthControl(); 881db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 882db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 883db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 884db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 885db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "disable")) { 886db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->disableBandwidthControl(); 887db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 888db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 8890dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall 890db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 891db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "removequota") || !strcmp(argv[1], "rq")) { 892fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall if (argc != 3) { 893db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "removequota <interface>"); 894fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall return 0; 895fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall } 896db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->removeInterfaceSharedQuota(argv[2]); 897db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 898db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 899fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall 900db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 901db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "getquota") || !strcmp(argv[1], "gq")) { 9028a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall int64_t bytes; 9038a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (argc != 2) { 904db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "getquota"); 9058a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 9068a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 907db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->getInterfaceSharedQuota(&bytes); 9088a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (rc) { 909db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOpFailed(cli, "Failed to get quota"); 9108a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 9118a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 912db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 9138a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall char *msg; 9148a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall asprintf(&msg, "%lld", bytes); 9158a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall cli->sendMsg(ResponseCode::QuotaCounterResult, msg, false); 9168a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall free(msg); 917db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 9188a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall 919db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 920db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "getiquota") || !strcmp(argv[1], "giq")) { 9218a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall int64_t bytes; 9228a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (argc != 3) { 923db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "getiquota <iface>"); 9248a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 9258a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 926db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 927db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->getInterfaceQuota(argv[2], &bytes); 9288a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (rc) { 929db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOpFailed(cli, "Failed to get quota"); 9308a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 9318a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 9328a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall char *msg; 9338a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall asprintf(&msg, "%lld", bytes); 9348a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall cli->sendMsg(ResponseCode::QuotaCounterResult, msg, false); 9358a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall free(msg); 936db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 9378a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall 938db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 939db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "setquota") || !strcmp(argv[1], "sq")) { 940fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall if (argc != 4) { 941db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "setquota <interface> <bytes>"); 942fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall return 0; 943fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall } 944db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->setInterfaceSharedQuota(argv[2], atoll(argv[3])); 945db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 946db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 947db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 948db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "setquotas") || !strcmp(argv[1], "sqs")) { 949db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc; 950fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall if (argc < 4) { 951db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "setquotas <bytes> <interface> ..."); 952fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall return 0; 953fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall } 954db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 9558a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall for (int q = 3; argc >= 4; q++, argc--) { 9560dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall rc = sBandwidthCtrl->setInterfaceSharedQuota(argv[q], atoll(argv[2])); 9570dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall if (rc) { 9580dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall char *msg; 9590dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall asprintf(&msg, "bandwidth setquotas %s %s failed", argv[2], argv[q]); 9600dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall cli->sendMsg(ResponseCode::OperationFailed, 9610dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall msg, false); 9620dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall free(msg); 963db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 9640dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall } 9650dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall } 966db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 967db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 9680dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall 969db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 970db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "removequotas") || !strcmp(argv[1], "rqs")) { 971db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc; 9720dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall if (argc < 3) { 973db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "removequotas <interface> ..."); 9740dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall return 0; 9750dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall } 976db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 9778a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall for (int q = 2; argc >= 3; q++, argc--) { 9780dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall rc = sBandwidthCtrl->removeInterfaceSharedQuota(argv[q]); 9790dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall if (rc) { 9800dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall char *msg; 9810dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall asprintf(&msg, "bandwidth removequotas %s failed", argv[q]); 9820dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall cli->sendMsg(ResponseCode::OperationFailed, 9830dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall msg, false); 9840dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall free(msg); 985db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 9860dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall } 9870dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall } 988db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 989db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 9900dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall 991db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 992db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "removeiquota") || !strcmp(argv[1], "riq")) { 9930dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall if (argc != 3) { 994db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "removeiquota <interface>"); 9950dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall return 0; 9960dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall } 997db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->removeInterfaceQuota(argv[2]); 998db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 999db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 10000dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall 1001db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1002db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "setiquota") || !strcmp(argv[1], "siq")) { 10030dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall if (argc != 4) { 1004db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "setiquota <interface> <bytes>"); 10050dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall return 0; 10060dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall } 1007db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->setInterfaceQuota(argv[2], atoll(argv[3])); 1008db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1009db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 1010fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall 1011db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1012db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "addnaughtyapps") || !strcmp(argv[1], "ana")) { 1013fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall if (argc < 3) { 1014db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "addnaughtyapps <appUid> ..."); 10154a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall return 0; 1016fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall } 1017db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->addNaughtyApps(argc - 2, argv + 2); 1018db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1019db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 1020db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 1021fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall 1022db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1023db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "removenaughtyapps") || !strcmp(argv[1], "rna")) { 1024fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall if (argc < 3) { 1025db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "removenaughtyapps <appUid> ..."); 1026fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall return 0; 1027fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall } 1028db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->removeNaughtyApps(argc - 2, argv + 2); 1029db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1030db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 1031fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall 1032db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1033db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "setglobalalert") || !strcmp(argv[1], "sga")) { 10348a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (argc != 3) { 1035db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "setglobalalert <bytes>"); 10368a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 10378a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 1038db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->setGlobalAlert(atoll(argv[2])); 1039db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1040db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 10418a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall 1042db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1043db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "removeglobalalert") || !strcmp(argv[1], "rga")) { 10448a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (argc != 2) { 1045db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "removeglobalalert"); 10468a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 10478a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 1048db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->removeGlobalAlert(); 1049db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1050db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 10518a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall 1052db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1053db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "setsharedalert") || !strcmp(argv[1], "ssa")) { 10548a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (argc != 3) { 1055db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "setsharedalert <bytes>"); 10568a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 10578a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 1058db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->setSharedAlert(atoll(argv[2])); 1059db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1060db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 10618a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall 1062db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1063db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "removesharedalert") || !strcmp(argv[1], "rsa")) { 10648a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (argc != 2) { 1065db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "removesharedalert"); 10668a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 10678a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 1068db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->removeSharedAlert(); 1069db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1070db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 10718a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall 1072db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1073db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "setinterfacealert") || !strcmp(argv[1], "sia")) { 10748a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (argc != 4) { 1075db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "setinterfacealert <interface> <bytes>"); 10768a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 10778a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 1078db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->setInterfaceAlert(argv[2], atoll(argv[3])); 1079db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1080db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 10818a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall 1082db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1083db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "removeinterfacealert") || !strcmp(argv[1], "ria")) { 10848a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (argc != 3) { 1085db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "removeinterfacealert <interface>"); 10868a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 10878a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 1088db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->removeInterfaceAlert(argv[2]); 1089db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1090fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall return 0; 1091db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 10924a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall } 1093db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "gettetherstats") || !strcmp(argv[1], "gts")) { 1094db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall BandwidthController::TetherStats tetherStats; 1095db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (argc != 4) { 1096db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "gettetherstats <interface0> <interface1>"); 1097db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 1098db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1099db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 1100db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall tetherStats.ifaceIn = argv[2]; 1101db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall tetherStats.ifaceOut = argv[3]; 1102db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->getTetherStats(tetherStats); 1103db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (rc) { 1104db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOpFailed(cli, "Failed to get tethering stats"); 1105db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 1106db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1107db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 1108db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall char *msg = tetherStats.getStatsLine(); 1109db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall cli->sendMsg(ResponseCode::TetheringStatsResult, msg, false); 1110db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall free(msg); 1111db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 11124a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall 11134a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall } 1114db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 1115db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown bandwidth cmd", false); 11164a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall return 0; 11174a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall} 1118