CommandListener.cpp revision 666fe255fa581965d2835bd581cd5a8959411067
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" 36a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat 37d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 385c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehatextern "C" int ifc_init(void); 395c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehatextern "C" int ifc_get_hwaddr(const char *name, void *ptr); 401d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwaltextern "C" int ifc_get_info(const char *name, in_addr_t *addr, int *prefixLength, unsigned *flags); 415c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehatextern "C" int ifc_set_addr(const char *name, in_addr_t addr); 421d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwaltextern "C" int ifc_set_prefixLength(const char *name, int prefixLength); 435c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehatextern "C" int ifc_up(const char *name); 445c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehatextern "C" int ifc_down(const char *name); 455c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 469d10b341a0ba46f108cb96e46691197d778cbc06San MehatTetherController *CommandListener::sTetherCtrl = NULL; 479ff78fb7da7158f5bd7c86d89a842691820259cfSan MehatNatController *CommandListener::sNatCtrl = NULL; 48d5573d34c8fac49e16b20cf144486125bf940086San MehatPppController *CommandListener::sPppCtrl = NULL; 491bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San MehatPanController *CommandListener::sPanCtrl = NULL; 505af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry ShmidtSoftapController *CommandListener::sSoftapCtrl = NULL; 513e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert GreenwaltUsbController *CommandListener::sUsbCtrl = NULL; 529d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 53d18304287dbabc7835be771400b85d4ae8b63de6San MehatCommandListener::CommandListener() : 54d18304287dbabc7835be771400b85d4ae8b63de6San Mehat FrameworkListener("netd") { 555c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat registerCmd(new InterfaceCmd()); 56d18304287dbabc7835be771400b85d4ae8b63de6San Mehat registerCmd(new IpFwdCmd()); 57d18304287dbabc7835be771400b85d4ae8b63de6San Mehat registerCmd(new TetherCmd()); 58d18304287dbabc7835be771400b85d4ae8b63de6San Mehat registerCmd(new NatCmd()); 59d5573d34c8fac49e16b20cf144486125bf940086San Mehat registerCmd(new ListTtysCmd()); 60d5573d34c8fac49e16b20cf144486125bf940086San Mehat registerCmd(new PppdCmd()); 611bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat registerCmd(new PanCmd()); 625af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt registerCmd(new SoftapCmd()); 633e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt registerCmd(new UsbCmd()); 649d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 659d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!sTetherCtrl) 669d10b341a0ba46f108cb96e46691197d778cbc06San Mehat sTetherCtrl = new TetherController(); 679ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat if (!sNatCtrl) 689ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat sNatCtrl = new NatController(); 69d5573d34c8fac49e16b20cf144486125bf940086San Mehat if (!sPppCtrl) 70d5573d34c8fac49e16b20cf144486125bf940086San Mehat sPppCtrl = new PppController(); 711bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat if (!sPanCtrl) 721bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat sPanCtrl = new PanController(); 735af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt if (!sSoftapCtrl) 745af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt sSoftapCtrl = new SoftapController(); 753e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt if (!sUsbCtrl) 763e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt sUsbCtrl = new UsbController(); 77d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 78d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 795c1b8af16dbbc20c89aaca2f93e725e12b16d055San MehatCommandListener::InterfaceCmd::InterfaceCmd() : 805c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat NetdCommand("interface") { 81d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 82d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 835c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehatint CommandListener::InterfaceCmd::runCommand(SocketClient *cli, 84d18304287dbabc7835be771400b85d4ae8b63de6San Mehat int argc, char **argv) { 855c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (argc < 2) { 865c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 875c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 885c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 895c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 905c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (!strcmp(argv[1], "list")) { 915c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat DIR *d; 925c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat struct dirent *de; 935c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 945c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (!(d = opendir("/sys/class/net"))) { 955c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to open sysfs dir", true); 965c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 975c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 985c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 995c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat while((de = readdir(d))) { 1005c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (de->d_name[0] == '.') 1015c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat continue; 1025c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::InterfaceListResult, de->d_name, false); 1035c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 1045c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat closedir(d); 1055c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Interface list completed", false); 1065c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 1078e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } else if (!strcmp(argv[1], "readrxcounter")) { 1088e46896b4c4be5deaef651a12b17314f63ae9070San Mehat if (argc != 3) { 1098e46896b4c4be5deaef651a12b17314f63ae9070San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, 1108e46896b4c4be5deaef651a12b17314f63ae9070San Mehat "Usage: interface readrxcounter <interface>", false); 1118e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 1128e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 1138e46896b4c4be5deaef651a12b17314f63ae9070San Mehat unsigned long rx = 0, tx = 0; 1148e46896b4c4be5deaef651a12b17314f63ae9070San Mehat if (readInterfaceCounters(argv[2], &rx, &tx)) { 1158e46896b4c4be5deaef651a12b17314f63ae9070San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to read counters", true); 1168e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 1178e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 1188e46896b4c4be5deaef651a12b17314f63ae9070San Mehat 1198e46896b4c4be5deaef651a12b17314f63ae9070San Mehat char *msg; 1208e46896b4c4be5deaef651a12b17314f63ae9070San Mehat asprintf(&msg, "%lu", rx); 1218e46896b4c4be5deaef651a12b17314f63ae9070San Mehat cli->sendMsg(ResponseCode::InterfaceRxCounterResult, msg, false); 1228e46896b4c4be5deaef651a12b17314f63ae9070San Mehat free(msg); 1238e46896b4c4be5deaef651a12b17314f63ae9070San Mehat 1248e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 1258e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } else if (!strcmp(argv[1], "readtxcounter")) { 1268e46896b4c4be5deaef651a12b17314f63ae9070San Mehat if (argc != 3) { 1278e46896b4c4be5deaef651a12b17314f63ae9070San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, 1288e46896b4c4be5deaef651a12b17314f63ae9070San Mehat "Usage: interface readtxcounter <interface>", false); 1298e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 1308e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 1318e46896b4c4be5deaef651a12b17314f63ae9070San Mehat unsigned long rx = 0, tx = 0; 1328e46896b4c4be5deaef651a12b17314f63ae9070San Mehat if (readInterfaceCounters(argv[2], &rx, &tx)) { 1338e46896b4c4be5deaef651a12b17314f63ae9070San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to read counters", true); 1348e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 1358e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 1368e46896b4c4be5deaef651a12b17314f63ae9070San Mehat 1378e46896b4c4be5deaef651a12b17314f63ae9070San Mehat char *msg = NULL; 1388e46896b4c4be5deaef651a12b17314f63ae9070San Mehat asprintf(&msg, "%lu", tx); 1398e46896b4c4be5deaef651a12b17314f63ae9070San Mehat cli->sendMsg(ResponseCode::InterfaceTxCounterResult, msg, false); 1408e46896b4c4be5deaef651a12b17314f63ae9070San Mehat free(msg); 1418e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 1428e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } else if (!strcmp(argv[1], "getthrottle")) { 143a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat if (argc != 4 || (argc == 4 && (strcmp(argv[3], "rx") && (strcmp(argv[3], "tx"))))) { 1448e46896b4c4be5deaef651a12b17314f63ae9070San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, 1458e46896b4c4be5deaef651a12b17314f63ae9070San Mehat "Usage: interface getthrottle <interface> <rx|tx>", false); 1468e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 1478e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 148a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat int val = 0; 149a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat int rc = 0; 150a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat int voldRc = ResponseCode::InterfaceRxThrottleResult; 151a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat 152a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat if (!strcmp(argv[3], "rx")) { 153a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat rc = ThrottleController::getInterfaceRxThrottle(argv[2], &val); 154a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat } else { 155a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat rc = ThrottleController::getInterfaceTxThrottle(argv[2], &val); 156a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat voldRc = ResponseCode::InterfaceTxThrottleResult; 157a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat } 158a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat if (rc) { 159a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to get throttle", true); 160a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat } else { 161a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat char *msg = NULL; 162a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat asprintf(&msg, "%u", val); 163a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat cli->sendMsg(voldRc, msg, false); 164a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat free(msg); 165a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat return 0; 166a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat } 1678e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 1688e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } else if (!strcmp(argv[1], "setthrottle")) { 1698e46896b4c4be5deaef651a12b17314f63ae9070San Mehat if (argc != 5) { 1708e46896b4c4be5deaef651a12b17314f63ae9070San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, 171a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat "Usage: interface setthrottle <interface> <rx_kbps> <tx_kbps>", false); 1728e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 1738e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 174a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat if (ThrottleController::setInterfaceThrottle(argv[2], atoi(argv[3]), atoi(argv[4]))) { 175a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to set throttle", true); 176a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat } else { 177a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Interface throttling set", false); 178a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat } 1798e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 1805c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } else { 1815c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat /* 1825c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat * These commands take a minimum of 3 arguments 1835c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat */ 1845c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (argc < 3) { 1855c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 1865c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 1875c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 1885c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (!strcmp(argv[1], "getcfg")) { 1891d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwalt struct in_addr addr; 1901d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwalt int prefixLength; 1915c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat unsigned char hwaddr[6]; 1925c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat unsigned flags = 0; 1935c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 1945c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat ifc_init(); 1955c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat memset(hwaddr, 0, sizeof(hwaddr)); 1965c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 1971d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwalt if (ifc_get_info(argv[2], &addr.s_addr, &prefixLength, &flags)) { 1985c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Interface not found", true); 1995c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 2005c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 2015c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 2025c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (ifc_get_hwaddr(argv[2], (void *) hwaddr)) { 2035c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat LOGW("Failed to retrieve HW addr for %s (%s)", argv[2], strerror(errno)); 2045c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 2055c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 2065c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat char *addr_s = strdup(inet_ntoa(addr)); 2075c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat const char *updown, *brdcst, *loopbk, *ppp, *running, *multi; 2085c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 2095c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat updown = (flags & IFF_UP) ? "up" : "down"; 2105c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat brdcst = (flags & IFF_BROADCAST) ? " broadcast" : ""; 2115c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat loopbk = (flags & IFF_LOOPBACK) ? " loopback" : ""; 2125c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat ppp = (flags & IFF_POINTOPOINT) ? " point-to-point" : ""; 2135c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat running = (flags & IFF_RUNNING) ? " running" : ""; 2145c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat multi = (flags & IFF_MULTICAST) ? " multicast" : ""; 2155c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 2165c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat char *flag_s; 2175c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 218e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt asprintf(&flag_s, "[%s%s%s%s%s%s]", updown, brdcst, loopbk, ppp, running, multi); 2195c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 2205c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat char *msg = NULL; 2211d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwalt asprintf(&msg, "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x %s %d %s", 2225c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat hwaddr[0], hwaddr[1], hwaddr[2], hwaddr[3], hwaddr[4], hwaddr[5], 2231d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwalt addr_s, prefixLength, flag_s); 2245c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 22501fed783828b592cda3b774deea4099a9e690e3dSan Mehat cli->sendMsg(ResponseCode::InterfaceGetCfgResult, msg, false); 2265c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 2275c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat free(addr_s); 2285c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat free(flag_s); 2295c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat free(msg); 2305c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 2315c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } else if (!strcmp(argv[1], "setcfg")) { 2321d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwalt // arglist: iface addr prefixLength [flags] 2335c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (argc < 5) { 2345c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 2355c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 2365c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 237e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt LOGD("Setting iface cfg"); 2385c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 2391d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwalt struct in_addr addr; 2405c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat unsigned flags = 0; 2415c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 2425c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (!inet_aton(argv[3], &addr)) { 2435c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandParameterError, "Invalid address", false); 2445c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 2455c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 2465c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 2475c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat ifc_init(); 2485c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (ifc_set_addr(argv[2], addr.s_addr)) { 2495c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to set address", true); 2505c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 2515c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 2525c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 2531d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwalt if (ifc_set_prefixLength(argv[2], atoi(argv[4]))) { 2541d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwalt cli->sendMsg(ResponseCode::OperationFailed, "Failed to set prefixLength", true); 2555c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 2565c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 2575c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 2585c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat /* Process flags */ 259e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt /* read from "[XX" arg to "YY]" arg */ 260e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt bool bStarted = false; 2615c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat for (int i = 5; i < argc; i++) { 262e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt char *flag = argv[i]; 263e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt if (!bStarted) { 264e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt if (*flag == '[') { 265e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt flag++; 266e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt bStarted = true; 267e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt } else { 268e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt continue; 269e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt } 270e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt } 271e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt int len = strlen(flag); 272e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt if (flag[len-1] == ']') { 273e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt i = argc; // stop after this loop 274e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt flag[len-1] = 0; 275e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt } 276e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt if (!strcmp(flag, "up")) { 277e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt LOGD("Trying to bring up %s", argv[2]); 2785c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (ifc_up(argv[2])) { 2795c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat LOGE("Error upping interface"); 2805c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to up interface", true); 2815c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 2825c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 283e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt } else if (!strcmp(flag, "down")) { 284e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt LOGD("Trying to bring down %s", argv[2]); 2855c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (ifc_down(argv[2])) { 2865c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat LOGE("Error downing interface"); 2875c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to down interface", true); 2885c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 2895c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 290e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt } else if (!strcmp(flag, "broadcast")) { 291e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt LOGD("broadcast flag ignored"); 292e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt } else if (!strcmp(flag, "multicast")) { 293e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt LOGD("multicast flag ignored"); 2945c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } else { 2955c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandParameterError, "Flag unsupported", false); 2965c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 2975c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 2985c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 2995c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Interface configuration set", false); 3005c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 3015c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } else { 3025c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown interface cmd", false); 3035c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 3045c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 3055c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 306d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return 0; 307d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 308d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 309d5573d34c8fac49e16b20cf144486125bf940086San MehatCommandListener::ListTtysCmd::ListTtysCmd() : 310d5573d34c8fac49e16b20cf144486125bf940086San Mehat NetdCommand("list_ttys") { 311d5573d34c8fac49e16b20cf144486125bf940086San Mehat} 312d5573d34c8fac49e16b20cf144486125bf940086San Mehat 313d5573d34c8fac49e16b20cf144486125bf940086San Mehatint CommandListener::ListTtysCmd::runCommand(SocketClient *cli, 314d5573d34c8fac49e16b20cf144486125bf940086San Mehat int argc, char **argv) { 315d5573d34c8fac49e16b20cf144486125bf940086San Mehat TtyCollection *tlist = sPppCtrl->getTtyList(); 316d5573d34c8fac49e16b20cf144486125bf940086San Mehat TtyCollection::iterator it; 317d5573d34c8fac49e16b20cf144486125bf940086San Mehat 318d5573d34c8fac49e16b20cf144486125bf940086San Mehat for (it = tlist->begin(); it != tlist->end(); ++it) { 319d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::TtyListResult, *it, false); 320d5573d34c8fac49e16b20cf144486125bf940086San Mehat } 321d5573d34c8fac49e16b20cf144486125bf940086San Mehat 322d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Ttys listed.", false); 323d5573d34c8fac49e16b20cf144486125bf940086San Mehat return 0; 324d5573d34c8fac49e16b20cf144486125bf940086San Mehat} 325d5573d34c8fac49e16b20cf144486125bf940086San Mehat 326d18304287dbabc7835be771400b85d4ae8b63de6San MehatCommandListener::IpFwdCmd::IpFwdCmd() : 327d18304287dbabc7835be771400b85d4ae8b63de6San Mehat NetdCommand("ipfwd") { 328d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 329d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 330d18304287dbabc7835be771400b85d4ae8b63de6San Mehatint CommandListener::IpFwdCmd::runCommand(SocketClient *cli, 331d18304287dbabc7835be771400b85d4ae8b63de6San Mehat int argc, char **argv) { 3329d10b341a0ba46f108cb96e46691197d778cbc06San Mehat int rc = 0; 3339d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 3349d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (argc < 2) { 3359d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 3369d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 3379d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 3389d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 3399d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!strcmp(argv[1], "status")) { 3409d10b341a0ba46f108cb96e46691197d778cbc06San Mehat char *tmp = NULL; 3419d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 3429d10b341a0ba46f108cb96e46691197d778cbc06San Mehat asprintf(&tmp, "Forwarding %s", (sTetherCtrl->getIpFwdEnabled() ? "enabled" : "disabled")); 3439d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::IpFwdStatusResult, tmp, false); 3449d10b341a0ba46f108cb96e46691197d778cbc06San Mehat free(tmp); 3459d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 3469d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[1], "enable")) { 3479d10b341a0ba46f108cb96e46691197d778cbc06San Mehat rc = sTetherCtrl->setIpFwdEnabled(true); 3489d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[1], "disable")) { 3499d10b341a0ba46f108cb96e46691197d778cbc06San Mehat rc = sTetherCtrl->setIpFwdEnabled(false); 3509d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 3519d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown ipfwd cmd", false); 3529d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 3539d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 3549d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 3559d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!rc) { 3569d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandOkay, "ipfwd operation succeeded", false); 3579d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 3589d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::OperationFailed, "ipfwd operation failed", true); 3599d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 360d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 361d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return 0; 362d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 363d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 364d18304287dbabc7835be771400b85d4ae8b63de6San MehatCommandListener::TetherCmd::TetherCmd() : 365d18304287dbabc7835be771400b85d4ae8b63de6San Mehat NetdCommand("tether") { 366d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 367d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 368d18304287dbabc7835be771400b85d4ae8b63de6San Mehatint CommandListener::TetherCmd::runCommand(SocketClient *cli, 369d18304287dbabc7835be771400b85d4ae8b63de6San Mehat int argc, char **argv) { 3709d10b341a0ba46f108cb96e46691197d778cbc06San Mehat int rc = 0; 3719d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 372d18304287dbabc7835be771400b85d4ae8b63de6San Mehat if (argc < 2) { 373d18304287dbabc7835be771400b85d4ae8b63de6San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 374d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return 0; 375d18304287dbabc7835be771400b85d4ae8b63de6San Mehat } 376d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 3779d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!strcmp(argv[1], "stop")) { 3789d10b341a0ba46f108cb96e46691197d778cbc06San Mehat rc = sTetherCtrl->stopTethering(); 379d18304287dbabc7835be771400b85d4ae8b63de6San Mehat } else if (!strcmp(argv[1], "status")) { 3809d10b341a0ba46f108cb96e46691197d778cbc06San Mehat char *tmp = NULL; 3819d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 3829d10b341a0ba46f108cb96e46691197d778cbc06San Mehat asprintf(&tmp, "Tethering services %s", 3839d10b341a0ba46f108cb96e46691197d778cbc06San Mehat (sTetherCtrl->isTetheringStarted() ? "started" : "stopped")); 3849d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::TetherStatusResult, tmp, false); 3859d10b341a0ba46f108cb96e46691197d778cbc06San Mehat free(tmp); 386d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return 0; 3879d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 3889d10b341a0ba46f108cb96e46691197d778cbc06San Mehat /* 3899d10b341a0ba46f108cb96e46691197d778cbc06San Mehat * These commands take a minimum of 4 arguments 3909d10b341a0ba46f108cb96e46691197d778cbc06San Mehat */ 3919d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (argc < 4) { 3929d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 3939d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 3949d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 3959d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 3969d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!strcmp(argv[1], "start")) { 3973208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt if (argc % 2 == 1) { 3983208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt cli->sendMsg(ResponseCode::CommandSyntaxError, "Bad number of arguments", false); 3999d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 4009d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 4013208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt 4023208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt int num_addrs = argc - 2; 4033208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt int arg_index = 2; 4043208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt int array_index = 0; 4053208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt in_addr *addrs = (in_addr *)malloc(sizeof(in_addr) * num_addrs); 4063208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt while (array_index < num_addrs) { 4073208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt if (!inet_aton(argv[arg_index++], &(addrs[array_index++]))) { 4083208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt cli->sendMsg(ResponseCode::CommandParameterError, "Invalid address", false); 4093208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt free(addrs); 4103208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt return 0; 4113208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt } 4129d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 4133208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt rc = sTetherCtrl->startTethering(num_addrs, addrs); 4143208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt free(addrs); 4159d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[1], "interface")) { 4169d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!strcmp(argv[2], "add")) { 4179d10b341a0ba46f108cb96e46691197d778cbc06San Mehat rc = sTetherCtrl->tetherInterface(argv[3]); 4189d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[2], "remove")) { 4199d10b341a0ba46f108cb96e46691197d778cbc06San Mehat rc = sTetherCtrl->untetherInterface(argv[3]); 4209d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[2], "list")) { 4219d10b341a0ba46f108cb96e46691197d778cbc06San Mehat InterfaceCollection *ilist = sTetherCtrl->getTetheredInterfaceList(); 4229d10b341a0ba46f108cb96e46691197d778cbc06San Mehat InterfaceCollection::iterator it; 4239d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 4249d10b341a0ba46f108cb96e46691197d778cbc06San Mehat for (it = ilist->begin(); it != ilist->end(); ++it) { 4259d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::TetherInterfaceListResult, *it, false); 4269d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 4279d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 4289d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandParameterError, 4299d10b341a0ba46f108cb96e46691197d778cbc06San Mehat "Unknown tether interface operation", false); 4309d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 4319d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 4329d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[1], "dns")) { 4339d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!strcmp(argv[2], "set")) { 4349d10b341a0ba46f108cb96e46691197d778cbc06San Mehat rc = sTetherCtrl->setDnsForwarders(&argv[3], argc - 3); 4359d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[2], "list")) { 4369d10b341a0ba46f108cb96e46691197d778cbc06San Mehat NetAddressCollection *dlist = sTetherCtrl->getDnsForwarders(); 4379d10b341a0ba46f108cb96e46691197d778cbc06San Mehat NetAddressCollection::iterator it; 4389d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 4399d10b341a0ba46f108cb96e46691197d778cbc06San Mehat for (it = dlist->begin(); it != dlist->end(); ++it) { 4409d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::TetherDnsFwdTgtListResult, inet_ntoa(*it), false); 4419d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 4429d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 4439d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandParameterError, 4449d10b341a0ba46f108cb96e46691197d778cbc06San Mehat "Unknown tether interface operation", false); 4459d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 4469d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 4479d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 4489d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown tether cmd", false); 4499d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 4509d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 4519d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 4529d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 4539d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!rc) { 4549d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Tether operation succeeded", false); 4559d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 4569d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Tether operation failed", true); 457d18304287dbabc7835be771400b85d4ae8b63de6San Mehat } 458d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 459d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return 0; 460d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 461d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 462d18304287dbabc7835be771400b85d4ae8b63de6San MehatCommandListener::NatCmd::NatCmd() : 463d18304287dbabc7835be771400b85d4ae8b63de6San Mehat NetdCommand("nat") { 464d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 465d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 466d18304287dbabc7835be771400b85d4ae8b63de6San Mehatint CommandListener::NatCmd::runCommand(SocketClient *cli, 467d18304287dbabc7835be771400b85d4ae8b63de6San Mehat int argc, char **argv) { 4689d10b341a0ba46f108cb96e46691197d778cbc06San Mehat int rc = 0; 4699d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 4709d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (argc < 3) { 4719d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 4729d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 4739d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 4749d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 4759ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat if (!strcmp(argv[1], "enable")) { 4769ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat rc = sNatCtrl->enableNat(argv[2], argv[3]); 4779ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat } else if (!strcmp(argv[1], "disable")) { 4789ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat rc = sNatCtrl->disableNat(argv[2], argv[3]); 4799d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 4809d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown nat cmd", false); 4819d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 4829d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 4839d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 4849d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!rc) { 4859d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Nat operation succeeded", false); 4869d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 4879d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Nat operation failed", true); 4889d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 489d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 490d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return 0; 491d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 492d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 493d5573d34c8fac49e16b20cf144486125bf940086San MehatCommandListener::PppdCmd::PppdCmd() : 494d5573d34c8fac49e16b20cf144486125bf940086San Mehat NetdCommand("pppd") { 495d5573d34c8fac49e16b20cf144486125bf940086San Mehat} 496d5573d34c8fac49e16b20cf144486125bf940086San Mehat 497d5573d34c8fac49e16b20cf144486125bf940086San Mehatint CommandListener::PppdCmd::runCommand(SocketClient *cli, 498d5573d34c8fac49e16b20cf144486125bf940086San Mehat int argc, char **argv) { 499d5573d34c8fac49e16b20cf144486125bf940086San Mehat int rc = 0; 500d5573d34c8fac49e16b20cf144486125bf940086San Mehat 501d5573d34c8fac49e16b20cf144486125bf940086San Mehat if (argc < 3) { 502d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 503d5573d34c8fac49e16b20cf144486125bf940086San Mehat return 0; 504d5573d34c8fac49e16b20cf144486125bf940086San Mehat } 505d5573d34c8fac49e16b20cf144486125bf940086San Mehat 506d5573d34c8fac49e16b20cf144486125bf940086San Mehat if (!strcmp(argv[1], "attach")) { 50774d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt struct in_addr l, r, dns1, dns2; 50874d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt 50974d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt memset(&dns1, sizeof(struct in_addr), 0); 51074d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt memset(&dns2, sizeof(struct in_addr), 0); 511d5573d34c8fac49e16b20cf144486125bf940086San Mehat 512d5573d34c8fac49e16b20cf144486125bf940086San Mehat if (!inet_aton(argv[3], &l)) { 513d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::CommandParameterError, "Invalid local address", false); 514d5573d34c8fac49e16b20cf144486125bf940086San Mehat return 0; 515d5573d34c8fac49e16b20cf144486125bf940086San Mehat } 516d5573d34c8fac49e16b20cf144486125bf940086San Mehat if (!inet_aton(argv[4], &r)) { 517d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::CommandParameterError, "Invalid remote address", false); 518d5573d34c8fac49e16b20cf144486125bf940086San Mehat return 0; 519d5573d34c8fac49e16b20cf144486125bf940086San Mehat } 52074d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt if ((argc > 3) && (!inet_aton(argv[5], &dns1))) { 52174d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt cli->sendMsg(ResponseCode::CommandParameterError, "Invalid dns1 address", false); 52274d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt return 0; 52374d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt } 52474d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt if ((argc > 4) && (!inet_aton(argv[6], &dns2))) { 52574d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt cli->sendMsg(ResponseCode::CommandParameterError, "Invalid dns2 address", false); 52674d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt return 0; 52774d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt } 52874d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt rc = sPppCtrl->attachPppd(argv[2], l, r, dns1, dns2); 529d5573d34c8fac49e16b20cf144486125bf940086San Mehat } else if (!strcmp(argv[1], "detach")) { 530d5573d34c8fac49e16b20cf144486125bf940086San Mehat rc = sPppCtrl->detachPppd(argv[2]); 531d5573d34c8fac49e16b20cf144486125bf940086San Mehat } else { 532d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown pppd cmd", false); 533d5573d34c8fac49e16b20cf144486125bf940086San Mehat return 0; 534d5573d34c8fac49e16b20cf144486125bf940086San Mehat } 535d5573d34c8fac49e16b20cf144486125bf940086San Mehat 536d5573d34c8fac49e16b20cf144486125bf940086San Mehat if (!rc) { 537d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Pppd operation succeeded", false); 538d5573d34c8fac49e16b20cf144486125bf940086San Mehat } else { 539d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Pppd operation failed", true); 540d5573d34c8fac49e16b20cf144486125bf940086San Mehat } 541d5573d34c8fac49e16b20cf144486125bf940086San Mehat 542d5573d34c8fac49e16b20cf144486125bf940086San Mehat return 0; 543d5573d34c8fac49e16b20cf144486125bf940086San Mehat} 5441bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat 5451bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San MehatCommandListener::PanCmd::PanCmd() : 5461bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat NetdCommand("pan") { 5471bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat} 5481bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat 5491bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehatint CommandListener::PanCmd::runCommand(SocketClient *cli, 5501bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat int argc, char **argv) { 5511bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat int rc = 0; 5521bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat 5531bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat if (argc < 2) { 5541bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 5551bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat return 0; 5561bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat } 5571bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat 5581bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat if (!strcmp(argv[1], "start")) { 5591bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat rc = sPanCtrl->startPan(); 5601bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat } else if (!strcmp(argv[1], "stop")) { 5611bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat rc = sPanCtrl->stopPan(); 5621bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat } else if (!strcmp(argv[1], "status")) { 5631bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat char *tmp = NULL; 5641bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat 5651bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat asprintf(&tmp, "Pan services %s", 5661bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat (sPanCtrl->isPanStarted() ? "started" : "stopped")); 5671bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat cli->sendMsg(ResponseCode::PanStatusResult, tmp, false); 5681bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat free(tmp); 5691bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat return 0; 5701bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat } else { 5711bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown pan cmd", false); 5721bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat return 0; 5731bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat } 5741bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat 5751bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat if (!rc) { 5761bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Pan operation succeeded", false); 5771bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat } else { 5781bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Pan operation failed", true); 5791bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat } 5801bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat 5811bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat return 0; 5821bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat} 5835af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 5845af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry ShmidtCommandListener::SoftapCmd::SoftapCmd() : 5855af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt NetdCommand("softap") { 5865af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt} 5875af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 5885af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidtint CommandListener::SoftapCmd::runCommand(SocketClient *cli, 5895af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt int argc, char **argv) { 59031fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt int rc = 0, flag = 0; 591666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt char *retbuf = NULL; 5925af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 5935af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt if (argc < 2) { 5945af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt cli->sendMsg(ResponseCode::CommandSyntaxError, "Softap Missing argument", false); 5955af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt return 0; 5965af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } 5975af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 5985af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt if (!strcmp(argv[1], "start")) { 599c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt rc = sSoftapCtrl->startDriver(argv[2]); 6005af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } else if (!strcmp(argv[1], "stop")) { 601c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt rc = sSoftapCtrl->stopDriver(argv[2]); 602c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt } else if (!strcmp(argv[1], "startap")) { 603c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt rc = sSoftapCtrl->startSoftap(); 604c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt } else if (!strcmp(argv[1], "stopap")) { 6055af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt rc = sSoftapCtrl->stopSoftap(); 60631fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt } else if (!strcmp(argv[1], "fwreload")) { 60731fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt rc = sSoftapCtrl->fwReloadSoftap(argc, argv); 608666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt } else if (!strcmp(argv[1], "clients")) { 609666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt rc = sSoftapCtrl->clientsSoftap(&retbuf); 610666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt if (!rc) { 611666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt cli->sendMsg(ResponseCode::CommandOkay, retbuf, false); 612666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt free(retbuf); 613666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt return 0; 614666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt } 6155af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } else if (!strcmp(argv[1], "status")) { 616666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt asprintf(&retbuf, "Softap service %s", 6175af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt (sSoftapCtrl->isSoftapStarted() ? "started" : "stopped")); 618666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt cli->sendMsg(ResponseCode::SoftapStatusResult, retbuf, false); 619666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt free(retbuf); 6205af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt return 0; 6215af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } else if (!strcmp(argv[1], "set")) { 6225af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt rc = sSoftapCtrl->setSoftap(argc, argv); 6235af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } else { 6245af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt cli->sendMsg(ResponseCode::CommandSyntaxError, "Softap Unknown cmd", false); 6255af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt return 0; 6265af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } 6275af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 6285af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt if (!rc) { 6295af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt cli->sendMsg(ResponseCode::CommandOkay, "Softap operation succeeded", false); 6305af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } else { 6315af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt cli->sendMsg(ResponseCode::OperationFailed, "Softap operation failed", true); 6325af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } 6335af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 6345af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt return 0; 6355af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt} 6363e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt 6373e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert GreenwaltCommandListener::UsbCmd::UsbCmd() : 6383e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt NetdCommand("usb") { 6393e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt} 6403e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt 6413e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwaltint CommandListener::UsbCmd::runCommand(SocketClient *cli, int argc, char **argv) { 6423e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt int rc = 0; 6433e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt 6443e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt if (argc < 2) { 6453e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt cli->sendMsg(ResponseCode::CommandSyntaxError, "Usb Missing argument", false); 6463e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt return 0; 6473e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt } 6483e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt 6493e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt if (!strcmp(argv[1], "startrndis")) { 6503e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt rc = sUsbCtrl->startRNDIS(); 6513e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt } else if (!strcmp(argv[1], "stoprndis")) { 6523e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt rc = sUsbCtrl->stopRNDIS(); 6533e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt } else if (!strcmp(argv[1], "rndisstatus")) { 6543e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt char *tmp = NULL; 6553e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt 6563e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt asprintf(&tmp, "Usb RNDIS %s", 6573e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt (sUsbCtrl->isRNDISStarted() ? "started" : "stopped")); 6583e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt cli->sendMsg(ResponseCode::UsbRNDISStatusResult, tmp, false); 6593e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt free(tmp); 6603e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt return 0; 6613e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt } else { 6623e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt cli->sendMsg(ResponseCode::CommandSyntaxError, "Usb Unknown cmd", false); 6633e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt return 0; 6643e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt } 6653e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt 6663e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt if (!rc) { 6673e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt cli->sendMsg(ResponseCode::CommandOkay, "Usb operation succeeded", false); 6683e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt } else { 6693e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt cli->sendMsg(ResponseCode::OperationFailed, "Softap operation failed", true); 6703e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt } 6713e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt 6723e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt return 0; 6733e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt} 6748e46896b4c4be5deaef651a12b17314f63ae9070San Mehat 6758e46896b4c4be5deaef651a12b17314f63ae9070San Mehatint CommandListener::readInterfaceCounters(const char *iface, unsigned long *rx, unsigned long *tx) { 6768e46896b4c4be5deaef651a12b17314f63ae9070San Mehat FILE *fp = fopen("/proc/net/dev", "r"); 6778e46896b4c4be5deaef651a12b17314f63ae9070San Mehat if (!fp) { 6788e46896b4c4be5deaef651a12b17314f63ae9070San Mehat LOGE("Failed to open /proc/net/dev (%s)", strerror(errno)); 6798e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return -1; 6808e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 6818e46896b4c4be5deaef651a12b17314f63ae9070San Mehat 6828e46896b4c4be5deaef651a12b17314f63ae9070San Mehat char buffer[512]; 6838e46896b4c4be5deaef651a12b17314f63ae9070San Mehat 6848e46896b4c4be5deaef651a12b17314f63ae9070San Mehat fgets(buffer, sizeof(buffer), fp); // Header 1 6858e46896b4c4be5deaef651a12b17314f63ae9070San Mehat fgets(buffer, sizeof(buffer), fp); // Header 2 6868e46896b4c4be5deaef651a12b17314f63ae9070San Mehat while(fgets(buffer, sizeof(buffer), fp)) { 6878e46896b4c4be5deaef651a12b17314f63ae9070San Mehat buffer[strlen(buffer)-1] = '\0'; 6888e46896b4c4be5deaef651a12b17314f63ae9070San Mehat 689651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt char name[31]; 6908e46896b4c4be5deaef651a12b17314f63ae9070San Mehat unsigned long d; 691651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt sscanf(buffer, "%30s %lu %lu %lu %lu %lu %lu %lu %lu %lu", 6928e46896b4c4be5deaef651a12b17314f63ae9070San Mehat name, rx, &d, &d, &d, &d, &d, &d, &d, tx); 693651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt char *rxString = strchr(name, ':'); 694651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt *rxString = '\0'; 695651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt rxString++; 696651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt // when the rx count gets too big it changes from "name: 999" to "name:1000" 697651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt // and the sscanf munge the two together. Detect that and fix 698651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt // note that all the %lu will be off by one and the real tx value will be in d 699651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt if (*rxString != '\0') { 700651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt *tx = d; 701651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt sscanf(rxString, "%20lu", rx); 702651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt } 7038e46896b4c4be5deaef651a12b17314f63ae9070San Mehat if (strcmp(name, iface)) { 7048e46896b4c4be5deaef651a12b17314f63ae9070San Mehat continue; 7058e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 7068e46896b4c4be5deaef651a12b17314f63ae9070San Mehat fclose(fp); 7078e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 7088e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 7098e46896b4c4be5deaef651a12b17314f63ae9070San Mehat 7108e46896b4c4be5deaef651a12b17314f63ae9070San Mehat fclose(fp); 71131c61c80a013bd1a050f0f4103e13fba62bf1717Robert Greenwalt *rx = 0; 71231c61c80a013bd1a050f0f4103e13fba62bf1717Robert Greenwalt *tx = 0; 71331c61c80a013bd1a050f0f4103e13fba62bf1717Robert Greenwalt return 0; 7148e46896b4c4be5deaef651a12b17314f63ae9070San Mehat} 715