CommandListener.cpp revision 5c4faf7602de0268aa09a3a525b427f83d617b5c
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 171fb02dfc26e06b83e756ab3538b7ebc2136f535dJP Abgrall// #define LOG_NDEBUG 0 18db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 19d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <stdlib.h> 20d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <sys/socket.h> 21d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <sys/types.h> 22d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <netinet/in.h> 23d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <arpa/inet.h> 24d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <dirent.h> 25d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <errno.h> 26ff2c0d8c13457e43f0d4bf06d3177271aac104c1Olivier Bailly#include <string.h> 2732a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff#include <fcntl.h> 285c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat#include <linux/if.h> 295c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 30d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#define LOG_TAG "CommandListener" 31d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 321ed47c4a016e420a855ee46922e512150245ff61Lorenzo Colitti#include <cutils/log.h> 331ed47c4a016e420a855ee46922e512150245ff61Lorenzo Colitti#include <netutils/ifc.h> 34d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include <sysutils/SocketClient.h> 35d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 36d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include "CommandListener.h" 37d18304287dbabc7835be771400b85d4ae8b63de6San Mehat#include "ResponseCode.h" 38a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat#include "ThrottleController.h" 394a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall#include "BandwidthController.h" 400031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall#include "IdletimerController.h" 41fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt#include "SecondaryTableController.h" 420031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall#include "oem_iptables_hook.h" 438e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey#include "NetdConstants.h" 44d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey#include "FirewallController.h" 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; 514a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP AbgrallBandwidthController * CommandListener::sBandwidthCtrl = NULL; 520031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP AbgrallIdletimerController * CommandListener::sIdletimerCtrl = NULL; 532eab1f762badb7ba46b95716e62ea4548a979903Dmitry ShmidtInterfaceController *CommandListener::sInterfaceCtrl = NULL; 5489c1e975f0c03997808d35c7be10b244c5309f9fMattias FalkResolverController *CommandListener::sResolverCtrl = NULL; 55fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert GreenwaltSecondaryTableController *CommandListener::sSecondaryTableCtrl = NULL; 56d8c64026aaae5a9987151b719bd840ec7d68747aJeff SharkeyFirewallController *CommandListener::sFirewallCtrl = NULL; 579d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 588e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey/** 598e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey * List of module chains to be created, along with explicit ordering. ORDERING 608e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey * IS CRITICAL, AND SHOULD BE TRIPLE-CHECKED WITH EACH CHANGE. 618e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey */ 628e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkeystatic const char* FILTER_INPUT[] = { 63d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey // Bandwidth should always be early in input chain, to make sure we 64d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey // correctly count incoming traffic against data plan. 658e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey BandwidthController::LOCAL_INPUT, 66d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey FirewallController::LOCAL_INPUT, 678e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey NULL, 688e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey}; 698e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey 708e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkeystatic const char* FILTER_FORWARD[] = { 718e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey OEM_IPTABLES_FILTER_FORWARD, 72d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey FirewallController::LOCAL_FORWARD, 738e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey BandwidthController::LOCAL_FORWARD, 748e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey NatController::LOCAL_FORWARD, 758e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey NULL, 768e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey}; 778e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey 788e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkeystatic const char* FILTER_OUTPUT[] = { 798e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey OEM_IPTABLES_FILTER_OUTPUT, 80d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey FirewallController::LOCAL_OUTPUT, 818e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey BandwidthController::LOCAL_OUTPUT, 828e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey NULL, 838e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey}; 848e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey 858e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkeystatic const char* RAW_PREROUTING[] = { 868e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey BandwidthController::LOCAL_RAW_PREROUTING, 875c4faf7602de0268aa09a3a525b427f83d617b5cHaoyu Bai IdletimerController::LOCAL_RAW_PREROUTING, 888e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey NULL, 898e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey}; 908e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey 918e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkeystatic const char* MANGLE_POSTROUTING[] = { 928e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey BandwidthController::LOCAL_MANGLE_POSTROUTING, 935c4faf7602de0268aa09a3a525b427f83d617b5cHaoyu Bai IdletimerController::LOCAL_MANGLE_POSTROUTING, 948e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey NULL, 958e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey}; 968e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey 978e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkeystatic const char* NAT_PREROUTING[] = { 988e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey OEM_IPTABLES_NAT_PREROUTING, 998e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey NULL, 1008e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey}; 1018e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey 1028e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkeystatic const char* NAT_POSTROUTING[] = { 1038e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey NatController::LOCAL_NAT_POSTROUTING, 1048e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey NULL, 1058e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey}; 1068e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey 1078e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkeystatic void createChildChains(IptablesTarget target, const char* table, const char* parentChain, 1088e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey const char** childChains) { 1098e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey const char** childChain = childChains; 1108e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey do { 1118e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey // Order is important: 1128e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey // -D to delete any pre-existing jump rule (removes references 1138e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey // that would prevent -X from working) 1148e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey // -F to flush any existing chain 1158e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey // -X to delete any existing chain 1168e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey // -N to create the chain 1178e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey // -A to append the chain to parent 1188e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey 1198e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey execIptablesSilently(target, "-t", table, "-D", parentChain, "-j", *childChain, NULL); 1208e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey execIptablesSilently(target, "-t", table, "-F", *childChain, NULL); 1218e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey execIptablesSilently(target, "-t", table, "-X", *childChain, NULL); 1228e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey execIptables(target, "-t", table, "-N", *childChain, NULL); 1238e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey execIptables(target, "-t", table, "-A", parentChain, "-j", *childChain, NULL); 1248e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey } while (*(++childChain) != NULL); 1258e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey} 1268e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey 127d18304287dbabc7835be771400b85d4ae8b63de6San MehatCommandListener::CommandListener() : 128a8e59f8c50aed3f91dead377b8ae21646978506cRobert Greenwalt FrameworkListener("netd", true) { 1295c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat registerCmd(new InterfaceCmd()); 130d18304287dbabc7835be771400b85d4ae8b63de6San Mehat registerCmd(new IpFwdCmd()); 131d18304287dbabc7835be771400b85d4ae8b63de6San Mehat registerCmd(new TetherCmd()); 132d18304287dbabc7835be771400b85d4ae8b63de6San Mehat registerCmd(new NatCmd()); 133d5573d34c8fac49e16b20cf144486125bf940086San Mehat registerCmd(new ListTtysCmd()); 134d5573d34c8fac49e16b20cf144486125bf940086San Mehat registerCmd(new PppdCmd()); 1351bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat registerCmd(new PanCmd()); 1365af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt registerCmd(new SoftapCmd()); 1374a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall registerCmd(new BandwidthControlCmd()); 1380031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall registerCmd(new IdletimerControlCmd()); 13989c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk registerCmd(new ResolverCmd()); 140d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey registerCmd(new FirewallCmd()); 1419d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 142fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt if (!sSecondaryTableCtrl) 143fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt sSecondaryTableCtrl = new SecondaryTableController(); 1449d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!sTetherCtrl) 1459d10b341a0ba46f108cb96e46691197d778cbc06San Mehat sTetherCtrl = new TetherController(); 1469ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat if (!sNatCtrl) 147fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt sNatCtrl = new NatController(sSecondaryTableCtrl); 148d5573d34c8fac49e16b20cf144486125bf940086San Mehat if (!sPppCtrl) 149d5573d34c8fac49e16b20cf144486125bf940086San Mehat sPppCtrl = new PppController(); 1501bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat if (!sPanCtrl) 1511bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat sPanCtrl = new PanController(); 1525af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt if (!sSoftapCtrl) 1535af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt sSoftapCtrl = new SoftapController(); 1544a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall if (!sBandwidthCtrl) 1554a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall sBandwidthCtrl = new BandwidthController(); 1560031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall if (!sIdletimerCtrl) 1570031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall sIdletimerCtrl = new IdletimerController(); 15889c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk if (!sResolverCtrl) 15989c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk sResolverCtrl = new ResolverController(); 160d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey if (!sFirewallCtrl) 161d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey sFirewallCtrl = new FirewallController(); 1622eab1f762badb7ba46b95716e62ea4548a979903Dmitry Shmidt if (!sInterfaceCtrl) 1632eab1f762badb7ba46b95716e62ea4548a979903Dmitry Shmidt sInterfaceCtrl = new InterfaceController(); 1640031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall 1650031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall /* 1668e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey * This is the only time we touch top-level chains in iptables; controllers 1678e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey * should only mutate rules inside of their children chains, as created by 1688e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey * the constants above. 1698e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey * 1708e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey * Modules should never ACCEPT packets (except in well-justified cases); 1718e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey * they should instead defer to any remaining modules using RETURN, or 1728e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey * otherwise DROP/REJECT. 1730031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall */ 1748e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey 1758e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey // Create chains for children modules 1768e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey createChildChains(V4V6, "filter", "INPUT", FILTER_INPUT); 1778e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey createChildChains(V4V6, "filter", "FORWARD", FILTER_FORWARD); 1788e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey createChildChains(V4V6, "filter", "OUTPUT", FILTER_OUTPUT); 1798e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey createChildChains(V4V6, "raw", "PREROUTING", RAW_PREROUTING); 1808e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey createChildChains(V4V6, "mangle", "POSTROUTING", MANGLE_POSTROUTING); 1818e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey createChildChains(V4, "nat", "PREROUTING", NAT_PREROUTING); 1828e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey createChildChains(V4, "nat", "POSTROUTING", NAT_POSTROUTING); 1838e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey 1848e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey // Let each module setup their child chains 1850031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall setupOemIptablesHook(); 1868e188ed5c989ddcc07f0f5e9839493c22d17e7b6Jeff Sharkey 187d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey /* When enabled, DROPs all packets except those matching rules. */ 188d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey sFirewallCtrl->setupIptablesHooks(); 189d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey 1900031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall /* Does DROPs in FORWARD by default */ 1910031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall sNatCtrl->setupIptablesHooks(); 1920031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall /* 1930031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall * Does REJECT in INPUT, OUTPUT. Does counting also. 1940031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall * No DROP/REJECT allowed later in netfilter-flow hook order. 1950031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall */ 1960031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall sBandwidthCtrl->setupIptablesHooks(); 1970031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall /* 1980031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall * Counts in nat: PREROUTING, POSTROUTING. 1990031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall * No DROP/REJECT allowed later in netfilter-flow hook order. 2000031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall */ 2010031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall sIdletimerCtrl->setupIptablesHooks(); 2020031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall 2030031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall sBandwidthCtrl->enableBandwidthControl(false); 204d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 205d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 2065c1b8af16dbbc20c89aaca2f93e725e12b16d055San MehatCommandListener::InterfaceCmd::InterfaceCmd() : 2075c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat NetdCommand("interface") { 208d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 209d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 210c1b3870147acd0dd42e2e767df08b4d64d5d2423repo syncint CommandListener::writeFile(const char *path, const char *value, int size) { 211c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync int fd = open(path, O_WRONLY); 212c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync if (fd < 0) { 2135ea0c05a1e7d8e664b808aa1bb1efd08fdb2fb13Steve Block ALOGE("Failed to open %s: %s", path, strerror(errno)); 214c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync return -1; 215c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync } 216c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync 217c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync if (write(fd, value, size) != size) { 2185ea0c05a1e7d8e664b808aa1bb1efd08fdb2fb13Steve Block ALOGE("Failed to write %s: %s", path, strerror(errno)); 219c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync close(fd); 220c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync return -1; 221c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync } 222c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync close(fd); 223c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync return 0; 224c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync} 225c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync 2265c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehatint CommandListener::InterfaceCmd::runCommand(SocketClient *cli, 227d18304287dbabc7835be771400b85d4ae8b63de6San Mehat int argc, char **argv) { 2285c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (argc < 2) { 2295c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 2305c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 2315c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 2325c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 2335c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (!strcmp(argv[1], "list")) { 2345c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat DIR *d; 2355c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat struct dirent *de; 2365c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 2375c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (!(d = opendir("/sys/class/net"))) { 2385c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to open sysfs dir", true); 2395c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 2405c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 2415c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 2425c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat while((de = readdir(d))) { 2435c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (de->d_name[0] == '.') 2445c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat continue; 2455c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::InterfaceListResult, de->d_name, false); 2465c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 2475c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat closedir(d); 2485c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Interface list completed", false); 2495c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 2508e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } else if (!strcmp(argv[1], "readrxcounter")) { 2518e46896b4c4be5deaef651a12b17314f63ae9070San Mehat if (argc != 3) { 2528e46896b4c4be5deaef651a12b17314f63ae9070San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, 2538e46896b4c4be5deaef651a12b17314f63ae9070San Mehat "Usage: interface readrxcounter <interface>", false); 2548e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 2558e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 2568e46896b4c4be5deaef651a12b17314f63ae9070San Mehat unsigned long rx = 0, tx = 0; 2578e46896b4c4be5deaef651a12b17314f63ae9070San Mehat if (readInterfaceCounters(argv[2], &rx, &tx)) { 2588e46896b4c4be5deaef651a12b17314f63ae9070San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to read counters", true); 2598e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 2608e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 2618e46896b4c4be5deaef651a12b17314f63ae9070San Mehat 2628e46896b4c4be5deaef651a12b17314f63ae9070San Mehat char *msg; 2638e46896b4c4be5deaef651a12b17314f63ae9070San Mehat asprintf(&msg, "%lu", rx); 2648e46896b4c4be5deaef651a12b17314f63ae9070San Mehat cli->sendMsg(ResponseCode::InterfaceRxCounterResult, msg, false); 2658e46896b4c4be5deaef651a12b17314f63ae9070San Mehat free(msg); 2668e46896b4c4be5deaef651a12b17314f63ae9070San Mehat 2678e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 2688e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } else if (!strcmp(argv[1], "readtxcounter")) { 2698e46896b4c4be5deaef651a12b17314f63ae9070San Mehat if (argc != 3) { 2708e46896b4c4be5deaef651a12b17314f63ae9070San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, 2718e46896b4c4be5deaef651a12b17314f63ae9070San Mehat "Usage: interface readtxcounter <interface>", false); 2728e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 2738e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 2748e46896b4c4be5deaef651a12b17314f63ae9070San Mehat unsigned long rx = 0, tx = 0; 2758e46896b4c4be5deaef651a12b17314f63ae9070San Mehat if (readInterfaceCounters(argv[2], &rx, &tx)) { 2768e46896b4c4be5deaef651a12b17314f63ae9070San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to read counters", true); 2778e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 2788e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 2798e46896b4c4be5deaef651a12b17314f63ae9070San Mehat 2808e46896b4c4be5deaef651a12b17314f63ae9070San Mehat char *msg = NULL; 2818e46896b4c4be5deaef651a12b17314f63ae9070San Mehat asprintf(&msg, "%lu", tx); 2828e46896b4c4be5deaef651a12b17314f63ae9070San Mehat cli->sendMsg(ResponseCode::InterfaceTxCounterResult, msg, false); 2838e46896b4c4be5deaef651a12b17314f63ae9070San Mehat free(msg); 2848e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 2858e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } else if (!strcmp(argv[1], "getthrottle")) { 286a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat if (argc != 4 || (argc == 4 && (strcmp(argv[3], "rx") && (strcmp(argv[3], "tx"))))) { 2878e46896b4c4be5deaef651a12b17314f63ae9070San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, 2888e46896b4c4be5deaef651a12b17314f63ae9070San Mehat "Usage: interface getthrottle <interface> <rx|tx>", false); 2898e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 2908e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 291a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat int val = 0; 292a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat int rc = 0; 293a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat int voldRc = ResponseCode::InterfaceRxThrottleResult; 294a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat 295a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat if (!strcmp(argv[3], "rx")) { 296a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat rc = ThrottleController::getInterfaceRxThrottle(argv[2], &val); 297a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat } else { 298a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat rc = ThrottleController::getInterfaceTxThrottle(argv[2], &val); 299a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat voldRc = ResponseCode::InterfaceTxThrottleResult; 300a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat } 301a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat if (rc) { 302a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to get throttle", true); 303a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat } else { 304a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat char *msg = NULL; 305a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat asprintf(&msg, "%u", val); 306a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat cli->sendMsg(voldRc, msg, false); 307a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat free(msg); 308a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat return 0; 309a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat } 3108e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 3118e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } else if (!strcmp(argv[1], "setthrottle")) { 3128e46896b4c4be5deaef651a12b17314f63ae9070San Mehat if (argc != 5) { 3138e46896b4c4be5deaef651a12b17314f63ae9070San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, 314a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat "Usage: interface setthrottle <interface> <rx_kbps> <tx_kbps>", false); 3158e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 3168e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 317a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat if (ThrottleController::setInterfaceThrottle(argv[2], atoi(argv[3]), atoi(argv[4]))) { 318a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to set throttle", true); 319a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat } else { 320a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Interface throttling set", false); 321a1992c9ff3e0d180c1f3042658ab9671d61a2fb8San Mehat } 3228e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 3232eab1f762badb7ba46b95716e62ea4548a979903Dmitry Shmidt } else if (!strcmp(argv[1], "driver")) { 3242eab1f762badb7ba46b95716e62ea4548a979903Dmitry Shmidt int rc; 3252eab1f762badb7ba46b95716e62ea4548a979903Dmitry Shmidt char *rbuf; 3262eab1f762badb7ba46b95716e62ea4548a979903Dmitry Shmidt 3272eab1f762badb7ba46b95716e62ea4548a979903Dmitry Shmidt if (argc < 4) { 3282eab1f762badb7ba46b95716e62ea4548a979903Dmitry Shmidt cli->sendMsg(ResponseCode::CommandSyntaxError, 3292eab1f762badb7ba46b95716e62ea4548a979903Dmitry Shmidt "Usage: interface driver <interface> <cmd> <args>", false); 3302eab1f762badb7ba46b95716e62ea4548a979903Dmitry Shmidt return 0; 3312eab1f762badb7ba46b95716e62ea4548a979903Dmitry Shmidt } 3322eab1f762badb7ba46b95716e62ea4548a979903Dmitry Shmidt rc = sInterfaceCtrl->interfaceCommand(argc, argv, &rbuf); 3332eab1f762badb7ba46b95716e62ea4548a979903Dmitry Shmidt if (rc) { 3342eab1f762badb7ba46b95716e62ea4548a979903Dmitry Shmidt cli->sendMsg(ResponseCode::OperationFailed, "Failed to execute command", true); 3352eab1f762badb7ba46b95716e62ea4548a979903Dmitry Shmidt } else { 3362eab1f762badb7ba46b95716e62ea4548a979903Dmitry Shmidt cli->sendMsg(ResponseCode::CommandOkay, rbuf, false); 3372eab1f762badb7ba46b95716e62ea4548a979903Dmitry Shmidt } 3382eab1f762badb7ba46b95716e62ea4548a979903Dmitry Shmidt return 0; 3395c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } else { 3405c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat /* 3415c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat * These commands take a minimum of 3 arguments 3425c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat */ 3435c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (argc < 3) { 3445c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 3455c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 3465c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 347e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt 348fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt // 0 1 2 3 4 5 6 7 349fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt // interface route add/remove iface default/secondary dest prefix gateway 350e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt if (!strcmp(argv[1], "route")) { 351e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt int prefix_length = 0; 352fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt if (argc < 8) { 353e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 354e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt return 0; 355e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } 356fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt if (sscanf(argv[6], "%d", &prefix_length) != 1) { 357e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt cli->sendMsg(ResponseCode::CommandParameterError, "Invalid route prefix", false); 358e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt return 0; 359e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } 360e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt if (!strcmp(argv[2], "add")) { 361fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt if (!strcmp(argv[4], "default")) { 362fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt if (ifc_add_route(argv[3], argv[5], prefix_length, argv[7])) { 363fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt cli->sendMsg(ResponseCode::OperationFailed, 364fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt "Failed to add route to default table", true); 365fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt } else { 366fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt cli->sendMsg(ResponseCode::CommandOkay, 367fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt "Route added to default table", false); 368fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt } 369fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt } else if (!strcmp(argv[4], "secondary")) { 370fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt return sSecondaryTableCtrl->addRoute(cli, argv[3], argv[5], 371fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt prefix_length, argv[7]); 372e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } else { 373fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt cli->sendMsg(ResponseCode::CommandParameterError, 374fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt "Invalid route type, expecting 'default' or 'secondary'", false); 375fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt return 0; 376e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } 377e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } else if (!strcmp(argv[2], "remove")) { 378fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt if (!strcmp(argv[4], "default")) { 379fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt if (ifc_remove_route(argv[3], argv[5], prefix_length, argv[7])) { 380fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt cli->sendMsg(ResponseCode::OperationFailed, 381fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt "Failed to remove route from default table", true); 382fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt } else { 383fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt cli->sendMsg(ResponseCode::CommandOkay, 384fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt "Route removed from default table", false); 385fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt } 386fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt } else if (!strcmp(argv[4], "secondary")) { 387fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt return sSecondaryTableCtrl->removeRoute(cli, argv[3], argv[5], 388fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt prefix_length, argv[7]); 389e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } else { 390fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt cli->sendMsg(ResponseCode::CommandParameterError, 391fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt "Invalid route type, expecting 'default' or 'secondary'", false); 392fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt return 0; 393e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } 394e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } else { 395e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown interface cmd", false); 396e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } 397e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt return 0; 398e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt } 399e019b65925217bcc3ad9b662aa3125f0593057afRobert Greenwalt 4005c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (!strcmp(argv[1], "getcfg")) { 4011d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwalt struct in_addr addr; 4021d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwalt int prefixLength; 4035c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat unsigned char hwaddr[6]; 4045c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat unsigned flags = 0; 4055c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 4065c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat ifc_init(); 4075c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat memset(hwaddr, 0, sizeof(hwaddr)); 4085c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 4091d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwalt if (ifc_get_info(argv[2], &addr.s_addr, &prefixLength, &flags)) { 4105c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Interface not found", true); 411e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff ifc_close(); 4125c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 4135c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 4145c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 4155c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (ifc_get_hwaddr(argv[2], (void *) hwaddr)) { 4160e76b761a1514d5182675dd7b7d33725f62d6bc5Steve Block ALOGW("Failed to retrieve HW addr for %s (%s)", argv[2], strerror(errno)); 4175c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 4185c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 4195c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat char *addr_s = strdup(inet_ntoa(addr)); 4205c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat const char *updown, *brdcst, *loopbk, *ppp, *running, *multi; 4215c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 4225c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat updown = (flags & IFF_UP) ? "up" : "down"; 4235c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat brdcst = (flags & IFF_BROADCAST) ? " broadcast" : ""; 4245c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat loopbk = (flags & IFF_LOOPBACK) ? " loopback" : ""; 4255c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat ppp = (flags & IFF_POINTOPOINT) ? " point-to-point" : ""; 4265c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat running = (flags & IFF_RUNNING) ? " running" : ""; 4275c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat multi = (flags & IFF_MULTICAST) ? " multicast" : ""; 4285c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 4295c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat char *flag_s; 4305c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 43131ea0b03afeedd17f703b7a6d1e5c9feb2d6000dJeff Sharkey asprintf(&flag_s, "%s%s%s%s%s%s", updown, brdcst, loopbk, ppp, running, multi); 4325c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 4335c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat char *msg = NULL; 4341d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwalt asprintf(&msg, "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x %s %d %s", 4355c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat hwaddr[0], hwaddr[1], hwaddr[2], hwaddr[3], hwaddr[4], hwaddr[5], 4361d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwalt addr_s, prefixLength, flag_s); 4375c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 43801fed783828b592cda3b774deea4099a9e690e3dSan Mehat cli->sendMsg(ResponseCode::InterfaceGetCfgResult, msg, false); 4395c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 4405c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat free(addr_s); 4415c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat free(flag_s); 4425c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat free(msg); 443e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff 444e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff ifc_close(); 4455c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 4465c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } else if (!strcmp(argv[1], "setcfg")) { 447778ffe4d3dcab5453b57a0d960ea7f066374b953Dmitry Shmidt // arglist: iface [addr prefixLength] flags 448778ffe4d3dcab5453b57a0d960ea7f066374b953Dmitry Shmidt if (argc < 4) { 4495c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 4505c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 4515c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 4527b984e3f7e724f8a3547a707210319f3d479f261Steve Block ALOGD("Setting iface cfg"); 4535c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 4541d93e170f13b221362ee268fdc94b25db06c21c9Robert Greenwalt struct in_addr addr; 4555c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat unsigned flags = 0; 456778ffe4d3dcab5453b57a0d960ea7f066374b953Dmitry Shmidt int index = 5; 4575c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 4585c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat ifc_init(); 4595c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 460778ffe4d3dcab5453b57a0d960ea7f066374b953Dmitry Shmidt if (!inet_aton(argv[3], &addr)) { 461778ffe4d3dcab5453b57a0d960ea7f066374b953Dmitry Shmidt // Handle flags only case 462778ffe4d3dcab5453b57a0d960ea7f066374b953Dmitry Shmidt index = 3; 463778ffe4d3dcab5453b57a0d960ea7f066374b953Dmitry Shmidt } else { 464778ffe4d3dcab5453b57a0d960ea7f066374b953Dmitry Shmidt if (ifc_set_addr(argv[2], addr.s_addr)) { 465778ffe4d3dcab5453b57a0d960ea7f066374b953Dmitry Shmidt cli->sendMsg(ResponseCode::OperationFailed, "Failed to set address", true); 466778ffe4d3dcab5453b57a0d960ea7f066374b953Dmitry Shmidt ifc_close(); 467778ffe4d3dcab5453b57a0d960ea7f066374b953Dmitry Shmidt return 0; 468778ffe4d3dcab5453b57a0d960ea7f066374b953Dmitry Shmidt } 469778ffe4d3dcab5453b57a0d960ea7f066374b953Dmitry Shmidt 470778ffe4d3dcab5453b57a0d960ea7f066374b953Dmitry Shmidt // Set prefix length on a non zero address 471778ffe4d3dcab5453b57a0d960ea7f066374b953Dmitry Shmidt if (addr.s_addr != 0 && ifc_set_prefixLength(argv[2], atoi(argv[4]))) { 472778ffe4d3dcab5453b57a0d960ea7f066374b953Dmitry Shmidt cli->sendMsg(ResponseCode::OperationFailed, "Failed to set prefixLength", true); 473778ffe4d3dcab5453b57a0d960ea7f066374b953Dmitry Shmidt ifc_close(); 474778ffe4d3dcab5453b57a0d960ea7f066374b953Dmitry Shmidt return 0; 475778ffe4d3dcab5453b57a0d960ea7f066374b953Dmitry Shmidt } 4765c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 4775c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat 4785c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat /* Process flags */ 479778ffe4d3dcab5453b57a0d960ea7f066374b953Dmitry Shmidt for (int i = index; i < argc; i++) { 480e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt char *flag = argv[i]; 481e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt if (!strcmp(flag, "up")) { 4827b984e3f7e724f8a3547a707210319f3d479f261Steve Block ALOGD("Trying to bring up %s", argv[2]); 4835c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (ifc_up(argv[2])) { 4845ea0c05a1e7d8e664b808aa1bb1efd08fdb2fb13Steve Block ALOGE("Error upping interface"); 4855c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to up interface", true); 486e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff ifc_close(); 4875c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 4885c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 489e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt } else if (!strcmp(flag, "down")) { 4907b984e3f7e724f8a3547a707210319f3d479f261Steve Block ALOGD("Trying to bring down %s", argv[2]); 4915c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat if (ifc_down(argv[2])) { 4925ea0c05a1e7d8e664b808aa1bb1efd08fdb2fb13Steve Block ALOGE("Error downing interface"); 4935c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Failed to down interface", true); 494e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff ifc_close(); 4955c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 4965c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 497e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt } else if (!strcmp(flag, "broadcast")) { 4987c2ddd84ec501aaedb806a3ecec5de00d618a036Jeff Sharkey // currently ignored 499e7b9422f0dc7a18041536c63efe74c7095496258Robert Greenwalt } else if (!strcmp(flag, "multicast")) { 5007c2ddd84ec501aaedb806a3ecec5de00d618a036Jeff Sharkey // currently ignored 5017c2ddd84ec501aaedb806a3ecec5de00d618a036Jeff Sharkey } else if (!strcmp(flag, "running")) { 5027c2ddd84ec501aaedb806a3ecec5de00d618a036Jeff Sharkey // currently ignored 5037c2ddd84ec501aaedb806a3ecec5de00d618a036Jeff Sharkey } else if (!strcmp(flag, "loopback")) { 5047c2ddd84ec501aaedb806a3ecec5de00d618a036Jeff Sharkey // currently ignored 5057c2ddd84ec501aaedb806a3ecec5de00d618a036Jeff Sharkey } else if (!strcmp(flag, "point-to-point")) { 5067c2ddd84ec501aaedb806a3ecec5de00d618a036Jeff Sharkey // currently ignored 5075c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } else { 5085c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandParameterError, "Flag unsupported", false); 509e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff ifc_close(); 5105c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 5115c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 5125c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 513e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff 5145c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Interface configuration set", false); 515e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff ifc_close(); 516e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff return 0; 517e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff } else if (!strcmp(argv[1], "clearaddrs")) { 518e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff // arglist: iface 5197b984e3f7e724f8a3547a707210319f3d479f261Steve Block ALOGD("Clearing all IP addresses on %s", argv[2]); 520e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff 5211ed47c4a016e420a855ee46922e512150245ff61Lorenzo Colitti ifc_clear_addresses(argv[2]); 5221ed47c4a016e420a855ee46922e512150245ff61Lorenzo Colitti 523e734edd35d8d02da96330d77420650c044a12527Irfan Sheriff cli->sendMsg(ResponseCode::CommandOkay, "Interface IP addresses cleared", false); 5245c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 52532a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff } else if (!strcmp(argv[1], "ipv6privacyextensions")) { 52632a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff if (argc != 4) { 52732a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff cli->sendMsg(ResponseCode::CommandSyntaxError, 52832a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff "Usage: interface ipv6privacyextensions <interface> <enable|disable>", 52932a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff false); 53032a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff return 0; 53132a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff } 53232a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff 533c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync char *tmp; 53432a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff asprintf(&tmp, "/proc/sys/net/ipv6/conf/%s/use_tempaddr", argv[2]); 535c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync 536c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync if (writeFile(tmp, !strncmp(argv[3], "enable", 7) ? "2" : "0", 1) < 0) { 53732a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff free(tmp); 53832a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff cli->sendMsg(ResponseCode::OperationFailed, 53932a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff "Failed to set ipv6 privacy extensions", true); 54032a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff return 0; 54132a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff } 54232a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff 543c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync free(tmp); 544c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync cli->sendMsg(ResponseCode::CommandOkay, "IPv6 privacy extensions changed", false); 545c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync return 0; 546c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync } else if (!strcmp(argv[1], "ipv6")) { 547c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync if (argc != 4) { 548c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync cli->sendMsg(ResponseCode::CommandSyntaxError, 549c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync "Usage: interface ipv6 <interface> <enable|disable>", 550c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync false); 551c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync return 0; 552c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync } 553c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync 554c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync char *tmp; 555c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync asprintf(&tmp, "/proc/sys/net/ipv6/conf/%s/disable_ipv6", argv[2]); 556c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync 557c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync if (writeFile(tmp, !strncmp(argv[3], "enable", 7) ? "0" : "1", 1) < 0) { 55832a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff free(tmp); 55932a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff cli->sendMsg(ResponseCode::OperationFailed, 560c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync "Failed to change IPv6 state", true); 56132a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff return 0; 56232a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff } 563c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync 56432a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff free(tmp); 565c1b3870147acd0dd42e2e767df08b4d64d5d2423repo sync cli->sendMsg(ResponseCode::CommandOkay, "IPv6 state changed", false); 56632a9dc6f484deb3462d11084caca21e3f1f662b2Irfan Sheriff return 0; 5675c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } else { 5685c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown interface cmd", false); 5695c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat return 0; 5705c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 5715c1b8af16dbbc20c89aaca2f93e725e12b16d055San Mehat } 572d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return 0; 573d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 574d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 5754a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall 576d5573d34c8fac49e16b20cf144486125bf940086San MehatCommandListener::ListTtysCmd::ListTtysCmd() : 577d5573d34c8fac49e16b20cf144486125bf940086San Mehat NetdCommand("list_ttys") { 578d5573d34c8fac49e16b20cf144486125bf940086San Mehat} 579d5573d34c8fac49e16b20cf144486125bf940086San Mehat 580d5573d34c8fac49e16b20cf144486125bf940086San Mehatint CommandListener::ListTtysCmd::runCommand(SocketClient *cli, 581d5573d34c8fac49e16b20cf144486125bf940086San Mehat int argc, char **argv) { 582d5573d34c8fac49e16b20cf144486125bf940086San Mehat TtyCollection *tlist = sPppCtrl->getTtyList(); 583d5573d34c8fac49e16b20cf144486125bf940086San Mehat TtyCollection::iterator it; 584d5573d34c8fac49e16b20cf144486125bf940086San Mehat 585d5573d34c8fac49e16b20cf144486125bf940086San Mehat for (it = tlist->begin(); it != tlist->end(); ++it) { 586d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::TtyListResult, *it, false); 587d5573d34c8fac49e16b20cf144486125bf940086San Mehat } 588d5573d34c8fac49e16b20cf144486125bf940086San Mehat 589d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Ttys listed.", false); 590d5573d34c8fac49e16b20cf144486125bf940086San Mehat return 0; 591d5573d34c8fac49e16b20cf144486125bf940086San Mehat} 592d5573d34c8fac49e16b20cf144486125bf940086San Mehat 593d18304287dbabc7835be771400b85d4ae8b63de6San MehatCommandListener::IpFwdCmd::IpFwdCmd() : 594d18304287dbabc7835be771400b85d4ae8b63de6San Mehat NetdCommand("ipfwd") { 595d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 596d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 597d18304287dbabc7835be771400b85d4ae8b63de6San Mehatint CommandListener::IpFwdCmd::runCommand(SocketClient *cli, 598d18304287dbabc7835be771400b85d4ae8b63de6San Mehat int argc, char **argv) { 5999d10b341a0ba46f108cb96e46691197d778cbc06San Mehat int rc = 0; 6009d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 6019d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (argc < 2) { 6029d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 6039d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 6049d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 6059d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 6069d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!strcmp(argv[1], "status")) { 6079d10b341a0ba46f108cb96e46691197d778cbc06San Mehat char *tmp = NULL; 6089d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 6099d10b341a0ba46f108cb96e46691197d778cbc06San Mehat asprintf(&tmp, "Forwarding %s", (sTetherCtrl->getIpFwdEnabled() ? "enabled" : "disabled")); 6109d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::IpFwdStatusResult, tmp, false); 6119d10b341a0ba46f108cb96e46691197d778cbc06San Mehat free(tmp); 6129d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 6139d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[1], "enable")) { 6149d10b341a0ba46f108cb96e46691197d778cbc06San Mehat rc = sTetherCtrl->setIpFwdEnabled(true); 6159d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[1], "disable")) { 6169d10b341a0ba46f108cb96e46691197d778cbc06San Mehat rc = sTetherCtrl->setIpFwdEnabled(false); 6179d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 6189d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown ipfwd cmd", false); 6199d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 6209d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 6219d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 6229d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!rc) { 6239d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandOkay, "ipfwd operation succeeded", false); 6249d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 6259d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::OperationFailed, "ipfwd operation failed", true); 6269d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 627d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 628d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return 0; 629d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 630d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 631d18304287dbabc7835be771400b85d4ae8b63de6San MehatCommandListener::TetherCmd::TetherCmd() : 632d18304287dbabc7835be771400b85d4ae8b63de6San Mehat NetdCommand("tether") { 633d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 634d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 635d18304287dbabc7835be771400b85d4ae8b63de6San Mehatint CommandListener::TetherCmd::runCommand(SocketClient *cli, 636d18304287dbabc7835be771400b85d4ae8b63de6San Mehat int argc, char **argv) { 6379d10b341a0ba46f108cb96e46691197d778cbc06San Mehat int rc = 0; 6389d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 639d18304287dbabc7835be771400b85d4ae8b63de6San Mehat if (argc < 2) { 640d18304287dbabc7835be771400b85d4ae8b63de6San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 641d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return 0; 642d18304287dbabc7835be771400b85d4ae8b63de6San Mehat } 643d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 6449d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!strcmp(argv[1], "stop")) { 6459d10b341a0ba46f108cb96e46691197d778cbc06San Mehat rc = sTetherCtrl->stopTethering(); 6469589a4c6e0b6a5ec60c65b248e7deff2805749b2zzy } else if(!strcmp(argv[1], "start-reverse")) { 6479caaa44f635f86200e2b9b4cd36d1471ce910a6aMatthew Xie ALOGD("CommandListener::TetherCmd::run, call startReverseTethering, iface:%s", argv[2]); 6489589a4c6e0b6a5ec60c65b248e7deff2805749b2zzy sTetherCtrl->startReverseTethering(argv[2]); 6499589a4c6e0b6a5ec60c65b248e7deff2805749b2zzy } else if (!strcmp(argv[1], "stop-reverse")) { 6509caaa44f635f86200e2b9b4cd36d1471ce910a6aMatthew Xie ALOGD("CommandListener::TetherCmd::run, call stopReverseTethering"); 6519589a4c6e0b6a5ec60c65b248e7deff2805749b2zzy rc = sTetherCtrl->stopReverseTethering(); 652d18304287dbabc7835be771400b85d4ae8b63de6San Mehat } else if (!strcmp(argv[1], "status")) { 6539d10b341a0ba46f108cb96e46691197d778cbc06San Mehat char *tmp = NULL; 6549d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 6559d10b341a0ba46f108cb96e46691197d778cbc06San Mehat asprintf(&tmp, "Tethering services %s", 6569d10b341a0ba46f108cb96e46691197d778cbc06San Mehat (sTetherCtrl->isTetheringStarted() ? "started" : "stopped")); 6579d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::TetherStatusResult, tmp, false); 6589d10b341a0ba46f108cb96e46691197d778cbc06San Mehat free(tmp); 659d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return 0; 6609d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 6619d10b341a0ba46f108cb96e46691197d778cbc06San Mehat /* 6629d10b341a0ba46f108cb96e46691197d778cbc06San Mehat * These commands take a minimum of 4 arguments 6639d10b341a0ba46f108cb96e46691197d778cbc06San Mehat */ 6649d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (argc < 4) { 6659d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 6669d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 6679d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 6689d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 6699d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!strcmp(argv[1], "start")) { 6703208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt if (argc % 2 == 1) { 6713208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt cli->sendMsg(ResponseCode::CommandSyntaxError, "Bad number of arguments", false); 6729d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 6739d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 6743208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt 6753208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt int num_addrs = argc - 2; 6763208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt int arg_index = 2; 6773208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt int array_index = 0; 6783208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt in_addr *addrs = (in_addr *)malloc(sizeof(in_addr) * num_addrs); 6793208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt while (array_index < num_addrs) { 6803208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt if (!inet_aton(argv[arg_index++], &(addrs[array_index++]))) { 6813208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt cli->sendMsg(ResponseCode::CommandParameterError, "Invalid address", false); 6823208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt free(addrs); 6833208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt return 0; 6843208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt } 6859d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 6863208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt rc = sTetherCtrl->startTethering(num_addrs, addrs); 6873208ea0b6cce28e7aef8459d548fd86df329e34fRobert Greenwalt free(addrs); 6889d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[1], "interface")) { 6899d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!strcmp(argv[2], "add")) { 6909d10b341a0ba46f108cb96e46691197d778cbc06San Mehat rc = sTetherCtrl->tetherInterface(argv[3]); 6919d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[2], "remove")) { 6929d10b341a0ba46f108cb96e46691197d778cbc06San Mehat rc = sTetherCtrl->untetherInterface(argv[3]); 6939d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[2], "list")) { 6949d10b341a0ba46f108cb96e46691197d778cbc06San Mehat InterfaceCollection *ilist = sTetherCtrl->getTetheredInterfaceList(); 6959d10b341a0ba46f108cb96e46691197d778cbc06San Mehat InterfaceCollection::iterator it; 6969d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 6979d10b341a0ba46f108cb96e46691197d778cbc06San Mehat for (it = ilist->begin(); it != ilist->end(); ++it) { 6989d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::TetherInterfaceListResult, *it, false); 6999d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 7009d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 7019d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandParameterError, 7029d10b341a0ba46f108cb96e46691197d778cbc06San Mehat "Unknown tether interface operation", false); 7039d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 7049d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 7059d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[1], "dns")) { 7069d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!strcmp(argv[2], "set")) { 7079d10b341a0ba46f108cb96e46691197d778cbc06San Mehat rc = sTetherCtrl->setDnsForwarders(&argv[3], argc - 3); 7089d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else if (!strcmp(argv[2], "list")) { 7099d10b341a0ba46f108cb96e46691197d778cbc06San Mehat NetAddressCollection *dlist = sTetherCtrl->getDnsForwarders(); 7109d10b341a0ba46f108cb96e46691197d778cbc06San Mehat NetAddressCollection::iterator it; 7119d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 7129d10b341a0ba46f108cb96e46691197d778cbc06San Mehat for (it = dlist->begin(); it != dlist->end(); ++it) { 7139d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::TetherDnsFwdTgtListResult, inet_ntoa(*it), false); 7149d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 7159d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 7169d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandParameterError, 7179d10b341a0ba46f108cb96e46691197d778cbc06San Mehat "Unknown tether interface operation", false); 7189d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 7199d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 7209d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 7219d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown tether cmd", false); 7229d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 7239d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 7249d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 7259d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 7269d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!rc) { 7279d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Tether operation succeeded", false); 7289d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 7299d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Tether operation failed", true); 730d18304287dbabc7835be771400b85d4ae8b63de6San Mehat } 731d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 732d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return 0; 733d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 734d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 735d18304287dbabc7835be771400b85d4ae8b63de6San MehatCommandListener::NatCmd::NatCmd() : 736d18304287dbabc7835be771400b85d4ae8b63de6San Mehat NetdCommand("nat") { 737d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 738d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 739d18304287dbabc7835be771400b85d4ae8b63de6San Mehatint CommandListener::NatCmd::runCommand(SocketClient *cli, 740d18304287dbabc7835be771400b85d4ae8b63de6San Mehat int argc, char **argv) { 7419d10b341a0ba46f108cb96e46691197d778cbc06San Mehat int rc = 0; 7429d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 743fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt if (argc < 5) { 7449d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 7459d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 7469d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 7479d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 7489ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat if (!strcmp(argv[1], "enable")) { 749fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt rc = sNatCtrl->enableNat(argc, argv); 750c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall if(!rc) { 751c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall /* Ignore ifaces for now. */ 752c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall rc = sBandwidthCtrl->setGlobalAlertInForwardChain(); 753c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall } 7549ff78fb7da7158f5bd7c86d89a842691820259cfSan Mehat } else if (!strcmp(argv[1], "disable")) { 755f7bf29c8a37d65e132a4dceb7c5a4200ed5c3d79Robert Greenwalt /* Ignore ifaces for now. */ 756fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt rc = sBandwidthCtrl->removeGlobalAlertInForwardChain(); 757fc97b82e02979f246d56a4bfd60e4aab8686d3f6Robert Greenwalt rc |= sNatCtrl->disableNat(argc, argv); 7589d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 7599d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown nat cmd", false); 7609d10b341a0ba46f108cb96e46691197d778cbc06San Mehat return 0; 7619d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 7629d10b341a0ba46f108cb96e46691197d778cbc06San Mehat 7639d10b341a0ba46f108cb96e46691197d778cbc06San Mehat if (!rc) { 7649d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Nat operation succeeded", false); 7659d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } else { 7669d10b341a0ba46f108cb96e46691197d778cbc06San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Nat operation failed", true); 7679d10b341a0ba46f108cb96e46691197d778cbc06San Mehat } 768d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 769d18304287dbabc7835be771400b85d4ae8b63de6San Mehat return 0; 770d18304287dbabc7835be771400b85d4ae8b63de6San Mehat} 771d18304287dbabc7835be771400b85d4ae8b63de6San Mehat 772d5573d34c8fac49e16b20cf144486125bf940086San MehatCommandListener::PppdCmd::PppdCmd() : 773d5573d34c8fac49e16b20cf144486125bf940086San Mehat NetdCommand("pppd") { 774d5573d34c8fac49e16b20cf144486125bf940086San Mehat} 775d5573d34c8fac49e16b20cf144486125bf940086San Mehat 776d5573d34c8fac49e16b20cf144486125bf940086San Mehatint CommandListener::PppdCmd::runCommand(SocketClient *cli, 777d5573d34c8fac49e16b20cf144486125bf940086San Mehat int argc, char **argv) { 778d5573d34c8fac49e16b20cf144486125bf940086San Mehat int rc = 0; 779d5573d34c8fac49e16b20cf144486125bf940086San Mehat 780d5573d34c8fac49e16b20cf144486125bf940086San Mehat if (argc < 3) { 781d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 782d5573d34c8fac49e16b20cf144486125bf940086San Mehat return 0; 783d5573d34c8fac49e16b20cf144486125bf940086San Mehat } 784d5573d34c8fac49e16b20cf144486125bf940086San Mehat 785d5573d34c8fac49e16b20cf144486125bf940086San Mehat if (!strcmp(argv[1], "attach")) { 78674d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt struct in_addr l, r, dns1, dns2; 78774d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt 78874d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt memset(&dns1, sizeof(struct in_addr), 0); 78974d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt memset(&dns2, sizeof(struct in_addr), 0); 790d5573d34c8fac49e16b20cf144486125bf940086San Mehat 791d5573d34c8fac49e16b20cf144486125bf940086San Mehat if (!inet_aton(argv[3], &l)) { 792d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::CommandParameterError, "Invalid local address", false); 793d5573d34c8fac49e16b20cf144486125bf940086San Mehat return 0; 794d5573d34c8fac49e16b20cf144486125bf940086San Mehat } 795d5573d34c8fac49e16b20cf144486125bf940086San Mehat if (!inet_aton(argv[4], &r)) { 796d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::CommandParameterError, "Invalid remote address", false); 797d5573d34c8fac49e16b20cf144486125bf940086San Mehat return 0; 798d5573d34c8fac49e16b20cf144486125bf940086San Mehat } 79974d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt if ((argc > 3) && (!inet_aton(argv[5], &dns1))) { 80074d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt cli->sendMsg(ResponseCode::CommandParameterError, "Invalid dns1 address", false); 80174d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt return 0; 80274d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt } 80374d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt if ((argc > 4) && (!inet_aton(argv[6], &dns2))) { 80474d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt cli->sendMsg(ResponseCode::CommandParameterError, "Invalid dns2 address", false); 80574d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt return 0; 80674d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt } 80774d8fdd307275bfdf95dcf61d9e6366e87da24ecRobert Greenwalt rc = sPppCtrl->attachPppd(argv[2], l, r, dns1, dns2); 808d5573d34c8fac49e16b20cf144486125bf940086San Mehat } else if (!strcmp(argv[1], "detach")) { 809d5573d34c8fac49e16b20cf144486125bf940086San Mehat rc = sPppCtrl->detachPppd(argv[2]); 810d5573d34c8fac49e16b20cf144486125bf940086San Mehat } else { 811d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown pppd cmd", false); 812d5573d34c8fac49e16b20cf144486125bf940086San Mehat return 0; 813d5573d34c8fac49e16b20cf144486125bf940086San Mehat } 814d5573d34c8fac49e16b20cf144486125bf940086San Mehat 815d5573d34c8fac49e16b20cf144486125bf940086San Mehat if (!rc) { 816d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Pppd operation succeeded", false); 817d5573d34c8fac49e16b20cf144486125bf940086San Mehat } else { 818d5573d34c8fac49e16b20cf144486125bf940086San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Pppd operation failed", true); 819d5573d34c8fac49e16b20cf144486125bf940086San Mehat } 820d5573d34c8fac49e16b20cf144486125bf940086San Mehat 821d5573d34c8fac49e16b20cf144486125bf940086San Mehat return 0; 822d5573d34c8fac49e16b20cf144486125bf940086San Mehat} 8231bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat 8241bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San MehatCommandListener::PanCmd::PanCmd() : 8251bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat NetdCommand("pan") { 8261bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat} 8271bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat 8281bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehatint CommandListener::PanCmd::runCommand(SocketClient *cli, 8291bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat int argc, char **argv) { 8301bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat int rc = 0; 8311bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat 8321bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat if (argc < 2) { 8331bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 8341bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat return 0; 8351bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat } 8361bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat 8371bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat if (!strcmp(argv[1], "start")) { 8381bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat rc = sPanCtrl->startPan(); 8391bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat } else if (!strcmp(argv[1], "stop")) { 8401bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat rc = sPanCtrl->stopPan(); 8411bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat } else if (!strcmp(argv[1], "status")) { 8421bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat char *tmp = NULL; 8431bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat 8441bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat asprintf(&tmp, "Pan services %s", 8451bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat (sPanCtrl->isPanStarted() ? "started" : "stopped")); 8461bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat cli->sendMsg(ResponseCode::PanStatusResult, tmp, false); 8471bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat free(tmp); 8481bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat return 0; 8491bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat } else { 8501bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown pan cmd", false); 8511bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat return 0; 8521bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat } 8531bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat 8541bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat if (!rc) { 8551bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat cli->sendMsg(ResponseCode::CommandOkay, "Pan operation succeeded", false); 8561bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat } else { 8571bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat cli->sendMsg(ResponseCode::OperationFailed, "Pan operation failed", true); 8581bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat } 8591bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat 8601bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat return 0; 8611bdac9e98c1ef37ba568b6cf23bfbc09cfe6bf15San Mehat} 8625af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 8635af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry ShmidtCommandListener::SoftapCmd::SoftapCmd() : 8645af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt NetdCommand("softap") { 8655af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt} 8665af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 8675af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidtint CommandListener::SoftapCmd::runCommand(SocketClient *cli, 8685af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt int argc, char **argv) { 86931fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt int rc = 0, flag = 0; 870666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt char *retbuf = NULL; 8715af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 8725af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt if (argc < 2) { 8735af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt cli->sendMsg(ResponseCode::CommandSyntaxError, "Softap Missing argument", false); 8745af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt return 0; 8755af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } 8765af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 8777e9eb7b48345af69283afa7ca58d3be0a329931bIrfan Sheriff if (!strcmp(argv[1], "startap")) { 878c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt rc = sSoftapCtrl->startSoftap(); 879c3539e22bd7a59a12542b9ad961f7d7f0db9a8dfDmitry Shmidt } else if (!strcmp(argv[1], "stopap")) { 8805af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt rc = sSoftapCtrl->stopSoftap(); 88131fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt } else if (!strcmp(argv[1], "fwreload")) { 88231fd6c5f3e9c39a13b028718dba5921a4300988cDmitry Shmidt rc = sSoftapCtrl->fwReloadSoftap(argc, argv); 883666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt } else if (!strcmp(argv[1], "clients")) { 884666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt rc = sSoftapCtrl->clientsSoftap(&retbuf); 885666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt if (!rc) { 886666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt cli->sendMsg(ResponseCode::CommandOkay, retbuf, false); 887666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt free(retbuf); 888666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt return 0; 889666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt } 8905af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } else if (!strcmp(argv[1], "status")) { 891666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt asprintf(&retbuf, "Softap service %s", 8925af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt (sSoftapCtrl->isSoftapStarted() ? "started" : "stopped")); 893666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt cli->sendMsg(ResponseCode::SoftapStatusResult, retbuf, false); 894666fe255fa581965d2835bd581cd5a8959411067Dmitry Shmidt free(retbuf); 8955af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt return 0; 8965af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } else if (!strcmp(argv[1], "set")) { 8975af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt rc = sSoftapCtrl->setSoftap(argc, argv); 8985af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } else { 8995af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt cli->sendMsg(ResponseCode::CommandSyntaxError, "Softap Unknown cmd", false); 9005af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt return 0; 9015af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } 9025af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 9035af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt if (!rc) { 9045af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt cli->sendMsg(ResponseCode::CommandOkay, "Softap operation succeeded", false); 9055af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } else { 9065af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt cli->sendMsg(ResponseCode::OperationFailed, "Softap operation failed", true); 9075af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt } 9085af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt 9095af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt return 0; 9105af38c360587ca2eef0badf6137ccf018f8cd4aaDmitry Shmidt} 9113e6ba3ce1abda6071d5b01f53ca6039bb7b5e2d3Robert Greenwalt 91289c1e975f0c03997808d35c7be10b244c5309f9fMattias FalkCommandListener::ResolverCmd::ResolverCmd() : 91389c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk NetdCommand("resolver") { 91489c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk} 91589c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk 91689c1e975f0c03997808d35c7be10b244c5309f9fMattias Falkint CommandListener::ResolverCmd::runCommand(SocketClient *cli, int argc, char **argv) { 91789c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk int rc = 0; 91889c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk struct in_addr addr; 91989c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk 92089c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk if (argc < 2) { 92189c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk cli->sendMsg(ResponseCode::CommandSyntaxError, "Resolver missing arguments", false); 92289c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk return 0; 92389c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } 92489c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk 92589c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk if (!strcmp(argv[1], "setdefaultif")) { // "resolver setdefaultif <iface>" 92689c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk if (argc == 3) { 92789c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk rc = sResolverCtrl->setDefaultInterface(argv[2]); 92889c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } else { 92989c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk cli->sendMsg(ResponseCode::CommandSyntaxError, 93089c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk "Wrong number of arguments to resolver setdefaultif", false); 93189c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk return 0; 93289c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } 93389c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } else if (!strcmp(argv[1], "setifdns")) { // "resolver setifdns <iface> <dns1> <dns2> ..." 93489c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk if (argc >= 4) { 93589c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk rc = sResolverCtrl->setInterfaceDnsServers(argv[2], &argv[3], argc - 3); 93689c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } else { 93789c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk cli->sendMsg(ResponseCode::CommandSyntaxError, 93889c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk "Wrong number of arguments to resolver setifdns", false); 93989c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk return 0; 94089c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } 94189c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk 94289c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk // set the address of the interface to which the name servers 94389c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk // are bound. Required in order to bind to right interface when 94489c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk // doing the dns query. 94589c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk if (!rc) { 94689c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk ifc_init(); 94789c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk ifc_get_info(argv[2], &addr.s_addr, NULL, 0); 94889c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk 94989c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk rc = sResolverCtrl->setInterfaceAddress(argv[2], &addr); 95089c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } 95189c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } else if (!strcmp(argv[1], "flushdefaultif")) { // "resolver flushdefaultif" 95289c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk if (argc == 2) { 95389c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk rc = sResolverCtrl->flushDefaultDnsCache(); 95489c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } else { 95589c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk cli->sendMsg(ResponseCode::CommandSyntaxError, 95689c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk "Wrong number of arguments to resolver flushdefaultif", false); 95789c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk return 0; 95889c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } 95989c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } else if (!strcmp(argv[1], "flushif")) { // "resolver flushif <iface>" 96089c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk if (argc == 3) { 96189c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk rc = sResolverCtrl->flushInterfaceDnsCache(argv[2]); 96289c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } else { 96389c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk cli->sendMsg(ResponseCode::CommandSyntaxError, 96489c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk "Wrong number of arguments to resolver setdefaultif", false); 96589c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk return 0; 96689c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } 96789c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } else { 96889c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk cli->sendMsg(ResponseCode::CommandSyntaxError,"Resolver unknown command", false); 96989c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk return 0; 97089c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } 97189c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk 97289c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk if (!rc) { 97389c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk cli->sendMsg(ResponseCode::CommandOkay, "Resolver command succeeded", false); 97489c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } else { 97589c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk cli->sendMsg(ResponseCode::OperationFailed, "Resolver command failed", true); 97689c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk } 97789c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk 97889c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk return 0; 97989c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk} 98089c1e975f0c03997808d35c7be10b244c5309f9fMattias Falk 9818e46896b4c4be5deaef651a12b17314f63ae9070San Mehatint CommandListener::readInterfaceCounters(const char *iface, unsigned long *rx, unsigned long *tx) { 9828e46896b4c4be5deaef651a12b17314f63ae9070San Mehat FILE *fp = fopen("/proc/net/dev", "r"); 9838e46896b4c4be5deaef651a12b17314f63ae9070San Mehat if (!fp) { 9845ea0c05a1e7d8e664b808aa1bb1efd08fdb2fb13Steve Block ALOGE("Failed to open /proc/net/dev (%s)", strerror(errno)); 9858e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return -1; 9868e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 9878e46896b4c4be5deaef651a12b17314f63ae9070San Mehat 9888e46896b4c4be5deaef651a12b17314f63ae9070San Mehat char buffer[512]; 9898e46896b4c4be5deaef651a12b17314f63ae9070San Mehat 9908e46896b4c4be5deaef651a12b17314f63ae9070San Mehat fgets(buffer, sizeof(buffer), fp); // Header 1 9918e46896b4c4be5deaef651a12b17314f63ae9070San Mehat fgets(buffer, sizeof(buffer), fp); // Header 2 9928e46896b4c4be5deaef651a12b17314f63ae9070San Mehat while(fgets(buffer, sizeof(buffer), fp)) { 9938e46896b4c4be5deaef651a12b17314f63ae9070San Mehat buffer[strlen(buffer)-1] = '\0'; 9948e46896b4c4be5deaef651a12b17314f63ae9070San Mehat 995651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt char name[31]; 9968e46896b4c4be5deaef651a12b17314f63ae9070San Mehat unsigned long d; 997651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt sscanf(buffer, "%30s %lu %lu %lu %lu %lu %lu %lu %lu %lu", 9988e46896b4c4be5deaef651a12b17314f63ae9070San Mehat name, rx, &d, &d, &d, &d, &d, &d, &d, tx); 999651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt char *rxString = strchr(name, ':'); 1000651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt *rxString = '\0'; 1001651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt rxString++; 1002651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt // when the rx count gets too big it changes from "name: 999" to "name:1000" 1003651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt // and the sscanf munge the two together. Detect that and fix 1004651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt // note that all the %lu will be off by one and the real tx value will be in d 1005651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt if (*rxString != '\0') { 1006651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt *tx = d; 1007651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt sscanf(rxString, "%20lu", rx); 1008651417c7c8662572de761c3b9260b1241ff21a79Robert Greenwalt } 10098e46896b4c4be5deaef651a12b17314f63ae9070San Mehat if (strcmp(name, iface)) { 10108e46896b4c4be5deaef651a12b17314f63ae9070San Mehat continue; 10118e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 10128e46896b4c4be5deaef651a12b17314f63ae9070San Mehat fclose(fp); 10138e46896b4c4be5deaef651a12b17314f63ae9070San Mehat return 0; 10148e46896b4c4be5deaef651a12b17314f63ae9070San Mehat } 10158e46896b4c4be5deaef651a12b17314f63ae9070San Mehat 10168e46896b4c4be5deaef651a12b17314f63ae9070San Mehat fclose(fp); 101731c61c80a013bd1a050f0f4103e13fba62bf1717Robert Greenwalt *rx = 0; 101831c61c80a013bd1a050f0f4103e13fba62bf1717Robert Greenwalt *tx = 0; 101931c61c80a013bd1a050f0f4103e13fba62bf1717Robert Greenwalt return 0; 10208e46896b4c4be5deaef651a12b17314f63ae9070San Mehat} 10214a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall 10224a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP AbgrallCommandListener::BandwidthControlCmd::BandwidthControlCmd() : 10230dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall NetdCommand("bandwidth") { 10244a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall} 10254a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall 1026db7da58e8d2aa021060098057f944ef754be06e3JP Abgrallvoid CommandListener::BandwidthControlCmd::sendGenericSyntaxError(SocketClient *cli, const char *usageMsg) { 1027db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall char *msg; 1028db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall asprintf(&msg, "Usage: bandwidth %s", usageMsg); 1029db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, msg, false); 1030db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall free(msg); 1031db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall} 1032db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 1033db7da58e8d2aa021060098057f944ef754be06e3JP Abgrallvoid CommandListener::BandwidthControlCmd::sendGenericOkFail(SocketClient *cli, int cond) { 1034db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!cond) { 1035db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall cli->sendMsg(ResponseCode::CommandOkay, "Bandwidth command succeeeded", false); 1036db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } else { 1037db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall cli->sendMsg(ResponseCode::OperationFailed, "Bandwidth command failed", false); 1038db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1039db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall} 1040db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 1041db7da58e8d2aa021060098057f944ef754be06e3JP Abgrallvoid CommandListener::BandwidthControlCmd::sendGenericOpFailed(SocketClient *cli, const char *errMsg) { 1042db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall cli->sendMsg(ResponseCode::OperationFailed, errMsg, false); 1043db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall} 1044db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 1045fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrallint CommandListener::BandwidthControlCmd::runCommand(SocketClient *cli, int argc, char **argv) { 10464a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall if (argc < 2) { 1047db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "<cmds> <args...>"); 10484a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall return 0; 10494a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall } 10504a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall 10513fb42e026ffebab2c8f282e42501040121e32d83Steve Block ALOGV("bwctrlcmd: argc=%d %s %s ...", argc, argv[0], argv[1]); 1052db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 10534a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall if (!strcmp(argv[1], "enable")) { 10540031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall int rc = sBandwidthCtrl->enableBandwidthControl(true); 1055db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1056db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 1057db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 1058db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1059db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "disable")) { 1060db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->disableBandwidthControl(); 1061db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1062db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 10630dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall 1064db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1065db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "removequota") || !strcmp(argv[1], "rq")) { 1066fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall if (argc != 3) { 1067db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "removequota <interface>"); 1068fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall return 0; 1069fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall } 1070db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->removeInterfaceSharedQuota(argv[2]); 1071db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1072db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 1073fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall 1074db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1075db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "getquota") || !strcmp(argv[1], "gq")) { 10768a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall int64_t bytes; 10778a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (argc != 2) { 1078db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "getquota"); 10798a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 10808a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 1081db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->getInterfaceSharedQuota(&bytes); 10828a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (rc) { 1083db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOpFailed(cli, "Failed to get quota"); 10848a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 10858a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 1086db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 10878a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall char *msg; 10888a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall asprintf(&msg, "%lld", bytes); 10898a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall cli->sendMsg(ResponseCode::QuotaCounterResult, msg, false); 10908a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall free(msg); 1091db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 10928a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall 1093db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1094db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "getiquota") || !strcmp(argv[1], "giq")) { 10958a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall int64_t bytes; 10968a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (argc != 3) { 1097db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "getiquota <iface>"); 10988a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 10998a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 1100db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 1101db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->getInterfaceQuota(argv[2], &bytes); 11028a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (rc) { 1103db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOpFailed(cli, "Failed to get quota"); 11048a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 11058a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 11068a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall char *msg; 11078a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall asprintf(&msg, "%lld", bytes); 11088a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall cli->sendMsg(ResponseCode::QuotaCounterResult, msg, false); 11098a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall free(msg); 1110db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 11118a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall 1112db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1113db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "setquota") || !strcmp(argv[1], "sq")) { 1114fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall if (argc != 4) { 1115db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "setquota <interface> <bytes>"); 1116fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall return 0; 1117fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall } 1118db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->setInterfaceSharedQuota(argv[2], atoll(argv[3])); 1119db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1120db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 1121db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1122db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "setquotas") || !strcmp(argv[1], "sqs")) { 1123db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc; 1124fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall if (argc < 4) { 1125db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "setquotas <bytes> <interface> ..."); 1126fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall return 0; 1127fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall } 1128db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 11298a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall for (int q = 3; argc >= 4; q++, argc--) { 11300dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall rc = sBandwidthCtrl->setInterfaceSharedQuota(argv[q], atoll(argv[2])); 11310dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall if (rc) { 11320dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall char *msg; 11330dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall asprintf(&msg, "bandwidth setquotas %s %s failed", argv[2], argv[q]); 11340dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall cli->sendMsg(ResponseCode::OperationFailed, 11350dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall msg, false); 11360dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall free(msg); 1137db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 11380dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall } 11390dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall } 1140db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1141db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 11420dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall 1143db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1144db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "removequotas") || !strcmp(argv[1], "rqs")) { 1145db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc; 11460dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall if (argc < 3) { 1147db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "removequotas <interface> ..."); 11480dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall return 0; 11490dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall } 1150db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 11518a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall for (int q = 2; argc >= 3; q++, argc--) { 11520dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall rc = sBandwidthCtrl->removeInterfaceSharedQuota(argv[q]); 11530dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall if (rc) { 11540dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall char *msg; 11550dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall asprintf(&msg, "bandwidth removequotas %s failed", argv[q]); 11560dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall cli->sendMsg(ResponseCode::OperationFailed, 11570dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall msg, false); 11580dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall free(msg); 1159db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 11600dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall } 11610dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall } 1162db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1163db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 11640dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall 1165db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1166db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "removeiquota") || !strcmp(argv[1], "riq")) { 11670dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall if (argc != 3) { 1168db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "removeiquota <interface>"); 11690dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall return 0; 11700dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall } 1171db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->removeInterfaceQuota(argv[2]); 1172db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1173db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 11740dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall 1175db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1176db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "setiquota") || !strcmp(argv[1], "siq")) { 11770dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall if (argc != 4) { 1178db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "setiquota <interface> <bytes>"); 11790dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall return 0; 11800dad7c2f1f6994fbe5e85b9e1fc72d29d6453211JP Abgrall } 1181db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->setInterfaceQuota(argv[2], atoll(argv[3])); 1182db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1183db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 1184fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall 1185db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1186db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "addnaughtyapps") || !strcmp(argv[1], "ana")) { 1187fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall if (argc < 3) { 1188db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "addnaughtyapps <appUid> ..."); 11894a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall return 0; 1190fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall } 1191db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->addNaughtyApps(argc - 2, argv + 2); 1192db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1193db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 1194db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 1195fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall 1196db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1197db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "removenaughtyapps") || !strcmp(argv[1], "rna")) { 1198fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall if (argc < 3) { 1199db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "removenaughtyapps <appUid> ..."); 1200fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall return 0; 1201fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall } 1202db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->removeNaughtyApps(argc - 2, argv + 2); 1203db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1204db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 1205fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall 1206db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1207db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "setglobalalert") || !strcmp(argv[1], "sga")) { 12088a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (argc != 3) { 1209db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "setglobalalert <bytes>"); 12108a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 12118a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 1212db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->setGlobalAlert(atoll(argv[2])); 1213db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1214db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 12158a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall 1216db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1217c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall if (!strcmp(argv[1], "debugsettetherglobalalert") || !strcmp(argv[1], "dstga")) { 1218c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall if (argc != 4) { 1219c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall sendGenericSyntaxError(cli, "debugsettetherglobalalert <interface0> <interface1>"); 1220c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall return 0; 1221c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall } 1222c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall /* We ignore the interfaces for now. */ 1223c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall int rc = sBandwidthCtrl->setGlobalAlertInForwardChain(); 1224c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall sendGenericOkFail(cli, rc); 1225c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall return 0; 1226c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall 1227c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall } 1228db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "removeglobalalert") || !strcmp(argv[1], "rga")) { 12298a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (argc != 2) { 1230db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "removeglobalalert"); 12318a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 12328a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 1233db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->removeGlobalAlert(); 1234db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1235db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 12368a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall 1237db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1238c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall if (!strcmp(argv[1], "debugremovetetherglobalalert") || !strcmp(argv[1], "drtga")) { 1239c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall if (argc != 4) { 1240c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall sendGenericSyntaxError(cli, "debugremovetetherglobalalert <interface0> <interface1>"); 1241c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall return 0; 1242c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall } 1243c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall /* We ignore the interfaces for now. */ 1244c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall int rc = sBandwidthCtrl->removeGlobalAlertInForwardChain(); 1245c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall sendGenericOkFail(cli, rc); 1246c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall return 0; 1247c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall 1248c6c673496184bed6d62cf92a6fc7ed43fd94acd5JP Abgrall } 1249db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "setsharedalert") || !strcmp(argv[1], "ssa")) { 12508a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (argc != 3) { 1251db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "setsharedalert <bytes>"); 12528a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 12538a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 1254db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->setSharedAlert(atoll(argv[2])); 1255db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1256db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 12578a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall 1258db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1259db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "removesharedalert") || !strcmp(argv[1], "rsa")) { 12608a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (argc != 2) { 1261db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "removesharedalert"); 12628a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 12638a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 1264db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->removeSharedAlert(); 1265db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1266db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 12678a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall 1268db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1269db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "setinterfacealert") || !strcmp(argv[1], "sia")) { 12708a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (argc != 4) { 1271db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "setinterfacealert <interface> <bytes>"); 12728a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 12738a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 1274db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->setInterfaceAlert(argv[2], atoll(argv[3])); 1275db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1276db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 12778a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall 1278db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1279db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "removeinterfacealert") || !strcmp(argv[1], "ria")) { 12808a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall if (argc != 3) { 1281db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "removeinterfacealert <interface>"); 12828a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall return 0; 12838a93272255f1b7e3083a97e1e28ddf675c0c7fb0JP Abgrall } 1284db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall int rc = sBandwidthCtrl->removeInterfaceAlert(argv[2]); 1285db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericOkFail(cli, rc); 1286fa6f46d3370ae5475fc3bc8273bbe04ee7348d60JP Abgrall return 0; 1287db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 12884a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall } 1289db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (!strcmp(argv[1], "gettetherstats") || !strcmp(argv[1], "gts")) { 1290db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall BandwidthController::TetherStats tetherStats; 1291a2a64f004f1677daf16b0b03d589d6572ec547c2JP Abgrall std::string extraProcessingInfo = ""; 1292db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (argc != 4) { 1293db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall sendGenericSyntaxError(cli, "gettetherstats <interface0> <interface1>"); 1294db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 1295db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1296db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 1297db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall tetherStats.ifaceIn = argv[2]; 1298db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall tetherStats.ifaceOut = argv[3]; 1299a2a64f004f1677daf16b0b03d589d6572ec547c2JP Abgrall int rc = sBandwidthCtrl->getTetherStats(tetherStats, extraProcessingInfo); 1300db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall if (rc) { 1301a2a64f004f1677daf16b0b03d589d6572ec547c2JP Abgrall extraProcessingInfo.insert(0, "Failed to get tethering stats.\n"); 1302a2a64f004f1677daf16b0b03d589d6572ec547c2JP Abgrall sendGenericOpFailed(cli, extraProcessingInfo.c_str()); 1303db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 1304db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall } 1305db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 1306db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall char *msg = tetherStats.getStatsLine(); 1307db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall cli->sendMsg(ResponseCode::TetheringStatsResult, msg, false); 1308db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall free(msg); 1309db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall return 0; 13104a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall 13114a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall } 1312db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall 1313db7da58e8d2aa021060098057f944ef754be06e3JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown bandwidth cmd", false); 13144a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall return 0; 13154a5f5ca3c9e07fc3e6feca2afde07f41a8a64f11JP Abgrall} 13160031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall 13170031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP AbgrallCommandListener::IdletimerControlCmd::IdletimerControlCmd() : 13180031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall NetdCommand("idletimer") { 13190031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall} 13200031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall 13210031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrallint CommandListener::IdletimerControlCmd::runCommand(SocketClient *cli, int argc, char **argv) { 13220031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall // TODO(ashish): Change the error statements 13230031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall if (argc < 2) { 13240031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 13250031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall return 0; 13260031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall } 13270031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall 13280031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall ALOGV("idletimerctrlcmd: argc=%d %s %s ...", argc, argv[0], argv[1]); 13290031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall 13300031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall if (!strcmp(argv[1], "enable")) { 13310031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall if (0 != sIdletimerCtrl->enableIdletimerControl()) { 13320031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 13330031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall } else { 13340031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall cli->sendMsg(ResponseCode::CommandOkay, "Enable success", false); 13350031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall } 13360031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall return 0; 13370031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall 13380031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall } 13390031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall if (!strcmp(argv[1], "disable")) { 13400031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall if (0 != sIdletimerCtrl->disableIdletimerControl()) { 13410031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 13420031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall } else { 13430031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall cli->sendMsg(ResponseCode::CommandOkay, "Disable success", false); 13440031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall } 13450031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall return 0; 13460031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall } 13470031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall if (!strcmp(argv[1], "add")) { 134898f65d32b1530b4da6050e38d52f955710577efbHaoyu Bai if (argc != 5) { 13490031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 13500031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall return 0; 13510031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall } 135298f65d32b1530b4da6050e38d52f955710577efbHaoyu Bai if(0 != sIdletimerCtrl->addInterfaceIdletimer( 135398f65d32b1530b4da6050e38d52f955710577efbHaoyu Bai argv[2], atoi(argv[3]), argv[4])) { 13540031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall cli->sendMsg(ResponseCode::OperationFailed, "Failed to add interface", false); 13550031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall } else { 13560031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall cli->sendMsg(ResponseCode::CommandOkay, "Add success", false); 13570031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall } 13580031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall return 0; 13590031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall } 13600031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall if (!strcmp(argv[1], "remove")) { 136198f65d32b1530b4da6050e38d52f955710577efbHaoyu Bai if (argc != 5) { 13620031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing argument", false); 13630031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall return 0; 13640031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall } 13650031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall // ashish: fixme timeout 136698f65d32b1530b4da6050e38d52f955710577efbHaoyu Bai if (0 != sIdletimerCtrl->removeInterfaceIdletimer( 136798f65d32b1530b4da6050e38d52f955710577efbHaoyu Bai argv[2], atoi(argv[3]), argv[4])) { 13680031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall cli->sendMsg(ResponseCode::OperationFailed, "Failed to remove interface", false); 13690031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall } else { 13700031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall cli->sendMsg(ResponseCode::CommandOkay, "Remove success", false); 13710031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall } 13720031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall return 0; 13730031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall } 13740031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall 13750031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown idletimer cmd", false); 13760031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall return 0; 13770031cead820149e2fe3ccb3cc2fe05758a3cb5c2JP Abgrall} 1378d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey 1379d8c64026aaae5a9987151b719bd840ec7d68747aJeff SharkeyCommandListener::FirewallCmd::FirewallCmd() : 1380d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey NetdCommand("firewall") { 1381d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey} 1382d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey 1383d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkeyint CommandListener::FirewallCmd::sendGenericOkFail(SocketClient *cli, int cond) { 1384d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey if (!cond) { 1385d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey cli->sendMsg(ResponseCode::CommandOkay, "Firewall command succeeded", false); 1386d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey } else { 1387d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey cli->sendMsg(ResponseCode::OperationFailed, "Firewall command failed", false); 1388d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey } 1389d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey return 0; 1390d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey} 1391d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey 1392d8c64026aaae5a9987151b719bd840ec7d68747aJeff SharkeyFirewallRule CommandListener::FirewallCmd::parseRule(const char* arg) { 1393d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey if (!strcmp(arg, "allow")) { 1394d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey return ALLOW; 1395d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey } else { 1396d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey return DENY; 1397d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey } 1398d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey} 1399d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey 1400d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkeyint CommandListener::FirewallCmd::runCommand(SocketClient *cli, int argc, 1401d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey char **argv) { 1402d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey if (argc < 2) { 1403d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey cli->sendMsg(ResponseCode::CommandSyntaxError, "Missing command", false); 1404d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey return 0; 1405d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey } 1406d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey 1407d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey if (!strcmp(argv[1], "enable")) { 1408d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey int res = sFirewallCtrl->enableFirewall(); 1409d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey return sendGenericOkFail(cli, res); 1410d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey } 1411d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey if (!strcmp(argv[1], "disable")) { 1412d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey int res = sFirewallCtrl->disableFirewall(); 1413d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey return sendGenericOkFail(cli, res); 1414d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey } 1415d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey if (!strcmp(argv[1], "is_enabled")) { 1416d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey int res = sFirewallCtrl->isFirewallEnabled(); 1417d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey return sendGenericOkFail(cli, res); 1418d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey } 1419d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey 1420d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey if (!strcmp(argv[1], "set_interface_rule")) { 1421d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey if (argc != 4) { 1422d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey cli->sendMsg(ResponseCode::CommandSyntaxError, 1423d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey "Usage: firewall set_interface_rule <rmnet0> <allow|deny>", false); 1424d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey return 0; 1425d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey } 1426d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey 1427d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey const char* iface = argv[2]; 1428d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey FirewallRule rule = parseRule(argv[3]); 1429d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey 1430d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey int res = sFirewallCtrl->setInterfaceRule(iface, rule); 1431d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey return sendGenericOkFail(cli, res); 1432d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey } 1433d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey 1434d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey if (!strcmp(argv[1], "set_egress_source_rule")) { 1435d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey if (argc != 4) { 1436d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey cli->sendMsg(ResponseCode::CommandSyntaxError, 1437d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey "Usage: firewall set_egress_source_rule <192.168.0.1> <allow|deny>", 1438d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey false); 1439d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey return 0; 1440d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey } 1441d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey 1442d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey const char* addr = argv[2]; 1443d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey FirewallRule rule = parseRule(argv[3]); 1444d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey 1445d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey int res = sFirewallCtrl->setEgressSourceRule(addr, rule); 1446d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey return sendGenericOkFail(cli, res); 1447d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey } 1448d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey 1449d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey if (!strcmp(argv[1], "set_egress_dest_rule")) { 1450d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey if (argc != 5) { 1451d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey cli->sendMsg(ResponseCode::CommandSyntaxError, 1452d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey "Usage: firewall set_egress_dest_rule <192.168.0.1> <80> <allow|deny>", 1453d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey false); 1454d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey return 0; 1455d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey } 1456d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey 1457d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey const char* addr = argv[2]; 1458d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey int port = atoi(argv[3]); 1459d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey FirewallRule rule = parseRule(argv[4]); 1460d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey 1461d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey int res = 0; 1462d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey res |= sFirewallCtrl->setEgressDestRule(addr, PROTOCOL_TCP, port, rule); 1463d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey res |= sFirewallCtrl->setEgressDestRule(addr, PROTOCOL_UDP, port, rule); 1464d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey return sendGenericOkFail(cli, res); 1465d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey } 1466d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey 1467d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey if (!strcmp(argv[1], "set_uid_rule")) { 1468d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey if (argc != 4) { 1469d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey cli->sendMsg(ResponseCode::CommandSyntaxError, 1470d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey "Usage: firewall set_uid_rule <1000> <allow|deny>", 1471d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey false); 1472d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey return 0; 1473d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey } 1474d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey 1475d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey int uid = atoi(argv[2]); 1476d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey FirewallRule rule = parseRule(argv[3]); 1477d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey 1478d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey int res = sFirewallCtrl->setUidRule(uid, rule); 1479d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey return sendGenericOkFail(cli, res); 1480d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey } 1481d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey 1482d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey cli->sendMsg(ResponseCode::CommandSyntaxError, "Unknown command", false); 1483d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey return 0; 1484d8c64026aaae5a9987151b719bd840ec7d68747aJeff Sharkey} 1485